floppy: use symbolic register names in the sparc64 port
authorWilly Tarreau <w@1wt.eu>
Tue, 31 Mar 2020 09:40:38 +0000 (11:40 +0200)
committerDenis Efremov <efremov@linux.com>
Tue, 12 May 2020 16:34:53 +0000 (19:34 +0300)
Now by splitting the base address from the register index we can
use the symbolic register names instead of the hard-coded numeric
values.

Link: https://lore.kernel.org/r/20200331094054.24441-8-w@1wt.eu
Cc: "David S. Miller" <davem@davemloft.net>
[willy: fix printk warnings s/%lx/%x/g in sun_82077_fd_{inb,outb}()]
Signed-off-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: Denis Efremov <efremov@linux.com>
arch/sparc/include/asm/floppy_64.h

index c0cf157..070c8c1 100644 (file)
@@ -47,8 +47,9 @@ unsigned long fdc_status;
 static struct platform_device *floppy_op = NULL;
 
 struct sun_floppy_ops {
-       unsigned char   (*fd_inb) (unsigned long port);
-       void            (*fd_outb) (unsigned char value, unsigned long port);
+       unsigned char   (*fd_inb) (unsigned long port, unsigned int reg);
+       void            (*fd_outb) (unsigned char value, unsigned long base,
+                                   unsigned int reg);
        void            (*fd_enable_dma) (void);
        void            (*fd_disable_dma) (void);
        void            (*fd_set_dma_mode) (int);
@@ -62,8 +63,8 @@ struct sun_floppy_ops {
 
 static struct sun_floppy_ops sun_fdops;
 
-#define fd_inb(base, reg)         sun_fdops.fd_inb((base) + (reg))
-#define fd_outb(value, base, reg) sun_fdops.fd_outb(value, (base) + (reg))
+#define fd_inb(base, reg)         sun_fdops.fd_inb(base, reg)
+#define fd_outb(value, base, reg) sun_fdops.fd_outb(value, base, reg)
 #define fd_enable_dma()           sun_fdops.fd_enable_dma()
 #define fd_disable_dma()          sun_fdops.fd_disable_dma()
 #define fd_request_dma()          (0) /* nothing... */
@@ -97,42 +98,43 @@ static int sun_floppy_types[2] = { 0, 0 };
 /* No 64k boundary crossing problems on the Sparc. */
 #define CROSS_64KB(a,s) (0)
 
-static unsigned char sun_82077_fd_inb(unsigned long port)
+static unsigned char sun_82077_fd_inb(unsigned long base, unsigned int reg)
 {
        udelay(5);
-       switch(port & 7) {
+       switch (reg) {
        default:
-               printk("floppy: Asked to read unknown port %lx\n", port);
+               printk("floppy: Asked to read unknown port %x\n", reg);
                panic("floppy: Port bolixed.");
-       case 4: /* FD_STATUS */
+       case FD_STATUS:
                return sbus_readb(&sun_fdc->status_82077) & ~STATUS_DMA;
-       case 5: /* FD_DATA */
+       case FD_DATA:
                return sbus_readb(&sun_fdc->data_82077);
-       case 7: /* FD_DIR */
+       case FD_DIR:
                /* XXX: Is DCL on 0x80 in sun4m? */
                return sbus_readb(&sun_fdc->dir_82077);
        }
        panic("sun_82072_fd_inb: How did I get here?");
 }
 
-static void sun_82077_fd_outb(unsigned char value, unsigned long port)
+static void sun_82077_fd_outb(unsigned char value, unsigned long base,
+                             unsigned int reg)
 {
        udelay(5);
-       switch(port & 7) {
+       switch (reg) {
        default:
-               printk("floppy: Asked to write to unknown port %lx\n", port);
+               printk("floppy: Asked to write to unknown port %x\n", reg);
                panic("floppy: Port bolixed.");
-       case 2: /* FD_DOR */
+       case FD_DOR:
                /* Happily, the 82077 has a real DOR register. */
                sbus_writeb(value, &sun_fdc->dor_82077);
                break;
-       case 5: /* FD_DATA */
+       case FD_DATA:
                sbus_writeb(value, &sun_fdc->data_82077);
                break;
-       case 7: /* FD_DCR */
+       case FD_DCR:
                sbus_writeb(value, &sun_fdc->dcr_82077);
                break;
-       case 4: /* FD_STATUS */
+       case FD_DSR:
                sbus_writeb(value, &sun_fdc->status_82077);
                break;
        }
@@ -298,19 +300,21 @@ static struct sun_pci_dma_op sun_pci_dma_pending = { -1U, 0, 0, NULL};
 
 irqreturn_t floppy_interrupt(int irq, void *dev_id);
 
-static unsigned char sun_pci_fd_inb(unsigned long port)
+static unsigned char sun_pci_fd_inb(unsigned long base, unsigned int reg)
 {
        udelay(5);
-       return inb(port);
+       return inb(base + reg);
 }
 
-static void sun_pci_fd_outb(unsigned char val, unsigned long port)
+static void sun_pci_fd_outb(unsigned char val, unsigned long base,
+                           unsigned int reg)
 {
        udelay(5);
-       outb(val, port);
+       outb(val, base + reg);
 }
 
-static void sun_pci_fd_broken_outb(unsigned char val, unsigned long port)
+static void sun_pci_fd_broken_outb(unsigned char val, unsigned long base,
+                                  unsigned int reg)
 {
        udelay(5);
        /*
@@ -320,16 +324,17 @@ static void sun_pci_fd_broken_outb(unsigned char val, unsigned long port)
         *      this does not hurt correct hardware like the AXmp.
         *      (Eddie, Sep 12 1998).
         */
-       if (port == ((unsigned long)sun_fdc) + 2) {
+       if (reg == FD_DOR) {
                if (((val & 0x03) == sun_pci_broken_drive) && (val & 0x20)) {
                        val |= 0x10;
                }
        }
-       outb(val, port);
+       outb(val, base + reg);
 }
 
 #ifdef PCI_FDC_SWAP_DRIVES
-static void sun_pci_fd_lde_broken_outb(unsigned char val, unsigned long port)
+static void sun_pci_fd_lde_broken_outb(unsigned char val, unsigned long base,
+                                      unsigned int reg)
 {
        udelay(5);
        /*
@@ -339,13 +344,13 @@ static void sun_pci_fd_lde_broken_outb(unsigned char val, unsigned long port)
         *      this does not hurt correct hardware like the AXmp.
         *      (Eddie, Sep 12 1998).
         */
-       if (port == ((unsigned long)sun_fdc) + 2) {
+       if (reg == FD_DOR) {
                if (((val & 0x03) == sun_pci_broken_drive) && (val & 0x10)) {
                        val &= ~(0x03);
                        val |= 0x21;
                }
        }
-       outb(val, port);
+       outb(val, base + reg);
 }
 #endif /* PCI_FDC_SWAP_DRIVES */