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