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 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