Commit d883f2e7 authored by Niklas Söderlund's avatar Niklas Söderlund Committed by Hans Verkuil
Browse files

media: rcar-vin: Generate FRAME_SYNC events



Enable the VSYNC Rising Edge Detection interrupt and generate a
FRAME_SYNC event form it. The interrupt is available on all supported
models of the VIN (Gen2, Gen3 and Gen4).

Signed-off-by: default avatarNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Link: https://lore.kernel.org/r/20250616185722.980722-4-niklas.soderlund+renesas@ragnatech.se


Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
parent 82bdeae1
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@
#include <linux/interrupt.h>
#include <linux/pm_runtime.h>

#include <media/v4l2-event.h>
#include <media/videobuf2-dma-contig.h>

#include "rcar-vin.h"
@@ -114,10 +115,14 @@
#define VNFC_S_FRAME		(1 << 0)

/* Video n Interrupt Enable Register bits */
#define VNIE_VFE		BIT(17)
#define VNIE_VRE		BIT(16)
#define VNIE_FIE		BIT(4)
#define VNIE_EFE		BIT(1)

/* Video n Interrupt Status Register bits */
#define VNINTS_VFS		BIT(17)
#define VNINTS_VRS		BIT(16)
#define VNINTS_FIS		BIT(4)
#define VNINTS_EFS		BIT(1)

@@ -889,6 +894,8 @@ static int rvin_setup(struct rvin_dev *vin)

	/* Progressive or interlaced mode */
	interrupts = progressive ? VNIE_FIE : VNIE_EFE;
	/* Enable VSYNC Rising Edge Detection. */
	interrupts |= VNIE_VRE;

	/* Ack interrupts */
	rvin_write(vin, interrupts, VNINTS_REG);
@@ -1040,6 +1047,16 @@ static irqreturn_t rvin_irq(int irq, void *data)
	rvin_write(vin, status, VNINTS_REG);
	handled = 1;

	/* Signal Start of Frame. */
	if (status & VNINTS_VRS) {
		struct v4l2_event event = {
			.type = V4L2_EVENT_FRAME_SYNC,
			.u.frame_sync.frame_sequence = vin->sequence,
		};

		v4l2_event_queue(&vin->vdev, &event);
	}

	/* Nothing to do if nothing was captured. */
	capture = vin->format.field == V4L2_FIELD_NONE ||
		vin->format.field == V4L2_FIELD_ALTERNATE ?
+2 −0
Original line number Diff line number Diff line
@@ -489,6 +489,8 @@ static int rvin_subscribe_event(struct v4l2_fh *fh,
				const struct v4l2_event_subscription *sub)
{
	switch (sub->type) {
	case V4L2_EVENT_FRAME_SYNC:
		return v4l2_event_subscribe(fh, sub, 2, NULL);
	case V4L2_EVENT_SOURCE_CHANGE:
		return v4l2_event_subscribe(fh, sub, 4, NULL);
	}