All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Stefan Klug <stefan.klug@ideasonboard.com>
Cc: libcamera-devel@lists.libcamera.org, linux-media@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org,
	Jacopo Mondi <jacopo.mondi@ideasonboard.com>,
	Umang Jain <umang.jain@ideasonboard.com>,
	Rui Miguel Silva <rmfrfs@gmail.com>,
	Martin Kepplinger <martink@posteo.de>,
	Purism Kernel Team <kernel@puri.sm>,
	Mauro Carvalho Chehab <mchehab@kernel.org>,
	Shawn Guo <shawnguo@kernel.org>,
	Sascha Hauer <s.hauer@pengutronix.de>,
	Pengutronix Kernel Team <kernel@pengutronix.de>,
	Fabio Estevam <festevam@gmail.com>,
	NXP Linux Team <linux-imx@nxp.com>
Subject: Re: [PATCH v2] media: mipi-csis: Emit V4L2_EVENT_FRAME_SYNC events
Date: Thu, 14 Mar 2024 12:10:49 +0200	[thread overview]
Message-ID: <20240314101049.GC4372@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20240314093652.56923-1-stefan.klug@ideasonboard.com>

Hi Stefan,

Thank you for the patch.

On Thu, Mar 14, 2024 at 10:36:50AM +0100, Stefan Klug wrote:
> The Samsung CSIS MIPI receiver provides a start-of-frame interrupt and
> a framecount register. As the CSI receiver is the hardware unit that lies
> closest to the sensor, the frame counter is the best we can get on these
> devices. In case of the ISI available on the i.MX8 M Plus it is also the
> only native start-of-frame signal available.

You still have either an extra line break or a missing blank line :-)

> This patch exposes the sof interrupt and the framecount as
> V4L2_EVENT_FRAME_SYNC event on the subdevice.
> 
> It was tested on a Debix-Som-A with a 6.8-rc4 kernel.
> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
> ---
> Changes v1 -> v2:
>  - fixed formatting issues from review
>  - moved frame variable declaration to top of subscribe_event()
> 
> Thanks all for the review!
> 
>  drivers/media/platform/nxp/imx-mipi-csis.c | 34 +++++++++++++++++++++-
>  1 file changed, 33 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/media/platform/nxp/imx-mipi-csis.c b/drivers/media/platform/nxp/imx-mipi-csis.c
> index db8ff5f5c4d3..664be27c4224 100644
> --- a/drivers/media/platform/nxp/imx-mipi-csis.c
> +++ b/drivers/media/platform/nxp/imx-mipi-csis.c
> @@ -30,6 +30,7 @@
>  
>  #include <media/v4l2-common.h>
>  #include <media/v4l2-device.h>
> +#include <media/v4l2-event.h>
>  #include <media/v4l2-fwnode.h>
>  #include <media/v4l2-mc.h>
>  #include <media/v4l2-subdev.h>
> @@ -742,6 +743,18 @@ static void mipi_csis_stop_stream(struct mipi_csis_device *csis)
>  	mipi_csis_system_enable(csis, false);
>  }
>  
> +static void mipi_csis_queue_event_sof(struct mipi_csis_device *csis)
> +{
> +	u32 frame;
> +	struct v4l2_event event = {
> +		.type = V4L2_EVENT_FRAME_SYNC,
> +	};

Nitpicking, we usually sort declarations by decreasing length. No need
for a v3.

> +
> +	frame = mipi_csis_read(csis, MIPI_CSIS_FRAME_COUNTER_CH(0));
> +	event.u.frame_sync.frame_sequence = frame;
> +	v4l2_event_queue(csis->sd.devnode, &event);
> +}
> +
>  static irqreturn_t mipi_csis_irq_handler(int irq, void *dev_id)
>  {
>  	struct mipi_csis_device *csis = dev_id;
> @@ -765,6 +778,10 @@ static irqreturn_t mipi_csis_irq_handler(int irq, void *dev_id)
>  				event->counter++;
>  		}
>  	}
> +
> +	if (status & MIPI_CSIS_INT_SRC_FRAME_START)
> +		mipi_csis_queue_event_sof(csis);
> +
>  	spin_unlock_irqrestore(&csis->slock, flags);
>  
>  	mipi_csis_write(csis, MIPI_CSIS_INT_SRC, status);
> @@ -1154,8 +1171,23 @@ static int mipi_csis_log_status(struct v4l2_subdev *sd)
>  	return 0;
>  }
>  
> +static int mipi_csis_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
> +				     struct v4l2_event_subscription *sub)
> +{
> +	if (sub->type != V4L2_EVENT_FRAME_SYNC)
> +		return -EINVAL;
> +
> +	/* V4L2_EVENT_FRAME_SYNC doesn't require an id, so zero should be set */
> +	if (sub->id != 0)
> +		return -EINVAL;
> +
> +	return v4l2_event_subscribe(fh, sub, 0, NULL);
> +}
> +
>  static const struct v4l2_subdev_core_ops mipi_csis_core_ops = {
>  	.log_status	= mipi_csis_log_status,
> +	.subscribe_event =  mipi_csis_subscribe_event,
> +	.unsubscribe_event = v4l2_event_subdev_unsubscribe,
>  };
>  
>  static const struct v4l2_subdev_video_ops mipi_csis_video_ops = {
> @@ -1358,7 +1390,7 @@ static int mipi_csis_subdev_init(struct mipi_csis_device *csis)
>  	snprintf(sd->name, sizeof(sd->name), "csis-%s",
>  		 dev_name(csis->dev));
>  
> -	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
> +	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
>  	sd->ctrl_handler = NULL;
>  
>  	sd->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;

-- 
Regards,

Laurent Pinchart

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

WARNING: multiple messages have this Message-ID (diff)
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Stefan Klug <stefan.klug@ideasonboard.com>
Cc: libcamera-devel@lists.libcamera.org, linux-media@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org,
	Jacopo Mondi <jacopo.mondi@ideasonboard.com>,
	Umang Jain <umang.jain@ideasonboard.com>,
	Rui Miguel Silva <rmfrfs@gmail.com>,
	Martin Kepplinger <martink@posteo.de>,
	Purism Kernel Team <kernel@puri.sm>,
	Mauro Carvalho Chehab <mchehab@kernel.org>,
	Shawn Guo <shawnguo@kernel.org>,
	Sascha Hauer <s.hauer@pengutronix.de>,
	Pengutronix Kernel Team <kernel@pengutronix.de>,
	Fabio Estevam <festevam@gmail.com>,
	NXP Linux Team <linux-imx@nxp.com>
Subject: Re: [PATCH v2] media: mipi-csis: Emit V4L2_EVENT_FRAME_SYNC events
Date: Thu, 14 Mar 2024 12:10:49 +0200	[thread overview]
Message-ID: <20240314101049.GC4372@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20240314093652.56923-1-stefan.klug@ideasonboard.com>

Hi Stefan,

Thank you for the patch.

On Thu, Mar 14, 2024 at 10:36:50AM +0100, Stefan Klug wrote:
> The Samsung CSIS MIPI receiver provides a start-of-frame interrupt and
> a framecount register. As the CSI receiver is the hardware unit that lies
> closest to the sensor, the frame counter is the best we can get on these
> devices. In case of the ISI available on the i.MX8 M Plus it is also the
> only native start-of-frame signal available.

You still have either an extra line break or a missing blank line :-)

