[PATCH v3 13/31] media: staging: media: imx6-mipi-csi2: move csi2ipu_gasket_init() to imx6-csi2.c
From: Frank Li <Frank.Li@nxp.com>
Date: 2025-08-21 20:17:32
Also in:
imx, linux-devicetree, linux-media, linux-phy, linux-staging, lkml
Subsystem:
media drivers for freescale imx, media input infrastructure (v4l/dvb), staging subsystem, the rest · Maintainers:
Steve Longerbeam, Philipp Zabel, Mauro Carvalho Chehab, Greg Kroah-Hartman, Linus Torvalds
Move platform specific csi2ipu_gasket_init() to imx6-csi2.c. Create callback function in struct dw_mipi_csi2_config. Prepare create common library for dw MIPI CSI2. Signed-off-by: Frank Li <Frank.Li@nxp.com> --- drivers/staging/media/imx/imx6-csi2.c | 28 +++++++++++++++++++++++++++- drivers/staging/media/imx/imx6-mipi-csi2.c | 28 +++------------------------- include/media/dw-mipi-csi2.h | 6 ++++++ 3 files changed, 36 insertions(+), 26 deletions(-)
diff --git a/drivers/staging/media/imx/imx6-csi2.c b/drivers/staging/media/imx/imx6-csi2.c
index 66274d8d73b67b35682bb82a9eb745bb24da7ae4..b7ea710df07cba33465d79ef57be4792c503958a 100644
--- a/drivers/staging/media/imx/imx6-csi2.c
+++ b/drivers/staging/media/imx/imx6-csi2.c@@ -15,10 +15,35 @@ #include <media/dw-mipi-csi2.h> #include "imx-media.h" +/* + * i.MX CSI2IPU Gasket registers follow. The CSI2IPU gasket is + * not part of the MIPI CSI-2 core, but its registers fall in the + * same register map range. + */ +#define CSI2IPU_GASKET 0xf00 +#define CSI2IPU_YUV422_YUYV BIT(2) + struct imx6_csi2 { struct dw_mipi_csi2_dev dw; }; +/* Setup the i.MX CSI2IPU Gasket */ +static void csi2ipu_gasket_init(struct dw_mipi_csi2_dev *csi2) +{ + u32 reg = 0; + + switch (csi2->format_mbus.code) { + case MEDIA_BUS_FMT_YUYV8_2X8: + case MEDIA_BUS_FMT_YUYV8_1X16: + reg = CSI2IPU_YUV422_YUYV; + break; + default: + break; + } + + writel(reg, csi2->base + CSI2IPU_GASKET); +} + static int csi2_registered(struct v4l2_subdev *sd) { struct dw_mipi_csi2_dev *csi2 = sd_to_dw_mipi_csi2_dev(sd);
@@ -40,6 +65,7 @@ static const struct dw_mipi_csi2_config imx6_config = { .name = "imx6-mipi-csi2", .internal_ops = &csi2_internal_ops, .grp_id = IMX_MEDIA_GRP_ID_CSI2, + .gasket_init = csi2ipu_gasket_init, }; static int csi2_probe(struct platform_device *pdev)
@@ -50,7 +76,7 @@ static int csi2_probe(struct platform_device *pdev) if (!csi2) return -ENOMEM; - return dw_mipi_csi2_init(pdev, &csi2->dw, NULL); + return dw_mipi_csi2_init(pdev, &csi2->dw, &imx6_config); } static void csi2_remove(struct platform_device *pdev)
diff --git a/drivers/staging/media/imx/imx6-mipi-csi2.c b/drivers/staging/media/imx/imx6-mipi-csi2.c
index ff06a739b957b305625d145c04c06999d0c13cae..e5593f23253b92def63040fa70fcf5fb50ec2fd2 100644
--- a/drivers/staging/media/imx/imx6-mipi-csi2.c
+++ b/drivers/staging/media/imx/imx6-mipi-csi2.c@@ -92,13 +92,6 @@ dw_csi2_reg_err(csi2, #__name)) #define PHY_TESTCLK BIT(1) #define PHY_TESTEN BIT(16) -/* - * i.MX CSI2IPU Gasket registers follow. The CSI2IPU gasket is - * not part of the MIPI CSI-2 core, but its registers fall in the - * same register map range. - */ -#define CSI2IPU_GASKET 0xf00 -#define CSI2IPU_YUV422_YUYV BIT(2) #define sd_to_dev sd_to_dw_mipi_csi2_dev
@@ -288,23 +281,6 @@ static int csi2_dphy_wait_clock_lane(struct dw_mipi_csi2_dev *csi2) return 0; } -/* Setup the i.MX CSI2IPU Gasket */ -static void csi2ipu_gasket_init(struct dw_mipi_csi2_dev *csi2) -{ - u32 reg = 0; - - switch (csi2->format_mbus.code) { - case MEDIA_BUS_FMT_YUYV8_2X8: - case MEDIA_BUS_FMT_YUYV8_1X16: - reg = CSI2IPU_YUV422_YUYV; - break; - default: - break; - } - - writel(reg, csi2->base + CSI2IPU_GASKET); -} - static int csi2_get_active_lanes(struct dw_mipi_csi2_dev *csi2, unsigned int *lanes) { struct v4l2_mbus_config mbus_config = { 0 };
@@ -352,7 +328,8 @@ static int csi2_start(struct dw_mipi_csi2_dev *csi2) return ret; /* setup the gasket */ - csi2ipu_gasket_init(csi2); + if (csi2->config && csi2->config->gasket_init) + csi2->config->gasket_init(csi2); /* Step 3 */ ret = csi2_dphy_init(csi2);
@@ -700,6 +677,7 @@ int dw_mipi_csi2_init(struct platform_device *pdev, struct dw_mipi_csi2_dev *csi strscpy(csi2->sd.name, config->name, sizeof(csi2->sd.name)); csi2->sd.internal_ops = config->internal_ops; csi2->sd.grp_id = config->grp_id; + csi2->config = config; for (i = 0; i < CSI2_NUM_PADS; i++) { csi2->pad[i].flags = (i == CSI2_SINK_PAD) ?
diff --git a/include/media/dw-mipi-csi2.h b/include/media/dw-mipi-csi2.h
index dfd25e23ea93fd53b064471b6a9557ef9c070fe7..d3e1c334df692c5dff10b467d759fe4da45b7b5f 100644
--- a/include/media/dw-mipi-csi2.h
+++ b/include/media/dw-mipi-csi2.h@@ -9,11 +9,15 @@ #include <media/v4l2-mc.h> #include <media/v4l2-subdev.h> +struct dw_mipi_csi2_dev; + struct dw_mipi_csi2_config { struct module *module; const char *name; int grp_id; const struct v4l2_subdev_internal_ops *internal_ops; + /* Deprecated, should go through phy interface */ + void (*gasket_init)(struct dw_mipi_csi2_dev *dev); }; /*
@@ -48,6 +52,8 @@ struct dw_mipi_csi2_dev { int stream_count; struct v4l2_subdev *src_sd; bool sink_linked[CSI2_NUM_SRC_PADS]; + + const struct dw_mipi_csi2_config *config; }; static inline struct dw_mipi_csi2_dev *
--
2.34.1