Commit f0e10d0a authored by Sakari Ailus's avatar Sakari Ailus Committed by Mauro Carvalho Chehab

media: v4l: async: Make V4L2 async match information a struct

Make V4L2 async match information a struct, making it easier to use it
elsewhere outside the scope of struct v4l2_async_subdev.

Also remove an obsolete comment --- none of these fields are supposed to
be touched by drivers.
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Tested-by: Philipp Zabel <p.zabel@pengutronix.de> # imx6qp
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> # rcar + adv746x
Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Tested-by: Aishwarya Kothari <aishwarya.kothari@toradex.com> # Apalis i.MX6Q with TC358743
Tested-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> # Renesas RZ/G2L SMARC
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent 1c5cd3ef
...@@ -212,7 +212,7 @@ v4l2_async_find_match(struct v4l2_async_notifier *notifier, ...@@ -212,7 +212,7 @@ v4l2_async_find_match(struct v4l2_async_notifier *notifier,
list_for_each_entry(asd, &notifier->waiting, list) { list_for_each_entry(asd, &notifier->waiting, list) {
/* bus_type has been verified valid before */ /* bus_type has been verified valid before */
switch (asd->match_type) { switch (asd->match.type) {
case V4L2_ASYNC_MATCH_I2C: case V4L2_ASYNC_MATCH_I2C:
match = match_i2c; match = match_i2c;
break; break;
...@@ -237,10 +237,10 @@ v4l2_async_find_match(struct v4l2_async_notifier *notifier, ...@@ -237,10 +237,10 @@ v4l2_async_find_match(struct v4l2_async_notifier *notifier,
static bool asd_equal(struct v4l2_async_subdev *asd_x, static bool asd_equal(struct v4l2_async_subdev *asd_x,
struct v4l2_async_subdev *asd_y) struct v4l2_async_subdev *asd_y)
{ {
if (asd_x->match_type != asd_y->match_type) if (asd_x->match.type != asd_y->match.type)
return false; return false;
switch (asd_x->match_type) { switch (asd_x->match.type) {
case V4L2_ASYNC_MATCH_I2C: case V4L2_ASYNC_MATCH_I2C:
return asd_x->match.i2c.adapter_id == return asd_x->match.i2c.adapter_id ==
asd_y->match.i2c.adapter_id && asd_y->match.i2c.adapter_id &&
...@@ -554,7 +554,7 @@ static int v4l2_async_nf_asd_valid(struct v4l2_async_notifier *notifier, ...@@ -554,7 +554,7 @@ static int v4l2_async_nf_asd_valid(struct v4l2_async_notifier *notifier,
{ {
struct device *dev = notifier_dev(notifier); struct device *dev = notifier_dev(notifier);
switch (asd->match_type) { switch (asd->match.type) {
case V4L2_ASYNC_MATCH_I2C: case V4L2_ASYNC_MATCH_I2C:
case V4L2_ASYNC_MATCH_FWNODE: case V4L2_ASYNC_MATCH_FWNODE:
if (v4l2_async_nf_has_async_subdev(notifier, asd, skip_self)) { if (v4l2_async_nf_has_async_subdev(notifier, asd, skip_self)) {
...@@ -564,7 +564,7 @@ static int v4l2_async_nf_asd_valid(struct v4l2_async_notifier *notifier, ...@@ -564,7 +564,7 @@ static int v4l2_async_nf_asd_valid(struct v4l2_async_notifier *notifier,
break; break;
default: default:
dev_err(dev, "v4l2-async: Invalid match type %u on %p\n", dev_err(dev, "v4l2-async: Invalid match type %u on %p\n",
asd->match_type, asd); asd->match.type, asd);
return -EINVAL; return -EINVAL;
} }
...@@ -690,7 +690,7 @@ static void __v4l2_async_nf_cleanup(struct v4l2_async_notifier *notifier) ...@@ -690,7 +690,7 @@ static void __v4l2_async_nf_cleanup(struct v4l2_async_notifier *notifier)
return; return;
list_for_each_entry_safe(asd, tmp, &notifier->asd_list, asd_list) { list_for_each_entry_safe(asd, tmp, &notifier->asd_list, asd_list) {
switch (asd->match_type) { switch (asd->match.type) {
case V4L2_ASYNC_MATCH_FWNODE: case V4L2_ASYNC_MATCH_FWNODE:
fwnode_handle_put(asd->match.fwnode); fwnode_handle_put(asd->match.fwnode);
break; break;
...@@ -745,7 +745,7 @@ __v4l2_async_nf_add_fwnode(struct v4l2_async_notifier *notifier, ...@@ -745,7 +745,7 @@ __v4l2_async_nf_add_fwnode(struct v4l2_async_notifier *notifier,
if (!asd) if (!asd)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
asd->match_type = V4L2_ASYNC_MATCH_FWNODE; asd->match.type = V4L2_ASYNC_MATCH_FWNODE;
asd->match.fwnode = fwnode_handle_get(fwnode); asd->match.fwnode = fwnode_handle_get(fwnode);
ret = __v4l2_async_nf_add_subdev(notifier, asd); ret = __v4l2_async_nf_add_subdev(notifier, asd);
...@@ -792,7 +792,7 @@ __v4l2_async_nf_add_i2c(struct v4l2_async_notifier *notifier, int adapter_id, ...@@ -792,7 +792,7 @@ __v4l2_async_nf_add_i2c(struct v4l2_async_notifier *notifier, int adapter_id,
if (!asd) if (!asd)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
asd->match_type = V4L2_ASYNC_MATCH_I2C; asd->match.type = V4L2_ASYNC_MATCH_I2C;
asd->match.i2c.adapter_id = adapter_id; asd->match.i2c.adapter_id = adapter_id;
asd->match.i2c.address = address; asd->match.i2c.address = address;
...@@ -905,7 +905,7 @@ EXPORT_SYMBOL(v4l2_async_unregister_subdev); ...@@ -905,7 +905,7 @@ EXPORT_SYMBOL(v4l2_async_unregister_subdev);
static void print_waiting_subdev(struct seq_file *s, static void print_waiting_subdev(struct seq_file *s,
struct v4l2_async_subdev *asd) struct v4l2_async_subdev *asd)
{ {
switch (asd->match_type) { switch (asd->match.type) {
case V4L2_ASYNC_MATCH_I2C: case V4L2_ASYNC_MATCH_I2C:
seq_printf(s, " [i2c] dev=%d-%04x\n", asd->match.i2c.adapter_id, seq_printf(s, " [i2c] dev=%d-%04x\n", asd->match.i2c.adapter_id,
asd->match.i2c.address); asd->match.i2c.address);
......
...@@ -34,23 +34,37 @@ enum v4l2_async_match_type { ...@@ -34,23 +34,37 @@ enum v4l2_async_match_type {
}; };
/** /**
* struct v4l2_async_subdev - sub-device descriptor, as known to a bridge * struct v4l2_async_match_desc - async sub-device match information
* *
* @match_type: type of match that will be used * @type: type of match that will be used
* @match: union of per-bus type matching data sets * @fwnode: pointer to &struct fwnode_handle to be matched.
* @match.fwnode:
* pointer to &struct fwnode_handle to be matched.
* Used if @match_type is %V4L2_ASYNC_MATCH_FWNODE. * Used if @match_type is %V4L2_ASYNC_MATCH_FWNODE.
* @match.i2c: embedded struct with I2C parameters to be matched. * @i2c: embedded struct with I2C parameters to be matched.
* Both @match.i2c.adapter_id and @match.i2c.address * Both @match.i2c.adapter_id and @match.i2c.address
* should be matched. * should be matched.
* Used if @match_type is %V4L2_ASYNC_MATCH_I2C. * Used if @match_type is %V4L2_ASYNC_MATCH_I2C.
* @match.i2c.adapter_id: * @i2c.adapter_id:
* I2C adapter ID to be matched. * I2C adapter ID to be matched.
* Used if @match_type is %V4L2_ASYNC_MATCH_I2C. * Used if @match_type is %V4L2_ASYNC_MATCH_I2C.
* @match.i2c.address: * @i2c.address:
* I2C address to be matched. * I2C address to be matched.
* Used if @match_type is %V4L2_ASYNC_MATCH_I2C. * Used if @match_type is %V4L2_ASYNC_MATCH_I2C.
*/
struct v4l2_async_match_desc {
enum v4l2_async_match_type type;
union {
struct fwnode_handle *fwnode;
struct {
int adapter_id;
unsigned short address;
} i2c;
};
};
/**
* struct v4l2_async_subdev - sub-device descriptor, as known to a bridge
*
* @match: struct of match type and per-bus type matching data sets
* @asd_list: used to add struct v4l2_async_subdev objects to the * @asd_list: used to add struct v4l2_async_subdev objects to the
* master notifier @asd_list * master notifier @asd_list
* @list: used to link struct v4l2_async_subdev objects, waiting to be * @list: used to link struct v4l2_async_subdev objects, waiting to be
...@@ -61,16 +75,7 @@ enum v4l2_async_match_type { ...@@ -61,16 +75,7 @@ enum v4l2_async_match_type {
* v4l2_async_subdev as its first member. * v4l2_async_subdev as its first member.
*/ */
struct v4l2_async_subdev { struct v4l2_async_subdev {
enum v4l2_async_match_type match_type; struct v4l2_async_match_desc match;
union {
struct fwnode_handle *fwnode;
struct {
int adapter_id;
unsigned short address;
} i2c;
} match;
/* v4l2-async core private: not to be used by drivers */
struct list_head list; struct list_head list;
struct list_head asd_list; struct list_head asd_list;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment