The release callback may be used by the driver to signal the release of the media device. This makes it possible to embed a driver private struct to the same memory allocation. Signed-off-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx> --- drivers/media/media-device.c | 11 ++++++++++- include/media/media-device.h | 8 +++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/media/media-device.c b/drivers/media/media-device.c index eae57c6..7538572 100644 --- a/drivers/media/media-device.c +++ b/drivers/media/media-device.c @@ -553,6 +553,9 @@ static void media_device_release(struct media_devnode *devnode) mutex_destroy(&mdev->graph_mutex); dev_dbg(devnode->parent, "Media device released\n"); + if (mdev->release) + mdev->release(mdev); + if (devnode->use_kref) kfree(mdev); } @@ -701,10 +704,16 @@ void media_device_init(struct media_device *mdev) } EXPORT_SYMBOL_GPL(media_device_init); -struct media_device *media_device_alloc(struct device *dev, void *priv) +struct media_device *media_device_alloc(struct device *dev, void *priv, + size_t size) { struct media_device *mdev; + if (!size) + size = sizeof(*mdev); + else if (WARN_ON(size < sizeof(*mdev))) + return NULL; + dev = get_device(dev); if (!dev) return NULL; diff --git a/include/media/media-device.h b/include/media/media-device.h index 8582e23..34671e1 100644 --- a/include/media/media-device.h +++ b/include/media/media-device.h @@ -383,6 +383,7 @@ struct media_device { int (*link_notify)(struct media_link *link, u32 flags, unsigned int notification); + void (*release)(struct media_device *mdev); }; /* We don't need to include pci.h or usb.h here */ @@ -434,15 +435,20 @@ void media_device_init(struct media_device *mdev); * * @dev: The associated struct device pointer * @priv: pointer to a driver private data structure + * @size: size of a driver structure containing the media device * * Allocate and initialise a media device. Returns a media device. * The media device is refcounted, and this function returns a media * device the refcount of which is one (1). * + * The size parameter can be zero if the media_device is not embedded + * in another struct. + * * References are taken and given using media_device_get() and * media_device_put(). */ -struct media_device *media_device_alloc(struct device *dev, void *priv); +struct media_device *media_device_alloc(struct device *dev, void *priv, + size_t size); /** * media_device_get() - Get a reference to a media device -- 2.1.4 -- 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