rte_ma1_cb.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /*
  2. * arch/v850/kernel/rte_ma1_cb.c -- Midas labs RTE-V850E/MA1-CB board
  3. *
  4. * Copyright (C) 2001,02,03 NEC Electronics Corporation
  5. * Copyright (C) 2001,02,03 Miles Bader <miles@gnu.org>
  6. *
  7. * This file is subject to the terms and conditions of the GNU General
  8. * Public License. See the file COPYING in the main directory of this
  9. * archive for more details.
  10. *
  11. * Written by Miles Bader <miles@gnu.org>
  12. */
  13. #include <linux/config.h>
  14. #include <linux/kernel.h>
  15. #include <linux/init.h>
  16. #include <linux/bootmem.h>
  17. #include <asm/atomic.h>
  18. #include <asm/page.h>
  19. #include <asm/ma1.h>
  20. #include <asm/rte_ma1_cb.h>
  21. #include <asm/v850e_timer_c.h>
  22. #include "mach.h"
  23. /* SRAM and SDRAM are almost contiguous (with a small hole in between;
  24. see mach_reserve_bootmem for details), so just use both as one big area. */
  25. #define RAM_START SRAM_ADDR
  26. #define RAM_END (SDRAM_ADDR + SDRAM_SIZE)
  27. void __init mach_early_init (void)
  28. {
  29. rte_cb_early_init ();
  30. }
  31. void __init mach_get_physical_ram (unsigned long *ram_start,
  32. unsigned long *ram_len)
  33. {
  34. *ram_start = RAM_START;
  35. *ram_len = RAM_END - RAM_START;
  36. }
  37. void __init mach_reserve_bootmem ()
  38. {
  39. #ifdef CONFIG_RTE_CB_MULTI
  40. /* Prevent the kernel from touching the monitor's scratch RAM. */
  41. reserve_bootmem (MON_SCRATCH_ADDR, MON_SCRATCH_SIZE);
  42. #endif
  43. /* The space between SRAM and SDRAM is filled with duplicate
  44. images of SRAM. Prevent the kernel from using them. */
  45. reserve_bootmem (SRAM_ADDR + SRAM_SIZE,
  46. SDRAM_ADDR - (SRAM_ADDR + SRAM_SIZE));
  47. }
  48. void mach_gettimeofday (struct timespec *tv)
  49. {
  50. tv->tv_sec = 0;
  51. tv->tv_nsec = 0;
  52. }
  53. /* Called before configuring an on-chip UART. */
  54. void rte_ma1_cb_uart_pre_configure (unsigned chan,
  55. unsigned cflags, unsigned baud)
  56. {
  57. /* The RTE-MA1-CB connects some general-purpose I/O pins on the
  58. CPU to the RTS/CTS lines of UART 0's serial connection.
  59. I/O pins P42 and P43 are RTS and CTS respectively. */
  60. if (chan == 0) {
  61. /* Put P42 & P43 in I/O port mode. */
  62. MA_PORT4_PMC &= ~0xC;
  63. /* Make P42 an output, and P43 an input. */
  64. MA_PORT4_PM = (MA_PORT4_PM & ~0xC) | 0x8;
  65. }
  66. /* Do pre-configuration for the actual UART. */
  67. ma_uart_pre_configure (chan, cflags, baud);
  68. }
  69. void __init mach_init_irqs (void)
  70. {
  71. unsigned tc;
  72. /* Initialize interrupts. */
  73. ma_init_irqs ();
  74. rte_cb_init_irqs ();
  75. /* Use falling-edge-sensitivity for interrupts . */
  76. V850E_TIMER_C_SESC (0) &= ~0xC;
  77. V850E_TIMER_C_SESC (1) &= ~0xF;
  78. /* INTP000-INTP011 are shared with `Timer C', so we have to set
  79. up Timer C to pass them through as raw interrupts. */
  80. for (tc = 0; tc < 2; tc++)
  81. /* Turn on the timer. */
  82. V850E_TIMER_C_TMCC0 (tc) |= V850E_TIMER_C_TMCC0_CAE;
  83. /* Make sure the relevant port0/port1 pins are assigned
  84. interrupt duty. We used INTP001-INTP011 (don't screw with
  85. INTP000 because the monitor uses it). */
  86. MA_PORT0_PMC |= 0x4; /* P02 (INTP001) in IRQ mode. */
  87. MA_PORT1_PMC |= 0x6; /* P11 (INTP010) & P12 (INTP011) in IRQ mode.*/
  88. }