xref: /OK3568_Linux_fs/kernel/include/linux/mfd/si476x-platform.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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