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

staging: comedi: das1800: reduce indent level of das1800_init_dma()

An IRQ and at least one DMA channel are required to use DMA with this driver.
Move the check to the caller to reduce the indent level of this function.
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 ffcc4b59
...@@ -1240,72 +1240,70 @@ static int das1800_init_dma(struct comedi_device *dev, unsigned int dma0, ...@@ -1240,72 +1240,70 @@ static int das1800_init_dma(struct comedi_device *dev, unsigned int dma0,
struct das1800_private *devpriv = dev->private; struct das1800_private *devpriv = dev->private;
unsigned long flags; unsigned long flags;
/* need an irq to do dma */ /* encode dma0 and dma1 into 2 digit hexadecimal for switch */
if (dev->irq && dma0) { switch ((dma0 & 0x7) | (dma1 << 4)) {
/* encode dma0 and dma1 into 2 digit hexadecimal for switch */ case 0x5: /* dma0 == 5 */
switch ((dma0 & 0x7) | (dma1 << 4)) { devpriv->dma_bits |= DMA_CH5;
case 0x5: /* dma0 == 5 */ break;
devpriv->dma_bits |= DMA_CH5; case 0x6: /* dma0 == 6 */
break; devpriv->dma_bits |= DMA_CH6;
case 0x6: /* dma0 == 6 */ break;
devpriv->dma_bits |= DMA_CH6; case 0x7: /* dma0 == 7 */
break; devpriv->dma_bits |= DMA_CH7;
case 0x7: /* dma0 == 7 */ break;
devpriv->dma_bits |= DMA_CH7; case 0x65: /* dma0 == 5, dma1 == 6 */
break; devpriv->dma_bits |= DMA_CH5_CH6;
case 0x65: /* dma0 == 5, dma1 == 6 */ break;
devpriv->dma_bits |= DMA_CH5_CH6; case 0x76: /* dma0 == 6, dma1 == 7 */
break; devpriv->dma_bits |= DMA_CH6_CH7;
case 0x76: /* dma0 == 6, dma1 == 7 */ break;
devpriv->dma_bits |= DMA_CH6_CH7; case 0x57: /* dma0 == 7, dma1 == 5 */
break; devpriv->dma_bits |= DMA_CH7_CH5;
case 0x57: /* dma0 == 7, dma1 == 5 */ break;
devpriv->dma_bits |= DMA_CH7_CH5; default:
break; dev_err(dev->class_dev,
default: "only supports dma channels 5 through 7\n");
dev_err(dev->class_dev, dev_err(dev->class_dev,
"only supports dma channels 5 through 7\n"); "Dual dma only allows the following combinations:\n");
dev_err(dev->class_dev, dev_err(dev->class_dev,
"Dual dma only allows the following combinations:\n"); "dma 5,6 / 6,7 / or 7,5\n");
dev_err(dev->class_dev, return -EINVAL;
"dma 5,6 / 6,7 / or 7,5\n"); }
return -EINVAL; if (request_dma(dma0, dev->driver->driver_name)) {
} dev_err(dev->class_dev,
if (request_dma(dma0, dev->driver->driver_name)) { "failed to allocate dma channel %i\n", dma0);
return -EINVAL;
}
devpriv->dma0 = dma0;
devpriv->dma_current = dma0;
if (dma1) {
if (request_dma(dma1, dev->driver->driver_name)) {
dev_err(dev->class_dev, dev_err(dev->class_dev,
"failed to allocate dma channel %i\n", dma0); "failed to allocate dma channel %i\n",
dma1);
return -EINVAL; return -EINVAL;
} }
devpriv->dma0 = dma0; devpriv->dma1 = dma1;
devpriv->dma_current = dma0; }
if (dma1) { devpriv->ai_buf0 = kmalloc(DMA_BUF_SIZE, GFP_KERNEL | GFP_DMA);
if (request_dma(dma1, dev->driver->driver_name)) { if (devpriv->ai_buf0 == NULL)
dev_err(dev->class_dev, return -ENOMEM;
"failed to allocate dma channel %i\n", devpriv->dma_current_buf = devpriv->ai_buf0;
dma1); if (dma1) {
return -EINVAL; devpriv->ai_buf1 =
} kmalloc(DMA_BUF_SIZE, GFP_KERNEL | GFP_DMA);
devpriv->dma1 = dma1; if (devpriv->ai_buf1 == NULL)
}
devpriv->ai_buf0 = kmalloc(DMA_BUF_SIZE, GFP_KERNEL | GFP_DMA);
if (devpriv->ai_buf0 == NULL)
return -ENOMEM; return -ENOMEM;
devpriv->dma_current_buf = devpriv->ai_buf0;
if (dma1) {
devpriv->ai_buf1 =
kmalloc(DMA_BUF_SIZE, GFP_KERNEL | GFP_DMA);
if (devpriv->ai_buf1 == NULL)
return -ENOMEM;
}
flags = claim_dma_lock();
disable_dma(devpriv->dma0);
set_dma_mode(devpriv->dma0, DMA_MODE_READ);
if (dma1) {
disable_dma(devpriv->dma1);
set_dma_mode(devpriv->dma1, DMA_MODE_READ);
}
release_dma_lock(flags);
} }
flags = claim_dma_lock();
disable_dma(devpriv->dma0);
set_dma_mode(devpriv->dma0, DMA_MODE_READ);
if (dma1) {
disable_dma(devpriv->dma1);
set_dma_mode(devpriv->dma1, DMA_MODE_READ);
}
release_dma_lock(flags);
return 0; return 0;
} }
...@@ -1437,9 +1435,12 @@ static int das1800_attach(struct comedi_device *dev, ...@@ -1437,9 +1435,12 @@ static int das1800_attach(struct comedi_device *dev,
} }
} }
ret = das1800_init_dma(dev, dma0, dma1); /* an irq and one dma channel is required to use dma */
if (ret < 0) if (dev->irq & dma0) {
return ret; ret = das1800_init_dma(dev, dma0, dma1);
if (ret < 0)
return ret;
}
if (devpriv->ai_buf0 == NULL) { if (devpriv->ai_buf0 == NULL) {
devpriv->ai_buf0 = devpriv->ai_buf0 =
......
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