staging: comedi: ni_stc.h: add read/write callbacks to struct ni_private
[cascardo/linux.git] / drivers / staging / comedi / drivers / ni_atmio.c
index d039352..ae9ace9 100644 (file)
@@ -107,8 +107,6 @@ are not supported.
 
 #define NI_SIZE 0x20
 
-#define MAX_N_CALDACS 32
-
 static const struct ni_board_struct ni_boards[] = {
        {.device_id = 44,
         .isapnp_id = 0x0000,   /* XXX unknown */
@@ -272,20 +270,37 @@ static const int ni_irqpin[] = {
 
 #define NI_E_IRQ_FLAGS         0
 
-struct ni_private {
-       struct pnp_dev *isapnp_dev;
-       NI_PRIVATE_COMMON
+/* How we access registers */
 
-};
+static uint8_t ni_atmio_inb(struct comedi_device *dev, int reg)
+{
+       return inb(dev->iobase + reg);
+}
 
-/* How we access registers */
+static uint16_t ni_atmio_inw(struct comedi_device *dev, int reg)
+{
+       return inw(dev->iobase + reg);
+}
+
+static uint32_t ni_atmio_inl(struct comedi_device *dev, int reg)
+{
+       return inl(dev->iobase + reg);
+}
 
-#define ni_writel(a, b)                (outl((a), (b)+dev->iobase))
-#define ni_readl(a)            (inl((a)+dev->iobase))
-#define ni_writew(a, b)                (outw((a), (b)+dev->iobase))
-#define ni_readw(a)            (inw((a)+dev->iobase))
-#define ni_writeb(a, b)                (outb((a), (b)+dev->iobase))
-#define ni_readb(a)            (inb((a)+dev->iobase))
+static void ni_atmio_outb(struct comedi_device *dev, uint8_t val, int reg)
+{
+       outb(val, dev->iobase + reg);
+}
+
+static void ni_atmio_outw(struct comedi_device *dev, uint16_t val, int reg)
+{
+       outw(val, dev->iobase + reg);
+}
+
+static void ni_atmio_outl(struct comedi_device *dev, uint32_t val, int reg)
+{
+       outl(val, dev->iobase + reg);
+}
 
 /* How we access windowed registers */
 
@@ -300,10 +315,10 @@ static void ni_atmio_win_out(struct comedi_device *dev, uint16_t data, int addr)
 
        spin_lock_irqsave(&devpriv->window_lock, flags);
        if ((addr) < 8) {
-               ni_writew(data, addr * 2);
+               devpriv->writew(dev, data, addr * 2);
        } else {
-               ni_writew(addr, Window_Address);
-               ni_writew(data, Window_Data);
+               devpriv->writew(dev, addr, Window_Address);
+               devpriv->writew(dev, data, Window_Data);
        }
        spin_unlock_irqrestore(&devpriv->window_lock, flags);
 }
@@ -316,10 +331,10 @@ static uint16_t ni_atmio_win_in(struct comedi_device *dev, int addr)
 
        spin_lock_irqsave(&devpriv->window_lock, flags);
        if (addr < 8) {
-               ret = ni_readw(addr * 2);
+               ret = devpriv->readw(dev, addr * 2);
        } else {
-               ni_writew(addr, Window_Address);
-               ret = ni_readw(Window_Data);
+               devpriv->writew(dev, addr, Window_Address);
+               ret = devpriv->readw(dev, Window_Data);
        }
        spin_unlock_irqrestore(&devpriv->window_lock, flags);
 
@@ -413,10 +428,17 @@ static int ni_atmio_attach(struct comedi_device *dev,
                return ret;
        devpriv = dev->private;
 
-       devpriv->stc_writew = &ni_atmio_win_out;
-       devpriv->stc_readw = &ni_atmio_win_in;
-       devpriv->stc_writel = &win_out2;
-       devpriv->stc_readl = &win_in2;
+       devpriv->readb          = ni_atmio_inb;
+       devpriv->readw          = ni_atmio_inw;
+       devpriv->readl          = ni_atmio_inl;
+       devpriv->writeb         = ni_atmio_outb;
+       devpriv->writew         = ni_atmio_outw;
+       devpriv->writel         = ni_atmio_outl;
+
+       devpriv->stc_writew     = ni_atmio_win_out;
+       devpriv->stc_readw      = ni_atmio_win_in;
+       devpriv->stc_writel     = win_out2;
+       devpriv->stc_readl      = win_in2;
 
        iobase = it->options[0];
        irq = it->options[1];
@@ -428,7 +450,7 @@ static int ni_atmio_attach(struct comedi_device *dev,
 
                iobase = pnp_port_start(isapnp_dev, 0);
                irq = pnp_irq(isapnp_dev, 0);
-               devpriv->isapnp_dev = isapnp_dev;
+               comedi_set_hw_dev(dev, &isapnp_dev->dev);
        }
 
        ret = comedi_request_region(dev, iobase, NI_SIZE);
@@ -477,12 +499,14 @@ static int ni_atmio_attach(struct comedi_device *dev,
 
 static void ni_atmio_detach(struct comedi_device *dev)
 {
-       struct ni_private *devpriv = dev->private;
+       struct pnp_dev *isapnp_dev;
 
        mio_common_detach(dev);
        comedi_legacy_detach(dev);
-       if (devpriv->isapnp_dev)
-               pnp_device_detach(devpriv->isapnp_dev);
+
+       isapnp_dev = dev->hw_dev ? to_pnp_dev(dev->hw_dev) : NULL;
+       if (isapnp_dev)
+               pnp_device_detach(isapnp_dev);
 }
 
 static struct comedi_driver ni_atmio_driver = {