linux/drivers/media/dvb-frontends/tda1004x.h
<<
>>
Prefs
   1  /*
   2     Driver for Philips tda1004xh OFDM Frontend
   3
   4     (c) 2004 Andrew de Quincey
   5
   6     This program is free software; you can redistribute it and/or modify
   7     it under the terms of the GNU General Public License as published by
   8     the Free Software Foundation; either version 2 of the License, or
   9     (at your option) any later version.
  10
  11     This program is distributed in the hope that it will be useful,
  12     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14
  15     GNU General Public License for more details.
  16
  17     You should have received a copy of the GNU General Public License
  18     along with this program; if not, write to the Free Software
  19     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20
  21   */
  22
  23#ifndef TDA1004X_H
  24#define TDA1004X_H
  25
  26#include <linux/dvb/frontend.h>
  27#include <linux/firmware.h>
  28
  29enum tda10046_xtal {
  30        TDA10046_XTAL_4M,
  31        TDA10046_XTAL_16M,
  32};
  33
  34enum tda10046_agc {
  35        TDA10046_AGC_DEFAULT,           /* original configuration */
  36        TDA10046_AGC_IFO_AUTO_NEG,      /* IF AGC only, automatic, negtive */
  37        TDA10046_AGC_IFO_AUTO_POS,      /* IF AGC only, automatic, positive */
  38        TDA10046_AGC_TDA827X,           /* IF AGC only, special setup for tda827x */
  39};
  40
  41/* Many (hybrid) boards use GPIO 1 and 3
  42        GPIO1   analog - dvb switch
  43        GPIO3   firmware eeprom address switch
  44*/
  45enum tda10046_gpio {
  46        TDA10046_GPTRI  = 0x00,         /* All GPIOs tristate */
  47        TDA10046_GP00   = 0x40,         /* GPIO3=0, GPIO1=0 */
  48        TDA10046_GP01   = 0x42,         /* GPIO3=0, GPIO1=1 */
  49        TDA10046_GP10   = 0x48,         /* GPIO3=1, GPIO1=0 */
  50        TDA10046_GP11   = 0x4a,         /* GPIO3=1, GPIO1=1 */
  51        TDA10046_GP00_I = 0x80,         /* GPIO3=0, GPIO1=0, invert in sleep mode*/
  52        TDA10046_GP01_I = 0x82,         /* GPIO3=0, GPIO1=1, invert in sleep mode */
  53        TDA10046_GP10_I = 0x88,         /* GPIO3=1, GPIO1=0, invert in sleep mode */
  54        TDA10046_GP11_I = 0x8a,         /* GPIO3=1, GPIO1=1, invert in sleep mode */
  55};
  56
  57enum tda10046_if {
  58        TDA10046_FREQ_3617,             /* original config, 36,166 MHZ */
  59        TDA10046_FREQ_3613,             /* 36,13 MHZ */
  60        TDA10046_FREQ_045,              /* low IF, 4.0, 4.5, or 5.0 MHZ */
  61        TDA10046_FREQ_052,              /* low IF, 5.1667 MHZ for tda9889 */
  62};
  63
  64enum tda10046_tsout {
  65        TDA10046_TS_PARALLEL  = 0x00,   /* parallel transport stream, default */
  66        TDA10046_TS_SERIAL    = 0x01,   /* serial transport stream */
  67};
  68
  69struct tda1004x_config
  70{
  71        /* the demodulator's i2c address */
  72        u8 demod_address;
  73
  74        /* does the "inversion" need inverted? */
  75        u8 invert;
  76
  77        /* Does the OCLK signal need inverted? */
  78        u8 invert_oclk;
  79
  80        /* parallel or serial transport stream */
  81        enum tda10046_tsout ts_mode;
  82
  83        /* Xtal frequency, 4 or 16MHz*/
  84        enum tda10046_xtal xtal_freq;
  85
  86        /* IF frequency */
  87        enum tda10046_if if_freq;
  88
  89        /* AGC configuration */
  90        enum tda10046_agc agc_config;
  91
  92        /* setting of GPIO1 and 3 */
  93        enum tda10046_gpio gpio_config;
  94
  95        /* slave address and configuration of the tuner */
  96        u8 tuner_address;
  97        u8 antenna_switch;
  98
  99        /* if the board uses another I2c Bridge (tda8290), its address */
 100        u8 i2c_gate;
 101
 102        /* request firmware for device */
 103        int (*request_firmware)(struct dvb_frontend* fe, const struct firmware **fw, char* name);
 104};
 105
 106enum tda1004x_demod {
 107        TDA1004X_DEMOD_TDA10045,
 108        TDA1004X_DEMOD_TDA10046,
 109};
 110
 111struct tda1004x_state {
 112        struct i2c_adapter* i2c;
 113        const struct tda1004x_config* config;
 114        struct dvb_frontend frontend;
 115
 116        /* private demod data */
 117        enum tda1004x_demod demod_type;
 118};
 119
 120#if IS_ENABLED(CONFIG_DVB_TDA1004X)
 121extern struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config,
 122                                            struct i2c_adapter* i2c);
 123
 124extern struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config,
 125                                            struct i2c_adapter* i2c);
 126#else
 127static inline struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config,
 128                                            struct i2c_adapter* i2c)
 129{
 130        printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
 131        return NULL;
 132}
 133static inline struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config,
 134                                            struct i2c_adapter* i2c)
 135{
 136        printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
 137        return NULL;
 138}
 139#endif // CONFIG_DVB_TDA1004X
 140
 141static inline int tda1004x_writereg(struct dvb_frontend *fe, u8 reg, u8 val) {
 142        int r = 0;
 143        u8 buf[] = {reg, val};
 144        if (fe->ops.write)
 145                r = fe->ops.write(fe, buf, 2);
 146        return r;
 147}
 148
 149#endif // TDA1004X_H
 150