|
@@ -143,7 +143,7 @@ static void au0828_unregister_media_device(struct au0828_dev *dev)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-static void au0828_usb_release(struct au0828_dev *dev)
|
|
|
+void au0828_usb_release(struct au0828_dev *dev)
|
|
|
{
|
|
|
au0828_unregister_media_device(dev);
|
|
|
|
|
@@ -153,33 +153,6 @@ static void au0828_usb_release(struct au0828_dev *dev)
|
|
|
kfree(dev);
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_VIDEO_AU0828_V4L2
|
|
|
-
|
|
|
-static void au0828_usb_v4l2_media_release(struct au0828_dev *dev)
|
|
|
-{
|
|
|
-#ifdef CONFIG_MEDIA_CONTROLLER
|
|
|
- int i;
|
|
|
-
|
|
|
- for (i = 0; i < AU0828_MAX_INPUT; i++) {
|
|
|
- if (AUVI_INPUT(i).type == AU0828_VMUX_UNDEFINED)
|
|
|
- return;
|
|
|
- media_device_unregister_entity(&dev->input_ent[i]);
|
|
|
- }
|
|
|
-#endif
|
|
|
-}
|
|
|
-
|
|
|
-static void au0828_usb_v4l2_release(struct v4l2_device *v4l2_dev)
|
|
|
-{
|
|
|
- struct au0828_dev *dev =
|
|
|
- container_of(v4l2_dev, struct au0828_dev, v4l2_dev);
|
|
|
-
|
|
|
- v4l2_ctrl_handler_free(&dev->v4l2_ctrl_hdl);
|
|
|
- v4l2_device_unregister(&dev->v4l2_dev);
|
|
|
- au0828_usb_v4l2_media_release(dev);
|
|
|
- au0828_usb_release(dev);
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
static void au0828_usb_disconnect(struct usb_interface *interface)
|
|
|
{
|
|
|
struct au0828_dev *dev = usb_get_intfdata(interface);
|
|
@@ -202,18 +175,13 @@ static void au0828_usb_disconnect(struct usb_interface *interface)
|
|
|
mutex_lock(&dev->mutex);
|
|
|
dev->usbdev = NULL;
|
|
|
mutex_unlock(&dev->mutex);
|
|
|
-#ifdef CONFIG_VIDEO_AU0828_V4L2
|
|
|
- if (AUVI_INPUT(0).type != AU0828_VMUX_UNDEFINED) {
|
|
|
- au0828_analog_unregister(dev);
|
|
|
- v4l2_device_disconnect(&dev->v4l2_dev);
|
|
|
- v4l2_device_put(&dev->v4l2_dev);
|
|
|
+ if (au0828_analog_unregister(dev)) {
|
|
|
/*
|
|
|
* No need to call au0828_usb_release() if V4L2 is enabled,
|
|
|
* as this is already called via au0828_usb_v4l2_release()
|
|
|
*/
|
|
|
return;
|
|
|
}
|
|
|
-#endif
|
|
|
au0828_usb_release(dev);
|
|
|
}
|
|
|
|
|
@@ -247,83 +215,6 @@ static int au0828_media_device_init(struct au0828_dev *dev,
|
|
|
}
|
|
|
|
|
|
|
|
|
-static int au0828_create_media_graph(struct au0828_dev *dev)
|
|
|
-{
|
|
|
-#ifdef CONFIG_MEDIA_CONTROLLER
|
|
|
- struct media_device *mdev = dev->media_dev;
|
|
|
- struct media_entity *entity;
|
|
|
- struct media_entity *tuner = NULL, *decoder = NULL;
|
|
|
- int i, ret;
|
|
|
-
|
|
|
- if (!mdev)
|
|
|
- return 0;
|
|
|
-
|
|
|
- media_device_for_each_entity(entity, mdev) {
|
|
|
- switch (entity->function) {
|
|
|
- case MEDIA_ENT_F_TUNER:
|
|
|
- tuner = entity;
|
|
|
- break;
|
|
|
- case MEDIA_ENT_F_ATV_DECODER:
|
|
|
- decoder = entity;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /* Analog setup, using tuner as a link */
|
|
|
-
|
|
|
- /* Something bad happened! */
|
|
|
- if (!decoder)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
- if (tuner) {
|
|
|
- ret = media_create_pad_link(tuner, TUNER_PAD_OUTPUT,
|
|
|
- decoder, 0,
|
|
|
- MEDIA_LNK_FL_ENABLED);
|
|
|
- if (ret)
|
|
|
- return ret;
|
|
|
- }
|
|
|
- ret = media_create_pad_link(decoder, 1, &dev->vdev.entity, 0,
|
|
|
- MEDIA_LNK_FL_ENABLED);
|
|
|
- if (ret)
|
|
|
- return ret;
|
|
|
- ret = media_create_pad_link(decoder, 2, &dev->vbi_dev.entity, 0,
|
|
|
- MEDIA_LNK_FL_ENABLED);
|
|
|
- if (ret)
|
|
|
- return ret;
|
|
|
-
|
|
|
- for (i = 0; i < AU0828_MAX_INPUT; i++) {
|
|
|
- struct media_entity *ent = &dev->input_ent[i];
|
|
|
-
|
|
|
- if (AUVI_INPUT(i).type == AU0828_VMUX_UNDEFINED)
|
|
|
- break;
|
|
|
-
|
|
|
- switch (AUVI_INPUT(i).type) {
|
|
|
- case AU0828_VMUX_CABLE:
|
|
|
- case AU0828_VMUX_TELEVISION:
|
|
|
- case AU0828_VMUX_DVB:
|
|
|
- if (!tuner)
|
|
|
- break;
|
|
|
-
|
|
|
- ret = media_create_pad_link(ent, 0, tuner,
|
|
|
- TUNER_PAD_RF_INPUT,
|
|
|
- MEDIA_LNK_FL_ENABLED);
|
|
|
- if (ret)
|
|
|
- return ret;
|
|
|
- break;
|
|
|
- case AU0828_VMUX_COMPOSITE:
|
|
|
- case AU0828_VMUX_SVIDEO:
|
|
|
- default: /* AU0828_VMUX_DEBUG */
|
|
|
- /* FIXME: fix the decoder PAD */
|
|
|
- ret = media_create_pad_link(ent, 0, decoder, 0, 0);
|
|
|
- if (ret)
|
|
|
- return ret;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-#endif
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
static int au0828_usb_probe(struct usb_interface *interface,
|
|
|
const struct usb_device_id *id)
|
|
|
{
|
|
@@ -378,32 +269,13 @@ static int au0828_usb_probe(struct usb_interface *interface,
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_VIDEO_AU0828_V4L2
|
|
|
- dev->v4l2_dev.release = au0828_usb_v4l2_release;
|
|
|
-
|
|
|
- /* Create the v4l2_device */
|
|
|
-#ifdef CONFIG_MEDIA_CONTROLLER
|
|
|
- dev->v4l2_dev.mdev = dev->media_dev;
|
|
|
-#endif
|
|
|
- retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
|
|
|
+ retval = au0828_v4l2_device_register(interface, dev);
|
|
|
if (retval) {
|
|
|
- pr_err("%s() v4l2_device_register failed\n",
|
|
|
- __func__);
|
|
|
+ au0828_usb_v4l2_media_release(dev);
|
|
|
mutex_unlock(&dev->lock);
|
|
|
kfree(dev);
|
|
|
return retval;
|
|
|
}
|
|
|
- /* This control handler will inherit the controls from au8522 */
|
|
|
- retval = v4l2_ctrl_handler_init(&dev->v4l2_ctrl_hdl, 4);
|
|
|
- if (retval) {
|
|
|
- pr_err("%s() v4l2_ctrl_handler_init failed\n",
|
|
|
- __func__);
|
|
|
- mutex_unlock(&dev->lock);
|
|
|
- kfree(dev);
|
|
|
- return retval;
|
|
|
- }
|
|
|
- dev->v4l2_dev.ctrl_handler = &dev->v4l2_ctrl_hdl;
|
|
|
-#endif
|
|
|
|
|
|
/* Power Up the bridge */
|
|
|
au0828_write(dev, REG_600, 1 << 4);
|
|
@@ -417,24 +289,13 @@ static int au0828_usb_probe(struct usb_interface *interface,
|
|
|
/* Setup */
|
|
|
au0828_card_setup(dev);
|
|
|
|
|
|
-#ifdef CONFIG_VIDEO_AU0828_V4L2
|
|
|
/* Analog TV */
|
|
|
- if (AUVI_INPUT(0).type != AU0828_VMUX_UNDEFINED) {
|
|
|
- retval = au0828_analog_register(dev, interface);
|
|
|
- if (retval) {
|
|
|
- pr_err("%s() au0282_dev_register failed to register on V4L2\n",
|
|
|
- __func__);
|
|
|
- goto done;
|
|
|
- }
|
|
|
-
|
|
|
- retval = au0828_create_media_graph(dev);
|
|
|
- if (retval) {
|
|
|
- pr_err("%s() au0282_dev_register failed to create graph\n",
|
|
|
- __func__);
|
|
|
- goto done;
|
|
|
- }
|
|
|
+ retval = au0828_analog_register(dev, interface);
|
|
|
+ if (retval) {
|
|
|
+ pr_err("%s() au0282_dev_register failed to register on V4L2\n",
|
|
|
+ __func__);
|
|
|
+ goto done;
|
|
|
}
|
|
|
-#endif
|
|
|
|
|
|
/* Digital TV */
|
|
|
retval = au0828_dvb_register(dev);
|