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

Message ID 1299503160-9910-2-git-send-email-jason.hui@linaro.org
State New
Headers show

Commit Message

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

Comments

Shawn Guo March 7, 2011, 2:17 p.m. | #1
On Mon, Mar 07, 2011 at 09:05:58PM +0800, Jason Liu wrote:
> Signed-off-by: Jason Liu <r64343@freescale.com>
> ---
>  arch/arm/mach-mx5/Kconfig               |    8 ++++
>  arch/arm/mach-mx5/Makefile              |    1 +
>  arch/arm/mach-mx5/board-dt.c            |   64 +++++++++++++++++++++++++++++++
>  arch/arm/mach-mx5/clock-mx51-mx53.c     |   43 ++++++++++++++++++++-
>  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..6438f87 100644
> --- a/arch/arm/mach-mx5/Kconfig
> +++ b/arch/arm/mach-mx5/Kconfig
> @@ -47,6 +47,14 @@ 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
> +	select SOC_IMX51
> +	help
> +	 Support for generic Freescale i.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

If board-dt.c is mx51 specific, would it be sane to name it something
like board-mx51-dt.c?  We have mx53 stuff in this folder as well.
Shawn Guo March 7, 2011, 2:23 p.m. | #2
On Mon, Mar 07, 2011 at 09:05:58PM +0800, Jason Liu wrote:
> Signed-off-by: Jason Liu <r64343@freescale.com>
> ---
[...]
> diff --git a/arch/arm/mach-mx5/board-dt.c b/arch/arm/mach-mx5/board-dt.c
> new file mode 100644
> index 0000000..90593f5
> --- /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 * const mx51_dt_board_compat[] = {

The extra 'const' is introducing the warning below.

arch/arm/mach-mx5/board-dt.c:69: warning: initialization discards qualifiers from pointer target type

> +	"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
Arnd Bergmann March 7, 2011, 2:37 p.m. | #3
On Monday 07 March 2011, Shawn Guo wrote:
> > 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
> 
> If board-dt.c is mx51 specific, would it be sane to name it something
> like board-mx51-dt.c?  We have mx53 stuff in this folder as well.
> 

Alternatively, it could be done the other way round: rename the identifiers
in the file from mx51_ to mx5_, and make sure that they don't contain
any mx51 specific settings but always refer to properties in the 
device tree for the differences.

	Arnd
Shawn Guo March 7, 2011, 2:46 p.m. | #4
Hi Arnd,

On Mon, Mar 07, 2011 at 03:37:48PM +0100, Arnd Bergmann wrote:
> On Monday 07 March 2011, Shawn Guo wrote:
> > > 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
> > 
> > If board-dt.c is mx51 specific, would it be sane to name it something
> > like board-mx51-dt.c?  We have mx53 stuff in this folder as well.
> > 
> 
> Alternatively, it could be done the other way round: rename the identifiers
> in the file from mx51_ to mx5_, and make sure that they don't contain
> any mx51 specific settings but always refer to properties in the 
> device tree for the differences.
> 
So our ultimate goal is to have only one board-dt.c in one mach-xxx?
Arnd Bergmann March 7, 2011, 2:52 p.m. | #5
On Monday 07 March 2011, Shawn Guo wrote:
> > Alternatively, it could be done the other way round: rename the identifiers
> > in the file from mx51_ to mx5_, and make sure that they don't contain
> > any mx51 specific settings but always refer to properties in the 
> > device tree for the differences.
> > 
> So our ultimate goal is to have only one board-dt.c in one mach-xxx?

I wouldn't make that a strict rule, but I'd say that one goal should be
to have as few board-dt files as possible without adding complexity.

As a start, we can say we want one file for per set of machines that
can run a common binary kernel, but there may be good reasons for
deviating from that rule on both sides.

	Arnd
Grant Likely March 7, 2011, 4:26 p.m. | #6
On Mon, Mar 7, 2011 at 7:52 AM, Arnd Bergmann <arnd@arndb.de> wrote:
> On Monday 07 March 2011, Shawn Guo wrote:
>> > Alternatively, it could be done the other way round: rename the identifiers
>> > in the file from mx51_ to mx5_, and make sure that they don't contain
>> > any mx51 specific settings but always refer to properties in the
>> > device tree for the differences.
>> >
>> So our ultimate goal is to have only one board-dt.c in one mach-xxx?
>
> I wouldn't make that a strict rule, but I'd say that one goal should be
> to have as few board-dt files as possible without adding complexity.
>
> As a start, we can say we want one file for per set of machines that
> can run a common binary kernel, but there may be good reasons for
> deviating from that rule on both sides.

+1, I completely agree.

g.
Arnd Bergmann March 10, 2011, 12:38 p.m. | #7
On Monday 07 March 2011, Arnd Bergmann wrote:
> On Monday 07 March 2011, Shawn Guo wrote:
> > > 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
> > 
> > If board-dt.c is mx51 specific, would it be sane to name it something
> > like board-mx51-dt.c?  We have mx53 stuff in this folder as well.
> > 
> 
> Alternatively, it could be done the other way round: rename the identifiers
> in the file from mx51_ to mx5_, and make sure that they don't contain
> any mx51 specific settings but always refer to properties in the 
> device tree for the differences.

Hi Jason,

I saw that your V4 still implements neither Shawn's suggestion nor mine.

	Arnd
Jason Hui March 11, 2011, 3:18 a.m. | #8
Hi, Arnd,

On Thu, Mar 10, 2011 at 8:38 PM, Arnd Bergmann <arnd@arndb.de> wrote:
> On Monday 07 March 2011, Arnd Bergmann wrote:
>> On Monday 07 March 2011, Shawn Guo wrote:
>> > > 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
>> >
>> > If board-dt.c is mx51 specific, would it be sane to name it something
>> > like board-mx51-dt.c?  We have mx53 stuff in this folder as well.
>> >
>>
>> Alternatively, it could be done the other way round: rename the identifiers
>> in the file from mx51_ to mx5_, and make sure that they don't contain
>> any mx51 specific settings but always refer to properties in the
>> device tree for the differences.
>
> Hi Jason,
>
> I saw that your V4 still implements neither Shawn's suggestion nor mine.

As you said, I don't want to make thing complex too. I don't want to
have mx51_dt or
mx53_dt as Shawn Suggests and I still don't want to make it change to
mx5 now as you suggest
Since this patch only support mx51 currently. I think it's easy to
make change later once mx53 in-deed
added in DT support, what do you think?


>
>        Arnd
>
Arnd Bergmann March 11, 2011, 12:10 p.m. | #9
On Friday 11 March 2011, Jason Hui wrote:
> >> Alternatively, it could be done the other way round: rename the identifiers
> >> in the file from mx51_ to mx5_, and make sure that they don't contain
> >> any mx51 specific settings but always refer to properties in the
> >> device tree for the differences.
> >
> > I saw that your V4 still implements neither Shawn's suggestion nor mine.
> 
> As you said, I don't want to make thing complex too. I don't want to
> have mx51_dt or
> mx53_dt as Shawn Suggests and I still don't want to make it change to
> mx5 now as you suggest
> Since this patch only support mx51 currently. I think it's easy to
> make change later once mx53 in-deed
> added in DT support, what do you think?

It would also be easy to rename the file from mx51_dt to board_dt
when it becomes more generic. I don't consider it a show-stopper
though and am comfortable with leaving it to your own judgement.

Generally speaking, you don't have to do everything that reviewers
suggest, but please reply to explain your reasons if you disagree.

	Arnd
Jason Hui March 14, 2011, 5:33 a.m. | #10
Hi, Arnd,

On Fri, Mar 11, 2011 at 8:10 PM, Arnd Bergmann <arnd@arndb.de> wrote:
> On Friday 11 March 2011, Jason Hui wrote:
>> >> Alternatively, it could be done the other way round: rename the identifiers
>> >> in the file from mx51_ to mx5_, and make sure that they don't contain
>> >> any mx51 specific settings but always refer to properties in the
>> >> device tree for the differences.
>> >
>> > I saw that your V4 still implements neither Shawn's suggestion nor mine.
>>
>> As you said, I don't want to make thing complex too. I don't want to
>> have mx51_dt or
>> mx53_dt as Shawn Suggests and I still don't want to make it change to
>> mx5 now as you suggest
>> Since this patch only support mx51 currently. I think it's easy to
>> make change later once mx53 in-deed
>> added in DT support, what do you think?
>
> It would also be easy to rename the file from mx51_dt to board_dt
> when it becomes more generic. I don't consider it a show-stopper
> though and am comfortable with leaving it to your own judgement.

Thanks for the comments. I will keep as it's now.

>
> Generally speaking, you don't have to do everything that reviewers
> suggest, but please reply to explain your reasons if you disagree.

Yes, correct. :)

>
>        Arnd
>

Patch

diff --git a/arch/arm/mach-mx5/Kconfig b/arch/arm/mach-mx5/Kconfig
index de4fa99..6438f87 100644
--- a/arch/arm/mach-mx5/Kconfig
+++ b/arch/arm/mach-mx5/Kconfig
@@ -47,6 +47,14 @@  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
+	select SOC_IMX51
+	help
+	 Support for generic Freescale i.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..90593f5
--- /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 * const 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..dedb7f9 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,38 @@  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)
+			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