[media] drxk: Fix the antenna switch logic
Terratec H5 doesn't require to switch mode, but generates an error due to this logic. Also, GPIO's are board-dependent. So, add it at the board config struct. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Родитель
d6a0540577
Коммит
147e110bb6
|
@ -4,10 +4,25 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct drxk_config - Configure the initial parameters for DRX-K
|
||||||
|
*
|
||||||
|
* adr: I2C Address of the DRX-K
|
||||||
|
* single_master: Device is on the single master mode
|
||||||
|
* no_i2c_bridge: Don't switch the I2C bridge to talk with tuner
|
||||||
|
* antenna_uses_gpio: Use GPIO to control the antenna
|
||||||
|
* antenna_dvbc: GPIO for changing antenna to DVB-C
|
||||||
|
* antenna_dvbt: GPIO for changing antenna to DVB-T
|
||||||
|
* microcode_name: Name of the firmware file with the microcode
|
||||||
|
*/
|
||||||
struct drxk_config {
|
struct drxk_config {
|
||||||
u8 adr;
|
u8 adr;
|
||||||
u32 single_master : 1;
|
bool single_master;
|
||||||
u32 no_i2c_bridge : 1;
|
bool no_i2c_bridge;
|
||||||
|
|
||||||
|
bool antenna_uses_gpio;
|
||||||
|
u16 antenna_dvbc, antenna_dvbt;
|
||||||
|
|
||||||
const char *microcode_name;
|
const char *microcode_name;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -618,6 +618,10 @@ error:
|
||||||
|
|
||||||
static int init_state(struct drxk_state *state)
|
static int init_state(struct drxk_state *state)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* FIXME: most (all?) of the values bellow should be moved into
|
||||||
|
* struct drxk_config, as they are probably board-specific
|
||||||
|
*/
|
||||||
u32 ulVSBIfAgcMode = DRXK_AGC_CTRL_AUTO;
|
u32 ulVSBIfAgcMode = DRXK_AGC_CTRL_AUTO;
|
||||||
u32 ulVSBIfAgcOutputLevel = 0;
|
u32 ulVSBIfAgcOutputLevel = 0;
|
||||||
u32 ulVSBIfAgcMinLevel = 0;
|
u32 ulVSBIfAgcMinLevel = 0;
|
||||||
|
@ -672,10 +676,6 @@ static int init_state(struct drxk_state *state)
|
||||||
u32 ulRfMirror = 1;
|
u32 ulRfMirror = 1;
|
||||||
u32 ulPowerDown = 0;
|
u32 ulPowerDown = 0;
|
||||||
|
|
||||||
u32 ulAntennaDVBT = 1;
|
|
||||||
u32 ulAntennaDVBC = 0;
|
|
||||||
u32 ulAntennaSwitchDVBTDVBC = 0;
|
|
||||||
|
|
||||||
dprintk(1, "\n");
|
dprintk(1, "\n");
|
||||||
|
|
||||||
state->m_hasLNA = false;
|
state->m_hasLNA = false;
|
||||||
|
@ -858,11 +858,6 @@ static int init_state(struct drxk_state *state)
|
||||||
state->m_GPIOCfg = (ulGPIOCfg);
|
state->m_GPIOCfg = (ulGPIOCfg);
|
||||||
state->m_GPIO = (ulGPIO == 0 ? 0 : 1);
|
state->m_GPIO = (ulGPIO == 0 ? 0 : 1);
|
||||||
|
|
||||||
state->m_AntennaDVBT = (ulAntennaDVBT == 0 ? 0 : 1);
|
|
||||||
state->m_AntennaDVBC = (ulAntennaDVBC == 0 ? 0 : 1);
|
|
||||||
state->m_AntennaSwitchDVBTDVBC =
|
|
||||||
(ulAntennaSwitchDVBTDVBC == 0 ? 0 : 1);
|
|
||||||
|
|
||||||
state->m_bPowerDown = false;
|
state->m_bPowerDown = false;
|
||||||
state->m_currentPowerMode = DRX_POWER_DOWN;
|
state->m_currentPowerMode = DRX_POWER_DOWN;
|
||||||
|
|
||||||
|
@ -5819,9 +5814,10 @@ error:
|
||||||
|
|
||||||
static int SwitchAntennaToQAM(struct drxk_state *state)
|
static int SwitchAntennaToQAM(struct drxk_state *state)
|
||||||
{
|
{
|
||||||
int status = -EINVAL;
|
int status = 0;
|
||||||
|
|
||||||
dprintk(1, "\n");
|
dprintk(1, "\n");
|
||||||
|
|
||||||
if (state->m_AntennaSwitchDVBTDVBC != 0) {
|
if (state->m_AntennaSwitchDVBTDVBC != 0) {
|
||||||
if (state->m_GPIO != state->m_AntennaDVBC) {
|
if (state->m_GPIO != state->m_AntennaDVBC) {
|
||||||
state->m_GPIO = state->m_AntennaDVBC;
|
state->m_GPIO = state->m_AntennaDVBC;
|
||||||
|
@ -5835,7 +5831,7 @@ static int SwitchAntennaToQAM(struct drxk_state *state)
|
||||||
|
|
||||||
static int SwitchAntennaToDVBT(struct drxk_state *state)
|
static int SwitchAntennaToDVBT(struct drxk_state *state)
|
||||||
{
|
{
|
||||||
int status = -EINVAL;
|
int status = 0;
|
||||||
|
|
||||||
dprintk(1, "\n");
|
dprintk(1, "\n");
|
||||||
if (state->m_AntennaSwitchDVBTDVBC != 0) {
|
if (state->m_AntennaSwitchDVBTDVBC != 0) {
|
||||||
|
@ -6344,6 +6340,9 @@ struct dvb_frontend *drxk_attach(const struct drxk_config *config,
|
||||||
state->single_master = config->single_master;
|
state->single_master = config->single_master;
|
||||||
state->microcode_name = config->microcode_name;
|
state->microcode_name = config->microcode_name;
|
||||||
state->no_i2c_bridge = config->no_i2c_bridge;
|
state->no_i2c_bridge = config->no_i2c_bridge;
|
||||||
|
state->m_AntennaSwitchDVBTDVBC = config->antenna_uses_gpio;
|
||||||
|
state->m_AntennaDVBC = config->antenna_dvbc;
|
||||||
|
state->m_AntennaDVBT = config->antenna_dvbt;
|
||||||
|
|
||||||
mutex_init(&state->mutex);
|
mutex_init(&state->mutex);
|
||||||
mutex_init(&state->ctlock);
|
mutex_init(&state->ctlock);
|
||||||
|
|
|
@ -321,16 +321,17 @@ struct drxk_state {
|
||||||
u8 m_deviceSpin;
|
u8 m_deviceSpin;
|
||||||
u32 m_iqmRcRate;
|
u32 m_iqmRcRate;
|
||||||
|
|
||||||
u16 m_AntennaDVBC;
|
|
||||||
u16 m_AntennaDVBT;
|
|
||||||
u16 m_AntennaSwitchDVBTDVBC;
|
|
||||||
|
|
||||||
enum DRXPowerMode m_currentPowerMode;
|
enum DRXPowerMode m_currentPowerMode;
|
||||||
|
|
||||||
/* Configurable parameters at the driver */
|
/* Configurable parameters at the driver */
|
||||||
|
|
||||||
|
bool m_AntennaSwitchDVBTDVBC;
|
||||||
|
u16 m_AntennaDVBC;
|
||||||
|
u16 m_AntennaDVBT;
|
||||||
|
|
||||||
u32 single_master : 1; /* Use single master i2c mode */
|
u32 single_master : 1; /* Use single master i2c mode */
|
||||||
u32 no_i2c_bridge : 1; /* Tuner is not on port 1, don't use I2C bridge */
|
u32 no_i2c_bridge : 1; /* Tuner is not on port 1, don't use I2C bridge */
|
||||||
|
|
||||||
const char *microcode_name;
|
const char *microcode_name;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Загрузка…
Ссылка в новой задаче