From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: "Niklas Söderlund" <niklas.soderlund+renesas@ragnatech.se>
Cc: Hans Verkuil <hverkuil@xs4all.nl>,
linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
tomoharu.fukawa.eb@renesas.com,
Kieran Bingham <kieran.bingham@ideasonboard.com>
Subject: Re: [PATCH v9 04/28] rcar-vin: move subdevice handling to async callbacks
Date: Fri, 08 Dec 2017 10:03:54 +0200 [thread overview]
Message-ID: <24014872.yB9kxvWvsF@avalon> (raw)
In-Reply-To: <20171208010842.20047-5-niklas.soderlund+renesas@ragnatech.se>
Hi Niklas,
Thank you for the patch.
On Friday, 8 December 2017 03:08:18 EET Niklas Söderlund wrote:
> In preparation for Gen3 support move the subdevice initialization and
> clean up from rvin_v4l2_{register,unregister}() directly to the async
> callbacks. This simplifies the addition of Gen3 support as the
> rvin_v4l2_register() can be shared for both Gen2 and Gen3 while direct
> subdevice control are only used on Gen2.
>
> While moving this code drop a large comment which is copied from the
> framework documentation and fold rvin_mbus_supported() into its only
> caller.
I'd really move the initialization and cleanup code to two separate functions,
it's getting hard to read. This is especially true for the initialization
code, but I'd do the same for the cleanup code as well even if it's just a
matter of calling v4l2_ctrl_handler_free().
> Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> Reviewed-by: Hans Verkuil <hans.verkuil@cisco.com>
> ---
> drivers/media/platform/rcar-vin/rcar-core.c | 105 ++++++++++++++++--------
> drivers/media/platform/rcar-vin/rcar-v4l2.c | 35 ----------
> 2 files changed, 67 insertions(+), 73 deletions(-)
>
> diff --git a/drivers/media/platform/rcar-vin/rcar-core.c
> b/drivers/media/platform/rcar-vin/rcar-core.c index
> 6d99542ec74b49a7..6ab51acd676641ec 100644
> --- a/drivers/media/platform/rcar-vin/rcar-core.c
> +++ b/drivers/media/platform/rcar-vin/rcar-core.c
> @@ -46,47 +46,11 @@ static int rvin_find_pad(struct v4l2_subdev *sd, int
> direction) return -EINVAL;
> }
>
> -static bool rvin_mbus_supported(struct rvin_graph_entity *entity)
> -{
> - struct v4l2_subdev *sd = entity->subdev;
> - struct v4l2_subdev_mbus_code_enum code = {
> - .which = V4L2_SUBDEV_FORMAT_ACTIVE,
> - };
> -
> - code.index = 0;
> - code.pad = entity->source_pad;
> - while (!v4l2_subdev_call(sd, pad, enum_mbus_code, NULL, &code)) {
> - code.index++;
> - switch (code.code) {
> - case MEDIA_BUS_FMT_YUYV8_1X16:
> - case MEDIA_BUS_FMT_UYVY8_2X8:
> - case MEDIA_BUS_FMT_UYVY10_2X10:
> - case MEDIA_BUS_FMT_RGB888_1X24:
> - entity->code = code.code;
> - return true;
> - default:
> - break;
> - }
> - }
> -
> - return false;
> -}
> -
> static int rvin_digital_notify_complete(struct v4l2_async_notifier
> *notifier) {
> struct rvin_dev *vin = notifier_to_vin(notifier);
> int ret;
>
> - /* Verify subdevices mbus format */
> - if (!rvin_mbus_supported(vin->digital)) {
> - vin_err(vin, "Unsupported media bus format for %s\n",
> - vin->digital->subdev->name);
> - return -EINVAL;
> - }
> -
> - vin_dbg(vin, "Found media bus format for %s: %d\n",
> - vin->digital->subdev->name, vin->digital->code);
> -
> ret = v4l2_device_register_subdev_nodes(&vin->v4l2_dev);
> if (ret < 0) {
> vin_err(vin, "Failed to register subdev nodes\n");
> @@ -103,8 +67,16 @@ static void rvin_digital_notify_unbind(struct
> v4l2_async_notifier *notifier, struct rvin_dev *vin =
> notifier_to_vin(notifier);
>
> vin_dbg(vin, "unbind digital subdev %s\n", subdev->name);
> +
> + mutex_lock(&vin->lock);
> +
> rvin_v4l2_unregister(vin);
> + v4l2_ctrl_handler_free(&vin->ctrl_handler);
> +
> + vin->vdev.ctrl_handler = NULL;
> vin->digital->subdev = NULL;
> +
> + mutex_unlock(&vin->lock);
> }
>
> static int rvin_digital_notify_bound(struct v4l2_async_notifier *notifier,
> @@ -112,12 +84,14 @@ static int rvin_digital_notify_bound(struct
> v4l2_async_notifier *notifier, struct v4l2_async_subdev *asd)
> {
> struct rvin_dev *vin = notifier_to_vin(notifier);
> + struct v4l2_subdev_mbus_code_enum code = {
> + .which = V4L2_SUBDEV_FORMAT_ACTIVE,
> + };
> int ret;
>
> v4l2_set_subdev_hostdata(subdev, vin);
>
> /* Find source and sink pad of remote subdevice */
> -
> ret = rvin_find_pad(subdev, MEDIA_PAD_FL_SOURCE);
> if (ret < 0)
> return ret;
> @@ -126,21 +100,74 @@ static int rvin_digital_notify_bound(struct
> v4l2_async_notifier *notifier, ret = rvin_find_pad(subdev,
> MEDIA_PAD_FL_SINK);
> vin->digital->sink_pad = ret < 0 ? 0 : ret;
>
> + /* Find compatible subdevices mbus format */
> + vin->digital->code = 0;
> + code.index = 0;
> + code.pad = vin->digital->source_pad;
> + while (!vin->digital->code &&
> + !v4l2_subdev_call(subdev, pad, enum_mbus_code, NULL, &code)) {
> + code.index++;
> + switch (code.code) {
> + case MEDIA_BUS_FMT_YUYV8_1X16:
> + case MEDIA_BUS_FMT_UYVY8_2X8:
> + case MEDIA_BUS_FMT_UYVY10_2X10:
> + case MEDIA_BUS_FMT_RGB888_1X24:
> + vin->digital->code = code.code;
> + vin_dbg(vin, "Found media bus format for %s: %d\n",
> + subdev->name, vin->digital->code);
> + break;
> + default:
> + break;
> + }
> + }
> +
> + if (!vin->digital->code) {
> + vin_err(vin, "Unsupported media bus format for %s\n",
> + subdev->name);
> + return -EINVAL;
> + }
> +
> + /* Read tvnorms */
> + ret = v4l2_subdev_call(subdev, video, g_tvnorms, &vin->vdev.tvnorms);
> + if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV)
> + return ret;
> +
> + mutex_lock(&vin->lock);
> +
> + /* Add the controls */
> + ret = v4l2_ctrl_handler_init(&vin->ctrl_handler, 16);
> + if (ret < 0)
> + goto err;
> +
> + ret = v4l2_ctrl_add_handler(&vin->ctrl_handler, subdev->ctrl_handler,
> + NULL);
> + if (ret < 0)
> + goto err_ctrl;
> +
> + vin->vdev.ctrl_handler = &vin->ctrl_handler;
> +
> vin->digital->subdev = subdev;
>
> + mutex_unlock(&vin->lock);
> +
> vin_dbg(vin, "bound subdev %s source pad: %u sink pad: %u\n",
> subdev->name, vin->digital->source_pad,
> vin->digital->sink_pad);
>
> return 0;
> +err_ctrl:
> + v4l2_ctrl_handler_free(&vin->ctrl_handler);
> +err:
> + mutex_unlock(&vin->lock);
> + return ret;
> }
> +
> static const struct v4l2_async_notifier_operations rvin_digital_notify_ops
> = { .bound = rvin_digital_notify_bound,
> .unbind = rvin_digital_notify_unbind,
> .complete = rvin_digital_notify_complete,
> };
>
> -
> static int rvin_digital_parse_v4l2(struct device *dev,
> struct v4l2_fwnode_endpoint *vep,
> struct v4l2_async_subdev *asd)
> @@ -277,6 +304,8 @@ static int rcar_vin_remove(struct platform_device *pdev)
> v4l2_async_notifier_unregister(&vin->notifier);
> v4l2_async_notifier_cleanup(&vin->notifier);
>
> + v4l2_ctrl_handler_free(&vin->ctrl_handler);
> +
> rvin_dma_unregister(vin);
>
> return 0;
> diff --git a/drivers/media/platform/rcar-vin/rcar-v4l2.c
> b/drivers/media/platform/rcar-vin/rcar-v4l2.c index
> 32a658214f48fa49..4a0610a6b4503501 100644
> --- a/drivers/media/platform/rcar-vin/rcar-v4l2.c
> +++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c
> @@ -847,9 +847,6 @@ void rvin_v4l2_unregister(struct rvin_dev *vin)
> v4l2_info(&vin->v4l2_dev, "Removing %s\n",
> video_device_node_name(&vin->vdev));
>
> - /* Checks internaly if handlers have been init or not */
> - v4l2_ctrl_handler_free(&vin->ctrl_handler);
> -
> /* Checks internaly if vdev have been init or not */
> video_unregister_device(&vin->vdev);
> }
> @@ -872,41 +869,10 @@ static void rvin_notify(struct v4l2_subdev *sd,
> int rvin_v4l2_register(struct rvin_dev *vin)
> {
> struct video_device *vdev = &vin->vdev;
> - struct v4l2_subdev *sd = vin_to_source(vin);
> int ret;
>
> - v4l2_set_subdev_hostdata(sd, vin);
> -
> vin->v4l2_dev.notify = rvin_notify;
>
> - ret = v4l2_subdev_call(sd, video, g_tvnorms, &vin->vdev.tvnorms);
> - if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV)
> - return ret;
> -
> - if (vin->vdev.tvnorms == 0) {
> - /* Disable the STD API if there are no tvnorms defined */
> - v4l2_disable_ioctl(&vin->vdev, VIDIOC_G_STD);
> - v4l2_disable_ioctl(&vin->vdev, VIDIOC_S_STD);
> - v4l2_disable_ioctl(&vin->vdev, VIDIOC_QUERYSTD);
> - v4l2_disable_ioctl(&vin->vdev, VIDIOC_ENUMSTD);
> - }
> -
> - /* Add the controls */
> - /*
> - * Currently the subdev with the largest number of controls (13) is
> - * ov6550. So let's pick 16 as a hint for the control handler. Note
> - * that this is a hint only: too large and you waste some memory, too
> - * small and there is a (very) small performance hit when looking up
> - * controls in the internal hash.
> - */
> - ret = v4l2_ctrl_handler_init(&vin->ctrl_handler, 16);
> - if (ret < 0)
> - return ret;
> -
> - ret = v4l2_ctrl_add_handler(&vin->ctrl_handler, sd->ctrl_handler, NULL);
> - if (ret < 0)
> - return ret;
> -
> /* video node */
> vdev->fops = &rvin_fops;
> vdev->v4l2_dev = &vin->v4l2_dev;
> @@ -915,7 +881,6 @@ int rvin_v4l2_register(struct rvin_dev *vin)
> vdev->release = video_device_release_empty;
> vdev->ioctl_ops = &rvin_ioctl_ops;
> vdev->lock = &vin->lock;
> - vdev->ctrl_handler = &vin->ctrl_handler;
> vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING |
> V4L2_CAP_READWRITE;
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2017-12-08 8:03 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-08 1:08 [PATCH v9 00/28] rcar-vin: Add Gen3 with media controller Niklas Söderlund
2017-12-08 1:08 ` [PATCH v9 01/28] rcar-vin: add Gen3 devicetree bindings documentation Niklas Söderlund
2017-12-08 7:46 ` Laurent Pinchart
2017-12-08 12:55 ` Niklas Söderlund
2017-12-08 1:08 ` [PATCH v9 02/28] rcar-vin: rename poorly named initialize and cleanup functions Niklas Söderlund
2017-12-08 7:49 ` Laurent Pinchart
2017-12-08 12:58 ` Niklas Söderlund
2017-12-08 1:08 ` [PATCH v9 03/28] rcar-vin: unregister video device on driver removal Niklas Söderlund
2017-12-08 7:54 ` Laurent Pinchart
2017-12-08 8:46 ` Hans Verkuil
2017-12-08 8:49 ` Laurent Pinchart
2017-12-08 13:09 ` Niklas Söderlund
2017-12-08 19:07 ` Laurent Pinchart
2017-12-08 1:08 ` [PATCH v9 04/28] rcar-vin: move subdevice handling to async callbacks Niklas Söderlund
2017-12-08 8:03 ` Laurent Pinchart [this message]
2017-12-08 1:08 ` [PATCH v9 05/28] rcar-vin: move chip information to own struct Niklas Söderlund
2017-12-08 8:08 ` Laurent Pinchart
2017-12-08 1:08 ` [PATCH v9 06/28] rcar-vin: move max width and height information to chip information Niklas Söderlund
2017-12-08 8:10 ` Laurent Pinchart
2017-12-08 1:08 ` [PATCH v9 07/28] rcar-vin: change name of video device Niklas Söderlund
2017-12-08 8:17 ` Laurent Pinchart
2017-12-14 14:25 ` Sakari Ailus
2017-12-14 15:50 ` Laurent Pinchart
2017-12-20 15:20 ` Niklas Söderlund
2018-01-08 16:35 ` Laurent Pinchart
2018-01-08 16:42 ` Niklas Söderlund
2018-01-08 17:48 ` Laurent Pinchart
2017-12-08 1:08 ` [PATCH v9 08/28] rcar-vin: move functions regarding scaling Niklas Söderlund
2017-12-08 8:28 ` Laurent Pinchart
2017-12-08 1:08 ` [PATCH v9 09/28] rcar-vin: all Gen2 boards can scale simplify logic Niklas Söderlund
2017-12-08 8:33 ` Laurent Pinchart
2017-12-20 16:17 ` Niklas Söderlund
2017-12-08 1:08 ` [PATCH v9 10/28] rcar-vin: do not reset crop and compose when setting format Niklas Söderlund
2017-12-08 1:08 ` [PATCH v9 11/28] rcar-vin: do not allow changing scaling and composing while streaming Niklas Söderlund
2017-12-08 9:04 ` Laurent Pinchart
2017-12-08 14:14 ` Niklas Söderlund
2017-12-08 19:20 ` Laurent Pinchart
2017-12-20 16:26 ` Niklas Söderlund
2017-12-08 1:08 ` [PATCH v9 12/28] rcar-vin: read subdevice format for crop only when needed Niklas Söderlund
2017-12-08 9:11 ` Laurent Pinchart
2017-12-08 1:08 ` [PATCH v9 13/28] rcar-vin: fix handling of single field frames (top, bottom and alternate fields) Niklas Söderlund
2017-12-08 9:35 ` Laurent Pinchart
2017-12-08 14:06 ` Niklas Söderlund
2017-12-08 19:30 ` Laurent Pinchart
2017-12-20 17:17 ` Niklas Söderlund
2017-12-08 1:08 ` [PATCH v9 14/28] rcar-vin: move media bus configuration to struct rvin_info Niklas Söderlund
2017-12-08 9:40 ` Laurent Pinchart
2017-12-08 1:08 ` [PATCH v9 15/28] rcar-vin: enable Gen3 hardware configuration Niklas Söderlund
2017-12-08 9:47 ` Laurent Pinchart
2017-12-20 21:09 ` Niklas Söderlund
2017-12-08 1:08 ` [PATCH v9 16/28] rcar-vin: add function to manipulate Gen3 chsel value Niklas Söderlund
2017-12-08 9:52 ` Laurent Pinchart
2017-12-20 21:20 ` Niklas Söderlund
2017-12-08 1:08 ` [PATCH v9 17/28] rcar-vin: add flag to switch to media controller mode Niklas Söderlund
2017-12-08 9:52 ` Laurent Pinchart
2017-12-08 1:08 ` [PATCH v9 18/28] rcar-vin: break out format alignment and checking Niklas Söderlund
2017-12-08 10:01 ` Laurent Pinchart
2017-12-21 0:25 ` Niklas Söderlund
2017-12-08 1:08 ` [PATCH v9 19/28] rcar-vin: use different v4l2 operations in media controller mode Niklas Söderlund
2017-12-08 10:14 ` Laurent Pinchart
2017-12-08 10:24 ` Hans Verkuil
2017-12-08 19:31 ` Laurent Pinchart
2018-01-19 0:46 ` Niklas Söderlund
2018-03-02 11:33 ` Laurent Pinchart
2017-12-08 1:08 ` [PATCH v9 20/28] rcar-vin: prepare for media controller mode initialization Niklas Söderlund
2017-12-08 10:20 ` Laurent Pinchart
2017-12-08 1:08 ` [PATCH v9 21/28] rcar-vin: add group allocator functions Niklas Söderlund
2017-12-08 20:12 ` Laurent Pinchart
2018-01-08 17:24 ` Niklas Söderlund
2018-01-08 17:57 ` Laurent Pinchart
2017-12-08 1:08 ` [PATCH v9 22/28] rcar-vin: add chsel information to rvin_info Niklas Söderlund
2017-12-08 20:37 ` Laurent Pinchart
2017-12-08 1:08 ` [PATCH v9 23/28] rcar-vin: parse Gen3 OF and setup media graph Niklas Söderlund
2017-12-08 1:08 ` [PATCH v9 24/28] rcar-vin: add link notify for Gen3 Niklas Söderlund
2017-12-08 1:08 ` [PATCH v9 25/28] rcar-vin: extend {start,stop}_streaming to work with media controller Niklas Söderlund
2017-12-08 20:45 ` Laurent Pinchart
2017-12-08 1:08 ` [PATCH v9 26/28] rcar-vin: enable support for r8a7795 Niklas Söderlund
2017-12-08 10:21 ` Laurent Pinchart
2017-12-08 1:08 ` [PATCH v9 27/28] rcar-vin: enable support for r8a7796 Niklas Söderlund
2017-12-08 10:25 ` Laurent Pinchart
2017-12-08 1:08 ` [PATCH v9 28/28] rcar-vin: enable support for r8a77970 Niklas Söderlund
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=24014872.yB9kxvWvsF@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=hverkuil@xs4all.nl \
--cc=kieran.bingham@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=niklas.soderlund+renesas@ragnatech.se \
--cc=tomoharu.fukawa.eb@renesas.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).