summaryrefslogtreecommitdiff
path: root/linux/drivers/media/dvb/ttpci/av7110.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux/drivers/media/dvb/ttpci/av7110.c')
-rw-r--r--linux/drivers/media/dvb/ttpci/av7110.c45
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);