staging: comedi: icp_multi: use the comedi_device 'mmio' member
Use the new 'mmio' member in the comedi_device for the ioremap'ed base address. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
565700447a
commit
a3e6328810
1 changed files with 35 additions and 45 deletions
|
@ -108,7 +108,6 @@ static const char range_codes_analog[] = { 0x00, 0x20, 0x10, 0x30 };
|
||||||
|
|
||||||
struct icp_multi_private {
|
struct icp_multi_private {
|
||||||
char valid; /* card is usable */
|
char valid; /* card is usable */
|
||||||
void __iomem *io_addr; /* Pointer to mapped io address */
|
|
||||||
unsigned int AdcCmdStatus; /* ADC Command/Status register */
|
unsigned int AdcCmdStatus; /* ADC Command/Status register */
|
||||||
unsigned int DacCmdStatus; /* DAC Command/Status register */
|
unsigned int DacCmdStatus; /* DAC Command/Status register */
|
||||||
unsigned int IntEnable; /* Interrupt Enable register */
|
unsigned int IntEnable; /* Interrupt Enable register */
|
||||||
|
@ -164,8 +163,7 @@ static void setup_channel_list(struct comedi_device *dev,
|
||||||
devpriv->AdcCmdStatus |= range;
|
devpriv->AdcCmdStatus |= range;
|
||||||
|
|
||||||
/* Output channel, range, mode to ICP Multi */
|
/* Output channel, range, mode to ICP Multi */
|
||||||
writew(devpriv->AdcCmdStatus,
|
writew(devpriv->AdcCmdStatus, dev->mmio + ICP_MULTI_ADC_CSR);
|
||||||
devpriv->io_addr + ICP_MULTI_ADC_CSR);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,10 +172,9 @@ static int icp_multi_ai_eoc(struct comedi_device *dev,
|
||||||
struct comedi_insn *insn,
|
struct comedi_insn *insn,
|
||||||
unsigned long context)
|
unsigned long context)
|
||||||
{
|
{
|
||||||
struct icp_multi_private *devpriv = dev->private;
|
|
||||||
unsigned int status;
|
unsigned int status;
|
||||||
|
|
||||||
status = readw(devpriv->io_addr + ICP_MULTI_ADC_CSR);
|
status = readw(dev->mmio + ICP_MULTI_ADC_CSR);
|
||||||
if ((status & ADC_BSY) == 0)
|
if ((status & ADC_BSY) == 0)
|
||||||
return 0;
|
return 0;
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
@ -185,7 +182,8 @@ static int icp_multi_ai_eoc(struct comedi_device *dev,
|
||||||
|
|
||||||
static int icp_multi_insn_read_ai(struct comedi_device *dev,
|
static int icp_multi_insn_read_ai(struct comedi_device *dev,
|
||||||
struct comedi_subdevice *s,
|
struct comedi_subdevice *s,
|
||||||
struct comedi_insn *insn, unsigned int *data)
|
struct comedi_insn *insn,
|
||||||
|
unsigned int *data)
|
||||||
{
|
{
|
||||||
struct icp_multi_private *devpriv = dev->private;
|
struct icp_multi_private *devpriv = dev->private;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -193,11 +191,11 @@ static int icp_multi_insn_read_ai(struct comedi_device *dev,
|
||||||
|
|
||||||
/* Disable A/D conversion ready interrupt */
|
/* Disable A/D conversion ready interrupt */
|
||||||
devpriv->IntEnable &= ~ADC_READY;
|
devpriv->IntEnable &= ~ADC_READY;
|
||||||
writew(devpriv->IntEnable, devpriv->io_addr + ICP_MULTI_INT_EN);
|
writew(devpriv->IntEnable, dev->mmio + ICP_MULTI_INT_EN);
|
||||||
|
|
||||||
/* Clear interrupt status */
|
/* Clear interrupt status */
|
||||||
devpriv->IntStatus |= ADC_READY;
|
devpriv->IntStatus |= ADC_READY;
|
||||||
writew(devpriv->IntStatus, devpriv->io_addr + ICP_MULTI_INT_STAT);
|
writew(devpriv->IntStatus, dev->mmio + ICP_MULTI_INT_STAT);
|
||||||
|
|
||||||
/* Set up appropriate channel, mode and range data, for specified ch */
|
/* Set up appropriate channel, mode and range data, for specified ch */
|
||||||
setup_channel_list(dev, s, &insn->chanspec, 1);
|
setup_channel_list(dev, s, &insn->chanspec, 1);
|
||||||
|
@ -205,8 +203,7 @@ static int icp_multi_insn_read_ai(struct comedi_device *dev,
|
||||||
for (n = 0; n < insn->n; n++) {
|
for (n = 0; n < insn->n; n++) {
|
||||||
/* Set start ADC bit */
|
/* Set start ADC bit */
|
||||||
devpriv->AdcCmdStatus |= ADC_ST;
|
devpriv->AdcCmdStatus |= ADC_ST;
|
||||||
writew(devpriv->AdcCmdStatus,
|
writew(devpriv->AdcCmdStatus, dev->mmio + ICP_MULTI_ADC_CSR);
|
||||||
devpriv->io_addr + ICP_MULTI_ADC_CSR);
|
|
||||||
devpriv->AdcCmdStatus &= ~ADC_ST;
|
devpriv->AdcCmdStatus &= ~ADC_ST;
|
||||||
|
|
||||||
udelay(1);
|
udelay(1);
|
||||||
|
@ -216,17 +213,16 @@ static int icp_multi_insn_read_ai(struct comedi_device *dev,
|
||||||
if (ret)
|
if (ret)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
data[n] =
|
data[n] = (readw(dev->mmio + ICP_MULTI_AI) >> 4) & 0x0fff;
|
||||||
(readw(devpriv->io_addr + ICP_MULTI_AI) >> 4) & 0x0fff;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable interrupt */
|
/* Disable interrupt */
|
||||||
devpriv->IntEnable &= ~ADC_READY;
|
devpriv->IntEnable &= ~ADC_READY;
|
||||||
writew(devpriv->IntEnable, devpriv->io_addr + ICP_MULTI_INT_EN);
|
writew(devpriv->IntEnable, dev->mmio + ICP_MULTI_INT_EN);
|
||||||
|
|
||||||
/* Clear interrupt status */
|
/* Clear interrupt status */
|
||||||
devpriv->IntStatus |= ADC_READY;
|
devpriv->IntStatus |= ADC_READY;
|
||||||
writew(devpriv->IntStatus, devpriv->io_addr + ICP_MULTI_INT_STAT);
|
writew(devpriv->IntStatus, dev->mmio + ICP_MULTI_INT_STAT);
|
||||||
|
|
||||||
return ret ? ret : n;
|
return ret ? ret : n;
|
||||||
}
|
}
|
||||||
|
@ -236,10 +232,9 @@ static int icp_multi_ao_eoc(struct comedi_device *dev,
|
||||||
struct comedi_insn *insn,
|
struct comedi_insn *insn,
|
||||||
unsigned long context)
|
unsigned long context)
|
||||||
{
|
{
|
||||||
struct icp_multi_private *devpriv = dev->private;
|
|
||||||
unsigned int status;
|
unsigned int status;
|
||||||
|
|
||||||
status = readw(devpriv->io_addr + ICP_MULTI_DAC_CSR);
|
status = readw(dev->mmio + ICP_MULTI_DAC_CSR);
|
||||||
if ((status & DAC_BSY) == 0)
|
if ((status & DAC_BSY) == 0)
|
||||||
return 0;
|
return 0;
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
@ -247,7 +242,8 @@ static int icp_multi_ao_eoc(struct comedi_device *dev,
|
||||||
|
|
||||||
static int icp_multi_insn_write_ao(struct comedi_device *dev,
|
static int icp_multi_insn_write_ao(struct comedi_device *dev,
|
||||||
struct comedi_subdevice *s,
|
struct comedi_subdevice *s,
|
||||||
struct comedi_insn *insn, unsigned int *data)
|
struct comedi_insn *insn,
|
||||||
|
unsigned int *data)
|
||||||
{
|
{
|
||||||
struct icp_multi_private *devpriv = dev->private;
|
struct icp_multi_private *devpriv = dev->private;
|
||||||
int n, chan, range;
|
int n, chan, range;
|
||||||
|
@ -255,11 +251,11 @@ static int icp_multi_insn_write_ao(struct comedi_device *dev,
|
||||||
|
|
||||||
/* Disable D/A conversion ready interrupt */
|
/* Disable D/A conversion ready interrupt */
|
||||||
devpriv->IntEnable &= ~DAC_READY;
|
devpriv->IntEnable &= ~DAC_READY;
|
||||||
writew(devpriv->IntEnable, devpriv->io_addr + ICP_MULTI_INT_EN);
|
writew(devpriv->IntEnable, dev->mmio + ICP_MULTI_INT_EN);
|
||||||
|
|
||||||
/* Clear interrupt status */
|
/* Clear interrupt status */
|
||||||
devpriv->IntStatus |= DAC_READY;
|
devpriv->IntStatus |= DAC_READY;
|
||||||
writew(devpriv->IntStatus, devpriv->io_addr + ICP_MULTI_INT_STAT);
|
writew(devpriv->IntStatus, dev->mmio + ICP_MULTI_INT_STAT);
|
||||||
|
|
||||||
/* Get channel number and range */
|
/* Get channel number and range */
|
||||||
chan = CR_CHAN(insn->chanspec);
|
chan = CR_CHAN(insn->chanspec);
|
||||||
|
@ -274,7 +270,7 @@ static int icp_multi_insn_write_ao(struct comedi_device *dev,
|
||||||
devpriv->DacCmdStatus |= range_codes_analog[range];
|
devpriv->DacCmdStatus |= range_codes_analog[range];
|
||||||
devpriv->DacCmdStatus |= (chan << 8);
|
devpriv->DacCmdStatus |= (chan << 8);
|
||||||
|
|
||||||
writew(devpriv->DacCmdStatus, devpriv->io_addr + ICP_MULTI_DAC_CSR);
|
writew(devpriv->DacCmdStatus, dev->mmio + ICP_MULTI_DAC_CSR);
|
||||||
|
|
||||||
for (n = 0; n < insn->n; n++) {
|
for (n = 0; n < insn->n; n++) {
|
||||||
/* Wait for analogue output data register to be
|
/* Wait for analogue output data register to be
|
||||||
|
@ -284,12 +280,12 @@ static int icp_multi_insn_write_ao(struct comedi_device *dev,
|
||||||
/* Disable interrupt */
|
/* Disable interrupt */
|
||||||
devpriv->IntEnable &= ~DAC_READY;
|
devpriv->IntEnable &= ~DAC_READY;
|
||||||
writew(devpriv->IntEnable,
|
writew(devpriv->IntEnable,
|
||||||
devpriv->io_addr + ICP_MULTI_INT_EN);
|
dev->mmio + ICP_MULTI_INT_EN);
|
||||||
|
|
||||||
/* Clear interrupt status */
|
/* Clear interrupt status */
|
||||||
devpriv->IntStatus |= DAC_READY;
|
devpriv->IntStatus |= DAC_READY;
|
||||||
writew(devpriv->IntStatus,
|
writew(devpriv->IntStatus,
|
||||||
devpriv->io_addr + ICP_MULTI_INT_STAT);
|
dev->mmio + ICP_MULTI_INT_STAT);
|
||||||
|
|
||||||
/* Clear data received */
|
/* Clear data received */
|
||||||
devpriv->ao_data[chan] = 0;
|
devpriv->ao_data[chan] = 0;
|
||||||
|
@ -298,12 +294,11 @@ static int icp_multi_insn_write_ao(struct comedi_device *dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write data to analogue output data register */
|
/* Write data to analogue output data register */
|
||||||
writew(data[n], devpriv->io_addr + ICP_MULTI_AO);
|
writew(data[n], dev->mmio + ICP_MULTI_AO);
|
||||||
|
|
||||||
/* Set DAC_ST bit to write the data to selected channel */
|
/* Set DAC_ST bit to write the data to selected channel */
|
||||||
devpriv->DacCmdStatus |= DAC_ST;
|
devpriv->DacCmdStatus |= DAC_ST;
|
||||||
writew(devpriv->DacCmdStatus,
|
writew(devpriv->DacCmdStatus, dev->mmio + ICP_MULTI_DAC_CSR);
|
||||||
devpriv->io_addr + ICP_MULTI_DAC_CSR);
|
|
||||||
devpriv->DacCmdStatus &= ~DAC_ST;
|
devpriv->DacCmdStatus &= ~DAC_ST;
|
||||||
|
|
||||||
/* Save analogue output data */
|
/* Save analogue output data */
|
||||||
|
@ -332,11 +327,10 @@ static int icp_multi_insn_read_ao(struct comedi_device *dev,
|
||||||
|
|
||||||
static int icp_multi_insn_bits_di(struct comedi_device *dev,
|
static int icp_multi_insn_bits_di(struct comedi_device *dev,
|
||||||
struct comedi_subdevice *s,
|
struct comedi_subdevice *s,
|
||||||
struct comedi_insn *insn, unsigned int *data)
|
struct comedi_insn *insn,
|
||||||
|
unsigned int *data)
|
||||||
{
|
{
|
||||||
struct icp_multi_private *devpriv = dev->private;
|
data[1] = readw(dev->mmio + ICP_MULTI_DI);
|
||||||
|
|
||||||
data[1] = readw(devpriv->io_addr + ICP_MULTI_DI);
|
|
||||||
|
|
||||||
return insn->n;
|
return insn->n;
|
||||||
}
|
}
|
||||||
|
@ -346,12 +340,10 @@ static int icp_multi_insn_bits_do(struct comedi_device *dev,
|
||||||
struct comedi_insn *insn,
|
struct comedi_insn *insn,
|
||||||
unsigned int *data)
|
unsigned int *data)
|
||||||
{
|
{
|
||||||
struct icp_multi_private *devpriv = dev->private;
|
|
||||||
|
|
||||||
if (comedi_dio_update_state(s, data))
|
if (comedi_dio_update_state(s, data))
|
||||||
writew(s->state, devpriv->io_addr + ICP_MULTI_DO);
|
writew(s->state, dev->mmio + ICP_MULTI_DO);
|
||||||
|
|
||||||
data[1] = readw(devpriv->io_addr + ICP_MULTI_DI);
|
data[1] = readw(dev->mmio + ICP_MULTI_DI);
|
||||||
|
|
||||||
return insn->n;
|
return insn->n;
|
||||||
}
|
}
|
||||||
|
@ -374,11 +366,10 @@ static int icp_multi_insn_write_ctr(struct comedi_device *dev,
|
||||||
static irqreturn_t interrupt_service_icp_multi(int irq, void *d)
|
static irqreturn_t interrupt_service_icp_multi(int irq, void *d)
|
||||||
{
|
{
|
||||||
struct comedi_device *dev = d;
|
struct comedi_device *dev = d;
|
||||||
struct icp_multi_private *devpriv = dev->private;
|
|
||||||
int int_no;
|
int int_no;
|
||||||
|
|
||||||
/* Is this interrupt from our board? */
|
/* Is this interrupt from our board? */
|
||||||
int_no = readw(devpriv->io_addr + ICP_MULTI_INT_STAT) & Status_IRQ;
|
int_no = readw(dev->mmio + ICP_MULTI_INT_STAT) & Status_IRQ;
|
||||||
if (!int_no)
|
if (!int_no)
|
||||||
/* No, exit */
|
/* No, exit */
|
||||||
return IRQ_NONE;
|
return IRQ_NONE;
|
||||||
|
@ -448,8 +439,8 @@ static int icp_multi_reset(struct comedi_device *dev)
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
/* Clear INT enables and requests */
|
/* Clear INT enables and requests */
|
||||||
writew(0, devpriv->io_addr + ICP_MULTI_INT_EN);
|
writew(0, dev->mmio + ICP_MULTI_INT_EN);
|
||||||
writew(0x00ff, devpriv->io_addr + ICP_MULTI_INT_STAT);
|
writew(0x00ff, dev->mmio + ICP_MULTI_INT_STAT);
|
||||||
|
|
||||||
/* Set DACs to 0..5V range and 0V output */
|
/* Set DACs to 0..5V range and 0V output */
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
|
@ -459,21 +450,20 @@ static int icp_multi_reset(struct comedi_device *dev)
|
||||||
devpriv->DacCmdStatus |= (i << 8);
|
devpriv->DacCmdStatus |= (i << 8);
|
||||||
|
|
||||||
/* Output 0V */
|
/* Output 0V */
|
||||||
writew(0, devpriv->io_addr + ICP_MULTI_AO);
|
writew(0, dev->mmio + ICP_MULTI_AO);
|
||||||
|
|
||||||
/* Set start conversion bit */
|
/* Set start conversion bit */
|
||||||
devpriv->DacCmdStatus |= DAC_ST;
|
devpriv->DacCmdStatus |= DAC_ST;
|
||||||
|
|
||||||
/* Output to command / status register */
|
/* Output to command / status register */
|
||||||
writew(devpriv->DacCmdStatus,
|
writew(devpriv->DacCmdStatus, dev->mmio + ICP_MULTI_DAC_CSR);
|
||||||
devpriv->io_addr + ICP_MULTI_DAC_CSR);
|
|
||||||
|
|
||||||
/* Delay to allow DAC time to recover */
|
/* Delay to allow DAC time to recover */
|
||||||
udelay(1);
|
udelay(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Digital outputs to 0 */
|
/* Digital outputs to 0 */
|
||||||
writew(0, devpriv->io_addr + ICP_MULTI_DO);
|
writew(0, dev->mmio + ICP_MULTI_DO);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -494,8 +484,8 @@ static int icp_multi_auto_attach(struct comedi_device *dev,
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
devpriv->io_addr = pci_ioremap_bar(pcidev, 2);
|
dev->mmio = pci_ioremap_bar(pcidev, 2);
|
||||||
if (!devpriv->io_addr)
|
if (!dev->mmio)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
ret = comedi_alloc_subdevices(dev, 5);
|
ret = comedi_alloc_subdevices(dev, 5);
|
||||||
|
@ -573,8 +563,8 @@ static void icp_multi_detach(struct comedi_device *dev)
|
||||||
icp_multi_reset(dev);
|
icp_multi_reset(dev);
|
||||||
if (dev->irq)
|
if (dev->irq)
|
||||||
free_irq(dev->irq, dev);
|
free_irq(dev->irq, dev);
|
||||||
if (devpriv && devpriv->io_addr)
|
if (dev->mmio)
|
||||||
iounmap(devpriv->io_addr);
|
iounmap(dev->mmio);
|
||||||
comedi_pci_disable(dev);
|
comedi_pci_disable(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue