[1/3] arm/dt: add basic mx51 device tree support

Message ID 1298016730-22761-2-git-send-email-r64343@freescale.com
State New
Headers show

Commit Message

Jason Liu Feb. 18, 2011, 8:12 a.m.
Signed-off-by: Jason Liu <r64343@freescale.com>
---
 arch/arm/mach-mx5/Kconfig               |    6 +++
 arch/arm/mach-mx5/Makefile              |    1 +
 arch/arm/mach-mx5/board-dt.c            |   64 +++++++++++++++++++++++++++++++
 arch/arm/mach-mx5/clock-mx51-mx53.c     |   45 +++++++++++++++++++++-
 arch/arm/plat-mxc/include/mach/common.h |    1 +
 5 files changed, 116 insertions(+), 1 deletions(-)

Comments

Shawn Guo Feb. 21, 2011, 8:37 a.m. | #1
Hi Jason,

On 18 February 2011 16:12, Jason Liu <r64343@freescale.com> wrote:
> Signed-off-by: Jason Liu <r64343@freescale.com>
> ---
>  arch/arm/mach-mx5/Kconfig               |    6 +++
>  arch/arm/mach-mx5/Makefile              |    1 +
>  arch/arm/mach-mx5/board-dt.c            |   64 +++++++++++++++++++++++++++++++
>  arch/arm/mach-mx5/clock-mx51-mx53.c     |   45 +++++++++++++++++++++-
>  arch/arm/plat-mxc/include/mach/common.h |    1 +
>  5 files changed, 116 insertions(+), 1 deletions(-)
>
> diff --git a/arch/arm/mach-mx5/Kconfig b/arch/arm/mach-mx5/Kconfig
> index de4fa99..5fbbd36 100644
> --- a/arch/arm/mach-mx5/Kconfig
> +++ b/arch/arm/mach-mx5/Kconfig
> @@ -47,6 +47,12 @@ config MACH_MX51_BABBAGE
>          u-boot. This includes specific configurations for the board and its
>          peripherals.
>
> +config MACH_MX51_DT
> +       bool "Generic MX51 board (FDT support)"
> +       select USE_OF
> +       help
> +         Support for generic Freescale MX51 boards using Flattened Device Tree.
> +

We may at least need to select SOC_IMX51 here, otherwise it does not
even build if MACH_MX51_DT is the only machine being selected (e.g.
none of any other mx51 machine being selected together).

And tab is being used throughout the file for indentation, but you
are using spaces here.

