diff options
Diffstat (limited to 'linux/drivers/media/dvb/ttpci/av7110.c')
-rw-r--r-- | linux/drivers/media/dvb/ttpci/av7110.c | 45 |
1 files changed, 37 insertions, 8 deletions
diff --git a/linux/drivers/media/dvb/ttpci/av7110.c b/linux/drivers/media/dvb/ttpci/av7110.c index 40736d4fb..ece90c88c 100644 --- a/linux/drivers/media/dvb/ttpci/av7110.c +++ b/linux/drivers/media/dvb/ttpci/av7110.c @@ -53,15 +53,16 @@ #include <linux/firmware.h> #endif #include <linux/crc32.h> +#include <linux/i2c.h> #include <asm/system.h> #include <asm/semaphore.h> #include <linux/dvb/frontend.h> -#include "dvb_i2c.h" #include "dvb_frontend.h" #include "dvb_functions.h" +#include "dvb_i2c.h" #define DEBUG_VARIABLE av7110_debug @@ -1205,19 +1206,17 @@ static void dvb_unregister(struct av7110 *av7110) int i2c_writereg(struct av7110 *av7110, u8 id, u8 reg, u8 val) { u8 msg[2] = { reg, val }; - struct dvb_i2c_bus *i2c = av7110->i2c_bus; struct i2c_msg msgs; msgs.flags = 0; msgs.addr = id / 2; msgs.len = 2; msgs.buf = msg; - return i2c->xfer(i2c, &msgs, 1); + return i2c_transfer(&av7110->i2c_adap, &msgs, 1); } u8 i2c_readreg(struct av7110 *av7110, u8 id, u8 reg) { - struct dvb_i2c_bus *i2c = av7110->i2c_bus; u8 mm1[] = {0x00}; u8 mm2[] = {0x00}; struct i2c_msg msgs[2]; @@ -1228,7 +1227,7 @@ u8 i2c_readreg(struct av7110 *av7110, u8 id, u8 reg) mm1[0] = reg; msgs[0].len = 1; msgs[1].len = 1; msgs[0].buf = mm1; msgs[1].buf = mm2; - i2c->xfer(i2c, msgs, 2); + i2c_transfer(&av7110->i2c_adap, msgs, 2); return mm2[0]; } @@ -1337,6 +1336,24 @@ static int get_firmware(struct av7110* av7110) } #endif +int client_register(struct i2c_client *client) +{ + struct saa7146_dev *dev = (struct saa7146_dev*)i2c_get_adapdata(client->adapter); + struct av7110 *av7110 = (struct av7110*)dev->ext_priv; + + /* fixme: check for "type" (ie. frontend type) */ + return client->driver->command(client, FE_REGISTER, av7110->dvb_adapter); +} + +int client_unregister(struct i2c_client *client) +{ + struct saa7146_dev *dev = (struct saa7146_dev*)i2c_get_adapdata(client->adapter); + struct av7110 *av7110 = (struct av7110*)dev->ext_priv; + + /* fixme: check for "type" (ie. frontend type) */ + return client->driver->command(client, FE_UNREGISTER, av7110->dvb_adapter); +} + static int av7110_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_data *pci_ext) { struct av7110 *av7110 = NULL; @@ -1367,18 +1384,26 @@ static int av7110_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_d get recognized before the main driver is fully loaded */ saa7146_write(dev, GPIO_CTRL, 0x500000); - saa7146_i2c_adapter_prepare(dev, NULL, 0, SAA7146_I2C_BUS_BIT_RATE_120); /* 275 kHz */ + saa7146_i2c_adapter_prepare(dev, &av7110->i2c_adap, I2C_ADAP_CLASS_TV_DIGITAL, SAA7146_I2C_BUS_BIT_RATE_120); /* 275 kHz */ + av7110->i2c_adap.client_register = client_register; + av7110->i2c_adap.client_unregister = client_unregister; av7110->i2c_bus = dvb_register_i2c_bus(master_xfer, dev, av7110->dvb_adapter, 0); - if (!av7110->i2c_bus) { dvb_unregister_adapter(av7110->dvb_adapter); kfree(av7110); return -ENOMEM; } - ttpci_eeprom_parse_mac(av7110->i2c_bus); + if (i2c_add_adapter(&av7110->i2c_adap) < 0) { + dvb_unregister_adapter (av7110->dvb_adapter); + dvb_unregister_i2c_bus (master_xfer,av7110->i2c_bus->adapter, av7110->i2c_bus->id); + kfree(av7110); + return -ENOMEM; + } + + ttpci_eeprom_parse_mac(&av7110->i2c_adap, av7110->dvb_adapter->proposed_mac); saa7146_write(dev, PCI_BT_V1, 0x1c00101f); saa7146_write(dev, BCS_CTRL, 0x80400040); @@ -1521,6 +1546,8 @@ err2: av7110_ca_exit(av7110); av7110_av_exit(av7110); err: + i2c_del_adapter(&av7110->i2c_adap); + dvb_unregister_i2c_bus(master_xfer, av7110->i2c_bus->adapter, av7110->i2c_bus->id); @@ -1569,6 +1596,8 @@ static int av7110_detach (struct saa7146_dev* saa) pci_free_consistent(saa->pci, 8192, av7110->debi_virt, av7110->debi_bus); + i2c_del_adapter(&av7110->i2c_adap); + dvb_unregister_i2c_bus (master_xfer,av7110->i2c_bus->adapter, av7110->i2c_bus->id); dvb_unregister_adapter (av7110->dvb_adapter); |