forked from Minki/linux
96506a5086
With this change it is possible to have the same I2C address for both tuners. Signed-off-by: Andreas Regel <andreas.regel@gmx.de> Signed-off-by: Manu Abraham <manu@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
280 lines
6.3 KiB
C
280 lines
6.3 KiB
C
/*
|
|
STV0900/0903 Multistandard Broadcast Frontend driver
|
|
Copyright (C) Manu Abraham <abraham.manu@gmail.com>
|
|
|
|
Copyright (C) ST Microelectronics
|
|
|
|
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 __STV090x_PRIV_H
|
|
#define __STV090x_PRIV_H
|
|
|
|
#include "dvb_frontend.h"
|
|
|
|
#define FE_ERROR 0
|
|
#define FE_NOTICE 1
|
|
#define FE_INFO 2
|
|
#define FE_DEBUG 3
|
|
#define FE_DEBUGREG 4
|
|
|
|
#define dprintk(__y, __z, format, arg...) do { \
|
|
if (__z) { \
|
|
if ((verbose > FE_ERROR) && (verbose > __y)) \
|
|
printk(KERN_ERR "%s: " format "\n", __func__ , ##arg); \
|
|
else if ((verbose > FE_NOTICE) && (verbose > __y)) \
|
|
printk(KERN_NOTICE "%s: " format "\n", __func__ , ##arg); \
|
|
else if ((verbose > FE_INFO) && (verbose > __y)) \
|
|
printk(KERN_INFO "%s: " format "\n", __func__ , ##arg); \
|
|
else if ((verbose > FE_DEBUG) && (verbose > __y)) \
|
|
printk(KERN_DEBUG "%s: " format "\n", __func__ , ##arg); \
|
|
} else { \
|
|
if (verbose > __y) \
|
|
printk(format, ##arg); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define STV090x_READ_DEMOD(__state, __reg) (( \
|
|
(__state)->demod == STV090x_DEMODULATOR_1) ? \
|
|
stv090x_read_reg(__state, STV090x_P2_##__reg) : \
|
|
stv090x_read_reg(__state, STV090x_P1_##__reg))
|
|
|
|
#define STV090x_WRITE_DEMOD(__state, __reg, __data) (( \
|
|
(__state)->demod == STV090x_DEMODULATOR_1) ? \
|
|
stv090x_write_reg(__state, STV090x_P2_##__reg, __data) :\
|
|
stv090x_write_reg(__state, STV090x_P1_##__reg, __data))
|
|
|
|
#define STV090x_ADDR_OFFST(__state, __x) (( \
|
|
(__state->demod) == STV090x_DEMODULATOR_1) ? \
|
|
STV090x_P1_##__x : \
|
|
STV090x_P2_##__x)
|
|
|
|
|
|
#define STV090x_SETFIELD(mask, bitf, val) (mask = (mask & (~(((1 << STV090x_WIDTH_##bitf) - 1) <<\
|
|
STV090x_OFFST_##bitf))) | \
|
|
(val << STV090x_OFFST_##bitf))
|
|
|
|
#define STV090x_GETFIELD(val, bitf) ((val >> STV090x_OFFST_##bitf) & ((1 << STV090x_WIDTH_##bitf) - 1))
|
|
|
|
|
|
#define STV090x_SETFIELD_Px(mask, bitf, val) (mask = (mask & (~(((1 << STV090x_WIDTH_Px_##bitf) - 1) <<\
|
|
STV090x_OFFST_Px_##bitf))) | \
|
|
(val << STV090x_OFFST_Px_##bitf))
|
|
|
|
#define STV090x_GETFIELD_Px(val, bitf) ((val >> STV090x_OFFST_Px_##bitf) & ((1 << STV090x_WIDTH_Px_##bitf) - 1))
|
|
|
|
#define MAKEWORD16(__a, __b) (((__a) << 8) | (__b))
|
|
|
|
#define MSB(__x) ((__x >> 8) & 0xff)
|
|
#define LSB(__x) (__x & 0xff)
|
|
|
|
|
|
#define STV090x_IQPOWER_THRESHOLD 30
|
|
#define STV090x_SEARCH_AGC2_TH_CUT20 700
|
|
#define STV090x_SEARCH_AGC2_TH_CUT30 1400
|
|
|
|
#define STV090x_SEARCH_AGC2_TH(__ver) \
|
|
((__ver <= 0x20) ? \
|
|
STV090x_SEARCH_AGC2_TH_CUT20 : \
|
|
STV090x_SEARCH_AGC2_TH_CUT30)
|
|
|
|
enum stv090x_signal_state {
|
|
STV090x_NOAGC1,
|
|
STV090x_NOCARRIER,
|
|
STV090x_NODATA,
|
|
STV090x_DATAOK,
|
|
STV090x_RANGEOK,
|
|
STV090x_OUTOFRANGE
|
|
};
|
|
|
|
enum stv090x_fec {
|
|
STV090x_PR12 = 0,
|
|
STV090x_PR23,
|
|
STV090x_PR34,
|
|
STV090x_PR45,
|
|
STV090x_PR56,
|
|
STV090x_PR67,
|
|
STV090x_PR78,
|
|
STV090x_PR89,
|
|
STV090x_PR910,
|
|
STV090x_PRERR
|
|
};
|
|
|
|
enum stv090x_modulation {
|
|
STV090x_QPSK,
|
|
STV090x_8PSK,
|
|
STV090x_16APSK,
|
|
STV090x_32APSK,
|
|
STV090x_UNKNOWN
|
|
};
|
|
|
|
enum stv090x_frame {
|
|
STV090x_LONG_FRAME,
|
|
STV090x_SHORT_FRAME
|
|
};
|
|
|
|
enum stv090x_pilot {
|
|
STV090x_PILOTS_OFF,
|
|
STV090x_PILOTS_ON
|
|
};
|
|
|
|
enum stv090x_rolloff {
|
|
STV090x_RO_35,
|
|
STV090x_RO_25,
|
|
STV090x_RO_20
|
|
};
|
|
|
|
enum stv090x_inversion {
|
|
STV090x_IQ_AUTO,
|
|
STV090x_IQ_NORMAL,
|
|
STV090x_IQ_SWAP
|
|
};
|
|
|
|
enum stv090x_modcod {
|
|
STV090x_DUMMY_PLF = 0,
|
|
STV090x_QPSK_14,
|
|
STV090x_QPSK_13,
|
|
STV090x_QPSK_25,
|
|
STV090x_QPSK_12,
|
|
STV090x_QPSK_35,
|
|
STV090x_QPSK_23,
|
|
STV090x_QPSK_34,
|
|
STV090x_QPSK_45,
|
|
STV090x_QPSK_56,
|
|
STV090x_QPSK_89,
|
|
STV090x_QPSK_910,
|
|
STV090x_8PSK_35,
|
|
STV090x_8PSK_23,
|
|
STV090x_8PSK_34,
|
|
STV090x_8PSK_56,
|
|
STV090x_8PSK_89,
|
|
STV090x_8PSK_910,
|
|
STV090x_16APSK_23,
|
|
STV090x_16APSK_34,
|
|
STV090x_16APSK_45,
|
|
STV090x_16APSK_56,
|
|
STV090x_16APSK_89,
|
|
STV090x_16APSK_910,
|
|
STV090x_32APSK_34,
|
|
STV090x_32APSK_45,
|
|
STV090x_32APSK_56,
|
|
STV090x_32APSK_89,
|
|
STV090x_32APSK_910,
|
|
STV090x_MODCODE_UNKNOWN
|
|
};
|
|
|
|
enum stv090x_search {
|
|
STV090x_SEARCH_DSS = 0,
|
|
STV090x_SEARCH_DVBS1,
|
|
STV090x_SEARCH_DVBS2,
|
|
STV090x_SEARCH_AUTO
|
|
};
|
|
|
|
enum stv090x_algo {
|
|
STV090x_BLIND_SEARCH,
|
|
STV090x_COLD_SEARCH,
|
|
STV090x_WARM_SEARCH
|
|
};
|
|
|
|
enum stv090x_delsys {
|
|
STV090x_ERROR = 0,
|
|
STV090x_DVBS1 = 1,
|
|
STV090x_DVBS2,
|
|
STV090x_DSS
|
|
};
|
|
|
|
struct stv090x_long_frame_crloop {
|
|
enum stv090x_modcod modcod;
|
|
|
|
u8 crl_pilots_on_2;
|
|
u8 crl_pilots_off_2;
|
|
u8 crl_pilots_on_5;
|
|
u8 crl_pilots_off_5;
|
|
u8 crl_pilots_on_10;
|
|
u8 crl_pilots_off_10;
|
|
u8 crl_pilots_on_20;
|
|
u8 crl_pilots_off_20;
|
|
u8 crl_pilots_on_30;
|
|
u8 crl_pilots_off_30;
|
|
};
|
|
|
|
struct stv090x_short_frame_crloop {
|
|
enum stv090x_modulation modulation;
|
|
|
|
u8 crl_2; /* SR < 3M */
|
|
u8 crl_5; /* 3 < SR <= 7M */
|
|
u8 crl_10; /* 7 < SR <= 15M */
|
|
u8 crl_20; /* 10 < SR <= 25M */
|
|
u8 crl_30; /* 10 < SR <= 45M */
|
|
};
|
|
|
|
struct stv090x_reg {
|
|
u16 addr;
|
|
u8 data;
|
|
};
|
|
|
|
struct stv090x_tab {
|
|
s32 real;
|
|
s32 read;
|
|
};
|
|
|
|
struct stv090x_internal {
|
|
struct i2c_adapter *i2c_adap;
|
|
u8 i2c_addr;
|
|
|
|
struct mutex demod_lock; /* Lock access to shared register */
|
|
struct mutex tuner_lock; /* Lock access to tuners */
|
|
s32 mclk; /* Masterclock Divider factor */
|
|
u32 dev_ver;
|
|
|
|
int num_used;
|
|
};
|
|
|
|
struct stv090x_state {
|
|
enum stv090x_device device;
|
|
enum stv090x_demodulator demod;
|
|
enum stv090x_mode demod_mode;
|
|
struct stv090x_internal *internal;
|
|
|
|
struct i2c_adapter *i2c;
|
|
const struct stv090x_config *config;
|
|
struct dvb_frontend frontend;
|
|
|
|
u32 *verbose; /* Cached module verbosity */
|
|
|
|
enum stv090x_delsys delsys;
|
|
enum stv090x_fec fec;
|
|
enum stv090x_modulation modulation;
|
|
enum stv090x_modcod modcod;
|
|
enum stv090x_search search_mode;
|
|
enum stv090x_frame frame_len;
|
|
enum stv090x_pilot pilots;
|
|
enum stv090x_rolloff rolloff;
|
|
enum stv090x_inversion inversion;
|
|
enum stv090x_algo algo;
|
|
|
|
u32 frequency;
|
|
u32 srate;
|
|
|
|
s32 tuner_bw;
|
|
|
|
s32 search_range;
|
|
|
|
s32 DemodTimeout;
|
|
s32 FecTimeout;
|
|
};
|
|
|
|
#endif /* __STV090x_PRIV_H */
|