From 29dc0f9e315aebc6ece07d6212b0c9f7b501b48c Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Thu, 17 Sep 2015 18:54:25 +0200 Subject: [PATCH] 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;