1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * include/media/si476x-platform.h -- Platform data specific definitions 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2013 Andrey Smirnov 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Author: Andrey Smirnov <andrew.smirnov@gmail.com> 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef __SI476X_PLATFORM_H__ 11*4882a593Smuzhiyun #define __SI476X_PLATFORM_H__ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* It is possible to select one of the four adresses using pins A0 14*4882a593Smuzhiyun * and A1 on SI476x */ 15*4882a593Smuzhiyun #define SI476X_I2C_ADDR_1 0x60 16*4882a593Smuzhiyun #define SI476X_I2C_ADDR_2 0x61 17*4882a593Smuzhiyun #define SI476X_I2C_ADDR_3 0x62 18*4882a593Smuzhiyun #define SI476X_I2C_ADDR_4 0x63 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun enum si476x_iqclk_config { 21*4882a593Smuzhiyun SI476X_IQCLK_NOOP = 0, 22*4882a593Smuzhiyun SI476X_IQCLK_TRISTATE = 1, 23*4882a593Smuzhiyun SI476X_IQCLK_IQ = 21, 24*4882a593Smuzhiyun }; 25*4882a593Smuzhiyun enum si476x_iqfs_config { 26*4882a593Smuzhiyun SI476X_IQFS_NOOP = 0, 27*4882a593Smuzhiyun SI476X_IQFS_TRISTATE = 1, 28*4882a593Smuzhiyun SI476X_IQFS_IQ = 21, 29*4882a593Smuzhiyun }; 30*4882a593Smuzhiyun enum si476x_iout_config { 31*4882a593Smuzhiyun SI476X_IOUT_NOOP = 0, 32*4882a593Smuzhiyun SI476X_IOUT_TRISTATE = 1, 33*4882a593Smuzhiyun SI476X_IOUT_OUTPUT = 22, 34*4882a593Smuzhiyun }; 35*4882a593Smuzhiyun enum si476x_qout_config { 36*4882a593Smuzhiyun SI476X_QOUT_NOOP = 0, 37*4882a593Smuzhiyun SI476X_QOUT_TRISTATE = 1, 38*4882a593Smuzhiyun SI476X_QOUT_OUTPUT = 22, 39*4882a593Smuzhiyun }; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun enum si476x_dclk_config { 42*4882a593Smuzhiyun SI476X_DCLK_NOOP = 0, 43*4882a593Smuzhiyun SI476X_DCLK_TRISTATE = 1, 44*4882a593Smuzhiyun SI476X_DCLK_DAUDIO = 10, 45*4882a593Smuzhiyun }; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun enum si476x_dfs_config { 48*4882a593Smuzhiyun SI476X_DFS_NOOP = 0, 49*4882a593Smuzhiyun SI476X_DFS_TRISTATE = 1, 50*4882a593Smuzhiyun SI476X_DFS_DAUDIO = 10, 51*4882a593Smuzhiyun }; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun enum si476x_dout_config { 54*4882a593Smuzhiyun SI476X_DOUT_NOOP = 0, 55*4882a593Smuzhiyun SI476X_DOUT_TRISTATE = 1, 56*4882a593Smuzhiyun SI476X_DOUT_I2S_OUTPUT = 12, 57*4882a593Smuzhiyun SI476X_DOUT_I2S_INPUT = 13, 58*4882a593Smuzhiyun }; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun enum si476x_xout_config { 61*4882a593Smuzhiyun SI476X_XOUT_NOOP = 0, 62*4882a593Smuzhiyun SI476X_XOUT_TRISTATE = 1, 63*4882a593Smuzhiyun SI476X_XOUT_I2S_INPUT = 13, 64*4882a593Smuzhiyun SI476X_XOUT_MODE_SELECT = 23, 65*4882a593Smuzhiyun }; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun enum si476x_icin_config { 68*4882a593Smuzhiyun SI476X_ICIN_NOOP = 0, 69*4882a593Smuzhiyun SI476X_ICIN_TRISTATE = 1, 70*4882a593Smuzhiyun SI476X_ICIN_GPO1_HIGH = 2, 71*4882a593Smuzhiyun SI476X_ICIN_GPO1_LOW = 3, 72*4882a593Smuzhiyun SI476X_ICIN_IC_LINK = 30, 73*4882a593Smuzhiyun }; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun enum si476x_icip_config { 76*4882a593Smuzhiyun SI476X_ICIP_NOOP = 0, 77*4882a593Smuzhiyun SI476X_ICIP_TRISTATE = 1, 78*4882a593Smuzhiyun SI476X_ICIP_GPO2_HIGH = 2, 79*4882a593Smuzhiyun SI476X_ICIP_GPO2_LOW = 3, 80*4882a593Smuzhiyun SI476X_ICIP_IC_LINK = 30, 81*4882a593Smuzhiyun }; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun enum si476x_icon_config { 84*4882a593Smuzhiyun SI476X_ICON_NOOP = 0, 85*4882a593Smuzhiyun SI476X_ICON_TRISTATE = 1, 86*4882a593Smuzhiyun SI476X_ICON_I2S = 10, 87*4882a593Smuzhiyun SI476X_ICON_IC_LINK = 30, 88*4882a593Smuzhiyun }; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun enum si476x_icop_config { 91*4882a593Smuzhiyun SI476X_ICOP_NOOP = 0, 92*4882a593Smuzhiyun SI476X_ICOP_TRISTATE = 1, 93*4882a593Smuzhiyun SI476X_ICOP_I2S = 10, 94*4882a593Smuzhiyun SI476X_ICOP_IC_LINK = 30, 95*4882a593Smuzhiyun }; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun enum si476x_lrout_config { 99*4882a593Smuzhiyun SI476X_LROUT_NOOP = 0, 100*4882a593Smuzhiyun SI476X_LROUT_TRISTATE = 1, 101*4882a593Smuzhiyun SI476X_LROUT_AUDIO = 2, 102*4882a593Smuzhiyun SI476X_LROUT_MPX = 3, 103*4882a593Smuzhiyun }; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun enum si476x_intb_config { 107*4882a593Smuzhiyun SI476X_INTB_NOOP = 0, 108*4882a593Smuzhiyun SI476X_INTB_TRISTATE = 1, 109*4882a593Smuzhiyun SI476X_INTB_DAUDIO = 10, 110*4882a593Smuzhiyun SI476X_INTB_IRQ = 40, 111*4882a593Smuzhiyun }; 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun enum si476x_a1_config { 114*4882a593Smuzhiyun SI476X_A1_NOOP = 0, 115*4882a593Smuzhiyun SI476X_A1_TRISTATE = 1, 116*4882a593Smuzhiyun SI476X_A1_IRQ = 40, 117*4882a593Smuzhiyun }; 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun struct si476x_pinmux { 121*4882a593Smuzhiyun enum si476x_dclk_config dclk; 122*4882a593Smuzhiyun enum si476x_dfs_config dfs; 123*4882a593Smuzhiyun enum si476x_dout_config dout; 124*4882a593Smuzhiyun enum si476x_xout_config xout; 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun enum si476x_iqclk_config iqclk; 127*4882a593Smuzhiyun enum si476x_iqfs_config iqfs; 128*4882a593Smuzhiyun enum si476x_iout_config iout; 129*4882a593Smuzhiyun enum si476x_qout_config qout; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun enum si476x_icin_config icin; 132*4882a593Smuzhiyun enum si476x_icip_config icip; 133*4882a593Smuzhiyun enum si476x_icon_config icon; 134*4882a593Smuzhiyun enum si476x_icop_config icop; 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun enum si476x_lrout_config lrout; 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun enum si476x_intb_config intb; 139*4882a593Smuzhiyun enum si476x_a1_config a1; 140*4882a593Smuzhiyun }; 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun enum si476x_ibias6x { 143*4882a593Smuzhiyun SI476X_IBIAS6X_OTHER = 0, 144*4882a593Smuzhiyun SI476X_IBIAS6X_RCVR1_NON_4MHZ_CLK = 1, 145*4882a593Smuzhiyun }; 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun enum si476x_xstart { 148*4882a593Smuzhiyun SI476X_XSTART_MULTIPLE_TUNER = 0x11, 149*4882a593Smuzhiyun SI476X_XSTART_NORMAL = 0x77, 150*4882a593Smuzhiyun }; 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun enum si476x_freq { 153*4882a593Smuzhiyun SI476X_FREQ_4_MHZ = 0, 154*4882a593Smuzhiyun SI476X_FREQ_37P209375_MHZ = 1, 155*4882a593Smuzhiyun SI476X_FREQ_36P4_MHZ = 2, 156*4882a593Smuzhiyun SI476X_FREQ_37P8_MHZ = 3, 157*4882a593Smuzhiyun }; 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun enum si476x_xmode { 160*4882a593Smuzhiyun SI476X_XMODE_CRYSTAL_RCVR1 = 1, 161*4882a593Smuzhiyun SI476X_XMODE_EXT_CLOCK = 2, 162*4882a593Smuzhiyun SI476X_XMODE_CRYSTAL_RCVR2_3 = 3, 163*4882a593Smuzhiyun }; 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun enum si476x_xbiashc { 166*4882a593Smuzhiyun SI476X_XBIASHC_SINGLE_RECEIVER = 0, 167*4882a593Smuzhiyun SI476X_XBIASHC_MULTIPLE_RECEIVER = 1, 168*4882a593Smuzhiyun }; 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun enum si476x_xbias { 171*4882a593Smuzhiyun SI476X_XBIAS_RCVR2_3 = 0, 172*4882a593Smuzhiyun SI476X_XBIAS_4MHZ_RCVR1 = 3, 173*4882a593Smuzhiyun SI476X_XBIAS_RCVR1 = 7, 174*4882a593Smuzhiyun }; 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun enum si476x_func { 177*4882a593Smuzhiyun SI476X_FUNC_BOOTLOADER = 0, 178*4882a593Smuzhiyun SI476X_FUNC_FM_RECEIVER = 1, 179*4882a593Smuzhiyun SI476X_FUNC_AM_RECEIVER = 2, 180*4882a593Smuzhiyun SI476X_FUNC_WB_RECEIVER = 3, 181*4882a593Smuzhiyun }; 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun /** 185*4882a593Smuzhiyun * @xcload: Selects the amount of additional on-chip capacitance to 186*4882a593Smuzhiyun * be connected between XTAL1 and gnd and between XTAL2 and 187*4882a593Smuzhiyun * GND. One half of the capacitance value shown here is the 188*4882a593Smuzhiyun * additional load capacitance presented to the xtal. The 189*4882a593Smuzhiyun * minimum step size is 0.277 pF. Recommended value is 0x28 190*4882a593Smuzhiyun * but it will be layout dependent. Range is 0–0x3F i.e. 191*4882a593Smuzhiyun * (0–16.33 pF) 192*4882a593Smuzhiyun * @ctsien: enable CTSINT(interrupt request when CTS condition 193*4882a593Smuzhiyun * arises) when set 194*4882a593Smuzhiyun * @intsel: when set A1 pin becomes the interrupt pin; otherwise, 195*4882a593Smuzhiyun * INTB is the interrupt pin 196*4882a593Smuzhiyun * @func: selects the boot function of the device. I.e. 197*4882a593Smuzhiyun * SI476X_BOOTLOADER - Boot loader 198*4882a593Smuzhiyun * SI476X_FM_RECEIVER - FM receiver 199*4882a593Smuzhiyun * SI476X_AM_RECEIVER - AM receiver 200*4882a593Smuzhiyun * SI476X_WB_RECEIVER - Weatherband receiver 201*4882a593Smuzhiyun * @freq: oscillator's crystal frequency: 202*4882a593Smuzhiyun * SI476X_XTAL_37P209375_MHZ - 37.209375 Mhz 203*4882a593Smuzhiyun * SI476X_XTAL_36P4_MHZ - 36.4 Mhz 204*4882a593Smuzhiyun * SI476X_XTAL_37P8_MHZ - 37.8 Mhz 205*4882a593Smuzhiyun */ 206*4882a593Smuzhiyun struct si476x_power_up_args { 207*4882a593Smuzhiyun enum si476x_ibias6x ibias6x; 208*4882a593Smuzhiyun enum si476x_xstart xstart; 209*4882a593Smuzhiyun u8 xcload; 210*4882a593Smuzhiyun bool fastboot; 211*4882a593Smuzhiyun enum si476x_xbiashc xbiashc; 212*4882a593Smuzhiyun enum si476x_xbias xbias; 213*4882a593Smuzhiyun enum si476x_func func; 214*4882a593Smuzhiyun enum si476x_freq freq; 215*4882a593Smuzhiyun enum si476x_xmode xmode; 216*4882a593Smuzhiyun }; 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun /** 220*4882a593Smuzhiyun * enum si476x_phase_diversity_mode - possbile phase diversity modes 221*4882a593Smuzhiyun * for SI4764/5/6/7 chips. 222*4882a593Smuzhiyun * 223*4882a593Smuzhiyun * @SI476X_PHDIV_DISABLED: Phase diversity feature is 224*4882a593Smuzhiyun * disabled. 225*4882a593Smuzhiyun * @SI476X_PHDIV_PRIMARY_COMBINING: Tuner works as a primary tuner 226*4882a593Smuzhiyun * in combination with a 227*4882a593Smuzhiyun * secondary one. 228*4882a593Smuzhiyun * @SI476X_PHDIV_PRIMARY_ANTENNA: Tuner works as a primary tuner 229*4882a593Smuzhiyun * using only its own antenna. 230*4882a593Smuzhiyun * @SI476X_PHDIV_SECONDARY_ANTENNA: Tuner works as a primary tuner 231*4882a593Smuzhiyun * usning seconary tuner's antenna. 232*4882a593Smuzhiyun * @SI476X_PHDIV_SECONDARY_COMBINING: Tuner works as a secondary 233*4882a593Smuzhiyun * tuner in combination with the 234*4882a593Smuzhiyun * primary one. 235*4882a593Smuzhiyun */ 236*4882a593Smuzhiyun enum si476x_phase_diversity_mode { 237*4882a593Smuzhiyun SI476X_PHDIV_DISABLED = 0, 238*4882a593Smuzhiyun SI476X_PHDIV_PRIMARY_COMBINING = 1, 239*4882a593Smuzhiyun SI476X_PHDIV_PRIMARY_ANTENNA = 2, 240*4882a593Smuzhiyun SI476X_PHDIV_SECONDARY_ANTENNA = 3, 241*4882a593Smuzhiyun SI476X_PHDIV_SECONDARY_COMBINING = 5, 242*4882a593Smuzhiyun }; 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun /* 246*4882a593Smuzhiyun * Platform dependent definition 247*4882a593Smuzhiyun */ 248*4882a593Smuzhiyun struct si476x_platform_data { 249*4882a593Smuzhiyun int gpio_reset; /* < 0 if not used */ 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun struct si476x_power_up_args power_up_parameters; 252*4882a593Smuzhiyun enum si476x_phase_diversity_mode diversity_mode; 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun struct si476x_pinmux pinmux; 255*4882a593Smuzhiyun }; 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun #endif /* __SI476X_PLATFORM_H__ */ 259