spear3xx.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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 <vireshk@kernel.org>
  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/pl080.h>
  16. #include <linux/clk.h>
  17. #include <linux/io.h>
  18. #include <asm/mach/map.h>
  19. #include "pl080.h"
  20. #include "generic.h"
  21. #include <mach/spear.h>
  22. #include <mach/misc_regs.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_memcpy =
  46. (PL080_BSIZE_16 << PL080_CONTROL_SB_SIZE_SHIFT | \
  47. PL080_BSIZE_16 << PL080_CONTROL_DB_SIZE_SHIFT | \
  48. PL080_WIDTH_32BIT << PL080_CONTROL_SWIDTH_SHIFT | \
  49. PL080_WIDTH_32BIT << PL080_CONTROL_DWIDTH_SHIFT | \
  50. PL080_CONTROL_PROT_BUFF | PL080_CONTROL_PROT_CACHE | \
  51. PL080_CONTROL_PROT_SYS),
  52. },
  53. .lli_buses = PL08X_AHB1,
  54. .mem_buses = PL08X_AHB1,
  55. .get_xfer_signal = pl080_get_signal,
  56. .put_xfer_signal = pl080_put_signal,
  57. };
  58. /*
  59. * Following will create 16MB static virtual/physical mappings
  60. * PHYSICAL VIRTUAL
  61. * 0xD0000000 0xFD000000
  62. * 0xFC000000 0xFC000000
  63. */
  64. struct map_desc spear3xx_io_desc[] __initdata = {
  65. {
  66. .virtual = (unsigned long)VA_SPEAR_ICM1_2_BASE,
  67. .pfn = __phys_to_pfn(SPEAR_ICM1_2_BASE),
  68. .length = SZ_16M,
  69. .type = MT_DEVICE
  70. }, {
  71. .virtual = (unsigned long)VA_SPEAR_ICM3_SMI_CTRL_BASE,
  72. .pfn = __phys_to_pfn(SPEAR_ICM3_SMI_CTRL_BASE),
  73. .length = SZ_16M,
  74. .type = MT_DEVICE
  75. },
  76. };
  77. /* This will create static memory mapping for selected devices */
  78. void __init spear3xx_map_io(void)
  79. {
  80. iotable_init(spear3xx_io_desc, ARRAY_SIZE(spear3xx_io_desc));
  81. }
  82. void __init spear3xx_timer_init(void)
  83. {
  84. char pclk_name[] = "pll3_clk";
  85. struct clk *gpt_clk, *pclk;
  86. spear3xx_clk_init(MISC_BASE, VA_SPEAR320_SOC_CONFIG_BASE);
  87. /* get the system timer clock */
  88. gpt_clk = clk_get_sys("gpt0", NULL);
  89. if (IS_ERR(gpt_clk)) {
  90. pr_err("%s:couldn't get clk for gpt\n", __func__);
  91. BUG();
  92. }
  93. /* get the suitable parent clock for timer*/
  94. pclk = clk_get(NULL, pclk_name);
  95. if (IS_ERR(pclk)) {
  96. pr_err("%s:couldn't get %s as parent for gpt\n",
  97. __func__, pclk_name);
  98. BUG();
  99. }
  100. clk_set_parent(gpt_clk, pclk);
  101. clk_put(gpt_clk);
  102. clk_put(pclk);
  103. spear_setup_of_timer();
  104. }