[RFC PATCH 4/4] drivers: change au0828, uvcvideo, snd-usb-audio to use Media Device Allocator

From: Shuah Khan
Date: Sat Mar 26 2016 - 00:39:29 EST


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