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