All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Niklas Söderlund" <niklas.soderlund+renesas@ragnatech.se>
To: Jacopo Mondi <jacopo+renesas@jmondi.org>
Cc: koji.matsuoka.xm@renesas.com, laurent.pinchart@ideasonboard.com,
	linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org
Subject: Re: [PATCH 2/2] media: rcar-vin: Mask VNCSI_IFMD register
Date: Fri, 13 Nov 2020 00:19:00 +0100	[thread overview]
Message-ID: <20201112231900.GB1603296@oden.dyn.berto.se> (raw)
In-Reply-To: <20201112160851.99750-3-jacopo+renesas@jmondi.org>

Hi Jacopo,

Thanks for your patch.

On 2020-11-12 17:08:51 +0100, Jacopo Mondi wrote:
> The VNCSI_IFMD register controls the data expansion mode and the
> channel routing between the CSI-2 recivers and VIN instances.
> 
> According to the chip manual revision 2.20 not all fields are available
> for all the SoCs:
> - V3M, V3H and E3 do not support the DES1 field has they do not feature
>   a CSI20 receiver.
> - D3 only supports parallel input, and the whole register shall always
>   be written as 0.
> 
> Add a bit mask to the per-SoC rcar_info structure and clear the register
> value before writing it to the hardware.
> 
> This patch upports the BSP change commit f54697394457
> ("media: rcar-vin: Fix VnCSI_IFMD register access for r8a77990")

I like that this issue is finally being addressed it's been in my list 
for a while. Unfortunately I'm not super keen on how it's solved here. I 
hoped the needed information could be extracted from the strcut 
rvin_info routes member inside rvin_set_channel_routing().

For D3 the length of the routes will be 0 and the driver should not 
attempt to write to the register at all. In this patch the register is 
still written the value of VNCSI_IFMD_DES1 | VNCSI_IFMD_DES0.

For the rest I was hoping the routes array would be examined and tested 
for if it contains RVIN_CSI40, RVIN_CSI41, RVIN_CSI20 and RVIN_CSI21 
routes and set DES0 and DES1 bits accordingly.

As rvin_set_channel_routing() is never called in a hot path the cost of 
iterating over the small array I think is worth it to guarantee the 
routes always are the authoritative source, just as it is for the media 
graph links.