>  config MACH_MX51_3DS
>        bool "Support MX51PDK (3DS)"
>        select SOC_IMX51
Shawn Guo Feb. 28, 2011, 6:48 a.m. | #2
On 18 February 2011 16:12, Jason Liu <r64343@freescale.com> wrote:
> Signed-off-by: Jason Liu <r64343@freescale.com>
> ---
>  arch/arm/mach-mx5/Kconfig               |    6 +++
>  arch/arm/mach-mx5/Makefile              |    1 +
>  arch/arm/mach-mx5/board-dt.c            |   64 +++++++++++++++++++++++++++++++
>  arch/arm/mach-mx5/clock-mx51-mx53.c     |   45 +++++++++++++++++++++-
>  arch/arm/plat-mxc/include/mach/common.h |    1 +
>  5 files changed, 116 insertions(+), 1 deletions(-)
>
[...]
> diff --git a/arch/arm/mach-mx5/clock-mx51-mx53.c b/arch/arm/mach-mx5/clock-mx51-mx53.c
> index 0a19e75..b8a608e 100644
> --- a/arch/arm/mach-mx5/clock-mx51-mx53.c
> +++ b/arch/arm/mach-mx5/clock-mx51-mx53.c
> @@ -15,13 +15,19 @@
>  #include <linux/clk.h>
>  #include <linux/io.h>
>  #include <linux/clkdev.h>
> -
> +#include <linux/err.h>
>  #include <asm/div64.h>
>
>  #include <mach/hardware.h>
>  #include <mach/common.h>
>  #include <mach/clock.h>
>
> +#ifdef CONFIG_OF
> +#include <linux/of.h>
> +#include <linux/of_address.h>
> +#include <linux/of_clk.h>
> +#endif /* CONFIG_OF */
> +
>  #include "crm_regs.h"
>
>  /* External clock values passed-in by the board code */
> @@ -1432,3 +1438,40 @@ int __init mx53_clocks_init(unsigned long ckil, unsigned long osc,
>                MX53_INT_GPT);
>        return 0;
>  }
> +
> +#ifdef CONFIG_OF
> +static struct clk* mx5_dt_clk_get(struct device_node *np,
> +                                       const char *output_id, void *data)
> +{
> +       return data;
> +}
> +
> +static __init void mx5_dt_scan_clks(void)
> +{
> +       struct device_node *node;
> +       struct clk *clk;
> +       const char *id;
> +       int rc;
> +
> +       for_each_compatible_node(node, NULL, "clock") {
> +               id = of_get_property(node, "clock-outputs", NULL);
> +               if (!id)
> +                       continue;
> +
> +               clk = clk_get_sys(id, NULL);
> +               if (IS_ERR(clk))
> +                       continue;
> +
> +               rc = of_clk_add_provider(node, mx5_dt_clk_get, clk);
> +               if (rc) {
> +                       kfree(clk);

In this particular implementation, kfree here may not be needed, as
all the "clk" are currently created in the static way.  And I'm trying
to change it to the dynamic way by scanning clock node from dt,
creating and registering the "clk" correspondingly.

> +                       pr_err("error adding fixed clk %s\n", node->name);
> +               }
> +       }
> +}
> +
> +void __init mx5_clk_dt_init(void)
> +{
> +       mx5_dt_scan_clks();
> +}
> +#endif
Jason Hui March 7, 2011, 5:05 a.m. | #3
Hi, Shawn,

On Mon, Feb 28, 2011 at 2:48 PM, Shawn Guo <shawn.guo@linaro.org> wrote:
> On 18 February 2011 16:12, Jason Liu <r64343@freescale.com> wrote:
>> Signed-off-by: Jason Liu <r64343@freescale.com>
>> ---
>>  arch/arm/mach-mx5/Kconfig               |    6 +++
>>  arch/arm/mach-mx5/Makefile              |    1 +
>>  arch/arm/mach-mx5/board-dt.c            |   64 +++++++++++++++++++++++++++++++
>>  arch/arm/mach-mx5/clock-mx51-mx53.c     |   45 +++++++++++++++++++++-
>>  arch/arm/plat-mxc/include/mach/common.h |    1 +
>>  5 files changed, 116 insertions(+), 1 deletions(-)
>>
> [...]
>> diff --git a/arch/arm/mach-mx5/clock-mx51-mx53.c b/arch/arm/mach-mx5/clock-mx51-mx53.c
>> index 0a19e75..b8a608e 100644
>> --- a/arch/arm/mach-mx5/clock-mx51-mx53.c
>> +++ b/arch/arm/mach-mx5/clock-mx51-mx53.c
>> @@ -15,13 +15,19 @@
>>  #include <linux/clk.h>
>>  #include <linux/io.h>
>>  #include <linux/clkdev.h>
>> -
>> +#include <linux/err.h>
>>  #include <asm/div64.h>
>>
>>  #include <mach/hardware.h>
>>  #include <mach/common.h>
>>  #include <mach/clock.h>
>>
>> +#ifdef CONFIG_OF
>> +#include <linux/of.h>
>> +#include <linux/of_address.h>
>> +#include <linux/of_clk.h>
>> +#endif /* CONFIG_OF */
>> +
>>  #include "crm_regs.h"
>>
>>  /* External clock values passed-in by the board code */
>> @@ -1432,3 +1438,40 @@ int __init mx53_clocks_init(unsigned long ckil, unsigned long osc,
>>                MX53_INT_GPT);
>>        return 0;
>>  }
>> +
>> +#ifdef CONFIG_OF
>> +static struct clk* mx5_dt_clk_get(struct device_node *np,
>> +                                       const char *output_id, void *data)
>> +{
>> +       return data;
>> +}
>> +
>> +static __init void mx5_dt_scan_clks(void)
>> +{
>> +       struct device_node *node;
>> +       struct clk *clk;
>> +       const char *id;
>> +       int rc;
>> +
>> +       for_each_compatible_node(node, NULL, "clock") {
>> +               id = of_get_property(node, "clock-outputs", NULL);
>> +               if (!id)
>> +                       continue;
>> +
>> +               clk = clk_get_sys(id, NULL);
>> +               if (IS_ERR(clk))
>> +                       continue;
>> +
>> +               rc = of_clk_add_provider(node, mx5_dt_clk_get, clk);
>> +               if (rc) {
>> +                       kfree(clk);
>
> In this particular implementation, kfree here may not be needed, as
> all the "clk" are currently created in the static way.  And I'm trying
> to change it to the dynamic way by scanning clock node from dt,
> creating and registering the "clk" correspondingly.

Yes, I will look into your dynamic way, but before the you real patch come up,
I will use the static one to do it currently.

>
>> +                       pr_err("error adding fixed clk %s\n", node->name);
>> +               }
>> +       }
>> +}
>> +
>> +void __init mx5_clk_dt_init(void)
>> +{
>> +       mx5_dt_scan_clks();
>> +}
>> +#endif
>
> --
> Regards,
> Shawn
>
> _______________________________________________
> linaro-dev mailing list
> linaro-dev@lists.linaro.org
> http://lists.linaro.org/mailman/listinfo/linaro-dev
>

