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

media: v4l: async: Also match secondary fwnode endpoints

For camera sensor devices the firmware information of which comes from
non-DT (or some ACPI variants), the kernel makes the information visible
to the drivers in a form similar to DT. This takes place through device's
secondary fwnodes, in which case also the secondary fwnode needs to be
heterogenously (endpoint vs. device) matched.

Fixes: 1f391df4 ("media: v4l2-async: Use endpoints in __v4l2_async_nf_add_fwnode_remote()")
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent e670f5d6
...@@ -66,8 +66,10 @@ static bool match_i2c(struct v4l2_async_notifier *notifier, ...@@ -66,8 +66,10 @@ static bool match_i2c(struct v4l2_async_notifier *notifier,
#endif #endif
} }
static bool match_fwnode(struct v4l2_async_notifier *notifier, static bool
struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) match_fwnode_one(struct v4l2_async_notifier *notifier,
struct v4l2_subdev *sd, struct fwnode_handle *sd_fwnode,
struct v4l2_async_subdev *asd)
{ {
struct fwnode_handle *other_fwnode; struct fwnode_handle *other_fwnode;
struct fwnode_handle *dev_fwnode; struct fwnode_handle *dev_fwnode;
...@@ -80,15 +82,7 @@ static bool match_fwnode(struct v4l2_async_notifier *notifier, ...@@ -80,15 +82,7 @@ static bool match_fwnode(struct v4l2_async_notifier *notifier,
* fwnode or a device fwnode. Start with the simple case of direct * fwnode or a device fwnode. Start with the simple case of direct
* fwnode matching. * fwnode matching.
*/ */
if (sd->fwnode == asd->match.fwnode) if (sd_fwnode == asd->match.fwnode)
return true;
/*
* Check the same situation for any possible secondary assigned to the
* subdev's fwnode
*/
if (!IS_ERR_OR_NULL(sd->fwnode->secondary) &&
sd->fwnode->secondary == asd->match.fwnode)
return true; return true;
/* /*
...@@ -99,7 +93,7 @@ static bool match_fwnode(struct v4l2_async_notifier *notifier, ...@@ -99,7 +93,7 @@ static bool match_fwnode(struct v4l2_async_notifier *notifier,
* ACPI. This won't make a difference, as drivers should not try to * ACPI. This won't make a difference, as drivers should not try to
* match unconnected endpoints. * match unconnected endpoints.
*/ */
sd_fwnode_is_ep = fwnode_graph_is_endpoint(sd->fwnode); sd_fwnode_is_ep = fwnode_graph_is_endpoint(sd_fwnode);
asd_fwnode_is_ep = fwnode_graph_is_endpoint(asd->match.fwnode); asd_fwnode_is_ep = fwnode_graph_is_endpoint(asd->match.fwnode);
if (sd_fwnode_is_ep == asd_fwnode_is_ep) if (sd_fwnode_is_ep == asd_fwnode_is_ep)
...@@ -110,11 +104,11 @@ static bool match_fwnode(struct v4l2_async_notifier *notifier, ...@@ -110,11 +104,11 @@ static bool match_fwnode(struct v4l2_async_notifier *notifier,
* parent of the endpoint fwnode, and compare it with the other fwnode. * parent of the endpoint fwnode, and compare it with the other fwnode.
*/ */
if (sd_fwnode_is_ep) { if (sd_fwnode_is_ep) {
dev_fwnode = fwnode_graph_get_port_parent(sd->fwnode); dev_fwnode = fwnode_graph_get_port_parent(sd_fwnode);
other_fwnode = asd->match.fwnode; other_fwnode = asd->match.fwnode;
} else { } else {
dev_fwnode = fwnode_graph_get_port_parent(asd->match.fwnode); dev_fwnode = fwnode_graph_get_port_parent(asd->match.fwnode);
other_fwnode = sd->fwnode; other_fwnode = sd_fwnode;
} }
fwnode_handle_put(dev_fwnode); fwnode_handle_put(dev_fwnode);
...@@ -143,6 +137,19 @@ static bool match_fwnode(struct v4l2_async_notifier *notifier, ...@@ -143,6 +137,19 @@ static bool match_fwnode(struct v4l2_async_notifier *notifier,
return true; return true;
} }
static bool match_fwnode(struct v4l2_async_notifier *notifier,
struct v4l2_subdev *sd, struct v4l2_async_subdev *asd)
{
if (match_fwnode_one(notifier, sd, sd->fwnode, asd))
return true;
/* Also check the secondary fwnode. */
if (IS_ERR_OR_NULL(sd->fwnode->secondary))
return false;
return match_fwnode_one(notifier, sd, sd->fwnode->secondary, asd);
}
static LIST_HEAD(subdev_list); static LIST_HEAD(subdev_list);
static LIST_HEAD(notifier_list); static LIST_HEAD(notifier_list);
static DEFINE_MUTEX(list_lock); static DEFINE_MUTEX(list_lock);
......
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