| /* |
| * 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_IPIPEIF_H |
| #define _DAVINCI_VPFE_DM365_IPIPEIF_H |
| |
| #include <linux/platform_device.h> |
| |
| #include <media/davinci/vpss.h> |
| #include <media/v4l2-ctrls.h> |
| #include <media/v4l2-subdev.h> |
| |
| #include "dm365_ipipeif_user.h" |
| #include "vpfe_video.h" |
| |
| /* IPIPE base specific types */ |
| enum ipipeif_data_shift { |
| IPIPEIF_BITS15_2 = 0, |
| IPIPEIF_BITS14_1 = 1, |
| IPIPEIF_BITS13_0 = 2, |
| IPIPEIF_BITS12_0 = 3, |
| IPIPEIF_BITS11_0 = 4, |
| IPIPEIF_BITS10_0 = 5, |
| IPIPEIF_BITS9_0 = 6, |
| }; |
| |
| enum ipipeif_clkdiv { |
| IPIPEIF_DIVIDE_HALF = 0, |
| IPIPEIF_DIVIDE_THIRD = 1, |
| IPIPEIF_DIVIDE_FOURTH = 2, |
| IPIPEIF_DIVIDE_FIFTH = 3, |
| IPIPEIF_DIVIDE_SIXTH = 4, |
| IPIPEIF_DIVIDE_EIGHTH = 5, |
| IPIPEIF_DIVIDE_SIXTEENTH = 6, |
| IPIPEIF_DIVIDE_THIRTY = 7, |
| }; |
| |
| enum ipipeif_pack_mode { |
| IPIPEIF_PACK_16_BIT = 0, |
| IPIPEIF_PACK_8_BIT = 1, |
| }; |
| |
| enum ipipeif_5_1_pack_mode { |
| IPIPEIF_5_1_PACK_16_BIT = 0, |
| IPIPEIF_5_1_PACK_8_BIT = 1, |
| IPIPEIF_5_1_PACK_8_BIT_A_LAW = 2, |
| IPIPEIF_5_1_PACK_12_BIT = 3 |
| }; |
| |
| enum ipipeif_input_source { |
| IPIPEIF_CCDC = 0, |
| IPIPEIF_SDRAM_RAW = 1, |
| IPIPEIF_CCDC_DARKFM = 2, |
| IPIPEIF_SDRAM_YUV = 3, |
| }; |
| |
| enum ipipeif_ialaw { |
| IPIPEIF_ALAW_OFF = 0, |
| IPIPEIF_ALAW_ON = 1, |
| }; |
| |
| enum ipipeif_input_src1 { |
| IPIPEIF_SRC1_PARALLEL_PORT = 0, |
| IPIPEIF_SRC1_SDRAM_RAW = 1, |
| IPIPEIF_SRC1_ISIF_DARKFM = 2, |
| IPIPEIF_SRC1_SDRAM_YUV = 3, |
| }; |
| |
| enum ipipeif_dfs_dir { |
| IPIPEIF_PORT_MINUS_SDRAM = 0, |
| IPIPEIF_SDRAM_MINUS_PORT = 1, |
| }; |
| |
| enum ipipeif_chroma_phase { |
| IPIPEIF_CBCR_Y = 0, |
| IPIPEIF_Y_CBCR = 1, |
| }; |
| |
| enum ipipeif_dpcm_type { |
| IPIPEIF_DPCM_8BIT_10BIT = 0, |
| IPIPEIF_DPCM_8BIT_12BIT = 1, |
| }; |
| |
| /* data shift for IPIPE 5.1 */ |
| enum ipipeif_5_1_data_shift { |
| IPIPEIF_5_1_BITS11_0 = 0, |
| IPIPEIF_5_1_BITS10_0 = 1, |
| IPIPEIF_5_1_BITS9_0 = 2, |
| IPIPEIF_5_1_BITS8_0 = 3, |
| IPIPEIF_5_1_BITS7_0 = 4, |
| IPIPEIF_5_1_BITS15_4 = 5, |
| }; |
| |
| #define IPIPEIF_PAD_SINK 0 |
| #define IPIPEIF_PAD_SOURCE 1 |
| |
| #define IPIPEIF_NUM_PADS 2 |
| |
| enum ipipeif_input_entity { |
| IPIPEIF_INPUT_NONE = 0, |
| IPIPEIF_INPUT_ISIF = 1, |
| IPIPEIF_INPUT_MEMORY = 2, |
| }; |
| |
| enum ipipeif_output_entity { |
| IPIPEIF_OUTPUT_NONE = 0, |
| IPIPEIF_OUTPUT_IPIPE = 1, |
| IPIPEIF_OUTPUT_RESIZER = 2, |
| }; |
| |
| struct vpfe_ipipeif_device { |
| struct v4l2_subdev subdev; |
| struct media_pad pads[IPIPEIF_NUM_PADS]; |
| struct v4l2_mbus_framefmt formats[IPIPEIF_NUM_PADS]; |
| enum ipipeif_input_entity input; |
| unsigned int output; |
| struct vpfe_video_device video_in; |
| struct v4l2_ctrl_handler ctrls; |
| void __iomem *ipipeif_base_addr; |
| struct ipipeif_params config; |
| int dpcm_predictor; |
| int gain; |
| }; |
| |
| /* IPIPEIF Register Offsets from the base address */ |
| #define IPIPEIF_ENABLE 0x00 |
| #define IPIPEIF_CFG1 0x04 |
| #define IPIPEIF_PPLN 0x08 |
| #define IPIPEIF_LPFR 0x0c |
| #define IPIPEIF_HNUM 0x10 |
| #define IPIPEIF_VNUM 0x14 |
| #define IPIPEIF_ADDRU 0x18 |
| #define IPIPEIF_ADDRL 0x1c |
| #define IPIPEIF_ADOFS 0x20 |
| #define IPIPEIF_RSZ 0x24 |
| #define IPIPEIF_GAIN 0x28 |
| |
| /* Below registers are available only on IPIPE 5.1 */ |
| #define IPIPEIF_DPCM 0x2c |
| #define IPIPEIF_CFG2 0x30 |
| #define IPIPEIF_INIRSZ 0x34 |
| #define IPIPEIF_OCLIP 0x38 |
| #define IPIPEIF_DTUDF 0x3c |
| #define IPIPEIF_CLKDIV 0x40 |
| #define IPIPEIF_DPC1 0x44 |
| #define IPIPEIF_DPC2 0x48 |
| #define IPIPEIF_DFSGVL 0x4c |
| #define IPIPEIF_DFSGTH 0x50 |
| #define IPIPEIF_RSZ3A 0x54 |
| #define IPIPEIF_INIRSZ3A 0x58 |
| #define IPIPEIF_RSZ_MIN 16 |
| #define IPIPEIF_RSZ_MAX 112 |
| #define IPIPEIF_RSZ_CONST 16 |
| #define SETBIT(reg, bit) (reg = ((reg) | ((0x00000001)<<(bit)))) |
| #define RESETBIT(reg, bit) (reg = ((reg) & (~(0x00000001<<(bit))))) |
| |
| #define IPIPEIF_ADOFS_LSB_MASK 0x1ff |
| #define IPIPEIF_ADOFS_LSB_SHIFT 5 |
| #define IPIPEIF_ADOFS_MSB_MASK 0x200 |
| #define IPIPEIF_ADDRU_MASK 0x7ff |
| #define IPIPEIF_ADDRL_SHIFT 5 |
| #define IPIPEIF_ADDRL_MASK 0xffff |
| #define IPIPEIF_ADDRU_SHIFT 21 |
| #define IPIPEIF_ADDRMSB_SHIFT 31 |
| #define IPIPEIF_ADDRMSB_LEFT_SHIFT 10 |
| |
| /* CFG1 Masks and shifts */ |
| #define ONESHOT_SHIFT 0 |
| #define DECIM_SHIFT 1 |
| #define INPSRC_SHIFT 2 |
| #define CLKDIV_SHIFT 4 |
| #define AVGFILT_SHIFT 7 |
| #define PACK8IN_SHIFT 8 |
| #define IALAW_SHIFT 9 |
| #define CLKSEL_SHIFT 10 |
| #define DATASFT_SHIFT 11 |
| #define INPSRC1_SHIFT 14 |
| |
| /* DPC2 */ |
| #define IPIPEIF_DPC2_EN_SHIFT 12 |
| #define IPIPEIF_DPC2_THR_MASK 0xfff |
| /* Applicable for IPIPE 5.1 */ |
| #define IPIPEIF_DF_GAIN_EN_SHIFT 10 |
| #define IPIPEIF_DF_GAIN_MASK 0x3ff |
| #define IPIPEIF_DF_GAIN_THR_MASK 0xfff |
| /* DPCM */ |
| #define IPIPEIF_DPCM_BITS_SHIFT 2 |
| #define IPIPEIF_DPCM_PRED_SHIFT 1 |
| /* CFG2 */ |
| #define IPIPEIF_CFG2_HDPOL_SHIFT 1 |
| #define IPIPEIF_CFG2_VDPOL_SHIFT 2 |
| #define IPIPEIF_CFG2_YUV8_SHIFT 6 |
| #define IPIPEIF_CFG2_YUV16_SHIFT 3 |
| #define IPIPEIF_CFG2_YUV8P_SHIFT 7 |
| |
| /* INIRSZ */ |
| #define IPIPEIF_INIRSZ_ALNSYNC_SHIFT 13 |
| #define IPIPEIF_INIRSZ_MASK 0x1fff |
| |
| /* CLKDIV */ |
| #define IPIPEIF_CLKDIV_M_SHIFT 8 |
| |
| void vpfe_ipipeif_enable(struct vpfe_device *vpfe_dev); |
| void vpfe_ipipeif_ss_buffer_isr(struct vpfe_ipipeif_device *ipipeif); |
| int vpfe_ipipeif_decimation_enabled(struct vpfe_device *vpfe_dev); |
| int vpfe_ipipeif_get_rsz(struct vpfe_device *vpfe_dev); |
| void vpfe_ipipeif_cleanup(struct vpfe_ipipeif_device *ipipeif, |
| struct platform_device *pdev); |
| int vpfe_ipipeif_init(struct vpfe_ipipeif_device *ipipeif, |
| struct platform_device *pdev); |
| int vpfe_ipipeif_register_entities(struct vpfe_ipipeif_device *ipipeif, |
| struct v4l2_device *vdev); |
| void vpfe_ipipeif_unregister_entities(struct vpfe_ipipeif_device *ipipeif); |
| |
| #endif /* _DAVINCI_VPFE_DM365_IPIPEIF_H */ |