diff options
Diffstat (limited to 'arch/m68k/apollo')
| -rw-r--r-- | arch/m68k/apollo/config.c | 68 | ||||
| -rw-r--r-- | arch/m68k/apollo/dn_ints.c | 35 | 
2 files changed, 53 insertions, 50 deletions
diff --git a/arch/m68k/apollo/config.c b/arch/m68k/apollo/config.c index 8d3eafab1ff..6e62d66c396 100644 --- a/arch/m68k/apollo/config.c +++ b/arch/m68k/apollo/config.c @@ -1,3 +1,4 @@ +#include <linux/init.h>  #include <linux/types.h>  #include <linux/kernel.h>  #include <linux/mm.h> @@ -9,7 +10,8 @@  #include <asm/setup.h>  #include <asm/bootinfo.h> -#include <asm/system.h> +#include <asm/bootinfo-apollo.h> +#include <asm/byteorder.h>  #include <asm/pgtable.h>  #include <asm/apollohw.h>  #include <asm/irq.h> @@ -27,7 +29,7 @@ u_long apollo_model;  extern void dn_sched_init(irq_handler_t handler);  extern void dn_init_IRQ(void); -extern unsigned long dn_gettimeoffset(void); +extern u32 dn_gettimeoffset(void);  extern int dn_dummy_hwclk(int, struct rtc_time *);  extern int dn_dummy_set_clock_mmss(unsigned long);  extern void dn_dummy_reset(void); @@ -44,28 +46,27 @@ static const char *apollo_models[] = {  	[APOLLO_DN4500-APOLLO_DN3000] = "DN4500 (Roadrunner)"  }; -int apollo_parse_bootinfo(const struct bi_record *record) { - +int __init apollo_parse_bootinfo(const struct bi_record *record) +{  	int unknown = 0; -	const unsigned long *data = record->data; +	const void *data = record->data; -	switch(record->tag) { -		case BI_APOLLO_MODEL: -			apollo_model=*data; -			break; +	switch (be16_to_cpu(record->tag)) { +	case BI_APOLLO_MODEL: +		apollo_model = be32_to_cpup(data); +		break; -		default: -			 unknown=1; +	default: +		 unknown=1;  	}  	return unknown;  } -void dn_setup_model(void) { - - -	printk("Apollo hardware found: "); -	printk("[%s]\n", apollo_models[apollo_model - APOLLO_DN3000]); +static void __init dn_setup_model(void) +{ +	pr_info("Apollo hardware found: [%s]\n", +		apollo_models[apollo_model - APOLLO_DN3000]);  	switch(apollo_model) {  		case APOLLO_UNKNOWN: @@ -152,7 +153,7 @@ void __init config_apollo(void)  	mach_sched_init=dn_sched_init; /* */  	mach_init_IRQ=dn_init_IRQ; -	mach_gettimeoffset   = dn_gettimeoffset; +	arch_gettimeoffset   = dn_gettimeoffset;  	mach_max_dma_address = 0xffffffff;  	mach_hwclk           = dn_dummy_hwclk; /* */  	mach_set_clock_mmss  = dn_dummy_set_clock_mmss; /* */ @@ -178,8 +179,8 @@ irqreturn_t dn_timer_int(int irq, void *dev_id)  	timer_handler(irq, dev_id); -	x=*(volatile unsigned char *)(timer+3); -	x=*(volatile unsigned char *)(timer+5); +	x = *(volatile unsigned char *)(apollo_timer + 3); +	x = *(volatile unsigned char *)(apollo_timer + 5);  	return IRQ_HANDLED;  } @@ -187,27 +188,28 @@ irqreturn_t dn_timer_int(int irq, void *dev_id)  void dn_sched_init(irq_handler_t timer_routine)  {  	/* program timer 1 */ -	*(volatile unsigned char *)(timer+3)=0x01; -	*(volatile unsigned char *)(timer+1)=0x40; -	*(volatile unsigned char *)(timer+5)=0x09; -	*(volatile unsigned char *)(timer+7)=0xc4; +	*(volatile unsigned char *)(apollo_timer + 3) = 0x01; +	*(volatile unsigned char *)(apollo_timer + 1) = 0x40; +	*(volatile unsigned char *)(apollo_timer + 5) = 0x09; +	*(volatile unsigned char *)(apollo_timer + 7) = 0xc4;  	/* enable IRQ of PIC B */  	*(volatile unsigned char *)(pica+1)&=(~8);  #if 0 -	printk("*(0x10803) %02x\n",*(volatile unsigned char *)(timer+0x3)); -	printk("*(0x10803) %02x\n",*(volatile unsigned char *)(timer+0x3)); +	pr_info("*(0x10803) %02x\n", +		*(volatile unsigned char *)(apollo_timer + 0x3)); +	pr_info("*(0x10803) %02x\n", +		*(volatile unsigned char *)(apollo_timer + 0x3));  #endif  	if (request_irq(IRQ_APOLLO, dn_timer_int, 0, "time", timer_routine))  		pr_err("Couldn't register timer interrupt\n");  } -unsigned long dn_gettimeoffset(void) { - +u32 dn_gettimeoffset(void) +{  	return 0xdeadbeef; -  }  int dn_dummy_hwclk(int op, struct rtc_time *t) { @@ -236,12 +238,10 @@ int dn_dummy_hwclk(int op, struct rtc_time *t) {  } -int dn_dummy_set_clock_mmss(unsigned long nowtime) { - -  printk("set_clock_mmss\n"); - -  return 0; - +int dn_dummy_set_clock_mmss(unsigned long nowtime) +{ +	pr_info("set_clock_mmss\n"); +	return 0;  }  void dn_dummy_reset(void) { diff --git a/arch/m68k/apollo/dn_ints.c b/arch/m68k/apollo/dn_ints.c index 5d47f3aa381..17be1e7e2df 100644 --- a/arch/m68k/apollo/dn_ints.c +++ b/arch/m68k/apollo/dn_ints.c @@ -1,19 +1,13 @@  #include <linux/interrupt.h> +#include <linux/irq.h> -#include <asm/irq.h>  #include <asm/traps.h>  #include <asm/apollohw.h> -void dn_process_int(unsigned int irq, struct pt_regs *fp) +unsigned int apollo_irq_startup(struct irq_data *data)  { -	__m68k_handle_int(irq, fp); +	unsigned int irq = data->irq; -	*(volatile unsigned char *)(pica)=0x20; -	*(volatile unsigned char *)(picb)=0x20; -} - -int apollo_irq_startup(unsigned int irq) -{  	if (irq < 8)  		*(volatile unsigned char *)(pica+1) &= ~(1 << irq);  	else @@ -21,24 +15,33 @@ int apollo_irq_startup(unsigned int irq)  	return 0;  } -void apollo_irq_shutdown(unsigned int irq) +void apollo_irq_shutdown(struct irq_data *data)  { +	unsigned int irq = data->irq; +  	if (irq < 8)  		*(volatile unsigned char *)(pica+1) |= (1 << irq);  	else  		*(volatile unsigned char *)(picb+1) |= (1 << (irq - 8));  } -static struct irq_controller apollo_irq_controller = { +void apollo_irq_eoi(struct irq_data *data) +{ +	*(volatile unsigned char *)(pica) = 0x20; +	*(volatile unsigned char *)(picb) = 0x20; +} + +static struct irq_chip apollo_irq_chip = {  	.name           = "apollo", -	.lock           = __SPIN_LOCK_UNLOCKED(apollo_irq_controller.lock), -	.startup        = apollo_irq_startup, -	.shutdown       = apollo_irq_shutdown, +	.irq_startup    = apollo_irq_startup, +	.irq_shutdown   = apollo_irq_shutdown, +	.irq_eoi	= apollo_irq_eoi,  };  void __init dn_init_IRQ(void)  { -	m68k_setup_user_interrupt(VEC_USER + 96, 16, dn_process_int); -	m68k_setup_irq_controller(&apollo_irq_controller, IRQ_APOLLO, 16); +	m68k_setup_user_interrupt(VEC_USER + 96, 16); +	m68k_setup_irq_controller(&apollo_irq_chip, handle_fasteoi_irq, +				  IRQ_APOLLO, 16);  }  | 
