From ebbb343f2622dae4d4f0539ce9cd29f45e6862fe Mon Sep 17 00:00:00 2001 From: Hans Verkuil Date: Sat, 17 Jan 2009 16:17:14 +0100 Subject: saa7134: convert to the new v4l2 framework. From: Hans Verkuil Register v4l2_device and switch to v4l2_subdev to access the i2c modules. Priority: normal Signed-off-by: Hans Verkuil --- linux/drivers/media/video/saa7134/saa7134-core.c | 66 ++++++++++++++++++++---- 1 file changed, 55 insertions(+), 11 deletions(-) (limited to 'linux/drivers/media/video/saa7134/saa7134-core.c') diff --git a/linux/drivers/media/video/saa7134/saa7134-core.c b/linux/drivers/media/video/saa7134/saa7134-core.c index 624ac4537..a6d643062 100644 --- a/linux/drivers/media/video/saa7134/saa7134-core.c +++ b/linux/drivers/media/video/saa7134/saa7134-core.c @@ -912,6 +912,10 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, if (NULL == dev) return -ENOMEM; + err = v4l2_device_register(&pci_dev->dev, &dev->v4l2_dev); + if (err) + goto fail0; + /* pci init */ dev->pci = pci_dev; if (pci_enable_device(pci_dev)) { @@ -988,6 +992,8 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, dev->autodetected = card[dev->nr] != dev->board; dev->tuner_type = saa7134_boards[dev->board].tuner_type; dev->tuner_addr = saa7134_boards[dev->board].tuner_addr; + dev->radio_type = saa7134_boards[dev->board].radio_type; + dev->radio_addr = saa7134_boards[dev->board].radio_addr; dev->tda9887_conf = saa7134_boards[dev->board].tda9887_conf; if (UNSET != tuner[dev->nr]) dev->tuner_type = tuner[dev->nr]; @@ -1034,15 +1040,50 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, saa7134_i2c_register(dev); /* initialize hardware #2 */ - if (TUNER_ABSENT != dev->tuner_type) - request_module("tuner"); + if (TUNER_ABSENT != dev->tuner_type) { + if (dev->radio_type != UNSET) { + v4l2_i2c_new_subdev(&dev->i2c_adap, "tuner", "tuner", + dev->radio_addr); + } + if (dev->tda9887_conf & TDA9887_PRESENT) { + unsigned short addrs[] = { 0x42, 0x43, 0x4a, 0x4b, + I2C_CLIENT_END }; + + v4l2_i2c_new_probed_subdev(&dev->i2c_adap, + "tuner", "tuner", addrs); + } + if (dev->tuner_addr != ADDR_UNSET) { + v4l2_i2c_new_subdev(&dev->i2c_adap, + "tuner", "tuner", dev->tuner_addr); + } else { + unsigned short addrs[] = { + 0x42, 0x43, 0x4a, 0x4b, /* tda8290 */ + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + I2C_CLIENT_END + }; + + if (dev->tda9887_conf & TDA9887_PRESENT) { + v4l2_i2c_new_probed_subdev(&dev->i2c_adap, + "tuner", "tuner", addrs + 4); + } else { + v4l2_i2c_new_probed_subdev(&dev->i2c_adap, + "tuner", "tuner", addrs); + } + } + } saa7134_board_init2(dev); saa7134_hwinit2(dev); /* load i2c helpers */ if (card_is_empress(dev)) { - request_module("saa6752hs"); + struct v4l2_subdev *sd = + v4l2_i2c_new_subdev(&dev->i2c_adap, "saa6752hs", + "saa6752hs", 0x20); + + if (sd) + sd->grp_id = GRP_EMPRESS; } request_submodules(dev); @@ -1084,7 +1125,6 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, } /* everything worked */ - pci_set_drvdata(pci_dev,dev); saa7134_devcount++; mutex_lock(&devlist_lock); @@ -1101,7 +1141,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, } if (TUNER_ABSENT != dev->tuner_type) - saa7134_i2c_call_clients(dev, TUNER_SET_STANDBY, NULL); + saa_call_all(dev, core, s_standby, 0); return 0; @@ -1116,13 +1156,16 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, release_mem_region(pci_resource_start(pci_dev,0), pci_resource_len(pci_dev,0)); fail1: + v4l2_device_unregister(&dev->v4l2_dev); + fail0: kfree(dev); return err; } static void __devexit saa7134_finidev(struct pci_dev *pci_dev) { - struct saa7134_dev *dev = pci_get_drvdata(pci_dev); + struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev); + struct saa7134_dev *dev = container_of(v4l2_dev, struct saa7134_dev, v4l2_dev); struct saa7134_mpeg_ops *mops; /* Release DMA sound modules if present */ @@ -1177,7 +1220,8 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev) #if 0 /* causes some trouble when reinserting the driver ... */ pci_disable_device(pci_dev); #endif - pci_set_drvdata(pci_dev, NULL); + + v4l2_device_unregister(&dev->v4l2_dev); /* free memory */ kfree(dev); @@ -1212,8 +1256,8 @@ static int saa7134_buffer_requeue(struct saa7134_dev *dev, static int saa7134_suspend(struct pci_dev *pci_dev , pm_message_t state) { - - struct saa7134_dev *dev = pci_get_drvdata(pci_dev); + struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev); + struct saa7134_dev *dev = container_of(v4l2_dev, struct saa7134_dev, v4l2_dev); /* disable overlay - apps should enable it explicitly on resume*/ dev->ovenable = 0; @@ -1252,7 +1296,8 @@ static int saa7134_suspend(struct pci_dev *pci_dev , pm_message_t state) static int saa7134_resume(struct pci_dev *pci_dev) { - struct saa7134_dev *dev = pci_get_drvdata(pci_dev); + struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev); + struct saa7134_dev *dev = container_of(v4l2_dev, struct saa7134_dev, v4l2_dev); unsigned long flags; pci_set_power_state(pci_dev, PCI_D0); @@ -1374,7 +1419,6 @@ module_exit(saa7134_fini); /* ----------------------------------------------------------- */ EXPORT_SYMBOL(saa7134_set_gpio); -EXPORT_SYMBOL(saa7134_i2c_call_clients); EXPORT_SYMBOL(saa7134_devlist); EXPORT_SYMBOL(saa7134_boards); -- cgit v1.2.3 From b3bd2b4c24de403f1baa56ec2ec452e7f8f9b463 Mon Sep 17 00:00:00 2001 From: Hans Verkuil Date: Sun, 18 Jan 2009 23:37:59 +0100 Subject: v4l2-common: added v4l2_i2c_tuner_addrs() From: Hans Verkuil Add v4l2_i2c_tuner_addrs() to obtain the various I2C tuner addresses. This will be used in several drivers, so make this a common function as we do not want to have these I2C addresses all over the place. Priority: normal Signed-off-by: Hans Verkuil --- linux/drivers/media/video/saa7134/saa7134-core.c | 42 +++++++++--------------- 1 file changed, 16 insertions(+), 26 deletions(-) (limited to 'linux/drivers/media/video/saa7134/saa7134-core.c') diff --git a/linux/drivers/media/video/saa7134/saa7134-core.c b/linux/drivers/media/video/saa7134/saa7134-core.c index a6d643062..1ba80210e 100644 --- a/linux/drivers/media/video/saa7134/saa7134-core.c +++ b/linux/drivers/media/video/saa7134/saa7134-core.c @@ -1041,35 +1041,25 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, /* initialize hardware #2 */ if (TUNER_ABSENT != dev->tuner_type) { - if (dev->radio_type != UNSET) { - v4l2_i2c_new_subdev(&dev->i2c_adap, "tuner", "tuner", - dev->radio_addr); - } - if (dev->tda9887_conf & TDA9887_PRESENT) { - unsigned short addrs[] = { 0x42, 0x43, 0x4a, 0x4b, - I2C_CLIENT_END }; + int has_demod = (dev->tda9887_conf & TDA9887_PRESENT); - v4l2_i2c_new_probed_subdev(&dev->i2c_adap, - "tuner", "tuner", addrs); - } - if (dev->tuner_addr != ADDR_UNSET) { + /* Note: radio tuner address is always filled in, + so we do not need to probe for a radio tuner device. */ + if (dev->radio_type != UNSET) v4l2_i2c_new_subdev(&dev->i2c_adap, - "tuner", "tuner", dev->tuner_addr); + "tuner", "tuner", dev->radio_addr); + if (has_demod) + v4l2_i2c_new_probed_subdev(&dev->i2c_adap, "tuner", + "tuner", v4l2_i2c_tuner_addrs(ADDRS_DEMOD)); + if (dev->tuner_addr == ADDR_UNSET) { + enum v4l2_i2c_tuner_type type = + has_demod ? ADDRS_TV_WITH_DEMOD : ADDRS_TV; + + v4l2_i2c_new_probed_subdev(&dev->i2c_adap, "tuner", + "tuner", v4l2_i2c_tuner_addrs(type)); } else { - unsigned short addrs[] = { - 0x42, 0x43, 0x4a, 0x4b, /* tda8290 */ - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, - I2C_CLIENT_END - }; - - if (dev->tda9887_conf & TDA9887_PRESENT) { - v4l2_i2c_new_probed_subdev(&dev->i2c_adap, - "tuner", "tuner", addrs + 4); - } else { - v4l2_i2c_new_probed_subdev(&dev->i2c_adap, - "tuner", "tuner", addrs); - } + v4l2_i2c_new_subdev(&dev->i2c_adap, + "tuner", "tuner", dev->tuner_addr); } } saa7134_board_init2(dev); -- cgit v1.2.3