^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) tda18271-priv.h - private header for the NXP TDA18271 silicon tuner
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) Copyright (C) 2007, 2008 Michael Krufky <mkrufky@linuxtv.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #ifndef __TDA18271_PRIV_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define __TDA18271_PRIV_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include "tuner-i2c.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include "tda18271.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define R_ID 0x00 /* ID byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define R_TM 0x01 /* Thermo byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define R_PL 0x02 /* Power level byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define R_EP1 0x03 /* Easy Prog byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define R_EP2 0x04 /* Easy Prog byte 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define R_EP3 0x05 /* Easy Prog byte 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define R_EP4 0x06 /* Easy Prog byte 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define R_EP5 0x07 /* Easy Prog byte 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define R_CPD 0x08 /* Cal Post-Divider byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define R_CD1 0x09 /* Cal Divider byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define R_CD2 0x0a /* Cal Divider byte 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define R_CD3 0x0b /* Cal Divider byte 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define R_MPD 0x0c /* Main Post-Divider byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define R_MD1 0x0d /* Main Divider byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define R_MD2 0x0e /* Main Divider byte 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define R_MD3 0x0f /* Main Divider byte 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define R_EB1 0x10 /* Extended byte 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define R_EB2 0x11 /* Extended byte 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define R_EB3 0x12 /* Extended byte 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define R_EB4 0x13 /* Extended byte 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define R_EB5 0x14 /* Extended byte 5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define R_EB6 0x15 /* Extended byte 6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define R_EB7 0x16 /* Extended byte 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define R_EB8 0x17 /* Extended byte 8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define R_EB9 0x18 /* Extended byte 9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define R_EB10 0x19 /* Extended byte 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define R_EB11 0x1a /* Extended byte 11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define R_EB12 0x1b /* Extended byte 12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define R_EB13 0x1c /* Extended byte 13 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define R_EB14 0x1d /* Extended byte 14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define R_EB15 0x1e /* Extended byte 15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define R_EB16 0x1f /* Extended byte 16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define R_EB17 0x20 /* Extended byte 17 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define R_EB18 0x21 /* Extended byte 18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define R_EB19 0x22 /* Extended byte 19 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define R_EB20 0x23 /* Extended byte 20 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define R_EB21 0x24 /* Extended byte 21 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define R_EB22 0x25 /* Extended byte 22 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define R_EB23 0x26 /* Extended byte 23 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define TDA18271_NUM_REGS 39
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) /*---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct tda18271_rf_tracking_filter_cal {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) u32 rfmax;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) u8 rfband;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) u32 rf1_def;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) u32 rf2_def;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) u32 rf3_def;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) u32 rf1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) u32 rf2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) u32 rf3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) s32 rf_a1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) s32 rf_b1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) s32 rf_a2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) s32 rf_b2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) enum tda18271_pll {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) TDA18271_MAIN_PLL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) TDA18271_CAL_PLL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) struct tda18271_map_layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) enum tda18271_ver {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) TDA18271HDC1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) TDA18271HDC2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) struct tda18271_priv {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) unsigned char tda18271_regs[TDA18271_NUM_REGS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) struct list_head hybrid_tuner_instance_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) struct tuner_i2c_props i2c_props;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) enum tda18271_mode mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) enum tda18271_role role;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) enum tda18271_i2c_gate gate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) enum tda18271_ver id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) enum tda18271_output_options output_opt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) enum tda18271_small_i2c small_i2c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) unsigned int config; /* interface to saa713x / tda829x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) unsigned int cal_initialized:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) u8 tm_rfcal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) struct tda18271_map_layout *maps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) struct tda18271_std_map std;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) struct tda18271_rf_tracking_filter_cal rf_cal_state[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) struct mutex lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) u16 if_freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) u32 frequency;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) u32 bandwidth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) /*---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) extern int tda18271_debug;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define DBG_INFO 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define DBG_MAP 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define DBG_REG 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define DBG_ADV 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define DBG_CAL 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) __attribute__((format(printf, 4, 5)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) void _tda_printk(struct tda18271_priv *state, const char *level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) const char *func, const char *fmt, ...);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define tda_printk(st, lvl, fmt, arg...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) _tda_printk(st, lvl, __func__, fmt, ##arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define tda_dprintk(st, lvl, fmt, arg...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) if (tda18271_debug & lvl) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) tda_printk(st, KERN_DEBUG, fmt, ##arg); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define tda_info(fmt, arg...) pr_info(fmt, ##arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define tda_warn(fmt, arg...) tda_printk(priv, KERN_WARNING, fmt, ##arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #define tda_err(fmt, arg...) tda_printk(priv, KERN_ERR, fmt, ##arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define tda_dbg(fmt, arg...) tda_dprintk(priv, DBG_INFO, fmt, ##arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define tda_map(fmt, arg...) tda_dprintk(priv, DBG_MAP, fmt, ##arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define tda_reg(fmt, arg...) tda_dprintk(priv, DBG_REG, fmt, ##arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define tda_cal(fmt, arg...) tda_dprintk(priv, DBG_CAL, fmt, ##arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define tda_fail(ret) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) ({ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) int __ret; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) __ret = (ret < 0); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) if (__ret) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) tda_printk(priv, KERN_ERR, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) "error %d on line %d\n", ret, __LINE__); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) __ret; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) /*---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) enum tda18271_map_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) /* tda18271_pll_map */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) MAIN_PLL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) CAL_PLL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) /* tda18271_map */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) RF_CAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) RF_CAL_KMCO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) RF_CAL_DC_OVER_DT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) BP_FILTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) RF_BAND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) GAIN_TAPER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) IR_MEASURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) extern int tda18271_lookup_pll_map(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) enum tda18271_map_type map_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) u32 *freq, u8 *post_div, u8 *div);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) extern int tda18271_lookup_map(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) enum tda18271_map_type map_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) u32 *freq, u8 *val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) extern int tda18271_lookup_thermometer(struct dvb_frontend *fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) extern int tda18271_lookup_rf_band(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) u32 *freq, u8 *rf_band);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) extern int tda18271_lookup_cid_target(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) u32 *freq, u8 *cid_target,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) u16 *count_limit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) extern int tda18271_assign_map_layout(struct dvb_frontend *fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) /*---------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) extern int tda18271_read_regs(struct dvb_frontend *fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) extern int tda18271_read_extended(struct dvb_frontend *fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) extern int tda18271_write_regs(struct dvb_frontend *fe, int idx, int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) extern int tda18271_init_regs(struct dvb_frontend *fe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) extern int tda18271_charge_pump_source(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) enum tda18271_pll pll, int force);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) extern int tda18271_set_standby_mode(struct dvb_frontend *fe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) int sm, int sm_lt, int sm_xt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) extern int tda18271_calc_main_pll(struct dvb_frontend *fe, u32 freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) extern int tda18271_calc_cal_pll(struct dvb_frontend *fe, u32 freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) extern int tda18271_calc_bp_filter(struct dvb_frontend *fe, u32 *freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) extern int tda18271_calc_km(struct dvb_frontend *fe, u32 *freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) extern int tda18271_calc_rf_band(struct dvb_frontend *fe, u32 *freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) extern int tda18271_calc_gain_taper(struct dvb_frontend *fe, u32 *freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) extern int tda18271_calc_ir_measure(struct dvb_frontend *fe, u32 *freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) extern int tda18271_calc_rf_cal(struct dvb_frontend *fe, u32 *freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) #endif /* __TDA18271_PRIV_H__ */