mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-18 20:04:16 +08:00
e72e8bf1c9
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>
114 lines
3.1 KiB
C
114 lines
3.1 KiB
C
/*
|
|
* Architecture specific parts of the Floppy driver
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
* for more details.
|
|
*
|
|
* Copyright (C) 1995
|
|
*/
|
|
#ifndef __ASM_ALPHA_FLOPPY_H
|
|
#define __ASM_ALPHA_FLOPPY_H
|
|
|
|
|
|
#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)
|
|
#define fd_request_dma() request_dma(FLOPPY_DMA,"floppy")
|
|
#define fd_free_dma() free_dma(FLOPPY_DMA)
|
|
#define fd_clear_dma_ff() clear_dma_ff(FLOPPY_DMA)
|
|
#define fd_set_dma_mode(mode) set_dma_mode(FLOPPY_DMA,mode)
|
|
#define fd_set_dma_addr(addr) set_dma_addr(FLOPPY_DMA,virt_to_bus(addr))
|
|
#define fd_set_dma_count(count) set_dma_count(FLOPPY_DMA,count)
|
|
#define fd_enable_irq() enable_irq(FLOPPY_IRQ)
|
|
#define fd_disable_irq() disable_irq(FLOPPY_IRQ)
|
|
#define fd_request_irq() request_irq(FLOPPY_IRQ, floppy_interrupt,\
|
|
0, "floppy", NULL)
|
|
#define fd_free_irq() free_irq(FLOPPY_IRQ, NULL)
|
|
|
|
#ifdef CONFIG_PCI
|
|
|
|
#include <linux/pci.h>
|
|
|
|
#define fd_dma_setup(addr,size,mode,io) alpha_fd_dma_setup(addr,size,mode,io)
|
|
|
|
static __inline__ int
|
|
alpha_fd_dma_setup(char *addr, unsigned long size, int mode, int io)
|
|
{
|
|
static unsigned long prev_size;
|
|
static dma_addr_t bus_addr = 0;
|
|
static char *prev_addr;
|
|
static int prev_dir;
|
|
int dir;
|
|
|
|
dir = (mode != DMA_MODE_READ) ? PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE;
|
|
|
|
if (bus_addr
|
|
&& (addr != prev_addr || size != prev_size || dir != prev_dir)) {
|
|
/* different from last time -- unmap prev */
|
|
pci_unmap_single(isa_bridge, bus_addr, prev_size, prev_dir);
|
|
bus_addr = 0;
|
|
}
|
|
|
|
if (!bus_addr) /* need to map it */
|
|
bus_addr = pci_map_single(isa_bridge, addr, size, dir);
|
|
|
|
/* remember this one as prev */
|
|
prev_addr = addr;
|
|
prev_size = size;
|
|
prev_dir = dir;
|
|
|
|
fd_clear_dma_ff();
|
|
fd_set_dma_mode(mode);
|
|
set_dma_addr(FLOPPY_DMA, bus_addr);
|
|
fd_set_dma_count(size);
|
|
virtual_dma_port = io;
|
|
fd_enable_dma();
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif /* CONFIG_PCI */
|
|
|
|
__inline__ void virtual_dma_init(void)
|
|
{
|
|
/* Nothing to do on an Alpha */
|
|
}
|
|
|
|
static int FDC1 = 0x3f0;
|
|
static int FDC2 = -1;
|
|
|
|
/*
|
|
* Again, the CMOS information doesn't work on the alpha..
|
|
*/
|
|
#define FLOPPY0_TYPE 6
|
|
#define FLOPPY1_TYPE 0
|
|
|
|
#define N_FDC 2
|
|
#define N_DRIVE 8
|
|
|
|
/*
|
|
* Most Alphas have no problems with floppy DMA crossing 64k borders,
|
|
* except for certain ones, like XL and RUFFIAN.
|
|
*
|
|
* However, the test is simple and fast, and this *is* floppy, after all,
|
|
* so we do it for all platforms, just to make sure.
|
|
*
|
|
* This is advantageous in other circumstances as well, as in moving
|
|
* about the PCI DMA windows and forcing the floppy to start doing
|
|
* scatter-gather when it never had before, and there *is* a problem
|
|
* on that platform... ;-}
|
|
*/
|
|
|
|
static inline unsigned long CROSS_64KB(void *a, unsigned long s)
|
|
{
|
|
unsigned long p = (unsigned long)a;
|
|
return ((p + s - 1) ^ p) & ~0xffffUL;
|
|
}
|
|
|
|
#define EXTRA_FLOPPY_PARAMS
|
|
|
|
#endif /* __ASM_ALPHA_FLOPPY_H */
|