pxa910.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /*
  2. * linux/arch/arm/mach-mmp/pxa910.c
  3. *
  4. * Code specific to PXA910
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 as
  8. * published by the Free Software Foundation.
  9. */
  10. #include <linux/module.h>
  11. #include <linux/kernel.h>
  12. #include <linux/init.h>
  13. #include <linux/list.h>
  14. #include <linux/io.h>
  15. #include <asm/mach/time.h>
  16. #include <mach/addr-map.h>
  17. #include <mach/regs-apbc.h>
  18. #include <mach/regs-apmu.h>
  19. #include <mach/cputype.h>
  20. #include <mach/irqs.h>
  21. #include <mach/gpio.h>
  22. #include <mach/dma.h>
  23. #include <mach/mfp.h>
  24. #include <mach/devices.h>
  25. #include "common.h"
  26. #include "clock.h"
  27. #define MFPR_VIRT_BASE (APB_VIRT_BASE + 0x1e000)
  28. static struct mfp_addr_map pxa910_mfp_addr_map[] __initdata =
  29. {
  30. MFP_ADDR_X(GPIO0, GPIO54, 0xdc),
  31. MFP_ADDR_X(GPIO67, GPIO98, 0x1b8),
  32. MFP_ADDR_X(GPIO100, GPIO109, 0x238),
  33. MFP_ADDR(GPIO123, 0xcc),
  34. MFP_ADDR(GPIO124, 0xd0),
  35. MFP_ADDR(DF_IO0, 0x40),
  36. MFP_ADDR(DF_IO1, 0x3c),
  37. MFP_ADDR(DF_IO2, 0x38),
  38. MFP_ADDR(DF_IO3, 0x34),
  39. MFP_ADDR(DF_IO4, 0x30),
  40. MFP_ADDR(DF_IO5, 0x2c),
  41. MFP_ADDR(DF_IO6, 0x28),
  42. MFP_ADDR(DF_IO7, 0x24),
  43. MFP_ADDR(DF_IO8, 0x20),
  44. MFP_ADDR(DF_IO9, 0x1c),
  45. MFP_ADDR(DF_IO10, 0x18),
  46. MFP_ADDR(DF_IO11, 0x14),
  47. MFP_ADDR(DF_IO12, 0x10),
  48. MFP_ADDR(DF_IO13, 0xc),
  49. MFP_ADDR(DF_IO14, 0x8),
  50. MFP_ADDR(DF_IO15, 0x4),
  51. MFP_ADDR(DF_nCS0_SM_nCS2, 0x44),
  52. MFP_ADDR(DF_nCS1_SM_nCS3, 0x48),
  53. MFP_ADDR(SM_nCS0, 0x4c),
  54. MFP_ADDR(SM_nCS1, 0x50),
  55. MFP_ADDR(DF_WEn, 0x54),
  56. MFP_ADDR(DF_REn, 0x58),
  57. MFP_ADDR(DF_CLE_SM_OEn, 0x5c),
  58. MFP_ADDR(DF_ALE_SM_WEn, 0x60),
  59. MFP_ADDR(SM_SCLK, 0x64),
  60. MFP_ADDR(DF_RDY0, 0x68),
  61. MFP_ADDR(SM_BE0, 0x6c),
  62. MFP_ADDR(SM_BE1, 0x70),
  63. MFP_ADDR(SM_ADV, 0x74),
  64. MFP_ADDR(DF_RDY1, 0x78),
  65. MFP_ADDR(SM_ADVMUX, 0x7c),
  66. MFP_ADDR(SM_RDY, 0x80),
  67. MFP_ADDR_X(MMC1_DAT7, MMC1_WP, 0x84),
  68. MFP_ADDR_END,
  69. };
  70. #define APMASK(i) (GPIO_REGS_VIRT + BANK_OFF(i) + 0x09c)
  71. static void __init pxa910_init_gpio(void)
  72. {
  73. int i;
  74. /* enable GPIO clock */
  75. __raw_writel(APBC_APBCLK | APBC_FNCLK, APBC_PXA910_GPIO);
  76. /* unmask GPIO edge detection for all 4 banks - APMASKx */
  77. for (i = 0; i < 4; i++)
  78. __raw_writel(0xffffffff, APMASK(i));
  79. pxa_init_gpio(IRQ_PXA910_AP_GPIO, 0, 127, NULL);
  80. }
  81. void __init pxa910_init_irq(void)
  82. {
  83. icu_init_irq();
  84. pxa910_init_gpio();
  85. }
  86. /* APB peripheral clocks */
  87. static APBC_CLK(uart1, PXA910_UART0, 1, 14745600);
  88. static APBC_CLK(uart2, PXA910_UART1, 1, 14745600);
  89. /* device and clock bindings */
  90. static struct clk_lookup pxa910_clkregs[] = {
  91. INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL),
  92. INIT_CLKREG(&clk_uart2, "pxa2xx-uart.1", NULL),
  93. };
  94. static int __init pxa910_init(void)
  95. {
  96. if (cpu_is_pxa910()) {
  97. mfp_init_base(MFPR_VIRT_BASE);
  98. mfp_init_addr(pxa910_mfp_addr_map);
  99. pxa_init_dma(IRQ_PXA910_DMA_INT0, 32);
  100. clks_register(ARRAY_AND_SIZE(pxa910_clkregs));
  101. }
  102. return 0;
  103. }
  104. postcore_initcall(pxa910_init);
  105. /* system timer - clock enabled, 3.25MHz */
  106. #define TIMER_CLK_RST (APBC_APBCLK | APBC_FNCLK | APBC_FNCLKSEL(3))
  107. static void __init pxa910_timer_init(void)
  108. {
  109. /* reset and configure */
  110. __raw_writel(APBC_APBCLK | APBC_RST, APBC_PXA910_TIMERS);
  111. __raw_writel(TIMER_CLK_RST, APBC_PXA910_TIMERS);
  112. timer_init(IRQ_PXA910_AP1_TIMER1);
  113. }
  114. struct sys_timer pxa910_timer = {
  115. .init = pxa910_timer_init,
  116. };
  117. /* on-chip devices */
  118. /* NOTE: there are totally 3 UARTs on PXA910:
  119. *
  120. * UART1 - Slow UART (can be used both by AP and CP)
  121. * UART2/3 - Fast UART
  122. *
  123. * To be backward compatible with the legacy FFUART/BTUART/STUART sequence,
  124. * they are re-ordered as:
  125. *
  126. * pxa910_device_uart1 - UART2 as FFUART
  127. * pxa910_device_uart2 - UART3 as BTUART
  128. *
  129. * UART1 is not used by AP for the moment.
  130. */
  131. PXA910_DEVICE(uart1, "pxa2xx-uart", 0, UART2, 0xd4017000, 0x30, 21, 22);
  132. PXA910_DEVICE(uart2, "pxa2xx-uart", 1, UART3, 0xd4018000, 0x30, 23, 24);