setup-sh7619.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*
  2. * SH7619 Setup
  3. *
  4. * Copyright (C) 2006 Yoshinori Sato
  5. *
  6. * This file is subject to the terms and conditions of the GNU General Public
  7. * License. See the file "COPYING" in the main directory of this archive
  8. * for more details.
  9. */
  10. #include <linux/platform_device.h>
  11. #include <linux/init.h>
  12. #include <linux/serial.h>
  13. #include <asm/sci.h>
  14. enum {
  15. UNUSED = 0,
  16. /* interrupt sources */
  17. IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
  18. WDT, EDMAC, CMT0, CMT1,
  19. SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI,
  20. SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI,
  21. SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI,
  22. HIF_HIFI, HIF_HIFBI,
  23. DMAC0, DMAC1, DMAC2, DMAC3,
  24. SIOF,
  25. /* interrupt groups */
  26. SCIF0, SCIF1, SCIF2,
  27. };
  28. static struct intc_vect vectors[] __initdata = {
  29. INTC_IRQ(IRQ0, 64), INTC_IRQ(IRQ1, 65),
  30. INTC_IRQ(IRQ2, 66), INTC_IRQ(IRQ3, 67),
  31. INTC_IRQ(IRQ4, 80), INTC_IRQ(IRQ5, 81),
  32. INTC_IRQ(IRQ6, 82), INTC_IRQ(IRQ7, 83),
  33. INTC_IRQ(WDT, 84), INTC_IRQ(EDMAC, 85),
  34. INTC_IRQ(CMT0, 86), INTC_IRQ(CMT1, 87),
  35. INTC_IRQ(SCIF0_ERI, 88), INTC_IRQ(SCIF0_RXI, 89),
  36. INTC_IRQ(SCIF0_BRI, 90), INTC_IRQ(SCIF0_TXI, 91),
  37. INTC_IRQ(SCIF1_ERI, 92), INTC_IRQ(SCIF1_RXI, 93),
  38. INTC_IRQ(SCIF1_BRI, 94), INTC_IRQ(SCIF1_TXI, 95),
  39. INTC_IRQ(SCIF2_ERI, 96), INTC_IRQ(SCIF2_RXI, 97),
  40. INTC_IRQ(SCIF2_BRI, 98), INTC_IRQ(SCIF2_TXI, 99),
  41. INTC_IRQ(HIF_HIFI, 100), INTC_IRQ(HIF_HIFBI, 101),
  42. INTC_IRQ(DMAC0, 104), INTC_IRQ(DMAC1, 105),
  43. INTC_IRQ(DMAC2, 106), INTC_IRQ(DMAC3, 107),
  44. INTC_IRQ(SIOF, 108),
  45. };
  46. static struct intc_group groups[] __initdata = {
  47. INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI),
  48. INTC_GROUP(SCIF1, SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI),
  49. INTC_GROUP(SCIF2, SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI),
  50. };
  51. static struct intc_prio_reg prio_registers[] __initdata = {
  52. { 0xf8140006, 0, 16, 4, /* IPRA */ { IRQ0, IRQ1, IRQ2, IRQ3 } },
  53. { 0xf8140008, 0, 16, 4, /* IPRB */ { IRQ4, IRQ5, IRQ6, IRQ7 } },
  54. { 0xf8080000, 0, 16, 4, /* IPRC */ { WDT, EDMAC, CMT0, CMT1 } },
  55. { 0xf8080002, 0, 16, 4, /* IPRD */ { SCIF0, SCIF1, SCIF2 } },
  56. { 0xf8080004, 0, 16, 4, /* IPRE */ { HIF_HIFI, HIF_HIFBI } },
  57. { 0xf8080006, 0, 16, 4, /* IPRF */ { DMAC0, DMAC1, DMAC2, DMAC3 } },
  58. { 0xf8080008, 0, 16, 4, /* IPRG */ { SIOF } },
  59. };
  60. static DECLARE_INTC_DESC(intc_desc, "sh7619", vectors, groups,
  61. NULL, NULL, prio_registers, NULL);
  62. static struct plat_sci_port sci_platform_data[] = {
  63. {
  64. .mapbase = 0xf8400000,
  65. .flags = UPF_BOOT_AUTOCONF,
  66. .type = PORT_SCIF,
  67. .irqs = { 88, 89, 91, 90},
  68. }, {
  69. .mapbase = 0xf8410000,
  70. .flags = UPF_BOOT_AUTOCONF,
  71. .type = PORT_SCIF,
  72. .irqs = { 92, 93, 95, 94},
  73. }, {
  74. .mapbase = 0xf8420000,
  75. .flags = UPF_BOOT_AUTOCONF,
  76. .type = PORT_SCIF,
  77. .irqs = { 96, 97, 99, 98},
  78. }, {
  79. .flags = 0,
  80. }
  81. };
  82. static struct platform_device sci_device = {
  83. .name = "sh-sci",
  84. .id = -1,
  85. .dev = {
  86. .platform_data = sci_platform_data,
  87. },
  88. };
  89. static struct platform_device *sh7619_devices[] __initdata = {
  90. &sci_device,
  91. };
  92. static int __init sh7619_devices_setup(void)
  93. {
  94. return platform_add_devices(sh7619_devices,
  95. ARRAY_SIZE(sh7619_devices));
  96. }
  97. __initcall(sh7619_devices_setup);
  98. void __init plat_irq_setup(void)
  99. {
  100. register_intc_controller(&intc_desc);
  101. }