From de16096894d0b424ca9c5fb379a525e26cbbfdf7 Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Wed, 20 Apr 2016 16:27:56 +0200 Subject: [PATCH] add new maps for dma and i/o --- ddbridge/ddbridge-core.c | 10 +-- ddbridge/ddbridge-regs.h | 2 +- ddbridge/ddbridge.c | 147 +++++++++++++++++++++++++++++++++++---- ddbridge/ddbridge.h | 14 +++- 4 files changed, 149 insertions(+), 24 deletions(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 4b60249..c4a7969 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -89,7 +89,7 @@ static void ddb_set_dma_table(struct ddb *dev, struct ddb_dma *dma) ddbwritel(dev, mem & 0xffffffff, base + i * 8); ddbwritel(dev, mem >> 32, base + i * 8 + 4); } - dma->bufreg = (dma->div << 16) | + dma->bufval = (dma->div << 16) | ((dma->num & 0x1f) << 11) | ((dma->size >> 7) & 0x7ff); } @@ -116,7 +116,7 @@ static void ddb_redirect_dma(struct ddb *dev, u32 i, base; u64 mem; - sdma->bufreg = ddma->bufreg; + sdma->bufval = ddma->bufval; base = DMA_BASE_ADDRESS_TABLE + sdma->nr * 0x100; for (i = 0; i < ddma->num; i++) { mem = ddma->pbuf[i]; @@ -351,7 +351,7 @@ static void ddb_output_start(struct ddb_output *output) ddbwritel(dev, con2, TS_OUTPUT_CONTROL2(output->nr)); } if (output->dma) { - ddbwritel(dev, output->dma->bufreg, + ddbwritel(dev, output->dma->bufval, DMA_BUFFER_SIZE(output->dma->nr)); ddbwritel(dev, 0, DMA_BUFFER_ACK(output->dma->nr)); ddbwritel(dev, 1, DMA_BASE_READ); @@ -421,13 +421,13 @@ static void ddb_input_start(struct ddb_input *input) input->dma->stat = 0; ddbwritel(dev, 0, DMA_BUFFER_CONTROL(input->dma->nr)); } - ddbwritel(dev, 0, tag | TS_INPUT_CONTROL2(input->nr)); + //ddbwritel(dev, 0, tag | TS_INPUT_CONTROL2(input->nr)); ddbwritel(dev, 0, tag | TS_INPUT_CONTROL(input->nr)); ddbwritel(dev, 2, tag | TS_INPUT_CONTROL(input->nr)); ddbwritel(dev, 0, tag | TS_INPUT_CONTROL(input->nr)); if (input->dma) { - ddbwritel(dev, input->dma->bufreg, + ddbwritel(dev, input->dma->bufval, DMA_BUFFER_SIZE(input->dma->nr)); ddbwritel(dev, 0, DMA_BUFFER_ACK(input->dma->nr)); ddbwritel(dev, 1, DMA_BASE_WRITE); diff --git a/ddbridge/ddbridge-regs.h b/ddbridge/ddbridge-regs.h index b6343ac..0765558 100644 --- a/ddbridge/ddbridge-regs.h +++ b/ddbridge/ddbridge-regs.h @@ -156,7 +156,7 @@ /* ------------------------------------------------------------------------- */ /* I2C Master Controller */ -#define I2C_BASE (0x80) /* Byte offset */ +/*#define I2C_BASE (0x80) */ #define I2C_COMMAND (0x00) #define I2C_TIMING (0x04) diff --git a/ddbridge/ddbridge.c b/ddbridge/ddbridge.c index ab07005..933e43d 100644 --- a/ddbridge/ddbridge.c +++ b/ddbridge/ddbridge.c @@ -329,6 +329,36 @@ fail: /****************************************************************************/ /****************************************************************************/ +static struct ddb_regset octopus_input = { + .base = 0x200, + .num = 0x08, + .size = 0x10, +}; + +static struct ddb_regset octopus_output = { + .base = 0x280, + .num = 0x08, + .size = 0x10, +}; + +static struct ddb_regset octopus_idma_buf = { + .base = 0x2000, + .num = 0x08, + .size = 0x100, +}; + +static struct ddb_regset octopus_odma = { + .base = 0x380, + .num = 0x04, + .size = 0x10, +}; + +static struct ddb_regset octopus_odma_buf = { + .base = 0x2800, + .num = 0x04, + .size = 0x100, +}; + static struct ddb_regset octopus_i2c = { .base = 0x80, .num = 0x04, @@ -343,18 +373,115 @@ static struct ddb_regset octopus_i2c_buf = { /****************************************************************************/ +static struct ddb_regset octopro_input = { + .base = 0x400, + .num = 0xFile Edit Options Buffers Tools C Help + .base = 0x1000, + .num = 0x04, + .size = 0x200, +}; + +/****************************************************************************/ + +static struct ddb_regset octopro_input = { + .base = 0x400, + .num = 0x14, + .size = 0x10, +}; + +static struct ddb_regset octopro_output = { + .base = 0x600, + .num = 0x0a, + .size = 0x10, +}; + +static struct ddb_regset octopro_idma = { + .base = 0x800, + .num = 0x14, + .size = 0x10, +}; + +static struct ddb_regset octopro_odma = { + .base = 0x1000, + .num = 0x04, + .size = 0x200, +}; + +/****************************************************************************/ + +static struct ddb_regset octopro_input = { + .base = 0x400, + .num = 0x14, + .size = 0x10, +}; + +static struct ddb_regset octopro_output = { + .base = 0x600, + .num = 0x0a, + .size = 0x10, +}; + +static struct ddb_regset octopro_idma = { + .base = 0x800, + .num = 0x14, + .size = 0x10, +}; + +static struct ddb_regset octopro_idma_buf = { + .base = 0x4000, + .num = 0x14, + .size = 0x100, +}; + +static struct ddb_regset octopro_odma = { + .base = 0xa00, + .num = 0x0a, + .size = 0x10, +}; + +static struct ddb_regset octopro_odma_buf = { + .base = 0x6000, + .num = 0x0a, + .size = 0x100, +}; + +static struct ddb_regset octopro_i2c = { + .base = 0x2000, + .num = 0x0a, + .size = 0x20, +}; + +static struct ddb_regset octopro_i2c_buf = { + .base = 0x2000, + .num = 0x0a, + .size = 0x200, +}; + +/****************************************************************************/ +/****************************************************************************/ + static struct ddb_regmap octopus_map = { .i2c = &octopus_i2c, .i2c_buf = &octopus_i2c_buf, + .idma[0] = &octopus_idma, + .idma_buf[0] = &octopus_idma_buf, + .odma = &octopus_odma, + .odma_buf = &octopus_odma_buf, }; -static struct ddb_regmap octopus_net_map = { - .i2c = &octopus_i2c, - .i2c_buf = &octopus_i2c_buf, +static struct ddb_regmap octopro_map = { + .i2c = &octopro_i2c, + .i2c_buf = &octopro_i2c_buf, + .idma[0] = &octopro_idma, + .idma_buf[0] = &octopro_idma_buf, + .odma = &octopro_odma, + .odma_buf = &octopro_odma_buf, }; static struct ddb_regmap octopus_mod_map = { + .odma = &octopus_odma, + .odma_buf = &octopus_odma_buf, }; @@ -519,16 +646,6 @@ static struct ddb_info ddb_mod = { .temp_num = 1, }; -static struct ddb_info ddb_octopus_net = { - .type = DDB_OCTONET, - .name = "Digital Devices OctopusNet network DVB adapter", - .regmap = &octopus_net_map, - .port_num = 10, - .i2c_mask = 0x3ff, - .ns_num = 12, - .mdio_num = 1, -}; - static struct ddb_info ddb_octopro_hdin = { .type = DDB_OCTOPRO_HDIN, .name = "Digital Devices OctopusNet Pro HDIN", @@ -541,7 +658,7 @@ static struct ddb_info ddb_octopro_hdin = { static struct ddb_info ddb_octopro = { .type = DDB_OCTOPRO, .name = "Digital Devices OctopusNet Pro", - .regmap = &octopus_map, + .regmap = &octopro_map, .port_num = 4, .i2c_mask = 0x0f, .mdio_num = 1, @@ -585,7 +702,7 @@ static const struct pci_device_id ddb_id_tbl[] __devinitconst = { DDB_ID(DDVID, 0x0201, DDVID, 0x0001, ddb_mod), DDB_ID(DDVID, 0x0201, DDVID, 0x0002, ddb_mod), /* testing on OctopusNet Pro */ - DDB_ID(DDVID, 0x0320, PCI_ANY_ID, PCI_ANY_ID, ddb_octopus_net), + DDB_ID(DDVID, 0x0320, PCI_ANY_ID, PCI_ANY_ID, ddb_octopro), DDB_ID(DDVID, 0x0321, PCI_ANY_ID, PCI_ANY_ID, ddb_none), DDB_ID(DDVID, 0x0322, PCI_ANY_ID, PCI_ANY_ID, ddb_octopro), DDB_ID(DDVID, 0x0323, PCI_ANY_ID, PCI_ANY_ID, ddb_none), diff --git a/ddbridge/ddbridge.h b/ddbridge/ddbridge.h index 834b173..9057671 100644 --- a/ddbridge/ddbridge.h +++ b/ddbridge/ddbridge.h @@ -116,10 +116,14 @@ struct ddb_regmap { struct ddb_ports *bc; struct ddb_regset *i2c; struct ddb_regset *i2c_buf; - struct ddb_regset *dma; - struct ddb_regset *dma_buf; + struct ddb_regset *idma[4]; + struct ddb_regset *idma_buf[4]; + struct ddb_regset *odma; + struct ddb_regset *odma_buf; + struct ddb_regset *input; struct ddb_regset *output; + struct ddb_regset *channel; struct ddb_regset *ci; struct ddb_regset *pid_filter; @@ -188,12 +192,15 @@ struct ddb_port; struct ddb_dma { void *io; u32 nr; + u32 regs; + u32 bufregs; + dma_addr_t pbuf[DMA_MAX_BUFS]; u8 *vbuf[DMA_MAX_BUFS]; u32 num; u32 size; u32 div; - u32 bufreg; + u32 bufval; #ifdef DDB_USE_WORK struct work_struct work; @@ -245,6 +252,7 @@ struct ddb_ci { struct ddb_io { struct ddb_port *port; u32 nr; + u32 regs; struct ddb_dma *dma; struct ddb_io *redo; struct ddb_io *redi;