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