123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- /*
- * include/asm-v850/rte_cb.c -- Midas lab RTE-CB series of evaluation boards
- *
- * Copyright (C) 2001,02,03 NEC Electronics Corporation
- * Copyright (C) 2001,02,03 Miles Bader <miles@gnu.org>
- *
- * This file is subject to the terms and conditions of the GNU General
- * Public License. See the file COPYING in the main directory of this
- * archive for more details.
- *
- * Written by Miles Bader <miles@gnu.org>
- */
- #include <linux/config.h>
- #include <linux/init.h>
- #include <linux/irq.h>
- #include <linux/fs.h>
- #include <linux/module.h>
- #include <asm/machdep.h>
- #include <asm/v850e_uart.h>
- #include "mach.h"
- static void led_tick (void);
- /* LED access routines. */
- extern unsigned read_leds (int pos, char *buf, int len);
- extern unsigned write_leds (int pos, const char *buf, int len);
- #ifdef CONFIG_RTE_CB_MULTI
- extern void multi_init (void);
- #endif
- void __init rte_cb_early_init (void)
- {
- v850e_intc_disable_irqs ();
- #ifdef CONFIG_RTE_CB_MULTI
- multi_init ();
- #endif
- }
- void __init mach_setup (char **cmdline)
- {
- #ifdef CONFIG_RTE_MB_A_PCI
- /* Probe for Mother-A, and print a message if we find it. */
- *(volatile unsigned long *)MB_A_SRAM_ADDR = 0xDEADBEEF;
- if (*(volatile unsigned long *)MB_A_SRAM_ADDR == 0xDEADBEEF) {
- *(volatile unsigned long *)MB_A_SRAM_ADDR = 0x12345678;
- if (*(volatile unsigned long *)MB_A_SRAM_ADDR == 0x12345678)
- printk (KERN_INFO
- " NEC SolutionGear/Midas lab"
- " RTE-MOTHER-A motherboard\n");
- }
- #endif /* CONFIG_RTE_MB_A_PCI */
- mach_tick = led_tick;
- }
- void machine_restart (char *__unused)
- {
- #ifdef CONFIG_RESET_GUARD
- disable_reset_guard ();
- #endif
- asm ("jmp r0"); /* Jump to the reset vector. */
- }
- /* This says `HALt.' in LEDese. */
- static unsigned char halt_leds_msg[] = { 0x76, 0x77, 0x38, 0xF8 };
- void machine_halt (void)
- {
- #ifdef CONFIG_RESET_GUARD
- disable_reset_guard ();
- #endif
- /* Ignore all interrupts. */
- local_irq_disable ();
- /* Write a little message. */
- write_leds (0, halt_leds_msg, sizeof halt_leds_msg);
- /* Really halt. */
- for (;;)
- asm ("halt; nop; nop; nop; nop; nop");
- }
- void machine_power_off (void)
- {
- machine_halt ();
- }
- /* Animated LED display for timer tick. */
- #define TICK_UPD_FREQ 6
- static int tick_frames[][10] = {
- { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, -1 },
- { 0x63, 0x5c, -1 },
- { 0x5c, 0x00, -1 },
- { 0x63, 0x00, -1 },
- { -1 }
- };
- static void led_tick ()
- {
- static unsigned counter = 0;
-
- if (++counter == (HZ / TICK_UPD_FREQ)) {
- /* Which frame we're currently displaying for each digit. */
- static unsigned frame_nums[LED_NUM_DIGITS] = { 0 };
- /* Display image. */
- static unsigned char image[LED_NUM_DIGITS] = { 0 };
- unsigned char prev_image[LED_NUM_DIGITS];
- int write_to_leds = 1; /* true if we should actually display */
- int digit;
- /* We check to see if the physical LEDs contains what we last
- wrote to them; if not, we suppress display (this is so that
- users can write to the LEDs, and not have their output
- overwritten). As a special case, we start writing again if
- all the LEDs are blank, or our display image is all zeros
- (indicating that this is the initial update, when the actual
- LEDs might contain random data). */
- read_leds (0, prev_image, LED_NUM_DIGITS);
- for (digit = 0; digit < LED_NUM_DIGITS; digit++)
- if (image[digit] != prev_image[digit]
- && image[digit] && prev_image[digit])
- {
- write_to_leds = 0;
- break;
- }
- /* Update display image. */
- for (digit = 0;
- digit < LED_NUM_DIGITS && tick_frames[digit][0] >= 0;
- digit++)
- {
- int frame = tick_frames[digit][frame_nums[digit]];
- if (frame < 0) {
- image[digit] = tick_frames[digit][0];
- frame_nums[digit] = 1;
- } else {
- image[digit] = frame;
- frame_nums[digit]++;
- break;
- }
- }
- if (write_to_leds)
- /* Write the display image to the physical LEDs. */
- write_leds (0, image, LED_NUM_DIGITS);
- counter = 0;
- }
- }
- /* Mother-A interrupts. */
- #ifdef CONFIG_RTE_GBUS_INT
- #define L GBUS_INT_PRIORITY_LOW
- #define M GBUS_INT_PRIORITY_MEDIUM
- #define H GBUS_INT_PRIORITY_HIGH
- static struct gbus_int_irq_init gbus_irq_inits[] = {
- #ifdef CONFIG_RTE_MB_A_PCI
- { "MB_A_LAN", IRQ_MB_A_LAN, 1, 1, L },
- { "MB_A_PCI1", IRQ_MB_A_PCI1(0), IRQ_MB_A_PCI1_NUM, 1, L },
- { "MB_A_PCI2", IRQ_MB_A_PCI2(0), IRQ_MB_A_PCI2_NUM, 1, L },
- { "MB_A_EXT", IRQ_MB_A_EXT(0), IRQ_MB_A_EXT_NUM, 1, L },
- { "MB_A_USB_OC",IRQ_MB_A_USB_OC(0), IRQ_MB_A_USB_OC_NUM, 1, L },
- { "MB_A_PCMCIA_OC",IRQ_MB_A_PCMCIA_OC, 1, 1, L },
- #endif
- { 0 }
- };
- #define NUM_GBUS_IRQ_INITS \
- ((sizeof gbus_irq_inits / sizeof gbus_irq_inits[0]) - 1)
- static struct hw_interrupt_type gbus_hw_itypes[NUM_GBUS_IRQ_INITS];
- #endif /* CONFIG_RTE_GBUS_INT */
- void __init rte_cb_init_irqs (void)
- {
- #ifdef CONFIG_RTE_GBUS_INT
- gbus_int_init_irqs ();
- gbus_int_init_irq_types (gbus_irq_inits, gbus_hw_itypes);
- #endif /* CONFIG_RTE_GBUS_INT */
- }
|