15cc7522dSYong Deng /* SPDX-License-Identifier: GPL-2.0+ */ 25cc7522dSYong Deng /* 35cc7522dSYong Deng * Copyright (c) 2011-2018 Magewell Electronics Co., Ltd. (Nanjing) 45cc7522dSYong Deng * Author: Yong Deng <yong.deng@magewell.com> 5*dc85e4cdSPaul Kocialkowski * Copyright 2021-2022 Bootlin 6*dc85e4cdSPaul Kocialkowski * Author: Paul Kocialkowski <paul.kocialkowski@bootlin.com> 75cc7522dSYong Deng */ 85cc7522dSYong Deng 9*dc85e4cdSPaul Kocialkowski #ifndef _SUN6I_CSI_REG_H_ 10*dc85e4cdSPaul Kocialkowski #define _SUN6I_CSI_REG_H_ 115cc7522dSYong Deng 125cc7522dSYong Deng #include <linux/kernel.h> 135cc7522dSYong Deng 14b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_ADDR_VALUE(a) ((a) >> 2) 155cc7522dSYong Deng 16b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_REG 0x0 17b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_VER_EN BIT(30) 18b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_PTN_CYCLE(v) (((v) << 16) & GENMASK(23, 16)) 19b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_SRAM_PWDN BIT(8) 20b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_PTN_START BIT(4) 21b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_CLK_CNT_SPL_VSYNC BIT(3) 22b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_CLK_CNT_EN BIT(2) 23b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_PTN_GEN_EN BIT(1) 24b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_EN_CSI_EN BIT(0) 255cc7522dSYong Deng 26b3a07d8eSPaul Kocialkowski /* Note that Allwinner manuals and code invert positive/negative definitions. */ 275cc7522dSYong Deng 28b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_REG 0x4 29b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_FIELD_DT_PCLK_SHIFT(v) (((v) << 24) & GENMASK(27, 24)) 30b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_SRC_TYPE_PROGRESSIVE (0 << 21) 31b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_SRC_TYPE_INTERLACED (1 << 21) 32b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_FPS_DS BIT(20) 33b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_FIELD_POSITIVE (0 << 19) 34b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_FIELD_NEGATIVE (1 << 19) 35b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_VREF_POL_POSITIVE (0 << 18) 36b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_VREF_POL_NEGATIVE (1 << 18) 37b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_HREF_POL_POSITIVE (0 << 17) 38b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_HREF_POL_NEGATIVE (1 << 17) 39b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_CLK_POL_FALLING (0 << 16) 40b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_CLK_POL_RISING (1 << 16) 41b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_FIELD_DT_FIELD_VSYNC (0 << 14) 42b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_FIELD_DT_FIELD (1 << 14) 43b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_FIELD_DT_VSYNC (2 << 14) 44b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_DATA_WIDTH_8 (0 << 8) 45b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_DATA_WIDTH_10 (1 << 8) 46b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_DATA_WIDTH_12 (2 << 8) 47b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_DATA_WIDTH_8_PLUS_2 (3 << 8) 48b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_DATA_WIDTH_2_TIMES_8 (4 << 8) 49b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_IF_CSI (0 << 7) 50b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_IF_MIPI (1 << 7) 51b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_IF_CSI_YUV_RAW (0 << 0) 52b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_IF_CSI_YUV_COMBINED (1 << 0) 53b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_IF_CSI_BT656 (4 << 0) 54b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_IF_CFG_IF_CSI_BT1120 (5 << 0) 555cc7522dSYong Deng 56b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CAP_REG 0x8 57b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CAP_MASK(v) (((v) << 2) & GENMASK(5, 2)) 58b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CAP_VCAP_ON BIT(1) 59b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CAP_SCAP_ON BIT(0) 605cc7522dSYong Deng 61b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_SYNC_CNT_REG 0xc 62b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_FIFO_THRS_REG 0x10 63b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_BT656_HEAD_CFG_REG 0x14 645cc7522dSYong Deng 65b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_PTN_LEN_REG 0x30 66b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_PTN_ADDR_REG 0x34 67b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_VER_REG 0x3c 685cc7522dSYong Deng 69b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_REG 0x44 70b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_PAD_VAL(v) (((v) << 24) & GENMASK(31, 24)) 71b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_INPUT_FMT(v) (((v) << 20) & GENMASK(23, 20)) 72b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_OUTPUT_FMT(v) (((v) << 16) & GENMASK(19, 16)) 73b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_VFLIP_EN BIT(13) 74b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_HFLIP_EN BIT(12) 75b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_FIELD_SEL_FIELD0 (0 << 10) 76b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_FIELD_SEL_FIELD1 (1 << 10) 77b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_FIELD_SEL_EITHER (2 << 10) 78b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_CFG_INPUT_YUV_SEQ(v) (((v) << 8) & GENMASK(9, 8)) 795cc7522dSYong Deng 80b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_FMT_RAW 0 81b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_FMT_YUV422 3 82b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_FMT_YUV420 4 835cc7522dSYong Deng 84b3a07d8eSPaul Kocialkowski /* Note that Allwinner manuals and code invert frame/field definitions. */ 855cc7522dSYong Deng 86b3a07d8eSPaul Kocialkowski /* RAW */ 87b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_8 0 88b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_10 1 89b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_RAW_12 2 90b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_RGB565 4 91b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_RGB888 5 92b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_PRGB888 6 93b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_8 8 94b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_10 9 95b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_RAW_12 10 96b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_RGB565 12 97b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_RGB888 13 98b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_PRGB888 14 995cc7522dSYong Deng 100b3a07d8eSPaul Kocialkowski /* YUV */ 101b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_YUV422P 0 102b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_YUV420P 1 103b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_YUV420P 2 104b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_YUV422P 3 105b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_YUV422SP 4 106b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_YUV420SP 5 107b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_YUV420SP 6 108b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_YUV422SP 7 109b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_YUV422MB 8 110b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_YUV420MB 9 111b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_YUV420MB 10 112b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FIELD_YUV422MB 11 113b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_YUV422SP_10 12 114b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_OUTPUT_FMT_FRAME_YUV420SP_10 13 1155cc7522dSYong Deng 116b3a07d8eSPaul Kocialkowski /* YUV Planar */ 117b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_YUV_SEQ_YUYV 0 118b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_YUV_SEQ_YVYU 1 119b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_YUV_SEQ_UYVY 2 120b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_YUV_SEQ_VYUY 3 1215cc7522dSYong Deng 122b3a07d8eSPaul Kocialkowski /* YUV Semi-planar */ 123b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_YUV_SEQ_UV 0 124b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_INPUT_YUV_SEQ_VU 1 1255cc7522dSYong Deng 126b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_SCALE_REG 0x4c 127b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_SCALE_QUART_EN BIT(0) 1285cc7522dSYong Deng 129b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FIFO0_ADDR_REG 0x50 130b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FIFO1_ADDR_REG 0x58 131b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FIFO2_ADDR_REG 0x60 1325cc7522dSYong Deng 133b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_STA_REG 0x6c 134b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_STA_FIELD BIT(2) 135b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_STA_VCAP BIT(1) 136b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_STA_SCAP BIT(0) 1375cc7522dSYong Deng 138b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_REG 0x70 139b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_VS BIT(7) 140b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_HB_OF BIT(6) 141b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_MUL_ERR BIT(5) 142b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_FIFO2_OF BIT(4) 143b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_FIFO1_OF BIT(3) 144b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_FIFO0_OF BIT(2) 145b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_FD BIT(1) 146b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_EN_CD BIT(0) 147b3a07d8eSPaul Kocialkowski 148b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_REG 0x74 149b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_CLEAR 0xff 150b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_VS BIT(7) 151b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_HB_OF BIT(6) 152b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_MUL_ERR BIT(5) 153b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_FIFO2_OF BIT(4) 154b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_FIFO1_OF BIT(3) 155b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_FIFO0_OF BIT(2) 156b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_FD BIT(1) 157b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_INT_STA_CD BIT(0) 158b3a07d8eSPaul Kocialkowski 159b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FLD1_VSIZE_REG 0x78 160b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FLD1_VSIZE_VER_LEN(v) (((v) << 16) & GENMASK(28, 16)) 161b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FLD1_VSIZE_VER_START(v) ((v) & GENMASK(12, 0)) 162b3a07d8eSPaul Kocialkowski 163b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_HSIZE_REG 0x80 164b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_HSIZE_LEN(v) (((v) << 16) & GENMASK(28, 16)) 165b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_HSIZE_START(v) ((v) & GENMASK(12, 0)) 166b3a07d8eSPaul Kocialkowski 167b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_VSIZE_REG 0x84 168b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_VSIZE_LEN(v) (((v) << 16) & GENMASK(28, 16)) 169b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_VSIZE_START(v) ((v) & GENMASK(12, 0)) 170b3a07d8eSPaul Kocialkowski 171b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_BUF_LEN_REG 0x88 172b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_BUF_LEN_CHROMA_LINE(v) (((v) << 16) & GENMASK(29, 16)) 173b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_BUF_LEN_LUMA_LINE(v) ((v) & GENMASK(13, 0)) 174b3a07d8eSPaul Kocialkowski 175b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FLIP_SIZE_REG 0x8c 176b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FLIP_SIZE_VER_LEN(v) (((v) << 16) & GENMASK(28, 16)) 177b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FLIP_SIZE_VALID_LEN(v) ((v) & GENMASK(12, 0)) 178b3a07d8eSPaul Kocialkowski 179b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FRM_CLK_CNT_REG 0x90 180b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_ACC_ITNL_CLK_CNT_REG 0x94 181b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_FIFO_STAT_REG 0x98 182b3a07d8eSPaul Kocialkowski #define SUN6I_CSI_CH_PCLK_STAT_REG 0x9c 1835cc7522dSYong Deng 184*dc85e4cdSPaul Kocialkowski #endif 185