summaryrefslogtreecommitdiff
path: root/linux/drivers/media/dvb/ttpci
diff options
context:
space:
mode:
authorMichael Hunold <devnull@localhost>2004-05-03 11:15:31 +0000
committerMichael Hunold <devnull@localhost>2004-05-03 11:15:31 +0000
commit30970c2a967560590b306f6965aea609d7fd3a54 (patch)
tree1546c38a1f6394165ed95326b13814661fc42477 /linux/drivers/media/dvb/ttpci
parenta9135ebb9e7ffd0934fa6e9bd6b0a0a4e5ff912d (diff)
downloadmediapointer-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.c45
-rw-r--r--linux/drivers/media/dvb/ttpci/av7110.h3
-rw-r--r--linux/drivers/media/dvb/ttpci/av7110_ca.c1
-rw-r--r--linux/drivers/media/dvb/ttpci/av7110_v4l.c10
-rw-r--r--linux/drivers/media/dvb/ttpci/budget-core.c32
-rw-r--r--linux/drivers/media/dvb/ttpci/budget.c4
-rw-r--r--linux/drivers/media/dvb/ttpci/budget.h12
-rw-r--r--linux/drivers/media/dvb/ttpci/ttpci-eeprom.c22
-rw-r--r--linux/drivers/media/dvb/ttpci/ttpci-eeprom.h5
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