imx27-dt.c 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * Copyright 2012 Sascha Hauer, Pengutronix
  3. *
  4. * The code contained herein is licensed under the GNU General Public
  5. * License. You may obtain a copy of the GNU General Public License
  6. * Version 2 or later at the following locations:
  7. *
  8. * http://www.opensource.org/licenses/gpl-license.html
  9. * http://www.gnu.org/copyleft/gpl.html
  10. */
  11. #include <linux/irq.h>
  12. #include <linux/irqdomain.h>
  13. #include <linux/of_irq.h>
  14. #include <linux/of_platform.h>
  15. #include <asm/mach/arch.h>
  16. #include <asm/mach/time.h>
  17. #include <mach/common.h>
  18. #include <mach/mx27.h>
  19. static const struct of_dev_auxdata imx27_auxdata_lookup[] __initconst = {
  20. OF_DEV_AUXDATA("fsl,imx27-uart", MX27_UART1_BASE_ADDR, "imx21-uart.0", NULL),
  21. OF_DEV_AUXDATA("fsl,imx27-uart", MX27_UART2_BASE_ADDR, "imx21-uart.1", NULL),
  22. OF_DEV_AUXDATA("fsl,imx27-uart", MX27_UART3_BASE_ADDR, "imx21-uart.2", NULL),
  23. OF_DEV_AUXDATA("fsl,imx27-fec", MX27_FEC_BASE_ADDR, "imx27-fec.0", NULL),
  24. OF_DEV_AUXDATA("fsl,imx27-i2c", MX27_I2C1_BASE_ADDR, "imx-i2c.0", NULL),
  25. OF_DEV_AUXDATA("fsl,imx27-i2c", MX27_I2C2_BASE_ADDR, "imx-i2c.1", NULL),
  26. OF_DEV_AUXDATA("fsl,imx27-cspi", MX27_CSPI1_BASE_ADDR, "imx27-cspi.0", NULL),
  27. OF_DEV_AUXDATA("fsl,imx27-cspi", MX27_CSPI2_BASE_ADDR, "imx27-cspi.1", NULL),
  28. OF_DEV_AUXDATA("fsl,imx27-cspi", MX27_CSPI3_BASE_ADDR, "imx27-cspi.2", NULL),
  29. OF_DEV_AUXDATA("fsl,imx27-wdt", MX27_WDOG_BASE_ADDR, "imx2-wdt.0", NULL),
  30. { /* sentinel */ }
  31. };
  32. static int __init imx27_avic_add_irq_domain(struct device_node *np,
  33. struct device_node *interrupt_parent)
  34. {
  35. irq_domain_add_legacy(np, 64, 0, 0, &irq_domain_simple_ops, NULL);
  36. return 0;
  37. }
  38. static int __init imx27_gpio_add_irq_domain(struct device_node *np,
  39. struct device_node *interrupt_parent)
  40. {
  41. static int gpio_irq_base = MXC_GPIO_IRQ_START + ARCH_NR_GPIOS;
  42. gpio_irq_base -= 32;
  43. irq_domain_add_legacy(np, 32, gpio_irq_base, 0, &irq_domain_simple_ops,
  44. NULL);
  45. return 0;
  46. }
  47. static const struct of_device_id imx27_irq_match[] __initconst = {
  48. { .compatible = "fsl,imx27-avic", .data = imx27_avic_add_irq_domain, },
  49. { .compatible = "fsl,imx27-gpio", .data = imx27_gpio_add_irq_domain, },
  50. { /* sentinel */ }
  51. };
  52. static void __init imx27_dt_init(void)
  53. {
  54. of_irq_init(imx27_irq_match);
  55. of_platform_populate(NULL, of_default_bus_match_table,
  56. imx27_auxdata_lookup, NULL);
  57. }
  58. static void __init imx27_timer_init(void)
  59. {
  60. mx27_clocks_init_dt();
  61. }
  62. static struct sys_timer imx27_timer = {
  63. .init = imx27_timer_init,
  64. };
  65. static const char *imx27_dt_board_compat[] __initdata = {
  66. "fsl,imx27",
  67. NULL
  68. };
  69. DT_MACHINE_START(IMX27_DT, "Freescale i.MX27 (Device Tree Support)")
  70. .map_io = mx27_map_io,
  71. .init_early = imx27_init_early,
  72. .init_irq = mx27_init_irq,
  73. .handle_irq = imx27_handle_irq,
  74. .timer = &imx27_timer,
  75. .init_machine = imx27_dt_init,
  76. .dt_compat = imx27_dt_board_compat,
  77. .restart = mxc_restart,
  78. MACHINE_END