Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / staging / media / davinci_vpfe / dm365_resizer.h
diff --git a/kernel/drivers/staging/media/davinci_vpfe/dm365_resizer.h b/kernel/drivers/staging/media/davinci_vpfe/dm365_resizer.h
new file mode 100644 (file)
index 0000000..93b0f44
--- /dev/null
@@ -0,0 +1,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_OUPUT_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 */