Patch

diff --git a/arch/arm/mach-mx5/Kconfig b/arch/arm/mach-mx5/Kconfig
index de4fa99..5fbbd36 100644
--- a/arch/arm/mach-mx5/Kconfig
+++ b/arch/arm/mach-mx5/Kconfig
@@ -47,6 +47,12 @@  config MACH_MX51_BABBAGE
 	  u-boot. This includes specific configurations for the board and its
 	  peripherals.
 
+config MACH_MX51_DT
+       bool "Generic MX51 board (FDT support)"
+       select USE_OF
+       help
+         Support for generic Freescale MX51 boards using Flattened Device Tree.
+
 config MACH_MX51_3DS
 	bool "Support MX51PDK (3DS)"
 	select SOC_IMX51
diff --git a/arch/arm/mach-mx5/Makefile b/arch/arm/mach-mx5/Makefile
index 0d43be9..540697e 100644
--- a/arch/arm/mach-mx5/Makefile
+++ b/arch/arm/mach-mx5/Makefile
@@ -18,3 +18,4 @@  obj-$(CONFIG_MACH_EUKREA_CPUIMX51SD) += board-cpuimx51sd.o
 obj-$(CONFIG_MACH_EUKREA_MBIMXSD51_BASEBOARD) += eukrea_mbimxsd-baseboard.o
 obj-$(CONFIG_MACH_MX51_EFIKAMX) += board-mx51_efikamx.o
 obj-$(CONFIG_MACH_MX50_RDP) += board-mx50_rdp.o
