Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / staging / media / davinci_vpfe / dm365_resizer.h
1 /*
2  * Copyright (C) 2012 Texas Instruments Inc
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation version 2.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16  *
17  * Contributors:
18  *      Manjunath Hadli <manjunath.hadli@ti.com>
19  *      Prabhakar Lad <prabhakar.lad@ti.com>
20  */
21
22 #ifndef _DAVINCI_VPFE_DM365_RESIZER_H
23 #define _DAVINCI_VPFE_DM365_RESIZER_H
24
25 enum resizer_oper_mode {
26         RESIZER_MODE_CONTINIOUS = 0,
27         RESIZER_MODE_ONE_SHOT = 1,
28 };
29
30 struct f_div_pass {
31         unsigned int o_hsz;
32         unsigned int i_hps;
33         unsigned int h_phs;
34         unsigned int src_hps;
35         unsigned int src_hsz;
36 };
37
38 #define MAX_PASSES              2
39
40 struct f_div_param {
41         unsigned char en;
42         unsigned int num_passes;
43         struct f_div_pass pass[MAX_PASSES];
44 };
45
46 /* Resizer Rescale Parameters*/
47 struct resizer_scale_param {
48         bool h_flip;
49         bool v_flip;
50         bool cen;
51         bool yen;
52         unsigned short i_vps;
53         unsigned short i_hps;
54         unsigned short o_vsz;
55         unsigned short o_hsz;
56         unsigned short v_phs_y;
57         unsigned short v_phs_c;
58         unsigned short v_dif;
59         /* resize method - Luminance */
60         enum vpfe_rsz_intp_t v_typ_y;
61         /* resize method - Chrominance */
62         enum vpfe_rsz_intp_t v_typ_c;
63         /* vertical lpf intensity - Luminance */
64         unsigned char v_lpf_int_y;
65         /* vertical lpf intensity - Chrominance */
66         unsigned char v_lpf_int_c;
67         unsigned short h_phs;
68         unsigned short h_dif;
69         /* resize method - Luminance */
70         enum vpfe_rsz_intp_t h_typ_y;
71         /* resize method - Chrominance */
72         enum vpfe_rsz_intp_t h_typ_c;
73         /* horizontal lpf intensity - Luminance */
74         unsigned char h_lpf_int_y;
75         /* horizontal lpf intensity - Chrominance */
76         unsigned char h_lpf_int_c;
77         bool dscale_en;
78         enum vpfe_rsz_down_scale_ave_sz h_dscale_ave_sz;
79         enum vpfe_rsz_down_scale_ave_sz v_dscale_ave_sz;
80         /* store the calculated frame division parameter */
81         struct f_div_param f_div;
82 };
83
84 enum resizer_rgb_t {
85         OUTPUT_32BIT,
86         OUTPUT_16BIT
87 };
88
89 enum resizer_rgb_msk_t {
90         NOMASK = 0,
91         MASKLAST2 = 1,
92 };
93
94 /* Resizer RGB Conversion Parameters */
95 struct resizer_rgb {
96         bool rgb_en;
97         enum resizer_rgb_t rgb_typ;
98         enum resizer_rgb_msk_t rgb_msk0;
99         enum resizer_rgb_msk_t rgb_msk1;
100         unsigned int rgb_alpha_val;
101 };
102
103 /* Resizer External Memory Parameters */
104 struct rsz_ext_mem_param {
105         unsigned int rsz_sdr_oft_y;
106         unsigned int rsz_sdr_ptr_s_y;
107         unsigned int rsz_sdr_ptr_e_y;
108         unsigned int rsz_sdr_oft_c;
109         unsigned int rsz_sdr_ptr_s_c;
110         unsigned int rsz_sdr_ptr_e_c;
111         /* offset to be added to buffer start when flipping for y/ycbcr */
112         unsigned int flip_ofst_y;
113         /* offset to be added to buffer start when flipping for c */
114         unsigned int flip_ofst_c;
115         /* c offset for YUV 420SP */
116         unsigned int c_offset;
117         /* User Defined Y offset for YUV 420SP or YUV420ILE data */
118         unsigned int user_y_ofst;
119         /* User Defined C offset for YUV 420SP data */
120         unsigned int user_c_ofst;
121 };
122
123 enum rsz_data_source {
124         IPIPE_DATA,
125         IPIPEIF_DATA
126 };
127
128 enum rsz_src_img_fmt {
129         RSZ_IMG_422,
130         RSZ_IMG_420
131 };
132
133 enum rsz_dpaths_bypass_t {
134         BYPASS_OFF = 0,
135         BYPASS_ON = 1,
136 };
137
138 struct rsz_common_params {
139         unsigned int vps;
140         unsigned int vsz;
141         unsigned int hps;
142         unsigned int hsz;
143         /* 420 or 422 */
144         enum rsz_src_img_fmt src_img_fmt;
145         /* Y or C when src_fmt is 420, 0 - y, 1 - c */
146         unsigned char y_c;
147         /* flip raw or ycbcr */
148         unsigned char raw_flip;
149         /* IPIPE or IPIPEIF data */
150         enum rsz_data_source source;
151         enum rsz_dpaths_bypass_t passthrough;
152         unsigned char yuv_y_min;
153         unsigned char yuv_y_max;
154         unsigned char yuv_c_min;
155         unsigned char yuv_c_max;
156         bool rsz_seq_crv;
157         enum vpfe_chr_pos out_chr_pos;
158 };
159
160 struct resizer_params {
161         enum resizer_oper_mode oper_mode;
162         struct rsz_common_params rsz_common;
163         struct resizer_scale_param rsz_rsc_param[2];
164         struct resizer_rgb rsz2rgb[2];
165         struct rsz_ext_mem_param ext_mem_param[2];
166         bool rsz_en[2];
167         struct vpfe_rsz_config_params user_config;
168 };
169
170 #define ENABLE                  1
171 #define DISABLE                 (!ENABLE)
172
173 #define RESIZER_CROP_PAD_SINK           0
174 #define RESIZER_CROP_PAD_SOURCE         1
175 #define RESIZER_CROP_PAD_SOURCE2        2
176
177 #define RESIZER_CROP_PADS_NUM           3
178
179 enum resizer_crop_input_entity {
180         RESIZER_CROP_INPUT_NONE = 0,
181         RESIZER_CROP_INPUT_IPIPEIF = 1,
182         RESIZER_CROP_INPUT_IPIPE = 2,
183 };
184
185 enum resizer_crop_output_entity {
186         RESIZER_CROP_OUTPUT_NONE,
187         RESIZER_A,
188         RESIZER_B,
189 };
190
191 struct dm365_crop_resizer_device {
192         struct v4l2_subdev                      subdev;
193         struct media_pad                        pads[RESIZER_CROP_PADS_NUM];
194         struct v4l2_mbus_framefmt               formats[RESIZER_CROP_PADS_NUM];
195         enum resizer_crop_input_entity          input;
196         enum resizer_crop_output_entity         output;
197         enum resizer_crop_output_entity         output2;
198         struct vpfe_resizer_device              *rsz_device;
199 };
200
201 #define RESIZER_PAD_SINK                0
202 #define RESIZER_PAD_SOURCE              1
203
204 #define RESIZER_PADS_NUM                2
205
206 enum resizer_input_entity {
207         RESIZER_INPUT_NONE = 0,
208         RESIZER_INPUT_CROP_RESIZER = 1,
209 };
210
211 enum resizer_output_entity {
212         RESIZER_OUTPUT_NONE = 0,
213         RESIZER_OUPUT_MEMORY = 1,
214 };
215
216 struct dm365_resizer_device {
217         struct v4l2_subdev              subdev;
218         struct media_pad                pads[RESIZER_PADS_NUM];
219         struct v4l2_mbus_framefmt       formats[RESIZER_PADS_NUM];
220         enum resizer_input_entity       input;
221         enum resizer_output_entity      output;
222         struct vpfe_video_device        video_out;
223         struct vpfe_resizer_device      *rsz_device;
224 };
225
226 struct vpfe_resizer_device {
227         struct dm365_crop_resizer_device        crop_resizer;
228         struct dm365_resizer_device             resizer_a;
229         struct dm365_resizer_device             resizer_b;
230         struct resizer_params                   config;
231         void __iomem *base_addr;
232 };
233
234 int vpfe_resizer_init(struct vpfe_resizer_device *vpfe_rsz,
235                       struct platform_device *pdev);
236 int vpfe_resizer_register_entities(struct vpfe_resizer_device *vpfe_rsz,
237                                    struct v4l2_device *v4l2_dev);
238 void vpfe_resizer_unregister_entities(struct vpfe_resizer_device *vpfe_rsz);
239 void vpfe_resizer_cleanup(struct vpfe_resizer_device *vpfe_rsz,
240                           struct platform_device *pdev);
241 void vpfe_resizer_buffer_isr(struct vpfe_resizer_device *resizer);
242 void vpfe_resizer_dma_isr(struct vpfe_resizer_device *resizer);
243
244 #endif          /* _DAVINCI_VPFE_DM365_RESIZER_H */