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>
264 lines
5.6 KiB
C
264 lines
5.6 KiB
C
/* sun3xflop.h: Sun3/80 specific parts of the floppy driver.
|
|
*
|
|
* Derived partially from asm-sparc/floppy.h, which is:
|
|
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
|
|
*
|
|
* Sun3x version 2/4/2000 Sam Creasey (sammy@sammy.net)
|
|
*/
|
|
|
|
#ifndef __ASM_SUN3X_FLOPPY_H
|
|
#define __ASM_SUN3X_FLOPPY_H
|
|
|
|
#include <asm/page.h>
|
|
#include <asm/pgtable.h>
|
|
#include <asm/system.h>
|
|
#include <asm/irq.h>
|
|
#include <asm/sun3x.h>
|
|
|
|
/* default interrupt vector */
|
|
#define SUN3X_FDC_IRQ 0x40
|
|
|
|
/* some constants */
|
|
#define FCR_TC 0x1
|
|
#define FCR_EJECT 0x2
|
|
#define FCR_MTRON 0x4
|
|
#define FCR_DSEL1 0x8
|
|
#define FCR_DSEL0 0x10
|
|
|
|
/* We don't need no stinkin' I/O port allocation crap. */
|
|
#undef release_region
|
|
#undef request_region
|
|
#define release_region(X, Y) do { } while(0)
|
|
#define request_region(X, Y, Z) (1)
|
|
|
|
struct sun3xflop_private {
|
|
volatile unsigned char *status_r;
|
|
volatile unsigned char *data_r;
|
|
volatile unsigned char *fcr_r;
|
|
volatile unsigned char *fvr_r;
|
|
unsigned char fcr;
|
|
} sun3x_fdc;
|
|
|
|
/* Super paranoid... */
|
|
#undef HAVE_DISABLE_HLT
|
|
|
|
/* Routines unique to each controller type on a Sun. */
|
|
static unsigned char sun3x_82072_fd_inb(int port)
|
|
{
|
|
static int once = 0;
|
|
// udelay(5);
|
|
switch(port & 7) {
|
|
default:
|
|
printk("floppy: Asked to read unknown port %d\n", port);
|
|
panic("floppy: Port bolixed.");
|
|
case 4: /* FD_STATUS */
|
|
return (*sun3x_fdc.status_r) & ~STATUS_DMA;
|
|
case 5: /* FD_DATA */
|
|
return (*sun3x_fdc.data_r);
|
|
case 7: /* FD_DIR */
|
|
/* ugly hack, I can't find a way to actually detect the disk */
|
|
if(!once) {
|
|
once = 1;
|
|
return 0x80;
|
|
}
|
|
return 0;
|
|
};
|
|
panic("sun_82072_fd_inb: How did I get here?");
|
|
}
|
|
|
|
static void sun3x_82072_fd_outb(unsigned char value, int port)
|
|
{
|
|
// udelay(5);
|
|
switch(port & 7) {
|
|
default:
|
|
printk("floppy: Asked to write to unknown port %d\n", port);
|
|
panic("floppy: Port bolixed.");
|
|
case 2: /* FD_DOR */
|
|
/* Oh geese, 82072 on the Sun has no DOR register,
|
|
* so we make do with taunting the FCR.
|
|
*
|
|
* ASSUMPTIONS: There will only ever be one floppy
|
|
* drive attached to a Sun controller
|
|
* and it will be at drive zero.
|
|
*/
|
|
|
|
{
|
|
unsigned char fcr = sun3x_fdc.fcr;
|
|
|
|
if(value & 0x10) {
|
|
fcr |= (FCR_DSEL0 | FCR_MTRON);
|
|
} else
|
|
fcr &= ~(FCR_DSEL0 | FCR_MTRON);
|
|
|
|
|
|
if(fcr != sun3x_fdc.fcr) {
|
|
*(sun3x_fdc.fcr_r) = fcr;
|
|
sun3x_fdc.fcr = fcr;
|
|
}
|
|
}
|
|
break;
|
|
case 5: /* FD_DATA */
|
|
*(sun3x_fdc.data_r) = value;
|
|
break;
|
|
case 7: /* FD_DCR */
|
|
*(sun3x_fdc.status_r) = value;
|
|
break;
|
|
case 4: /* FD_STATUS */
|
|
*(sun3x_fdc.status_r) = value;
|
|
break;
|
|
};
|
|
return;
|
|
}
|
|
|
|
|
|
asmlinkage irqreturn_t sun3xflop_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;
|
|
}
|
|
|
|
// printk("doing pdma\n");// st %x\n", sun_fdc->status_82072);
|
|
|
|
#ifdef TRACE_FLPY_INT
|
|
if(!calls)
|
|
bytes = virtual_dma_count;
|
|
#endif
|
|
|
|
{
|
|
register int lcount;
|
|
register char *lptr;
|
|
|
|
for(lcount=virtual_dma_count, lptr=virtual_dma_addr;
|
|
lcount; lcount--, lptr++) {
|
|
/* st=fd_inb(virtual_dma_port+4) & 0x80 ; */
|
|
st = *(sun3x_fdc.status_r);
|
|
/* if(st != 0xa0) */
|
|
/* break; */
|
|
|
|
if((st & 0x80) == 0) {
|
|
virtual_dma_count = lcount;
|
|
virtual_dma_addr = lptr;
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
if((st & 0x20) == 0)
|
|
break;
|
|
|
|
if(virtual_dma_mode)
|
|
/* fd_outb(*lptr, virtual_dma_port+5); */
|
|
*(sun3x_fdc.data_r) = *lptr;
|
|
else
|
|
/* *lptr = fd_inb(virtual_dma_port+5); */
|
|
*lptr = *(sun3x_fdc.data_r);
|
|
}
|
|
|
|
virtual_dma_count = lcount;
|
|
virtual_dma_addr = lptr;
|
|
/* st = fd_inb(virtual_dma_port+4); */
|
|
st = *(sun3x_fdc.status_r);
|
|
}
|
|
|
|
#ifdef TRACE_FLPY_INT
|
|
calls++;
|
|
#endif
|
|
// printk("st=%02x\n", st);
|
|
if(st == 0x20)
|
|
return IRQ_HANDLED;
|
|
if(!(st & 0x20)) {
|
|
virtual_dma_residue += virtual_dma_count;
|
|
virtual_dma_count=0;
|
|
doing_pdma = 0;
|
|
|
|
#ifdef TRACE_FLPY_INT
|
|
printk("count=%x, residue=%x calls=%d bytes=%x dma_wait=%d\n",
|
|
virtual_dma_count, virtual_dma_residue, calls, bytes,
|
|
dma_wait);
|
|
calls = 0;
|
|
dma_wait=0;
|
|
#endif
|
|
|
|
floppy_interrupt(irq, dev_id);
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
|
|
#ifdef TRACE_FLPY_INT
|
|
if(!virtual_dma_count)
|
|
dma_wait++;
|
|
#endif
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
static int sun3xflop_request_irq(void)
|
|
{
|
|
static int once = 0;
|
|
int error;
|
|
|
|
if(!once) {
|
|
once = 1;
|
|
error = request_irq(FLOPPY_IRQ, sun3xflop_hardint,
|
|
IRQF_DISABLED, "floppy", NULL);
|
|
return ((error == 0) ? 0 : -1);
|
|
} else return 0;
|
|
}
|
|
|
|
static void __init floppy_set_flags(int *ints,int param, int param2);
|
|
|
|
static int sun3xflop_init(void)
|
|
{
|
|
if(FLOPPY_IRQ < 0x40)
|
|
FLOPPY_IRQ = SUN3X_FDC_IRQ;
|
|
|
|
sun3x_fdc.status_r = (volatile unsigned char *)SUN3X_FDC;
|
|
sun3x_fdc.data_r = (volatile unsigned char *)(SUN3X_FDC+1);
|
|
sun3x_fdc.fcr_r = (volatile unsigned char *)SUN3X_FDC_FCR;
|
|
sun3x_fdc.fvr_r = (volatile unsigned char *)SUN3X_FDC_FVR;
|
|
sun3x_fdc.fcr = 0;
|
|
|
|
/* Last minute sanity check... */
|
|
if(*sun3x_fdc.status_r == 0xff) {
|
|
return -1;
|
|
}
|
|
|
|
*sun3x_fdc.fvr_r = FLOPPY_IRQ;
|
|
|
|
*sun3x_fdc.fcr_r = FCR_TC;
|
|
udelay(10);
|
|
*sun3x_fdc.fcr_r = 0;
|
|
|
|
/* Success... */
|
|
floppy_set_flags(NULL, 1, FD_BROKEN_DCL); // I don't know how to detect this.
|
|
allowed_drive_mask = 0x01;
|
|
return (int) SUN3X_FDC;
|
|
}
|
|
|
|
/* I'm not precisely sure this eject routine works */
|
|
static int sun3x_eject(void)
|
|
{
|
|
if(MACH_IS_SUN3X) {
|
|
|
|
sun3x_fdc.fcr |= (FCR_DSEL0 | FCR_EJECT);
|
|
*(sun3x_fdc.fcr_r) = sun3x_fdc.fcr;
|
|
udelay(10);
|
|
sun3x_fdc.fcr &= ~(FCR_DSEL0 | FCR_EJECT);
|
|
*(sun3x_fdc.fcr_r) = sun3x_fdc.fcr;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#define fd_eject(drive) sun3x_eject()
|
|
|
|
#endif /* !(__ASM_SUN3X_FLOPPY_H) */
|