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