> This patch exposes the sof interrupt and the framecount as
> V4L2_EVENT_FRAME_SYNC event on the subdevice.
> 
> It was tested on a Debix-Som-A with a 6.8-rc4 kernel.
> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
> ---
> Changes v1 -> v2:
>  - fixed formatting issues from review
>  - moved frame variable declaration to top of subscribe_event()
> 
> Thanks all for the review!
> 
>  drivers/media/platform/nxp/imx-mipi-csis.c | 34 +++++++++++++++++++++-
>  1 file changed, 33 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/media/platform/nxp/imx-mipi-csis.c b/drivers/media/platform/nxp/imx-mipi-csis.c
> index db8ff5f5c4d3..664be27c4224 100644
> --- a/drivers/media/platform/nxp/imx-mipi-csis.c
> +++ b/drivers/media/platform/nxp/imx-mipi-csis.c
> @@ -30,6 +30,7 @@
>  
>  #include <media/v4l2-common.h>
>  #include <media/v4l2-device.h>
> +#include <media/v4l2-event.h>
>  #include <media/v4l2-fwnode.h>
>  #include <media/v4l2-mc.h>
>  #include <media/v4l2-subdev.h>
> @@ -742,6 +743,18 @@ static void mipi_csis_stop_stream(struct mipi_csis_device *csis)
>  	mipi_csis_system_enable(csis, false);
>  }
>  
> +static void mipi_csis_queue_event_sof(struct mipi_csis_device *csis)
> +{
> +	u32 frame;
> +	struct v4l2_event event = {
> +		.type = V4L2_EVENT_FRAME_SYNC,
> +	};

Nitpicking, we usually sort declarations by decreasing length. No need
for a v3.

> +
> +	frame = mipi_csis_read(csis, MIPI_CSIS_FRAME_COUNTER_CH(0));
> +	event.u.frame_sync.frame_sequence = frame;
> +	v4l2_event_queue(csis->sd.devnode, &event);
> +}
> +
>  static irqreturn_t mipi_csis_irq_handler(int irq, void *dev_id)
>  {
>  	struct mipi_csis_device *csis = dev_id;
> @@ -765,6 +778,10 @@ static irqreturn_t mipi_csis_irq_handler(int irq, void *dev_id)
>  				event->counter++;
>  		}
>  	}
> +
> +	if (status & MIPI_CSIS_INT_SRC_FRAME_START)
> +		mipi_csis_queue_event_sof(csis);
> +
>  	spin_unlock_irqrestore(&csis->slock, flags);
>  
>  	mipi_csis_write(csis, MIPI_CSIS_INT_SRC, status);
> @@ -1154,8 +1171,23 @@ static int mipi_csis_log_status(struct v4l2_subdev *sd)
>  	return 0;
>  }
>  
> +static int mipi_csis_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
> +				     struct v4l2_event_subscription *sub)
> +{
> +	if (sub->type != V4L2_EVENT_FRAME_SYNC)
> +		return -EINVAL;
> +
> +	/* V4L2_EVENT_FRAME_SYNC doesn't require an id, so zero should be set */
> +	if (sub->id != 0)
> +		return -EINVAL;
> +
> +	return v4l2_event_subscribe(fh, sub, 0, NULL);
> +}
> +
>  static const struct v4l2_subdev_core_ops mipi_csis_core_ops = {
>  	.log_status	= mipi_csis_log_status,
> +	.subscribe_event =  mipi_csis_subscribe_event,
> +	.unsubscribe_event = v4l2_event_subdev_unsubscribe,
>  };
>  
>  static const struct v4l2_subdev_video_ops mipi_csis_video_ops = {
> @@ -1358,7 +1390,7 @@ static int mipi_csis_subdev_init(struct mipi_csis_device *csis)
>  	snprintf(sd->name, sizeof(sd->name), "csis-%s",
>  		 dev_name(csis->dev));
>  
> -	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
> +	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
>  	sd->ctrl_handler = NULL;
>  
>  	sd->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;

-- 
Regards,

Laurent Pinchart

  reply	other threads:[~2024-03-14 10:11 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-14  9:36 [PATCH v2] media: mipi-csis: Emit V4L2_EVENT_FRAME_SYNC events Stefan Klug
2024-03-14  9:36 ` Stefan Klug
2024-03-14 10:10 ` Laurent Pinchart [this message]
2024-03-14 10:10   ` Laurent Pinchart

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=20240314101049.GC4372@pendragon.ideasonboard.com \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=festevam@gmail.com \
    --cc=jacopo.mondi@ideasonboard.com \
    --cc=kernel@pengutronix.de \
    --cc=kernel@puri.sm \
    --cc=libcamera-devel@lists.libcamera.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-imx@nxp.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=martink@posteo.de \
    --cc=mchehab@kernel.org \
    --cc=rmfrfs@gmail.com \
    --cc=s.hauer@pengutronix.de \
    --cc=shawnguo@kernel.org \
    --cc=stefan.klug@ideasonboard.com \
    --cc=umang.jain@ideasonboard.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.