Patchwork [5/6] arm/imx6q: add device tree machine support

login
register
mail settings
Submitter Shawn Guo
Date Sept. 6, 2011, 9:58 a.m.
Message ID <1315303120-24203-6-git-send-email-shawn.guo@linaro.org>
Download mbox | patch
Permalink /patch/113523/
State New
Headers show

Comments

Shawn Guo - Sept. 6, 2011, 9:58 a.m.
It adds generic device tree based machine support for imx6q.

Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
---
 arch/arm/mach-imx/Kconfig               |   13 +++++
 arch/arm/mach-imx/Makefile              |    1 +
 arch/arm/mach-imx/mach-imx6q.c          |   81 +++++++++++++++++++++++++++++++
 arch/arm/mm/Kconfig                     |    2 +-
 arch/arm/plat-mxc/include/mach/common.h |   13 +++++
 5 files changed, 109 insertions(+), 1 deletions(-)
 create mode 100644 arch/arm/mach-imx/mach-imx6q.c
Arnd Bergmann - Sept. 6, 2011, 6:55 p.m.
On Tuesday 06 September 2011 17:58:39 Shawn Guo wrote:

> diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
> index 13e0301..3364b59 100644
> --- a/arch/arm/mach-imx/Kconfig
> +++ b/arch/arm/mach-imx/Kconfig
> @@ -624,3 +624,16 @@ config MACH_VPR200
>  	  configurations for the board and its peripherals.
>  
>  endif
> +
> +if ARCH_MX6
> +comment "i.MX6 machines:"
> +
> +config MACH_IMX6Q
> +	bool "Support i.MX6 Quad platforms from device tree"
> +	select SOC_IMX6Q
> +	select USE_OF
> +	help
> +	  Include support for Freescale i.MX6 Quad based platforms
> +	  using the device tree for discovery
> +
> +endif

As we have done on zynq and prima2, I would suggest not to add multiple
machines types at all. You already have the intialization in a generic
imx6q file, it would be logical to get rid of the configuration entry
as well.

What you can still have is config options for optional drivers that
might be needed for one soc but not another.

	Arnd
Shawn Guo - Sept. 7, 2011, 3:07 a.m.
On Tue, Sep 06, 2011 at 08:55:45PM +0200, Arnd Bergmann wrote:
> On Tuesday 06 September 2011 17:58:39 Shawn Guo wrote:
> 
> > diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
> > index 13e0301..3364b59 100644
> > --- a/arch/arm/mach-imx/Kconfig
> > +++ b/arch/arm/mach-imx/Kconfig
> > @@ -624,3 +624,16 @@ config MACH_VPR200
> >  	  configurations for the board and its peripherals.
> >  
> >  endif
> > +
> > +if ARCH_MX6
> > +comment "i.MX6 machines:"
> > +
> > +config MACH_IMX6Q
> > +	bool "Support i.MX6 Quad platforms from device tree"
> > +	select SOC_IMX6Q
> > +	select USE_OF
> > +	help
> > +	  Include support for Freescale i.MX6 Quad based platforms
> > +	  using the device tree for discovery
> > +
> > +endif
> 
> As we have done on zynq and prima2, I would suggest not to add multiple
> machines types at all. You already have the intialization in a generic
> imx6q file, it would be logical to get rid of the configuration entry
> as well.
> 
This MACH_IMX6Q was added to make the IMX6Q Kconfig hierarchy look
consistent with other SoCs in arch/arm/mach-imx/Kconfig.  If you
do not like it, I can kill it.
Arnd Bergmann - Sept. 7, 2011, 7:26 a.m.
On Wednesday 07 September 2011 11:07:34 Shawn Guo wrote:
> On Tue, Sep 06, 2011 at 08:55:45PM +0200, Arnd Bergmann wrote:
> > On Tuesday 06 September 2011 17:58:39 Shawn Guo wrote:
> > 
> > > diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
> > > index 13e0301..3364b59 100644
> > > --- a/arch/arm/mach-imx/Kconfig
> > > +++ b/arch/arm/mach-imx/Kconfig
> > > @@ -624,3 +624,16 @@ config MACH_VPR200
> > >       configurations for the board and its peripherals.
> > >  
> > >  endif
> > > +
> > > +if ARCH_MX6
> > > +comment "i.MX6 machines:"
> > > +
> > > +config MACH_IMX6Q
> > > +   bool "Support i.MX6 Quad platforms from device tree"
> > > +   select SOC_IMX6Q
> > > +   select USE_OF
> > > +   help
> > > +     Include support for Freescale i.MX6 Quad based platforms
> > > +     using the device tree for discovery
> > > +
> > > +endif
> > 
> > As we have done on zynq and prima2, I would suggest not to add multiple
> > machines types at all. You already have the intialization in a generic
> > imx6q file, it would be logical to get rid of the configuration entry
> > as well.
> > 
> This MACH_IMX6Q was added to make the IMX6Q Kconfig hierarchy look
> consistent with other SoCs in arch/arm/mach-imx/Kconfig.  If you
> do not like it, I can kill it.

Yes, plase do. I think we should in the long run get more platforms
to do the same, it will be a sign that mx6 is part of the new generation.

	Arnd

Patch

diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index 13e0301..3364b59 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -624,3 +624,16 @@  config MACH_VPR200
 	  configurations for the board and its peripherals.
 
 endif