+obj-$(CONFIG_MACH_MX51_DT) += board-dt.o
diff --git a/arch/arm/mach-mx5/board-dt.c b/arch/arm/mach-mx5/board-dt.c
new file mode 100644
index 0000000..78ecd12
--- /dev/null
+++ b/arch/arm/mach-mx5/board-dt.c
@@ -0,0 +1,64 @@ 
+/*
+ * Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/dma-mapping.h>
+#include <linux/of_platform.h>
+#include <linux/of_fdt.h>
+
+#include <mach/common.h>
+#include <mach/hardware.h>
+#include <mach/imx-uart.h>
+#include <mach/iomux-mx51.h>
+
+#include <asm/irq.h>
+#include <asm/setup.h>
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/time.h>
+
+#include "devices.h"
+
+static struct of_device_id mx51_dt_match_table[] __initdata = {
+	{ .compatible = "simple-bus", },
+	{}
+};
+
+static void __init mx51_dt_board_init(void)
+{
+	of_platform_bus_probe(NULL, mx51_dt_match_table, NULL);
+}
+
+static void __init mx51_dt_timer_init(void)
+{
+	mx51_clocks_init(32768, 24000000, 22579200, 0);
+	mx5_clk_dt_init();
+}
+
+static struct sys_timer mxc_timer = {
+	.init = mx51_dt_timer_init,
+};
+
+static const char * mx51_dt_board_compat[] = {
+	"fsl,mx51_babbage",
+	NULL
+};
+
+DT_MACHINE_START(MX51_DT, "Freescale MX51 (Flattened Device Tree)")
+	.boot_params  = PHYS_OFFSET + 0x100,
+	.map_io       = mx51_map_io,
+	.init_irq     = mx51_init_irq,
+	.init_machine = mx51_dt_board_init,
+	.dt_compat    = mx51_dt_board_compat,
+	.timer        = &mxc_timer,
+MACHINE_END
diff --git a/arch/arm/mach-mx5/clock-mx51-mx53.c b/arch/arm/mach-mx5/clock-mx51-mx53.c
index 0a19e75..b8a608e 100644
--- a/arch/arm/mach-mx5/clock-mx51-mx53.c
+++ b/arch/arm/mach-mx5/clock-mx51-mx53.c
@@ -15,13 +15,19 @@ 
 #include <linux/clk.h>
 #include <linux/io.h>
 #include <linux/clkdev.h>
-
+#include <linux/err.h>
 #include <asm/div64.h>
 
 #include <mach/hardware.h>
 #include <mach/common.h>
 #include <mach/clock.h>
 
+#ifdef CONFIG_OF
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_clk.h>
+#endif /* CONFIG_OF */
+
 #include "crm_regs.h"
 
 /* External clock values passed-in by the board code */
@@ -1432,3 +1438,40 @@  int __init mx53_clocks_init(unsigned long ckil, unsigned long osc,
 		MX53_INT_GPT);
 	return 0;
 }
+
+#ifdef CONFIG_OF
+static struct clk* mx5_dt_clk_get(struct device_node *np,
+					const char *output_id, void *data)
+{
+	return data;
+}
+
+static __init void mx5_dt_scan_clks(void)
+{
+	struct device_node *node;
+	struct clk *clk;
+	const char *id;
+	int rc;
+
+	for_each_compatible_node(node, NULL, "clock") {
+		id = of_get_property(node, "clock-outputs", NULL);
+		if (!id)
+			continue;
+
+		clk = clk_get_sys(id, NULL);
+		if (IS_ERR(clk))
+			continue;
+
+		rc = of_clk_add_provider(node, mx5_dt_clk_get, clk);
+		if (rc) {
+			kfree(clk);
+			pr_err("error adding fixed clk %s\n", node->name);
+		}
+	}
+}
+
+void __init mx5_clk_dt_init(void)
+{
+	mx5_dt_scan_clks();
+}
+#endif
diff --git a/arch/arm/plat-mxc/include/mach/common.h b/arch/arm/plat-mxc/include/mach/common.h
index aea2cd3..a28e84a 100644
--- a/arch/arm/plat-mxc/include/mach/common.h
+++ b/arch/arm/plat-mxc/include/mach/common.h
@@ -58,4 +58,5 @@  extern void mxc91231_arch_reset(int, const char *);
 extern void mxc91231_prepare_idle(void);
 extern void mx51_efikamx_reset(void);
 extern int mx53_revision(void);
+extern void mx5_clk_dt_init(void);
 #endif