aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-01-01 09:37:17 -0500
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-02-13 18:10:12 -0500
commit1d058bdcf5cc800fbfeece0204f7774556d341bb (patch)
treea98b9f562e24e927f66b0c768d39173a1e4d40d3 /drivers/media
parenta0246e02f466482a34c8ad94bedbe4efa498662d (diff)
[media] cx231xx: add media controller support
Let's add media controller support for this driver and register it for both V4L and DVB. The media controller on this driver is not mandatory, as it can fully work without it. So, if the media controller register fails, just print an error message, but proceed with device registering. Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/usb/cx231xx/cx231xx-cards.c60
-rw-r--r--drivers/media/usb/cx231xx/cx231xx-dvb.c4
-rw-r--r--drivers/media/usb/cx231xx/cx231xx.h4
3 files changed, 62 insertions, 6 deletions
diff --git a/drivers/media/usb/cx231xx/cx231xx-cards.c b/drivers/media/usb/cx231xx/cx231xx-cards.c
index da03733690bd..d357e8c0c485 100644
--- a/drivers/media/usb/cx231xx/cx231xx-cards.c
+++ b/drivers/media/usb/cx231xx/cx231xx-cards.c
@@ -912,9 +912,6 @@ static inline void cx231xx_set_model(struct cx231xx *dev)
912 */ 912 */
913void cx231xx_pre_card_setup(struct cx231xx *dev) 913void cx231xx_pre_card_setup(struct cx231xx *dev)
914{ 914{
915
916 cx231xx_set_model(dev);
917
918 dev_info(dev->dev, "Identified as %s (card=%d)\n", 915 dev_info(dev->dev, "Identified as %s (card=%d)\n",
919 dev->board.name, dev->model); 916 dev->board.name, dev->model);
920 917
@@ -1092,6 +1089,17 @@ void cx231xx_config_i2c(struct cx231xx *dev)
1092 call_all(dev, video, s_stream, 1); 1089 call_all(dev, video, s_stream, 1);
1093} 1090}
1094 1091
1092static void cx231xx_unregister_media_device(struct cx231xx *dev)
1093{
1094#ifdef CONFIG_MEDIA_CONTROLLER
1095 if (dev->media_dev) {
1096 media_device_unregister(dev->media_dev);
1097 kfree(dev->media_dev);
1098 dev->media_dev = NULL;
1099 }
1100#endif
1101}
1102
1095/* 1103/*
1096 * cx231xx_realease_resources() 1104 * cx231xx_realease_resources()
1097 * unregisters the v4l2,i2c and usb devices 1105 * unregisters the v4l2,i2c and usb devices
@@ -1099,6 +1107,8 @@ void cx231xx_config_i2c(struct cx231xx *dev)
1099*/ 1107*/
1100void cx231xx_release_resources(struct cx231xx *dev) 1108void cx231xx_release_resources(struct cx231xx *dev)
1101{ 1109{
1110 cx231xx_unregister_media_device(dev);
1111
1102 cx231xx_release_analog_resources(dev); 1112 cx231xx_release_analog_resources(dev);
1103 1113
1104 cx231xx_remove_from_devlist(dev); 1114 cx231xx_remove_from_devlist(dev);
@@ -1117,6 +1127,38 @@ void cx231xx_release_resources(struct cx231xx *dev)
1117 clear_bit(dev->devno, &cx231xx_devused); 1127 clear_bit(dev->devno, &cx231xx_devused);
1118} 1128}
1119 1129
1130static void cx231xx_media_device_register(struct cx231xx *dev,
1131 struct usb_device *udev)
1132{
1133#ifdef CONFIG_MEDIA_CONTROLLER
1134 struct media_device *mdev;
1135 int ret;
1136
1137 mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
1138 if (!mdev)
1139 return;
1140
1141 mdev->dev = dev->dev;
1142 strlcpy(mdev->model, dev->board.name, sizeof(mdev->model));
1143 if (udev->serial)
1144 strlcpy(mdev->serial, udev->serial, sizeof(mdev->serial));
1145 strcpy(mdev->bus_info, udev->devpath);
1146 mdev->hw_revision = le16_to_cpu(udev->descriptor.bcdDevice);
1147 mdev->driver_version = LINUX_VERSION_CODE;
1148
1149 ret = media_device_register(mdev);
1150 if (ret) {
1151 dev_err(dev->dev,
1152 "Couldn't create a media device. Error: %d\n",
1153 ret);
1154 kfree(mdev);
1155 return;
1156 }
1157
1158 dev->media_dev = mdev;
1159#endif
1160}
1161
1120/* 1162/*
1121 * cx231xx_init_dev() 1163 * cx231xx_init_dev()
1122 * allocates and inits the device structs, registers i2c bus and v4l device 1164 * allocates and inits the device structs, registers i2c bus and v4l device
@@ -1225,10 +1267,8 @@ static int cx231xx_init_dev(struct cx231xx *dev, struct usb_device *udev,
1225 } 1267 }
1226 1268
1227 retval = cx231xx_register_analog_devices(dev); 1269 retval = cx231xx_register_analog_devices(dev);
1228 if (retval) { 1270 if (retval)
1229 cx231xx_release_analog_resources(dev);
1230 goto err_analog; 1271 goto err_analog;
1231 }
1232 1272
1233 cx231xx_ir_init(dev); 1273 cx231xx_ir_init(dev);
1234 1274
@@ -1236,6 +1276,8 @@ static int cx231xx_init_dev(struct cx231xx *dev, struct usb_device *udev,
1236 1276
1237 return 0; 1277 return 0;
1238err_analog: 1278err_analog:
1279 cx231xx_unregister_media_device(dev);
1280 cx231xx_release_analog_resources(dev);
1239 cx231xx_remove_from_devlist(dev); 1281 cx231xx_remove_from_devlist(dev);
1240err_dev_init: 1282err_dev_init:
1241 cx231xx_dev_uninit(dev); 1283 cx231xx_dev_uninit(dev);
@@ -1438,6 +1480,8 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
1438 dev->video_mode.alt = -1; 1480 dev->video_mode.alt = -1;
1439 dev->dev = d; 1481 dev->dev = d;
1440 1482
1483 cx231xx_set_model(dev);
1484
1441 dev->interface_count++; 1485 dev->interface_count++;
1442 /* reset gpio dir and value */ 1486 /* reset gpio dir and value */
1443 dev->gpio_dir = 0; 1487 dev->gpio_dir = 0;
@@ -1502,7 +1546,11 @@ static int cx231xx_usb_probe(struct usb_interface *interface,
1502 /* save our data pointer in this interface device */ 1546 /* save our data pointer in this interface device */
1503 usb_set_intfdata(interface, dev); 1547 usb_set_intfdata(interface, dev);
1504 1548
1549 /* Register the media controller */
1550 cx231xx_media_device_register(dev, udev);
1551
1505 /* Create v4l2 device */ 1552 /* Create v4l2 device */
1553 dev->v4l2_dev.mdev = dev->media_dev;
1506 retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev); 1554 retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
1507 if (retval) { 1555 if (retval) {
1508 dev_err(d, "v4l2_device_register failed\n"); 1556 dev_err(d, "v4l2_device_register failed\n");
diff --git a/drivers/media/usb/cx231xx/cx231xx-dvb.c b/drivers/media/usb/cx231xx/cx231xx-dvb.c
index dd600b994e69..bb7e766cd30c 100644
--- a/drivers/media/usb/cx231xx/cx231xx-dvb.c
+++ b/drivers/media/usb/cx231xx/cx231xx-dvb.c
@@ -455,6 +455,7 @@ static int register_dvb(struct cx231xx_dvb *dvb,
455 455
456 mutex_init(&dvb->lock); 456 mutex_init(&dvb->lock);
457 457
458
458 /* register adapter */ 459 /* register adapter */
459 result = dvb_register_adapter(&dvb->adapter, dev->name, module, device, 460 result = dvb_register_adapter(&dvb->adapter, dev->name, module, device,
460 adapter_nr); 461 adapter_nr);
@@ -464,6 +465,9 @@ static int register_dvb(struct cx231xx_dvb *dvb,
464 dev->name, result); 465 dev->name, result);
465 goto fail_adapter; 466 goto fail_adapter;
466 } 467 }
468#ifdef CONFIG_MEDIA_CONTROLLER_DVB
469 dvb->adapter.mdev = dev->media_dev;
470#endif
467 471
468 /* Ensure all frontends negotiate bus access */ 472 /* Ensure all frontends negotiate bus access */
469 dvb->frontend->ops.ts_bus_ctrl = cx231xx_dvb_bus_ctrl; 473 dvb->frontend->ops.ts_bus_ctrl = cx231xx_dvb_bus_ctrl;
diff --git a/drivers/media/usb/cx231xx/cx231xx.h b/drivers/media/usb/cx231xx/cx231xx.h
index 6d6f3ee812f6..af9d6c4041dc 100644
--- a/drivers/media/usb/cx231xx/cx231xx.h
+++ b/drivers/media/usb/cx231xx/cx231xx.h
@@ -658,6 +658,10 @@ struct cx231xx {
658 struct video_device *vbi_dev; 658 struct video_device *vbi_dev;
659 struct video_device *radio_dev; 659 struct video_device *radio_dev;
660 660
661#if defined(CONFIG_MEDIA_CONTROLLER)
662 struct media_device *media_dev;
663#endif
664
661 unsigned char eedata[256]; 665 unsigned char eedata[256];
662 666
663 struct cx231xx_video_mode video_mode; 667 struct cx231xx_video_mode video_mode;