From 29dc0f9e315aebc6ece07d6212b0c9f7b501b48c Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Thu, 17 Sep 2015 18:54:25 +0200 Subject: [PATCH 01/17] Initial support for Max C2T2-8 --- ddbridge/ddbridge-core.c | 64 ++++++++++++++++++++++++++++++---------- ddbridge/ddbridge.c | 21 +++++++++++-- ddbridge/ddbridge.h | 21 +++++++------ 3 files changed, 79 insertions(+), 27 deletions(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 9634e7f..a032e8a 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -1008,6 +1008,7 @@ static int demod_attach_cxd2843(struct ddb_input *input, int par) struct ddb_dvb *dvb = &input->port->dvb[input->nr & 1]; struct dvb_frontend *fe; + printk("attach cxd par = %d\n", par); if (par) fe = dvb->fe = dvb_attach(cxd2843_attach, i2c, (input->nr & 1) ? @@ -1855,7 +1856,8 @@ static int dvb_input_attach(struct ddb_input *input) struct ddb_port *port = input->port; struct dvb_adapter *adap = dvb->adap; struct dvb_demux *dvbdemux = &dvb->demux; - + int par = 0; + dvb->attached = 0x01; ret = my_dvb_dmx_ts_card_init(dvbdemux, "SW demux", @@ -1928,18 +1930,15 @@ static int dvb_input_attach(struct ddb_input *input) if (tuner_attach_tda18212dd(input) < 0) return -ENODEV; break; - case DDB_TUNER_DVBCT2_SONY: - case DDB_TUNER_DVBC2T2_SONY: - case DDB_TUNER_ISDBT_SONY: - if (demod_attach_cxd2843(input, 0) < 0) - return -ENODEV; - if (tuner_attach_tda18212dd(input) < 0) - return -ENODEV; - break; case DDB_TUNER_DVBCT2_SONY_P: case DDB_TUNER_DVBC2T2_SONY_P: case DDB_TUNER_ISDBT_SONY_P: - if (demod_attach_cxd2843(input, 1) < 0) + if (!input->port->dev->link[input->port->lnr].info->serial) + par = 1; + case DDB_TUNER_DVBCT2_SONY: + case DDB_TUNER_DVBC2T2_SONY: + case DDB_TUNER_ISDBT_SONY: + if (demod_attach_cxd2843(input, par) < 0) return -ENODEV; if (tuner_attach_tda18212dd(input) < 0) return -ENODEV; @@ -3040,6 +3039,7 @@ static void ddb_ports_init(struct ddb *dev) ddb_output_init(port, i, i + 8); break; case DDB_OCTOPUS_MAX: + case DDB_OCTOPUS_MAX_CT: ddb_input_init(port, 2 * i, 0, 2 * i, 2 * p); ddb_input_init(port, 2 * i + 1, 1, 2 * i + 1, 2 * p + 1); break; @@ -4508,6 +4508,35 @@ static struct ddb_info octopus_max_gtl = { }; +static struct ddb_regset octopus_maxct_gtl_i2c = { + .base = 0x80, + .num = 0x04, + .size = 0x20, +}; + +static struct ddb_regset octopus_maxct_gtl_i2c_buf = { + .base = 0x1000, + .num = 0x04, + .size = 0x200, +}; + +static struct ddb_regmap octopus_maxct_gtl_map = { + .i2c = &octopus_maxct_gtl_i2c, + .i2c_buf = &octopus_maxct_gtl_i2c_buf, +}; + +static struct ddb_info octopus_ct_gtl = { + .type = DDB_OCTOPUS_MAX_CT, + .name = "Digital Devices Octopus MAX CT GTL", + .regmap = &octopus_maxct_gtl_map, + .port_num = 4, + .i2c_mask = 0x0f, + .board_control = 0xff, + .board_control_2 = 0xf00, + .serial = 1, +}; + + static int ddb_gtl_init_link(struct ddb *dev, u32 l) { struct ddb_link *link = &dev->link[l]; @@ -4541,9 +4570,14 @@ static int ddb_gtl_init_link(struct ddb *dev, u32 l) link->regs = regs; id = ddbreadl(dev, DDB_LINK_TAG(l) | 8); - if (id == 0x0007dd01) + switch (id) { + case 0x0007dd01: link->info = &octopus_max_gtl; - else { + break; + case 0x0008dd01: + link->info = &octopus_ct_gtl; + break; + default: pr_info("DDBridge: Detected GT link but found invalid ID %08x. " "You might have to update (flash) the add-on card first.", id); @@ -4565,7 +4599,7 @@ static int ddb_gtl_init_link(struct ddb *dev, u32 l) tasklet_init(&link->tasklet, link_tasklet, (unsigned long) link); ddbwritel(dev, 0xffffffff, DDB_LINK_TAG(l) | INTERRUPT_ACK); - ddbwritel(dev, 1, DDB_LINK_TAG(l) | INTERRUPT_ENABLE); + ddbwritel(dev, 0xf, DDB_LINK_TAG(l) | INTERRUPT_ENABLE); return 0; } @@ -4595,9 +4629,9 @@ static int ddb_init_boards(struct ddb *dev) if (info->board_control) { ddbwritel(dev, 0, DDB_LINK_TAG(l) | BOARD_CONTROL); msleep(100); - ddbwritel(dev, 4, DDB_LINK_TAG(l) | BOARD_CONTROL); + ddbwritel(dev, info->board_control_2, DDB_LINK_TAG(l) | BOARD_CONTROL); usleep_range(2000, 3000); - ddbwritel(dev, 4 | info->board_control, + ddbwritel(dev, info->board_control_2 | info->board_control, DDB_LINK_TAG(l) | BOARD_CONTROL); usleep_range(2000, 3000); } diff --git a/ddbridge/ddbridge.c b/ddbridge/ddbridge.c index 33d7a7b..91fc453 100644 --- a/ddbridge/ddbridge.c +++ b/ddbridge/ddbridge.c @@ -357,7 +357,8 @@ static struct ddb_info ddb_v7 = { .regmap = &octopus_map, .port_num = 4, .i2c_mask = 0x0f, - .board_control = 2, + .board_control = 2, + .board_control_2 = 4, }; static struct ddb_info ddb_ctv7 = { @@ -366,7 +367,8 @@ static struct ddb_info ddb_ctv7 = { .regmap = &octopus_map, .port_num = 4, .i2c_mask = 0x0f, - .board_control = 3, + .board_control = 3, + .board_control_2 = 4, }; static struct ddb_info ddb_satixS2v3 = { @@ -399,7 +401,8 @@ static struct ddb_info ddb_ci_s2_pro = { .regmap = &octopus_map, .port_num = 4, .i2c_mask = 0x01, - .board_control = 3, + .board_control = 2, + .board_control_2 = 4, }; static struct ddb_info ddb_dvbct = { @@ -421,6 +424,17 @@ static struct ddb_info ddb_s2_48 = { .board_control = 1, }; +static struct ddb_info ddb_ct_8 = { + .type = DDB_OCTOPUS_MAX_CT, + .name = "Digital Devices MAX CT8", + .regmap = &octopus_map, + .port_num = 4, + .i2c_mask = 0x0f, + .board_control = 0x0ff, + .board_control_2 = 0xf00, + .serial = 1, +}; + static struct ddb_info ddb_mod = { .type = DDB_MOD, .name = "Digital Devices DVB-C modulator", @@ -467,6 +481,7 @@ static const struct pci_device_id ddb_id_tbl[] __devinitconst = { DDB_ID(DDVID, 0x0006, DDVID, 0x0032, ddb_ctv7), DDB_ID(DDVID, 0x0006, DDVID, 0x0033, ddb_ctv7), DDB_ID(DDVID, 0x0007, DDVID, 0x0023, ddb_s2_48), + DDB_ID(DDVID, 0x0008, DDVID, 0x0034, ddb_ct_8), DDB_ID(DDVID, 0x0011, DDVID, 0x0040, ddb_ci), DDB_ID(DDVID, 0x0011, DDVID, 0x0041, ddb_cis), DDB_ID(DDVID, 0x0012, DDVID, 0x0042, ddb_ci), diff --git a/ddbridge/ddbridge.h b/ddbridge/ddbridge.h index 664d840..020c00e 100644 --- a/ddbridge/ddbridge.h +++ b/ddbridge/ddbridge.h @@ -147,6 +147,7 @@ struct ddb_info { #define DDB_MOD 3 #define DDB_OCTONET 4 #define DDB_OCTOPUS_MAX 5 +#define DDB_OCTOPUS_MAX_CT 6 char *name; u32 i2c_mask; u8 port_num; @@ -154,10 +155,12 @@ struct ddb_info { u8 fan_num; u8 temp_num; u8 temp_bus; - u8 board_control; + u32 board_control; + u32 board_control_2; u8 ns_num; u8 mdio_num; - u8 con_clock; + u8 con_clock; /* use a continuous clock */ + u8 serial; /* override to serial transfer */ struct ddb_regmap *regmap; }; @@ -287,13 +290,13 @@ struct ddb_port { #define DDB_CI_EXTERNAL_XO2 12 #define DDB_CI_EXTERNAL_XO2_B 13 -#define DDB_TUNER_XO2 16 -#define DDB_TUNER_DVBS_STV0910 16 -#define DDB_TUNER_DVBCT2_SONY 17 -#define DDB_TUNER_ISDBT_SONY 18 -#define DDB_TUNER_DVBC2T2_SONY 19 -#define DDB_TUNER_ATSC_ST 20 -#define DDB_TUNER_DVBC2T2_ST 21 +#define DDB_TUNER_XO2 32 +#define DDB_TUNER_DVBS_STV0910 (DDB_TUNER_XO2 + 0) +#define DDB_TUNER_DVBCT2_SONY (DDB_TUNER_XO2 + 1) +#define DDB_TUNER_ISDBT_SONY (DDB_TUNER_XO2 + 2) +#define DDB_TUNER_DVBC2T2_SONY (DDB_TUNER_XO2 + 3) +#define DDB_TUNER_ATSC_ST (DDB_TUNER_XO2 + 4) +#define DDB_TUNER_DVBC2T2_ST (DDB_TUNER_XO2 + 5) struct ddb_input *input[2]; struct ddb_output *output; From 0393ab4db4c9b0382f200ee228a52fe7a5e47b2f Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Sat, 19 Sep 2015 22:20:35 +0200 Subject: [PATCH 02/17] remove debugging messages --- ddbridge/ddbridge-core.c | 1 - frontends/tda18212dd.c | 8 +++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index a032e8a..abdc482 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -1008,7 +1008,6 @@ static int demod_attach_cxd2843(struct ddb_input *input, int par) struct ddb_dvb *dvb = &input->port->dvb[input->nr & 1]; struct dvb_frontend *fe; - printk("attach cxd par = %d\n", par); if (par) fe = dvb->fe = dvb_attach(cxd2843_attach, i2c, (input->nr & 1) ? diff --git a/frontends/tda18212dd.c b/frontends/tda18212dd.c index 9aae319..65f3261 100644 --- a/frontends/tda18212dd.c +++ b/frontends/tda18212dd.c @@ -447,8 +447,8 @@ static int attach_init(struct tda_state *state) if (!state->m_isMaster) state->m_bLTEnable = false; - pr_info("tda18212dd: ChipID %04x %s\n", state->m_ID, - state->m_isMaster ? "master" : "slave"); + /*pr_info("tda18212dd: ChipID %04x %s\n", state->m_ID, + state->m_isMaster ? "master" : "slave");*/ if (state->m_ID != 18212) return -1; @@ -457,7 +457,7 @@ static int attach_init(struct tda_state *state) if (stat < 0) return stat; - pr_info("tda18212dd: PowerState %02x\n", PowerState); + /*pr_info("tda18212dd: PowerState %02x\n", PowerState);*/ if (state->m_isMaster) { if (PowerState & 0x02) { @@ -487,6 +487,7 @@ static int attach_init(struct tda_state *state) FinishCalibration(state); Standby(state); +#if 0 { u8 RFCal_Log[12]; @@ -499,6 +500,7 @@ static int attach_init(struct tda_state *state) RFCal_Log[8], RFCal_Log[9], RFCal_Log[10], RFCal_Log[11]); } +#endif return stat; } From dd78dae68bd7449854e80547a7d08234030f72e7 Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Sun, 20 Sep 2015 01:45:11 +0200 Subject: [PATCH 03/17] loop over remote link interrupt status to prevent race condition --- ddbridge/ddbridge-core.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index abdc482..e790338 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -4465,15 +4465,13 @@ static void gtl_irq_handler(unsigned long priv) struct ddb *dev = link->dev; u32 s, off = 32 * link->nr, tag = DDB_LINK_TAG(link->nr); - s = ddbreadl(dev, tag | INTERRUPT_STATUS); - //printk("gtl_irq %08x = %08x\n", tag | INTERRUPT_STATUS, s); - if (!s) - return; - ddbwritel(dev, s, tag | INTERRUPT_ACK); - LINK_IRQ_HANDLE(0); - LINK_IRQ_HANDLE(1); - LINK_IRQ_HANDLE(2); - LINK_IRQ_HANDLE(3); + while ((s = ddbreadl(dev, tag | INTERRUPT_STATUS))) { + ddbwritel(dev, s, tag | INTERRUPT_ACK); + LINK_IRQ_HANDLE(0); + LINK_IRQ_HANDLE(1); + LINK_IRQ_HANDLE(2); + LINK_IRQ_HANDLE(3); + } #else printk("gtlirq\n"); tasklet_schedule(&link->tasklet); From 1aacccef7c9e72ad7c2406f99905b69a293ac8c2 Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Sun, 20 Sep 2015 01:50:39 +0200 Subject: [PATCH 04/17] add remote interrupt status to debug message --- ddbridge/ddbridge-i2c.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ddbridge/ddbridge-i2c.c b/ddbridge/ddbridge-i2c.c index a0d9c9c..519ddd5 100644 --- a/ddbridge/ddbridge-i2c.c +++ b/ddbridge/ddbridge-i2c.c @@ -122,6 +122,11 @@ static int ddb_i2c_cmd(struct ddb_i2c *i2c, u32 adr, u32 cmd) u32 istat = ddbreadl(dev, INTERRUPT_STATUS); dev_err(dev->dev, "DDBridge IRS %08x\n", istat); + if (i2c->link) { + u32 listat = ddbreadl(dev, DDB_LINK_TAG(i2c->link) | INTERRUPT_STATUS); + dev_err(dev->dev, "DDBridge link %u IRS %08x\n", + i2c->link, listat); + } if (istat & 1) { ddbwritel(dev, istat & 1, INTERRUPT_ACK); } else { From 1173454c93d2bc68d2a94b6ff95fb737f3b2b00a Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Sun, 20 Sep 2015 18:49:16 +0200 Subject: [PATCH 05/17] add sleep function --- frontends/cxd2843.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/frontends/cxd2843.c b/frontends/cxd2843.c index 07bf6ea..e4e88d9 100644 --- a/frontends/cxd2843.c +++ b/frontends/cxd2843.c @@ -1008,6 +1008,14 @@ static void release(struct dvb_frontend *fe) kfree(state); } +static void sleep(struct dvb_frontend *fe) +{ + struct cxd_state *state = fe->demodulator_priv; + + Stop(state); + ShutDown(state); +} + static int Start(struct cxd_state *state, u32 IntermediateFrequency) { enum demod_state newDemodState = Unknown; @@ -1892,6 +1900,7 @@ static struct dvb_frontend_ops common_ops_2843 = { FE_CAN_RECOVER | FE_CAN_MUTE_TS }, .release = release, + .sleep = sleep, .i2c_gate_ctrl = gate_ctrl, .set_frontend = set_parameters, @@ -1929,6 +1938,7 @@ static struct dvb_frontend_ops common_ops_2837 = { FE_CAN_RECOVER | FE_CAN_MUTE_TS }, .release = release, + .sleep = sleep, .i2c_gate_ctrl = gate_ctrl, .set_frontend = set_parameters, @@ -1964,6 +1974,7 @@ static struct dvb_frontend_ops common_ops_2838 = { FE_CAN_RECOVER | FE_CAN_MUTE_TS }, .release = release, + .sleep = sleep, .i2c_gate_ctrl = gate_ctrl, .set_frontend = set_parameters, From e2145682e2ae6cd914df7c92323845ffa8b7a8fe Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Thu, 24 Sep 2015 23:29:09 +0200 Subject: [PATCH 06/17] block opening of ci device with O_RDWR --- ddbridge/ddbridge-core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index e790338..7d880ac 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -842,7 +842,8 @@ static int ts_open(struct inode *inode, struct file *file) } else if ((file->f_flags & O_ACCMODE) == O_WRONLY) { if (!output) return -EINVAL; - } + } else + return -EINVAL; err = dvb_generic_open(inode, file); if (err < 0) return err; From 8402c7ab05dbc78255cfc60747299d7fab098bc0 Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Thu, 24 Sep 2015 23:29:40 +0200 Subject: [PATCH 07/17] show temperature on sleep --- frontends/tda18212dd.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontends/tda18212dd.c b/frontends/tda18212dd.c index 65f3261..88c6f0d 100644 --- a/frontends/tda18212dd.c +++ b/frontends/tda18212dd.c @@ -777,6 +777,10 @@ static int sleep(struct dvb_frontend *fe) struct tda_state *state = fe->tuner_priv; Standby(state); + write_reg(state, THERMO_2, 0x01); + read_reg1(state, THERMO_1); + write_reg(state, THERMO_2, 0x00); + printk("sleep: temp = %u\n", state->Regs[THERMO_1]); return 0; } From 18481e2ea6f62ff06c359aa4dc6debe2e5b53561 Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Fri, 25 Sep 2015 17:45:48 +0200 Subject: [PATCH 08/17] destroy attribute devices earlier to prevent accesses after I2C devices are already gone --- ddbridge/octonet.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ddbridge/octonet.c b/ddbridge/octonet.c index 1bec01c..05efed8 100644 --- a/ddbridge/octonet.c +++ b/ddbridge/octonet.c @@ -113,6 +113,8 @@ static int __exit octonet_remove(struct platform_device *pdev) dev = platform_get_drvdata(pdev); + ddb_device_destroy(dev); + ddb_nsd_detach(dev); ddb_ports_detach(dev); ddb_i2c_release(dev); @@ -122,7 +124,6 @@ static int __exit octonet_remove(struct platform_device *pdev) free_irq(platform_get_irq(dev->pfdev, 0), dev); ddb_ports_release(dev); - ddb_device_destroy(dev); octonet_unmap(dev); platform_set_drvdata(pdev, 0); return 0; From d10c83f16a8248546e96764905337e323bf42767 Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Thu, 22 Oct 2015 14:51:36 +0200 Subject: [PATCH 09/17] Change handling of card type attribute. --- ddbridge/ddbridge-core.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 7d880ac..4b25824 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -2166,6 +2166,12 @@ static char *xo2names[] = { "", "" }; +static char *xo2types[] = { + "DVBS_ST", "DVBCT2_SONY", + "ISDBT_SONY", "DVBC2T2_SONY", + "ATSC_ST", "DVBC2T2_ST" +}; + static void ddb_port_probe(struct ddb_port *port) { struct ddb *dev = port->dev; @@ -2173,9 +2179,9 @@ static void ddb_port_probe(struct ddb_port *port) u8 id, type; port->name = "NO MODULE"; + port->type_name = "NONE"; port->class = DDB_PORT_NONE; - - + /* Handle missing ports and ports without I2C */ if (port->nr == ts_loop) { @@ -2199,6 +2205,7 @@ static void ddb_port_probe(struct ddb_port *port) if (dev->link[l].info->type == DDB_OCTOPUS_MAX) { port->name = "DUAL DVB-S2 MAX"; + port->type_name = "MXL5XX"; port->class = DDB_PORT_TUNER; port->type = DDB_TUNER_MXL5XX; if (port->i2c) @@ -2209,6 +2216,7 @@ static void ddb_port_probe(struct ddb_port *port) if (port->nr > 1 && dev->link[l].info->type == DDB_OCTOPUS_CI) { port->name = "CI internal"; + port->type_name = "INTERNAL"; port->class = DDB_PORT_CI; port->type = DDB_CI_INTERNAL; } @@ -2221,6 +2229,7 @@ static void ddb_port_probe(struct ddb_port *port) if (port_has_cxd(port, &id)) { if (id == 1) { port->name = "CI"; + port->type_name = "CXD2099"; port->class = DDB_PORT_CI; port->type = DDB_CI_EXTERNAL_SONY; ddbwritel(dev, I2C_SPEED_400, @@ -2237,31 +2246,37 @@ static void ddb_port_probe(struct ddb_port *port) port->name = "DuoFlex CI"; port->class = DDB_PORT_CI; port->type = DDB_CI_EXTERNAL_XO2; + port->type_name = "CI_XO2"; init_xo2_ci(port); return; } id >>= 2; if (id > 5) { port->name = "unknown XO2 DuoFlex"; + port->type_name = "UNKNOWN"; } else { port->name = xo2names[id]; port->class = DDB_PORT_TUNER; port->type = DDB_TUNER_XO2 + id; + port->type_name = xo2types[id]; init_xo2(port); } } else if (port_has_cxd28xx(port, &id)) { switch (id) { case 0xa4: - port->name = "DUAL DVB-CT2 CXD2843"; + port->name = "DUAL DVB-C2T2 CXD2843"; port->type = DDB_TUNER_DVBC2T2_SONY_P; + port->type_name = "DVBC2T2_SONY"; break; case 0xb1: port->name = "DUAL DVB-CT2 CXD2837"; port->type = DDB_TUNER_DVBCT2_SONY_P; + port->type_name = "DVBCT2_SONY"; break; case 0xb0: port->name = "DUAL ISDB-T CXD2838"; port->type = DDB_TUNER_ISDBT_SONY_P; + port->type_name = "ISDBT_SONY"; break; default: return; @@ -2272,11 +2287,13 @@ static void ddb_port_probe(struct ddb_port *port) port->name = "DUAL DVB-S2"; port->class = DDB_PORT_TUNER; port->type = DDB_TUNER_DVBS_ST; + port->type_name = "DVBS_ST"; ddbwritel(dev, I2C_SPEED_100, port->i2c->regs + I2C_TIMING); } else if (port_has_stv0900_aa(port, &id)) { port->name = "DUAL DVB-S2"; port->class = DDB_PORT_TUNER; port->type = DDB_TUNER_DVBS_ST_AA; + port->type_name = "DVBS_ST_AA"; if (id == 0x51) port->type = DDB_TUNER_DVBS_STV0910_P; else @@ -2286,11 +2303,13 @@ static void ddb_port_probe(struct ddb_port *port) port->name = "DUAL DVB-C/T"; port->class = DDB_PORT_TUNER; port->type = DDB_TUNER_DVBCT_TR; + port->type_name = "DVBCT_TR"; ddbwritel(dev, I2C_SPEED_400, port->i2c->regs + I2C_TIMING); } else if (port_has_stv0367(port)) { port->name = "DUAL DVB-C/T"; port->class = DDB_PORT_TUNER; port->type = DDB_TUNER_DVBCT_ST; + port->type_name = "DVBCT_ST"; ddbwritel(dev, I2C_SPEED_100, port->i2c->regs + I2C_TIMING); } else if (port_has_encti(port)) { port->name = "ENCTI"; @@ -3857,15 +3876,6 @@ static char *class_name[] = { "NONE", "CI", "TUNER", "LOOP", "MOD" }; -static char *type_name[] = { - "NONE", "DVBS_ST", "DVBS_ST_AA", "DVBCT_TR", - "DVBCT_ST", "INTERNAL", "CXD2099", "DVBCT2_SONY", - "DVBC2T2_SONY", "ISDBT_SONY", "DVBS_ST", "MXL5XX", - "TYPE0C", "TYPE0D", "TYPE0E", "TYPE0F", - "DVBS_ST", "DVBCT2_SONY", "ISDBT_SONY", "DVBC2T2_SONY", - "ATSC_ST", "DVBC2T2_ST" -}; - static ssize_t fan_show(struct device *device, struct device_attribute *attr, char *buf) { @@ -3978,7 +3988,7 @@ static ssize_t mod_show(struct device *device, return sprintf(buf, "%s:%s\n", class_name[dev->port[num].class], - type_name[dev->port[num].type]); + dev->port[num].type_name); } static ssize_t led_show(struct device *device, From 535683dfb6287c92f713bb3a44d120d1fe65cc37 Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Thu, 22 Oct 2015 14:52:27 +0200 Subject: [PATCH 10/17] Octopus CI single has two TABs. Handle both I2C busses. --- ddbridge/ddbridge.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddbridge/ddbridge.c b/ddbridge/ddbridge.c index 91fc453..e80e0e9 100644 --- a/ddbridge/ddbridge.c +++ b/ddbridge/ddbridge.c @@ -392,7 +392,7 @@ static struct ddb_info ddb_cis = { .name = "Digital Devices Octopus CI single", .regmap = &octopus_map, .port_num = 3, - .i2c_mask = 0x01, + .i2c_mask = 0x03, }; static struct ddb_info ddb_ci_s2_pro = { From bb334ea22919e1fe4f21e6efb47cd7cced82d344 Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Thu, 22 Oct 2015 14:52:59 +0200 Subject: [PATCH 11/17] Change handling of card type attribute. --- ddbridge/ddbridge.h | 1 + 1 file changed, 1 insertion(+) diff --git a/ddbridge/ddbridge.h b/ddbridge/ddbridge.h index 020c00e..bad0dc6 100644 --- a/ddbridge/ddbridge.h +++ b/ddbridge/ddbridge.h @@ -274,6 +274,7 @@ struct ddb_port { #define DDB_PORT_LOOP 3 #define DDB_PORT_MOD 4 char *name; + char *type_name; u32 type; #define DDB_TUNER_NONE 0 #define DDB_TUNER_DVBS_ST 1 From 66be95a2b96fcb00cf7c8d58057c3715eb4fb4c2 Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Thu, 22 Oct 2015 14:53:34 +0200 Subject: [PATCH 12/17] Missing return value. --- frontends/cxd2843.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontends/cxd2843.c b/frontends/cxd2843.c index e4e88d9..e8b5e25 100644 --- a/frontends/cxd2843.c +++ b/frontends/cxd2843.c @@ -1008,12 +1008,13 @@ static void release(struct dvb_frontend *fe) kfree(state); } -static void sleep(struct dvb_frontend *fe) +static int sleep(struct dvb_frontend *fe) { struct cxd_state *state = fe->demodulator_priv; Stop(state); ShutDown(state); + return 0; } static int Start(struct cxd_state *state, u32 IntermediateFrequency) From 9bcb9a2c9a08f7e68b78d44279bcc396398d7349 Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Thu, 22 Oct 2015 14:54:48 +0200 Subject: [PATCH 13/17] Remove unused status variable. --- frontends/stv6111.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontends/stv6111.c b/frontends/stv6111.c index bbbfbe7..691b8b9 100644 --- a/frontends/stv6111.c +++ b/frontends/stv6111.c @@ -306,7 +306,6 @@ static int set_params(struct dvb_frontend *fe) { struct stv *state = fe->tuner_priv; struct dtv_frontend_properties *p = &fe->dtv_property_cache; - int status; u32 freq, symb, cutoff; if (p->delivery_system != SYS_DVBS && p->delivery_system != SYS_DVBS2) @@ -321,7 +320,7 @@ static int set_params(struct dvb_frontend *fe) set_lof(state, freq, cutoff); if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); - return status; + return 0; } static int get_frequency(struct dvb_frontend *fe, u32 *frequency) From e83dedf6b41d6cfb9315d714e5982d10ff8aab6c Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Thu, 22 Oct 2015 14:55:55 +0200 Subject: [PATCH 14/17] First check for LNBHs on 0x0c/0x0d. --- ddbridge/ddbridge-core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 4b25824..4421b1f 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -1251,9 +1251,9 @@ static int demod_attach_stv0910(struct ddb_input *input, int type) return -ENODEV; } if (!dvb_attach(lnbh25_attach, dvb->fe, i2c, - ((input->nr & 1) ? 0x09 : 0x08))) { + ((input->nr & 1) ? 0x0d : 0x0c))) { if (!dvb_attach(lnbh25_attach, dvb->fe, i2c, - ((input->nr & 1) ? 0x0d : 0x0c))) { + ((input->nr & 1) ? 0x09 : 0x08))) { pr_err("No LNBH25 found!\n"); return -ENODEV; } From af746a02dd6c033e80c92e5620c94e18d18709b1 Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Thu, 5 Nov 2015 19:06:52 +0100 Subject: [PATCH 15/17] spelling error --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 37d1a71..428e66e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# DDBridge Driiver +# DDBridge Driver ###Prepare for Building From 829929a41f8c926ad59704eb712630b7fe0803a1 Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Thu, 10 Dec 2015 18:26:45 +0100 Subject: [PATCH 16/17] cine s2 v7 has TS lines crossed --- ddbridge/ddbridge-core.c | 49 ++++++++++++++++++++++++---------------- ddbridge/ddbridge.c | 6 +++-- ddbridge/ddbridge.h | 5 +++- ddbridge/octonet.c | 6 ++--- frontends/cxd2843.c | 8 +++---- frontends/stv0910.c | 6 +++-- 6 files changed, 49 insertions(+), 31 deletions(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 4421b1f..63a5270 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -1223,14 +1223,7 @@ static int tuner_attach_stv6110(struct ddb_input *input, int type) return 0; } -static struct stv0910_cfg stv0910 = { - .adr = 0x6c, - .parallel = 1, - .rptlvl = 4, - .clk = 30000000, -}; - -static struct stv0910_cfg stv0910_aa = { +static struct stv0910_cfg stv0910_p = { .adr = 0x68, .parallel = 1, .rptlvl = 4, @@ -1241,11 +1234,16 @@ static int demod_attach_stv0910(struct ddb_input *input, int type) { struct i2c_adapter *i2c = &input->port->i2c->adap; struct ddb_dvb *dvb = &input->port->dvb[input->nr & 1]; + struct stv0910_cfg cfg = stv0910_p; - dvb->fe = dvb_attach(stv0910_attach, i2c, &stv0910_aa, (input->nr & 1)); - if (!dvb->fe) + if (type) + cfg.parallel = 2; + dvb->fe = dvb_attach(stv0910_attach, i2c, &cfg, (input->nr & 1)); + if (!dvb->fe) { + cfg.adr = 0x6c; dvb->fe = dvb_attach(stv0910_attach, i2c, - &stv0910, (input->nr & 1)); + &cfg, (input->nr & 1)); + } if (!dvb->fe) { pr_err("No STV0910 found!\n"); return -ENODEV; @@ -1910,12 +1908,18 @@ static int dvb_input_attach(struct ddb_input *input) if (tuner_attach_stv6111(input, 0) < 0) return -ENODEV; break; - case DDB_TUNER_DVBS_STV0910_P: + case DDB_TUNER_DVBS_STV0910_PR: if (demod_attach_stv0910(input, 1) < 0) return -ENODEV; if (tuner_attach_stv6111(input, 1) < 0) return -ENODEV; break; + case DDB_TUNER_DVBS_STV0910_P: + if (demod_attach_stv0910(input, 0) < 0) + return -ENODEV; + if (tuner_attach_stv6111(input, 1) < 0) + return -ENODEV; + break; #ifdef CONFIG_DVB_DRXK case DDB_TUNER_DVBCT_TR: if (demod_attach_drxk(input) < 0) @@ -1933,7 +1937,9 @@ static int dvb_input_attach(struct ddb_input *input) case DDB_TUNER_DVBCT2_SONY_P: case DDB_TUNER_DVBC2T2_SONY_P: case DDB_TUNER_ISDBT_SONY_P: - if (!input->port->dev->link[input->port->lnr].info->serial) + if (input->port->dev->link[input->port->lnr].info->ts_quirks & TS_QUIRK_SERIAL) + par = 0; + else par = 1; case DDB_TUNER_DVBCT2_SONY: case DDB_TUNER_DVBC2T2_SONY: @@ -2292,12 +2298,17 @@ static void ddb_port_probe(struct ddb_port *port) } else if (port_has_stv0900_aa(port, &id)) { port->name = "DUAL DVB-S2"; port->class = DDB_PORT_TUNER; - port->type = DDB_TUNER_DVBS_ST_AA; - port->type_name = "DVBS_ST_AA"; - if (id == 0x51) - port->type = DDB_TUNER_DVBS_STV0910_P; - else + if (id == 0x51) { + if (port->nr == 0 && + dev->link[l].info->ts_quirks & TS_QUIRK_REVERSED) + port->type = DDB_TUNER_DVBS_STV0910_PR; + else + port->type = DDB_TUNER_DVBS_STV0910_P; + port->type_name = "DVBS_ST_0910"; + } else { port->type = DDB_TUNER_DVBS_ST_AA; + port->type_name = "DVBS_ST_AA"; + } ddbwritel(dev, I2C_SPEED_100, port->i2c->regs + I2C_TIMING); } else if (port_has_drxks(port)) { port->name = "DUAL DVB-C/T"; @@ -4541,7 +4552,7 @@ static struct ddb_info octopus_ct_gtl = { .i2c_mask = 0x0f, .board_control = 0xff, .board_control_2 = 0xf00, - .serial = 1, + .ts_quirks = TS_QUIRK_SERIAL, }; diff --git a/ddbridge/ddbridge.c b/ddbridge/ddbridge.c index e80e0e9..7d5dc6d 100644 --- a/ddbridge/ddbridge.c +++ b/ddbridge/ddbridge.c @@ -63,6 +63,7 @@ static void __devexit ddb_remove(struct pci_dev *pdev) { struct ddb *dev = (struct ddb *) pci_get_drvdata(pdev); + ddb_device_destroy(dev); ddb_nsd_detach(dev); ddb_ports_detach(dev); ddb_i2c_release(dev); @@ -70,6 +71,7 @@ static void __devexit ddb_remove(struct pci_dev *pdev) if (dev->link[0].info->ns_num) ddbwritel(dev, 0, ETHER_CONTROL); ddbwritel(dev, 0, INTERRUPT_ENABLE); + ddbwritel(dev, 0, MSI1_ENABLE); if (dev->msi == 2) free_irq(dev->pdev->irq + 1, dev); @@ -80,7 +82,6 @@ static void __devexit ddb_remove(struct pci_dev *pdev) #endif ddb_ports_release(dev); ddb_buffers_free(dev); - ddb_device_destroy(dev); ddb_unmap(dev); pci_set_drvdata(pdev, 0); @@ -359,6 +360,7 @@ static struct ddb_info ddb_v7 = { .i2c_mask = 0x0f, .board_control = 2, .board_control_2 = 4, + .ts_quirks = TS_QUIRK_REVERSED, }; static struct ddb_info ddb_ctv7 = { @@ -432,7 +434,7 @@ static struct ddb_info ddb_ct_8 = { .i2c_mask = 0x0f, .board_control = 0x0ff, .board_control_2 = 0xf00, - .serial = 1, + .ts_quirks = TS_QUIRK_SERIAL, }; static struct ddb_info ddb_mod = { diff --git a/ddbridge/ddbridge.h b/ddbridge/ddbridge.h index bad0dc6..e215624 100644 --- a/ddbridge/ddbridge.h +++ b/ddbridge/ddbridge.h @@ -160,7 +160,9 @@ struct ddb_info { u8 ns_num; u8 mdio_num; u8 con_clock; /* use a continuous clock */ - u8 serial; /* override to serial transfer */ + u8 ts_quirks; +#define TS_QUIRK_SERIAL 1 +#define TS_QUIRK_REVERSED 2 struct ddb_regmap *regmap; }; @@ -290,6 +292,7 @@ struct ddb_port { #define DDB_TUNER_MXL5XX 11 #define DDB_CI_EXTERNAL_XO2 12 #define DDB_CI_EXTERNAL_XO2_B 13 +#define DDB_TUNER_DVBS_STV0910_PR 14 #define DDB_TUNER_XO2 32 #define DDB_TUNER_DVBS_STV0910 (DDB_TUNER_XO2 + 0) diff --git a/ddbridge/octonet.c b/ddbridge/octonet.c index 05efed8..e5f7284 100644 --- a/ddbridge/octonet.c +++ b/ddbridge/octonet.c @@ -114,15 +114,15 @@ static int __exit octonet_remove(struct platform_device *pdev) dev = platform_get_drvdata(pdev); ddb_device_destroy(dev); - ddb_nsd_detach(dev); ddb_ports_detach(dev); ddb_i2c_release(dev); - ddbwritel(dev, 0, ETHER_CONTROL); + if (dev->link[0].info->ns_num) + ddbwritel(dev, 0, ETHER_CONTROL); ddbwritel(dev, 0, INTERRUPT_ENABLE); - free_irq(platform_get_irq(dev->pfdev, 0), dev); + free_irq(platform_get_irq(dev->pfdev, 0), dev); ddb_ports_release(dev); octonet_unmap(dev); platform_set_drvdata(pdev, 0); diff --git a/frontends/cxd2843.c b/frontends/cxd2843.c index e8b5e25..021969a 100644 --- a/frontends/cxd2843.c +++ b/frontends/cxd2843.c @@ -1898,7 +1898,7 @@ static struct dvb_frontend_ops common_ops_2843 = { FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO | - FE_CAN_RECOVER | FE_CAN_MUTE_TS + FE_CAN_RECOVER | FE_CAN_MUTE_TS | FE_CAN_2G_MODULATION }, .release = release, .sleep = sleep, @@ -1936,7 +1936,7 @@ static struct dvb_frontend_ops common_ops_2837 = { FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO | - FE_CAN_RECOVER | FE_CAN_MUTE_TS + FE_CAN_RECOVER | FE_CAN_MUTE_TS | FE_CAN_2G_MODULATION }, .release = release, .sleep = sleep, @@ -1966,13 +1966,13 @@ static struct dvb_frontend_ops common_ops_2838 = { .frequency_max = 865000000, .symbol_rate_min = 870000, .symbol_rate_max = 11700000, - .caps = FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO | + .caps = FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO | FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO | - FE_CAN_RECOVER | FE_CAN_MUTE_TS + FE_CAN_RECOVER | FE_CAN_MUTE_TS | FE_CAN_2G_MODULATION }, .release = release, .sleep = sleep, diff --git a/frontends/stv0910.c b/frontends/stv0910.c index 3bab948..aba0dff 100644 --- a/frontends/stv0910.c +++ b/frontends/stv0910.c @@ -103,6 +103,7 @@ struct stv { u16 regoff; u8 i2crpt; u8 tscfgh; + u8 tsgeneral; u8 tsspeed; unsigned long tune_time; @@ -932,7 +933,7 @@ static int probe(struct stv *state) if (id != 0x51) return -EINVAL; - pr_info("stv0910: found STV0910 id=0x%02x\n", id); + /* pr_info("stv0910: found STV0910 id=0x%02x\n", id); */ /* Configure the I2C repeater to off */ write_reg(state, RSTV0910_P1_I2CRPT, 0x24); @@ -944,7 +945,7 @@ static int probe(struct stv *state) write_reg(state, RSTV0910_OUTCFG, 0x00); /* OUTCFG */ write_reg(state, RSTV0910_PADCFG, 0x05); /* RF AGC Pads Dev = 05 */ write_reg(state, RSTV0910_SYNTCTRL, 0x02); /* SYNTCTRL */ - write_reg(state, RSTV0910_TSGENERAL, 0x00); /* TSGENERAL */ + write_reg(state, RSTV0910_TSGENERAL, state->tsgeneral); /* TSGENERAL */ write_reg(state, RSTV0910_CFGEXT, 0x02); /* CFGEXT */ write_reg(state, RSTV0910_GENCFG, 0x15); /* GENCFG */ @@ -1359,6 +1360,7 @@ struct dvb_frontend *stv0910_attach(struct i2c_adapter *i2c, return NULL; state->tscfgh = 0x20 | (cfg->parallel ? 0 : 0x40); + state->tsgeneral = (cfg->parallel == 2) ? 0x02 : 0x00; state->i2crpt = 0x0A | ((cfg->rptlvl & 0x07) << 4); state->tsspeed = 0x40; state->nr = nr; From 16f0d291b12a4930d41d5df05ffabbe77f9fac9c Mon Sep 17 00:00:00 2001 From: mvoelkel Date: Fri, 11 Dec 2015 16:06:24 +0100 Subject: [PATCH 17/17] Version 0.9.21 --- ddbridge/ddbridge.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddbridge/ddbridge.h b/ddbridge/ddbridge.h index e215624..8cfa05d 100644 --- a/ddbridge/ddbridge.h +++ b/ddbridge/ddbridge.h @@ -712,6 +712,6 @@ void ddbridge_mod_rate_handler(unsigned long data); int ddbridge_flashread(struct ddb *dev, u32 link, u8 *buf, u32 addr, u32 len); -#define DDBRIDGE_VERSION "0.9.20" +#define DDBRIDGE_VERSION "0.9.21" #endif