aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/media/davinci_vpfe/dm365_resizer.h
blob: 00e64b0d0295eda8b0c3214da9deea364110f2dc (plain) (blame)
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
/*
 * Copyright (C) 2012 Texas Instruments Inc
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation version 2.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 *
 * Contributors:
 *      Manjunath Hadli <manjunath.hadli@ti.com>
 *      Prabhakar Lad <prabhakar.lad@ti.com>
 */

#ifndef _DAVINCI_VPFE_DM365_RESIZER_H
#define _DAVINCI_VPFE_DM365_RESIZER_H

enum resizer_oper_mode {
	RESIZER_MODE_CONTINIOUS = 0,
	RESIZER_MODE_ONE_SHOT = 1,
};

struct f_div_pass {
	unsigned int o_hsz;
	unsigned int i_hps;
	unsigned int h_phs;
	unsigned int src_hps;
	unsigned int src_hsz;
};

#define MAX_PASSES		2

struct f_div_param {
	unsigned char en;
	unsigned int num_passes;
	struct f_div_pass pass[MAX_PASSES];
};

/* Resizer Rescale Parameters*/
struct resizer_scale_param {
	bool h_flip;
	bool v_flip;
	bool cen;
	bool yen;
	unsigned short i_vps;
	unsigned short i_hps;
	unsigned short o_vsz;
	unsigned short o_hsz;
	unsigned short v_phs_y;
	unsigned short v_phs_c;
	unsigned short v_dif;
	/* resize method - Luminance */
	enum vpfe_rsz_intp_t v_typ_y;
	/* resize method - Chrominance */
	enum vpfe_rsz_intp_t v_typ_c;
	/* vertical lpf intensity - Luminance */
	unsigned char v_lpf_int_y;
	/* vertical lpf intensity - Chrominance */
	unsigned char v_lpf_int_c;
	unsigned short h_phs;
	unsigned short h_dif;
	/* resize method - Luminance */
	enum vpfe_rsz_intp_t h_typ_y;
	/* resize method - Chrominance */
	enum vpfe_rsz_intp_t h_typ_c;
	/* horizontal lpf intensity - Luminance */
	unsigned char h_lpf_int_y;
	/* horizontal lpf intensity - Chrominance */
	unsigned char h_lpf_int_c;
	bool dscale_en;
	enum vpfe_rsz_down_scale_ave_sz h_dscale_ave_sz;
	enum vpfe_rsz_down_scale_ave_sz v_dscale_ave_sz;
	/* store the calculated frame division parameter */
	struct f_div_param f_div;
};

enum resizer_rgb_t {
	OUTPUT_32BIT,
	OUTPUT_16BIT
};

enum resizer_rgb_msk_t {
	NOMASK = 0,
	MASKLAST2 = 1,
};

/* Resizer RGB Conversion Parameters */
struct resizer_rgb {
	bool rgb_en;
	enum resizer_rgb_t rgb_typ;
	enum resizer_rgb_msk_t rgb_msk0;
	enum resizer_rgb_msk_t rgb_msk1;
	unsigned int rgb_alpha_val;
};

/* Resizer External Memory Parameters */
struct rsz_ext_mem_param {
	unsigned int rsz_sdr_oft_y;
	unsigned int rsz_sdr_ptr_s_y;
	unsigned int rsz_sdr_ptr_e_y;
	unsigned int rsz_sdr_oft_c;
	unsigned int rsz_sdr_ptr_s_c;
	unsigned int rsz_sdr_ptr_e_c;
	/* offset to be added to buffer start when flipping for y/ycbcr */
	unsigned int flip_ofst_y;
	/* offset to be added to buffer start when flipping for c */
	unsigned int flip_ofst_c;
	/* c offset for YUV 420SP */
	unsigned int c_offset;
	/* User Defined Y offset for YUV 420SP or YUV420ILE data */
	unsigned int user_y_ofst;
	/* User Defined C offset for YUV 420SP data */
	unsigned int user_c_ofst;
};

enum rsz_data_source {
	IPIPE_DATA,
	IPIPEIF_DATA
};

enum rsz_src_img_fmt {
	RSZ_IMG_422,
	RSZ_IMG_420
};

