forked from luck/tmp_suning_uos_patched
49148020bc
Merge header files for m68k and m68knommu to the single location: arch/m68k/include/asm The majority of this patch was the result of the script that is included in the changelog below. The script was originally written by Arnd Bergman and exten by me to cover a few more files. When the header files differed the script uses the following: The original m68k file is named <file>_mm.h [mm for memory manager] The m68knommu file is named <file>_no.h [no for no memory manager] The files uses the following include guard: This include gaurd works as the m68knommu toolchain set the __uClinux__ symbol - so this should work in userspace too. Merging the header files for m68k and m68knommu exposes the (unexpected?) ABI differences thus it is easier to actually identify these and thus to fix them. The commit has been build tested with both a m68k and a m68knommu toolchain - with success. The commit has also been tested with "make headers_check" and this patch fixes make headers_check for m68knommu. The script used: TARGET=arch/m68k/include/asm SOURCE=arch/m68knommu/include/asm INCLUDE="cachectl.h errno.h fcntl.h hwtest.h ioctls.h ipcbuf.h \ linkage.h math-emu.h md.h mman.h movs.h msgbuf.h openprom.h \ oplib.h poll.h posix_types.h resource.h rtc.h sembuf.h shmbuf.h \ shm.h shmparam.h socket.h sockios.h spinlock.h statfs.h stat.h \ termbits.h termios.h tlb.h types.h user.h" EQUAL="auxvec.h cputime.h device.h emergency-restart.h futex.h \ ioctl.h irq_regs.h kdebug.h local.h mutex.h percpu.h \ sections.h topology.h" NOMUUFILES="anchor.h bootstd.h coldfire.h commproc.h dbg.h \ elia.h flat.h m5206sim.h m520xsim.h m523xsim.h m5249sim.h \ m5272sim.h m527xsim.h m528xsim.h m5307sim.h m532xsim.h \ m5407sim.h m68360_enet.h m68360.h m68360_pram.h m68360_quicc.h \ m68360_regs.h MC68328.h MC68332.h MC68EZ328.h MC68VZ328.h \ mcfcache.h mcfdma.h mcfmbus.h mcfne.h mcfpci.h mcfpit.h \ mcfsim.h mcfsmc.h mcftimer.h mcfuart.h mcfwdebug.h \ nettel.h quicc_simple.h smp.h" FILES="atomic.h bitops.h bootinfo.h bug.h bugs.h byteorder.h cache.h \ cacheflush.h checksum.h current.h delay.h div64.h \ dma-mapping.h dma.h elf.h entry.h fb.h fpu.h hardirq.h hw_irq.h io.h \ irq.h kmap_types.h machdep.h mc146818rtc.h mmu.h mmu_context.h \ module.h page.h page_offset.h param.h pci.h pgalloc.h \ pgtable.h processor.h ptrace.h scatterlist.h segment.h \ setup.h sigcontext.h siginfo.h signal.h string.h system.h swab.h \ thread_info.h timex.h tlbflush.h traps.h uaccess.h ucontext.h \ unaligned.h unistd.h" mergefile() { BASE=${1%.h} git mv ${SOURCE}/$1 ${TARGET}/${BASE}_no.h git mv ${TARGET}/$1 ${TARGET}/${BASE}_mm.h cat << EOF > ${TARGET}/$1 EOF git add ${TARGET}/$1 } set -e mkdir -p ${TARGET} git mv include/asm-m68k/* ${TARGET} rmdir include/asm-m68k git rm ${SOURCE}/Kbuild for F in $INCLUDE $EQUAL; do git rm ${SOURCE}/$F done for F in $NOMUUFILES; do git mv ${SOURCE}/$F ${TARGET}/$F done for F in $FILES ; do mergefile $F done rmdir arch/m68knommu/include/asm rmdir arch/m68knommu/include Cc: Arnd Bergmann <arnd@arndb.de> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Signed-off-by: Sam Ravnborg <sam@ravnborg.org> Signed-off-by: Greg Ungerer <gerg@uclinux.org>
255 lines
5.1 KiB
C
255 lines
5.1 KiB
C
/*
|
|
* Implementation independent bits of the Floppy driver.
|
|
*
|
|
* much of this file is derived from what was originally the Q40 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) 1999, 2000, 2001
|
|
*
|
|
* Sun3x support added 2/4/2000 Sam Creasey (sammy@sammy.net)
|
|
*
|
|
*/
|
|
|
|
#include <asm/io.h>
|
|
|
|
#include <linux/vmalloc.h>
|
|
|
|
asmlinkage irqreturn_t floppy_hardint(int irq, void *dev_id);
|
|
|
|
/* constants... */
|
|
|
|
#undef MAX_DMA_ADDRESS
|
|
#define MAX_DMA_ADDRESS 0x00 /* nothing like that */
|
|
|
|
|
|
/*
|
|
* Again, the CMOS information doesn't work on m68k..
|
|
*/
|
|
#define FLOPPY0_TYPE (MACH_IS_Q40 ? 6 : 4)
|
|
#define FLOPPY1_TYPE 0
|
|
|
|
/* basically PC init + set use_virtual_dma */
|
|
#define FDC1 m68k_floppy_init()
|
|
|
|
#define N_FDC 1
|
|
#define N_DRIVE 8
|
|
|
|
|
|
/* vdma globals adapted from asm-i386/floppy.h */
|
|
|
|
static int virtual_dma_count=0;
|
|
static int virtual_dma_residue=0;
|
|
static char *virtual_dma_addr=NULL;
|
|
static int virtual_dma_mode=0;
|
|
static int doing_pdma=0;
|
|
|
|
#include <asm/sun3xflop.h>
|
|
|
|
extern spinlock_t dma_spin_lock;
|
|
|
|
static __inline__ unsigned long claim_dma_lock(void)
|
|
{
|
|
unsigned long flags;
|
|
spin_lock_irqsave(&dma_spin_lock, flags);
|
|
return flags;
|
|
}
|
|
|
|
static __inline__ void release_dma_lock(unsigned long flags)
|
|
{
|
|
spin_unlock_irqrestore(&dma_spin_lock, flags);
|
|
}
|
|
|
|
|
|
static __inline__ unsigned char fd_inb(int port)
|
|
{
|
|
if(MACH_IS_Q40)
|
|
return inb_p(port);
|
|
else if(MACH_IS_SUN3X)
|
|
return sun3x_82072_fd_inb(port);
|
|
return 0;
|
|
}
|
|
|
|
static __inline__ void fd_outb(unsigned char value, int port)
|
|
{
|
|
if(MACH_IS_Q40)
|
|
outb_p(value, port);
|
|
else if(MACH_IS_SUN3X)
|
|
sun3x_82072_fd_outb(value, port);
|
|
}
|
|
|
|
|
|
static int fd_request_irq(void)
|
|
{
|
|
if(MACH_IS_Q40)
|
|
return request_irq(FLOPPY_IRQ, floppy_hardint,
|
|
IRQF_DISABLED, "floppy", floppy_hardint);
|
|
else if(MACH_IS_SUN3X)
|
|
return sun3xflop_request_irq();
|
|
return -ENXIO;
|
|
}
|
|
|
|
static void fd_free_irq(void)
|
|
{
|
|
if(MACH_IS_Q40)
|
|
free_irq(FLOPPY_IRQ, floppy_hardint);
|
|
}
|
|
|
|
#define fd_request_dma() vdma_request_dma(FLOPPY_DMA,"floppy")
|
|
#define fd_get_dma_residue() vdma_get_dma_residue(FLOPPY_DMA)
|
|
#define fd_dma_mem_alloc(size) vdma_mem_alloc(size)
|
|
#define fd_dma_setup(addr, size, mode, io) vdma_dma_setup(addr, size, mode, io)
|
|
|
|
#define fd_enable_irq() /* nothing... */
|
|
#define fd_disable_irq() /* nothing... */
|
|
|
|
#define fd_free_dma() /* nothing */
|
|
|
|
/* No 64k boundary crossing problems on Q40 - no DMA at all */
|
|
#define CROSS_64KB(a,s) (0)
|
|
|
|
#define DMA_MODE_READ 0x44 /* i386 look-alike */
|
|
#define DMA_MODE_WRITE 0x48
|
|
|
|
|
|
static int m68k_floppy_init(void)
|
|
{
|
|
use_virtual_dma =1;
|
|
can_use_virtual_dma = 1;
|
|
|
|
|
|
if (MACH_IS_Q40)
|
|
return 0x3f0;
|
|
else if(MACH_IS_SUN3X)
|
|
return sun3xflop_init();
|
|
else
|
|
return -1;
|
|
}
|
|
|
|
|
|
static int vdma_request_dma(unsigned int dmanr, const char * device_id)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
static int vdma_get_dma_residue(unsigned int dummy)
|
|
{
|
|
return virtual_dma_count + virtual_dma_residue;
|
|
}
|
|
|
|
|
|
static unsigned long vdma_mem_alloc(unsigned long size)
|
|
{
|
|
return (unsigned long) vmalloc(size);
|
|
|
|
}
|
|
|
|
static void _fd_dma_mem_free(unsigned long addr, unsigned long size)
|
|
{
|
|
vfree((void *)addr);
|
|
}
|
|
#define fd_dma_mem_free(addr,size) _fd_dma_mem_free(addr, size)
|
|
|
|
|
|
/* choose_dma_mode ???*/
|
|
|
|
static int vdma_dma_setup(char *addr, unsigned long size, int mode, int io)
|
|
{
|
|
doing_pdma = 1;
|
|
virtual_dma_port = (MACH_IS_Q40 ? io : 0);
|
|
virtual_dma_mode = (mode == DMA_MODE_WRITE);
|
|
virtual_dma_addr = addr;
|
|
virtual_dma_count = size;
|
|
virtual_dma_residue = 0;
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
static void fd_disable_dma(void)
|
|
{
|
|
doing_pdma = 0;
|
|
virtual_dma_residue += virtual_dma_count;
|
|
virtual_dma_count=0;
|
|
}
|
|
|
|
|
|
|
|
/* this is the only truly Q40 specific function */
|
|
|
|
asmlinkage irqreturn_t floppy_hardint(int irq, void *dev_id)
|
|
{
|
|
register unsigned char st;
|
|
|
|
#undef TRACE_FLPY_INT
|
|
#define NO_FLOPPY_ASSEMBLER
|
|
|
|
#ifdef TRACE_FLPY_INT
|
|
static int calls=0;
|
|
static int bytes=0;
|
|
static int dma_wait=0;
|
|
#endif
|
|
if(!doing_pdma) {
|
|
floppy_interrupt(irq, dev_id);
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
#ifdef TRACE_FLPY_INT
|
|
if(!calls)
|
|
bytes = virtual_dma_count;
|
|
#endif
|
|
|
|
{
|
|
register int lcount;
|
|
register char *lptr;
|
|
|
|
/* serve 1st byte fast: */
|
|
|
|
st=1;
|
|
for(lcount=virtual_dma_count, lptr=virtual_dma_addr;
|
|
lcount; lcount--, lptr++) {
|
|
st=inb(virtual_dma_port+4) & 0xa0 ;
|
|
if(st != 0xa0)
|
|
break;
|
|
if(virtual_dma_mode)
|
|
outb_p(*lptr, virtual_dma_port+5);
|
|
else
|
|
*lptr = inb_p(virtual_dma_port+5);
|
|
}
|
|
|
|
virtual_dma_count = lcount;
|
|
virtual_dma_addr = lptr;
|
|
st = inb(virtual_dma_port+4);
|
|
}
|
|
|
|
#ifdef TRACE_FLPY_INT
|
|
calls++;
|
|
#endif
|
|
if(st == 0x20)
|
|
return IRQ_HANDLED;
|
|
if(!(st & 0x20)) {
|
|
virtual_dma_residue += virtual_dma_count;
|
|
virtual_dma_count=0;
|
|
#ifdef TRACE_FLPY_INT
|
|
printk("count=%x, residue=%x calls=%d bytes=%d dma_wait=%d\n",
|
|
virtual_dma_count, virtual_dma_residue, calls, bytes,
|
|
dma_wait);
|
|
calls = 0;
|
|
dma_wait=0;
|
|
#endif
|
|
doing_pdma = 0;
|
|
floppy_interrupt(irq, dev_id);
|
|
return IRQ_HANDLED;
|
|
}
|
|
#ifdef TRACE_FLPY_INT
|
|
if(!virtual_dma_count)
|
|
dma_wait++;
|
|
#endif
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
#define EXTRA_FLOPPY_PARAMS
|