137 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2 /*3 Driver for Philips tda1004xh OFDM Frontend4 5 (c) 2004 Andrew de Quincey6 7 8 */9 10#ifndef TDA1004X_H11#define TDA1004X_H12 13#include <linux/dvb/frontend.h>14#include <linux/firmware.h>15 16enum tda10046_xtal {17 TDA10046_XTAL_4M,18 TDA10046_XTAL_16M,19};20 21enum tda10046_agc {22 TDA10046_AGC_DEFAULT, /* original configuration */23 TDA10046_AGC_IFO_AUTO_NEG, /* IF AGC only, automatic, negative */24 TDA10046_AGC_IFO_AUTO_POS, /* IF AGC only, automatic, positive */25 TDA10046_AGC_TDA827X, /* IF AGC only, special setup for tda827x */26};27 28/* Many (hybrid) boards use GPIO 1 and 329 GPIO1 analog - dvb switch30 GPIO3 firmware eeprom address switch31*/32enum tda10046_gpio {33 TDA10046_GPTRI = 0x00, /* All GPIOs tristate */34 TDA10046_GP00 = 0x40, /* GPIO3=0, GPIO1=0 */35 TDA10046_GP01 = 0x42, /* GPIO3=0, GPIO1=1 */36 TDA10046_GP10 = 0x48, /* GPIO3=1, GPIO1=0 */37 TDA10046_GP11 = 0x4a, /* GPIO3=1, GPIO1=1 */38 TDA10046_GP00_I = 0x80, /* GPIO3=0, GPIO1=0, invert in sleep mode*/39 TDA10046_GP01_I = 0x82, /* GPIO3=0, GPIO1=1, invert in sleep mode */40 TDA10046_GP10_I = 0x88, /* GPIO3=1, GPIO1=0, invert in sleep mode */41 TDA10046_GP11_I = 0x8a, /* GPIO3=1, GPIO1=1, invert in sleep mode */42};43 44enum tda10046_if {45 TDA10046_FREQ_3617, /* original config, 36,166 MHZ */46 TDA10046_FREQ_3613, /* 36,13 MHZ */47 TDA10046_FREQ_045, /* low IF, 4.0, 4.5, or 5.0 MHZ */48 TDA10046_FREQ_052, /* low IF, 5.1667 MHZ for tda9889 */49};50 51enum tda10046_tsout {52 TDA10046_TS_PARALLEL = 0x00, /* parallel transport stream, default */53 TDA10046_TS_SERIAL = 0x01, /* serial transport stream */54};55 56struct tda1004x_config57{58 /* the demodulator's i2c address */59 u8 demod_address;60 61 /* does the "inversion" need inverted? */62 u8 invert;63 64 /* Does the OCLK signal need inverted? */65 u8 invert_oclk;66 67 /* parallel or serial transport stream */68 enum tda10046_tsout ts_mode;69 70 /* Xtal frequency, 4 or 16MHz*/71 enum tda10046_xtal xtal_freq;72 73 /* IF frequency */74 enum tda10046_if if_freq;75 76 /* AGC configuration */77 enum tda10046_agc agc_config;78 79 /* setting of GPIO1 and 3 */80 enum tda10046_gpio gpio_config;81 82 /* slave address and configuration of the tuner */83 u8 tuner_address;84 u8 antenna_switch;85 86 /* if the board uses another I2c Bridge (tda8290), its address */87 u8 i2c_gate;88 89 /* request firmware for device */90 int (*request_firmware)(struct dvb_frontend* fe, const struct firmware **fw, char* name);91};92 93enum tda1004x_demod {94 TDA1004X_DEMOD_TDA10045,95 TDA1004X_DEMOD_TDA10046,96};97 98struct tda1004x_state {99 struct i2c_adapter* i2c;100 const struct tda1004x_config* config;101 struct dvb_frontend frontend;102 103 /* private demod data */104 enum tda1004x_demod demod_type;105};106 107#if IS_REACHABLE(CONFIG_DVB_TDA1004X)108extern struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config,109 struct i2c_adapter* i2c);110 111extern struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config,112 struct i2c_adapter* i2c);113#else114static inline struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config,115 struct i2c_adapter* i2c)116{117 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);118 return NULL;119}120static inline struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config,121 struct i2c_adapter* i2c)122{123 printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);124 return NULL;125}126#endif // CONFIG_DVB_TDA1004X127 128static inline int tda1004x_writereg(struct dvb_frontend *fe, u8 reg, u8 val) {129 int r = 0;130 u8 buf[] = {reg, val};131 if (fe->ops.write)132 r = fe->ops.write(fe, buf, 2);133 return r;134}135 136#endif // TDA1004X_H137