15cc7522dSYong Deng /* SPDX-License-Identifier: GPL-2.0+ */
25cc7522dSYong Deng /*
35cc7522dSYong Deng  * Copyright (c) 2011-2018 Magewell Electronics Co., Ltd. (Nanjing)
45cc7522dSYong Deng  * All rights reserved.
55cc7522dSYong Deng  * Author: Yong Deng <yong.deng@magewell.com>
65cc7522dSYong Deng  */
75cc7522dSYong Deng 
85cc7522dSYong Deng #ifndef __SUN6I_CSI_REG_H__
95cc7522dSYong Deng #define __SUN6I_CSI_REG_H__
105cc7522dSYong Deng 
115cc7522dSYong Deng #include <linux/kernel.h>
125cc7522dSYong Deng 
135cc7522dSYong Deng #define CSI_EN_REG			0x0
145cc7522dSYong Deng #define CSI_EN_VER_EN				BIT(30)
155cc7522dSYong Deng #define CSI_EN_CSI_EN				BIT(0)
165cc7522dSYong Deng 
175cc7522dSYong Deng #define CSI_IF_CFG_REG			0x4
185cc7522dSYong Deng #define CSI_IF_CFG_SRC_TYPE_MASK		BIT(21)
195cc7522dSYong Deng #define CSI_IF_CFG_SRC_TYPE_PROGRESSED		((0 << 21) & CSI_IF_CFG_SRC_TYPE_MASK)
205cc7522dSYong Deng #define CSI_IF_CFG_SRC_TYPE_INTERLACED		((1 << 21) & CSI_IF_CFG_SRC_TYPE_MASK)
215cc7522dSYong Deng #define CSI_IF_CFG_FPS_DS_EN			BIT(20)
225cc7522dSYong Deng #define CSI_IF_CFG_FIELD_MASK			BIT(19)
235cc7522dSYong Deng #define CSI_IF_CFG_FIELD_NEGATIVE		((0 << 19) & CSI_IF_CFG_FIELD_MASK)
245cc7522dSYong Deng #define CSI_IF_CFG_FIELD_POSITIVE		((1 << 19) & CSI_IF_CFG_FIELD_MASK)
255cc7522dSYong Deng #define CSI_IF_CFG_VREF_POL_MASK		BIT(18)
265cc7522dSYong Deng #define CSI_IF_CFG_VREF_POL_NEGATIVE		((0 << 18) & CSI_IF_CFG_VREF_POL_MASK)
275cc7522dSYong Deng #define CSI_IF_CFG_VREF_POL_POSITIVE		((1 << 18) & CSI_IF_CFG_VREF_POL_MASK)
285cc7522dSYong Deng #define CSI_IF_CFG_HREF_POL_MASK		BIT(17)
295cc7522dSYong Deng #define CSI_IF_CFG_HREF_POL_NEGATIVE		((0 << 17) & CSI_IF_CFG_HREF_POL_MASK)
305cc7522dSYong Deng #define CSI_IF_CFG_HREF_POL_POSITIVE		((1 << 17) & CSI_IF_CFG_HREF_POL_MASK)
315cc7522dSYong Deng #define CSI_IF_CFG_CLK_POL_MASK			BIT(16)
325cc7522dSYong Deng #define CSI_IF_CFG_CLK_POL_RISING_EDGE		((0 << 16) & CSI_IF_CFG_CLK_POL_MASK)
335cc7522dSYong Deng #define CSI_IF_CFG_CLK_POL_FALLING_EDGE		((1 << 16) & CSI_IF_CFG_CLK_POL_MASK)
345cc7522dSYong Deng #define CSI_IF_CFG_IF_DATA_WIDTH_MASK		GENMASK(10, 8)
355cc7522dSYong Deng #define CSI_IF_CFG_IF_DATA_WIDTH_8BIT		((0 << 8) & CSI_IF_CFG_IF_DATA_WIDTH_MASK)
365cc7522dSYong Deng #define CSI_IF_CFG_IF_DATA_WIDTH_10BIT		((1 << 8) & CSI_IF_CFG_IF_DATA_WIDTH_MASK)
375cc7522dSYong Deng #define CSI_IF_CFG_IF_DATA_WIDTH_12BIT		((2 << 8) & CSI_IF_CFG_IF_DATA_WIDTH_MASK)
385cc7522dSYong Deng #define CSI_IF_CFG_MIPI_IF_MASK			BIT(7)
395cc7522dSYong Deng #define CSI_IF_CFG_MIPI_IF_CSI			(0 << 7)
405cc7522dSYong Deng #define CSI_IF_CFG_MIPI_IF_MIPI			(1 << 7)
415cc7522dSYong Deng #define CSI_IF_CFG_CSI_IF_MASK			GENMASK(4, 0)
425cc7522dSYong Deng #define CSI_IF_CFG_CSI_IF_YUV422_INTLV		((0 << 0) & CSI_IF_CFG_CSI_IF_MASK)
435cc7522dSYong Deng #define CSI_IF_CFG_CSI_IF_YUV422_16BIT		((1 << 0) & CSI_IF_CFG_CSI_IF_MASK)
445cc7522dSYong Deng #define CSI_IF_CFG_CSI_IF_BT656			((4 << 0) & CSI_IF_CFG_CSI_IF_MASK)
455cc7522dSYong Deng #define CSI_IF_CFG_CSI_IF_BT1120		((5 << 0) & CSI_IF_CFG_CSI_IF_MASK)
465cc7522dSYong Deng 
475cc7522dSYong Deng #define CSI_CAP_REG			0x8
485cc7522dSYong Deng #define CSI_CAP_CH0_CAP_MASK_MASK		GENMASK(5, 2)
495cc7522dSYong Deng #define CSI_CAP_CH0_CAP_MASK(count)		((count << 2) & CSI_CAP_CH0_CAP_MASK_MASK)
505cc7522dSYong Deng #define CSI_CAP_CH0_VCAP_ON			BIT(1)
515cc7522dSYong Deng #define CSI_CAP_CH0_SCAP_ON			BIT(0)
525cc7522dSYong Deng 
535cc7522dSYong Deng #define CSI_SYNC_CNT_REG		0xc
545cc7522dSYong Deng #define CSI_FIFO_THRS_REG		0x10
555cc7522dSYong Deng #define CSI_BT656_HEAD_CFG_REG		0x14
565cc7522dSYong Deng #define CSI_PTN_LEN_REG			0x30
575cc7522dSYong Deng #define CSI_PTN_ADDR_REG		0x34
585cc7522dSYong Deng #define CSI_VER_REG			0x3c
595cc7522dSYong Deng 
605cc7522dSYong Deng #define CSI_CH_CFG_REG			0x44
615cc7522dSYong Deng #define CSI_CH_CFG_INPUT_FMT_MASK		GENMASK(23, 20)
625cc7522dSYong Deng #define CSI_CH_CFG_INPUT_FMT(fmt)		((fmt << 20) & CSI_CH_CFG_INPUT_FMT_MASK)
635cc7522dSYong Deng #define CSI_CH_CFG_OUTPUT_FMT_MASK		GENMASK(19, 16)
645cc7522dSYong Deng #define CSI_CH_CFG_OUTPUT_FMT(fmt)		((fmt << 16) & CSI_CH_CFG_OUTPUT_FMT_MASK)
655cc7522dSYong Deng #define CSI_CH_CFG_VFLIP_EN			BIT(13)
665cc7522dSYong Deng #define CSI_CH_CFG_HFLIP_EN			BIT(12)
675cc7522dSYong Deng #define CSI_CH_CFG_FIELD_SEL_MASK		GENMASK(11, 10)
685cc7522dSYong Deng #define CSI_CH_CFG_FIELD_SEL_FIELD0		((0 << 10) & CSI_CH_CFG_FIELD_SEL_MASK)
695cc7522dSYong Deng #define CSI_CH_CFG_FIELD_SEL_FIELD1		((1 << 10) & CSI_CH_CFG_FIELD_SEL_MASK)
705cc7522dSYong Deng #define CSI_CH_CFG_FIELD_SEL_BOTH		((2 << 10) & CSI_CH_CFG_FIELD_SEL_MASK)
715cc7522dSYong Deng #define CSI_CH_CFG_INPUT_SEQ_MASK		GENMASK(9, 8)
725cc7522dSYong Deng #define CSI_CH_CFG_INPUT_SEQ(seq)		((seq << 8) & CSI_CH_CFG_INPUT_SEQ_MASK)
735cc7522dSYong Deng 
745cc7522dSYong Deng #define CSI_CH_SCALE_REG		0x4c
755cc7522dSYong Deng #define CSI_CH_SCALE_QUART_EN			BIT(0)
765cc7522dSYong Deng 
775cc7522dSYong Deng #define CSI_CH_F0_BUFA_REG		0x50
785cc7522dSYong Deng 
795cc7522dSYong Deng #define CSI_CH_F1_BUFA_REG		0x58
805cc7522dSYong Deng 
815cc7522dSYong Deng #define CSI_CH_F2_BUFA_REG		0x60
825cc7522dSYong Deng 
835cc7522dSYong Deng #define CSI_CH_STA_REG			0x6c
845cc7522dSYong Deng #define CSI_CH_STA_FIELD_STA_MASK		BIT(2)
855cc7522dSYong Deng #define CSI_CH_STA_FIELD_STA_FIELD0		((0 << 2) & CSI_CH_STA_FIELD_STA_MASK)
865cc7522dSYong Deng #define CSI_CH_STA_FIELD_STA_FIELD1		((1 << 2) & CSI_CH_STA_FIELD_STA_MASK)
875cc7522dSYong Deng #define CSI_CH_STA_VCAP_STA			BIT(1)
885cc7522dSYong Deng #define CSI_CH_STA_SCAP_STA			BIT(0)
895cc7522dSYong Deng 
905cc7522dSYong Deng #define CSI_CH_INT_EN_REG		0x70
915cc7522dSYong Deng #define CSI_CH_INT_EN_VS_INT_EN			BIT(7)
925cc7522dSYong Deng #define CSI_CH_INT_EN_HB_OF_INT_EN		BIT(6)
935cc7522dSYong Deng #define CSI_CH_INT_EN_MUL_ERR_INT_EN		BIT(5)
945cc7522dSYong Deng #define CSI_CH_INT_EN_FIFO2_OF_INT_EN		BIT(4)
955cc7522dSYong Deng #define CSI_CH_INT_EN_FIFO1_OF_INT_EN		BIT(3)
965cc7522dSYong Deng #define CSI_CH_INT_EN_FIFO0_OF_INT_EN		BIT(2)
975cc7522dSYong Deng #define CSI_CH_INT_EN_FD_INT_EN			BIT(1)
985cc7522dSYong Deng #define CSI_CH_INT_EN_CD_INT_EN			BIT(0)
995cc7522dSYong Deng 
1005cc7522dSYong Deng #define CSI_CH_INT_STA_REG		0x74
1015cc7522dSYong Deng #define CSI_CH_INT_STA_VS_PD			BIT(7)
1025cc7522dSYong Deng #define CSI_CH_INT_STA_HB_OF_PD			BIT(6)
1035cc7522dSYong Deng #define CSI_CH_INT_STA_MUL_ERR_PD		BIT(5)
1045cc7522dSYong Deng #define CSI_CH_INT_STA_FIFO2_OF_PD		BIT(4)
1055cc7522dSYong Deng #define CSI_CH_INT_STA_FIFO1_OF_PD		BIT(3)
1065cc7522dSYong Deng #define CSI_CH_INT_STA_FIFO0_OF_PD		BIT(2)
1075cc7522dSYong Deng #define CSI_CH_INT_STA_FD_PD			BIT(1)
1085cc7522dSYong Deng #define CSI_CH_INT_STA_CD_PD			BIT(0)
1095cc7522dSYong Deng 
1105cc7522dSYong Deng #define CSI_CH_FLD1_VSIZE_REG		0x78
1115cc7522dSYong Deng 
1125cc7522dSYong Deng #define CSI_CH_HSIZE_REG		0x80
1135cc7522dSYong Deng #define CSI_CH_HSIZE_HOR_LEN_MASK		GENMASK(28, 16)
1145cc7522dSYong Deng #define CSI_CH_HSIZE_HOR_LEN(len)		((len << 16) & CSI_CH_HSIZE_HOR_LEN_MASK)
1155cc7522dSYong Deng #define CSI_CH_HSIZE_HOR_START_MASK		GENMASK(12, 0)
1165cc7522dSYong Deng #define CSI_CH_HSIZE_HOR_START(start)		((start << 0) & CSI_CH_HSIZE_HOR_START_MASK)
1175cc7522dSYong Deng 
1185cc7522dSYong Deng #define CSI_CH_VSIZE_REG		0x84
1195cc7522dSYong Deng #define CSI_CH_VSIZE_VER_LEN_MASK		GENMASK(28, 16)
1205cc7522dSYong Deng #define CSI_CH_VSIZE_VER_LEN(len)		((len << 16) & CSI_CH_VSIZE_VER_LEN_MASK)
1215cc7522dSYong Deng #define CSI_CH_VSIZE_VER_START_MASK		GENMASK(12, 0)
1225cc7522dSYong Deng #define CSI_CH_VSIZE_VER_START(start)		((start << 0) & CSI_CH_VSIZE_VER_START_MASK)
1235cc7522dSYong Deng 
1245cc7522dSYong Deng #define CSI_CH_BUF_LEN_REG		0x88
1255cc7522dSYong Deng #define CSI_CH_BUF_LEN_BUF_LEN_C_MASK		GENMASK(29, 16)
1265cc7522dSYong Deng #define CSI_CH_BUF_LEN_BUF_LEN_C(len)		((len << 16) & CSI_CH_BUF_LEN_BUF_LEN_C_MASK)
1275cc7522dSYong Deng #define CSI_CH_BUF_LEN_BUF_LEN_Y_MASK		GENMASK(13, 0)
1285cc7522dSYong Deng #define CSI_CH_BUF_LEN_BUF_LEN_Y(len)		((len << 0) & CSI_CH_BUF_LEN_BUF_LEN_Y_MASK)
1295cc7522dSYong Deng 
1305cc7522dSYong Deng #define CSI_CH_FLIP_SIZE_REG		0x8c
1315cc7522dSYong Deng #define CSI_CH_FLIP_SIZE_VER_LEN_MASK		GENMASK(28, 16)
1325cc7522dSYong Deng #define CSI_CH_FLIP_SIZE_VER_LEN(len)		((len << 16) & CSI_CH_FLIP_SIZE_VER_LEN_MASK)
1335cc7522dSYong Deng #define CSI_CH_FLIP_SIZE_VALID_LEN_MASK		GENMASK(12, 0)
1345cc7522dSYong Deng #define CSI_CH_FLIP_SIZE_VALID_LEN(len)		((len << 0) & CSI_CH_FLIP_SIZE_VALID_LEN_MASK)
1355cc7522dSYong Deng 
1365cc7522dSYong Deng #define CSI_CH_FRM_CLK_CNT_REG		0x90
1375cc7522dSYong Deng #define CSI_CH_ACC_ITNL_CLK_CNT_REG	0x94
1385cc7522dSYong Deng #define CSI_CH_FIFO_STAT_REG		0x98
1395cc7522dSYong Deng #define CSI_CH_PCLK_STAT_REG		0x9c
1405cc7522dSYong Deng 
1415cc7522dSYong Deng /*
1425cc7522dSYong Deng  * csi input data format
1435cc7522dSYong Deng  */
1445cc7522dSYong Deng enum csi_input_fmt {
1455cc7522dSYong Deng 	CSI_INPUT_FORMAT_RAW		= 0,
1465cc7522dSYong Deng 	CSI_INPUT_FORMAT_YUV422		= 3,
1475cc7522dSYong Deng 	CSI_INPUT_FORMAT_YUV420		= 4,
1485cc7522dSYong Deng };
1495cc7522dSYong Deng 
1505cc7522dSYong Deng /*
1515cc7522dSYong Deng  * csi output data format
1525cc7522dSYong Deng  */
1535cc7522dSYong Deng enum csi_output_fmt {
1545cc7522dSYong Deng 	/* only when input format is RAW */
1555cc7522dSYong Deng 	CSI_FIELD_RAW_8			= 0,
1565cc7522dSYong Deng 	CSI_FIELD_RAW_10		= 1,
1575cc7522dSYong Deng 	CSI_FIELD_RAW_12		= 2,
1585cc7522dSYong Deng 	CSI_FIELD_RGB565		= 4,
1595cc7522dSYong Deng 	CSI_FIELD_RGB888		= 5,
1605cc7522dSYong Deng 	CSI_FIELD_PRGB888		= 6,
1615cc7522dSYong Deng 	CSI_FRAME_RAW_8			= 8,
1625cc7522dSYong Deng 	CSI_FRAME_RAW_10		= 9,
1635cc7522dSYong Deng 	CSI_FRAME_RAW_12		= 10,
1645cc7522dSYong Deng 	CSI_FRAME_RGB565		= 12,
1655cc7522dSYong Deng 	CSI_FRAME_RGB888		= 13,
1665cc7522dSYong Deng 	CSI_FRAME_PRGB888		= 14,
1675cc7522dSYong Deng 
1685cc7522dSYong Deng 	/* only when input format is YUV422 */
1695cc7522dSYong Deng 	CSI_FIELD_PLANAR_YUV422		= 0,
1705cc7522dSYong Deng 	CSI_FIELD_PLANAR_YUV420		= 1,
1715cc7522dSYong Deng 	CSI_FRAME_PLANAR_YUV420		= 2,
1725cc7522dSYong Deng 	CSI_FRAME_PLANAR_YUV422		= 3,
1735cc7522dSYong Deng 	CSI_FIELD_UV_CB_YUV422		= 4,
1745cc7522dSYong Deng 	CSI_FIELD_UV_CB_YUV420		= 5,
1755cc7522dSYong Deng 	CSI_FRAME_UV_CB_YUV420		= 6,
1765cc7522dSYong Deng 	CSI_FRAME_UV_CB_YUV422		= 7,
1775cc7522dSYong Deng 	CSI_FIELD_MB_YUV422		= 8,
1785cc7522dSYong Deng 	CSI_FIELD_MB_YUV420		= 9,
1795cc7522dSYong Deng 	CSI_FRAME_MB_YUV420		= 10,
1805cc7522dSYong Deng 	CSI_FRAME_MB_YUV422		= 11,
1815cc7522dSYong Deng 	CSI_FIELD_UV_CB_YUV422_10	= 12,
1825cc7522dSYong Deng 	CSI_FIELD_UV_CB_YUV420_10	= 13,
1835cc7522dSYong Deng };
1845cc7522dSYong Deng 
1855cc7522dSYong Deng /*
1865cc7522dSYong Deng  * csi YUV input data sequence
1875cc7522dSYong Deng  */
1885cc7522dSYong Deng enum csi_input_seq {
1895cc7522dSYong Deng 	/* only when input format is YUV422 */
1905cc7522dSYong Deng 	CSI_INPUT_SEQ_YUYV = 0,
1915cc7522dSYong Deng 	CSI_INPUT_SEQ_YVYU,
1925cc7522dSYong Deng 	CSI_INPUT_SEQ_UYVY,
1935cc7522dSYong Deng 	CSI_INPUT_SEQ_VYUY,
1945cc7522dSYong Deng };
1955cc7522dSYong Deng 
1965cc7522dSYong Deng #endif /* __SUN6I_CSI_REG_H__ */
197