|
|
|
@ -617,6 +617,32 @@ static int dvbsky_t9580_set_voltage(struct dvb_frontend *fe, |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int dvbsky_s952_portc_set_voltage(struct dvb_frontend *fe, |
|
|
|
|
fe_sec_voltage_t voltage) |
|
|
|
|
{ |
|
|
|
|
struct cx23885_tsport *port = fe->dvb->priv; |
|
|
|
|
struct cx23885_dev *dev = port->dev; |
|
|
|
|
|
|
|
|
|
cx23885_gpio_enable(dev, GPIO_12 | GPIO_13, 1); |
|
|
|
|
|
|
|
|
|
switch (voltage) { |
|
|
|
|
case SEC_VOLTAGE_13: |
|
|
|
|
cx23885_gpio_set(dev, GPIO_13); |
|
|
|
|
cx23885_gpio_clear(dev, GPIO_12); |
|
|
|
|
break; |
|
|
|
|
case SEC_VOLTAGE_18: |
|
|
|
|
cx23885_gpio_set(dev, GPIO_13); |
|
|
|
|
cx23885_gpio_set(dev, GPIO_12); |
|
|
|
|
break; |
|
|
|
|
case SEC_VOLTAGE_OFF: |
|
|
|
|
cx23885_gpio_clear(dev, GPIO_13); |
|
|
|
|
cx23885_gpio_clear(dev, GPIO_12); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
/* call the frontend set_voltage function */ |
|
|
|
|
return port->fe_set_voltage(fe, voltage); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int cx23885_sp2_ci_ctrl(void *priv, u8 read, int addr, |
|
|
|
|
u8 data, int *mem) |
|
|
|
|
{ |
|
|
|
@ -878,6 +904,19 @@ static const struct m88ds3103_config dvbsky_s950c_m88ds3103_config = { |
|
|
|
|
.agc = 0x99, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static const struct m88ds3103_config dvbsky_s952_portc_m88ds3103_config = { |
|
|
|
|
.i2c_addr = 0x68, |
|
|
|
|
.clock = 27000000, |
|
|
|
|
.i2c_wr_max = 33, |
|
|
|
|
.clock_out = 0, |
|
|
|
|
.ts_mode = M88DS3103_TS_SERIAL, |
|
|
|
|
.ts_clk = 96000, |
|
|
|
|
.ts_clk_pol = 0, |
|
|
|
|
.lnb_en_pol = 1, |
|
|
|
|
.lnb_hv_pol = 0, |
|
|
|
|
.agc = 0x99, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static int netup_altera_fpga_rw(void *device, int flag, int data, int read) |
|
|
|
|
{ |
|
|
|
|
struct cx23885_dev *dev = (struct cx23885_dev *)device; |
|
|
|
@ -1034,6 +1073,8 @@ static int dvb_register(struct cx23885_tsport *port) |
|
|
|
|
struct i2c_board_info info; |
|
|
|
|
struct i2c_adapter *adapter; |
|
|
|
|
struct i2c_client *client_demod = NULL, *client_tuner = NULL, *client_ci = NULL; |
|
|
|
|
const struct m88ds3103_config *p_m88ds3103_config = NULL; |
|
|
|
|
int (*p_set_voltage)(struct dvb_frontend *fe, fe_sec_voltage_t voltage) = NULL; |
|
|
|
|
int mfe_shared = 0; /* bus not shared by default */ |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
@ -1847,6 +1888,61 @@ static int dvb_register(struct cx23885_tsport *port) |
|
|
|
|
fe0->dvb.frontend->ops.read_signal_strength = |
|
|
|
|
fe0->dvb.frontend->ops.tuner_ops.get_rf_strength; |
|
|
|
|
|
|
|
|
|
port->i2c_client_tuner = client_tuner; |
|
|
|
|
break; |
|
|
|
|
case CX23885_BOARD_DVBSKY_S952: |
|
|
|
|
switch (port->nr) { |
|
|
|
|
/* port b */ |
|
|
|
|
case 1: |
|
|
|
|
i2c_bus = &dev->i2c_bus[1]; |
|
|
|
|
p_m88ds3103_config = &dvbsky_t9580_m88ds3103_config; |
|
|
|
|
p_set_voltage = dvbsky_t9580_set_voltage; |
|
|
|
|
break; |
|
|
|
|
/* port c */ |
|
|
|
|
case 2: |
|
|
|
|
i2c_bus = &dev->i2c_bus[0]; |
|
|
|
|
p_m88ds3103_config = &dvbsky_s952_portc_m88ds3103_config; |
|
|
|
|
p_set_voltage = dvbsky_s952_portc_set_voltage; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* attach frontend */ |
|
|
|
|
fe0->dvb.frontend = dvb_attach(m88ds3103_attach, |
|
|
|
|
p_m88ds3103_config, |
|
|
|
|
&i2c_bus->i2c_adap, &adapter); |
|
|
|
|
if (fe0->dvb.frontend == NULL) |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
/* attach tuner */ |
|
|
|
|
memset(&m88ts2022_config, 0, sizeof(m88ts2022_config)); |
|
|
|
|
m88ts2022_config.fe = fe0->dvb.frontend; |
|
|
|
|
m88ts2022_config.clock = 27000000; |
|
|
|
|
memset(&info, 0, sizeof(struct i2c_board_info)); |
|
|
|
|
strlcpy(info.type, "m88ts2022", I2C_NAME_SIZE); |
|
|
|
|
info.addr = 0x60; |
|
|
|
|
info.platform_data = &m88ts2022_config; |
|
|
|
|
request_module(info.type); |
|
|
|
|
client_tuner = i2c_new_device(adapter, &info); |
|
|
|
|
if (client_tuner == NULL || |
|
|
|
|
client_tuner->dev.driver == NULL) |
|
|
|
|
goto frontend_detach; |
|
|
|
|
if (!try_module_get(client_tuner->dev.driver->owner)) { |
|
|
|
|
i2c_unregister_device(client_tuner); |
|
|
|
|
goto frontend_detach; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* delegate signal strength measurement to tuner */ |
|
|
|
|
fe0->dvb.frontend->ops.read_signal_strength = |
|
|
|
|
fe0->dvb.frontend->ops.tuner_ops.get_rf_strength; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* for setting the voltage we need to set GPIOs on |
|
|
|
|
* the card. |
|
|
|
|
*/ |
|
|
|
|
port->fe_set_voltage = |
|
|
|
|
fe0->dvb.frontend->ops.set_voltage; |
|
|
|
|
fe0->dvb.frontend->ops.set_voltage = p_set_voltage; |
|
|
|
|
|
|
|
|
|
port->i2c_client_tuner = client_tuner; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
@ -1924,7 +2020,8 @@ static int dvb_register(struct cx23885_tsport *port) |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
case CX23885_BOARD_DVBSKY_T9580: |
|
|
|
|
case CX23885_BOARD_DVBSKY_S950: { |
|
|
|
|
case CX23885_BOARD_DVBSKY_S950: |
|
|
|
|
case CX23885_BOARD_DVBSKY_S952: { |
|
|
|
|
u8 eeprom[256]; /* 24C02 i2c eeprom */ |
|
|
|
|
|
|
|
|
|
if (port->nr > 2) |
|
|
|
|