From 166dc7905bc75f5e6682d47e2c2aa436c01f6cef Mon Sep 17 00:00:00 2001 From: Valentine Barshak Date: Thu, 18 Oct 2018 15:37:29 +0300 Subject: [PATCH 118/211] media: platform: soc_camera: rcar_vin: Add r8a77980 support This adds R-Car V3H support. Signed-off-by: Valentine Barshak --- drivers/media/platform/soc_camera/rcar_vin.c | 111 +++++++++++++++++++++++---- 1 file changed, 97 insertions(+), 14 deletions(-) diff --git a/drivers/media/platform/soc_camera/rcar_vin.c b/drivers/media/platform/soc_camera/rcar_vin.c index ff4e521..6ba94c3 100644 --- a/drivers/media/platform/soc_camera/rcar_vin.c +++ b/drivers/media/platform/soc_camera/rcar_vin.c @@ -164,7 +164,8 @@ #define VNCSI_IFMD_REG 0x20 /* Video n CSI2 Interface Mode Register */ #define VNCSI_IFMD_DES1 (1 << 26) /* CSI20 */ -#define VNCSI_IFMD_DES0 (1 << 25) /* H3:CSI40/41, M3:CSI40, V3M:CSI40 */ +#define VNCSI_IFMD_DES0 (1 << 25) /* H3:CSI40/41, M3:CSI40, + * V3M:CSI40 V3H:CSI40 */ #define VNCSI_IFMD_CSI_CHSEL(n) (n << 0) #define VNCSI_IFMD_SEL_NUMBER 5 @@ -199,6 +200,7 @@ static int ifmd4_init = true; enum chip_id { RCAR_GEN3, + RCAR_V3H, RCAR_V3M, RCAR_M3N, RCAR_M3, @@ -482,6 +484,69 @@ static const struct vin_gen3_ifmd vin_v3m_vc_ifmd[] = { }, }; +static const struct vin_gen3_ifmd vin_v3h_vc_ifmd[] = { + { 0x0000, + { + {RCAR_CSI40, RCAR_VIRTUAL_CH0}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + {RCAR_CSI40, RCAR_VIRTUAL_CH1}, + {RCAR_CSI41, RCAR_VIRTUAL_CH0}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + {RCAR_CSI41, RCAR_VIRTUAL_CH1}, + } + }, + { 0x0001, + { + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + {RCAR_CSI40, RCAR_VIRTUAL_CH1}, + {RCAR_CSI40, RCAR_VIRTUAL_CH0}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + {RCAR_CSI41, RCAR_VIRTUAL_CH1}, + {RCAR_CSI41, RCAR_VIRTUAL_CH0}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + } + }, + { 0x0002, + { + {RCAR_CSI40, RCAR_VIRTUAL_CH1}, + {RCAR_CSI40, RCAR_VIRTUAL_CH0}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + {RCAR_CSI41, RCAR_VIRTUAL_CH1}, + {RCAR_CSI41, RCAR_VIRTUAL_CH0}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + } + }, + { 0x0003, + { + {RCAR_CSI40, RCAR_VIRTUAL_CH0}, + {RCAR_CSI40, RCAR_VIRTUAL_CH1}, + {RCAR_CSI40, RCAR_VIRTUAL_CH2}, + {RCAR_CSI40, RCAR_VIRTUAL_CH3}, + {RCAR_CSI41, RCAR_VIRTUAL_CH0}, + {RCAR_CSI41, RCAR_VIRTUAL_CH1}, + {RCAR_CSI41, RCAR_VIRTUAL_CH2}, + {RCAR_CSI41, RCAR_VIRTUAL_CH3}, + } + }, + { 0x0004, + { + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + {RCAR_CSI_CH_NONE, RCAR_VIN_CH_NONE}, + } + }, +}; + enum csi2_fmt { RCAR_CSI_FMT_NONE = -1, RCAR_CSI_RGB888, @@ -977,7 +1042,8 @@ static int rcar_vin_videobuf_setup(struct vb2_queue *vq, struct rcar_vin_cam *cam = icd->host_priv; if (priv->chip == RCAR_H3 || priv->chip == RCAR_M3 || - priv->chip == RCAR_M3N || priv->chip == RCAR_V3M) { + priv->chip == RCAR_M3N || priv->chip == RCAR_V3M || + priv->chip == RCAR_V3H) { if ((priv->ratio_h > 0x10000) || (priv->ratio_v > 0x10000)) { dev_err(icd->parent, "Scaling rate parameter error\n"); return -EINVAL; @@ -1087,7 +1153,8 @@ static int rcar_vin_setup(struct rcar_vin_priv *priv) switch (icd->current_fmt->host_fmt->fourcc) { case V4L2_PIX_FMT_NV12: if (priv->chip == RCAR_H3 || priv->chip == RCAR_M3 || - priv->chip == RCAR_M3N || priv->chip == RCAR_V3M) { + priv->chip == RCAR_M3N || priv->chip == RCAR_V3M || + priv->chip == RCAR_V3H) { iowrite32(ALIGN((cam->out_width * cam->out_height), 0x80), priv->base + VNUVAOF_REG); dmr = VNDMR_DTMD_YCSEP_YCBCR420; @@ -1127,15 +1194,16 @@ static int rcar_vin_setup(struct rcar_vin_priv *priv) case V4L2_PIX_FMT_XBGR32: if (priv->chip != RCAR_H3 && priv->chip != RCAR_M3 && priv->chip != RCAR_M3N && priv->chip != RCAR_V3M && - priv->chip != RCAR_GEN2 && priv->chip != RCAR_H1 && - priv->chip != RCAR_E1) + priv->chip != RCAR_V3H && priv->chip != RCAR_GEN2 && + priv->chip != RCAR_H1 && priv->chip != RCAR_E1) goto e_format; dmr = VNDMR_EXRGB; break; case V4L2_PIX_FMT_ABGR32: if (priv->chip != RCAR_H3 && priv->chip != RCAR_M3 && - priv->chip != RCAR_M3N && priv->chip != RCAR_V3M) + priv->chip != RCAR_M3N && priv->chip != RCAR_V3M && + priv->chip != RCAR_V3H) goto e_format; dmr = VNDMR_EXRGB | VNDMR_DTMD_ARGB; @@ -1156,7 +1224,8 @@ static int rcar_vin_setup(struct rcar_vin_priv *priv) vnmc |= VNMC_BPS; if (priv->chip == RCAR_H3 || priv->chip == RCAR_M3 || - priv->chip == RCAR_M3N || priv->chip == RCAR_V3M) { + priv->chip == RCAR_M3N || priv->chip == RCAR_V3M || + priv->chip == RCAR_V3H) { if (priv->pdata_flags & RCAR_VIN_CSI2) vnmc &= ~VNMC_DPINE; else @@ -1540,7 +1609,8 @@ static int rcar_vin_add_device(struct soc_camera_device *icd) pm_runtime_get_sync(ici->v4l2_dev.dev); if (priv->chip == RCAR_H3 || priv->chip == RCAR_M3 || - priv->chip == RCAR_M3N || priv->chip == RCAR_V3M) { + priv->chip == RCAR_M3N || priv->chip == RCAR_V3M || + priv->chip == RCAR_V3H) { struct v4l2_subdev *csi2_sd = find_csi2(priv); struct v4l2_subdev *deser_sd = find_deser(priv); int ret = 0; @@ -1803,7 +1873,8 @@ static int rcar_vin_set_rect(struct soc_camera_device *icd) } if (priv->chip == RCAR_H3 || priv->chip == RCAR_M3 || - priv->chip == RCAR_M3N || priv->chip == RCAR_V3M) { + priv->chip == RCAR_M3N || priv->chip == RCAR_V3M || + priv->chip == RCAR_V3H) { if ((icd->current_fmt->host_fmt->fourcc != V4L2_PIX_FMT_NV12) && (icd->current_fmt->host_fmt->fourcc != V4L2_PIX_FMT_SBGGR8) && (icd->current_fmt->host_fmt->fourcc != V4L2_PIX_FMT_SBGGR12) && @@ -1963,7 +2034,8 @@ static int rcar_vin_set_bus_param(struct soc_camera_device *icd) return ret; if (priv->chip == RCAR_H3 || priv->chip == RCAR_M3 || - priv->chip == RCAR_M3N || priv->chip == RCAR_V3M) { + priv->chip == RCAR_M3N || priv->chip == RCAR_V3M || + priv->chip == RCAR_V3H) { if (cfg.type == V4L2_MBUS_CSI2) vnmc &= ~VNMC_DPINE; else @@ -1971,7 +2043,8 @@ static int rcar_vin_set_bus_param(struct soc_camera_device *icd) } if (priv->chip == RCAR_H3 || priv->chip == RCAR_M3 || - priv->chip == RCAR_M3N || priv->chip == RCAR_V3M) + priv->chip == RCAR_M3N || priv->chip == RCAR_V3M || + priv->chip == RCAR_V3H) val = VNDMR2_FTEV; else val = VNDMR2_FTEV | VNDMR2_VLV(1); @@ -2591,7 +2664,8 @@ static int rcar_vin_try_fmt(struct soc_camera_device *icd, return ret; if (priv->chip == RCAR_H3 || priv->chip == RCAR_M3 || - priv->chip == RCAR_M3N || priv->chip == RCAR_V3M) { + priv->chip == RCAR_M3N || priv->chip == RCAR_V3M || + priv->chip == RCAR_V3H) { /* Adjust max scaling size for Gen3 */ if (pix->width > 4096) pix->width = priv->max_width; @@ -2770,6 +2844,7 @@ static struct soc_camera_host_ops rcar_vin_host_ops = { #ifdef CONFIG_OF static const struct of_device_id rcar_vin_of_table[] = { + { .compatible = "renesas,vin-r8a77980", .data = (void *)RCAR_V3H }, { .compatible = "renesas,vin-r8a77970", .data = (void *)RCAR_V3M }, { .compatible = "renesas,vin-r8a77965", .data = (void *)RCAR_M3N }, { .compatible = "renesas,vin-r8a7796", .data = (void *)RCAR_M3 }, @@ -3095,7 +3170,8 @@ static int rcar_vin_probe(struct platform_device *pdev) } if (priv->chip == RCAR_H3 || priv->chip == RCAR_M3 || - priv->chip == RCAR_M3N || priv->chip == RCAR_V3M) { + priv->chip == RCAR_M3N || priv->chip == RCAR_V3M || + priv->chip == RCAR_V3H) { priv->max_width = 4096; priv->max_height = 4096; } else { @@ -3104,7 +3180,8 @@ static int rcar_vin_probe(struct platform_device *pdev) } if ((priv->chip == RCAR_H3 || priv->chip == RCAR_M3 || - priv->chip == RCAR_M3N || priv->chip == RCAR_V3M) && + priv->chip == RCAR_M3N || priv->chip == RCAR_V3M || + priv->chip == RCAR_V3H) && !of_property_read_string(np, "csi,select", &str)) { u32 ifmd; bool match_flag = false; @@ -3190,6 +3267,9 @@ static int rcar_vin_probe(struct platform_device *pdev) case RCAR_V3M: gen3_ifmd_table = vin_v3m_vc_ifmd; break; + case RCAR_V3H: + gen3_ifmd_table = vin_v3h_vc_ifmd; + break; default: BUG(); break; @@ -3360,6 +3440,9 @@ static int rcar_vin_resume(struct device *dev) case RCAR_V3M: gen3_ifmd_table = vin_v3m_vc_ifmd; break; + case RCAR_V3H: + gen3_ifmd_table = vin_v3h_vc_ifmd; + break; default: return 0; } -- 2.7.4