> 
> Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org>
> ---
>  drivers/media/platform/rcar-vin/rcar-core.c | 5 +++++
>  drivers/media/platform/rcar-vin/rcar-dma.c  | 7 +++----
>  drivers/media/platform/rcar-vin/rcar-vin.h  | 6 ++++++
>  3 files changed, 14 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/media/platform/rcar-vin/rcar-core.c b/drivers/media/platform/rcar-vin/rcar-core.c
> index 0b67d58dd727..57ac43a93f5e 100644
> --- a/drivers/media/platform/rcar-vin/rcar-core.c
> +++ b/drivers/media/platform/rcar-vin/rcar-core.c
> @@ -1241,6 +1241,7 @@ static const struct rvin_info rcar_info_r8a77970 = {
>  	.max_width = 4096,
>  	.max_height = 4096,
>  	.routes = rcar_info_r8a77970_routes,
> +	.ifmd_mask = VNCSI_IFMD_DES1,
>  };
>  
>  static const struct rvin_group_route rcar_info_r8a77980_routes[] = {
> @@ -1270,6 +1271,7 @@ static const struct rvin_info rcar_info_r8a77980 = {
>  	.max_width = 4096,
>  	.max_height = 4096,
>  	.routes = rcar_info_r8a77980_routes,
> +	.ifmd_mask = VNCSI_IFMD_DES1,
>  };
>  
>  static const struct rvin_group_route rcar_info_r8a77990_routes[] = {
> @@ -1287,6 +1289,7 @@ static const struct rvin_info rcar_info_r8a77990 = {
>  	.max_width = 4096,
>  	.max_height = 4096,
>  	.routes = rcar_info_r8a77990_routes,
> +	.ifmd_mask = VNCSI_IFMD_DES1,
>  };
>  
>  static const struct rvin_group_route rcar_info_r8a77995_routes[] = {
> @@ -1306,6 +1309,8 @@ static const struct rvin_info rcar_info_r8a77995 = {
>  	.max_height = 4096,
>  	.routes = rcar_info_r8a77995_routes,
>  	.scalers = rcar_info_r8a77995_scalers,
> +	/* VNCSI_IFMD_REG not available on R-Car D3. */
> +	.ifmd_mask = 0xff,
>  };
>  
>  static const struct of_device_id rvin_of_id_table[] = {
> diff --git a/drivers/media/platform/rcar-vin/rcar-dma.c b/drivers/media/platform/rcar-vin/rcar-dma.c
> index 378514a75bc2..c0e09c5d9c79 100644
> --- a/drivers/media/platform/rcar-vin/rcar-dma.c
> +++ b/drivers/media/platform/rcar-vin/rcar-dma.c
> @@ -134,8 +134,6 @@
>  #define VNDMR2_VLV(n)		((n & 0xf) << 12)
>  
>  /* Video n CSI2 Interface Mode Register (Gen3) */
> -#define VNCSI_IFMD_DES1		(1 << 26)
> -#define VNCSI_IFMD_DES0		(1 << 25)
>  #define VNCSI_IFMD_CSI_CHSEL(n) (((n) & 0xf) << 0)
>  
>  /* Video n scaling control register (Gen3) */
> @@ -1583,8 +1581,9 @@ int rvin_set_channel_routing(struct rvin_dev *vin, u8 chsel)
>  	vnmc = rvin_read(vin, VNMC_REG);
>  	rvin_write(vin, vnmc & ~VNMC_VUP, VNMC_REG);
>  
> -	ifmd = VNCSI_IFMD_DES1 | VNCSI_IFMD_DES0 | VNCSI_IFMD_CSI_CHSEL(chsel);
> -
> +	/* Write only available fields to IFMD_REG. */
> +	ifmd = (VNCSI_IFMD_DES0 | VNCSI_IFMD_DES1 | VNCSI_IFMD_CSI_CHSEL(chsel))
> +	     & !vin->info->ifmd_mask;
>  	rvin_write(vin, ifmd, VNCSI_IFMD_REG);
>  
>  	vin_dbg(vin, "Set IFMD 0x%x\n", ifmd);
> diff --git a/drivers/media/platform/rcar-vin/rcar-vin.h b/drivers/media/platform/rcar-vin/rcar-vin.h
> index be10e06b0880..2cf8952faab1 100644
> --- a/drivers/media/platform/rcar-vin/rcar-vin.h
> +++ b/drivers/media/platform/rcar-vin/rcar-vin.h
> @@ -31,6 +31,10 @@
>  /* Max number on VIN instances that can be in a system */
>  #define RCAR_VIN_NUM 8
>  
> +/* CSI_IFMD register bit fields to mask per-SoC. */
> +#define VNCSI_IFMD_DES1		BIT(26)
> +#define VNCSI_IFMD_DES0		BIT(25)
> +
>  struct rvin_group;
>  
>  enum model_id {
> @@ -174,6 +178,7 @@ struct rvin_group_scaler {
>   * @routes:		list of possible routes from the CSI-2 recivers to
>   *			all VINs. The list mush be NULL terminated.
>   * @scalers:		List of available scalers, must be NULL terminated.
> + * @ifmd_mask:		Mask of unavailable bit fields of the CSI_IFMD register
>   */
>  struct rvin_info {
>  	enum model_id model;
> @@ -184,6 +189,7 @@ struct rvin_info {
>  	unsigned int max_height;
>  	const struct rvin_group_route *routes;
>  	const struct rvin_group_scaler *scalers;
> +	u32 ifmd_mask;
>  };
>  
>  /**
> -- 
> 2.29.1
> 

-- 
Regards,
Niklas Söderlund

  reply	other threads:[~2020-11-12 23:19 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-12 16:08 [PATCH 0/2] media: rcar-vin: Mask access to VNCSI_IFMD register Jacopo Mondi
2020-11-12 16:08 ` [PATCH 1/2] media: rcar-vin: Remove unused macro Jacopo Mondi
2020-11-12 22:58   ` Niklas Söderlund
2020-11-12 16:08 ` [PATCH 2/2] media: rcar-vin: Mask VNCSI_IFMD register Jacopo Mondi
2020-11-12 23:19   ` Niklas Söderlund [this message]
2020-11-14 11:26     ` Jacopo Mondi

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=20201112231900.GB1603296@oden.dyn.berto.se \
    --to=niklas.soderlund+renesas@ragnatech.se \
    --cc=jacopo+renesas@jmondi.org \
    --cc=koji.matsuoka.xm@renesas.com \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-media@vger.kernel.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    /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.