1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * adv7842 - Analog Devices ADV7842 video decoder driver 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright 2013 Cisco Systems, Inc. and/or its affiliates. All rights reserved. 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef _ADV7842_ 9*4882a593Smuzhiyun #define _ADV7842_ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /* Analog input muxing modes (AFE register 0x02, [2:0]) */ 12*4882a593Smuzhiyun enum adv7842_ain_sel { 13*4882a593Smuzhiyun ADV7842_AIN1_2_3_NC_SYNC_1_2 = 0, 14*4882a593Smuzhiyun ADV7842_AIN4_5_6_NC_SYNC_2_1 = 1, 15*4882a593Smuzhiyun ADV7842_AIN7_8_9_NC_SYNC_3_1 = 2, 16*4882a593Smuzhiyun ADV7842_AIN10_11_12_NC_SYNC_4_1 = 3, 17*4882a593Smuzhiyun ADV7842_AIN9_4_5_6_SYNC_2_1 = 4, 18*4882a593Smuzhiyun }; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun /* 21*4882a593Smuzhiyun * Bus rotation and reordering. This is used to specify component reordering on 22*4882a593Smuzhiyun * the board and describes the components order on the bus when the ADV7842 23*4882a593Smuzhiyun * outputs RGB. 24*4882a593Smuzhiyun */ 25*4882a593Smuzhiyun enum adv7842_bus_order { 26*4882a593Smuzhiyun ADV7842_BUS_ORDER_RGB, /* No operation */ 27*4882a593Smuzhiyun ADV7842_BUS_ORDER_GRB, /* Swap 1-2 */ 28*4882a593Smuzhiyun ADV7842_BUS_ORDER_RBG, /* Swap 2-3 */ 29*4882a593Smuzhiyun ADV7842_BUS_ORDER_BGR, /* Swap 1-3 */ 30*4882a593Smuzhiyun ADV7842_BUS_ORDER_BRG, /* Rotate right */ 31*4882a593Smuzhiyun ADV7842_BUS_ORDER_GBR, /* Rotate left */ 32*4882a593Smuzhiyun }; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* Input Color Space (IO register 0x02, [7:4]) */ 35*4882a593Smuzhiyun enum adv7842_inp_color_space { 36*4882a593Smuzhiyun ADV7842_INP_COLOR_SPACE_LIM_RGB = 0, 37*4882a593Smuzhiyun ADV7842_INP_COLOR_SPACE_FULL_RGB = 1, 38*4882a593Smuzhiyun ADV7842_INP_COLOR_SPACE_LIM_YCbCr_601 = 2, 39*4882a593Smuzhiyun ADV7842_INP_COLOR_SPACE_LIM_YCbCr_709 = 3, 40*4882a593Smuzhiyun ADV7842_INP_COLOR_SPACE_XVYCC_601 = 4, 41*4882a593Smuzhiyun ADV7842_INP_COLOR_SPACE_XVYCC_709 = 5, 42*4882a593Smuzhiyun ADV7842_INP_COLOR_SPACE_FULL_YCbCr_601 = 6, 43*4882a593Smuzhiyun ADV7842_INP_COLOR_SPACE_FULL_YCbCr_709 = 7, 44*4882a593Smuzhiyun ADV7842_INP_COLOR_SPACE_AUTO = 0xf, 45*4882a593Smuzhiyun }; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun /* Select output format (IO register 0x03, [4:2]) */ 48*4882a593Smuzhiyun enum adv7842_op_format_mode_sel { 49*4882a593Smuzhiyun ADV7842_OP_FORMAT_MODE0 = 0x00, 50*4882a593Smuzhiyun ADV7842_OP_FORMAT_MODE1 = 0x04, 51*4882a593Smuzhiyun ADV7842_OP_FORMAT_MODE2 = 0x08, 52*4882a593Smuzhiyun }; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* Mode of operation */ 55*4882a593Smuzhiyun enum adv7842_mode { 56*4882a593Smuzhiyun ADV7842_MODE_SDP, 57*4882a593Smuzhiyun ADV7842_MODE_COMP, 58*4882a593Smuzhiyun ADV7842_MODE_RGB, 59*4882a593Smuzhiyun ADV7842_MODE_HDMI 60*4882a593Smuzhiyun }; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /* Video standard select (IO register 0x00, [5:0]) */ 63*4882a593Smuzhiyun enum adv7842_vid_std_select { 64*4882a593Smuzhiyun /* SDP */ 65*4882a593Smuzhiyun ADV7842_SDP_VID_STD_CVBS_SD_4x1 = 0x01, 66*4882a593Smuzhiyun ADV7842_SDP_VID_STD_YC_SD4_x1 = 0x09, 67*4882a593Smuzhiyun /* RGB */ 68*4882a593Smuzhiyun ADV7842_RGB_VID_STD_AUTO_GRAPH_MODE = 0x07, 69*4882a593Smuzhiyun /* HDMI GR */ 70*4882a593Smuzhiyun ADV7842_HDMI_GR_VID_STD_AUTO_GRAPH_MODE = 0x02, 71*4882a593Smuzhiyun /* HDMI COMP */ 72*4882a593Smuzhiyun ADV7842_HDMI_COMP_VID_STD_HD_1250P = 0x1e, 73*4882a593Smuzhiyun }; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun enum adv7842_select_input { 76*4882a593Smuzhiyun ADV7842_SELECT_HDMI_PORT_A, 77*4882a593Smuzhiyun ADV7842_SELECT_HDMI_PORT_B, 78*4882a593Smuzhiyun ADV7842_SELECT_VGA_RGB, 79*4882a593Smuzhiyun ADV7842_SELECT_VGA_COMP, 80*4882a593Smuzhiyun ADV7842_SELECT_SDP_CVBS, 81*4882a593Smuzhiyun ADV7842_SELECT_SDP_YC, 82*4882a593Smuzhiyun }; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun enum adv7842_drive_strength { 85*4882a593Smuzhiyun ADV7842_DR_STR_LOW = 0, 86*4882a593Smuzhiyun ADV7842_DR_STR_MEDIUM_LOW = 1, 87*4882a593Smuzhiyun ADV7842_DR_STR_MEDIUM_HIGH = 2, 88*4882a593Smuzhiyun ADV7842_DR_STR_HIGH = 3, 89*4882a593Smuzhiyun }; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun struct adv7842_sdp_csc_coeff { 92*4882a593Smuzhiyun bool manual; 93*4882a593Smuzhiyun u16 scaling; 94*4882a593Smuzhiyun u16 A1; 95*4882a593Smuzhiyun u16 A2; 96*4882a593Smuzhiyun u16 A3; 97*4882a593Smuzhiyun u16 A4; 98*4882a593Smuzhiyun u16 B1; 99*4882a593Smuzhiyun u16 B2; 100*4882a593Smuzhiyun u16 B3; 101*4882a593Smuzhiyun u16 B4; 102*4882a593Smuzhiyun u16 C1; 103*4882a593Smuzhiyun u16 C2; 104*4882a593Smuzhiyun u16 C3; 105*4882a593Smuzhiyun u16 C4; 106*4882a593Smuzhiyun }; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun struct adv7842_sdp_io_sync_adjustment { 109*4882a593Smuzhiyun bool adjust; 110*4882a593Smuzhiyun u16 hs_beg; 111*4882a593Smuzhiyun u16 hs_width; 112*4882a593Smuzhiyun u16 de_beg; 113*4882a593Smuzhiyun u16 de_end; 114*4882a593Smuzhiyun u8 vs_beg_o; 115*4882a593Smuzhiyun u8 vs_beg_e; 116*4882a593Smuzhiyun u8 vs_end_o; 117*4882a593Smuzhiyun u8 vs_end_e; 118*4882a593Smuzhiyun u8 de_v_beg_o; 119*4882a593Smuzhiyun u8 de_v_beg_e; 120*4882a593Smuzhiyun u8 de_v_end_o; 121*4882a593Smuzhiyun u8 de_v_end_e; 122*4882a593Smuzhiyun }; 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun /* Platform dependent definition */ 125*4882a593Smuzhiyun struct adv7842_platform_data { 126*4882a593Smuzhiyun /* chip reset during probe */ 127*4882a593Smuzhiyun unsigned chip_reset:1; 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun /* DIS_PWRDNB: 1 if the PWRDNB pin is unused and unconnected */ 130*4882a593Smuzhiyun unsigned disable_pwrdnb:1; 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun /* DIS_CABLE_DET_RST: 1 if the 5V pins are unused and unconnected */ 133*4882a593Smuzhiyun unsigned disable_cable_det_rst:1; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun /* Analog input muxing mode */ 136*4882a593Smuzhiyun enum adv7842_ain_sel ain_sel; 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun /* Bus rotation and reordering */ 139*4882a593Smuzhiyun enum adv7842_bus_order bus_order; 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun /* Select output format mode */ 142*4882a593Smuzhiyun enum adv7842_op_format_mode_sel op_format_mode_sel; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun /* Default mode */ 145*4882a593Smuzhiyun enum adv7842_mode mode; 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun /* Default input */ 148*4882a593Smuzhiyun unsigned input; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun /* Video standard */ 151*4882a593Smuzhiyun enum adv7842_vid_std_select vid_std_select; 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun /* IO register 0x02 */ 154*4882a593Smuzhiyun unsigned alt_gamma:1; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /* IO register 0x05 */ 157*4882a593Smuzhiyun unsigned blank_data:1; 158*4882a593Smuzhiyun unsigned insert_av_codes:1; 159*4882a593Smuzhiyun unsigned replicate_av_codes:1; 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /* IO register 0x30 */ 162*4882a593Smuzhiyun unsigned output_bus_lsb_to_msb:1; 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun /* IO register 0x14 */ 165*4882a593Smuzhiyun enum adv7842_drive_strength dr_str_data; 166*4882a593Smuzhiyun enum adv7842_drive_strength dr_str_clk; 167*4882a593Smuzhiyun enum adv7842_drive_strength dr_str_sync; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun /* 170*4882a593Smuzhiyun * IO register 0x19: Adjustment to the LLC DLL phase in 171*4882a593Smuzhiyun * increments of 1/32 of a clock period. 172*4882a593Smuzhiyun */ 173*4882a593Smuzhiyun unsigned llc_dll_phase:5; 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun /* External RAM for 3-D comb or frame synchronizer */ 176*4882a593Smuzhiyun unsigned sd_ram_size; /* ram size in MB */ 177*4882a593Smuzhiyun unsigned sd_ram_ddr:1; /* ddr or sdr sdram */ 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun /* HDMI free run, CP-reg 0xBA */ 180*4882a593Smuzhiyun unsigned hdmi_free_run_enable:1; 181*4882a593Smuzhiyun /* 0 = Mode 0: run when there is no TMDS clock 182*4882a593Smuzhiyun 1 = Mode 1: run when there is no TMDS clock or the 183*4882a593Smuzhiyun video resolution does not match programmed one. */ 184*4882a593Smuzhiyun unsigned hdmi_free_run_mode:1; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun /* SDP free run, CP-reg 0xDD */ 187*4882a593Smuzhiyun unsigned sdp_free_run_auto:1; 188*4882a593Smuzhiyun unsigned sdp_free_run_man_col_en:1; 189*4882a593Smuzhiyun unsigned sdp_free_run_cbar_en:1; 190*4882a593Smuzhiyun unsigned sdp_free_run_force:1; 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun /* HPA manual (0) or auto (1), affects HDMI register 0x69 */ 193*4882a593Smuzhiyun unsigned hpa_auto:1; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun struct adv7842_sdp_csc_coeff sdp_csc_coeff; 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun struct adv7842_sdp_io_sync_adjustment sdp_io_sync_625; 198*4882a593Smuzhiyun struct adv7842_sdp_io_sync_adjustment sdp_io_sync_525; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun /* i2c addresses */ 201*4882a593Smuzhiyun u8 i2c_sdp_io; 202*4882a593Smuzhiyun u8 i2c_sdp; 203*4882a593Smuzhiyun u8 i2c_cp; 204*4882a593Smuzhiyun u8 i2c_vdp; 205*4882a593Smuzhiyun u8 i2c_afe; 206*4882a593Smuzhiyun u8 i2c_hdmi; 207*4882a593Smuzhiyun u8 i2c_repeater; 208*4882a593Smuzhiyun u8 i2c_edid; 209*4882a593Smuzhiyun u8 i2c_infoframe; 210*4882a593Smuzhiyun u8 i2c_cec; 211*4882a593Smuzhiyun u8 i2c_avlink; 212*4882a593Smuzhiyun }; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun #define V4L2_CID_ADV_RX_ANALOG_SAMPLING_PHASE (V4L2_CID_DV_CLASS_BASE + 0x1000) 215*4882a593Smuzhiyun #define V4L2_CID_ADV_RX_FREE_RUN_COLOR_MANUAL (V4L2_CID_DV_CLASS_BASE + 0x1001) 216*4882a593Smuzhiyun #define V4L2_CID_ADV_RX_FREE_RUN_COLOR (V4L2_CID_DV_CLASS_BASE + 0x1002) 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun /* custom ioctl, used to test the external RAM that's used by the 219*4882a593Smuzhiyun * deinterlacer. */ 220*4882a593Smuzhiyun #define ADV7842_CMD_RAM_TEST _IO('V', BASE_VIDIOC_PRIVATE) 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun #define ADV7842_EDID_PORT_A 0 223*4882a593Smuzhiyun #define ADV7842_EDID_PORT_B 1 224*4882a593Smuzhiyun #define ADV7842_EDID_PORT_VGA 2 225*4882a593Smuzhiyun #define ADV7842_PAD_SOURCE 3 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun #endif 228