floppy: split the base port from the register in I/O accesses
Currently we have architecture-specific fd_inb() and fd_outb() functions or macros, taking just a port which is in fact made of a base address and a register. The base address is FDC-specific and derived from the local or global "fdc" variable through the FD_IOPORT macro used in the base address calculation. This change splits this by explicitly passing the FDC's base address and the register separately to fd_outb() and fd_inb(). It affects the following archs: - x86, alpha, mips, powerpc, parisc, arm, m68k: simple remap of port -> base+reg - sparc32: use of reg only, since the base address was already masked out and the FDC controller is known from a static struct. - sparc64: like x86 for PCI, like sparc32 for 82077 Some archs use inline functions and others macros. This was not unified in order to minimize the number of changes to review. For the same reason checkpatch still spews a few warnings about things that were already there before. The parisc still uses hard-coded register values and could be cleaned up by taking the register definitions. The sparc per-controller inb/outb functions could further be refined to explicitly take an FDC register instead of a port in argument but it was not needed yet and may be cleaned later. Link: https://lore.kernel.org/r/20200331094054.24441-2-w@1wt.eu Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru> Cc: Richard Henderson <rth@twiddle.net> Cc: Matt Turner <mattst88@gmail.com> Cc: Ian Molton <spyro@f2s.com> Cc: Russell King <linux@armlinux.org.uk> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de> Cc: Helge Deller <deller@gmx.de> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: "David S. Miller" <davem@davemloft.net> Cc: x86@kernel.org Signed-off-by: Willy Tarreau <w@1wt.eu> Signed-off-by: Denis Efremov <efremov@linux.com>
This commit is contained in:
parent
92decf118f
commit
e72e8bf1c9
|
@ -11,8 +11,8 @@
|
|||
#define __ASM_ALPHA_FLOPPY_H
|
||||
|
||||
|
||||
#define fd_inb(port) inb_p(port)
|
||||
#define fd_outb(value,port) outb_p(value,port)
|
||||
#define fd_inb(base, reg) inb_p((base) + (reg))
|
||||
#define fd_outb(value, base, reg) outb_p(value, (base) + (reg))
|
||||
|
||||
#define fd_enable_dma() enable_dma(FLOPPY_DMA)
|
||||
#define fd_disable_dma() disable_dma(FLOPPY_DMA)
|
||||
|
|
|
@ -9,20 +9,20 @@
|
|||
#ifndef __ASM_ARM_FLOPPY_H
|
||||
#define __ASM_ARM_FLOPPY_H
|
||||
|
||||
#define fd_outb(val,port) \
|
||||
#define fd_outb(val, base, reg) \
|
||||
do { \
|
||||
int new_val = (val); \
|
||||
if (((port) & 7) == FD_DOR) { \
|
||||
if ((reg) == FD_DOR) { \
|
||||
if (new_val & 0xf0) \
|
||||
new_val = (new_val & 0x0c) | \
|
||||
floppy_selects[new_val & 3]; \
|
||||
else \
|
||||
new_val &= 0x0c; \
|
||||
} \
|
||||
outb(new_val, (port)); \
|
||||
outb(new_val, (base) + (reg)); \
|
||||
} while(0)
|
||||
|
||||
#define fd_inb(port) inb((port))
|
||||
#define fd_inb(base, reg) inb((base) + (reg))
|
||||
#define fd_request_irq() request_irq(IRQ_FLOPPYDISK,floppy_interrupt,\
|
||||
0,"floppy",NULL)
|
||||
#define fd_free_irq() free_irq(IRQ_FLOPPYDISK,NULL)
|
||||
|
|
|
@ -63,21 +63,21 @@ static __inline__ void release_dma_lock(unsigned long flags)
|
|||
}
|
||||
|
||||
|
||||
static __inline__ unsigned char fd_inb(int port)
|
||||
static __inline__ unsigned char fd_inb(int base, int reg)
|
||||
{
|
||||
if(MACH_IS_Q40)
|
||||
return inb_p(port);
|
||||
return inb_p(base + reg);
|
||||
else if(MACH_IS_SUN3X)
|
||||
return sun3x_82072_fd_inb(port);
|
||||
return sun3x_82072_fd_inb(base + reg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __inline__ void fd_outb(unsigned char value, int port)
|
||||
static __inline__ void fd_outb(unsigned char value, int base, int reg)
|
||||
{
|
||||
if(MACH_IS_Q40)
|
||||
outb_p(value, port);
|
||||
outb_p(value, base + reg);
|
||||
else if(MACH_IS_SUN3X)
|
||||
sun3x_82072_fd_outb(value, port);
|
||||
sun3x_82072_fd_outb(value, base + reg);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -26,14 +26,14 @@
|
|||
/*
|
||||
* How to access the FDC's registers.
|
||||
*/
|
||||
static inline unsigned char fd_inb(unsigned int port)
|
||||
static inline unsigned char fd_inb(unsigned int base, unsigned int reg)
|
||||
{
|
||||
return inb_p(port);
|
||||
return inb_p(base + reg);
|
||||
}
|
||||
|
||||
static inline void fd_outb(unsigned char value, unsigned int port)
|
||||
static inline void fd_outb(unsigned char value, unsigned int base, unsigned int reg)
|
||||
{
|
||||
outb_p(value, port);
|
||||
outb_p(value, base + reg);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -17,19 +17,19 @@
|
|||
#include <asm/jazzdma.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
||||
static inline unsigned char fd_inb(unsigned int port)
|
||||
static inline unsigned char fd_inb(unsigned int base, unsigned int reg)
|
||||
{
|
||||
unsigned char c;
|
||||
|
||||
c = *(volatile unsigned char *) port;
|
||||
c = *(volatile unsigned char *) (base + reg);
|
||||
udelay(1);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
static inline void fd_outb(unsigned char value, unsigned int port)
|
||||
static inline void fd_outb(unsigned char value, unsigned int base, unsigned int reg)
|
||||
{
|
||||
*(volatile unsigned char *) port = value;
|
||||
*(volatile unsigned char *) (base + reg) = value;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -29,8 +29,8 @@
|
|||
#define CSW fd_routine[can_use_virtual_dma & 1]
|
||||
|
||||
|
||||
#define fd_inb(port) readb(port)
|
||||
#define fd_outb(value, port) writeb(value, port)
|
||||
#define fd_inb(base, reg) readb((base) + (reg))
|
||||
#define fd_outb(value, base, reg) writeb(value, (base) + (reg))
|
||||
|
||||
#define fd_request_dma() CSW._request_dma(FLOPPY_DMA,"floppy")
|
||||
#define fd_free_dma() CSW._free_dma(FLOPPY_DMA)
|
||||
|
@ -75,19 +75,19 @@ static void floppy_hardint(int irq, void *dev_id, struct pt_regs * regs)
|
|||
register char *lptr = virtual_dma_addr;
|
||||
|
||||
for (lcount = virtual_dma_count; lcount; lcount--) {
|
||||
st = fd_inb(virtual_dma_port+4) & 0xa0 ;
|
||||
st = fd_inb(virtual_dma_port, 4) & 0xa0;
|
||||
if (st != 0xa0)
|
||||
break;
|
||||
if (virtual_dma_mode) {
|
||||
fd_outb(*lptr, virtual_dma_port+5);
|
||||
fd_outb(*lptr, virtual_dma_port, 5);
|
||||
} else {
|
||||
*lptr = fd_inb(virtual_dma_port+5);
|
||||
*lptr = fd_inb(virtual_dma_port, 5);
|
||||
}
|
||||
lptr++;
|
||||
}
|
||||
virtual_dma_count = lcount;
|
||||
virtual_dma_addr = lptr;
|
||||
st = fd_inb(virtual_dma_port+4);
|
||||
st = fd_inb(virtual_dma_port, 4);
|
||||
}
|
||||
|
||||
#ifdef TRACE_FLPY_INT
|
||||
|
|
|
@ -13,8 +13,8 @@
|
|||
|
||||
#include <asm/machdep.h>
|
||||
|
||||
#define fd_inb(port) inb_p(port)
|
||||
#define fd_outb(value,port) outb_p(value,port)
|
||||
#define fd_inb(base, reg) inb_p((base) + (reg))
|
||||
#define fd_outb(value, base, reg) outb_p(value, (base) + (reg))
|
||||
|
||||
#define fd_enable_dma() enable_dma(FLOPPY_DMA)
|
||||
#define fd_disable_dma() fd_ops->_disable_dma(FLOPPY_DMA)
|
||||
|
|
|
@ -59,8 +59,8 @@ struct sun_floppy_ops {
|
|||
|
||||
static struct sun_floppy_ops sun_fdops;
|
||||
|
||||
#define fd_inb(port) sun_fdops.fd_inb(port)
|
||||
#define fd_outb(value,port) sun_fdops.fd_outb(value,port)
|
||||
#define fd_inb(base, reg) sun_fdops.fd_inb(reg)
|
||||
#define fd_outb(value, base, reg) sun_fdops.fd_outb(value, reg)
|
||||
#define fd_enable_dma() sun_fd_enable_dma()
|
||||
#define fd_disable_dma() sun_fd_disable_dma()
|
||||
#define fd_request_dma() (0) /* nothing... */
|
||||
|
|
|
@ -62,8 +62,8 @@ struct sun_floppy_ops {
|
|||
|
||||
static struct sun_floppy_ops sun_fdops;
|
||||
|
||||
#define fd_inb(port) sun_fdops.fd_inb(port)
|
||||
#define fd_outb(value,port) sun_fdops.fd_outb(value,port)
|
||||
#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... */
|
||||
|
|
|
@ -31,8 +31,8 @@
|
|||
#define CSW fd_routine[can_use_virtual_dma & 1]
|
||||
|
||||
|
||||
#define fd_inb(port) inb_p(port)
|
||||
#define fd_outb(value, port) outb_p(value, port)
|
||||
#define fd_inb(base, reg) inb_p((base) + (reg))
|
||||
#define fd_outb(value, base, reg) outb_p(value, (base) + (reg))
|
||||
|
||||
#define fd_request_dma() CSW._request_dma(FLOPPY_DMA, "floppy")
|
||||
#define fd_free_dma() CSW._free_dma(FLOPPY_DMA)
|
||||
|
|
|
@ -595,12 +595,12 @@ static unsigned char in_sector_offset; /* offset within physical sector,
|
|||
|
||||
static inline unsigned char fdc_inb(int fdc, int reg)
|
||||
{
|
||||
return fd_inb(fdc_state[fdc].address + reg);
|
||||
return fd_inb(fdc_state[fdc].address, reg);
|
||||
}
|
||||
|
||||
static inline void fdc_outb(unsigned char value, int fdc, int reg)
|
||||
{
|
||||
fd_outb(value, fdc_state[fdc].address + reg);
|
||||
fd_outb(value, fdc_state[fdc].address, reg);
|
||||
}
|
||||
|
||||
static inline bool drive_no_geom(int drive)
|
||||
|
|
Loading…
Reference in New Issue