spear3xx.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /*
  2. * arch/arm/mach-spear3xx/spear3xx.c
  3. *
  4. * SPEAr3XX machines common source file
  5. *
  6. * Copyright (C) 2009-2012 ST Microelectronics
  7. * Viresh Kumar <viresh.kumar@st.com>
  8. *
  9. * This file is licensed under the terms of the GNU General Public
  10. * License version 2. This program is licensed "as is" without any
  11. * warranty of any kind, whether express or implied.
  12. */
  13. #define pr_fmt(fmt) "SPEAr3xx: " fmt
  14. #include <linux/amba/pl022.h>
  15. #include <linux/amba/pl08x.h>
  16. #include <linux/of_irq.h>
  17. #include <linux/io.h>
  18. #include <asm/hardware/pl080.h>
  19. #include <asm/hardware/vic.h>
  20. #include <plat/pl080.h>
  21. #include <mach/generic.h>
  22. #include <mach/spear.h>
  23. /* ssp device registration */
  24. struct pl022_ssp_controller pl022_plat_data = {
  25. .bus_id = 0,
  26. .enable_dma = 1,
  27. .dma_filter = pl08x_filter_id,
  28. .dma_tx_param = "ssp0_tx",
  29. .dma_rx_param = "ssp0_rx",
  30. /*
  31. * This is number of spi devices that can be connected to spi. There are
  32. * two type of chipselects on which slave devices can work. One is chip
  33. * select provided by spi masters other is controlled through external
  34. * gpio's. We can't use chipselect provided from spi master (because as
  35. * soon as FIFO becomes empty, CS is disabled and transfer ends). So
  36. * this number now depends on number of gpios available for spi. each
  37. * slave on each master requires a separate gpio pin.
  38. */
  39. .num_chipselect = 2,
  40. };
  41. /* dmac device registration */
  42. struct pl08x_platform_data pl080_plat_data = {
  43. .memcpy_channel = {
  44. .bus_id = "memcpy",
  45. .cctl = (PL080_BSIZE_16 << PL080_CONTROL_SB_SIZE_SHIFT | \
  46. PL080_BSIZE_16 << PL080_CONTROL_DB_SIZE_SHIFT | \
  47. PL080_WIDTH_32BIT << PL080_CONTROL_SWIDTH_SHIFT | \
  48. PL080_WIDTH_32BIT << PL080_CONTROL_DWIDTH_SHIFT | \
  49. PL080_CONTROL_PROT_BUFF | PL080_CONTROL_PROT_CACHE | \
  50. PL080_CONTROL_PROT_SYS),
  51. },
  52. .lli_buses = PL08X_AHB1,
  53. .mem_buses = PL08X_AHB1,
  54. .get_signal = pl080_get_signal,
  55. .put_signal = pl080_put_signal,
  56. };
  57. /*
  58. * Following will create 16MB static virtual/physical mappings
  59. * PHYSICAL VIRTUAL
  60. * 0xD0000000 0xFD000000
  61. * 0xFC000000 0xFC000000
  62. */
  63. struct map_desc spear3xx_io_desc[] __initdata = {
  64. {
  65. .virtual = VA_SPEAR3XX_ICM1_2_BASE,
  66. .pfn = __phys_to_pfn(SPEAR3XX_ICM1_2_BASE),
  67. .length = SZ_16M,
  68. .type = MT_DEVICE
  69. }, {
  70. .virtual = VA_SPEAR3XX_ICM3_SMI_CTRL_BASE,
  71. .pfn = __phys_to_pfn(SPEAR3XX_ICM3_SMI_CTRL_BASE),
  72. .length = SZ_16M,
  73. .type = MT_DEVICE
  74. },
  75. };
  76. /* This will create static memory mapping for selected devices */
  77. void __init spear3xx_map_io(void)
  78. {
  79. iotable_init(spear3xx_io_desc, ARRAY_SIZE(spear3xx_io_desc));
  80. }
  81. static void __init spear3xx_timer_init(void)
  82. {
  83. char pclk_name[] = "pll3_48m_clk";
  84. struct clk *gpt_clk, *pclk;
  85. spear3xx_clk_init();
  86. /* get the system timer clock */
  87. gpt_clk = clk_get_sys("gpt0", NULL);
  88. if (IS_ERR(gpt_clk)) {
  89. pr_err("%s:couldn't get clk for gpt\n", __func__);
  90. BUG();
  91. }
  92. /* get the suitable parent clock for timer*/
  93. pclk = clk_get(NULL, pclk_name);
  94. if (IS_ERR(pclk)) {
  95. pr_err("%s:couldn't get %s as parent for gpt\n",
  96. __func__, pclk_name);
  97. BUG();
  98. }
  99. clk_set_parent(gpt_clk, pclk);
  100. clk_put(gpt_clk);
  101. clk_put(pclk);
  102. spear_setup_of_timer();
  103. }
  104. struct sys_timer spear3xx_timer = {
  105. .init = spear3xx_timer_init,
  106. };
  107. static const struct of_device_id vic_of_match[] __initconst = {
  108. { .compatible = "arm,pl190-vic", .data = vic_of_init, },
  109. { /* Sentinel */ }
  110. };
  111. void __init spear3xx_dt_init_irq(void)
  112. {
  113. of_irq_init(vic_of_match);
  114. }