xref: /linux/drivers/media/tuners/tda18271.h (revision dda1bb4e971e0105adfb1f00db7c2e1aefe3a314)
1ccae7af2SMauro Carvalho Chehab /*
2ccae7af2SMauro Carvalho Chehab     tda18271.h - header for the Philips / NXP TDA18271 silicon tuner
3ccae7af2SMauro Carvalho Chehab 
4ccae7af2SMauro Carvalho Chehab     Copyright (C) 2007, 2008 Michael Krufky <mkrufky@linuxtv.org>
5ccae7af2SMauro Carvalho Chehab 
6ccae7af2SMauro Carvalho Chehab     This program is free software; you can redistribute it and/or modify
7ccae7af2SMauro Carvalho Chehab     it under the terms of the GNU General Public License as published by
8ccae7af2SMauro Carvalho Chehab     the Free Software Foundation; either version 2 of the License, or
9ccae7af2SMauro Carvalho Chehab     (at your option) any later version.
10ccae7af2SMauro Carvalho Chehab 
11ccae7af2SMauro Carvalho Chehab     This program is distributed in the hope that it will be useful,
12ccae7af2SMauro Carvalho Chehab     but WITHOUT ANY WARRANTY; without even the implied warranty of
13ccae7af2SMauro Carvalho Chehab     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14ccae7af2SMauro Carvalho Chehab     GNU General Public License for more details.
15ccae7af2SMauro Carvalho Chehab 
16ccae7af2SMauro Carvalho Chehab     You should have received a copy of the GNU General Public License
17ccae7af2SMauro Carvalho Chehab     along with this program; if not, write to the Free Software
18ccae7af2SMauro Carvalho Chehab     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19ccae7af2SMauro Carvalho Chehab */
20ccae7af2SMauro Carvalho Chehab 
21ccae7af2SMauro Carvalho Chehab #ifndef __TDA18271_H__
22ccae7af2SMauro Carvalho Chehab #define __TDA18271_H__
23ccae7af2SMauro Carvalho Chehab 
24ccae7af2SMauro Carvalho Chehab #include <linux/i2c.h>
25fada1935SMauro Carvalho Chehab #include <media/dvb_frontend.h>
26ccae7af2SMauro Carvalho Chehab 
27ccae7af2SMauro Carvalho Chehab struct tda18271_std_map_item {
28ccae7af2SMauro Carvalho Chehab 	u16 if_freq;
29ccae7af2SMauro Carvalho Chehab 
30ccae7af2SMauro Carvalho Chehab 	/* EP3[4:3] */
31ccae7af2SMauro Carvalho Chehab 	unsigned int agc_mode:2;
32ccae7af2SMauro Carvalho Chehab 	/* EP3[2:0] */
33ccae7af2SMauro Carvalho Chehab 	unsigned int std:3;
34ccae7af2SMauro Carvalho Chehab 	/* EP4[7] */
35ccae7af2SMauro Carvalho Chehab 	unsigned int fm_rfn:1;
36ccae7af2SMauro Carvalho Chehab 	/* EP4[4:2] */
37ccae7af2SMauro Carvalho Chehab 	unsigned int if_lvl:3;
38ccae7af2SMauro Carvalho Chehab 	/* EB22[6:0] */
39ccae7af2SMauro Carvalho Chehab 	unsigned int rfagc_top:7;
40ccae7af2SMauro Carvalho Chehab };
41ccae7af2SMauro Carvalho Chehab 
42ccae7af2SMauro Carvalho Chehab struct tda18271_std_map {
43ccae7af2SMauro Carvalho Chehab 	struct tda18271_std_map_item fm_radio;
44ccae7af2SMauro Carvalho Chehab 	struct tda18271_std_map_item atv_b;
45ccae7af2SMauro Carvalho Chehab 	struct tda18271_std_map_item atv_dk;
46ccae7af2SMauro Carvalho Chehab 	struct tda18271_std_map_item atv_gh;
47ccae7af2SMauro Carvalho Chehab 	struct tda18271_std_map_item atv_i;
48ccae7af2SMauro Carvalho Chehab 	struct tda18271_std_map_item atv_l;
49ccae7af2SMauro Carvalho Chehab 	struct tda18271_std_map_item atv_lc;
50ccae7af2SMauro Carvalho Chehab 	struct tda18271_std_map_item atv_mn;
51ccae7af2SMauro Carvalho Chehab 	struct tda18271_std_map_item atsc_6;
52ccae7af2SMauro Carvalho Chehab 	struct tda18271_std_map_item dvbt_6;
53ccae7af2SMauro Carvalho Chehab 	struct tda18271_std_map_item dvbt_7;
54ccae7af2SMauro Carvalho Chehab 	struct tda18271_std_map_item dvbt_8;
55ccae7af2SMauro Carvalho Chehab 	struct tda18271_std_map_item qam_6;
56ccae7af2SMauro Carvalho Chehab 	struct tda18271_std_map_item qam_7;
57ccae7af2SMauro Carvalho Chehab 	struct tda18271_std_map_item qam_8;
58ccae7af2SMauro Carvalho Chehab };
59ccae7af2SMauro Carvalho Chehab 
60ccae7af2SMauro Carvalho Chehab enum tda18271_role {
61ccae7af2SMauro Carvalho Chehab 	TDA18271_MASTER = 0,
62ccae7af2SMauro Carvalho Chehab 	TDA18271_SLAVE,
63ccae7af2SMauro Carvalho Chehab };
64ccae7af2SMauro Carvalho Chehab 
65ccae7af2SMauro Carvalho Chehab enum tda18271_i2c_gate {
66ccae7af2SMauro Carvalho Chehab 	TDA18271_GATE_AUTO = 0,
67ccae7af2SMauro Carvalho Chehab 	TDA18271_GATE_ANALOG,
68ccae7af2SMauro Carvalho Chehab 	TDA18271_GATE_DIGITAL,
69ccae7af2SMauro Carvalho Chehab };
70ccae7af2SMauro Carvalho Chehab 
71ccae7af2SMauro Carvalho Chehab enum tda18271_output_options {
72*dda1bb4eSMauro Carvalho Chehab 	/* slave tuner output & loop through & xtal oscillator always on */
73ccae7af2SMauro Carvalho Chehab 	TDA18271_OUTPUT_LT_XT_ON = 0,
74ccae7af2SMauro Carvalho Chehab 
75*dda1bb4eSMauro Carvalho Chehab 	/* slave tuner output loop through off */
76ccae7af2SMauro Carvalho Chehab 	TDA18271_OUTPUT_LT_OFF = 1,
77ccae7af2SMauro Carvalho Chehab 
78ccae7af2SMauro Carvalho Chehab 	/* xtal oscillator off */
79ccae7af2SMauro Carvalho Chehab 	TDA18271_OUTPUT_XT_OFF = 2,
80ccae7af2SMauro Carvalho Chehab };
81ccae7af2SMauro Carvalho Chehab 
82ccae7af2SMauro Carvalho Chehab enum tda18271_small_i2c {
83ccae7af2SMauro Carvalho Chehab 	TDA18271_39_BYTE_CHUNK_INIT = 0,
84ccae7af2SMauro Carvalho Chehab 	TDA18271_16_BYTE_CHUNK_INIT = 16,
85ccae7af2SMauro Carvalho Chehab 	TDA18271_08_BYTE_CHUNK_INIT = 8,
86ccae7af2SMauro Carvalho Chehab 	TDA18271_03_BYTE_CHUNK_INIT = 3,
87ccae7af2SMauro Carvalho Chehab };
88ccae7af2SMauro Carvalho Chehab 
89ccae7af2SMauro Carvalho Chehab struct tda18271_config {
90ccae7af2SMauro Carvalho Chehab 	/* override default if freq / std settings (optional) */
91ccae7af2SMauro Carvalho Chehab 	struct tda18271_std_map *std_map;
92ccae7af2SMauro Carvalho Chehab 
93ccae7af2SMauro Carvalho Chehab 	/* master / slave tuner: master uses main pll, slave uses cal pll */
94ccae7af2SMauro Carvalho Chehab 	enum tda18271_role role;
95ccae7af2SMauro Carvalho Chehab 
96ccae7af2SMauro Carvalho Chehab 	/* use i2c gate provided by analog or digital demod */
97ccae7af2SMauro Carvalho Chehab 	enum tda18271_i2c_gate gate;
98ccae7af2SMauro Carvalho Chehab 
99ccae7af2SMauro Carvalho Chehab 	/* output options that can be disabled */
100ccae7af2SMauro Carvalho Chehab 	enum tda18271_output_options output_opt;
101ccae7af2SMauro Carvalho Chehab 
102ccae7af2SMauro Carvalho Chehab 	/* some i2c providers can't write all 39 registers at once */
103ccae7af2SMauro Carvalho Chehab 	enum tda18271_small_i2c small_i2c;
104ccae7af2SMauro Carvalho Chehab 
105ccae7af2SMauro Carvalho Chehab 	/* force rf tracking filter calibration on startup */
106ccae7af2SMauro Carvalho Chehab 	unsigned int rf_cal_on_startup:1;
107ccae7af2SMauro Carvalho Chehab 
1086b82e0cfSMichael Krufky 	/* prevent any register access during attach(),
1096b82e0cfSMichael Krufky 	 * delaying both IR & RF calibration until init()
1106b82e0cfSMichael Krufky 	 * module option 'cal' overrides this delay */
1116b82e0cfSMichael Krufky 	unsigned int delay_cal:1;
1126b82e0cfSMichael Krufky 
113ccae7af2SMauro Carvalho Chehab 	/* interface to saa713x / tda829x */
114ccae7af2SMauro Carvalho Chehab 	unsigned int config;
115ccae7af2SMauro Carvalho Chehab };
116ccae7af2SMauro Carvalho Chehab 
117ccae7af2SMauro Carvalho Chehab #define TDA18271_CALLBACK_CMD_AGC_ENABLE 0
118ccae7af2SMauro Carvalho Chehab 
119ccae7af2SMauro Carvalho Chehab enum tda18271_mode {
120ccae7af2SMauro Carvalho Chehab 	TDA18271_ANALOG = 0,
121ccae7af2SMauro Carvalho Chehab 	TDA18271_DIGITAL,
122ccae7af2SMauro Carvalho Chehab };
123ccae7af2SMauro Carvalho Chehab 
1249b174527SArnd Bergmann #if IS_REACHABLE(CONFIG_MEDIA_TUNER_TDA18271)
125ccae7af2SMauro Carvalho Chehab extern struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
126ccae7af2SMauro Carvalho Chehab 					    struct i2c_adapter *i2c,
127ccae7af2SMauro Carvalho Chehab 					    struct tda18271_config *cfg);
128ccae7af2SMauro Carvalho Chehab #else
129ccae7af2SMauro Carvalho Chehab static inline struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe,
130ccae7af2SMauro Carvalho Chehab 						   u8 addr,
131ccae7af2SMauro Carvalho Chehab 						   struct i2c_adapter *i2c,
132ccae7af2SMauro Carvalho Chehab 						   struct tda18271_config *cfg)
133ccae7af2SMauro Carvalho Chehab {
134ccae7af2SMauro Carvalho Chehab 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
135ccae7af2SMauro Carvalho Chehab 	return NULL;
136ccae7af2SMauro Carvalho Chehab }
137ccae7af2SMauro Carvalho Chehab #endif
138ccae7af2SMauro Carvalho Chehab 
139ccae7af2SMauro Carvalho Chehab #endif /* __TDA18271_H__ */
140