[PATCH 2/2] arm/mx5: add device tree support for imx53 boards
Grant Likely
grant.likely at secretlab.ca
Mon Jul 25 16:57:24 EDT 2011
On Mon, Jul 25, 2011 at 11:07:47PM +0800, Shawn Guo wrote:
> It adds device tree support for imx53 boards.
>
> Signed-off-by: Shawn Guo <shawn.guo at linaro.org>
> Cc: Grant Likely <grant.likely at secretlab.ca>
> Cc: Sascha Hauer <s.hauer at pengutronix.de>
> ---
> .../devicetree/bindings/arm/fsl/boards.txt | 15 +
> arch/arm/boot/dts/imx53-ard.dts | 365 +++++++
> arch/arm/boot/dts/imx53-evk.dts | 354 +++++++
> arch/arm/boot/dts/imx53-qsb.dts | 358 +++++++
> arch/arm/boot/dts/imx53-smd.dts | 444 +++++++++
> arch/arm/boot/dts/imx53.dtsi | 1044 ++++++++++++++++++++
> arch/arm/mach-mx5/Kconfig | 8 +
> arch/arm/mach-mx5/Makefile | 1 +
> arch/arm/mach-mx5/imx53-dt.c | 128 +++
> 9 files changed, 2717 insertions(+), 0 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/arm/fsl/boards.txt
> create mode 100644 arch/arm/boot/dts/imx53-ard.dts
> create mode 100644 arch/arm/boot/dts/imx53-evk.dts
> create mode 100644 arch/arm/boot/dts/imx53-qsb.dts
> create mode 100644 arch/arm/boot/dts/imx53-smd.dts
> create mode 100644 arch/arm/boot/dts/imx53.dtsi
> create mode 100644 arch/arm/mach-mx5/imx53-dt.c
>
> diff --git a/Documentation/devicetree/bindings/arm/fsl/boards.txt b/Documentation/devicetree/bindings/arm/fsl/boards.txt
> new file mode 100644
> index 0000000..7603905
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/arm/fsl/boards.txt
> @@ -0,0 +1,15 @@
> +i.MX53 Automotive Reference Design Board
> +Required root node properties:
> + - compatible = "fsl,mx53-ard", "fsl,mx53";
> +
> +i.MX53 Evaluation Kit
> +Required root node properties:
> + - compatible = "fsl,mx53-evk", "fsl,mx53";
> +
> +i.MX53 Quick Start Board
> +Required root node properties:
> + - compatible = "fsl,mx53-qsb", "fsl,mx53";
> +
> +i.MX53 Smart Mobile Reference Design Board
> +Required root node properties:
> + - compatible = "fsl,mx53-smd", "fsl,mx53";
w00t! Documentation! :-)
[...]
> diff --git a/arch/arm/mach-mx5/Kconfig b/arch/arm/mach-mx5/Kconfig
> index 53422d2..9f60dc1 100644
> --- a/arch/arm/mach-mx5/Kconfig
> +++ b/arch/arm/mach-mx5/Kconfig
> @@ -173,6 +173,14 @@ endif # ARCH_MX51
> if ARCH_MX53_SUPPORTED
> comment "i.MX53 machines:"
>
> +config MACH_IMX53_DT
> + bool "Support i.MX53 platforms from device tree"
> + select SOC_IMX53
> + select USE_OF
> + help
> + Include support for Freescale i.MX53 based platforms
> + using the device tree for discovery
> +
> config MACH_MX53_EVK
> bool "Support MX53 EVK platforms"
> select SOC_IMX53
> diff --git a/arch/arm/mach-mx5/Makefile b/arch/arm/mach-mx5/Makefile
> index 71379f6..a1fd712 100644
> --- a/arch/arm/mach-mx5/Makefile
> +++ b/arch/arm/mach-mx5/Makefile
> @@ -24,3 +24,4 @@ obj-$(CONFIG_MACH_MX51_EFIKASB) += board-mx51_efikasb.o
> obj-$(CONFIG_MACH_MX50_RDP) += board-mx50_rdp.o
>
> obj-$(CONFIG_OF) += iomuxc-dt.o
> +obj-$(CONFIG_MACH_IMX53_DT) += imx53-dt.o
> diff --git a/arch/arm/mach-mx5/imx53-dt.c b/arch/arm/mach-mx5/imx53-dt.c
> new file mode 100644
> index 0000000..ac06f04
> --- /dev/null
> +++ b/arch/arm/mach-mx5/imx53-dt.c
> @@ -0,0 +1,128 @@
> +/*
> + * Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved.
> + * 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/irq.h>
> +#include <linux/of_platform.h>
> +#include <asm/mach/arch.h>
> +#include <asm/mach/time.h>
> +#include <mach/common.h>
> +#include <mach/hardware.h>
> +#include <mach/mx53.h>
> +
> +/*
> + * Lookup table for attaching a specific name and platform_data pointer to
> + * devices as they get created by of_platform_populate(). Ideally this table
> + * would not exist, but the current clock implementation depends on some devices
> + * having a specific name.
> + */
> +static const struct of_dev_auxdata imx53_auxdata_lookup[] __initconst = {
> + OF_DEV_AUXDATA("fsl,imx53-uart", MX53_UART1_BASE_ADDR, "imx21-uart.0", NULL),
> + OF_DEV_AUXDATA("fsl,imx53-uart", MX53_UART2_BASE_ADDR, "imx21-uart.1", NULL),
> + OF_DEV_AUXDATA("fsl,imx53-uart", MX53_UART3_BASE_ADDR, "imx21-uart.2", NULL),
> + OF_DEV_AUXDATA("fsl,imx53-uart", MX53_UART4_BASE_ADDR, "imx21-uart.3", NULL),
> + OF_DEV_AUXDATA("fsl,imx53-uart", MX53_UART5_BASE_ADDR, "imx21-uart.4", NULL),
> + OF_DEV_AUXDATA("fsl,imx53-fec", MX53_FEC_BASE_ADDR, "imx25-fec.0", NULL),
> + OF_DEV_AUXDATA("fsl,imx53-esdhc", MX53_ESDHC1_BASE_ADDR, "sdhci-esdhc-imx53.0", NULL),
> + OF_DEV_AUXDATA("fsl,imx53-esdhc", MX53_ESDHC2_BASE_ADDR, "sdhci-esdhc-imx53.1", NULL),
> + OF_DEV_AUXDATA("fsl,imx53-esdhc", MX53_ESDHC3_BASE_ADDR, "sdhci-esdhc-imx53.2", NULL),
> + OF_DEV_AUXDATA("fsl,imx53-esdhc", MX53_ESDHC4_BASE_ADDR, "sdhci-esdhc-imx53.3", NULL),
> + OF_DEV_AUXDATA("fsl,imx53-ecspi", MX53_ECSPI1_BASE_ADDR, "imx51-ecspi.0", NULL),
> + OF_DEV_AUXDATA("fsl,imx53-ecspi", MX53_ECSPI2_BASE_ADDR, "imx51-ecspi.1", NULL),
> + OF_DEV_AUXDATA("fsl,imx53-cspi", MX53_CSPI_BASE_ADDR, "imx35-cspi.0", NULL),
> + OF_DEV_AUXDATA("fsl,imx53-i2c", MX53_I2C1_BASE_ADDR, "imx-i2c.0", NULL),
> + OF_DEV_AUXDATA("fsl,imx53-i2c", MX53_I2C2_BASE_ADDR, "imx-i2c.1", NULL),
> + OF_DEV_AUXDATA("fsl,imx53-i2c", MX53_I2C3_BASE_ADDR, "imx-i2c.2", NULL),
> + OF_DEV_AUXDATA("fsl,imx53-sdma", MX53_SDMA_BASE_ADDR, "imx35-sdma", NULL),
> + OF_DEV_AUXDATA("fsl,imx53-wdt", MX53_WDOG1_BASE_ADDR, "imx2-wdt.0", NULL),
> + { /* sentinel */ }
> +};
> +
> +static const struct of_device_id imx53_tzic_of_match[] __initconst = {
> + { .compatible = "fsl,imx53-tzic", },
> + { /* sentinel */ }
> +};
> +
> +static const struct of_device_id imx53_iomuxc_of_match[] __initconst = {
> + { .compatible = "fsl,imx53-iomuxc", },
> + { /* sentinel */ }
> +};
> +
> +/* Configure EIM for SMSC LAN9220 */
> +static void __init imx53_ard_eim_config(void)
> +{
> + u32 val;
> + void __iomem *eim_base, *iomuxc_base;
> +
> + eim_base = ioremap(MX53_WEIM_BASE_ADDR, SZ_4K);
> + iomuxc_base = ioremap(MX53_IOMUXC_BASE_ADDR, SZ_4K);
> + if (!eim_base || !iomuxc_base) {
> + pr_warn("%s: ioremap failed\n", __func__);
> + return;
> + }
> +
> + /* CS1 timings for LAN9220 */
> + writel(0x20001, (eim_base + 0x18));
> + writel(0x0, (eim_base + 0x1c));
> + writel(0x16000202, (eim_base + 0x20));
> + writel(0x00000002, (eim_base + 0x24));
> + writel(0x16002082, (eim_base + 0x28));
> + writel(0x00000000, (eim_base + 0x2c));
> + writel(0x00000000, (eim_base + 0x90));
> +
> + /* specify 64 MB on CS1 and CS0 on GPR1 */
> + val = readl(iomuxc_base + 0x4);
> + val &= ~0x3f;
> + val |= 0x1b;
> + writel(val, (iomuxc_base + 0x4));
> +
> + iounmap(eim_base);
> + iounmap(iomuxc_base);
> +}
> +
> +static void __init imx53_dt_init(void)
> +{
> + if (of_machine_is_compatible("fsl,imx53-ard"))
> + imx53_ard_eim_config();
Create a separate DT_MACHINE_START section for the fsl,imx53-ard, and
create it's own init function that does the eim config before calling
imx53_dt_init(). In the long run it is cleaner to use a separate
DT_MACHINE_START for the special cases; at least until they can be
generalized away. Multiple DT_MACHINE_START sections can exist in
this file.
> +
> + mxc_iomuxc_dt_init(imx53_iomuxc_of_match);
> +
> + irq_domain_generate_simple(imx53_tzic_of_match, MX53_TZIC_BASE_ADDR, 0);
> +
> + of_platform_populate(NULL, of_default_bus_match_table,
> + imx53_auxdata_lookup, NULL);
> +}
> +
> +static void __init imx53_timer_init(void)
> +{
> + mx53_clocks_init(32768, 24000000, 22579200, 0);
> +}
> +
> +static struct sys_timer imx53_timer = {
> + .init = imx53_timer_init,
> +};
> +
> +static const char *imx53_dt_board_compat[] __initdata = {
> + "fsl,imx53-ard",
> + "fsl,imx53-evk",
> + "fsl,imx53-qsb",
> + "fsl,imx53-smd",
> + NULL
> +};
> +
> +DT_MACHINE_START(IMX53_DT, "Freescale i.MX53 (Device Tree Support)")
> + .map_io = mx53_map_io,
> + .init_early = imx53_init_early,
> + .init_irq = mx53_init_irq,
> + .timer = &imx53_timer,
> + .init_machine = imx53_dt_init,
> + .dt_compat = imx53_dt_board_compat,
> +MACHINE_END
Overall, looks pretty good. Feel free to add my Acked-by tag
(contingent on taking another look at the pinmux api, but my only
objection there is that I think the proposed binding will be unwieldy
to use).
g.
More information about the linux-arm-kernel
mailing list