Commit 1f2cbe2c authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman

staging: comedi: adl_pci9118: introduce struct pci9118_dmabuf

For aesthetics, wrap the DMA buffer information in a struct.
Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 231649a4
...@@ -204,6 +204,14 @@ static const struct pci9118_boardinfo pci9118_boards[] = { ...@@ -204,6 +204,14 @@ static const struct pci9118_boardinfo pci9118_boards[] = {
}, },
}; };
struct pci9118_dmabuf {
unsigned short *virt; /* virtual address of buffer */
unsigned long hw; /* hardware (bus) address of buffer */
unsigned int size; /* size of dma buffer in bytes */
unsigned int use_size; /* which size we may now use for transfer */
int pages; /* number of pages in buffer */
};
struct pci9118_private { struct pci9118_private {
unsigned long iobase_a; /* base+size for AMCC chip */ unsigned long iobase_a; /* base+size for AMCC chip */
unsigned int master:1; unsigned int master:1;
...@@ -239,19 +247,7 @@ struct pci9118_private { ...@@ -239,19 +247,7 @@ struct pci9118_private {
* on external start * on external start
*/ */
unsigned int dma_actbuf; /* which buffer is used now */ unsigned int dma_actbuf; /* which buffer is used now */
unsigned short *dmabuf_virt[2]; /* struct pci9118_dmabuf dmabuf[2];
* pointers to begin of
* DMA buffer
*/
unsigned long dmabuf_hw[2]; /* hw address of DMA buff */
unsigned int dmabuf_size[2]; /*
* size of dma buffer in bytes
*/
unsigned int dmabuf_use_size[2]; /*
* which size we may now use
* for transfer
*/
int dmabuf_pages[2]; /* number of pages in buffer */
unsigned char exttrg_users; /* unsigned char exttrg_users; /*
* bit field of external trigger * bit field of external trigger
* users(0-AI, 1-AO, 2-DI, 3-DO) * users(0-AI, 1-AO, 2-DI, 3-DO)
...@@ -274,11 +270,11 @@ struct pci9118_private { ...@@ -274,11 +270,11 @@ struct pci9118_private {
static void pci9118_amcc_setup_dma(struct comedi_device *dev, unsigned int buf) static void pci9118_amcc_setup_dma(struct comedi_device *dev, unsigned int buf)
{ {
struct pci9118_private *devpriv = dev->private; struct pci9118_private *devpriv = dev->private;
struct pci9118_dmabuf *dmabuf = &devpriv->dmabuf[buf];
/* set the master write address and transfer count */ /* set the master write address and transfer count */
outl(devpriv->dmabuf_hw[buf], devpriv->iobase_a + AMCC_OP_REG_MWAR); outl(dmabuf->hw, devpriv->iobase_a + AMCC_OP_REG_MWAR);
outl(devpriv->dmabuf_use_size[buf], outl(dmabuf->use_size, devpriv->iobase_a + AMCC_OP_REG_MWTC);
devpriv->iobase_a + AMCC_OP_REG_MWTC);
} }
static void pci9118_amcc_dma_ena(struct comedi_device *dev, bool enable) static void pci9118_amcc_dma_ena(struct comedi_device *dev, bool enable)
...@@ -456,13 +452,15 @@ static int setup_channel_list(struct comedi_device *dev, ...@@ -456,13 +452,15 @@ static int setup_channel_list(struct comedi_device *dev,
static void interrupt_pci9118_ai_mode4_switch(struct comedi_device *dev) static void interrupt_pci9118_ai_mode4_switch(struct comedi_device *dev)
{ {
struct pci9118_private *devpriv = dev->private; struct pci9118_private *devpriv = dev->private;
struct pci9118_dmabuf *dmabuf;
dmabuf = &devpriv->dmabuf[1 - devpriv->dma_actbuf];
devpriv->ai_cfg = PCI9118_AI_CFG_PDTRG | PCI9118_AI_CFG_PETRG | devpriv->ai_cfg = PCI9118_AI_CFG_PDTRG | PCI9118_AI_CFG_PETRG |
PCI9118_AI_CFG_AM; PCI9118_AI_CFG_AM;
outl(devpriv->ai_cfg, dev->iobase + PCI9118_AI_CFG_REG); outl(devpriv->ai_cfg, dev->iobase + PCI9118_AI_CFG_REG);
pci9118_timer_set_mode(dev, 0, I8254_MODE0); pci9118_timer_set_mode(dev, 0, I8254_MODE0);
pci9118_timer_write(dev, 0, pci9118_timer_write(dev, 0, dmabuf->hw >> 1);
devpriv->dmabuf_hw[1 - devpriv->dma_actbuf] >> 1);
devpriv->ai_cfg |= PCI9118_AI_CFG_START; devpriv->ai_cfg |= PCI9118_AI_CFG_START;
outl(devpriv->ai_cfg, dev->iobase + PCI9118_AI_CFG_REG); outl(devpriv->ai_cfg, dev->iobase + PCI9118_AI_CFG_REG);
} }
...@@ -689,10 +687,10 @@ static void interrupt_pci9118_ai_dma(struct comedi_device *dev, ...@@ -689,10 +687,10 @@ static void interrupt_pci9118_ai_dma(struct comedi_device *dev,
{ {
struct pci9118_private *devpriv = dev->private; struct pci9118_private *devpriv = dev->private;
struct comedi_cmd *cmd = &s->async->cmd; struct comedi_cmd *cmd = &s->async->cmd;
struct pci9118_dmabuf *dmabuf = &devpriv->dmabuf[devpriv->dma_actbuf];
unsigned int next_dma_buf, samplesinbuf, sampls, m; unsigned int next_dma_buf, samplesinbuf, sampls, m;
samplesinbuf = devpriv->dmabuf_use_size[devpriv->dma_actbuf] >> 1; samplesinbuf = dmabuf->use_size >> 1; /* number of received samples */
/* number of received real samples */
if (devpriv->dma_doublebuf) { /* if (devpriv->dma_doublebuf) { /*
* switch DMA buffers if is used * switch DMA buffers if is used
...@@ -708,9 +706,7 @@ static void interrupt_pci9118_ai_dma(struct comedi_device *dev, ...@@ -708,9 +706,7 @@ static void interrupt_pci9118_ai_dma(struct comedi_device *dev,
/* how many samples is to end of buffer */ /* how many samples is to end of buffer */
m = s->async->prealloc_bufsz >> 1; m = s->async->prealloc_bufsz >> 1;
sampls = m; sampls = m;
move_block_from_dma(dev, s, move_block_from_dma(dev, s, dmabuf->virt, samplesinbuf);
devpriv->dmabuf_virt[devpriv->dma_actbuf],
samplesinbuf);
m = m - sampls; /* m=how many samples was transferred */ m = m - sampls; /* m=how many samples was transferred */
} }
...@@ -1016,10 +1012,12 @@ static int Compute_and_setup_dma(struct comedi_device *dev, ...@@ -1016,10 +1012,12 @@ static int Compute_and_setup_dma(struct comedi_device *dev,
{ {
struct pci9118_private *devpriv = dev->private; struct pci9118_private *devpriv = dev->private;
struct comedi_cmd *cmd = &s->async->cmd; struct comedi_cmd *cmd = &s->async->cmd;
struct pci9118_dmabuf *dmabuf0 = &devpriv->dmabuf[0];
struct pci9118_dmabuf *dmabuf1 = &devpriv->dmabuf[1];
unsigned int dmalen0, dmalen1, i; unsigned int dmalen0, dmalen1, i;
dmalen0 = devpriv->dmabuf_size[0]; dmalen0 = dmabuf0->size;
dmalen1 = devpriv->dmabuf_size[1]; dmalen1 = dmabuf1->size;
/* isn't output buff smaller that our DMA buff? */ /* isn't output buff smaller that our DMA buff? */
if (dmalen0 > s->async->prealloc_bufsz) { if (dmalen0 > s->async->prealloc_bufsz) {
/* align to 32bit down */ /* align to 32bit down */
...@@ -1115,8 +1113,8 @@ static int Compute_and_setup_dma(struct comedi_device *dev, ...@@ -1115,8 +1113,8 @@ static int Compute_and_setup_dma(struct comedi_device *dev,
/* these DMA buffer size will be used */ /* these DMA buffer size will be used */
devpriv->dma_actbuf = 0; devpriv->dma_actbuf = 0;
devpriv->dmabuf_use_size[0] = dmalen0; dmabuf0->use_size = dmalen0;
devpriv->dmabuf_use_size[1] = dmalen1; dmabuf1->use_size = dmalen1;
pci9118_amcc_dma_ena(dev, false); pci9118_amcc_dma_ena(dev, false);
pci9118_amcc_setup_dma(dev, 0); pci9118_amcc_setup_dma(dev, 0);
...@@ -1184,6 +1182,7 @@ static int pci9118_ai_docmd_dma(struct comedi_device *dev, ...@@ -1184,6 +1182,7 @@ static int pci9118_ai_docmd_dma(struct comedi_device *dev,
{ {
struct pci9118_private *devpriv = dev->private; struct pci9118_private *devpriv = dev->private;
struct comedi_cmd *cmd = &s->async->cmd; struct comedi_cmd *cmd = &s->async->cmd;
struct pci9118_dmabuf *dmabuf = &devpriv->dmabuf[0];
Compute_and_setup_dma(dev, s); Compute_and_setup_dma(dev, s);
...@@ -1218,7 +1217,7 @@ static int pci9118_ai_docmd_dma(struct comedi_device *dev, ...@@ -1218,7 +1217,7 @@ static int pci9118_ai_docmd_dma(struct comedi_device *dev,
PCI9118_AI_CFG_AM; PCI9118_AI_CFG_AM;
outl(devpriv->ai_cfg, dev->iobase + PCI9118_AI_CFG_REG); outl(devpriv->ai_cfg, dev->iobase + PCI9118_AI_CFG_REG);
pci9118_timer_set_mode(dev, 0, I8254_MODE0); pci9118_timer_set_mode(dev, 0, I8254_MODE0);
pci9118_timer_write(dev, 0, devpriv->dmabuf_hw[0] >> 1); pci9118_timer_write(dev, 0, dmabuf->hw >> 1);
devpriv->ai_cfg |= PCI9118_AI_CFG_START; devpriv->ai_cfg |= PCI9118_AI_CFG_START;
break; break;
default: default:
...@@ -1610,44 +1609,45 @@ static struct pci_dev *pci9118_find_pci(struct comedi_device *dev, ...@@ -1610,44 +1609,45 @@ static struct pci_dev *pci9118_find_pci(struct comedi_device *dev,
static void pci9118_alloc_dma(struct comedi_device *dev) static void pci9118_alloc_dma(struct comedi_device *dev)
{ {
struct pci9118_private *devpriv = dev->private; struct pci9118_private *devpriv = dev->private;
struct pci9118_dmabuf *dmabuf;
int pages; int pages;
int i; int i;
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
dmabuf = &devpriv->dmabuf[i];
for (pages = 4; pages >= 0; pages--) { for (pages = 4; pages >= 0; pages--) {
devpriv->dmabuf_virt[i] = dmabuf->virt = (unsigned short *)
(unsigned short *)__get_free_pages(GFP_KERNEL, __get_free_pages(GFP_KERNEL, pages);
pages); if (dmabuf->virt)
if (devpriv->dmabuf_virt[i])
break; break;
} }
if (devpriv->dmabuf_virt[i]) { if (dmabuf->virt) {
devpriv->dmabuf_pages[i] = pages; dmabuf->pages = pages;
devpriv->dmabuf_size[i] = PAGE_SIZE * pages; dmabuf->size = PAGE_SIZE * pages;
devpriv->dmabuf_hw[i] = virt_to_bus((void *) dmabuf->hw = virt_to_bus((void *)dmabuf->virt);
devpriv->dmabuf_virt[i]);
}
}
if (devpriv->dmabuf_virt[0]) if (i == 0)
devpriv->master = 1; devpriv->master = 1;
if (devpriv->dmabuf_virt[1]) if (i == 1)
devpriv->dma_doublebuf = 1; devpriv->dma_doublebuf = 1;
}
}
} }
static void pci9118_free_dma(struct comedi_device *dev) static void pci9118_free_dma(struct comedi_device *dev)
{ {
struct pci9118_private *devpriv = dev->private; struct pci9118_private *devpriv = dev->private;
struct pci9118_dmabuf *dmabuf;
int i;
if (!devpriv) if (!devpriv)
return; return;
if (devpriv->dmabuf_virt[0]) for (i = 0; i < 2; i++) {
free_pages((unsigned long)devpriv->dmabuf_virt[0], dmabuf = &devpriv->dmabuf[i];
devpriv->dmabuf_pages[0]); if (dmabuf->virt)
if (devpriv->dmabuf_virt[1]) free_pages((unsigned long)dmabuf->virt, dmabuf->pages);
free_pages((unsigned long)devpriv->dmabuf_virt[1], }
devpriv->dmabuf_pages[1]);
} }
static int pci9118_common_attach(struct comedi_device *dev, static int pci9118_common_attach(struct comedi_device *dev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment