summaryrefslogtreecommitdiff
path: root/drivers/media/video/mxc/capture/mx27_prp.h
blob: e32e9029daffdd7fa9f94fce242ef29ec0f72b92 (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
308
309
310
/*
 * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
 */

/*
 * 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
 */

/*!
 * @file mx27_prp.h
 *
 * @brief Header file for MX27 V4L2 capture driver
 *
 * @ingroup MXC_V4L2_CAPTURE
 */
#ifndef __MX27_PRP_H__
#define __MX27_PRP_H__

#define PRP_REG(ofs)	(IO_ADDRESS(EMMA_BASE_ADDR) + ofs)

/* Register definitions of PrP */
#define PRP_CNTL			PRP_REG(0x00)
#define PRP_INTRCNTL	 		PRP_REG(0x04)
#define PRP_INTRSTATUS			PRP_REG(0x08)
#define PRP_SOURCE_Y_PTR		PRP_REG(0x0C)
#define PRP_SOURCE_CB_PTR		PRP_REG(0x10)
#define PRP_SOURCE_CR_PTR		PRP_REG(0x14)
#define PRP_DEST_RGB1_PTR		PRP_REG(0x18)
#define PRP_DEST_RGB2_PTR		PRP_REG(0x1C)
#define PRP_DEST_Y_PTR			PRP_REG(0x20)
#define PRP_DEST_CB_PTR			PRP_REG(0x24)
#define PRP_DEST_CR_PTR			PRP_REG(0x28)
#define PRP_SOURCE_FRAME_SIZE  		PRP_REG(0x2C)
#define PRP_CH1_LINE_STRIDE		PRP_REG(0x30)
#define PRP_SRC_PIXEL_FORMAT_CNTL	PRP_REG(0x34)
#define PRP_CH1_PIXEL_FORMAT_CNTL	PRP_REG(0x38)
#define PRP_CH1_OUT_IMAGE_SIZE		PRP_REG(0x3C)
#define PRP_CH2_OUT_IMAGE_SIZE		PRP_REG(0x40)
#define PRP_SOURCE_LINE_STRIDE		PRP_REG(0x44)
#define PRP_CSC_COEF_012		PRP_REG(0x48)
#define PRP_CSC_COEF_345		PRP_REG(0x4C)
#define PRP_CSC_COEF_678		PRP_REG(0x50)
#define PRP_CH1_RZ_HORI_COEF1		PRP_REG(0x54)
#define PRP_CH1_RZ_HORI_COEF2		PRP_REG(0x58)
#define PRP_CH1_RZ_HORI_VALID		PRP_REG(0x5C)
#define PRP_CH1_RZ_VERT_COEF1		PRP_REG(0x60)
#define PRP_CH1_RZ_VERT_COEF2		PRP_REG(0x64)
#define PRP_CH1_RZ_VERT_VALID		PRP_REG(0x68)
#define PRP_CH2_RZ_HORI_COEF1		PRP_REG(0x6C)
#define PRP_CH2_RZ_HORI_COEF2		PRP_REG(0x70)
#define PRP_CH2_RZ_HORI_VALID		PRP_REG(0x74)
#define PRP_CH2_RZ_VERT_COEF1		PRP_REG(0x78)
#define PRP_CH2_RZ_VERT_COEF2		PRP_REG(0x7C)
#define PRP_CH2_RZ_VERT_VALID		PRP_REG(0x80)

#define B_SET(b)			(1 << (b))

/* Bit definitions for PrP control register */
#define PRP_CNTL_RSTVAL			0x28
#define PRP_CNTL_CH1EN			B_SET(0)
#define PRP_CNTL_CH2EN			B_SET(1)
#define PRP_CNTL_CSI			B_SET(2)
#define PRP_CNTL_IN_32			B_SET(3)
#define PRP_CNTL_IN_RGB			B_SET(4)
#define PRP_CNTL_IN_YUV420		0
#define PRP_CNTL_IN_YUV422		PRP_CNTL_IN_32
#define PRP_CNTL_IN_RGB16		PRP_CNTL_IN_RGB
#define PRP_CNTL_IN_RGB32		(PRP_CNTL_IN_RGB | PRP_CNTL_IN_32)
#define PRP_CNTL_CH1_RGB8		0
#define PRP_CNTL_CH1_RGB16		B_SET(5)
#define PRP_CNTL_CH1_RGB32		B_SET(6)
#define PRP_CNTL_CH1_YUV422		(B_SET(5) | B_SET(6))
#define PRP_CNTL_CH2_YUV420		0
#define PRP_CNTL_CH2_YUV422		B_SET(7)
#define PRP_CNTL_CH2_YUV444		B_SET(8)
#define PRP_CNTL_CH1_LOOP		B_SET(9)
#define PRP_CNTL_CH2_LOOP		B_SET(10)
#define PRP_CNTL_AUTODROP		B_SET(11)
#define PRP_CNTL_RST			B_SET(12)
#define PRP_CNTL_CNTREN			B_SET(13)
#define PRP_CNTL_WINEN			B_SET(14)
#define PRP_CNTL_UNCHAIN		B_SET(15)
#define PRP_CNTL_IN_SKIP_NONE		0
#define PRP_CNTL_IN_SKIP_1_2		B_SET(16)
#define PRP_CNTL_IN_SKIP_1_3		B_SET(17)
#define PRP_CNTL_IN_SKIP_2_3		(B_SET(16) | B_SET(17))
#define PRP_CNTL_IN_SKIP_1_4		B_SET(18)
#define PRP_CNTL_IN_SKIP_3_4		(B_SET(16) | B_SET(18))
#define PRP_CNTL_IN_SKIP_2_5		(B_SET(17) | B_SET(18))
#define PRP_CNTL_IN_SKIP_3_5		(B_SET(16) | B_SET(17) | B_SET(18))
#define PRP_CNTL_CH1_SKIP_NONE		0
#define PRP_CNTL_CH1_SKIP_1_2		B_SET(19)
#define PRP_CNTL_CH1_SKIP_1_3		B_SET(20)
#define PRP_CNTL_CH1_SKIP_2_3		(B_SET(19) | B_SET(20))
#define PRP_CNTL_CH1_SKIP_1_4		B_SET(21)
#define PRP_CNTL_CH1_SKIP_3_4		(B_SET(19) | B_SET(21))
#define PRP_CNTL_CH1_SKIP_2_5		(B_SET(20) | B_SET(21))
#define PRP_CNTL_CH1_SKIP_3_5		(B_SET(19) | B_SET(20) | B_SET(21))
#define PRP_CNTL_CH2_SKIP_NONE		0
#define PRP_CNTL_CH2_SKIP_1_2		B_SET(22)
#define PRP_CNTL_CH2_SKIP_1_3		B_SET(23)
#define PRP_CNTL_CH2_SKIP_2_3		(B_SET(22) | B_SET(23))
#define PRP_CNTL_CH2_SKIP_1_4		B_SET(24)
#define PRP_CNTL_CH2_SKIP_3_4		(B_SET(22) | B_SET(24))
#define PRP_CNTL_CH2_SKIP_2_5		(B_SET(23) | B_SET(24))
#define PRP_CNTL_CH2_SKIP_3_5		(B_SET(22) | B_SET(23) | B_SET(24))
#define PRP_CNTL_FIFO_I128		0
#define PRP_CNTL_FIFO_I96		B_SET(25)
#define PRP_CNTL_FIFO_I64		B_SET(26)
#define PRP_CNTL_FIFO_I32		(B_SET(25) | B_SET(26))
#define PRP_CNTL_FIFO_O64		0
#define PRP_CNTL_FIFO_O48		B_SET(27)
#define PRP_CNTL_FIFO_O32		B_SET(28)
#define PRP_CNTL_FIFO_O16		(B_SET(27) | B_SET(28))
#define PRP_CNTL_CH2B1			B_SET(29)
#define PRP_CNTL_CH2B2			B_SET(30)
#define PRP_CNTL_CH2_FLOWEN		B_SET(31)

/* Bit definitions for PrP interrupt control register */
#define PRP_INTRCNTL_RDERR		B_SET(0)
#define PRP_INTRCNTL_CH1WERR		B_SET(1)
#define PRP_INTRCNTL_CH2WERR		B_SET(2)
#define PRP_INTRCNTL_CH1FC		B_SET(3)
#define PRP_INTRCNTL_CH2FC		B_SET(5)
#define PRP_INTRCNTL_LBOVF		B_SET(7)
#define PRP_INTRCNTL_CH2OVF		B_SET(8)

/* Bit definitions for PrP interrupt status register */
#define PRP_INTRSTAT_RDERR		B_SET(0)
#define PRP_INTRSTAT_CH1WERR		B_SET(1)
#define PRP_INTRSTAT_CH2WERR		B_SET(2)
#define PRP_INTRSTAT_CH2BUF2		B_SET(3)
#define PRP_INTRSTAT_CH2BUF1		B_SET(4)
#define PRP_INTRSTAT_CH1BUF2		B_SET(5)
#define PRP_INTRSTAT_CH1BUF1		B_SET(6)
#define PRP_INTRSTAT_LBOVF		B_SET(7)
#define PRP_INTRSTAT_CH2OVF		B_SET(8)

#define PRP_CHANNEL_1		0x1
#define PRP_CHANNEL_2		0x2

/* PRP-CSI config */
#define PRP_CSI_EN		0x80
#define PRP_CSI_LOOP		(0x40 | PRP_CSI_EN)
#define PRP_CSI_IRQ_FRM		(0x08 | PRP_CSI_LOOP)
#define PRP_CSI_IRQ_CH1ERR	(0x10 | PRP_CSI_LOOP)
#define PRP_CSI_IRQ_CH2ERR	(0x20 | PRP_CSI_LOOP)
#define PRP_CSI_IRQ_ALL		(0x38 | PRP_CSI_LOOP)
#define PRP_CSI_SKIP_NONE	0
#define PRP_CSI_SKIP_1OF2	1
#define PRP_CSI_SKIP_1OF3	2
#define PRP_CSI_SKIP_2OF3	3
#define PRP_CSI_SKIP_1OF4	4
#define PRP_CSI_SKIP_3OF4	5
#define PRP_CSI_SKIP_2OF5	6
#define PRP_CSI_SKIP_4OF5	7

#define PRP_PIXIN_RGB565	0x2CA00565
#define PRP_PIXIN_RGB888	0x41000888
#define PRP_PIXIN_YUV420	0
#define PRP_PIXIN_YUYV		0x22000888
#define PRP_PIXIN_YVYU		0x20100888
#define PRP_PIXIN_UYVY		0x03080888
#define PRP_PIXIN_VYUY		0x01180888
#define PRP_PIXIN_YUV422	0x62080888

#define PRP_PIX1_RGB332		0x14400322
#define PRP_PIX1_RGB565		0x2CA00565
#define PRP_PIX1_RGB888		0x41000888
#define PRP_PIX1_YUYV		0x62000888
#define PRP_PIX1_YVYU		0x60100888
#define PRP_PIX1_UYVY		0x43080888
#define PRP_PIX1_VYUY		0x41180888
#define PRP_PIX1_UNUSED		0

#define PRP_PIX2_YUV420		0
#define PRP_PIX2_YUV422		1
#define PRP_PIX2_YUV444		4
#define PRP_PIX2_UNUSED		8

#define PRP_ALGO_WIDTH_ANY	0
#define PRP_ALGO_HEIGHT_ANY	0
#define PRP_ALGO_WIDTH_BIL	1
#define PRP_ALGO_WIDTH_AVG	2
#define PRP_ALGO_HEIGHT_BIL	4
#define PRP_ALGO_HEIGHT_AVG	8
#define PRP_ALGO_BYPASS		0x10

typedef struct _emma_prp_ratio {
	unsigned short num;
	unsigned short den;
} emma_prp_ratio;

/*
 * The following definitions are for resizing. Definition values must not
 * be changed otherwise decision logic will be wrong.
 */
#define SCALE_RETRY	16	/* retry times if ratio is not supported */

#define BC_COEF		3
#define MAX_TBL		20
#define SZ_COEF		(1 << BC_COEF)

#define ALGO_AUTO	0
#define ALGO_BIL	1
#define ALGO_AVG	2

typedef struct {
	char tbl[20];		/* table entries */
	char len;		/* table length used */
	char algo;		/* ALGO_xxx */
	char ratio[20];		/* ratios used */
} scale_t;

/*
 * structure for prp scaling.
 * algorithm - bilinear or averaging for each axis
 * PRP_ALGO_WIDTH_x | PRP_ALGO_HEIGHT_x | PRP_ALGO_BYPASS
 * PRP_ALGO_BYPASS - Ch1 will not use Ch2 scaling with this flag
 */
typedef struct _emma_prp_scale {
	unsigned char algo;
	emma_prp_ratio width;
	emma_prp_ratio height;
} emma_prp_scale;

typedef struct emma_prp_cfg {
	unsigned int in_pix;	/* PRP_PIXIN_xxx */
	unsigned short in_width;	/* image width, 32 - 2044 */
	unsigned short in_height;	/* image height, 32 - 2044 */
	unsigned char in_csi;	/* PRP_CSI_SKIP_x | PRP_CSI_LOOP */
	unsigned short in_line_stride;	/* in_line_stride and in_line_skip */
	unsigned short in_line_skip;	/* allow cropping from CSI */
	unsigned int in_ptr;	/* bus address */
	/*
	 * in_csc[9] = 1 -> Y-16
	 * if in_csc[1..9] == 0
	 *      in_csc[0] represents YUV range 0-3 = A0,A1,B0,B1;
	 * else
	 *      in_csc[0..9] represents either format
	 */
	unsigned short in_csc[10];

	unsigned char ch2_pix;	/* PRP_PIX2_xxx */
	emma_prp_scale ch2_scale;	/* resizing paramters */
	unsigned short ch2_width;	/* 4-2044, 0 = scaled */
	unsigned short ch2_height;	/* 4-2044, 0 = scaled */
	unsigned int ch2_ptr;	/* bus addr */
	unsigned int ch2_ptr2;	/* bus addr for 2nd buf (loop mode) */
	unsigned char ch2_csi;	/* PRP_CSI_SKIP_x | PRP_CSI_LOOP */

	unsigned int ch1_pix;	/* PRP_PIX1_xxx */
	emma_prp_scale ch1_scale;	/* resizing parameters */
	unsigned short ch1_width;	/* 4-2044, 0 = scaled */
	unsigned short ch1_height;	/* 4-2044, 0 = scaled */
	unsigned short ch1_stride;	/* 4-4088, 0 = ch1_width */
	unsigned int ch1_ptr;	/* bus addr */
	unsigned int ch1_ptr2;	/* bus addr for 2nd buf (loop mode) */
	unsigned char ch1_csi;	/* PRP_CSI_SKIP_x | PRP_CSI_LOOP */

	/*
	 * channel resizing coefficients
	 * scale[0] for channel 1 width
	 * scale[1] for channel 1 height
	 * scale[2] for channel 2 width
	 * scale[3] for channel 2 height
	 */
	scale_t scale[4];
} emma_prp_cfg;

int prphw_reset(void);
int prphw_enable(int channel);
int prphw_disable(int channel);
int prphw_inptr(emma_prp_cfg *);
int prphw_ch1ptr(emma_prp_cfg *);
int prphw_ch1ptr2(emma_prp_cfg *);
int prphw_ch2ptr(emma_prp_cfg *);
int prphw_ch2ptr2(emma_prp_cfg *);
int prphw_cfg(emma_prp_cfg *);
int prphw_isr(void);
void prphw_init(void);
void prphw_exit(void);

/*
 * scale	out	coefficient table
 * din		in	scale numerator
 * dout		in	scale denominator
 * inv		in	pre-scale dimension
 * vout		in/out	post-scale output dimension
 * pout		out	post-scale internal dimension [opt]
 * retry	in	retry times (round the output length) when need
 */
int prp_scale(scale_t * pscale, int din, int dout, int inv,
	      unsigned short *vout, unsigned short *pout, int retry);

int prp_init(void *dev_id);
void prp_exit(void *dev_id);
int prp_enc_select(void *data);
int prp_enc_deselect(void *data);
int prp_vf_select(void *data);
int prp_vf_deselect(void *data);
int prp_still_select(void *data);
int prp_still_deselect(void *data);

#endif				/* __MX27_PRP_H__ */