summaryrefslogtreecommitdiff
path: root/drivers/media/platform/imx8/mxc-parallel-csi.h
blob: 4f32856c7cac86a236f1425b8bce5ae7d75f8d0a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165

/*
 * Copyright 2018 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_PARALLEL_CSI_H_
#define MXC_PARALLEL_CSI_H_

#include <media/v4l2-device.h>

#define MXC_PARALLEL_CSI_DRIVER_NAME	"mxc-parallel-csi"
#define MXC_PARALLEL_CSI_SUBDEV_NAME	MXC_PARALLEL_CSI_DRIVER_NAME

#define PARALLEL_CSI_OF_NODE_NAME	"pcsi"
#define BIT_U(nr) (1U << (nr))

#define MXC_PARALLEL_CSI_PAD_SOURCE		0
#define MXC_PARALLEL_CSI_PAD_SINK		1
#define MXC_PARALLEL_CSI_PADS_NUM		2

#define CI_PI_BASE_OFFSET       0x0U

/* CI_PI INTERFACE Control */
#define IF_CTRL_REG                     (CI_PI_BASE_OFFSET + 0x00)
#define IF_CTRL_REG_PL_ENABLE           BIT_U(0)
#define IF_CTRL_REG_PL_VALID            BIT_U(1)
#define IF_CTRL_REG_PL_ADDR(x)          (((x) & 0x7U) << 2)
#define IF_CTRL_REG_IF_FORCE(x)         (((x) & 0x7U) << 5)
#define IF_CTRL_REG_DATA_TYPE_SEL       BIT_U(8)
#define IF_CTRL_REG_DATA_TYPE(x)        (((x) & 0x1FU) << 9)

#define DATA_TYPE_OUT_NULL           (0x00)
#define DATA_TYPE_OUT_RGB            (0x04)
#define DATA_TYPE_OUT_YUV444         (0x08)
#define DATA_TYPE_OUT_YYU420_ODD     (0x10)
#define DATA_TYPE_OUT_YYU420_EVEN    (0x12)
#define DATA_TYPE_OUT_YYY_ODD        (0x18)
#define DATA_TYPE_OUT_UYVY_EVEN      (0x1A)
#define DATA_TYPE_OUT_RAW            (0x1C)

#define IF_CTRL_REG_IF_FORCE_HSYNV_OVERRIDE         0x4
#define IF_CTRL_REG_IF_FORCE_VSYNV_OVERRIDE         0x2
#define IF_CTRL_REG_IF_FORCE_DATA_ENABLE_OVERRIDE   0x1

#define IF_CTRL_REG_SET                 (CI_PI_BASE_OFFSET + 0x04)
#define IF_CTRL_REG_CLR                 (CI_PI_BASE_OFFSET + 0x08)
#define IF_CTRL_REG_TOG                 (CI_PI_BASE_OFFSET + 0x0C)

/* CSI INTERFACE CONTROL REG */
#define CSI_CTRL_REG                    (CI_PI_BASE_OFFSET + 0x10)
#define CSI_CTRL_REG_CSI_EN                     BIT_U(0)
#define CSI_CTRL_REG_PIXEL_CLK_POL              BIT_U(1)
#define CSI_CTRL_REG_HSYNC_POL                  BIT_U(2)
#define CSI_CTRL_REG_VSYNC_POL                  BIT_U(3)
#define CSI_CTRL_REG_DE_POL                     BIT_U(4)
#define CSI_CTRL_REG_PIXEL_DATA_POL             BIT_U(5)
#define CSI_CTRL_REG_CCIR_EXT_VSYNC_EN          BIT_U(6)
#define CSI_CTRL_REG_CCIR_EN                    BIT_U(7)
#define CSI_CTRL_REG_CCIR_VIDEO_MODE            BIT_U(8)
#define CSI_CTRL_REG_CCIR_NTSC_EN               BIT_U(9)
#define CSI_CTRL_REG_CCIR_VSYNC_RESET_EN        BIT_U(10)
#define CSI_CTRL_REG_CCIR_ECC_ERR_CORRECT_EN    BIT_U(11)
#define CSI_CTRL_REG_HSYNC_FORCE_EN             BIT_U(12)
#define CSI_CTRL_REG_VSYNC_FORCE_EN             BIT_U(13)
#define CSI_CTRL_REG_GCLK_MODE_EN               BIT_U(14)
#define CSI_CTRL_REG_VALID_SEL                  BIT_U(15)
#define CSI_CTRL_REG_RAW_OUT_SEL                BIT_U(16)
#define CSI_CTRL_REG_HSYNC_OUT_SEL              BIT_U(17)
#define CSI_CTRL_REG_HSYNC_PULSE(x)             (((x) & 0x7U) << 19)
#define CSI_CTRL_REG_UV_SWAP_EN                 BIT_U(22)
#define CSI_CTRL_REG_DATA_TYPE_IN(x)            (((x) & 0xFU) << 23)
#define CSI_CTRL_REG_MASK_VSYNC_COUNTER(x)      (((x) & 0x3U) << 27)
#define CSI_CTRL_REG_SOFTRST                    BIT_U(31)

