// SPDX-License-Identifier: GPL-2.0 /* * Copyright 2019-2023 NXP */ #include #include #include "imx8-isi-core.h" /* ----------------------------------------------------------------------------- * i.MX8MN and i.MX8MP gasket */ #define GASKET_BASE(n) (0x0060 + (n) * 0x30) #define GASKET_CTRL 0x0000 #define GASKET_CTRL_DATA_TYPE(dt) ((dt) << 8) #define GASKET_CTRL_DATA_TYPE_MASK (0x3f << 8) #define GASKET_CTRL_DUAL_COMP_ENABLE BIT(1) #define GASKET_CTRL_ENABLE BIT(0) #define GASKET_HSIZE 0x0004 #define GASKET_VSIZE 0x0008 static void mxc_imx8_gasket_enable(struct mxc_isi_dev *isi, const struct v4l2_mbus_frame_desc *fd, const struct v4l2_mbus_framefmt *fmt, const unsigned int port) { u32 val; regmap_write(isi->gasket, GASKET_BASE(port) + GASKET_HSIZE, fmt->width); regmap_write(isi->gasket, GASKET_BASE(port) + GASKET_VSIZE, fmt->height); val = GASKET_CTRL_DATA_TYPE(fd->entry[0].bus.csi2.dt); if (fd->entry[0].bus.csi2.dt == MIPI_CSI2_DT_YUV422_8B) val |= GASKET_CTRL_DUAL_COMP_ENABLE; val |= GASKET_CTRL_ENABLE; regmap_write(isi->gasket, GASKET_BASE(port) + GASKET_CTRL, val); } static void mxc_imx8_gasket_disable(struct mxc_isi_dev *isi, const unsigned int port) { regmap_write(isi->gasket, GASKET_BASE(port) + GASKET_CTRL, 0); } const struct mxc_gasket_ops mxc_imx8_gasket_ops = { .enable = mxc_imx8_gasket_enable, .disable = mxc_imx8_gasket_disable, }; /* ----------------------------------------------------------------------------- * i.MX93 gasket */ #define DISP_MIX_CAMERA_MUX 0x30 #define DISP_MIX_CAMERA_MUX_DATA_TYPE(x) (((x) & 0x3f) << 3) #define DISP_MIX_CAMERA_MUX_GASKET_ENABLE BIT(16) static void mxc_imx93_gasket_enable(struct mxc_isi_dev *isi, const struct v4l2_mbus_frame_desc *fd, const struct v4l2_mbus_framefmt *fmt, const unsigned int port) { u32 val; val = DISP_MIX_CAMERA_MUX_DATA_TYPE(fd->entry[0].bus.csi2.dt); val |= DISP_MIX_CAMERA_MUX_GASKET_ENABLE; regmap_write(isi->gasket, DISP_MIX_CAMERA_MUX, val); } static void mxc_imx93_gasket_disable(struct mxc_isi_dev *isi, unsigned int port) { regmap_write(isi->gasket, DISP_MIX_CAMERA_MUX, 0); } const struct mxc_gasket_ops mxc_imx93_gasket_ops = { .enable = mxc_imx93_gasket_enable, .disable = mxc_imx93_gasket_disable, };