From 7c8e1a2aecbfdcad224468d9500ce587901fbcc4 Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Wed, 24 Oct 2007 12:08:20 -0200 Subject: Remove the obsoleted xc3028 From: Mauro Carvalho Chehab Remove the old xc3028.c file, replacing all occurrences of TUNER_XCEIVE_XC3028 to TUNER_XC2028. Some work is still may be required to make sure that non-tm6000 drivers will be capable of using tuner-xc2028. Signed-off-by: Mauro Carvalho Chehab --- linux/Documentation/video4linux/CARDLIST.tuner | 2 +- linux/drivers/media/video/em28xx/em28xx-cards.c | 10 +++------- linux/drivers/media/video/ivtv/ivtv-cards.c | 6 +++--- linux/drivers/media/video/ivtv/ivtv-driver.c | 2 +- linux/drivers/media/video/tuner-core.c | 5 ----- linux/drivers/media/video/tuner-types.c | 6 +++--- linux/include/media/tuner.h | 2 +- v4l/Makefile | 4 ---- 8 files changed, 12 insertions(+), 25 deletions(-) --- linux/include/media/tuner.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'linux/include') diff --git a/linux/include/media/tuner.h b/linux/include/media/tuner.h index c03dceb92..d49392d90 100644 --- a/linux/include/media/tuner.h +++ b/linux/include/media/tuner.h @@ -117,7 +117,7 @@ extern int tuner_debug; #define TUNER_PHILIPS_TUV1236D 68 /* ATI HDTV Wonder */ #define TUNER_TNF_5335MF 69 /* Sabrent Bt848 */ #define TUNER_SAMSUNG_TCPN_2121P30A 70 /* Hauppauge PVR-500MCE NTSC */ -#define TUNER_XCEIVE_XC3028 71 +#define TUNER_XC2028 71 #define TUNER_THOMSON_FE6600 72 /* DViCO FusionHDTV DVB-T Hybrid */ #define TUNER_SAMSUNG_TCPG_6121P30A 73 /* Hauppauge PVR-500 PAL */ -- cgit v1.2.3 From d9d95216cef86d580d36f7a13cc80bcb4973c4c8 Mon Sep 17 00:00:00 2001 From: Michael Krufky Date: Mon, 22 Oct 2007 08:56:38 -0400 Subject: tda8290: add support for NXP TDA18271 tuner and TDA8295 analog demod From: Michael Krufky Add basic support for NXP TDA8295 analog demod and TDA18271 tuner silicon. TDA8295 + TDA8275a not yet tested. TDA8290 + TDA18271 not yet supported. Digital mode of TDA18271 not yet tested & needs more work. Signed-off-by: Michael Krufky Reviewed-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab --- linux/Documentation/video4linux/CARDLIST.tuner | 1 linux/drivers/media/Kconfig | 3 linux/drivers/media/dvb/frontends/Kconfig | 7 linux/drivers/media/dvb/frontends/Makefile | 1 linux/drivers/media/dvb/frontends/tda18271.c | 1062 +++++++++++++++++++++++++ linux/drivers/media/dvb/frontends/tda18271.h | 40 linux/drivers/media/video/tda8290.c | 339 +++++++ linux/drivers/media/video/tda8290.h | 8 linux/drivers/media/video/tuner-core.c | 5 linux/drivers/media/video/tuner-types.c | 3 linux/drivers/media/video/tveeprom.c | 2 linux/include/media/tuner.h | 2 v4l/versions.txt | 2 13 files changed, 1467 insertions(+), 8 deletions(-) --- linux/include/media/tuner.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'linux/include') diff --git a/linux/include/media/tuner.h b/linux/include/media/tuner.h index d49392d90..faacd2d50 100644 --- a/linux/include/media/tuner.h +++ b/linux/include/media/tuner.h @@ -124,6 +124,8 @@ extern int tuner_debug; #define TUNER_TDA9887 74 /* This tuner should be used only internally */ #define TUNER_TEA5761 75 /* Only FM Radio Tuner */ +#define TUNER_PHILIPS_TDA8295 76 + /* tv card specific */ #define TDA9887_PRESENT (1<<0) #define TDA9887_PORT1_INACTIVE (1<<1) -- cgit v1.2.3 From 30e50fe332679825e6f54936c7c5e97bf109584d Mon Sep 17 00:00:00 2001 From: Hans Verkuil Date: Wed, 12 Sep 2007 13:32:50 +0200 Subject: v4l2: add support for bus-based I2C drivers From: Hans Verkuil Two new headers were added: one for I2C drivers that are only used by V4L2 drivers converted to the new bus-based I2C API, and one that can be used by both converted and unconverted drivers (at the expense of some additional overhead). To support the legacy I2C API a helper function was added to v4l2-common.c. These headers take care of all the 'boilerplate' code that all V4L2 I2C drivers have in common and will automatically support the bus-based I2C API introduced in kernel 2.6.22. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab --- linux/drivers/media/video/v4l2-common.c | 37 +++++ linux/include/media/v4l2-common.h | 11 + linux/include/media/v4l2-i2c-drv-legacy.h | 207 ++++++++++++++++++++++++++++++ linux/include/media/v4l2-i2c-drv.h | 199 ++++++++++++++++++++++++++++ 4 files changed, 454 insertions(+) --- linux/include/media/v4l2-common.h | 11 ++ linux/include/media/v4l2-i2c-drv-legacy.h | 207 ++++++++++++++++++++++++++++++ linux/include/media/v4l2-i2c-drv.h | 199 ++++++++++++++++++++++++++++ 3 files changed, 417 insertions(+) create mode 100644 linux/include/media/v4l2-i2c-drv-legacy.h create mode 100644 linux/include/media/v4l2-i2c-drv.h (limited to 'linux/include') diff --git a/linux/include/media/v4l2-common.h b/linux/include/media/v4l2-common.h index ee1265433..10fc32e16 100644 --- a/linux/include/media/v4l2-common.h +++ b/linux/include/media/v4l2-common.h @@ -113,6 +113,17 @@ int v4l2_chip_match_host(u32 id_type, u32 chip_id); /* ------------------------------------------------------------------------- */ +/* Helper function for I2C legacy drivers */ + +struct i2c_driver; +struct i2c_adapter; +struct i2c_client; + +int v4l2_i2c_attach(struct i2c_adapter *adapter, int address, struct i2c_driver *driver, + const char *name, int (*probe)(struct i2c_client *)); + +/* ------------------------------------------------------------------------- */ + /* Internal ioctls */ /* VIDIOC_INT_DECODE_VBI_LINE */ diff --git a/linux/include/media/v4l2-i2c-drv-legacy.h b/linux/include/media/v4l2-i2c-drv-legacy.h new file mode 100644 index 000000000..b76f6580c --- /dev/null +++ b/linux/include/media/v4l2-i2c-drv-legacy.h @@ -0,0 +1,207 @@ +/* + * v4l2-i2c-drv-legacy.h - contains I2C handling code that's identical + * for all V4L2 I2C drivers. Use this header if the + * I2C driver is used by both legacy drivers and + * drivers converted to the bus-based I2C API. + * + * Copyright (C) 2007 Hans Verkuil + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +struct v4l2_i2c_driver_data { + const char * const name; + int driverid; + int (*command)(struct i2c_client *client, unsigned int cmd, void *arg); + int (*probe)(struct i2c_client *client); + int (*remove)(struct i2c_client *client); + int (*suspend)(struct i2c_client *client, pm_message_t state); + int (*resume)(struct i2c_client *client); +#ifdef I2C_CLASS_TV_ANALOG + int legacy_class; +#else + int legacy_id; +#endif +}; + +static struct v4l2_i2c_driver_data v4l2_i2c_data; +static struct i2c_client_address_data addr_data; +static struct i2c_driver v4l2_i2c_driver_legacy; +static char v4l2_i2c_drv_name_legacy[32]; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) +static int v4l2_i2c_drv_attach_legacy(struct i2c_adapter *adapter, int address, int kind) +#else +static int v4l2_i2c_drv_attach_legacy(struct i2c_adapter *adapter, int address, + unsigned short flags, int kind) +#endif +{ + return v4l2_i2c_attach(adapter, address, &v4l2_i2c_driver_legacy, + v4l2_i2c_drv_name_legacy, v4l2_i2c_data.probe); +} + +static int v4l2_i2c_drv_probe_legacy(struct i2c_adapter *adapter) +{ +#ifdef I2C_CLASS_TV_ANALOG + if (adapter->class & v4l2_i2c_data.legacy_class) +#else + if (adapter->id == v4l2_i2c_data.legacy_id) +#endif + return i2c_probe(adapter, &addr_data, v4l2_i2c_drv_attach_legacy); + return 0; +} + +static int v4l2_i2c_drv_detach_legacy(struct i2c_client *client) +{ + int err = i2c_detach_client(client); + + if (err) + return err; + if (v4l2_i2c_data.remove) + v4l2_i2c_data.remove(client); + kfree(client); + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) + MOD_DEC_USE_COUNT; +#endif + return 0; +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,14) +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,20) +static int v4l2_i2c_drv_suspend_helper(struct i2c_client *client, pm_message_t state) +#else +static int v4l2_i2c_drv_suspend_helper(struct device * dev, pm_message_t state) +#endif +#else +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13) +static int v4l2_i2c_drv_suspend_helper(struct device * dev, pm_message_t state, u32 level) +#else +static int v4l2_i2c_drv_suspend_helper(struct device * dev, u32 state, u32 level) +#endif +#endif +{ +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,20) + struct i2c_client *client = container_of(dev, struct i2c_client, dev); +#endif + return v4l2_i2c_data.suspend ? v4l2_i2c_data.suspend(client, state) : 0; +} + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,14) +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,20) +static int v4l2_i2c_drv_resume_helper(struct i2c_client *client) +#else +static int v4l2_i2c_drv_resume_helper(struct device * dev) +#endif +#else +static int v4l2_i2c_drv_resume_helper(struct device * dev, u32 level) +#endif +{ +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,20) + struct i2c_client *client = container_of(dev, struct i2c_client, dev); +#endif + return v4l2_i2c_data.resume ? v4l2_i2c_data.resume(client) : 0; +} +#endif + +/* ----------------------------------------------------------------------- */ + +/* i2c implementation */ +static struct i2c_driver v4l2_i2c_driver_legacy = { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) && (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,15)) + .owner = THIS_MODULE, +#endif +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,15) + .flags = I2C_DF_NOTIFY, +#endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) + .driver = { +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15) + .owner = THIS_MODULE, +#endif +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,20) + .suspend = v4l2_i2c_drv_suspend_helper, + .resume = v4l2_i2c_drv_resume_helper, +#endif + }, +#endif + .attach_adapter = v4l2_i2c_drv_probe_legacy, + .detach_client = v4l2_i2c_drv_detach_legacy, +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,20) + .suspend = v4l2_i2c_drv_suspend_helper, + .resume = v4l2_i2c_drv_resume_helper, +#endif +}; + +/* ----------------------------------------------------------------------- */ + +/* i2c implementation */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) +static struct i2c_driver v4l2_i2c_driver = { + .suspend = v4l2_i2c_drv_suspend_helper, + .resume = v4l2_i2c_drv_resume_helper, +}; +#endif + +static int __init v4l2_i2c_drv_init(void) +{ + int err; + + strlcpy(v4l2_i2c_drv_name_legacy, v4l2_i2c_data.name, sizeof(v4l2_i2c_drv_name_legacy)); + strlcat(v4l2_i2c_drv_name_legacy, "'", sizeof(v4l2_i2c_drv_name_legacy)); + +#ifdef I2C_CLASS_TV_ANALOG + if (v4l2_i2c_data.legacy_class == 0) + v4l2_i2c_data.legacy_class = I2C_CLASS_TV_ANALOG; +#else + if (v4l2_i2c_data.legacy_id == 0) + v4l2_i2c_data.legacy_id = I2C_HW_B_BT848; +#endif + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,15) + strlcpy(v4l2_i2c_driver_legacy.name, v4l2_i2c_drv_name_legacy, sizeof(v4l2_i2c_driver_legacy.name)); +#else + v4l2_i2c_driver_legacy.driver.name = v4l2_i2c_drv_name_legacy; +#endif + v4l2_i2c_driver_legacy.id = v4l2_i2c_data.driverid; + v4l2_i2c_driver_legacy.command = v4l2_i2c_data.command; + err = i2c_add_driver(&v4l2_i2c_driver_legacy); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) + if (err) + return err; + v4l2_i2c_driver.driver.name = v4l2_i2c_data.name; + v4l2_i2c_driver.id = v4l2_i2c_data.driverid; + v4l2_i2c_driver.command = v4l2_i2c_data.command; + v4l2_i2c_driver.probe = v4l2_i2c_data.probe; + v4l2_i2c_driver.remove = v4l2_i2c_data.remove; + err = i2c_add_driver(&v4l2_i2c_driver); + if (err) + i2c_del_driver(&v4l2_i2c_driver_legacy); +#endif + return err; +} + +static void __exit v4l2_i2c_drv_cleanup(void) +{ + i2c_del_driver(&v4l2_i2c_driver_legacy); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) + i2c_del_driver(&v4l2_i2c_driver); +#endif +} + +module_init(v4l2_i2c_drv_init); +module_exit(v4l2_i2c_drv_cleanup); diff --git a/linux/include/media/v4l2-i2c-drv.h b/linux/include/media/v4l2-i2c-drv.h new file mode 100644 index 000000000..f027f27fb --- /dev/null +++ b/linux/include/media/v4l2-i2c-drv.h @@ -0,0 +1,199 @@ +/* + * v4l2-i2c-drv.h - contains I2C handling code that's identical for + * all V4L2 I2C drivers. Use this header if the + * I2C driver is only used by drivers converted + * to the bus-based I2C API. + * + * Copyright (C) 2007 Hans Verkuil + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +struct v4l2_i2c_driver_data { + const char * const name; + int driverid; + int (*command)(struct i2c_client *client, unsigned int cmd, void *arg); + int (*probe)(struct i2c_client *client); + int (*remove)(struct i2c_client *client); + int (*suspend)(struct i2c_client *client, pm_message_t state); + int (*resume)(struct i2c_client *client); +#ifdef I2C_CLASS_TV_ANALOG + int legacy_class; +#else + int legacy_id; +#endif +}; + +static struct v4l2_i2c_driver_data v4l2_i2c_data; +static struct i2c_client_address_data addr_data; +static struct i2c_driver v4l2_i2c_driver; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) + +/* Bus-based I2C implementation for kernels >= 2.6.22 */ + +static int __init v4l2_i2c_drv_init(void) +{ + v4l2_i2c_driver.driver.name = v4l2_i2c_data.name; + v4l2_i2c_driver.id = v4l2_i2c_data.driverid; + v4l2_i2c_driver.command = v4l2_i2c_data.command; + v4l2_i2c_driver.probe = v4l2_i2c_data.probe; + v4l2_i2c_driver.remove = v4l2_i2c_data.remove; + v4l2_i2c_driver.suspend = v4l2_i2c_data.suspend; + v4l2_i2c_driver.resume = v4l2_i2c_data.resume; + return i2c_add_driver(&v4l2_i2c_driver); +} + +#else + +/* Bus-based I2C API is not present, add legacy code */ + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) +static int v4l2_i2c_drv_attach_legacy(struct i2c_adapter *adapter, int address, int kind) +#else +static int v4l2_i2c_drv_attach_legacy(struct i2c_adapter *adapter, int address, + unsigned short flags, int kind) +#endif +{ + return v4l2_i2c_attach(adapter, address, &v4l2_i2c_driver, + v4l2_i2c_data.name, v4l2_i2c_data.probe); +} + +static int v4l2_i2c_drv_probe_legacy(struct i2c_adapter *adapter) +{ +#ifdef I2C_CLASS_TV_ANALOG + if (adapter->class & v4l2_i2c_data.legacy_class) +#else + if (adapter->id == v4l2_i2c_data.legacy_id) +#endif + return i2c_probe(adapter, &addr_data, v4l2_i2c_drv_attach_legacy); + return 0; +} + +static int v4l2_i2c_drv_detach_legacy(struct i2c_client *client) +{ + int err = i2c_detach_client(client); + + if (err) + return err; + if (v4l2_i2c_data.remove) + v4l2_i2c_data.remove(client); + kfree(client); + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) + MOD_DEC_USE_COUNT; +#endif + return 0; +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,14) +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,20) +static int v4l2_i2c_drv_suspend_helper(struct i2c_client *client, pm_message_t state) +#else +static int v4l2_i2c_drv_suspend_helper(struct device * dev, pm_message_t state) +#endif +#else +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13) +static int v4l2_i2c_drv_suspend_helper(struct device * dev, pm_message_t state, u32 level) +#else +static int v4l2_i2c_drv_suspend_helper(struct device * dev, u32 state, u32 level) +#endif +#endif +{ +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,20) + struct i2c_client *client = container_of(dev, struct i2c_client, dev); +#endif + return v4l2_i2c_data.suspend ? v4l2_i2c_data.suspend(client, state) : 0; +} + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,14) +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,20) +static int v4l2_i2c_drv_resume_helper(struct i2c_client *client) +#else +static int v4l2_i2c_drv_resume_helper(struct device * dev) +#endif +#else +static int v4l2_i2c_drv_resume_helper(struct device * dev, u32 level) +#endif +{ +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,20) + struct i2c_client *client = container_of(dev, struct i2c_client, dev); +#endif + return v4l2_i2c_data.resume ? v4l2_i2c_data.resume(client) : 0; +} +#endif + +/* ----------------------------------------------------------------------- */ + +static struct i2c_driver v4l2_i2c_driver = { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) && (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,15)) + .owner = THIS_MODULE, +#endif +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,15) + .flags = I2C_DF_NOTIFY, +#endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) + .driver = { +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15) + .owner = THIS_MODULE, +#endif +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,20) + .suspend = v4l2_i2c_drv_suspend_helper, + .resume = v4l2_i2c_drv_resume_helper, +#endif + }, +#endif + .attach_adapter = v4l2_i2c_drv_probe_legacy, + .detach_client = v4l2_i2c_drv_detach_legacy, +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,20) + .suspend = v4l2_i2c_drv_suspend_helper, + .resume = v4l2_i2c_drv_resume_helper, +#endif +}; + +/* ----------------------------------------------------------------------- */ + +static int __init v4l2_i2c_drv_init(void) +{ +#ifdef I2C_CLASS_TV_ANALOG + if (v4l2_i2c_data.legacy_class == 0) + v4l2_i2c_data.legacy_class = I2C_CLASS_TV_ANALOG; +#else + if (v4l2_i2c_data.legacy_id == 0) + v4l2_i2c_data.legacy_id = I2C_HW_B_BT848; +#endif + +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,15) + strlcpy(v4l2_i2c_driver.name, v4l2_i2c_data.name, sizeof(v4l2_i2c_driver.name)); +#else + v4l2_i2c_driver.driver.name = v4l2_i2c_data.name; +#endif + v4l2_i2c_driver.id = v4l2_i2c_data.driverid; + v4l2_i2c_driver.command = v4l2_i2c_data.command; + return i2c_add_driver(&v4l2_i2c_driver); +} + +/* End legacy code */ + +#endif + +static void __exit v4l2_i2c_drv_cleanup(void) +{ + i2c_del_driver(&v4l2_i2c_driver); +} + +module_init(v4l2_i2c_drv_init); +module_exit(v4l2_i2c_drv_cleanup); -- cgit v1.2.3 From 7c67eff2bb3420b8cd67577e4dd4af931de00690 Mon Sep 17 00:00:00 2001 From: Hans Verkuil Date: Fri, 14 Sep 2007 09:49:16 +0200 Subject: v4l2-i2c-drv: add legacy_probe function pointer From: Hans Verkuil Some devices do complicated tests whether the device can be probed or not. Add a legacy_probe function pointer to support that. Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab --- linux/include/media/v4l2-i2c-drv-legacy.h | 6 ++++++ linux/include/media/v4l2-i2c-drv.h | 6 ++++++ 2 files changed, 12 insertions(+) --- linux/include/media/v4l2-i2c-drv-legacy.h | 6 ++++++ linux/include/media/v4l2-i2c-drv.h | 6 ++++++ 2 files changed, 12 insertions(+) (limited to 'linux/include') diff --git a/linux/include/media/v4l2-i2c-drv-legacy.h b/linux/include/media/v4l2-i2c-drv-legacy.h index b76f6580c..451cbe71d 100644 --- a/linux/include/media/v4l2-i2c-drv-legacy.h +++ b/linux/include/media/v4l2-i2c-drv-legacy.h @@ -29,6 +29,7 @@ struct v4l2_i2c_driver_data { int (*remove)(struct i2c_client *client); int (*suspend)(struct i2c_client *client, pm_message_t state); int (*resume)(struct i2c_client *client); + int (*legacy_probe)(struct i2c_adapter *adapter); #ifdef I2C_CLASS_TV_ANALOG int legacy_class; #else @@ -54,6 +55,11 @@ static int v4l2_i2c_drv_attach_legacy(struct i2c_adapter *adapter, int address, static int v4l2_i2c_drv_probe_legacy(struct i2c_adapter *adapter) { + if (v4l2_i2c_data.legacy_probe) { + if (v4l2_i2c_data.legacy_probe(adapter)) + return i2c_probe(adapter, &addr_data, v4l2_i2c_drv_attach_legacy); + return 0; + } #ifdef I2C_CLASS_TV_ANALOG if (adapter->class & v4l2_i2c_data.legacy_class) #else diff --git a/linux/include/media/v4l2-i2c-drv.h b/linux/include/media/v4l2-i2c-drv.h index f027f27fb..f5bcf0926 100644 --- a/linux/include/media/v4l2-i2c-drv.h +++ b/linux/include/media/v4l2-i2c-drv.h @@ -29,6 +29,7 @@ struct v4l2_i2c_driver_data { int (*remove)(struct i2c_client *client); int (*suspend)(struct i2c_client *client, pm_message_t state); int (*resume)(struct i2c_client *client); + int (*legacy_probe)(struct i2c_adapter *adapter); #ifdef I2C_CLASS_TV_ANALOG int legacy_class; #else @@ -73,6 +74,11 @@ static int v4l2_i2c_drv_attach_legacy(struct i2c_adapter *adapter, int address, static int v4l2_i2c_drv_probe_legacy(struct i2c_adapter *adapter) { + if (v4l2_i2c_data.legacy_probe) { + if (v4l2_i2c_data.legacy_probe(adapter)) + return i2c_probe(adapter, &addr_data, v4l2_i2c_drv_attach_legacy); + return 0; + } #ifdef I2C_CLASS_TV_ANALOG if (adapter->class & v4l2_i2c_data.legacy_class) #else -- cgit v1.2.3 From dfcd6af68fc687d7efab92de9b9c183ab59867cb Mon Sep 17 00:00:00 2001 From: Hans Verkuil Date: Mon, 17 Sep 2007 10:13:45 +0200 Subject: v4l2-i2c-drv: first call remove, then detach client From: Hans Verkuil The remove driver function expects that the client is still attached to the driver, so do the detach after calling remove(). Signed-off-by: Hans Verkuil Signed-off-by: Mauro Carvalho Chehab --- linux/include/media/v4l2-i2c-drv-legacy.h | 8 +++++--- linux/include/media/v4l2-i2c-drv.h | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) --- linux/include/media/v4l2-i2c-drv-legacy.h | 8 +++++--- linux/include/media/v4l2-i2c-drv.h | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) (limited to 'linux/include') diff --git a/linux/include/media/v4l2-i2c-drv-legacy.h b/linux/include/media/v4l2-i2c-drv-legacy.h index 451cbe71d..fa55a1479 100644 --- a/linux/include/media/v4l2-i2c-drv-legacy.h +++ b/linux/include/media/v4l2-i2c-drv-legacy.h @@ -71,12 +71,14 @@ static int v4l2_i2c_drv_probe_legacy(struct i2c_adapter *adapter) static int v4l2_i2c_drv_detach_legacy(struct i2c_client *client) { - int err = i2c_detach_client(client); + int err; - if (err) - return err; if (v4l2_i2c_data.remove) v4l2_i2c_data.remove(client); + + err = i2c_detach_client(client); + if (err) + return err; kfree(client); #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) diff --git a/linux/include/media/v4l2-i2c-drv.h b/linux/include/media/v4l2-i2c-drv.h index f5bcf0926..726120399 100644 --- a/linux/include/media/v4l2-i2c-drv.h +++ b/linux/include/media/v4l2-i2c-drv.h @@ -90,12 +90,14 @@ static int v4l2_i2c_drv_probe_legacy(struct i2c_adapter *adapter) static int v4l2_i2c_drv_detach_legacy(struct i2c_client *client) { - int err = i2c_detach_client(client); + int err; - if (err) - return err; if (v4l2_i2c_data.remove) v4l2_i2c_data.remove(client); + + err = i2c_detach_client(client); + if (err) + return err; kfree(client); #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -- cgit v1.2.3 From 9fe310f613a6c6124a696705caef1d454a0fd7bf Mon Sep 17 00:00:00 2001 From: Michael Krufky Date: Sat, 27 Oct 2007 12:09:16 -0400 Subject: tuner: remove TUNER_PHILIPS_TDA8295 From: Michael Krufky TUNER_PHILIPS_TDA8290 will autodetect a TDA8290 or a TDA8295, so we don't need this separate entry anymore. Signed-off-by: Michael Krufky Signed-off-by: Mauro Carvalho Chehab --- linux/Documentation/video4linux/CARDLIST.tuner | 3 +-- linux/drivers/media/video/tuner-core.c | 1 - linux/drivers/media/video/tuner-types.c | 5 +---- linux/drivers/media/video/tveeprom.c | 2 +- linux/include/media/tuner.h | 2 -- 5 files changed, 3 insertions(+), 10 deletions(-) --- linux/include/media/tuner.h | 2 -- 1 file changed, 2 deletions(-) (limited to 'linux/include') diff --git a/linux/include/media/tuner.h b/linux/include/media/tuner.h index faacd2d50..d49392d90 100644 --- a/linux/include/media/tuner.h +++ b/linux/include/media/tuner.h @@ -124,8 +124,6 @@ extern int tuner_debug; #define TUNER_TDA9887 74 /* This tuner should be used only internally */ #define TUNER_TEA5761 75 /* Only FM Radio Tuner */ -#define TUNER_PHILIPS_TDA8295 76 - /* tv card specific */ #define TDA9887_PRESENT (1<<0) #define TDA9887_PORT1_INACTIVE (1<<1) -- cgit v1.2.3