From 2d334297c6b816619d6c2c28bccec3b5a7e8a0d9 Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Wed, 7 Mar 2012 15:04:07 +0000 Subject: ARM: ux500: Initial Device Tree support for Snowball This provides very basic Device Tree support for ST-Ericsson's low-cost development platform, Snowball. If Device Tree for ux500 is enabled and the correct board is configured within the Device Tree blob, the correct *_init_machine() will be called. This patch is based on some original work completed by: Niklas Hernaeus Acked-by: Linus Walleij Signed-off-by: Niklas Hernaeus Signed-off-by: Lee Jones Signed-off-by: Arnd Bergmann --- arch/arm/mach-ux500/board-mop500.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'arch/arm/mach-ux500/board-mop500.c') diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 04afcdf8b0cf..0fb5dfd2ce54 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c @@ -30,6 +30,9 @@ #include #include +#include +#include + #include #include #include @@ -738,3 +741,34 @@ MACHINE_START(SNOWBALL, "Calao Systems Snowball platform") .handle_irq = gic_handle_irq, .init_machine = snowball_init_machine, MACHINE_END + +#ifdef CONFIG_MACH_UX500_DT +static void __init u8500_init_machine(void) +{ + if (of_machine_is_compatible("calaosystems,snowball-a9500")) + return snowball_init_machine(); + else if (of_machine_is_compatible("st-ericsson,hrefv60+")) + return hrefv60_init_machine(); + else if (of_machine_is_compatible("st-ericsson,mop500")) + return mop500_init_machine(); +} + +static const char * u8500_dt_board_compat[] = { + "calaosystems,snowball-a9500", + "st-ericsson,hrefv60+", + "st-ericsson,u8500", + "st-ericsson,mop500", + NULL, +}; + + +DT_MACHINE_START(U8500_DT, "ST-Ericsson U8500 platform (Device Tree Support)") + .map_io = u8500_map_io, + .init_irq = ux500_init_irq, + /* we re-use nomadik timer here */ + .timer = &ux500_timer, + .handle_irq = gic_handle_irq, + .init_machine = u8500_init_machine, + .dt_compat = u8500_dt_board_compat, +MACHINE_END +#endif -- cgit From 7734fed8988d9c563e88f50e48c7b808ce3ab3e5 Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Fri, 2 Mar 2012 22:25:02 +0000 Subject: ARM: ux500: combine the board init functions for DT boot This lets us move over evertything to device tree one by one. Acked-by: Linus Walleij Signed-off-by: Arnd Bergmann Signed-off-by: Lee Jones Signed-off-by: Arnd Bergmann --- arch/arm/mach-ux500/board-mop500.c | 57 ++++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 6 deletions(-) (limited to 'arch/arm/mach-ux500/board-mop500.c') diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 0fb5dfd2ce54..e2932fcba75e 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c @@ -745,12 +745,57 @@ MACHINE_END #ifdef CONFIG_MACH_UX500_DT static void __init u8500_init_machine(void) { - if (of_machine_is_compatible("calaosystems,snowball-a9500")) - return snowball_init_machine(); - else if (of_machine_is_compatible("st-ericsson,hrefv60+")) - return hrefv60_init_machine(); - else if (of_machine_is_compatible("st-ericsson,mop500")) - return mop500_init_machine(); + struct device *parent = NULL; + int i2c0_devs; + int i; + + parent = u8500_init_devices(); + i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices); + + for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++) + mop500_platform_devs[i]->dev.parent = parent; + for (i = 0; i < ARRAY_SIZE(snowball_platform_devs); i++) + snowball_platform_devs[i]->dev.parent = parent; + + + if (of_machine_is_compatible("st-ericsson,mop500")) { + mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR; + mop500_pins_init(); + + platform_add_devices(mop500_platform_devs, + ARRAY_SIZE(mop500_platform_devs)); + + mop500_sdi_init(parent); + } else if (of_machine_is_compatible("calaosystems,snowball-a9500")) { + snowball_pins_init(); + platform_add_devices(snowball_platform_devs, + ARRAY_SIZE(snowball_platform_devs)); + + snowball_sdi_init(parent); + } else if (of_machine_is_compatible("st-ericsson,hrefv60+")) { + /* + * The HREFv60 board removed a GPIO expander and routed + * all these GPIO pins to the internal GPIO controller + * instead. + */ + mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO; + i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES; + hrefv60_pins_init(); + platform_add_devices(mop500_platform_devs, + ARRAY_SIZE(mop500_platform_devs)); + + hrefv60_sdi_init(parent); + } + mop500_i2c_init(parent); + mop500_spi_init(parent); + mop500_uart_init(parent); + + i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs); + i2c_register_board_info(2, mop500_i2c2_devices, + ARRAY_SIZE(mop500_i2c2_devices)); + + /* This board has full regulator constraints */ + regulator_has_full_constraints(); } static const char * u8500_dt_board_compat[] = { -- cgit From 7e0ce270b2ef3d0d00c3f0725f48aa3127d73edf Mon Sep 17 00:00:00 2001 From: Lee Jones Date: Thu, 15 Mar 2012 16:46:17 +0000 Subject: ARM: ux500: db8500: list most devices in the snowball device tree This adds all devices that are normally present through the u8500_init_machine function in the device tree as well, which will duplicate the devices that are visible. This will not do much by itself because the device from the device tree are not matched by any device driver until they are converted as well. The next step is to move over one device at a time to actually be used from the device tree instead of the hardcoded device using auxdata to pass the correct platform_data. Acked-by: Linus Walleij Signed-off-by: Arnd Bergmann Signed-off-by: Lee Jones Signed-off-by: Arnd Bergmann --- arch/arm/mach-ux500/board-mop500.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'arch/arm/mach-ux500/board-mop500.c') diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index e2932fcba75e..482b86ef757d 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c @@ -621,6 +621,7 @@ static void __init mop500_init_machine(void) mop500_pins_init(); + /* FIXME: parent of ab8500 should be prcmu */ for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++) mop500_platform_devs[i]->dev.parent = parent; @@ -743,6 +744,17 @@ MACHINE_START(SNOWBALL, "Calao Systems Snowball platform") MACHINE_END #ifdef CONFIG_MACH_UX500_DT + +struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { + {}, +}; + +static const struct of_device_id u8500_soc_node[] = { + /* only create devices below soc node */ + { .compatible = "stericsson,db8500", }, + { }, +}; + static void __init u8500_init_machine(void) { struct device *parent = NULL; @@ -757,6 +769,8 @@ static void __init u8500_init_machine(void) for (i = 0; i < ARRAY_SIZE(snowball_platform_devs); i++) snowball_platform_devs[i]->dev.parent = parent; + /* automatically probe child nodes of db8500 device */ + of_platform_populate(NULL, u8500_soc_node, u8500_auxdata_lookup, parent); if (of_machine_is_compatible("st-ericsson,mop500")) { mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR; -- cgit From 4905af0e13a665da5f72d2629e93161ba781d03b Mon Sep 17 00:00:00 2001 From: Lee Jones Date: Wed, 7 Mar 2012 17:35:04 +0000 Subject: ARM: ux500: Enable PL011 AMBA UART Controller for Device Tree Enables the 3 UARTs found on a u8500 using DT. Acked-by: Linus Walleij Reviewed-by: Arnd Bergmann Signed-off-by: Lee Jones Signed-off-by: Arnd Bergmann --- arch/arm/mach-ux500/board-mop500.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'arch/arm/mach-ux500/board-mop500.c') diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 482b86ef757d..ea0242a095af 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c @@ -746,6 +746,9 @@ MACHINE_END #ifdef CONFIG_MACH_UX500_DT struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { + OF_DEV_AUXDATA("arm,pl011", 0x80120000, "uart0", &uart0_plat), + OF_DEV_AUXDATA("arm,pl011", 0x80121000, "uart1", &uart1_plat), + OF_DEV_AUXDATA("arm,pl011", 0x80007000, "uart2", &uart2_plat), {}, }; @@ -802,7 +805,6 @@ static void __init u8500_init_machine(void) } mop500_i2c_init(parent); mop500_spi_init(parent); - mop500_uart_init(parent); i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs); i2c_register_board_info(2, mop500_i2c2_devices, -- cgit From 15daf691e8e0119e6c21d3ddf6b4754e66e37365 Mon Sep 17 00:00:00 2001 From: Lee Jones Date: Thu, 15 Mar 2012 16:47:11 +0000 Subject: ARM: ux500: Enable PL022 SSP Controller in Device Tree This SSP Controller supports a number of serial communication methods and as such cannot be registered using of_register_spi_devices. Instead we register it simply as a primecell device. Acked-by: Linus Walleij Acked-by: Arnd Bergmann Signed-off-by: Lee Jones Signed-off-by: Arnd Bergmann --- arch/arm/mach-ux500/board-mop500.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'arch/arm/mach-ux500/board-mop500.c') diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index ea0242a095af..d0799d592218 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c @@ -443,7 +443,7 @@ static struct stedma40_chan_cfg ssp0_dma_cfg_tx = { }; #endif -static struct pl022_ssp_controller ssp0_platform_data = { +static struct pl022_ssp_controller ssp0_plat = { .bus_id = 0, #ifdef CONFIG_STE_DMA40 .enable_dma = 1, @@ -461,7 +461,7 @@ static struct pl022_ssp_controller ssp0_platform_data = { static void __init mop500_spi_init(struct device *parent) { - db8500_add_ssp0(parent, &ssp0_platform_data); + db8500_add_ssp0(parent, &ssp0_plat); } #ifdef CONFIG_STE_DMA40 @@ -749,6 +749,7 @@ struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { OF_DEV_AUXDATA("arm,pl011", 0x80120000, "uart0", &uart0_plat), OF_DEV_AUXDATA("arm,pl011", 0x80121000, "uart1", &uart1_plat), OF_DEV_AUXDATA("arm,pl011", 0x80007000, "uart2", &uart2_plat), + OF_DEV_AUXDATA("arm,pl022", 0x80002000, "ssp0", &ssp0_plat), {}, }; @@ -804,7 +805,6 @@ static void __init u8500_init_machine(void) hrefv60_sdi_init(parent); } mop500_i2c_init(parent); - mop500_spi_init(parent); i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs); i2c_register_board_info(2, mop500_i2c2_devices, -- cgit