Change au0828, uvcvideo, snd-usb-audio to use Media Device Allocator and new Media Controller API media_device_unregister_put(). Signed-off-by: Shuah Khan <shuahkh@xxxxxxxxxxxxxxx> --- drivers/media/usb/au0828/au0828-core.c | 7 +++++-- drivers/media/usb/au0828/au0828.h | 1 + drivers/media/usb/uvc/uvc_driver.c | 32 ++++++++++++++++++-------------- drivers/media/usb/uvc/uvcvideo.h | 3 ++- sound/usb/media.c | 10 +++++++--- sound/usb/media.h | 1 + 6 files changed, 34 insertions(+), 20 deletions(-) diff --git a/drivers/media/usb/au0828/au0828-core.c b/drivers/media/usb/au0828/au0828-core.c index 85c13ca..b410166 100644 --- a/drivers/media/usb/au0828/au0828-core.c +++ b/drivers/media/usb/au0828/au0828-core.c @@ -157,7 +157,8 @@ static void au0828_unregister_media_device(struct au0828_dev *dev) dev->media_dev->enable_source = NULL; dev->media_dev->disable_source = NULL; - media_device_unregister_devres(dev->media_dev); + media_device_unregister_put(dev->media_dev); + media_device_put(dev->media_dev->dev); dev->media_dev = NULL; #endif } @@ -210,7 +211,7 @@ static int au0828_media_device_init(struct au0828_dev *dev, #ifdef CONFIG_MEDIA_CONTROLLER struct media_device *mdev; - mdev = media_device_get_devres(&udev->dev); + mdev = media_device_get(&udev->dev); if (!mdev) return -ENOMEM; @@ -485,11 +486,13 @@ static int au0828_media_device_register(struct au0828_dev *dev, /* register media device */ ret = media_device_register(dev->media_dev); if (ret) { + media_device_put(dev->media_dev->dev); dev_err(&udev->dev, "Media Device Register Error: %d\n", ret); return ret; } } else { + media_device_register_ref(dev->media_dev); /* * Call au0828_media_graph_notify() to connect * audio graph to our graph. In this case, audio diff --git a/drivers/media/usb/au0828/au0828.h b/drivers/media/usb/au0828/au0828.h index 87f3284..3edd50f 100644 --- a/drivers/media/usb/au0828/au0828.h +++ b/drivers/media/usb/au0828/au0828.h @@ -35,6 +35,7 @@ #include <media/v4l2-ctrls.h> #include <media/v4l2-fh.h> #include <media/media-device.h> +#include <media/media-dev-allocator.h> /* DVB */ #include "demux.h" diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c index 451e84e9..81d95b8 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -1674,9 +1674,8 @@ static void uvc_delete(struct uvc_device *dev) if (dev->vdev.dev) v4l2_device_unregister(&dev->vdev); #ifdef CONFIG_MEDIA_CONTROLLER - if (media_devnode_is_registered(&dev->mdev.devnode)) - media_device_unregister(&dev->mdev); - media_device_cleanup(&dev->mdev); + if (media_devnode_is_registered(&dev->mdev->devnode)) + media_device_unregister_put(dev->mdev); #endif list_for_each_safe(p, n, &dev->chains) { @@ -1929,17 +1928,20 @@ static int uvc_probe(struct usb_interface *intf, /* Initialize the media device and register the V4L2 device. */ #ifdef CONFIG_MEDIA_CONTROLLER - dev->mdev.dev = &intf->dev; - strlcpy(dev->mdev.model, dev->name, sizeof(dev->mdev.model)); + dev->mdev = media_device_get(&intf->dev); + if (!dev->mdev) + goto media_device_get_error; + dev->mdev->dev = &intf->dev; + strlcpy(dev->mdev->model, dev->name, sizeof(dev->mdev->model)); if (udev->serial) - strlcpy(dev->mdev.serial, udev->serial, - sizeof(dev->mdev.serial)); - strcpy(dev->mdev.bus_info, udev->devpath); - dev->mdev.hw_revision = le16_to_cpu(udev->descriptor.bcdDevice); - dev->mdev.driver_version = LINUX_VERSION_CODE; - media_device_init(&dev->mdev); - - dev->vdev.mdev = &dev->mdev; + strlcpy(dev->mdev->serial, udev->serial, + sizeof(dev->mdev->serial)); + strcpy(dev->mdev->bus_info, udev->devpath); + dev->mdev->hw_revision = le16_to_cpu(udev->descriptor.bcdDevice); + dev->mdev->driver_version = LINUX_VERSION_CODE; + media_device_init(dev->mdev); + + dev->vdev.mdev = dev->mdev; #endif if (v4l2_device_register(&intf->dev, &dev->vdev) < 0) goto error; @@ -1958,7 +1960,7 @@ static int uvc_probe(struct usb_interface *intf, #ifdef CONFIG_MEDIA_CONTROLLER /* Register the media device node */ - if (media_device_register(&dev->mdev) < 0) + if (media_device_register(dev->mdev) < 0) goto error; #endif /* Save our data pointer in the interface data. */ @@ -1976,6 +1978,8 @@ static int uvc_probe(struct usb_interface *intf, return 0; error: + media_device_put(&intf->dev); +media_device_get_error: uvc_unregister_video(dev); return -ENODEV; } diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h index 7e4d3ee..a5ef719 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -12,6 +12,7 @@ #include <linux/uvcvideo.h> #include <linux/videodev2.h> #include <media/media-device.h> +#include <media/media-dev-allocator.h> #include <media/v4l2-device.h> #include <media/v4l2-event.h> #include <media/v4l2-fh.h> @@ -543,7 +544,7 @@ struct uvc_device { /* Video control interface */ #ifdef CONFIG_MEDIA_CONTROLLER - struct media_device mdev; + struct media_device *mdev; #endif struct v4l2_device vdev; __u16 uvc_version; diff --git a/sound/usb/media.c b/sound/usb/media.c index e35af88..bd7016d 100644 --- a/sound/usb/media.c +++ b/sound/usb/media.c @@ -262,7 +262,7 @@ int media_snd_device_create(struct snd_usb_audio *chip, struct usb_device *usbdev = interface_to_usbdev(iface); int ret; - mdev = media_device_get_devres(&usbdev->dev); + mdev = media_device_get(&usbdev->dev); if (!mdev) return -ENOMEM; @@ -270,15 +270,18 @@ int media_snd_device_create(struct snd_usb_audio *chip, if (!mdev->dev) media_device_usb_init(mdev, usbdev, NULL); + /* register if needed, otherwise get register reference */ if (!media_devnode_is_registered(&mdev->devnode)) { ret = media_device_register(mdev); if (ret) { + media_device_put(mdev->dev); dev_err(&usbdev->dev, "Couldn't register media device. Error: %d\n", ret); return ret; } - } + } else + media_device_register_ref(mdev); /* save media device - avoid lookups */ chip->media_dev = mdev; @@ -312,7 +315,8 @@ void media_snd_device_delete(struct snd_usb_audio *chip) media_snd_mixer_delete(chip); if (mdev) { - media_device_unregister_devres(mdev); + media_device_unregister_put(mdev); + media_device_put(mdev->dev); chip->media_dev = NULL; } } diff --git a/sound/usb/media.h b/sound/usb/media.h index 1dcdcdc..42ce8eb 100644 --- a/sound/usb/media.h +++ b/sound/usb/media.h @@ -21,6 +21,7 @@ #include <media/media-device.h> #include <media/media-entity.h> +#include <media/media-dev-allocator.h> #include <sound/asound.h> struct media_ctl { -- 2.5.0 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html