summaryrefslogtreecommitdiff
path: root/include/video/stf-vin.h
blob: e96fedef82f907f428b2ae7ba9b011d1ae9846a7 (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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
/* include/video/stf-vin.h
 *
 * Copyright 2020 starfive tech.
 *	Eric Tang <eric.tang@starfivetech.com>
 *
 * Generic vin notifier interface
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
*/
#ifndef _VIDEO_VIN_H
#define _VIDEO_VIN_H

#include <linux/cdev.h>

#define DRV_NAME "stf-vin"
#define FB_FIRST_ADDR      0xf9000000
#define FB_SECOND_ADDR     0xf97e9000

#define RESERVED_MEM_SIZE  0x1000000

#define VIN_MIPI_CONTROLLER0_OFFSET 0x00000
#define VIN_CLKGEN_OFFSET           0x10000
#define VIN_RSTGEN_OFFSET           0x20000
#define VIN_MIPI_CONTROLLER1_OFFSET 0x30000
#define VIN_SYSCONTROLLER_OFFSET    0x40000

#define VD_1080P    1080
#define VD_720P     720
#define VD_PAL      480

#define VD_HEIGHT_1080P     VD_1080P
#define VD_WIDTH_1080P      1920

#define VD_HEIGHT_720P      VD_720P
#define VD_WIDTH_720P       1080

#define VD_HEIGHT_480       480
#define VD_WIDTH_640        640

#define SEEED_WIDTH_800       800
#define SEEED_HIGH_480        480

#define VIN_TOP_CLKGEN_BASE_ADDR	    0x11800000
#define VIN_TOP_RSTGEN_BASE_ADDR	    0x11840000
#define VIN_TOP_IOPAD_BASE_ADDR	        0x11858000

#define ISP_BASE_MIPI0_ADDR             0x19800000
#define ISP_BASE_CLKGEN_ADDR            0x19810000
#define ISP_BASE_RSTGEN_ADDR            0x19820000
#define ISP_BASE_MIPI1_ADDR             0x19830000
#define ISP_BASE_SYSCTRL_ADDR	        0x19840000
#define ISP_BASE_ISP0_ADDR	            0x19870000
#define ISP_BASE_ISP1_ADDR	            0x198a0000


//vin clk registers
#define CLK_VIN_SRC_CTRL		    0x188
#define CLK_ISP0_AXI_CTRL		    0x190
#define CLK_ISP0NOC_AXI_CTRL	    0x194
#define CLK_ISPSLV_AXI_CTRL		    0x198
#define CLK_ISP1_AXI_CTRL		    0x1A0
#define CLK_ISP1NOC_AXI_CTRL	    0x1A4
#define CLK_VIN_AXI		            0x1AC
#define CLK_VINNOC_AXI		        0x1B0

//isp clk registers
#define CLK_DPHY_CFGCLK_ISPCORE_2X_CTRL    0x00
#define CLK_DPHY_REFCLK_ISPCORE_2X_CTRL    0x04
#define CLK_DPHY_TXCLKESC_IN_CTRL          0x08
#define CLK_MIPI_RX0_PXL_CTRL       0x0c
#define CLK_MIPI_RX1_PXL_CTRL       0x10
#define CLK_MIPI_RX0_PXL_0_CTRL     0X14
#define CLK_MIPI_RX0_PXL_1_CTRL     0X18
#define CLK_MIPI_RX0_PXL_2_CTRL     0X1C
#define CLK_MIPI_RX0_PXL_3_CTRL     0X20
#define CLK_MIPI_RX0_SYS0_CTRL      0x24
#define CLK_MIPI_RX1_PXL_0_CTRL     0X28
#define CLK_MIPI_RX1_PXL_1_CTRL     0X2C
#define CLK_MIPI_RX1_PXL_2_CTRL     0X30
#define CLK_MIPI_RX1_PXL_3_CTRL     0X34
#define CLK_MIPI_RX1_SYS1_CTRL      0x38
#define CLK_ISP0_CTRL               0x3c
#define CLK_ISP0_2X_CTRL            0x40
#define CLK_ISP0_MIPI_CTRL          0x44
#define CLK_C_ISP0_CTRL             0x64
#define CLK_ISP1_CTRL               0x48
#define CLK_ISP1_2X_CTRL            0x4C
#define CLK_ISP1_MIPI_CTRL          0x50
#define CLK_C_ISP1_CTRL             0x68
#define CLK_CSI2RX0_APB_CTRL        0x58


#define CLK_VIN_AXI_WR_CTRL         0x5C

#define SOFTWARE_RESET_ASSERT0		0x0
#define SOFTWARE_RESET_ASSERT1		0x4
#define SOFTWARE_RESET_STATUS		0x4

#define IOPAD_REG81		        0x144
#define IOPAD_REG82		        0x148
#define IOPAD_REG83		        0x14C
#define IOPAD_REG84		        0x150
#define IOPAD_REG85		        0x154
#define IOPAD_REG86		        0x158
#define IOPAD_REG87	            0x15C
#define IOPAD_REG88	            0x160
#define IOPAD_REG89	            0x164

//sys control REG DEFINE
#define SYSCTRL_REG4	            0x10
#define SYSCTRL_DPHY_CTRL	        0x14
#define SYSCTRL_VIN_AXI_CTRL	    0x18
#define SYSCTRL_VIN_WR_START_ADDR	0x28
#define SYSCTRL_VIN_RD_END_ADDR	    0x2C
#define SYSCTRL_VIN_WR_PIX_TOTAL	0x30
#define SYSCTRL_VIN_RD_PIX_TOTAL	0x34
#define SYSCTRL_VIN_RW_CTRL	        0x38
#define SYSCTRL_VIN_SRC_CHAN_SEL	0x3C
#define SYSCTRL_VIN_SRC_DW_SEL	    0x40
#define SYSCTRL_VIN_RD_VBLANK	    0x44
#define SYSCTRL_VIN_RD_VEND	        0x48
#define SYSCTRL_VIN_RD_HBLANK	    0x4C
#define SYSCTRL_VIN_RD_HEND	        0x50
#define SYSCTRL_VIN_INTP_CTRL	    0x54

#define ISP_NO_SCALE_ENABLE     (0x1<<20)
#define ISP_MULTI_FRAME_ENABLE  (0x1<<17)
#define ISP_SS0_ENABLE          (0x1<<11)
#define ISP_SS1_ENABLE          (0x1<<12)
#define ISP_RESET               (0x1<<1)
#define ISP_ENBALE              (0x1)



 //ISP REG DEFINE
#define ISP_REG_DVP_POLARITY_CFG            0x00000014
#define ISP_REG_RAW_FORMAT_CFG              0x00000018
#define ISP_REG_CFA_MODE                    0x00000A1C
#define ISP_REG_PIC_CAPTURE_START_CFG       0x0000001C
#define ISP_REG_PIC_CAPTURE_END_CFG         0x00000020
#define ISP_REG_PIPELINE_XY_SIZE            0x00000A0C
#define ISP_REG_Y_PLANE_START_ADDR          0x00000A80
#define ISP_REG_UV_PLANE_START_ADDR         0x00000A84
#define ISP_REG_STRIDE                      0x00000A88
#define ISP_REG_PIXEL_COORDINATE_GEN        0x00000A8C
#define ISP_REG_PIXEL_AXI_CONTROL           0x00000A90
#define ISP_REG_SS_AXI_CONTROL              0x00000AC4
#define ISP_REG_RGB_TO_YUV_COVERSION0       0x00000E40
#define ISP_REG_RGB_TO_YUV_COVERSION1       0x00000E44
#define ISP_REG_RGB_TO_YUV_COVERSION2       0x00000E48
#define ISP_REG_RGB_TO_YUV_COVERSION3       0x00000E4C
#define ISP_REG_RGB_TO_YUV_COVERSION4       0x00000E50
#define ISP_REG_RGB_TO_YUV_COVERSION5       0x00000E54
#define ISP_REG_RGB_TO_YUV_COVERSION6       0x00000E58
#define ISP_REG_RGB_TO_YUV_COVERSION7       0x00000E5C
#define ISP_REG_RGB_TO_YUV_COVERSION8       0x00000E60
#define ISP_REG_CIS_MODULE_CFG              0x00000010
#define ISP_REG_ISP_CTRL_1                  0x00000A08
#define ISP_REG_ISP_CTRL_0                  0x00000A00
#define ISP_REG_DC_AXI_ID                   0x00000044
#define ISP_REG_CSI_INPUT_EN_AND_STATUS     0x00000000

//CSI registers
#define DEVICE_CONFIG           0x00
#define SOFT_RESET              0x04
#define STATIC_CFG              0x08
#define ERROR_BYPASS_CFG        0x10
#define MONITOR_IRQS            0x18
#define MONITOR_IRQS_MASK_CFG   0x1c
#define INFO_IRQS               0x20
#define INFO_IRQS_MASK_CFG      0x24
#define ERROR_IRQS              0x28
#define ERROR_IRQS_MASK_CFG     0x2c
#define DPHY_LANE_CONTROL       0x40
#define DPHY_STATUS             0x48
#define DPHY_ERR_STATUS_IRQ     0x4C
#define DPHY_ERR_IRQ_MASK_CFG   0x50
#define INTEGRATION_DEBUG       0x60
#define ERROR_DEBUG             0x74

#define STREAM0_CTRL            0x100
#define STREAM0_STATUS          0x104
#define STREAM0_DATA_CFG        0x108
#define STREAM0_CFG             0x10c
#define STREAM0_MONITOR_CTRL    0x110
#define STREAM0_MONITOR_FRAME   0x114
#define STREAM0_MONITOR_LB      0x118
#define STREAM0_TIMER           0x11c
#define STREAM0_FCC_CFG         0x120
#define STREAM0_FCC_CTRL        0x124
#define STREAM0_FIFO_FILL_LVL   0x128

typedef enum
{
    DT_RAW6  = 0x28,
    DT_RAW7  = 0x29,
    DT_RAW8  = 0x2a,
    DT_RAW10 = 0x2b,
    DT_RAW12 = 0x2c,
    DT_RAW14 = 0x2d,
} mipicam_data_type_t;


enum VIN_SOURCE_FORMAT {
	SRC_COLORBAR_VIN_ISP = 0,
	SRC_DVP_SENSOR_VIN,
	SRC_DVP_SENSOR_VIN_ISP,//need replace sensor
	SRC_CSI2RX_VIN_ISP,
	SRC_DVP_SENSOR_VIN_OV5640,
};

struct reg_name {
	char name[10];
};

typedef struct
{
    int dlane_nb;
    int dlane_map[4];
    int dlane_en[4];
    int dlane_pn_swap[4];
    int clane_nb;
    int clane_map[2];
    int clane_pn_swap[2];
} csi2rx_dphy_cfg_t;

typedef struct
{
    int lane_nb;
    int dlane_map[4];
    int dt;
    int hsize;
    int vsize;
} csi2rx_cfg_t;


typedef struct
{
    int mipi_id, w, h, dt, bpp, fps,lane;
	u8  clane_swap;
    u8  clane_pn_swap;
    u8  dlane_swap[4];
    u8  dlane_pn_swap[4];
} csi_format;

struct vin_params {
	void *paddr;
	unsigned long size;
};

struct vin_buf {
	void *vaddr;
	dma_addr_t paddr;
	u32 size;
};

struct vin_framesize {
	u32 width;
	u32 height;
};

struct vin_format {
	enum VIN_SOURCE_FORMAT format;
	u8 fps;
};

struct stf_vin_dev {
	/* Protects the access of variables shared within the interrupt */
	spinlock_t irqlock;
	int irq;
	struct device *dev;
	struct cdev vin_cdev;
	void __iomem *base;
	void __iomem *mipi0_base;
	void __iomem *clkgen_base;
	void __iomem *rstgen_base;
	void __iomem *mipi1_base;
	void __iomem *sysctrl_base;
	void __iomem *isp_isp0_base;
	void __iomem *isp_isp1_base;
	void __iomem *vin_top_clkgen_base;
	void __iomem *vin_top_rstgen_base;
	void __iomem *vin_top_iopad_base;

	struct vin_framesize frame;
	struct vin_format format;
	bool isp0;
	bool isp1;
	int isp0_irq;
	int isp1_irq;
	u32 major;
	struct vin_buf buf;

	wait_queue_head_t wq;
	bool condition;
	int odd;

	csi_format csi_fmt;
};

extern int vin_notifier_register(struct notifier_block *nb);
extern void vin_notifier_unregister(struct notifier_block *nb);
extern int vin_notifier_call(unsigned long e, void *v);
#endif