| /* |
| * Copyright 2017 NXP |
| */ |
| /* |
| * The code contained herein is licensed under the GNU General Public |
| * License. You may obtain a copy of the GNU General Public License |
| * Version 2 or later at the following locations: |
| * |
| * http://www.opensource.org/licenses/gpl-license.html |
| * http://www.gnu.org/copyleft/gpl.html |
| */ |
| |
| #ifndef MXC_MIPI_CSI2_H_ |
| #define MXC_MIPI_CSI2_H_ |
| |
| #include <media/v4l2-device.h> |
| |
| #define MXC_MIPI_CSI2_DRIVER_NAME "mxc-mipi-csi2" |
| #define MXC_MIPI_CSI2_SUBDEV_NAME MXC_MIPI_CSI2_DRIVER_NAME |
| #define MXC_MIPI_CSI2_MAX_DEVS 2 |
| #define MXC_MIPI_CSI2_MAX_LANES 4 |
| |
| #define MIPI_CSI2_OF_NODE_NAME "csi" |
| |
| #define MXC_MIPI_CSI2_VC0_PAD_SINK 0 |
| #define MXC_MIPI_CSI2_VC1_PAD_SINK 1 |
| #define MXC_MIPI_CSI2_VC2_PAD_SINK 2 |
| #define MXC_MIPI_CSI2_VC3_PAD_SINK 3 |
| |
| #define MXC_MIPI_CSI2_VC0_PAD_SOURCE 4 |
| #define MXC_MIPI_CSI2_VC1_PAD_SOURCE 5 |
| #define MXC_MIPI_CSI2_VC2_PAD_SOURCE 6 |
| #define MXC_MIPI_CSI2_VC3_PAD_SOURCE 7 |
| #define MXC_MIPI_CSI2_VCX_PADS_NUM 8 |
| |
| /* Subsystem CSR */ |
| #define CSI2SS_BASE_OFFSET 0x0 |
| |
| #define CSI2SS_PLM_CTRL (CSI2SS_BASE_OFFSET + 0x0) |
| #define CSI2SS_PLM_CTRL_PL_CLK_RUN 0x80000000 |
| #define CSI2SS_PLM_CTRL_VSYNC_OVERRIDE 0x200 |
| #define CSI2SS_PLM_CTRL_HSYNC_OVERRIDE 0x400 |
| #define CSI2SS_PLM_CTRL_VALID_OVERRIDE 0x800 |
| #define CSI2SS_PLM_CTRL_POLARITY_MASK 0x1000 |
| #define CSI2SS_PLM_CTRL_POLARITY_HIGH 0x1000 |
| #define CSI2SS_PLM_CTRL_POLARITY_LOW 0x0 |
| #define CSI2SS_PLM_CTRL_ENABLE_PL 1 |
| #define CSI2SS_PLM_CTRL_ENABLE_PL_OFFSET 0 |
| #define CSI2SS_PLM_CTRL_ENABLE_PL_MASK 1 |
| |
| #define CSI2SS_PHY_CTRL (CSI2SS_BASE_OFFSET + 0x4) |
| #define CSI2SS_PHY_CTRL_PD 1 |
| #define CSI2SS_PHY_CTRL_PD_OFFSET 22 |
| #define CSI2SS_PHY_CTRL_PD_MASK 0x400000 |
| #define CSI2SS_PHY_CTRL_RTERM_SEL 1 |
| #define CSI2SS_PHY_CTRL_RTERM_SEL_OFFSET 21 |
| #define CSI2SS_PHY_CTRL_RTERM_SEL_MASK 0x200000 |
| #define CSI2SS_PHY_CTRL_RX_HS_SETTLE_OFFSET 4 |
| #define CSI2SS_PHY_CTRL_RX_HS_SETTLE_MASK 0x3F0 |
| #define CSI2SS_PHY_CTRL_CONT_CLK_MODE 1 |
| #define CSI2SS_PHY_CTRL_CONT_CLK_MODE_OFFSET 3 |
| #define CSI2SS_PHY_CTRL_CONT_CLK_MODE_MASK 0x8 |
| #define CSI2SS_PHY_CTRL_DDRCLK_EN 1 |
| #define CSI2SS_PHY_CTRL_DDRCLK_EN_OFFSET 2 |
| #define CSI2SS_PHY_CTRL_DDRCLK_EN_MASK 0x4 |
| #define CSI2SS_PHY_CTRL_AUTO_PD_EN 1 |
| #define CSI2SS_PHY_CTRL_AUTO_PD_EN_OFFSET 1 |
| #define CSI2SS_PHY_CTRL_AUTO_PD_EN_MASK 0x2 |
| #define CSI2SS_PHY_CTRL_RX_ENABLE 1 |
| #define CSI2SS_PHY_CTRL_RX_ENABLE_OFFSET 0 |
| #define CSI2SS_PHY_CTRL_RX_ENABLE_MASK 0x1 |
| |
| #define CSI2SS_PHY_STATUS (CSI2SS_BASE_OFFSET + 0x8) |
| #define CSI2SS_PHY_TEST_STATUS (CSI2SS_BASE_OFFSET + 0x10) |
| #define CSI2SS_PHY_TEST_STATUS_D0 (CSI2SS_BASE_OFFSET + 0x14) |
| #define CSI2SS_PHY_TEST_STATUS_D1 (CSI2SS_BASE_OFFSET + 0x18) |
| #define CSI2SS_PHY_TEST_STATUS_D2 (CSI2SS_BASE_OFFSET + 0x1C) |
| #define CSI2SS_PHY_TEST_STATUS_D3 (CSI2SS_BASE_OFFSET + 0x20) |
| |
| #define CSI2SS_VC_INTERLACED (CSI2SS_BASE_OFFSET + 0x30) |
| #define CSI2SS_VC_INTERLACED_VC0 1 |
| #define CSI2SS_VC_INTERLACED_VC1 2 |
| #define CSI2SS_VC_INTERLACED_VC2 4 |
| #define CSI2SS_VC_INTERLACED_VC3 8 |
| #define CSI2SS_VC_INTERLACED_OFFSET 0 |
| #define CSI2SS_VC_INTERLACED_MASK 0xF |
| |
| #define CSI2SS_DATA_TYPE (CSI2SS_BASE_OFFSET + 0x38) |
| #define CSI2SS_DATA_TYPE_LEGACY_YUV420_8BIT (1 << 2) |
| #define CSI2SS_DATA_TYPE_YUV422_8BIT (1 << 6) |
| #define CSI2SS_DATA_TYPE_YUV422_10BIT (1 << 7) |
| #define CSI2SS_DATA_TYPE_RGB444 (1 << 8) |
| #define CSI2SS_DATA_TYPE_RGB555 (1 << 9) |
| #define CSI2SS_DATA_TYPE_RGB565 (1 << 10) |
| #define CSI2SS_DATA_TYPE_RGB666 (1 << 11) |
| #define CSI2SS_DATA_TYPE_RGB888 (1 << 12) |
| #define CSI2SS_DATA_TYPE_RAW6 (1 << 16) |
| #define CSI2SS_DATA_TYPE_RAW8 (1 << 18) |
| #define CSI2SS_DATA_TYPE_RAW10 (1 << 19) |
| #define CSI2SS_DATA_TYPE_RAW12 (1 << 20) |
| #define CSI2SS_DATA_TYPE_RAW14 (1 << 21) |
| |
| #define CSI2SS_YUV420_1ST_LINE_DATA_TYPE (CSI2SS_BASE_OFFSET + 0x40) |
| #define CSI2SS_YUV420_1ST_LINE_DATA_TYPE_ODD 0 |
| #define CSI2SS_YUV420_1ST_LINE_DATA_TYPE_EVEN 1 |
| #define CSI2SS_YUV420_1ST_LINE_DATA_TYPE_OFFSET 0 |
| #define CSI2SS_YUV420_1ST_LINE_DATA_TYPE_MASK 1 |
| |
| #define CSI2SS_CTRL_CLK_RESET (CSI2SS_BASE_OFFSET + 0x44) |
| #define CSI2SS_CTRL_CLK_RESET_EN 1 |
| #define CSI2SS_CTRL_CLK_RESET_OFFSET 0 |
| #define CSI2SS_CTRL_CLK_RESET_MASK 1 |
| #define CSI2SS_CTRL_CLK_RESET_CLK_OFF 1 |
| #define CSI2SS_CTRL_CLK_RESET_CLK_OFFSET 1 |
| #define CSI2SS_CTRL_CLK_RESET_CLK_MASK 0x1 |
| |
| #define CSI2SS_STREAM_FENCE_CTRL (CSI2SS_BASE_OFFSET + 0x48) |
| #define CSI2SS_STREAM_FENCE_VC0 1 |
| #define CSI2SS_STREAM_FENCE_VC1 2 |
| #define CSI2SS_STREAM_FENCE_VC2 4 |
| #define CSI2SS_STREAM_FENCE_VC3 8 |
| #define CSI2SS_STREAM_FENCE_CTRL_OFFSET 0 |
| #define CSI2SS_STREAM_FENCE_CTRL_MASK 0xF |
| |
| #define CSI2SS_STREAM_FENCE_STATUS (CSI2SS_BASE_OFFSET + 0x4C) |
| |
| /* CSI-2 controller CSR */ |
| #define CSI2RX_BASE_OFFSET (0x100) |
| |
| #define CSI2RX_CFG_NUM_LANES (CSI2RX_BASE_OFFSET + 0x0) |
| #define CSI2RX_CFG_NUM_LANES_OFFSET 0 |
| #define CSI2RX_CFG_NUM_LANES_MASK 0x3 |
| |
| #define CSI2RX_CFG_DISABLE_DATA_LANES (CSI2RX_BASE_OFFSET + 0x4) |
| #define CSI2RX_CFG_DISABLE_DATA_LANES_3 8 |
| #define CSI2RX_CFG_DISABLE_DATA_LANES_2 4 |
| #define CSI2RX_CFG_DISABLE_DATA_LANES_1 2 |
| #define CSI2RX_CFG_DISABLE_DATA_LANES_0 1 |
| #define CSI2RX_CFG_DISABLE_DATA_LANES_OFFSET 0 |
| #define CSI2RX_CFG_DISABLE_DATA_LANES_MASK 0xF |
| |
| #define CSI2RX_BIT_ERR (CSI2RX_BASE_OFFSET + 0x8) |
| |
| #define CSI2RX_IRQ_STATUS (CSI2RX_BASE_OFFSET + 0xC) |
| #define CSI2RX_IRQ_STATUS_CRC_ERROR 0x1 |
| #define CSI2RX_IRQ_STATUS_1BIT_CRC_ERROR 0x2 |
| #define CSI2RX_IRQ_STATUS_2BIT_CRC_ERROR 0x4 |
| #define CSI2RX_IRQ_STATUS_ULPS_CHANGE 0x8 |
| #define CSI2RX_IRQ_STATUS_DPHY_ERRSOTHS 0x10 |
| #define CSI2RX_IRQ_STATUS_DPHY_ERRSOTSYNC_HS 0x20 |
| #define CSI2RX_IRQ_STATUS_DPHY_ERRESC 0x40 |
| #define CSI2RX_IRQ_STATUS_DPHY_ERRSYNCESC 0x80 |
| #define CSI2RX_IRQ_STATUS_DPHY_ERRCTRL 0x100 |
| |
| #define CSI2RX_IRQ_MASK (CSI2RX_BASE_OFFSET + 0x10) |
| #define CSI2RX_IRQ_MASK_CRC_ERROR 0x1 |
| #define CSI2RX_IRQ_MASK_1BIT_CRC_ERROR 0x2 |
| #define CSI2RX_IRQ_MASK_2BIT_CRC_ERROR 0x4 |
| #define CSI2RX_IRQ_MASK_ULPS_CHANGE 0x8 |
| #define CSI2RX_IRQ_MASK_DPHY_ERRSOTHS 0x10 |
| #define CSI2RX_IRQ_MASK_DPHY_ERRSOTSYNC_HS 0x20 |
| #define CSI2RX_IRQ_MASK_DPHY_ERRESC 0x40 |
| #define CSI2RX_IRQ_MASK_DPHY_ERRSYNCESC 0x80 |
| #define CSI2RX_IRQ_MASK_DPHY_ERRCTRL 0x100 |
| |
| #define CSI2RX_ULPS_STATUS (CSI2RX_BASE_OFFSET + 0x14) |
| #define CSI2RX_ULPS_STATUS_CLK_LANE_ULPS 0x1 |
| #define CSI2RX_ULPS_STATUS_DAT_LANE0_ULPS 0x2 |
| #define CSI2RX_ULPS_STATUS_DAT_LANE1_ULPS 0x4 |
| #define CSI2RX_ULPS_STATUS_DAT_LANE2_ULPS 0x8 |
| #define CSI2RX_ULPS_STATUS_DAT_LANE3_ULPS 0x10 |
| #define CSI2RX_ULPS_STATUS_CLK_LANE_MARK 0x20 |
| #define CSI2RX_ULPS_STATUS_DAT_LANE0_MARK 0x40 |
| #define CSI2RX_ULPS_STATUS_DAT_LANE1_MARK 0x80 |
| #define CSI2RX_ULPS_STATUS_DAT_LANE2_MARK 0x100 |
| #define CSI2RX_ULPS_STATUS_DAT_LANE3_MARK 0x200 |
| |
| #define CSI2RX_PPI_ERRSOT_HS (CSI2RX_BASE_OFFSET + 0x18) |
| #define CSI2RX_PPI_ERRSOT_HS_DAT_LANE0 0x1 |
| #define CSI2RX_PPI_ERRSOT_HS_DAT_LANE1 0x2 |
| #define CSI2RX_PPI_ERRSOT_HS_DAT_LANE2 0x4 |
| #define CSI2RX_PPI_ERRSOT_HS_DAT_LANE3 0x8 |
| |
| #define CSI2RX_PPI_ERRSOTSYNC_HS (CSI2RX_BASE_OFFSET + 0x1C) |
| #define CSI2RX_PPI_ERRSOTSYNC_HS_DAT_LANE0 0x1 |
| #define CSI2RX_PPI_ERRSOTSYNC_HS_DAT_LANE1 0x2 |
| #define CSI2RX_PPI_ERRSOTSYNC_HS_DAT_LANE2 0x4 |
| #define CSI2RX_PPI_ERRSOTSYNC_HS_DAT_LANE3 0x8 |
| |
| #define CSI2RX_PPI_ERRESC (CSI2RX_BASE_OFFSET + 0x20) |
| #define CSI2RX_PPI_ERRESC_DAT_LANE0 0x1 |
| #define CSI2RX_PPI_ERRESC_DAT_LANE1 0x2 |
| #define CSI2RX_PPI_ERRESC_DAT_LANE2 0x4 |
| #define CSI2RX_PPI_ERRESC_DAT_LANE3 0x8 |
| |
| #define CSI2RX_PPI_ERRSYNCESC (CSI2RX_BASE_OFFSET + 0x24) |
| #define CSI2RX_PPI_ERRSYNCESC_DAT_LANE0 0x1 |
| #define CSI2RX_PPI_ERRSYNCESC_DAT_LANE1 0x2 |
| #define CSI2RX_PPI_ERRSYNCESC_DAT_LANE2 0x4 |
| #define CSI2RX_PPI_ERRSYNCESC_DAT_LANE3 0x8 |
| |
| #define CSI2RX_PPI_ERRCONTROL (CSI2RX_BASE_OFFSET + 0x28) |
| #define CSI2RX_PPI_ERRCONTROL_DAT_LANE0 0x1 |
| #define CSI2RX_PPI_ERRCONTROL_DAT_LANE1 0x2 |
| #define CSI2RX_PPI_ERRCONTROL_DAT_LANE2 0x4 |
| #define CSI2RX_PPI_ERRCONTROL_DAT_LANE3 0x8 |
| |
| #define CSI2RX_CFG_DISABLE_PAYLOAD_0 (CSI2RX_BASE_OFFSET + 0x2C) |
| #define CSI2RX_CFG_DISABLE_PAYLOAD_TYPE_LEGACY_YUV420_8BIT (1 << 10) |
| #define CSI2RX_CFG_DISABLE_PAYLOAD_TYPE_YUV422_8BIT (1 << 14) |
| #define CSI2RX_CFG_DISABLE_PAYLOAD_TYPE_YUV422_10BIT (1 << 15) |
| #define CSI2RX_CFG_DISABLE_PAYLOAD_TYPE_RGB444 (1 << 16) |
| #define CSI2RX_CFG_DISABLE_PAYLOAD_TYPE_RGB555 (1 << 17) |
| #define CSI2RX_CFG_DISABLE_PAYLOAD_TYPE_RGB565 (1 << 18) |
| #define CSI2RX_CFG_DISABLE_PAYLOAD_TYPE_RGB666 (1 << 19) |
| #define CSI2RX_CFG_DISABLE_PAYLOAD_TYPE_RGB888 (1 << 20) |
| #define CSI2RX_CFG_DISABLE_PAYLOAD_TYPE_RAW6 (1 << 24) |
| #define CSI2RX_CFG_DISABLE_PAYLOAD_TYPE_RAW7 (1 << 25) |
| #define CSI2RX_CFG_DISABLE_PAYLOAD_TYPE_RAW8 (1 << 26) |
| #define CSI2RX_CFG_DISABLE_PAYLOAD_TYPE_RAW10 (1 << 27) |
| #define CSI2RX_CFG_DISABLE_PAYLOAD_TYPE_RAW12 (1 << 28) |
| #define CSI2RX_CFG_DISABLE_PAYLOAD_TYPE_RAW14 (1 << 29) |
| |
| #define CSI2RX_CFG_DISABLE_PAYLOAD_1 (CSI2RX_BASE_OFFSET + 0x30) |
| |
| struct csis_hw_reset { |
| struct regmap *src; |
| u8 req_src; |
| u8 rst_val; |
| }; |
| struct csis_phy_gpr { |
| struct regmap *gpr; |
| u8 req_src; |
| }; |
| |
| struct mxc_mipi_csi2_dev { |
| struct v4l2_device v4l2_dev; |
| struct v4l2_subdev sd; |
| struct v4l2_subdev *sensor_sd; |
| |
| struct media_pad pads[MXC_MIPI_CSI2_VCX_PADS_NUM]; |
| struct v4l2_mbus_framefmt format; |
| |
| void __iomem *csr_regs; |
| void __iomem *base_regs; |
| struct platform_device *pdev; |
| u32 flags; |
| int irq; |
| |
| struct clk *clk_apb; |
| struct clk *clk_core; |
| struct clk *clk_esc; |
| struct clk *clk_pxl; |
| |
| struct csis_hw_reset hw_reset; |
| struct csis_phy_gpr phy_gpr; |
| |
| struct v4l2_async_subdev asd; |
| struct v4l2_async_notifier subdev_notifier; |
| struct v4l2_async_subdev *async_subdevs[2]; |
| |
| struct mutex lock; |
| |
| int id; |
| u32 hs_settle; |
| u32 send_level; |
| u32 num_lanes; |
| u8 data_lanes[4]; |
| u8 vchannel; |
| u8 running; |
| }; |
| |
| enum mxc_mipi_csi2_pm_state { |
| MXC_MIPI_CSI2_PM_POWERED = 0x1, |
| MXC_MIPI_CSI2_PM_SUSPENDED = 0x2, |
| MXC_MIPI_CSI2_RUNTIME_SUSPENDED = 0x4, |
| }; |
| |
| #endif |