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