Skip to content

Commit

Permalink
media: v4l2: async: Add convenience functions to allocate and add asd's
Browse files Browse the repository at this point in the history
Add these convenience functions, which allocate an asd of match type
fwnode, i2c, or device-name, of size asd_struct_size, and then adds
them to the notifier asd_list.

Signed-off-by: Steve Longerbeam <slongerbeam@gmail.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
  • Loading branch information
Steve Longerbeam authored and Mauro Carvalho Chehab committed Oct 4, 2018
1 parent b47d7ff commit 23989b4
Show file tree
Hide file tree
Showing 2 changed files with 138 additions and 0 deletions.
76 changes: 76 additions & 0 deletions drivers/media/v4l2-core/v4l2-async.c
Original file line number Diff line number Diff line change
Expand Up @@ -650,6 +650,82 @@ int v4l2_async_notifier_add_subdev(struct v4l2_async_notifier *notifier,
}
EXPORT_SYMBOL_GPL(v4l2_async_notifier_add_subdev);

struct v4l2_async_subdev *
v4l2_async_notifier_add_fwnode_subdev(struct v4l2_async_notifier *notifier,
struct fwnode_handle *fwnode,
unsigned int asd_struct_size)
{
struct v4l2_async_subdev *asd;
int ret;

asd = kzalloc(asd_struct_size, GFP_KERNEL);
if (!asd)
return ERR_PTR(-ENOMEM);

asd->match_type = V4L2_ASYNC_MATCH_FWNODE;
asd->match.fwnode = fwnode;

ret = v4l2_async_notifier_add_subdev(notifier, asd);
if (ret) {
kfree(asd);
return ERR_PTR(ret);
}

return asd;
}
EXPORT_SYMBOL_GPL(v4l2_async_notifier_add_fwnode_subdev);

struct v4l2_async_subdev *
v4l2_async_notifier_add_i2c_subdev(struct v4l2_async_notifier *notifier,
int adapter_id, unsigned short address,
unsigned int asd_struct_size)
{
struct v4l2_async_subdev *asd;
int ret;

asd = kzalloc(asd_struct_size, GFP_KERNEL);
if (!asd)
return ERR_PTR(-ENOMEM);

asd->match_type = V4L2_ASYNC_MATCH_I2C;
asd->match.i2c.adapter_id = adapter_id;
asd->match.i2c.address = address;

ret = v4l2_async_notifier_add_subdev(notifier, asd);
if (ret) {
kfree(asd);
return ERR_PTR(ret);
}

return asd;
}
EXPORT_SYMBOL_GPL(v4l2_async_notifier_add_i2c_subdev);

struct v4l2_async_subdev *
v4l2_async_notifier_add_devname_subdev(struct v4l2_async_notifier *notifier,
const char *device_name,
unsigned int asd_struct_size)
{
struct v4l2_async_subdev *asd;
int ret;

asd = kzalloc(asd_struct_size, GFP_KERNEL);
if (!asd)
return ERR_PTR(-ENOMEM);

asd->match_type = V4L2_ASYNC_MATCH_DEVNAME;
asd->match.device_name = device_name;

ret = v4l2_async_notifier_add_subdev(notifier, asd);
if (ret) {
kfree(asd);
return ERR_PTR(ret);
}

return asd;
}
EXPORT_SYMBOL_GPL(v4l2_async_notifier_add_devname_subdev);

int v4l2_async_register_subdev(struct v4l2_subdev *sd)
{
struct v4l2_async_notifier *subdev_notifier;
Expand Down
62 changes: 62 additions & 0 deletions include/media/v4l2-async.h
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,68 @@ void v4l2_async_notifier_init(struct v4l2_async_notifier *notifier);
int v4l2_async_notifier_add_subdev(struct v4l2_async_notifier *notifier,
struct v4l2_async_subdev *asd);

/**
* v4l2_async_notifier_add_fwnode_subdev - Allocate and add a fwnode async
* subdev to the notifier's master asd_list.
*
* @notifier: pointer to &struct v4l2_async_notifier
* @fwnode: fwnode handle of the sub-device to be matched
* @asd_struct_size: size of the driver's async sub-device struct, including
* sizeof(struct v4l2_async_subdev). The &struct
* v4l2_async_subdev shall be the first member of
* the driver's async sub-device struct, i.e. both
* begin at the same memory address.
*
* This can be used before registering a notifier to add a
* fwnode-matched asd to the notifiers master asd_list. If the caller
* uses this method to compose an asd list, it must never allocate
* or place asd's in the @subdevs array.
*/
struct v4l2_async_subdev *
v4l2_async_notifier_add_fwnode_subdev(struct v4l2_async_notifier *notifier,
struct fwnode_handle *fwnode,
unsigned int asd_struct_size);

/**
* v4l2_async_notifier_add_i2c_subdev - Allocate and add an i2c async
* subdev to the notifier's master asd_list.
*
* @notifier: pointer to &struct v4l2_async_notifier
* @adapter_id: I2C adapter ID to be matched
* @address: I2C address of sub-device to be matched
* @asd_struct_size: size of the driver's async sub-device struct, including
* sizeof(struct v4l2_async_subdev). The &struct
* v4l2_async_subdev shall be the first member of
* the driver's async sub-device struct, i.e. both
* begin at the same memory address.
*
* Same as above but for I2C matched sub-devices.
*/
struct v4l2_async_subdev *
v4l2_async_notifier_add_i2c_subdev(struct v4l2_async_notifier *notifier,
int adapter_id, unsigned short address,
unsigned int asd_struct_size);

/**
* v4l2_async_notifier_add_devname_subdev - Allocate and add a device-name
* async subdev to the notifier's master asd_list.
*
* @notifier: pointer to &struct v4l2_async_notifier
* @device_name: device name string to be matched
* @asd_struct_size: size of the driver's async sub-device struct, including
* sizeof(struct v4l2_async_subdev). The &struct
* v4l2_async_subdev shall be the first member of
* the driver's async sub-device struct, i.e. both
* begin at the same memory address.
*
* Same as above but for device-name matched sub-devices.
*/
struct v4l2_async_subdev *
v4l2_async_notifier_add_devname_subdev(struct v4l2_async_notifier *notifier,
const char *device_name,
unsigned int asd_struct_size);


/**
* v4l2_async_notifier_register - registers a subdevice asynchronous notifier
*
Expand Down

0 comments on commit 23989b4

Please sign in to comment.