提交 0a808a31 编写于 作者: D David S. Miller

[SPARC32]: Fix modular build of floppy driver.

Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 3daadf33
/* $Id: entry.S,v 1.170 2001/11/13 00:57:05 davem Exp $ /* arch/sparc/kernel/entry.S: Sparc trap low-level entry points.
* arch/sparc/kernel/entry.S: Sparc trap low-level entry points.
* *
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1995, 2007 David S. Miller (davem@davemloft.net)
* Copyright (C) 1996 Eddie C. Dost (ecd@skynet.be) * Copyright (C) 1996 Eddie C. Dost (ecd@skynet.be)
* Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx) * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
* Copyright (C) 1996-1999 Jakub Jelinek (jj@sunsite.mff.cuni.cz) * Copyright (C) 1996-1999 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
...@@ -129,7 +128,7 @@ trap_low: ...@@ -129,7 +128,7 @@ trap_low:
RESTORE_ALL RESTORE_ALL
#endif #endif
#ifdef CONFIG_BLK_DEV_FD #if defined(CONFIG_BLK_DEV_FD) || defined(CONFIG_BLK_DEV_FD_MODULE)
.text .text
.align 4 .align 4
.globl floppy_hardint .globl floppy_hardint
......
...@@ -351,34 +351,14 @@ void handler_irq(int irq, struct pt_regs * regs) ...@@ -351,34 +351,14 @@ void handler_irq(int irq, struct pt_regs * regs)
set_irq_regs(old_regs); set_irq_regs(old_regs);
} }
#ifdef CONFIG_BLK_DEV_FD #if defined(CONFIG_BLK_DEV_FD) || defined(CONFIG_BLK_DEV_FD_MODULE)
extern void floppy_interrupt(int irq, void *dev_id);
void sparc_floppy_irq(int irq, void *dev_id, struct pt_regs *regs)
{
struct pt_regs *old_regs;
int cpu = smp_processor_id();
old_regs = set_irq_regs(regs);
disable_pil_irq(irq);
irq_enter();
kstat_cpu(cpu).irqs[irq]++;
floppy_interrupt(irq, dev_id);
irq_exit();
enable_pil_irq(irq);
set_irq_regs(old_regs);
// XXX Eek, it's totally changed with preempt_count() and such
// if (softirq_pending(cpu))
// do_softirq();
}
#endif
/* Fast IRQs on the Sparc can only have one routine attached to them, /* Fast IRQs on the Sparc can only have one routine attached to them,
* thus no sharing possible. * thus no sharing possible.
*/ */
int request_fast_irq(unsigned int irq, static int request_fast_irq(unsigned int irq,
irq_handler_t handler, void (*handler)(void),
unsigned long irqflags, const char *devname) unsigned long irqflags, const char *devname)
{ {
struct irqaction *action; struct irqaction *action;
unsigned long flags; unsigned long flags;
...@@ -457,7 +437,6 @@ int request_fast_irq(unsigned int irq, ...@@ -457,7 +437,6 @@ int request_fast_irq(unsigned int irq,
*/ */
flush_cache_all(); flush_cache_all();
action->handler = handler;
action->flags = irqflags; action->flags = irqflags;
cpus_clear(action->mask); cpus_clear(action->mask);
action->name = devname; action->name = devname;
...@@ -475,6 +454,61 @@ int request_fast_irq(unsigned int irq, ...@@ -475,6 +454,61 @@ int request_fast_irq(unsigned int irq,
return ret; return ret;
} }
/* These variables are used to access state from the assembler
* interrupt handler, floppy_hardint, so we cannot put these in
* the floppy driver image because that would not work in the
* modular case.
*/
volatile unsigned char *fdc_status;
EXPORT_SYMBOL(fdc_status);
char *pdma_vaddr;
EXPORT_SYMBOL(pdma_vaddr);
unsigned long pdma_size;
EXPORT_SYMBOL(pdma_size);
volatile int doing_pdma;
EXPORT_SYMBOL(doing_pdma);
char *pdma_base;
EXPORT_SYMBOL(pdma_base);
unsigned long pdma_areasize;
EXPORT_SYMBOL(pdma_areasize);
extern void floppy_hardint(void);
static irqreturn_t (*floppy_irq_handler)(int irq, void *dev_id);
void sparc_floppy_irq(int irq, void *dev_id, struct pt_regs *regs)
{
struct pt_regs *old_regs;
int cpu = smp_processor_id();
old_regs = set_irq_regs(regs);
disable_pil_irq(irq);
irq_enter();
kstat_cpu(cpu).irqs[irq]++;
floppy_irq_handler(irq, dev_id);
irq_exit();
enable_pil_irq(irq);
set_irq_regs(old_regs);
// XXX Eek, it's totally changed with preempt_count() and such
// if (softirq_pending(cpu))
// do_softirq();
}
int sparc_floppy_request_irq(int irq, unsigned long flags,
irqreturn_t (*irq_handler)(int irq, void *))
{
floppy_irq_handler = irq_handler;
return request_fast_irq(irq, floppy_hardint, flags, "floppy");
}
EXPORT_SYMBOL(sparc_floppy_request_irq);
#endif
int request_irq(unsigned int irq, int request_irq(unsigned int irq,
irq_handler_t handler, irq_handler_t handler,
unsigned long irqflags, const char * devname, void *dev_id) unsigned long irqflags, const char * devname, void *dev_id)
......
...@@ -143,7 +143,6 @@ EXPORT_SYMBOL(mstk48t02_regs); ...@@ -143,7 +143,6 @@ EXPORT_SYMBOL(mstk48t02_regs);
EXPORT_SYMBOL(set_auxio); EXPORT_SYMBOL(set_auxio);
EXPORT_SYMBOL(get_auxio); EXPORT_SYMBOL(get_auxio);
#endif #endif
EXPORT_SYMBOL(request_fast_irq);
EXPORT_SYMBOL(io_remap_pfn_range); EXPORT_SYMBOL(io_remap_pfn_range);
/* P3: iounit_xxx may be needed, sun4d users */ /* P3: iounit_xxx may be needed, sun4d users */
/* EXPORT_SYMBOL(iounit_map_dma_init); */ /* EXPORT_SYMBOL(iounit_map_dma_init); */
......
...@@ -48,7 +48,7 @@ struct sun_flpy_controller { ...@@ -48,7 +48,7 @@ struct sun_flpy_controller {
/* You'll only ever find one controller on a SparcStation anyways. */ /* You'll only ever find one controller on a SparcStation anyways. */
static struct sun_flpy_controller *sun_fdc = NULL; static struct sun_flpy_controller *sun_fdc = NULL;
volatile unsigned char *fdc_status; extern volatile unsigned char *fdc_status;
struct sun_floppy_ops { struct sun_floppy_ops {
unsigned char (*fd_inb)(int port); unsigned char (*fd_inb)(int port);
...@@ -225,13 +225,13 @@ static void sun_82077_fd_outb(unsigned char value, int port) ...@@ -225,13 +225,13 @@ static void sun_82077_fd_outb(unsigned char value, int port)
* underruns. If non-zero, doing_pdma encodes the direction of * underruns. If non-zero, doing_pdma encodes the direction of
* the transfer for debugging. 1=read 2=write * the transfer for debugging. 1=read 2=write
*/ */
char *pdma_vaddr; extern char *pdma_vaddr;
unsigned long pdma_size; extern unsigned long pdma_size;
volatile int doing_pdma = 0; extern volatile int doing_pdma;
/* This is software state */ /* This is software state */
char *pdma_base = NULL; extern char *pdma_base;
unsigned long pdma_areasize; extern unsigned long pdma_areasize;
/* Common routines to all controller types on the Sparc. */ /* Common routines to all controller types on the Sparc. */
static __inline__ void virtual_dma_init(void) static __inline__ void virtual_dma_init(void)
...@@ -281,7 +281,8 @@ static __inline__ void sun_fd_enable_dma(void) ...@@ -281,7 +281,8 @@ static __inline__ void sun_fd_enable_dma(void)
} }
/* Our low-level entry point in arch/sparc/kernel/entry.S */ /* Our low-level entry point in arch/sparc/kernel/entry.S */
irqreturn_t floppy_hardint(int irq, void *unused); extern int sparc_floppy_request_irq(int irq, unsigned long flags,
irqreturn_t (*irq_handler)(int irq, void *));
static int sun_fd_request_irq(void) static int sun_fd_request_irq(void)
{ {
...@@ -290,8 +291,9 @@ static int sun_fd_request_irq(void) ...@@ -290,8 +291,9 @@ static int sun_fd_request_irq(void)
if(!once) { if(!once) {
once = 1; once = 1;
error = request_fast_irq(FLOPPY_IRQ, floppy_hardint, error = sparc_floppy_request_irq(FLOPPY_IRQ,
IRQF_DISABLED, "floppy"); IRQF_DISABLED,
floppy_interrupt);
return ((error == 0) ? 0 : -1); return ((error == 0) ? 0 : -1);
} else return 0; } else return 0;
} }
......
/* $Id: irq.h,v 1.32 2000/08/26 02:42:28 anton Exp $ /* irq.h: IRQ registers on the Sparc.
* irq.h: IRQ registers on the Sparc.
* *
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1995, 2007 David S. Miller (davem@davemloft.net)
*/ */
#ifndef _SPARC_IRQ_H #ifndef _SPARC_IRQ_H
...@@ -13,6 +12,4 @@ ...@@ -13,6 +12,4 @@
#define irq_canonicalize(irq) (irq) #define irq_canonicalize(irq) (irq)
extern int request_fast_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, __const__ char *devname);
#endif #endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册