diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2022-08-03 19:29:28 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2022-08-03 19:29:28 -0700 |
commit | 12b68040a5e468068fd7f4af1150eab8f6e96235 (patch) | |
tree | 02b059a281615f4592a2d197c02a67ca110444fa /drivers/media/v4l2-core/v4l2-async.c | |
parent | 80dc75932ff231b05e0adbf5054bf4c9f0fb468c (diff) | |
parent | 485ade76c95ac5ccaa52fee9d712471c9211b989 (diff) |
Merge tag 'media/v5.20-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media updates from Mauro Carvalho Chehab:
- New driver for Semi AR0521 sensor
- rkisp1 CSI code was split into a separate file
- sun6i has gained support for the A31 MIPI CSI-2 controller
- sun8i has gained support for the A83T MIPI CSI-2 controller
- vimc driver got support for virtual lens
- HEVC uAPI has gained its final form and got added to public headers
- hantro and cedrus got updates on H-265 support
- stkwebcam was promoted from staging
- atomisp staging driver got cleanups on its hmm and kmap related logic
- ov5640 gained support for more modes and got some rework
- imx7-media-csi staging driver got several improvements related to mc
API support
- uvcvideo now handles better power line control
- mediatec vcodec gained support for new hardware and got some codec
updates
- Lots of other bug fixes, improvements and cleanups.
* tag 'media/v5.20-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (446 commits)
media: hantro: Remove dedicated control documentation
hantro: Remove incorrect HEVC SPS validation
media: cedrus: hevc: Add check for invalid timestamp
media: sunxi: sun6i_mipi_csi2.c/sun8i_a83t_mipi_csi2.c: clarify error handling
media: uvcvideo: Fix invalid pointer in uvc_ctrl_init_ctrl()
media: Documentation: mc-core: Fix typo
media: videodev2.h.rst.exceptions: add missing exceptions
media: vimc: wrong pointer is used with PTR_ERR
media: rkisp1: debug: Add dump file in debugfs for MI main path registers
media: rkisp1: Make the internal CSI-2 receiver optional
media: rkisp1: Add infrastructure to support ISP features
media: rkisp1: Support the ISP parallel input
media: dt-bindings: media: rkisp1: Add port for parallel interface
media: rkisp1: Use fwnode_graph_for_each_endpoint
media: rkisp1: csi: Plumb the CSI RX subdev
media: rkisp1: csi: Implement a V4L2 subdev for the CSI receiver
media: rkisp1: isp: Disallow multiple active sources
media: rkisp1: isp: Rename rkisp1_get_remote_source()
media: rkisp1: isp: Constify various local variables
media: rkisp1: isp: Fix whitespace issues
...
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-async.c')
-rw-r--r-- | drivers/media/v4l2-core/v4l2-async.c | 45 |
1 files changed, 31 insertions, 14 deletions
diff --git a/drivers/media/v4l2-core/v4l2-async.c b/drivers/media/v4l2-core/v4l2-async.c index c6995718237a..2f1b718a9189 100644 --- a/drivers/media/v4l2-core/v4l2-async.c +++ b/drivers/media/v4l2-core/v4l2-async.c @@ -52,6 +52,15 @@ static int v4l2_async_nf_call_complete(struct v4l2_async_notifier *n) return n->ops->complete(n); } +static void v4l2_async_nf_call_destroy(struct v4l2_async_notifier *n, + struct v4l2_async_subdev *asd) +{ + if (!n->ops || !n->ops->destroy) + return; + + n->ops->destroy(asd); +} + static bool match_i2c(struct v4l2_async_notifier *notifier, struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) { @@ -66,8 +75,10 @@ static bool match_i2c(struct v4l2_async_notifier *notifier, #endif } -static bool match_fwnode(struct v4l2_async_notifier *notifier, - struct v4l2_subdev *sd, struct v4l2_async_subdev *asd) +static bool +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 *dev_fwnode; @@ -80,15 +91,7 @@ static bool match_fwnode(struct v4l2_async_notifier *notifier, * fwnode or a device fwnode. Start with the simple case of direct * fwnode matching. */ - 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) + if (sd_fwnode == asd->match.fwnode) return true; /* @@ -99,7 +102,7 @@ static bool match_fwnode(struct v4l2_async_notifier *notifier, * ACPI. This won't make a difference, as drivers should not try to * 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); if (sd_fwnode_is_ep == asd_fwnode_is_ep) @@ -110,11 +113,11 @@ static bool match_fwnode(struct v4l2_async_notifier *notifier, * parent of the endpoint fwnode, and compare it with the other fwnode. */ 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; } else { dev_fwnode = fwnode_graph_get_port_parent(asd->match.fwnode); - other_fwnode = sd->fwnode; + other_fwnode = sd_fwnode; } fwnode_handle_put(dev_fwnode); @@ -143,6 +146,19 @@ static bool match_fwnode(struct v4l2_async_notifier *notifier, 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(notifier_list); static DEFINE_MUTEX(list_lock); @@ -626,6 +642,7 @@ static void __v4l2_async_nf_cleanup(struct v4l2_async_notifier *notifier) } list_del(&asd->asd_list); + v4l2_async_nf_call_destroy(notifier, asd); kfree(asd); } } |