staging: comedi: daqboard2000: use macros from "plx9080.h"
authorIan Abbott <abbotti@mev.co.uk>
Wed, 4 Jan 2017 10:55:34 +0000 (10:55 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 10 Jan 2017 16:38:32 +0000 (17:38 +0100)
The Daqboard/2000 uses a PLX PCI-9080 chip to interface with the PCI
bus.  The "daqboard2000" driver uses the PCI-9080 "CNTRL" register to
perform various tasks, but defines its own macros for the register
values.  Use the macros from "plx9080.h" instead.  The various functions
that change the CNTRL register just wiggle individual bits up and down,
but they ignore the current register value - the old macros defined the
full value to be written to the register.  Change them to read and
modify the register value.

Also remove a read of the CNTRL register in `daqboard2000_auto_attach()`
where the value is just thrown away, as it seems to serve no purpose
there (such as flushing PCI writes).

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Reviewed-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/daqboard2000.c

index 0f4eb954aa80fcbef0f7e4f5a9be4a4e46dd03f6..b23a9feb975c0cfaa602cad3974e700fec590ca4 100644 (file)
 #include "../comedi_pci.h"
 
 #include "8255.h"
+#include "plx9080.h"
 
 #define DAQBOARD2000_FIRMWARE          "daqboard2000_firmware.bin"
 
 #define DAQBOARD2000_SUBSYSTEM_IDS2    0x0002  /* Daqboard/2000 - 2 Dacs */
 #define DAQBOARD2000_SUBSYSTEM_IDS4    0x0004  /* Daqboard/2000 - 4 Dacs */
 
-/* Initialization bits for the Serial EEPROM Control Register */
-#define DB2K_SECR_PROG_PIN_HI          0x8001767e
-#define DB2K_SECR_PROG_PIN_LO          0x8000767e
-#define DB2K_SECR_LOCAL_BUS_HI         0xc000767e
-#define DB2K_SECR_LOCAL_BUS_LO         0x8000767e
-#define DB2K_SECR_RELOAD_HI            0xa000767e
-#define DB2K_SECR_RELOAD_LO            0x8000767e
-
-/* SECR status bits */
-#define DAQBOARD2000_EEPROM_PRESENT     0x10000000
-
 /* CPLD status bits */
 #define DAQBOARD2000_CPLD_INIT         0x0002
 #define DAQBOARD2000_CPLD_DONE         0x0004
@@ -434,32 +424,45 @@ static int daqboard2000_ao_insn_write(struct comedi_device *dev,
 static void daqboard2000_reset_local_bus(struct comedi_device *dev)
 {
        struct daqboard2000_private *devpriv = dev->private;
+       u32 cntrl;
 
-       writel(DB2K_SECR_LOCAL_BUS_HI, devpriv->plx + 0x6c);
+       cntrl = readl(devpriv->plx + PLX_REG_CNTRL);
+       cntrl |= PLX_CNTRL_RESET;
+       writel(cntrl, devpriv->plx + PLX_REG_CNTRL);
        mdelay(10);
-       writel(DB2K_SECR_LOCAL_BUS_LO, devpriv->plx + 0x6c);
+       cntrl &= ~PLX_CNTRL_RESET;
+       writel(cntrl, devpriv->plx + PLX_REG_CNTRL);
        mdelay(10);
 }
 
 static void daqboard2000_reload_plx(struct comedi_device *dev)
 {
        struct daqboard2000_private *devpriv = dev->private;
+       u32 cntrl;
 
-       writel(DB2K_SECR_RELOAD_LO, devpriv->plx + 0x6c);
+       cntrl = readl(devpriv->plx + PLX_REG_CNTRL);
+       cntrl &= ~PLX_CNTRL_EERELOAD;
+       writel(cntrl, devpriv->plx + PLX_REG_CNTRL);
        mdelay(10);
-       writel(DB2K_SECR_RELOAD_HI, devpriv->plx + 0x6c);
+       cntrl |= PLX_CNTRL_EERELOAD;
+       writel(cntrl, devpriv->plx + PLX_REG_CNTRL);
        mdelay(10);
-       writel(DB2K_SECR_RELOAD_LO, devpriv->plx + 0x6c);
+       cntrl &= ~PLX_CNTRL_EERELOAD;
+       writel(cntrl, devpriv->plx + PLX_REG_CNTRL);
        mdelay(10);
 }
 
 static void daqboard2000_pulse_prog_pin(struct comedi_device *dev)
 {
        struct daqboard2000_private *devpriv = dev->private;
+       u32 cntrl;
 
-       writel(DB2K_SECR_PROG_PIN_HI, devpriv->plx + 0x6c);
+       cntrl = readl(devpriv->plx + PLX_REG_CNTRL);
+       cntrl |= PLX_CNTRL_USERO;
+       writel(cntrl, devpriv->plx + PLX_REG_CNTRL);
        mdelay(10);
-       writel(DB2K_SECR_PROG_PIN_LO, devpriv->plx + 0x6c);
+       cntrl &= ~PLX_CNTRL_USERO;
+       writel(cntrl, devpriv->plx + PLX_REG_CNTRL);
        mdelay(10);     /* Not in the original code, but I like symmetry... */
 }
 
@@ -501,14 +504,13 @@ static int daqboard2000_load_firmware(struct comedi_device *dev,
 {
        struct daqboard2000_private *devpriv = dev->private;
        int result = -EIO;
-       /* Read the serial EEPROM control register */
-       int secr;
+       u32 cntrl;
        int retry;
        size_t i;
 
        /* Check to make sure the serial eeprom is present on the board */
-       secr = readl(devpriv->plx + 0x6c);
-       if (!(secr & DAQBOARD2000_EEPROM_PRESENT))
+       cntrl = readl(devpriv->plx + PLX_REG_CNTRL);
+       if (!(cntrl & PLX_CNTRL_EEPRESENT))
                return -EIO;
 
        for (retry = 0; retry < 3; retry++) {
@@ -677,8 +679,6 @@ static int daqboard2000_auto_attach(struct comedi_device *dev,
        if (result)
                return result;
 
-       readl(devpriv->plx + 0x6c);
-
        result = comedi_load_firmware(dev, &comedi_to_pci_dev(dev)->dev,
                                      DAQBOARD2000_FIRMWARE,
                                      daqboard2000_load_firmware, 0);