From 0dd4f106ab1ffb45ce9883c786251962ae6a1892 Mon Sep 17 00:00:00 2001 From: internal Date: Sun, 30 Oct 2022 23:23:44 +0100 Subject: [PATCH] fix port number detection on revision 1 FSM cards --- ddbridge/ddbridge-core.c | 39 +++++++++++++++++++++++++++++++++++---- ddbridge/ddbridge-hw.c | 12 ++++++++++++ ddbridge/ddbridge-main.c | 35 ++++------------------------------- 3 files changed, 51 insertions(+), 35 deletions(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 4f9a673..a8c70c3 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -2662,10 +2662,6 @@ static void ddb_ports_init(struct ddb *dev) if (!rm) continue; ports = info->port_num; - if ((l == 0) && (info->type == DDB_MOD) && - (dev->link[0].ids.revision == 1)) { - ports = ddbreadl(dev, 0x260) >> 24; - } for (i = 0; i < ports; i++, p++) { port = &dev->port[p]; port->dev = dev; @@ -4445,6 +4441,41 @@ static int ddb_init_boards(struct ddb *dev) (link->ids.revision == 1))) mci_init(link); } + if (l) + continue; + if (dev->link[0].info->type == DDB_MOD && + dev->link[0].info->version == 2) { + u32 lic = ddbreadl(dev, 0x1c) & 7; + + if (dev->link[0].ids.revision == 1) + lic = ddbreadl(dev, 0x260) >> 24; + + switch (lic) { + case 0: + case 4: + dev->link[0].info = + get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0000); + break; + case 1: + case 8: + dev->link[0].info = + get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0003); + break; + case 2: + case 24: + dev->link[0].info = + get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0001); + break; + case 3: + case 16: + dev->link[0].info = + get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0002); + break; + default: + break; + } + dev_info(dev->dev, "Modulator channels: %u\n", dev->link[0].info->port_num); + } } return 0; } diff --git a/ddbridge/ddbridge-hw.c b/ddbridge/ddbridge-hw.c index 41cc3a2..37a75a3 100644 --- a/ddbridge/ddbridge-hw.c +++ b/ddbridge/ddbridge-hw.c @@ -570,6 +570,17 @@ static const struct ddb_info ddb_mod_fsm_4 = { .lostlock_irq = 9, }; +static const struct ddb_info ddb_mod_fsm = { + .type = DDB_MOD, + .name = "Digital Devices DVB-C FSM", + .version = 2, + .regmap = &octopus_mod_2_map, + .port_num = 0, + .temp_num = 1, + .tempmon_irq = 8, + .lostlock_irq = 9, +}; + static const struct ddb_info ddb_sdr_atv = { .type = DDB_MOD, .name = "Digital Devices SDR ATV", @@ -873,6 +884,7 @@ static const struct ddb_device_id ddb_device_ids[] = { DDB_DEVID(0x0201, 0x0002, ddb_mod), DDB_DEVID(0x0201, 0x0004, ddb_mod_4), /* dummy entry ! */ DDB_DEVID(0x0203, 0x0001, ddb_mod), + DDB_DEVID(0x0210, 0x0004, ddb_mod_fsm), /* dummy entry ! */ DDB_DEVID(0x0210, 0x0000, ddb_mod_fsm_4), /* dummy entry ! */ DDB_DEVID(0x0210, 0x0001, ddb_mod_fsm_24), DDB_DEVID(0x0210, 0x0002, ddb_mod_fsm_16), diff --git a/ddbridge/ddbridge-main.c b/ddbridge/ddbridge-main.c index 955fb12..4419449 100644 --- a/ddbridge/ddbridge-main.c +++ b/ddbridge/ddbridge-main.c @@ -357,38 +357,11 @@ static int __devinit ddb_probe(struct pci_dev *pdev, get_ddb_info(0xdd01, 0x0201, 0xdd01, 0x0004); } if (dev->link[0].info->type == DDB_MOD && - dev->link[0].info->version == 2) { - u32 lic = ddbreadl(dev, 0x1c) & 7; + dev->link[0].info->version == 2) + dev->link[0].info = + get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0004); - if (dev->link[0].ids.revision == 1) - lic = ddbreadl(dev, 0x260) >> 24; - - switch (lic) { - case 0: - case 4: - dev->link[0].info = - get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0000); - break; - case 1: - case 8: - dev->link[0].info = - get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0003); - break; - case 2: - case 24: - dev->link[0].info = - get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0001); - break; - case 3: - case 16: - dev->link[0].info = - get_ddb_info(0xdd01, 0x0210, 0xdd01, 0x0002); - break; - default: - break; - } - } - dev_info(dev->dev, "device name: %s\n", dev->link[0].info->name); + dev_info(dev->dev, "%s\n", dev->link[0].info->name); dev_info(dev->dev, "HW %08x REGMAP %08x FW %u.%u\n", dev->link[0].ids.hwid, dev->link[0].ids.regmapid, (dev->link[0].ids.hwid & 0xff0000) >> 16,