Message ID | 201411081647541566078@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 11/08/2014 10:47 AM, Nibble Max wrote: > DVBSky T9580 V3 card is the dual tuner card, which supports S/S2 and T2/T/C. > 1>DVB-S/S2 frontend: M88DS3103/M88TS2022 > 2>DVB-T2/T/C frontend: SI2168B40/SI2157A30 > 2>PCIe bridge: SMI PCIe > > Signed-off-by: Nibble Max <nibble.max@gmail.com> Reviewed-by: Antti Palosaari <crope@iki.fi> Antti > --- > drivers/media/pci/smipcie/smipcie.c | 67 +++++++++++++++++++++++++++++++++++++ > 1 file changed, 67 insertions(+) > > diff --git a/drivers/media/pci/smipcie/smipcie.c b/drivers/media/pci/smipcie/smipcie.c > index c27e45b..a5707ea 100644 > --- a/drivers/media/pci/smipcie/smipcie.c > +++ b/drivers/media/pci/smipcie/smipcie.c > @@ -18,6 +18,8 @@ > #include "m88ds3103.h" > #include "m88ts2022.h" > #include "m88rs6000t.h" > +#include "si2168.h" > +#include "si2157.h" > > DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); > > @@ -618,6 +620,58 @@ err_tuner_i2c_device: > return ret; > } > > +static int smi_dvbsky_sit2_fe_attach(struct smi_port *port) > +{ > + int ret = 0; > + struct smi_dev *dev = port->dev; > + struct i2c_adapter *i2c; > + struct i2c_adapter *tuner_i2c_adapter; > + struct i2c_client *client_tuner, *client_demod; > + struct i2c_board_info client_info; > + struct si2168_config si2168_config; > + struct si2157_config si2157_config; > + > + /* select i2c bus */ > + i2c = (port->idx == 0) ? &dev->i2c_bus[0] : &dev->i2c_bus[1]; > + > + /* attach demod */ > + memset(&si2168_config, 0, sizeof(si2168_config)); > + si2168_config.i2c_adapter = &tuner_i2c_adapter; > + si2168_config.fe = &port->fe; > + si2168_config.ts_mode = SI2168_TS_PARALLEL; > + > + memset(&client_info, 0, sizeof(struct i2c_board_info)); > + strlcpy(client_info.type, "si2168", I2C_NAME_SIZE); > + client_info.addr = 0x64; > + client_info.platform_data = &si2168_config; > + > + client_demod = smi_add_i2c_client(i2c, &client_info); > + if (!client_demod) { > + ret = -ENODEV; > + return ret; > + } > + port->i2c_client_demod = client_demod; > + > + /* attach tuner */ > + memset(&si2157_config, 0, sizeof(si2157_config)); > + si2157_config.fe = port->fe; > + > + memset(&client_info, 0, sizeof(struct i2c_board_info)); > + strlcpy(client_info.type, "si2157", I2C_NAME_SIZE); > + client_info.addr = 0x60; > + client_info.platform_data = &si2157_config; > + > + client_tuner = smi_add_i2c_client(tuner_i2c_adapter, &client_info); > + if (!client_tuner) { > + smi_del_i2c_client(port->i2c_client_demod); > + port->i2c_client_demod = NULL; > + ret = -ENODEV; > + return ret; > + } > + port->i2c_client_tuner = client_tuner; > + return ret; > +} > + > static int smi_fe_init(struct smi_port *port) > { > int ret = 0; > @@ -635,6 +689,9 @@ static int smi_fe_init(struct smi_port *port) > case DVBSKY_FE_M88RS6000: > ret = smi_dvbsky_m88rs6000_fe_attach(port); > break; > + case DVBSKY_FE_SIT2: > + ret = smi_dvbsky_sit2_fe_attach(port); > + break; > } > if (ret < 0) > return ret; > @@ -1005,6 +1062,15 @@ static struct smi_cfg_info dvbsky_s952_cfg = { > .fe_1 = DVBSKY_FE_M88RS6000, > }; > > +static struct smi_cfg_info dvbsky_t9580_cfg = { > + .type = SMI_DVBSKY_S952, > + .name = "DVBSky T9580 V3", > + .ts_0 = SMI_TS_DMA_BOTH, > + .ts_1 = SMI_TS_DMA_BOTH, > + .fe_0 = DVBSKY_FE_SIT2, > + .fe_1 = DVBSKY_FE_M88DS3103, > +}; > + > /* PCI IDs */ > #define SMI_ID(_subvend, _subdev, _driverdata) { \ > .vendor = SMI_VID, .device = SMI_PID, \ > @@ -1014,6 +1080,7 @@ static struct smi_cfg_info dvbsky_s952_cfg = { > static const struct pci_device_id smi_id_table[] = { > SMI_ID(0x4254, 0x0550, dvbsky_s950_cfg), > SMI_ID(0x4254, 0x0552, dvbsky_s952_cfg), > + SMI_ID(0x4254, 0x5580, dvbsky_t9580_cfg), > {0} > }; > MODULE_DEVICE_TABLE(pci, smi_id_table); > >
diff --git a/drivers/media/pci/smipcie/smipcie.c b/drivers/media/pci/smipcie/smipcie.c index c27e45b..a5707ea 100644 --- a/drivers/media/pci/smipcie/smipcie.c +++ b/drivers/media/pci/smipcie/smipcie.c @@ -18,6 +18,8 @@ #include "m88ds3103.h" #include "m88ts2022.h" #include "m88rs6000t.h" +#include "si2168.h" +#include "si2157.h" DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); @@ -618,6 +620,58 @@ err_tuner_i2c_device: return ret; } +static int smi_dvbsky_sit2_fe_attach(struct smi_port *port) +{ + int ret = 0; + struct smi_dev *dev = port->dev; + struct i2c_adapter *i2c; + struct i2c_adapter *tuner_i2c_adapter; + struct i2c_client *client_tuner, *client_demod; + struct i2c_board_info client_info; + struct si2168_config si2168_config; + struct si2157_config si2157_config; + + /* select i2c bus */ + i2c = (port->idx == 0) ? &dev->i2c_bus[0] : &dev->i2c_bus[1]; + + /* attach demod */ + memset(&si2168_config, 0, sizeof(si2168_config)); + si2168_config.i2c_adapter = &tuner_i2c_adapter; + si2168_config.fe = &port->fe; + si2168_config.ts_mode = SI2168_TS_PARALLEL; + + memset(&client_info, 0, sizeof(struct i2c_board_info)); + strlcpy(client_info.type, "si2168", I2C_NAME_SIZE); + client_info.addr = 0x64; + client_info.platform_data = &si2168_config; + + client_demod = smi_add_i2c_client(i2c, &client_info); + if (!client_demod) { + ret = -ENODEV; + return ret; + } + port->i2c_client_demod = client_demod; + + /* attach tuner */ + memset(&si2157_config, 0, sizeof(si2157_config)); + si2157_config.fe = port->fe; + + memset(&client_info, 0, sizeof(struct i2c_board_info)); + strlcpy(client_info.type, "si2157", I2C_NAME_SIZE); + client_info.addr = 0x60; + client_info.platform_data = &si2157_config; + + client_tuner = smi_add_i2c_client(tuner_i2c_adapter, &client_info); + if (!client_tuner) { + smi_del_i2c_client(port->i2c_client_demod); + port->i2c_client_demod = NULL; + ret = -ENODEV; + return ret; + } + port->i2c_client_tuner = client_tuner; + return ret; +} + static int smi_fe_init(struct smi_port *port) { int ret = 0; @@ -635,6 +689,9 @@ static int smi_fe_init(struct smi_port *port) case DVBSKY_FE_M88RS6000: ret = smi_dvbsky_m88rs6000_fe_attach(port); break; + case DVBSKY_FE_SIT2: + ret = smi_dvbsky_sit2_fe_attach(port); + break; } if (ret < 0) return ret; @@ -1005,6 +1062,15 @@ static struct smi_cfg_info dvbsky_s952_cfg = { .fe_1 = DVBSKY_FE_M88RS6000, }; +static struct smi_cfg_info dvbsky_t9580_cfg = { + .type = SMI_DVBSKY_S952, + .name = "DVBSky T9580 V3", + .ts_0 = SMI_TS_DMA_BOTH, + .ts_1 = SMI_TS_DMA_BOTH, + .fe_0 = DVBSKY_FE_SIT2, + .fe_1 = DVBSKY_FE_M88DS3103, +}; + /* PCI IDs */ #define SMI_ID(_subvend, _subdev, _driverdata) { \ .vendor = SMI_VID, .device = SMI_PID, \ @@ -1014,6 +1080,7 @@ static struct smi_cfg_info dvbsky_s952_cfg = { static const struct pci_device_id smi_id_table[] = { SMI_ID(0x4254, 0x0550, dvbsky_s950_cfg), SMI_ID(0x4254, 0x0552, dvbsky_s952_cfg), + SMI_ID(0x4254, 0x5580, dvbsky_t9580_cfg), {0} }; MODULE_DEVICE_TABLE(pci, smi_id_table);
DVBSky T9580 V3 card is the dual tuner card, which supports S/S2 and T2/T/C. 1>DVB-S/S2 frontend: M88DS3103/M88TS2022 2>DVB-T2/T/C frontend: SI2168B40/SI2157A30 2>PCIe bridge: SMI PCIe Signed-off-by: Nibble Max <nibble.max@gmail.com> --- drivers/media/pci/smipcie/smipcie.c | 67 +++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+)