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