enum rsz_dpaths_bypass_t {
	BYPASS_OFF = 0,
	BYPASS_ON = 1,
};

struct rsz_common_params {
	unsigned int vps;
	unsigned int vsz;
	unsigned int hps;
	unsigned int hsz;
	/* 420 or 422 */
	enum rsz_src_img_fmt src_img_fmt;
	/* Y or C when src_fmt is 420, 0 - y, 1 - c */
	unsigned char y_c;
	/* flip raw or ycbcr */
	unsigned char raw_flip;
	/* IPIPE or IPIPEIF data */
	enum rsz_data_source source;
	enum rsz_dpaths_bypass_t passthrough;
	unsigned char yuv_y_min;
	unsigned char yuv_y_max;
	unsigned char yuv_c_min;
	unsigned char yuv_c_max;
	bool rsz_seq_crv;
	enum vpfe_chr_pos out_chr_pos;
};

struct resizer_params {
	enum resizer_oper_mode oper_mode;
	struct rsz_common_params rsz_common;
	struct resizer_scale_param rsz_rsc_param[2];
	struct resizer_rgb rsz2rgb[2];
	struct rsz_ext_mem_param ext_mem_param[2];
	bool rsz_en[2];
	struct vpfe_rsz_config_params user_config;
};

#define ENABLE			1
#define DISABLE			(!ENABLE)

#define RESIZER_CROP_PAD_SINK		0
#define RESIZER_CROP_PAD_SOURCE		1
#define RESIZER_CROP_PAD_SOURCE2	2

#define RESIZER_CROP_PADS_NUM		3

enum resizer_crop_input_entity {
	RESIZER_CROP_INPUT_NONE = 0,
	RESIZER_CROP_INPUT_IPIPEIF = 1,
	RESIZER_CROP_INPUT_IPIPE = 2,
};

enum resizer_crop_output_entity {
	RESIZER_CROP_OUTPUT_NONE,
	RESIZER_A,
	RESIZER_B,
};

struct dm365_crop_resizer_device {
	struct v4l2_subdev			subdev;
	struct media_pad			pads[RESIZER_CROP_PADS_NUM];
	struct v4l2_mbus_framefmt		formats[RESIZER_CROP_PADS_NUM];
	enum resizer_crop_input_entity		input;
	enum resizer_crop_output_entity		output;
	enum resizer_crop_output_entity		output2;
	struct vpfe_resizer_device		*rsz_device;
};

#define RESIZER_PAD_SINK		0
#define RESIZER_PAD_SOURCE		1

#define RESIZER_PADS_NUM		2

enum resizer_input_entity {
	RESIZER_INPUT_NONE = 0,
	RESIZER_INPUT_CROP_RESIZER = 1,
};

enum resizer_output_entity {
	RESIZER_OUTPUT_NONE = 0,
	RESIZER_OUTPUT_MEMORY = 1,
};

struct dm365_resizer_device {
	struct v4l2_subdev		subdev;
	struct media_pad		pads[RESIZER_PADS_NUM];
	struct v4l2_mbus_framefmt	formats[RESIZER_PADS_NUM];
	enum resizer_input_entity	input;
	enum resizer_output_entity	output;
	struct vpfe_video_device	video_out;
	struct vpfe_resizer_device	*rsz_device;
};

struct vpfe_resizer_device {
	struct dm365_crop_resizer_device	crop_resizer;
	struct dm365_resizer_device		resizer_a;
	struct dm365_resizer_device		resizer_b;
	struct resizer_params			config;
	void __iomem *base_addr;
};

int vpfe_resizer_init(struct vpfe_resizer_device *vpfe_rsz,
		      struct platform_device *pdev);
int vpfe_resizer_register_entities(struct vpfe_resizer_device *vpfe_rsz,
				   struct v4l2_device *v4l2_dev);
void vpfe_resizer_unregister_entities(struct vpfe_resizer_device *vpfe_rsz);
void vpfe_resizer_cleanup(struct vpfe_resizer_device *vpfe_rsz,
			  struct platform_device *pdev);
void vpfe_resizer_buffer_isr(struct vpfe_resizer_device *resizer);
void vpfe_resizer_dma_isr(struct vpfe_resizer_device *resizer);

#endif		/* _DAVINCI_VPFE_DM365_RESIZER_H */