tda18271-priv.h 7.1 KB
Newer Older
1 2 3
/*
    tda18271-priv.h - private header for the NXP TDA18271 silicon tuner

4
    Copyright (C) 2007, 2008 Michael Krufky <mkrufky@linuxtv.org>
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#ifndef __TDA18271_PRIV_H__
#define __TDA18271_PRIV_H__

24
#include <linux/kernel.h>
25
#include <linux/types.h>
26
#include "tda18271.h"
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

#define R_ID     0x00	/* ID byte                */
#define R_TM     0x01	/* Thermo byte            */
#define R_PL     0x02	/* Power level byte       */
#define R_EP1    0x03	/* Easy Prog byte 1       */
#define R_EP2    0x04	/* Easy Prog byte 2       */
#define R_EP3    0x05	/* Easy Prog byte 3       */
#define R_EP4    0x06	/* Easy Prog byte 4       */
#define R_EP5    0x07	/* Easy Prog byte 5       */
#define R_CPD    0x08	/* Cal Post-Divider byte  */
#define R_CD1    0x09	/* Cal Divider byte 1     */
#define R_CD2    0x0a	/* Cal Divider byte 2     */
#define R_CD3    0x0b	/* Cal Divider byte 3     */
#define R_MPD    0x0c	/* Main Post-Divider byte */
#define R_MD1    0x0d	/* Main Divider byte 1    */
#define R_MD2    0x0e	/* Main Divider byte 2    */
#define R_MD3    0x0f	/* Main Divider byte 3    */
#define R_EB1    0x10	/* Extended byte 1        */
#define R_EB2    0x11	/* Extended byte 2        */
#define R_EB3    0x12	/* Extended byte 3        */
#define R_EB4    0x13	/* Extended byte 4        */
#define R_EB5    0x14	/* Extended byte 5        */
#define R_EB6    0x15	/* Extended byte 6        */
#define R_EB7    0x16	/* Extended byte 7        */
#define R_EB8    0x17	/* Extended byte 8        */
#define R_EB9    0x18	/* Extended byte 9        */
#define R_EB10   0x19	/* Extended byte 10       */
#define R_EB11   0x1a	/* Extended byte 11       */
#define R_EB12   0x1b	/* Extended byte 12       */
#define R_EB13   0x1c	/* Extended byte 13       */
#define R_EB14   0x1d	/* Extended byte 14       */
#define R_EB15   0x1e	/* Extended byte 15       */
#define R_EB16   0x1f	/* Extended byte 16       */
#define R_EB17   0x20	/* Extended byte 17       */
#define R_EB18   0x21	/* Extended byte 18       */
#define R_EB19   0x22	/* Extended byte 19       */
#define R_EB20   0x23	/* Extended byte 20       */
#define R_EB21   0x24	/* Extended byte 21       */
#define R_EB22   0x25	/* Extended byte 22       */
#define R_EB23   0x26	/* Extended byte 23       */

#define TDA18271_NUM_REGS 39

70 71
/*---------------------------------------------------------------------*/

72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
struct tda18271_rf_tracking_filter_cal {
	u32 rfmax;
	u8  rfband;
	u32 rf1_def;
	u32 rf2_def;
	u32 rf3_def;
	u32 rf1;
	u32 rf2;
	u32 rf3;
	int rf_a1;
	int rf_b1;
	int rf_a2;
	int rf_b2;
};

struct tda18271_std_map_item {
	u32 if_freq;
	u8 std_bits;
};

struct tda18271_std_map {
	struct tda18271_std_map_item atv_b;
	struct tda18271_std_map_item atv_dk;
	struct tda18271_std_map_item atv_gh;
	struct tda18271_std_map_item atv_i;
	struct tda18271_std_map_item atv_l;
	struct tda18271_std_map_item atv_lc;
	struct tda18271_std_map_item atv_mn;
	struct tda18271_std_map_item atsc_6;
	struct tda18271_std_map_item dvbt_6;
	struct tda18271_std_map_item dvbt_7;
	struct tda18271_std_map_item dvbt_8;
	struct tda18271_std_map_item qam_6;
	struct tda18271_std_map_item qam_8;
};

108 109 110 111 112
enum tda18271_mode {
	TDA18271_ANALOG,
	TDA18271_DIGITAL,
};

113 114 115 116 117 118 119
struct tda18271_map_layout;

enum tda18271_ver {
	TDA18271HDC1,
	TDA18271HDC2,
};

120 121 122 123 124 125 126
struct tda18271_priv {
	u8 i2c_addr;
	struct i2c_adapter *i2c_adap;
	unsigned char tda18271_regs[TDA18271_NUM_REGS];

