xref: /OK3568_Linux_fs/kernel/drivers/media/tuners/tda18271.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun     tda18271.h - header for the Philips / NXP TDA18271 silicon tuner
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun     Copyright (C) 2007, 2008 Michael Krufky <mkrufky@linuxtv.org>
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifndef __TDA18271_H__
10*4882a593Smuzhiyun #define __TDA18271_H__
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/i2c.h>
13*4882a593Smuzhiyun #include <media/dvb_frontend.h>
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun struct tda18271_std_map_item {
16*4882a593Smuzhiyun 	u16 if_freq;
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun 	/* EP3[4:3] */
19*4882a593Smuzhiyun 	unsigned int agc_mode:2;
20*4882a593Smuzhiyun 	/* EP3[2:0] */
21*4882a593Smuzhiyun 	unsigned int std:3;
22*4882a593Smuzhiyun 	/* EP4[7] */
23*4882a593Smuzhiyun 	unsigned int fm_rfn:1;
24*4882a593Smuzhiyun 	/* EP4[4:2] */
25*4882a593Smuzhiyun 	unsigned int if_lvl:3;
26*4882a593Smuzhiyun 	/* EB22[6:0] */
27*4882a593Smuzhiyun 	unsigned int rfagc_top:7;
28*4882a593Smuzhiyun };
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun struct tda18271_std_map {
31*4882a593Smuzhiyun 	struct tda18271_std_map_item fm_radio;
32*4882a593Smuzhiyun 	struct tda18271_std_map_item atv_b;
33*4882a593Smuzhiyun 	struct tda18271_std_map_item atv_dk;
34*4882a593Smuzhiyun 	struct tda18271_std_map_item atv_gh;
35*4882a593Smuzhiyun 	struct tda18271_std_map_item atv_i;
36*4882a593Smuzhiyun 	struct tda18271_std_map_item atv_l;
37*4882a593Smuzhiyun 	struct tda18271_std_map_item atv_lc;
38*4882a593Smuzhiyun 	struct tda18271_std_map_item atv_mn;
39*4882a593Smuzhiyun 	struct tda18271_std_map_item atsc_6;
40*4882a593Smuzhiyun 	struct tda18271_std_map_item dvbt_6;
41*4882a593Smuzhiyun 	struct tda18271_std_map_item dvbt_7;
42*4882a593Smuzhiyun 	struct tda18271_std_map_item dvbt_8;
43*4882a593Smuzhiyun 	struct tda18271_std_map_item qam_6;
44*4882a593Smuzhiyun 	struct tda18271_std_map_item qam_7;
45*4882a593Smuzhiyun 	struct tda18271_std_map_item qam_8;
46*4882a593Smuzhiyun };
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun enum tda18271_role {
49*4882a593Smuzhiyun 	TDA18271_MASTER = 0,
50*4882a593Smuzhiyun 	TDA18271_SLAVE,
51*4882a593Smuzhiyun };
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun enum tda18271_i2c_gate {
54*4882a593Smuzhiyun 	TDA18271_GATE_AUTO = 0,
55*4882a593Smuzhiyun 	TDA18271_GATE_ANALOG,
56*4882a593Smuzhiyun 	TDA18271_GATE_DIGITAL,
57*4882a593Smuzhiyun };
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun enum tda18271_output_options {
60*4882a593Smuzhiyun 	/* slave tuner output & loop through & xtal oscillator always on */
61*4882a593Smuzhiyun 	TDA18271_OUTPUT_LT_XT_ON = 0,
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	/* slave tuner output loop through off */
64*4882a593Smuzhiyun 	TDA18271_OUTPUT_LT_OFF = 1,
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	/* xtal oscillator off */
67*4882a593Smuzhiyun 	TDA18271_OUTPUT_XT_OFF = 2,
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun enum tda18271_small_i2c {
71*4882a593Smuzhiyun 	TDA18271_39_BYTE_CHUNK_INIT = 0,
72*4882a593Smuzhiyun 	TDA18271_16_BYTE_CHUNK_INIT = 16,
73*4882a593Smuzhiyun 	TDA18271_08_BYTE_CHUNK_INIT = 8,
74*4882a593Smuzhiyun 	TDA18271_03_BYTE_CHUNK_INIT = 3,
75*4882a593Smuzhiyun };
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun struct tda18271_config {
78*4882a593Smuzhiyun 	/* override default if freq / std settings (optional) */
79*4882a593Smuzhiyun 	struct tda18271_std_map *std_map;
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun 	/* master / slave tuner: master uses main pll, slave uses cal pll */
82*4882a593Smuzhiyun 	enum tda18271_role role;
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	/* use i2c gate provided by analog or digital demod */
85*4882a593Smuzhiyun 	enum tda18271_i2c_gate gate;
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 	/* output options that can be disabled */
88*4882a593Smuzhiyun 	enum tda18271_output_options output_opt;
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	/* some i2c providers can't write all 39 registers at once */
91*4882a593Smuzhiyun 	enum tda18271_small_i2c small_i2c;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 	/* force rf tracking filter calibration on startup */
94*4882a593Smuzhiyun 	unsigned int rf_cal_on_startup:1;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	/* prevent any register access during attach(),
97*4882a593Smuzhiyun 	 * delaying both IR & RF calibration until init()
98*4882a593Smuzhiyun 	 * module option 'cal' overrides this delay */
99*4882a593Smuzhiyun 	unsigned int delay_cal:1;
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun 	/* interface to saa713x / tda829x */
102*4882a593Smuzhiyun 	unsigned int config;
103*4882a593Smuzhiyun };
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun #define TDA18271_CALLBACK_CMD_AGC_ENABLE 0
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun enum tda18271_mode {
108*4882a593Smuzhiyun 	TDA18271_ANALOG = 0,
109*4882a593Smuzhiyun 	TDA18271_DIGITAL,
110*4882a593Smuzhiyun };
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun #if IS_REACHABLE(CONFIG_MEDIA_TUNER_TDA18271)
113*4882a593Smuzhiyun extern struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
114*4882a593Smuzhiyun 					    struct i2c_adapter *i2c,
115*4882a593Smuzhiyun 					    struct tda18271_config *cfg);
116*4882a593Smuzhiyun #else
tda18271_attach(struct dvb_frontend * fe,u8 addr,struct i2c_adapter * i2c,struct tda18271_config * cfg)117*4882a593Smuzhiyun static inline struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe,
118*4882a593Smuzhiyun 						   u8 addr,
119*4882a593Smuzhiyun 						   struct i2c_adapter *i2c,
120*4882a593Smuzhiyun 						   struct tda18271_config *cfg)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
123*4882a593Smuzhiyun 	return NULL;
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun #endif
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun #endif /* __TDA18271_H__ */
128