[SPARC32]: Fix modular build of floppy driver.
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3daadf3301
commit
0a808a3131
|
@ -1,7 +1,6 @@
|
||||||
/* $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:
|
||||||
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)
|
||||||
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,
|
||||||
*/
|
*/
|
||||||
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 @@ out:
|
||||||
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);
|
||||||
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 {
|
||||||
|
|
||||||
/* 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)
|
||||||
* 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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
/* $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 @@
|
||||||
|
|
||||||
#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
|
||||||
|
|
Loading…
Reference in New Issue