Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 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 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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | /* SPDX-License-Identifier: GPL-2.0-or-later */ /* Driver for Philips tda1004xh OFDM Frontend (c) 2004 Andrew de Quincey */ #ifndef TDA1004X_H #define TDA1004X_H #include <linux/dvb/frontend.h> #include <linux/firmware.h> enum tda10046_xtal { TDA10046_XTAL_4M, TDA10046_XTAL_16M, }; enum tda10046_agc { TDA10046_AGC_DEFAULT, /* original configuration */ TDA10046_AGC_IFO_AUTO_NEG, /* IF AGC only, automatic, negative */ TDA10046_AGC_IFO_AUTO_POS, /* IF AGC only, automatic, positive */ TDA10046_AGC_TDA827X, /* IF AGC only, special setup for tda827x */ }; /* Many (hybrid) boards use GPIO 1 and 3 GPIO1 analog - dvb switch GPIO3 firmware eeprom address switch */ enum tda10046_gpio { TDA10046_GPTRI = 0x00, /* All GPIOs tristate */ TDA10046_GP00 = 0x40, /* GPIO3=0, GPIO1=0 */ TDA10046_GP01 = 0x42, /* GPIO3=0, GPIO1=1 */ TDA10046_GP10 = 0x48, /* GPIO3=1, GPIO1=0 */ TDA10046_GP11 = 0x4a, /* GPIO3=1, GPIO1=1 */ TDA10046_GP00_I = 0x80, /* GPIO3=0, GPIO1=0, invert in sleep mode*/ TDA10046_GP01_I = 0x82, /* GPIO3=0, GPIO1=1, invert in sleep mode */ TDA10046_GP10_I = 0x88, /* GPIO3=1, GPIO1=0, invert in sleep mode */ TDA10046_GP11_I = 0x8a, /* GPIO3=1, GPIO1=1, invert in sleep mode */ }; enum tda10046_if { TDA10046_FREQ_3617, /* original config, 36,166 MHZ */ TDA10046_FREQ_3613, /* 36,13 MHZ */ TDA10046_FREQ_045, /* low IF, 4.0, 4.5, or 5.0 MHZ */ TDA10046_FREQ_052, /* low IF, 5.1667 MHZ for tda9889 */ }; enum tda10046_tsout { TDA10046_TS_PARALLEL = 0x00, /* parallel transport stream, default */ TDA10046_TS_SERIAL = 0x01, /* serial transport stream */ }; struct tda1004x_config { /* the demodulator's i2c address */ u8 demod_address; /* does the "inversion" need inverted? */ u8 invert; /* Does the OCLK signal need inverted? */ u8 invert_oclk; /* parallel or serial transport stream */ enum tda10046_tsout ts_mode; /* Xtal frequency, 4 or 16MHz*/ enum tda10046_xtal xtal_freq; /* IF frequency */ enum tda10046_if if_freq; /* AGC configuration */ enum tda10046_agc agc_config; /* setting of GPIO1 and 3 */ enum tda10046_gpio gpio_config; /* slave address and configuration of the tuner */ u8 tuner_address; u8 antenna_switch; /* if the board uses another I2c Bridge (tda8290), its address */ u8 i2c_gate; /* request firmware for device */ int (*request_firmware)(struct dvb_frontend* fe, const struct firmware **fw, char* name); }; enum tda1004x_demod { TDA1004X_DEMOD_TDA10045, TDA1004X_DEMOD_TDA10046, }; struct tda1004x_state { struct i2c_adapter* i2c; const struct tda1004x_config* config; struct dvb_frontend frontend; /* private demod data */ enum tda1004x_demod demod_type; }; #if IS_REACHABLE(CONFIG_DVB_TDA1004X) extern struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config, struct i2c_adapter* i2c); extern struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config, struct i2c_adapter* i2c); #else static inline struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config, struct i2c_adapter* i2c) { printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); return NULL; } static inline struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config, struct i2c_adapter* i2c) { printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); return NULL; } #endif // CONFIG_DVB_TDA1004X static inline int tda1004x_writereg(struct dvb_frontend *fe, u8 reg, u8 val) { int r = 0; u8 buf[] = {reg, val}; if (fe->ops.write) r = fe->ops.write(fe, buf, 2); return r; } #endif // TDA1004X_H |