setup-r8a7779.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. * r8a7779 processor support
  3. *
  4. * Copyright (C) 2011, 2013 Renesas Solutions Corp.
  5. * Copyright (C) 2011 Magnus Damm
  6. * Copyright (C) 2013 Cogent Embedded, Inc.
  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 as published by
  10. * the Free Software Foundation; version 2 of the License.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. */
  17. #include <linux/clk/renesas.h>
  18. #include <linux/clocksource.h>
  19. #include <linux/init.h>
  20. #include <linux/irq.h>
  21. #include <linux/irqchip.h>
  22. #include <linux/irqchip/arm-gic.h>
  23. #include <asm/mach/arch.h>
  24. #include <asm/mach/map.h>
  25. #include "common.h"
  26. #include "r8a7779.h"
  27. static struct map_desc r8a7779_io_desc[] __initdata = {
  28. /* 2M identity mapping for 0xf0000000 (MPCORE) */
  29. {
  30. .virtual = 0xf0000000,
  31. .pfn = __phys_to_pfn(0xf0000000),
  32. .length = SZ_2M,
  33. .type = MT_DEVICE_NONSHARED
  34. },
  35. /* 16M identity mapping for 0xfexxxxxx (DMAC-S/HPBREG/INTC2/LRAM/DBSC) */
  36. {
  37. .virtual = 0xfe000000,
  38. .pfn = __phys_to_pfn(0xfe000000),
  39. .length = SZ_16M,
  40. .type = MT_DEVICE_NONSHARED
  41. },
  42. };
  43. static void __init r8a7779_map_io(void)
  44. {
  45. debug_ll_io_init();
  46. iotable_init(r8a7779_io_desc, ARRAY_SIZE(r8a7779_io_desc));
  47. }
  48. /* IRQ */
  49. #define INT2SMSKCR0 IOMEM(0xfe7822a0)
  50. #define INT2SMSKCR1 IOMEM(0xfe7822a4)
  51. #define INT2SMSKCR2 IOMEM(0xfe7822a8)
  52. #define INT2SMSKCR3 IOMEM(0xfe7822ac)
  53. #define INT2SMSKCR4 IOMEM(0xfe7822b0)
  54. #define INT2NTSR0 IOMEM(0xfe700060)
  55. #define INT2NTSR1 IOMEM(0xfe700064)
  56. static void __init r8a7779_init_irq_dt(void)
  57. {
  58. irqchip_init();
  59. /* route all interrupts to ARM */
  60. __raw_writel(0xffffffff, INT2NTSR0);
  61. __raw_writel(0x3fffffff, INT2NTSR1);
  62. /* unmask all known interrupts in INTCS2 */
  63. __raw_writel(0xfffffff0, INT2SMSKCR0);
  64. __raw_writel(0xfff7ffff, INT2SMSKCR1);
  65. __raw_writel(0xfffbffdf, INT2SMSKCR2);
  66. __raw_writel(0xbffffffc, INT2SMSKCR3);
  67. __raw_writel(0x003fee3f, INT2SMSKCR4);
  68. }
  69. #define MODEMR 0xffcc0020
  70. static u32 __init r8a7779_read_mode_pins(void)
  71. {
  72. static u32 mode;
  73. static bool mode_valid;
  74. if (!mode_valid) {
  75. void __iomem *modemr = ioremap_nocache(MODEMR, PAGE_SIZE);
  76. BUG_ON(!modemr);
  77. mode = ioread32(modemr);
  78. iounmap(modemr);
  79. mode_valid = true;
  80. }
  81. return mode;
  82. }
  83. static void __init r8a7779_init_time(void)
  84. {
  85. r8a7779_clocks_init(r8a7779_read_mode_pins());
  86. clocksource_probe();
  87. }
  88. static const char *const r8a7779_compat_dt[] __initconst = {
  89. "renesas,r8a7779",
  90. NULL,
  91. };
  92. DT_MACHINE_START(R8A7779_DT, "Generic R8A7779 (Flattened Device Tree)")
  93. .smp = smp_ops(r8a7779_smp_ops),
  94. .map_io = r8a7779_map_io,
  95. .init_early = shmobile_init_delay,
  96. .init_time = r8a7779_init_time,
  97. .init_irq = r8a7779_init_irq_dt,
  98. .init_late = shmobile_init_late,
  99. .dt_compat = r8a7779_compat_dt,
  100. MACHINE_END