diff options
| author | Michael Hunold <devnull@localhost> | 2004-05-03 11:15:31 +0000 |
|---|---|---|
| committer | Michael Hunold <devnull@localhost> | 2004-05-03 11:15:31 +0000 |
| commit | 30970c2a967560590b306f6965aea609d7fd3a54 (patch) | |
| tree | 1546c38a1f6394165ed95326b13814661fc42477 /linux/drivers/media/dvb/ttpci | |
| parent | a9135ebb9e7ffd0934fa6e9bd6b0a0a4e5ff912d (diff) | |
| download | mediapointer-dvb-s2-30970c2a967560590b306f6965aea609d7fd3a54.tar.gz mediapointer-dvb-s2-30970c2a967560590b306f6965aea609d7fd3a54.tar.bz2 | |
Overhaul frontend i2c subsystem because of the recent discussion about
the usage of the syscall interface to load binary firmware used by some
frontend drivers.
- add dvb_register_frontend_new() and dvb_unregister_frontend_new() which
register a frontend driver using the kernel i2c interface instead of the
dvb i2c interface.
- register kernel i2c interface in av7110/budget driver properly
- port stv0299 and ves1x93 to kernel i2c api
Other DVB drivers and frontend drivers still can use the old DVB i2c
interface.
Diffstat (limited to 'linux/drivers/media/dvb/ttpci')
| -rw-r--r-- | linux/drivers/media/dvb/ttpci/av7110.c | 45 | ||||
| -rw-r--r-- | linux/drivers/media/dvb/ttpci/av7110.h | 3 | ||||
| -rw-r--r-- | linux/drivers/media/dvb/ttpci/av7110_ca.c | 1 | ||||
| -rw-r--r-- | linux/drivers/media/dvb/ttpci/av7110_v4l.c | 10 | ||||
| -rw-r--r-- | linux/drivers/media/dvb/ttpci/budget-core.c | 32 | ||||
| -rw-r--r-- | linux/drivers/media/dvb/ttpci/budget.c | 4 | ||||
| -rw-r--r-- | linux/drivers/media/dvb/ttpci/budget.h | 12 | ||||
| -rw-r--r-- | linux/drivers/media/dvb/ttpci/ttpci-eeprom.c | 22 | ||||
| -rw-r--r-- | linux/drivers/media/dvb/ttpci/ttpci-eeprom.h | 5 |
9 files changed, 94 insertions, 40 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); diff --git a/linux/drivers/media/dvb/ttpci/av7110.h b/linux/drivers/media/dvb/ttpci/av7110.h index 9c23a2f04..e39545ad0 100644 --- a/linux/drivers/media/dvb/ttpci/av7110.h +++ b/linux/drivers/media/dvb/ttpci/av7110.h @@ -4,6 +4,7 @@ #include <linux/interrupt.h> #include <linux/socket.h> #include <linux/netdevice.h> +#include <linux/i2c.h> #ifdef CONFIG_DEVFS_FS #include <linux/devfs_fs_kernel.h> @@ -66,6 +67,8 @@ struct av7110 { struct saa7146_dev *dev; struct dvb_i2c_bus *i2c_bus; + struct i2c_adapter i2c_adap; + char *card_name; /* support for analog module of dvb-c */ diff --git a/linux/drivers/media/dvb/ttpci/av7110_ca.c b/linux/drivers/media/dvb/ttpci/av7110_ca.c index 7c9a5c84e..fc3f3f2e4 100644 --- a/linux/drivers/media/dvb/ttpci/av7110_ca.c +++ b/linux/drivers/media/dvb/ttpci/av7110_ca.c @@ -41,7 +41,6 @@ #define DEBUG_VARIABLE av7110_debug extern int av7110_debug; -#include "dvb_i2c.h" #include "av7110.h" #include "av7110_hw.h" #include "dvb_functions.h" diff --git a/linux/drivers/media/dvb/ttpci/av7110_v4l.c b/linux/drivers/media/dvb/ttpci/av7110_v4l.c index a70fdaa46..dac4dde47 100644 --- a/linux/drivers/media/dvb/ttpci/av7110_v4l.c +++ b/linux/drivers/media/dvb/ttpci/av7110_v4l.c @@ -38,20 +38,17 @@ #define DEBUG_VARIABLE av7110_debug extern int av7110_debug; -#include "dvb_i2c.h" #include "av7110.h" #include "av7110_hw.h" #include "av7110_av.h" #include "dvb_functions.h" - int msp_writereg(struct av7110 *av7110, u8 dev, u16 reg, u16 val) { u8 msg[5] = { dev, reg >> 8, reg & 0xff, val >> 8 , val & 0xff }; - struct dvb_i2c_bus *i2c = av7110->i2c_bus; struct i2c_msg msgs = { .flags = 0, .addr = 0x40, .len = 5, .buf = msg }; - if (i2c->xfer(i2c, &msgs, 1) != 1) { + if (i2c_transfer(&av7110->i2c_adap, &msgs, 1) != 1) { printk("av7110(%d): %s(%u = %u) failed\n", av7110->dvb_adapter->num, __FUNCTION__, reg, val); return -EIO; @@ -63,13 +60,12 @@ int msp_readreg(struct av7110 *av7110, u8 dev, u16 reg, u16 *val) { u8 msg1[3] = { dev, reg >> 8, reg & 0xff }; u8 msg2[2]; - struct dvb_i2c_bus *i2c = av7110->i2c_bus; struct i2c_msg msgs[2] = { { .flags = 0, .addr = 0x40, .len = 3, .buf = msg1 }, { .flags = I2C_M_RD, .addr = 0x40, .len = 2, .buf = msg2 } }; - if (i2c->xfer(i2c, msgs, 2) != 2) { + if (i2c_transfer(&av7110->i2c_adap, &msgs[0], 2) != 2) { printk("av7110(%d): %s(%u) failed\n", av7110->dvb_adapter->num, __FUNCTION__, reg); return -EIO; @@ -78,8 +74,6 @@ int msp_readreg(struct av7110 *av7110, u8 dev, u16 reg, u16 *val) return 0; } - - static struct v4l2_input inputs[2] = { { .index = 0, diff --git a/linux/drivers/media/dvb/ttpci/budget-core.c b/linux/drivers/media/dvb/ttpci/budget-core.c index 87758931f..fc54b0e09 100644 --- a/linux/drivers/media/dvb/ttpci/budget-core.c +++ b/linux/drivers/media/dvb/ttpci/budget-core.c @@ -265,6 +265,22 @@ static int master_xfer (struct dvb_i2c_bus *i2c, const struct i2c_msg msgs[], in return saa7146_i2c_transfer(dev, msgs, num, 6); } +/* fixme: can this be unified among all saa7146 based dvb cards? */ +int client_register(struct i2c_client *client) +{ + struct saa7146_dev *dev = (struct saa7146_dev*)i2c_get_adapdata(client->adapter); + struct budget *budget = (struct budget*)dev->ext_priv; + + return client->driver->command(client, FE_REGISTER, budget->dvb_adapter); +} + +int client_unregister(struct i2c_client *client) +{ + struct saa7146_dev *dev = (struct saa7146_dev*)i2c_get_adapdata(client->adapter); + struct budget *budget = (struct budget*)dev->ext_priv; + + return client->driver->command(client, FE_UNREGISTER, budget->dvb_adapter); +} int ttpci_budget_init (struct budget *budget, struct saa7146_dev* dev, @@ -301,7 +317,9 @@ int ttpci_budget_init (struct budget *budget, if (bi->type != BUDGET_FS_ACTIVY) saa7146_write(dev, GPIO_CTRL, 0x500000); /* GPIO 3 = 1 */ - saa7146_i2c_adapter_prepare(dev, NULL, 0, SAA7146_I2C_BUS_BIT_RATE_120); + saa7146_i2c_adapter_prepare(dev, &budget->i2c_adap, I2C_ADAP_CLASS_TV_DIGITAL, SAA7146_I2C_BUS_BIT_RATE_120); + budget->i2c_adap.client_register = client_register; + budget->i2c_adap.client_unregister = client_unregister; budget->i2c_bus = dvb_register_i2c_bus (master_xfer, dev, budget->dvb_adapter, 0); @@ -311,7 +329,13 @@ int ttpci_budget_init (struct budget *budget, return -ENOMEM; } - ttpci_eeprom_parse_mac(budget->i2c_bus); + if (i2c_add_adapter(&budget->i2c_adap) < 0) { + dvb_unregister_i2c_bus (master_xfer, budget->i2c_bus->adapter, budget->i2c_bus->id); + dvb_unregister_adapter (budget->dvb_adapter); + return -ENOMEM; + } + + ttpci_eeprom_parse_mac(&budget->i2c_adap, budget->dvb_adapter->proposed_mac); if( NULL == (budget->grabbing = saa7146_vmalloc_build_pgtable(dev->pci,length,&budget->pt))) { ret = -ENOMEM; @@ -334,6 +358,8 @@ int ttpci_budget_init (struct budget *budget, return 0; } err: + i2c_del_adapter(&budget->i2c_adap); + if (budget->grabbing) vfree(budget->grabbing); @@ -354,6 +380,8 @@ int ttpci_budget_deinit (struct budget *budget) budget_unregister (budget); + i2c_del_adapter(&budget->i2c_adap); + dvb_unregister_i2c_bus (master_xfer, budget->i2c_bus->adapter, budget->i2c_bus->id); diff --git a/linux/drivers/media/dvb/ttpci/budget.c b/linux/drivers/media/dvb/ttpci/budget.c index 93691c15f..9bee908c7 100644 --- a/linux/drivers/media/dvb/ttpci/budget.c +++ b/linux/drivers/media/dvb/ttpci/budget.c @@ -202,6 +202,8 @@ static int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_ DEB_EE(("dev:%p, info:%p, budget:%p\n",dev,info,budget)); + dev->ext_priv = budget; + if ((err = ttpci_budget_init (budget, dev, info))) { printk("==> failed\n"); kfree (budget); @@ -215,8 +217,6 @@ static int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_ dvb_add_frontend_ioctls (budget->dvb_adapter, budget_diseqc_ioctl, NULL, budget); - dev->ext_priv = budget; - return 0; } diff --git a/linux/drivers/media/dvb/ttpci/budget.h b/linux/drivers/media/dvb/ttpci/budget.h index a89f2e567..d18876595 100644 --- a/linux/drivers/media/dvb/ttpci/budget.h +++ b/linux/drivers/media/dvb/ttpci/budget.h @@ -3,7 +3,6 @@ #include <media/saa7146.h> -#include "dvb_i2c.h" #include "dvb_frontend.h" #include "dvbdev.h" #include "demux.h" @@ -24,11 +23,14 @@ struct budget { /* devices */ struct dvb_device dvb_dev; - struct dvb_net dvb_net; + struct dvb_net dvb_net; struct saa7146_dev *dev; +#include "dvb_i2c.h" struct dvb_i2c_bus *i2c_bus; + + struct i2c_adapter i2c_adap; struct budget_info *card; unsigned char *grabbing; @@ -37,11 +39,11 @@ struct budget { struct tasklet_struct fidb_tasklet; struct tasklet_struct vpe_tasklet; - struct dmxdev dmxdev; + struct dmxdev dmxdev; struct dvb_demux demux; - struct dmx_frontend hw_frontend; - struct dmx_frontend mem_frontend; + struct dmx_frontend hw_frontend; + struct dmx_frontend mem_frontend; int fe_synced; struct semaphore pid_mutex; diff --git a/linux/drivers/media/dvb/ttpci/ttpci-eeprom.c b/linux/drivers/media/dvb/ttpci/ttpci-eeprom.c index 08b71c151..07c7fb611 100644 --- a/linux/drivers/media/dvb/ttpci/ttpci-eeprom.c +++ b/linux/drivers/media/dvb/ttpci/ttpci-eeprom.c @@ -35,8 +35,8 @@ #include <linux/init.h> #include <linux/module.h> #include <linux/string.h> +#include <linux/i2c.h> -#include "dvb_i2c.h" #include "dvb_functions.h" #if 1 @@ -85,7 +85,7 @@ static int getmac_tt(u8 * decodedMAC, u8 * encodedMAC) return 0; } -static int ttpci_eeprom_read_encodedMAC(struct dvb_i2c_bus *i2c, u8 * encodedMAC) +static int ttpci_eeprom_read_encodedMAC(struct i2c_adapter *adapter, u8 * encodedMAC) { int ret; u8 b0[] = { 0xcc }; @@ -97,7 +97,7 @@ static int ttpci_eeprom_read_encodedMAC(struct dvb_i2c_bus *i2c, u8 * encodedMAC /* dprintk("%s\n", __FUNCTION__); */ - ret = i2c->xfer(i2c, msg, 2); + ret = i2c_transfer(adapter, msg, 2); if (ret != 2) /* Assume EEPROM isn't there */ return (-ENODEV); @@ -106,36 +106,34 @@ static int ttpci_eeprom_read_encodedMAC(struct dvb_i2c_bus *i2c, u8 * encodedMAC } -int ttpci_eeprom_parse_mac(struct dvb_i2c_bus *i2c) +int ttpci_eeprom_parse_mac(struct i2c_adapter *adapter, u8 *proposed_mac) { int ret, i; u8 encodedMAC[20]; u8 decodedMAC[6]; - ret = ttpci_eeprom_read_encodedMAC(i2c, encodedMAC); + ret = ttpci_eeprom_read_encodedMAC(adapter, encodedMAC); if (ret != 0) { /* Will only be -ENODEV */ dprintk("Couldn't read from EEPROM: not there?\n"); - memset(i2c->adapter->proposed_mac, 0, 6); + memset(proposed_mac, 0, 6); return ret; } ret = getmac_tt(decodedMAC, encodedMAC); if( ret != 0 ) { - dprintk("%s adapter %i failed MAC signature check\n", - i2c->adapter->name, i2c->adapter->num); + dprintk("adapter failed MAC signature check\n"); dprintk("encoded MAC from EEPROM was " ); for(i=0; i<19; i++) { dprintk( "%.2x:", encodedMAC[i]); } dprintk("%.2x\n", encodedMAC[19]); - memset(i2c->adapter->proposed_mac, 0, 6); + memset(proposed_mac, 0, 6); return ret; } - memcpy(i2c->adapter->proposed_mac, decodedMAC, 6); - dprintk("%s adapter %i has MAC addr = %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", - i2c->adapter->name, i2c->adapter->num, + memcpy(proposed_mac, decodedMAC, 6); + dprintk("adapter has MAC addr = %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", decodedMAC[0], decodedMAC[1], decodedMAC[2], decodedMAC[3], decodedMAC[4], decodedMAC[5]); return 0; diff --git a/linux/drivers/media/dvb/ttpci/ttpci-eeprom.h b/linux/drivers/media/dvb/ttpci/ttpci-eeprom.h index 48df7ce53..e2dc6cfe2 100644 --- a/linux/drivers/media/dvb/ttpci/ttpci-eeprom.h +++ b/linux/drivers/media/dvb/ttpci/ttpci-eeprom.h @@ -25,8 +25,9 @@ #ifndef __TTPCI_EEPROM_H__ #define __TTPCI_EEPROM_H__ -#include "dvb_i2c.h" +#include <linux/types.h> +#include <linux/i2c.h> -extern int ttpci_eeprom_parse_mac(struct dvb_i2c_bus *i2c); +extern int ttpci_eeprom_parse_mac(struct i2c_adapter *adapter, u8 *propsed_mac); #endif |
