Media device initialization and registration is split and there is a window between media device init and media device register during usb probe. au0828 bridge driver has to coordinate managed media device init and register with snd-usb-audio. Checking if the device is registered during media device init could result in the two drivers stepping on each other for media init. Change the media device init in au0828 to check if media device dev is set as this happens at the end of media device init in au0828 and snd-usb-audio. Change register step in au0828 to check if media device in registered.
Signed-off-by: Shuah Khan shuahkh@osg.samsung.com --- drivers/media/usb/au0828/au0828-core.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-)
diff --git a/drivers/media/usb/au0828/au0828-core.c b/drivers/media/usb/au0828/au0828-core.c index 1f97fc0..6ef177c 100644 --- a/drivers/media/usb/au0828/au0828-core.c +++ b/drivers/media/usb/au0828/au0828-core.c @@ -229,7 +229,8 @@ static int au0828_media_device_init(struct au0828_dev *dev, if (!mdev) return -ENOMEM;
- if (!media_devnode_is_registered(&mdev->devnode)) { + /* check if media device is already initialized */ + if (!mdev->dev) { mdev->dev = &udev->dev;
if (udev->product) @@ -342,6 +343,27 @@ static int au0828_create_media_graph(struct au0828_dev *dev) return 0; }
+static int au0828_media_device_register(struct au0828_dev *dev, + struct usb_device *udev) +{ +#ifdef CONFIG_MEDIA_CONTROLLER + int ret; + + if (dev->media_dev && + !media_devnode_is_registered(&dev->media_dev->devnode)) { + + /* register media device */ + ret = media_device_register(dev->media_dev); + if (ret) { + dev_err(&udev->dev, + "Media Device Register Error: %d\n", ret); + return ret; + } + } +#endif + return 0; +} + static int au0828_usb_probe(struct usb_interface *interface, const struct usb_device_id *id) { @@ -469,7 +491,7 @@ static int au0828_usb_probe(struct usb_interface *interface, }
#ifdef CONFIG_MEDIA_CONTROLLER - retval = media_device_register(dev->media_dev); + retval = au0828_media_device_register(dev, usbdev); #endif
done: