diff options
Diffstat (limited to 'arch/microblaze/cpu')
| -rw-r--r-- | arch/microblaze/cpu/interrupts.c | 42 | ||||
| -rw-r--r-- | arch/microblaze/cpu/start.S | 2 | ||||
| -rw-r--r-- | arch/microblaze/cpu/timer.c | 69 | ||||
| -rw-r--r-- | arch/microblaze/cpu/u-boot.lds | 1 | 
4 files changed, 60 insertions, 54 deletions
| diff --git a/arch/microblaze/cpu/interrupts.c b/arch/microblaze/cpu/interrupts.c index ee6708218..7f2ee64ca 100644 --- a/arch/microblaze/cpu/interrupts.c +++ b/arch/microblaze/cpu/interrupts.c @@ -32,15 +32,12 @@  #undef DEBUG_INT -extern void microblaze_disable_interrupts (void); -extern void microblaze_enable_interrupts (void); - -void enable_interrupts (void) +void enable_interrupts(void)  {  	MSRSET(0x2);  } -int disable_interrupts (void) +int disable_interrupts(void)  {  	unsigned int msr; @@ -58,20 +55,21 @@ microblaze_intc_t *intc;  /* default handler */  static void def_hdlr(void)  { -	puts ("def_hdlr\n"); +	puts("def_hdlr\n");  }  static void enable_one_interrupt(int irq)  {  	int mask;  	int offset = 1; +  	offset <<= irq;  	mask = intc->ier;  	intc->ier = (mask | offset);  #ifdef DEBUG_INT -	printf ("Enable one interrupt irq %x - mask %x,ier %x\n", offset, mask, +	printf("Enable one interrupt irq %x - mask %x,ier %x\n", offset, mask,  		intc->ier); -	printf ("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier, +	printf("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier,  		intc->iar, intc->mer);  #endif  } @@ -80,25 +78,26 @@ static void disable_one_interrupt(int irq)  {  	int mask;  	int offset = 1; +  	offset <<= irq;  	mask = intc->ier;  	intc->ier = (mask & ~offset);  #ifdef DEBUG_INT -	printf ("Disable one interrupt irq %x - mask %x,ier %x\n", irq, mask, +	printf("Disable one interrupt irq %x - mask %x,ier %x\n", irq, mask,  		intc->ier); -	printf ("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier, +	printf("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier,  		intc->iar, intc->mer);  #endif  } -/* adding new handler for interrupt */ -void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg) +int install_interrupt_handler(int irq, interrupt_handler_t *hdlr, void *arg)  {  	struct irq_action *act; +  	/* irq out of range */  	if ((irq < 0) || (irq > irq_no)) { -		puts ("IRQ out of range\n"); -		return; +		puts("IRQ out of range\n"); +		return -1;  	}  	act = &vecs[irq];  	if (hdlr) {		/* enable */ @@ -106,11 +105,14 @@ void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg)  		act->arg = arg;  		act->count = 0;  		enable_one_interrupt (irq); -	} else {		/* disable */ -		act->handler = (interrupt_handler_t *) def_hdlr; -		act->arg = (void *)irq; -		disable_one_interrupt (irq); +		return 0;  	} + +	/* Disable */ +	act->handler = (interrupt_handler_t *) def_hdlr; +	act->arg = (void *)irq; +	disable_one_interrupt(irq); +	return 1;  }  /* initialization interrupt controller - hardware */ @@ -122,7 +124,7 @@ static void intc_init(void)  	/* XIntc_Start - hw_interrupt enable and all interrupt enable */  	intc->mer = 0x3;  #ifdef DEBUG_INT -	printf ("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier, +	printf("INTC isr %x, ier %x, iar %x, mer %x\n", intc->isr, intc->ier,  		intc->iar, intc->mer);  #endif  } @@ -157,7 +159,7 @@ int interrupts_init(void)  	return 0;  } -void interrupt_handler (void) +void interrupt_handler(void)  {  	int irqs = intc->ivr;	/* find active interrupt */  	int mask = 1; diff --git a/arch/microblaze/cpu/start.S b/arch/microblaze/cpu/start.S index 8a2f634a9..8564c4e30 100644 --- a/arch/microblaze/cpu/start.S +++ b/arch/microblaze/cpu/start.S @@ -149,7 +149,7 @@ clear_bss:  	cmp     r6, r5, r4 /* check if we have reach the end */  	bnei    r6, 2b  3:	/* jumping to board_init */ -	brai	board_init +	brai	board_init_f  1:	bri	1b  /* diff --git a/arch/microblaze/cpu/timer.c b/arch/microblaze/cpu/timer.c index cc6b897fb..1330401a9 100644 --- a/arch/microblaze/cpu/timer.c +++ b/arch/microblaze/cpu/timer.c @@ -27,42 +27,30 @@  #include <asm/microblaze_intc.h>  volatile int timestamp = 0; +microblaze_timer_t *tmr; -#ifdef CONFIG_SYS_TIMER_0  ulong get_timer (ulong base)  { -	return (timestamp - base); +	if (tmr) +		return timestamp - base; +	return timestamp++ - base;  } -#else -ulong get_timer (ulong base) -{ -	return (timestamp++ - base); -} -#endif -#ifdef CONFIG_SYS_TIMER_0  void __udelay(unsigned long usec)  { -	int i; +	u32 i; -	i = get_timer(0); -	while ((get_timer(0) - i) < (usec / 1000)) -		; +	if (tmr) { +		i = get_timer(0); +		while ((get_timer(0) - i) < (usec / 1000)) +			; +	} else { +		for (i = 0; i < (usec * XILINX_CLOCK_FREQ / 10000000); i++) +			; +	}  } -#else -void __udelay(unsigned long usec) -{ -	unsigned int i; -	for (i = 0; i < (usec * CONFIG_XILINX_CLOCK_FREQ / 10000000); i++) -		; -} -#endif - -#ifdef CONFIG_SYS_TIMER_0 -microblaze_timer_t *tmr = (microblaze_timer_t *) (CONFIG_SYS_TIMER_0_ADDR); - -void timer_isr (void *arg) +static void timer_isr(void *arg)  {  	timestamp++;  	tmr->control = tmr->control | TIMER_INTERRUPT; @@ -70,15 +58,30 @@ void timer_isr (void *arg)  int timer_init (void)  { -	tmr->loadreg = CONFIG_SYS_TIMER_0_PRELOAD; -	tmr->control = TIMER_INTERRUPT | TIMER_RESET; -	tmr->control = -	    TIMER_ENABLE | TIMER_ENABLE_INTR | TIMER_RELOAD | TIMER_DOWN_COUNT; -	timestamp = 0; -	install_interrupt_handler (CONFIG_SYS_TIMER_0_IRQ, timer_isr, (void *)tmr); +	int irq = -1; +	u32 preload = 0; +	u32 ret = 0; + +#if defined(CONFIG_SYS_TIMER_0_ADDR) && defined(CONFIG_SYS_INTC_0_NUM) +	preload = XILINX_CLOCK_FREQ / CONFIG_SYS_HZ; +	irq = CONFIG_SYS_TIMER_0_IRQ; +	tmr = (microblaze_timer_t *) (CONFIG_SYS_TIMER_0_ADDR); +#endif + +	if (tmr && preload && irq >= 0) { +		tmr->loadreg = preload; +		tmr->control = TIMER_INTERRUPT | TIMER_RESET; +		tmr->control = TIMER_ENABLE | TIMER_ENABLE_INTR |\ +					TIMER_RELOAD | TIMER_DOWN_COUNT; +		timestamp = 0; +		ret = install_interrupt_handler (irq, timer_isr, (void *)tmr); +		if (ret) +			tmr = NULL; +	} + +	/* No problem if timer is not found/initialized */  	return 0;  } -#endif  /*   * This function is derived from PowerPC code (read timebase as long long). diff --git a/arch/microblaze/cpu/u-boot.lds b/arch/microblaze/cpu/u-boot.lds index ee41145bb..d033a2835 100644 --- a/arch/microblaze/cpu/u-boot.lds +++ b/arch/microblaze/cpu/u-boot.lds @@ -45,6 +45,7 @@ SECTIONS  	.data ALIGN(0x4):  	{  		__data_start = .; +		dts/libdts.o (.data)  		*(.data)  		__data_end = .;  	} |