+
+if ARCH_MX6
+comment "i.MX6 machines:"
+
+config MACH_IMX6Q
+	bool "Support i.MX6 Quad platforms from device tree"
+	select SOC_IMX6Q
+	select USE_OF
+	help
+	  Include support for Freescale i.MX6 Quad based platforms
+	  using the device tree for discovery
+
+endif
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
index d46b2e7..84bd18c 100644
--- a/arch/arm/mach-imx/Makefile
+++ b/arch/arm/mach-imx/Makefile
@@ -71,3 +71,4 @@  obj-$(CONFIG_SMP) += platsmp.o
 obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
 obj-$(CONFIG_LOCAL_TIMERS) += localtimer.o
 obj-$(CONFIG_SOC_IMX6Q) += clock-imx6q.o
+obj-$(CONFIG_MACH_IMX6Q) += mach-imx6q.o
diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c
new file mode 100644
index 0000000..b55f972
--- /dev/null
+++ b/arch/arm/mach-imx/mach-imx6q.c
@@ -0,0 +1,81 @@ 
+/*
+ * Copyright 2011 Freescale Semiconductor, Inc.
+ * Copyright 2011 Linaro Ltd.
+ *
+ * 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/init.h>
+#include <linux/irq.h>
+#include <linux/irqdomain.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+#include <asm/hardware/cache-l2x0.h>
+#include <asm/hardware/gic.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/time.h>
+#include <mach/common.h>
+#include <mach/hardware.h>
+
+static void __init imx6q_init_machine(void)
+{
+	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+}
+
+static void __init imx6q_map_io(void)
+{
+	imx_lluart_map_io();
+	imx_scu_map_io();
+}
+
+static void __init imx6q_init_irq(void)
+{
+	struct device_node *np;
+	struct of_intc_desc desc;
+	int gpio_irq_base = MXC_GPIO_IRQ_START + ARCH_NR_GPIOS;
+
+	l2x0_of_init(0, ~0UL);
+
+	memset(&desc, 0, sizeof(desc));
+	desc.controller = of_find_compatible_node(NULL, NULL,
+						  "arm,cortex-a9-gic");
+	gic_of_init(&desc);
+	imx_gpc_init();
+
+	np = desc.controller;
+	for_each_child_of_node(np, desc.controller)
+		gic_of_ppi_init(&desc);
+
+	for_each_compatible_node(np, NULL, "fsl,imx6q-gpio") {
+		gpio_irq_base -= 32;
+		irq_domain_add_simple(np, gpio_irq_base);
+	}
+}
+
+static void __init imx6q_timer_init(void)
+{
+	mx6q_clocks_init(32768, 24000000, 0, 0);
+}
+
+static struct sys_timer imx6q_timer = {
+	.init = imx6q_timer_init,
+};
+
+static const char *imx6q_dt_compat[] __initdata = {
+	"fsl,imx6q-sabreauto",
+	NULL,
+};
+
+DT_MACHINE_START(IMX6Q, "Freescale i.MX6 Quad (Device Tree)")
+	.map_io		= imx6q_map_io,
+	.init_irq	= imx6q_init_irq,
+	.timer		= &imx6q_timer,
+	.init_machine	= imx6q_init_machine,
+	.dt_compat	= imx6q_dt_compat,
+MACHINE_END
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig
index 88633fe..c3ce146 100644
--- a/arch/arm/mm/Kconfig
+++ b/arch/arm/mm/Kconfig
@@ -822,7 +822,7 @@  config CACHE_L2X0
 		   REALVIEW_EB_A9MP || SOC_IMX35 || SOC_IMX31 || MACH_REALVIEW_PBX || \
 		   ARCH_NOMADIK || ARCH_OMAP4 || ARCH_EXYNOS4 || ARCH_TEGRA || \
 		   ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || ARCH_SHMOBILE || \
-		   ARCH_PRIMA2 || ARCH_ZYNQ || ARCH_CNS3XXX
+		   ARCH_PRIMA2 || ARCH_ZYNQ || ARCH_CNS3XXX || ARCH_MX6
 	default y
 	select OUTER_CACHE
 	select OUTER_CACHE_SYNC
diff --git a/arch/arm/plat-mxc/include/mach/common.h b/arch/arm/plat-mxc/include/mach/common.h
index 73da910..ff86063 100644
--- a/arch/arm/plat-mxc/include/mach/common.h
+++ b/arch/arm/plat-mxc/include/mach/common.h
@@ -64,6 +64,8 @@  extern int mx51_clocks_init(unsigned long ckil, unsigned long osc,
 			unsigned long ckih1, unsigned long ckih2);
 extern int mx53_clocks_init(unsigned long ckil, unsigned long osc,
 			unsigned long ckih1, unsigned long ckih2);
+extern int mx6q_clocks_init(unsigned long ckil, unsigned long osc,
+			unsigned long ckih1, unsigned long ckih2);
 extern struct platform_device *mxc_register_gpio(char *name, int id,
 	resource_size_t iobase, resource_size_t iosize, int irq, int irq_high);
 extern int mxc_register_device(struct platform_device *pdev, void *data);
@@ -73,6 +75,17 @@  extern void mx51_efikamx_reset(void);
 extern int mx53_revision(void);
 extern int mx53_display_revision(void);
 
+#ifdef CONFIG_DEBUG_LL
+extern void imx_lluart_map_io(void);
+#else
+static inline void imx_lluart_map_io(void) {}
+#endif
+#ifdef CONFIG_SMP
+extern void imx_scu_map_io(void);
+#else
+static inline void imx_scu_map_io(void) {}
+#endif
 extern void imx_enable_cpu(int cpu, bool enable);
 extern void imx_set_cpu_jump(int cpu, void *jump_addr);
+extern void imx_gpc_init(void);
 #endif