	enum tda18271_mode mode;
	enum tda18271_i2c_gate gate;
127 128 129 130 131 132 133 134 135 136
	enum tda18271_ver id;

	unsigned int cal_initialized:1;

	struct tda18271_std_map *std;
	struct tda18271_map_layout *maps;
	struct tda18271_rf_tracking_filter_cal rf_cal_state[8];

	int (*tune) (struct dvb_frontend *fe,
		     u32 ifc, u32 freq, u32 bw, u8 std);
137 138 139 140 141 142 143

	u32 frequency;
	u32 bandwidth;
};

/*---------------------------------------------------------------------*/

144 145 146 147 148
extern int tda18271_debug;

#define DBG_INFO 1
#define DBG_MAP  2
#define DBG_REG  4
149
#define DBG_ADV  8
150

151 152 153 154 155 156 157 158 159 160 161 162 163
#define tda_printk(kern, fmt, arg...) \
	printk(kern "%s: " fmt, __FUNCTION__, ##arg)

#define dprintk(kern, lvl, fmt, arg...) do {\
	if (tda18271_debug & lvl) \
		tda_printk(kern, fmt, ##arg); } while (0)

#define tda_info(fmt, arg...) printk(KERN_INFO              fmt, ##arg)
#define tda_warn(fmt, arg...) tda_printk(KERN_WARNING,      fmt, ##arg)
#define tda_err(fmt, arg...)  tda_printk(KERN_ERR,          fmt, ##arg)
#define tda_dbg(fmt, arg...)  dprintk(KERN_DEBUG, DBG_INFO, fmt, ##arg)
#define tda_map(fmt, arg...)  dprintk(KERN_DEBUG, DBG_MAP,  fmt, ##arg)
#define tda_reg(fmt, arg...)  dprintk(KERN_DEBUG, DBG_REG,  fmt, ##arg)
164 165 166

/*---------------------------------------------------------------------*/

167 168 169 170 171 172 173
enum tda18271_map_type {
	/* tda18271_pll_map */
	MAIN_PLL,
	CAL_PLL,
	/* tda18271_map */
	RF_CAL,
	RF_CAL_KMCO,
174
	RF_CAL_DC_OVER_DT,
175 176 177 178 179 180
	BP_FILTER,
	RF_BAND,
	GAIN_TAPER,
	IR_MEASURE,
};

181 182
extern int tda18271_lookup_pll_map(struct dvb_frontend *fe,
				   enum tda18271_map_type map_type,
183
				   u32 *freq, u8 *post_div, u8 *div);
184 185
extern int tda18271_lookup_map(struct dvb_frontend *fe,
			       enum tda18271_map_type map_type,
186
			       u32 *freq, u8 *val);
187

188 189 190 191 192 193 194 195 196 197 198
extern int tda18271_lookup_thermometer(struct dvb_frontend *fe);

extern int tda18271_lookup_rf_band(struct dvb_frontend *fe,
				   u32 *freq, u8 *rf_band);

extern int tda18271_lookup_cid_target(struct dvb_frontend *fe,
				      u32 *freq, u8 *cid_target,
				      u16 *count_limit);

extern int tda18271_assign_map_layout(struct dvb_frontend *fe);

199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
/*---------------------------------------------------------------------*/

extern int tda18271_read_regs(struct dvb_frontend *fe);
extern int tda18271_read_extended(struct dvb_frontend *fe);
extern int tda18271_write_regs(struct dvb_frontend *fe, int idx, int len);
extern int tda18271_init_regs(struct dvb_frontend *fe);

extern int tda18271_calc_main_pll(struct dvb_frontend *fe, u32 freq);
extern int tda18271_calc_cal_pll(struct dvb_frontend *fe, u32 freq);

extern int tda18271_calc_bp_filter(struct dvb_frontend *fe, u32 *freq);
extern int tda18271_calc_km(struct dvb_frontend *fe, u32 *freq);
extern int tda18271_calc_rf_band(struct dvb_frontend *fe, u32 *freq);
extern int tda18271_calc_gain_taper(struct dvb_frontend *fe, u32 *freq);
extern int tda18271_calc_ir_measure(struct dvb_frontend *fe, u32 *freq);
extern int tda18271_calc_rf_cal(struct dvb_frontend *fe, u32 *freq);

216 217 218 219 220 221 222 223 224
#endif /* __TDA18271_PRIV_H__ */

/*
 * Overrides for Emacs so that we follow Linus's tabbing style.
 * ---------------------------------------------------------------------------
 * Local variables:
 * c-basic-offset: 8
 * End:
 */