#define DATA_TYPE_IN_UYVY_BT656_8BITS     0x0
#define DATA_TYPE_IN_UYVY_BT656_10BITS    0x1
#define DATA_TYPE_IN_RGB_8BITS            0x2
#define DATA_TYPE_IN_BGR_8BITS            0x3
#define DATA_TYPE_IN_RGB_24BITS           0x4
#define DATA_TYPE_IN_YVYU_8BITS           0x5
#define DATA_TYPE_IN_YUV_8BITS            0x6
#define DATA_TYPE_IN_YVYU_16BITS          0x7
#define DATA_TYPE_IN_YUV_24BITS           0x8
#define DATA_TYPE_IN_BAYER_8BITS          0x9
#define DATA_TYPE_IN_BAYER_10BITS         0xA
#define DATA_TYPE_IN_BAYER_12BITS         0xB
#define DATA_TYPE_IN_BAYER_16BITS         0xC

#define CSI_CTRL_REG_SET                (CI_PI_BASE_OFFSET + 0x14)
#define CSI_CTRL_REG_CLR                (CI_PI_BASE_OFFSET + 0x18)
#define CSI_CTRL_REG_TOG                (CI_PI_BASE_OFFSET + 0x1C)

/* CSI interface Status */
#define CSI_STATUS                      (CI_PI_BASE_OFFSET + 0x20)
#define CSI_STATUS_FIELD_TOGGLE         BIT_U(0)
#define CSI_STATUS_ECC_ERROR            BIT_U(1)

#define CSI_STATUS_SET                  (CI_PI_BASE_OFFSET + 0x24)
#define CSI_STATUS_CLR                  (CI_PI_BASE_OFFSET + 0x28)
#define CSI_STATUS_TOG                  (CI_PI_BASE_OFFSET + 0x2C)

/* CSI INTERFACE CONTROL REG1 */
#define CSI_CTRL_REG1                   (CI_PI_BASE_OFFSET + 0x30)
#define CSI_CTRL_REG1_PIXEL_WIDTH(v)    (((v) & 0xFFFFU) << 0)
#define CSI_CTRL_REG1_VSYNC_PULSE(v)    (((v) & 0xFFFFU) << 16)

#define CSI_CTRL_REG1_SET               (CI_PI_BASE_OFFSET + 0x34)
#define CSI_CTRL_REG1_CLR               (CI_PI_BASE_OFFSET + 0x38)
#define CSI_CTRL_REG1_TOG               (CI_PI_BASE_OFFSET + 0x3C)

/***********************************************************/
#define LPCG_BASE		(void __iomem *)0x58263000
#define LPCG_LIS_CLK			(0x00)
#define LPCG_CSR_CLK			(0x04)
#define LPCG_GPIO_CLK			(0x08)
#define LPCG_PWM_CLK			(0x0c)
#define LPCG_I2C_CLK			(0x10)
#define LPCG_CSI_INTERFACE_CLK	(0x18)
#define LPCG_CSI_MCLK			(0x1c)
/***********************************************************/

//#define CSI_INTERFACE_CCIR656	1

struct mxc_parallel_csi_dev {
	struct v4l2_device		v4l2_dev;
	struct v4l2_subdev		sd;
	struct v4l2_subdev		*sensor_sd;

	struct media_pad pads[MXC_PARALLEL_CSI_PADS_NUM];
	struct v4l2_mbus_framefmt format;

	void __iomem *csr_regs;
	void __iomem *lpcg_regs;
	struct platform_device *pdev;
	u32 flags;
	int irq;

	struct clk *clk_ipg;
	struct clk *clk_pixel;

	struct v4l2_async_subdev	asd;
	struct v4l2_async_notifier	subdev_notifier;
	struct v4l2_async_subdev	*async_subdevs[2];

	struct mutex lock;

	u8 running;
	u8 mode;
	u8 uv_swap;
	u8 tvdec;
};
#endif

enum {
	GATE_CLOCK_MODE = 0x01,
	CCIR_MODE = 0x02,
};