walnut_setup.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.walnut_setup.c 1.10 11/13/01 21:26:07 paulus
  3.  */
  4. /*
  5.  *
  6.  *    Copyright (c) 1999-2000 Grant Erickson <grant@lcse.umn.edu>
  7.  *
  8.  *    Module name: walnut_setup.c
  9.  *
  10.  *    Description:
  11.  *      Architecture- / platform-specific boot-time initialization code for
  12.  *      the IBM PowerPC 403GP "Walnut" evaluation board. Adapted from original
  13.  *      code by Gary Thomas, Cort Dougan <cort@fsmlabs.com>, and Dan Malek
  14.  *      <dan@net4x.com>.
  15.  *
  16.  */
  17. #include <linux/config.h>
  18. #include <linux/init.h>
  19. #include <linux/smp.h>
  20. #include <linux/threads.h>
  21. #include <linux/interrupt.h>
  22. #include <linux/param.h>
  23. #include <linux/string.h>
  24. #include <linux/blk.h>
  25. #include <linux/seq_file.h>
  26. #include <asm/processor.h>
  27. #include <asm/board.h>
  28. #include <asm/machdep.h>
  29. #include <asm/page.h>
  30. #include "local_irq.h"
  31. #include "ppc4xx_pic.h"
  32. #include <asm/time.h>
  33. #include "walnut_setup.h"
  34. /* Function Prototypes */
  35. extern void abort(void);
  36. /* Global Variables */
  37. unsigned char __res[sizeof(bd_t)];
  38. /*
  39.  * void __init walnut_init()
  40.  *
  41.  * Description:
  42.  *   This routine...
  43.  *
  44.  * Input(s):
  45.  *   r3 - Optional pointer to a board information structure.
  46.  *   r4 - Optional pointer to the physical starting address of the init RAM
  47.  *        disk.
  48.  *   r5 - Optional pointer to the physical ending address of the init RAM
  49.  *        disk.
  50.  *   r6 - Optional pointer to the physical starting address of any kernel
  51.  *        command-line parameters.
  52.  *   r7 - Optional pointer to the physical ending address of any kernel
  53.  *        command-line parameters.
  54.  *
  55.  * Output(s):
  56.  *   N/A
  57.  *
  58.  * Returns:
  59.  *   N/A
  60.  *
  61.  */
  62. void __init
  63. walnut_init(unsigned long r3, unsigned long r4, unsigned long r5, 
  64.     unsigned long r6, unsigned long r7)
  65. {
  66. /*
  67.  * If we were passed in a board information, copy it into the
  68.  * residual data area.
  69.  */
  70. if (r3) {
  71. memcpy((void *)__res, (void *)(r3 + KERNELBASE), sizeof(bd_t));
  72. }
  73. #if defined(CONFIG_BLK_DEV_INITRD)
  74. /*
  75.  * If the init RAM disk has been configured in, and there's a valid
  76.  * starting address for it, set it up.
  77.  */
  78. if (r4) {
  79. initrd_start = r4 + KERNELBASE;
  80. initrd_end = r5 + KERNELBASE;
  81. }
  82. #endif /* CONFIG_BLK_DEV_INITRD */
  83. /* Copy the kernel command line arguments to a safe place. */
  84. if (r6) {
  85.   *(char *)(r7 + KERNELBASE) = 0;
  86. strcpy(cmd_line, (char *)(r6 + KERNELBASE));
  87. }
  88. /* Initialize machine-dependency vectors */
  89. ppc_md.setup_arch   = walnut_setup_arch;
  90. ppc_md.show_percpuinfo   = walnut_show_percpuinfo;
  91. ppc_md.irq_cannonicalize  = NULL;
  92. ppc_md.init_IRQ   = walnut_init_IRQ;
  93. ppc_md.get_irq   = walnut_get_irq;
  94. ppc_md.init   = NULL;
  95. ppc_md.restart   = walnut_restart;
  96. ppc_md.power_off   = walnut_power_off;
  97. ppc_md.halt   = walnut_halt;
  98. ppc_md.time_init   = walnut_time_init;
  99. ppc_md.set_rtc_time   = walnut_set_rtc_time;
  100. ppc_md.get_rtc_time   = walnut_get_rtc_time;
  101. ppc_md.calibrate_decr   = walnut_calibrate_decr;
  102. ppc_md.kbd_setkeycode     = NULL;
  103. ppc_md.kbd_getkeycode     = NULL;
  104. ppc_md.kbd_translate      = NULL;
  105. ppc_md.kbd_unexpected_up  = NULL;
  106. ppc_md.kbd_leds           = NULL;
  107. ppc_md.kbd_init_hw        = NULL;
  108. ppc_md.ppc_kbd_sysrq_xlate = NULL;
  109. }
  110. /*
  111.  * Document me.
  112.  */
  113. void __init
  114. walnut_setup_arch(void)
  115. {
  116. /* XXX - Implement me */
  117. }
  118. /*
  119.  * int walnut_show_percpuinfo()
  120.  *
  121.  * Description:
  122.  *   This routine pretty-prints the platform's internal CPU and bus clock
  123.  *   frequencies into the buffer for usage in /proc/cpuinfo.
  124.  *
  125.  * Input(s):
  126.  *  *buffer - Buffer into which CPU and bus clock frequencies are to be
  127.  *            printed.
  128.  *
  129.  * Output(s):
  130.  *  *buffer - Buffer with the CPU and bus clock frequencies.
  131.  *
  132.  * Returns:
  133.  *   The number of bytes copied into 'buffer' if OK, otherwise zero or less
  134.  *   on error.
  135.  */
  136. int
  137. walnut_show_percpuinfo(struct seq_file *m)
  138. {
  139. bd_t *bp = (bd_t *)__res;
  140. seq_printf(m, "clocktt: %dMHzn"
  141.    "bus clocktt: %dMHzn",
  142.    bp->bi_intfreq / 1000000,
  143.    bp->bi_busfreq / 1000000);
  144. return 0;
  145. }
  146. /*
  147.  * Document me.
  148.  */
  149. void __init
  150. walnut_init_IRQ(void)
  151. {
  152. int i;
  153. ppc4xx_pic_init();
  154. for (i = 0; i < NR_IRQS; i++) {
  155. irq_desc[i].handler = ppc4xx_pic;
  156. }
  157. return;
  158. }
  159. /*
  160.  * Document me.
  161.  */
  162. int
  163. walnut_get_irq(struct pt_regs *regs)
  164. {
  165. return (ppc4xx_pic_get_irq(regs));
  166. }
  167. /*
  168.  * Document me.
  169.  */
  170. void
  171. walnut_restart(char *cmd)
  172. {
  173. abort();
  174. }
  175. /*
  176.  * Document me.
  177.  */
  178. void
  179. walnut_power_off(void)
  180. {
  181. walnut_restart(NULL);
  182. }
  183. /*
  184.  * Document me.
  185.  */
  186. void
  187. walnut_halt(void)
  188. {
  189. walnut_restart(NULL);
  190. }
  191. /*
  192.  * Document me.
  193.  */
  194. long __init
  195. walnut_time_init(void)
  196. {
  197. /* XXX - Implement me */
  198. return 0;
  199. }
  200. /*
  201.  * Document me.
  202.  */
  203. int __init
  204. walnut_set_rtc_time(unsigned long time)
  205. {
  206. /* XXX - Implement me */
  207. return (0);
  208. }
  209. /*
  210.  * Document me.
  211.  */
  212. unsigned long __init
  213. walnut_get_rtc_time(void)
  214. {
  215. /* XXX - Implement me */
  216. return (0);
  217. }
  218. /*
  219.  * void __init walnut_calibrate_decr()
  220.  *
  221.  * Description:
  222.  *   This routine retrieves the internal processor frequency from the board
  223.  *   information structure, sets up the kernel timer decrementer based on
  224.  *   that value, enables the 403 programmable interval timer (PIT) and sets
  225.  *   it up for auto-reload.
  226.  *
  227.  * Input(s):
  228.  *   N/A
  229.  *
  230.  * Output(s):
  231.  *   N/A
  232.  *
  233.  * Returns:
  234.  *   N/A
  235.  *
  236.  */
  237. void __init
  238. walnut_calibrate_decr(void)
  239. {
  240. unsigned int freq;
  241. bd_t *bip = (bd_t *)__res;
  242. freq = bip->bi_intfreq;
  243. decrementer_count = freq / HZ;
  244. count_period_num = 1;
  245. count_period_den = freq;
  246. /* Enable the PIT and set auto-reload of its value */
  247. mtspr(SPRN_TCR, TCR_PIE | TCR_ARE);
  248. /* Clear any pending timer interrupts */
  249. mtspr(SPRN_TSR, TSR_ENW | TSR_WIS | TSR_PIS | TSR_FIS);
  250. }