diff options
author | Denis 'GNUtoo' Carikli <GNUtoo@no-log.org> | 2012-07-09 15:39:12 -0400 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-07-10 13:23:03 -0400 |
commit | d2a37b3d91f46da25e7ff34f582e914a4cc0bfee (patch) | |
tree | b26ef7571c8c56df62f3cf25931063d7e8af6b8c /arch | |
parent | 5349f2a89e6a31c8d39c4ec2618b9dd6e421c415 (diff) |
ARM i.MX31: Add devicetree support
This patch adds basic devicetree support for i.MX31 based SoCs.
Only the UART and interrupts bindings are added.
Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@no-log.org>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/boot/dts/imx31.dtsi | 88 | ||||
-rw-r--r-- | arch/arm/mach-imx/Kconfig | 8 | ||||
-rw-r--r-- | arch/arm/mach-imx/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/mach-imx/clk-imx31.c | 19 | ||||
-rw-r--r-- | arch/arm/mach-imx/imx31-dt.c | 63 | ||||
-rw-r--r-- | arch/arm/plat-mxc/include/mach/common.h | 1 |
6 files changed, 180 insertions, 0 deletions
diff --git a/arch/arm/boot/dts/imx31.dtsi b/arch/arm/boot/dts/imx31.dtsi new file mode 100644 index 000000000000..eef7099f3e3c --- /dev/null +++ b/arch/arm/boot/dts/imx31.dtsi | |||
@@ -0,0 +1,88 @@ | |||
1 | /* | ||
2 | * Copyright 2012 Denis 'GNUtoo' Carikli <GNUtoo@no-log.org> | ||
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 | |||
12 | /include/ "skeleton.dtsi" | ||
13 | |||
14 | / { | ||
15 | aliases { | ||
16 | serial0 = &uart1; | ||
17 | serial1 = &uart2; | ||
18 | serial2 = &uart3; | ||
19 | serial3 = &uart4; | ||
20 | serial4 = &uart5; | ||
21 | }; | ||
22 | |||
23 | avic: avic-interrupt-controller@60000000 { | ||
24 | compatible = "fsl,imx31-avic", "fsl,avic"; | ||
25 | interrupt-controller; | ||
26 | #interrupt-cells = <1>; | ||
27 | reg = <0x60000000 0x100000>; | ||
28 | }; | ||
29 | |||
30 | soc { | ||
31 | #address-cells = <1>; | ||
32 | #size-cells = <1>; | ||
33 | compatible = "simple-bus"; | ||
34 | interrupt-parent = <&avic>; | ||
35 | ranges; | ||
36 | |||
37 | aips@43f00000 { /* AIPS1 */ | ||
38 | compatible = "fsl,aips-bus", "simple-bus"; | ||
39 | #address-cells = <1>; | ||
40 | #size-cells = <1>; | ||
41 | reg = <0x43f00000 0x100000>; | ||
42 | ranges; | ||
43 | |||
44 | uart1: serial@43f90000 { | ||
45 | compatible = "fsl,imx31-uart", "fsl,imx21-uart"; | ||
46 | reg = <0x43f90000 0x4000>; | ||
47 | interrupts = <45>; | ||
48 | status = "disabled"; | ||
49 | }; | ||
50 | |||
51 | uart2: serial@43f94000 { | ||
52 | compatible = "fsl,imx31-uart", "fsl,imx21-uart"; | ||
53 | reg = <0x43f94000 0x4000>; | ||
54 | interrupts = <32>; | ||
55 | status = "disabled"; | ||
56 | }; | ||
57 | |||
58 | uart4: serial@43fb0000 { | ||
59 | compatible = "fsl,imx31-uart", "fsl,imx21-uart"; | ||
60 | reg = <0x43fb0000 0x4000>; | ||
61 | interrupts = <46>; | ||
62 | status = "disabled"; | ||
63 | }; | ||
64 | |||
65 | uart5: serial@43fb4000 { | ||
66 | compatible = "fsl,imx31-uart", "fsl,imx21-uart"; | ||
67 | reg = <0x43fb4000 0x4000>; | ||
68 | interrupts = <47>; | ||
69 | status = "disabled"; | ||
70 | }; | ||
71 | }; | ||
72 | |||
73 | spba@50000000 { | ||
74 | compatible = "fsl,spba-bus", "simple-bus"; | ||
75 | #address-cells = <1>; | ||
76 | #size-cells = <1>; | ||
77 | reg = <0x50000000 0x100000>; | ||
78 | ranges; | ||
79 | |||
80 | uart3: serial@5000c000 { | ||
81 | compatible = "fsl,imx31-uart", "fsl,imx21-uart"; | ||
82 | reg = <0x5000c000 0x4000>; | ||
83 | interrupts = <18>; | ||
84 | status = "disabled"; | ||
85 | }; | ||
86 | }; | ||
87 | }; | ||
88 | }; | ||
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index eff4db5de0dd..46f5c3fc9276 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig | |||
@@ -557,6 +557,14 @@ config MACH_BUG | |||
557 | Include support for BUGBase 1.3 platform. This includes specific | 557 | Include support for BUGBase 1.3 platform. This includes specific |
558 | configurations for the board and its peripherals. | 558 | configurations for the board and its peripherals. |
559 | 559 | ||
560 | config MACH_IMX31_DT | ||
561 | bool "Support i.MX31 platforms from device tree" | ||
562 | select SOC_IMX31 | ||
563 | select USE_OF | ||
564 | help | ||
565 | Include support for Freescale i.MX31 based platforms | ||
566 | using the device tree for discovery. | ||
567 | |||
560 | comment "MX35 platforms:" | 568 | comment "MX35 platforms:" |
561 | 569 | ||
562 | config MACH_PCM043 | 570 | config MACH_PCM043 |
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index ff29421414f2..07f7c226e4cf 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile | |||
@@ -57,6 +57,7 @@ obj-$(CONFIG_MACH_QONG) += mach-qong.o | |||
57 | obj-$(CONFIG_MACH_ARMADILLO5X0) += mach-armadillo5x0.o | 57 | obj-$(CONFIG_MACH_ARMADILLO5X0) += mach-armadillo5x0.o |
58 | obj-$(CONFIG_MACH_KZM_ARM11_01) += mach-kzm_arm11_01.o | 58 | obj-$(CONFIG_MACH_KZM_ARM11_01) += mach-kzm_arm11_01.o |
59 | obj-$(CONFIG_MACH_BUG) += mach-bug.o | 59 | obj-$(CONFIG_MACH_BUG) += mach-bug.o |
60 | obj-$(CONFIG_MACH_IMX31_DT) += imx31-dt.o | ||
60 | 61 | ||
61 | # i.MX35 based machines | 62 | # i.MX35 based machines |
62 | obj-$(CONFIG_MACH_PCM043) += mach-pcm043.o | 63 | obj-$(CONFIG_MACH_PCM043) += mach-pcm043.o |
diff --git a/arch/arm/mach-imx/clk-imx31.c b/arch/arm/mach-imx/clk-imx31.c index c9a06d800f8e..f87a48fc74e1 100644 --- a/arch/arm/mach-imx/clk-imx31.c +++ b/arch/arm/mach-imx/clk-imx31.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/clkdev.h> | 20 | #include <linux/clkdev.h> |
21 | #include <linux/io.h> | 21 | #include <linux/io.h> |
22 | #include <linux/err.h> | 22 | #include <linux/err.h> |
23 | #include <linux/of.h> | ||
23 | 24 | ||
24 | #include <mach/hardware.h> | 25 | #include <mach/hardware.h> |
25 | #include <mach/mx31.h> | 26 | #include <mach/mx31.h> |
@@ -179,3 +180,21 @@ int __init mx31_clocks_init(unsigned long fref) | |||
179 | 180 | ||
180 | return 0; | 181 | return 0; |
181 | } | 182 | } |
183 | |||
184 | #ifdef CONFIG_OF | ||
185 | int __init mx31_clocks_init_dt(void) | ||
186 | { | ||
187 | struct device_node *np; | ||
188 | u32 fref = 26000000; /* default */ | ||
189 | |||
190 | for_each_compatible_node(np, NULL, "fixed-clock") { | ||
191 | if (!of_device_is_compatible(np, "fsl,imx-osc26m")) | ||
192 | continue; | ||
193 | |||
194 | if (!of_property_read_u32(np, "clock-frequency", &fref)) | ||
195 | break; | ||
196 | } | ||
197 | |||
198 | return mx31_clocks_init(fref); | ||
199 | } | ||
200 | #endif | ||
diff --git a/arch/arm/mach-imx/imx31-dt.c b/arch/arm/mach-imx/imx31-dt.c new file mode 100644 index 000000000000..a68ba207b2b7 --- /dev/null +++ b/arch/arm/mach-imx/imx31-dt.c | |||
@@ -0,0 +1,63 @@ | |||
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 | |||
12 | #include <linux/irq.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/mx31.h> | ||
19 | |||
20 | static const struct of_dev_auxdata imx31_auxdata_lookup[] __initconst = { | ||
21 | OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART1_BASE_ADDR, | ||
22 | "imx21-uart.0", NULL), | ||
23 | OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART2_BASE_ADDR, | ||
24 | "imx21-uart.1", NULL), | ||
25 | OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART3_BASE_ADDR, | ||
26 | "imx21-uart.2", NULL), | ||
27 | OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART4_BASE_ADDR, | ||
28 | "imx21-uart.3", NULL), | ||
29 | OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART5_BASE_ADDR, | ||
30 | "imx21-uart.4", NULL), | ||
31 | { /* sentinel */ } | ||
32 | }; | ||
33 | |||
34 | static void __init imx31_dt_init(void) | ||
35 | { | ||
36 | of_platform_populate(NULL, of_default_bus_match_table, | ||
37 | imx31_auxdata_lookup, NULL); | ||
38 | } | ||
39 | |||
40 | static void __init imx31_timer_init(void) | ||
41 | { | ||
42 | mx31_clocks_init_dt(); | ||
43 | } | ||
44 | |||
45 | static struct sys_timer imx31_timer = { | ||
46 | .init = imx31_timer_init, | ||
47 | }; | ||
48 | |||
49 | static const char *imx31_dt_board_compat[] __initdata = { | ||
50 | "fsl,imx31", | ||
51 | NULL | ||
52 | }; | ||
53 | |||
54 | DT_MACHINE_START(IMX31_DT, "Freescale i.MX31 (Device Tree Support)") | ||
55 | .map_io = mx31_map_io, | ||
56 | .init_early = imx31_init_early, | ||
57 | .init_irq = mx31_init_irq, | ||
58 | .handle_irq = imx31_handle_irq, | ||
59 | .timer = &imx31_timer, | ||
60 | .init_machine = imx31_dt_init, | ||
61 | .dt_compat = imx31_dt_board_compat, | ||
62 | .restart = mxc_restart, | ||
63 | MACHINE_END | ||
diff --git a/arch/arm/plat-mxc/include/mach/common.h b/arch/arm/plat-mxc/include/mach/common.h index e429ca1b814a..7cfcc44537f0 100644 --- a/arch/arm/plat-mxc/include/mach/common.h +++ b/arch/arm/plat-mxc/include/mach/common.h | |||
@@ -67,6 +67,7 @@ extern int mx51_clocks_init(unsigned long ckil, unsigned long osc, | |||
67 | extern int mx53_clocks_init(unsigned long ckil, unsigned long osc, | 67 | extern int mx53_clocks_init(unsigned long ckil, unsigned long osc, |
68 | unsigned long ckih1, unsigned long ckih2); | 68 | unsigned long ckih1, unsigned long ckih2); |
69 | extern int mx27_clocks_init_dt(void); | 69 | extern int mx27_clocks_init_dt(void); |
70 | extern int mx31_clocks_init_dt(void); | ||
70 | extern int mx51_clocks_init_dt(void); | 71 | extern int mx51_clocks_init_dt(void); |
71 | extern int mx53_clocks_init_dt(void); | 72 | extern int mx53_clocks_init_dt(void); |
72 | extern int mx6q_clocks_init(void); | 73 | extern int mx6q_clocks_init(void); |