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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/arch/arm/mach-sa1100/generic.c
  3.  *
  4.  * Author: Nicolas Pitre
  5.  *
  6.  * Code common to all SA11x0 machines.
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License version 2 as
  10.  * published by the Free Software Foundation.
  11.  *
  12.  * Since this file should be linked before any other machine specific file,
  13.  * the __initcall() here will be executed first.  This serves as default
  14.  * initialization stuff for SA1100 machines which can be overriden later if
  15.  * need be.
  16.  */
  17. #include <linux/config.h>
  18. #include <linux/module.h>
  19. #include <linux/kernel.h>
  20. #include <linux/init.h>
  21. #include <linux/delay.h>
  22. #include <linux/pm.h>
  23. #include <linux/cpufreq.h>
  24. #include <asm/hardware.h>
  25. #include <asm/system.h>
  26. #include <asm/pgtable.h>
  27. #include <asm/mach/map.h>
  28. #include "generic.h"
  29. #define NR_FREQS 16
  30. /*
  31.  * This table is setup for a 3.6864MHz Crystal.
  32.  */
  33. static const unsigned short cclk_frequency_100khz[NR_FREQS] = {
  34.  590, /*  59.0 MHz */
  35.  737, /*  73.7 MHz */
  36.  885,  /*  88.5 MHz */
  37. 1032, /* 103.2 MHz */
  38. 1180, /* 118.0 MHz */
  39. 1327, /* 132.7 MHz */
  40. 1475, /* 147.5 MHz */
  41. 1622, /* 162.2 MHz */
  42. 1769, /* 176.9 MHz */
  43. 1917, /* 191.7 MHz */
  44. 2064, /* 206.4 MHz */
  45. 2212, /* 221.2 MHz */
  46. 2359,   /* 235.9 MHz */
  47. 2507,   /* 250.7 MHz */
  48. 2654,   /* 265.4 MHz */
  49. 2802    /* 280.2 MHz */
  50. };
  51. /*
  52.  * Return the current CPU clock frequency in units of 100kHz
  53.  */
  54. static inline unsigned short get_cclk_frequency(void)
  55. {
  56. return cclk_frequency_100khz[PPCR & 0xf];
  57. }
  58. #ifdef CONFIG_CPU_FREQ
  59. unsigned int sa11x0_freq_to_ppcr(unsigned int khz)
  60. {
  61. int i;
  62. khz /= 100;
  63. for (i = NR_FREQS - 1; i > 0; i--)
  64. if (cclk_frequency_100khz[i] <= khz)
  65. break;
  66. return i;
  67. }
  68. /*
  69.  * Validate the speed in khz.  If we can't generate the precise
  70.  * frequency requested, round it down (to be on the safe side).
  71.  */
  72. unsigned int sa11x0_validatespeed(unsigned int khz)
  73. {
  74. return cclk_frequency_100khz[sa11x0_freq_to_ppcr(khz)] * 100;
  75. }
  76. static int __init sa11x0_init_clock(void)
  77. {
  78. cpufreq_init(cclk_frequency_100khz[PPCR & 0xf] * 100, 59000, 287000);
  79. return 0;
  80. }
  81. __initcall(sa11x0_init_clock);
  82. #else
  83. /*
  84.  * We still need to provide this so building without cpufreq works.
  85.  */ 
  86. unsigned int cpufreq_get(int cpu)
  87. {
  88. return cclk_frequency_100khz[PPCR & 0xf] * 100;
  89. }
  90. EXPORT_SYMBOL(cpufreq_get);
  91. #endif
  92. /*
  93.  * Default power-off for SA1100
  94.  */
  95. static void sa1100_power_off(void)
  96. {
  97. mdelay(100);
  98. cli();
  99. /* disable internal oscillator, float CS lines */
  100. PCFR = (PCFR_OPDE | PCFR_FP | PCFR_FS);
  101. /* enable wake-up on GPIO0 (Assabet...) */
  102. PWER = GFER = GRER = 1;
  103. /*
  104.  * set scratchpad to zero, just in case it is used as a
  105.  * restart address by the bootloader.
  106.  */
  107. PSPR = 0;
  108. /* enter sleep mode */
  109. PMCR = PMCR_SF;
  110. }
  111. static int __init sa1100_init(void)
  112. {
  113. pm_power_off = sa1100_power_off;
  114. return 0;
  115. }
  116. __initcall(sa1100_init);
  117. /*
  118.  * Common I/O mapping:
  119.  *
  120.  * Typically, static virtual address mappings are as follow:
  121.  *
  122.  * 0xe8000000-0xefffffff: flash memory (especially when multiple flash
  123.  *  banks need to be mapped contigously)
  124.  * 0xf0000000-0xf3ffffff: miscellaneous stuff (CPLDs, etc.)
  125.  * 0xf4000000-0xf4ffffff: SA-1111
  126.  * 0xf5000000-0xf5ffffff: reserved (used by cache flushing area)
  127.  * 0xf6000000-0xfffeffff: reserved (internal SA1100 IO defined above)
  128.  * 0xffff0000-0xffff0fff: SA1100 exception vectors
  129.  *
  130.  * Below 0xe8000000 is reserved for vm allocation.
  131.  *
  132.  * The machine specific code must provide the extra mapping beside the
  133.  * default mapping provided here.
  134.  */
  135. static struct map_desc standard_io_desc[] __initdata = {
  136.  /* virtual     physical    length      domain     r  w  c  b */
  137.   { 0xf6000000, 0x20000000, 0x01000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCMCIA0 IO */
  138.   { 0xf7000000, 0x30000000, 0x01000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCMCIA1 IO */
  139.   { 0xf8000000, 0x80000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCM */
  140.   { 0xfa000000, 0x90000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* SCM */
  141.   { 0xfc000000, 0xa0000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* MER */
  142.   { 0xfe000000, 0xb0000000, 0x00200000, DOMAIN_IO, 0, 1, 0, 0 }, /* LCD + DMA */
  143.   LAST_DESC
  144. };
  145. void __init sa1100_map_io(void)
  146. {
  147. iotable_init(standard_io_desc);
  148. }