[PATCH 5/6] ARM: integrator: convert AMBA devices to device tree
Jean-Christophe PLAGNIOL-VILLARD
plagnioj at jcrosoft.com
Thu Aug 16 08:40:02 EDT 2012
On 14:16 Thu 16 Aug , Linus Walleij wrote:
> This converts the AMBA (PrimeCell) devices on the Integrator/AP
> and Integrator/CP over to probing from the Device Tree if the
> kernel is compiled for Device Tree support.
>
> We continue to #ifdef out all non-DT code and vice versa on
> respective boot type to get a clean cut.
>
> We need to add a bunch of auxdata (compare to the Versatile)
> to handle bus names and callbacks alike.
>
> Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
> ---
> arch/arm/boot/dts/integratorap.dts | 47 +++++++++++++
> arch/arm/boot/dts/integratorcp.dts | 64 ++++++++++++++++++
> arch/arm/mach-integrator/common.h | 2 +
> arch/arm/mach-integrator/core.c | 8 ++-
> arch/arm/mach-integrator/integrator_ap.c | 109 ++++++++++++++++++++++---------
> arch/arm/mach-integrator/integrator_cp.c | 97 +++++++++++++++++----------
> 6 files changed, 261 insertions(+), 66 deletions(-)
>
> diff --git a/arch/arm/boot/dts/integratorap.dts b/arch/arm/boot/dts/integratorap.dts
> index a40d1ec0..303d001 100644
> --- a/arch/arm/boot/dts/integratorap.dts
> +++ b/arch/arm/boot/dts/integratorap.dts
> @@ -23,4 +23,51 @@
> clear-mask = <0xffffffff>;
> valid-mask = <0x003fffff>;
> };
> +
> + fpga {
> + compatible = "arm,amba-bus", "simple-bus";
> + #address-cells = <1>;
> + #size-cells = <1>;
> + ranges;
> +
> + rtc: rtc at 15000000 {
> + compatible = "arm,pl031", "arm,primecell";
> + reg = <0x15000000 0x1000>;
> + interrupt-parent = <&pic>;
> + interrupts = <8>;
> + arm,primecell-periphid = <0x00041030>;
> + };
> +
> + uart0: uart at 16000000 {
> + compatible = "arm,pl011", "arm,primecell";
> + reg = <0x16000000 0x1000>;
> + interrupt-parent = <&pic>;
> + interrupts = <1>;
> + arm,primecell-periphid = <0x00041010>;
> + };
> +
> + uart1: uart at 17000000 {
> + compatible = "arm,pl011", "arm,primecell";
> + reg = <0x17000000 0x1000>;
> + interrupt-parent = <&pic>;
> + interrupts = <2>;
> + arm,primecell-periphid = <0x00041010>;
> + };
> +
> + kmi0: kmi at 18000000 {
> + compatible = "arm,pl050", "arm,primecell";
> + reg = <0x18000000 0x1000>;
> + interrupt-parent = <&pic>;
> + interrupts = <3>;
> + arm,primecell-periphid = <0x00041050>;
> + };
> +
> + kmi1: kmi at 19000000 {
> + compatible = "arm,pl050", "arm,primecell";
> + reg = <0x19000000 0x1000>;
> + interrupt-parent = <&pic>;
> + interrupts = <4>;
> + arm,primecell-periphid = <0x00041050>;
> + };
> + };
> };
> diff --git a/arch/arm/boot/dts/integratorcp.dts b/arch/arm/boot/dts/integratorcp.dts
> index b6ca10f..517d420 100644
> --- a/arch/arm/boot/dts/integratorcp.dts
> +++ b/arch/arm/boot/dts/integratorcp.dts
> @@ -43,4 +43,68 @@
> clear-mask = <0x00000fff>;
> valid-mask = <0x00000fff>;
> };
> +
> + fpga {
> + compatible = "arm,amba-bus", "simple-bus";
> + #address-cells = <1>;
> + #size-cells = <1>;
> + ranges;
> +
> + rtc: rtc at 15000000 {
> + compatible = "arm,pl031", "arm,primecell";
> + reg = <0x15000000 0x1000>;
> + interrupt-parent = <&pic>;
> + interrupts = <8>;
> + };
> +
> + uart0: uart at 16000000 {
> + compatible = "arm,pl011", "arm,primecell";
> + reg = <0x16000000 0x1000>;
> + interrupt-parent = <&pic>;
> + interrupts = <1>;
> + };
> +
> + uart1: uart at 17000000 {
> + compatible = "arm,pl011", "arm,primecell";
> + reg = <0x17000000 0x1000>;
> + interrupt-parent = <&pic>;
> + interrupts = <2>;
> + };
> +
> + kmi0: kmi at 18000000 {
> + compatible = "arm,pl050", "arm,primecell";
> + reg = <0x18000000 0x1000>;
> + interrupt-parent = <&pic>;
> + interrupts = <3>;
> + };
> +
> + kmi1: kmi at 19000000 {
> + compatible = "arm,pl050", "arm,primecell";
> + reg = <0x19000000 0x1000>;
> + interrupt-parent = <&pic>;
> + interrupts = <4>;
> + };
> +
> + mmci: mmc at 1C000000 {
> + compatible = "arm,pl180", "arm,primecell";
> + reg = <0x1C000000 0x1000>;
> + interrupt-parent = <&pic>;
> + interrupts = <23 24>;
> + max-frequency = <515633>;
> + };
> +
> + aaci: aaci at 1D000000 {
> + compatible = "arm,pl041", "arm,primecell";
> + reg = <0x1D000000 0x1000>;
> + interrupt-parent = <&pic>;
> + interrupts = <25>;
> + };
> +
> + clcd: clcd at c0000000 {
> + compatible = "arm,pl110", "arm,primecell";
> + reg = <0xC0000000 0x1000>;
> + interrupt-parent = <&pic>;
> + interrupts = <22>;
> + };
> + };
> };
> diff --git a/arch/arm/mach-integrator/common.h b/arch/arm/mach-integrator/common.h
> index c4338e2..c3ff21b 100644
> --- a/arch/arm/mach-integrator/common.h
> +++ b/arch/arm/mach-integrator/common.h
> @@ -1,3 +1,5 @@
> +#include <linux/amba/serial.h>
> +extern struct amba_pl010_data integrator_uart_data;
> void integrator_init_early(void);
> int integrator_init(bool is_cp);
> void integrator_reserve(void);
> diff --git a/arch/arm/mach-integrator/core.c b/arch/arm/mach-integrator/core.c
> index 67ea181..42890c8 100644
> --- a/arch/arm/mach-integrator/core.c
> +++ b/arch/arm/mach-integrator/core.c
> @@ -33,7 +33,9 @@
> #include <asm/mach/time.h>
> #include <asm/pgtable.h>
>
> -static struct amba_pl010_data integrator_uart_data;
> +#include "common.h"
> +
> +#ifndef CONFIG_OF
>
> #define INTEGRATOR_RTC_IRQ { IRQ_RTCINT }
> #define INTEGRATOR_UART0_IRQ { IRQ_UARTINT0 }
> @@ -86,6 +88,8 @@ int __init integrator_init(bool is_cp)
> return 0;
> }
>
> +#endif
> +
> /*
> * On the Integrator platform, the port RTS and DTR are provided by
> * bits in the following SC_CTRLS register bits:
> @@ -122,7 +126,7 @@ static void integrator_uart_set_mctrl(struct amba_device *dev, void __iomem *bas
> __raw_writel(ctrlc, SC_CTRLC);
> }
>
> -static struct amba_pl010_data integrator_uart_data = {
> +struct amba_pl010_data integrator_uart_data = {
> .set_mctrl = integrator_uart_set_mctrl,
> };
>
> diff --git a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c
> index 58b0a58..ff20173 100644
> --- a/arch/arm/mach-integrator/integrator_ap.c
> +++ b/arch/arm/mach-integrator/integrator_ap.c
> @@ -35,6 +35,7 @@
> #include <linux/clk.h>
> #include <linux/platform_data/clk-integrator.h>
> #include <linux/of_irq.h>
> +#include <linux/of_platform.h>
> #include <video/vga.h>
>
> #include <mach/hardware.h>
> @@ -270,36 +271,6 @@ static struct platform_device cfi_flash_device = {
> .resource = &cfi_flash_resource,
> };
>
> -static void __init ap_init(void)
> -{
> - unsigned long sc_dec;
> - int i;
> -
> - platform_device_register(&cfi_flash_device);
> -
> - sc_dec = readl(VA_SC_BASE + INTEGRATOR_SC_DEC_OFFSET);
> - for (i = 0; i < 4; i++) {
> - struct lm_device *lmdev;
> -
> - if ((sc_dec & (16 << i)) == 0)
> - continue;
> -
> - lmdev = kzalloc(sizeof(struct lm_device), GFP_KERNEL);
> - if (!lmdev)
> - continue;
> -
> - lmdev->resource.start = 0xc0000000 + 0x10000000 * i;
> - lmdev->resource.end = lmdev->resource.start + 0x0fffffff;
> - lmdev->resource.flags = IORESOURCE_MEM;
> - lmdev->irq = IRQ_AP_EXPINT0 + i;
> - lmdev->id = i;
> -
> - lm_device_register(lmdev);
> - }
> -
> - integrator_init(false);
> -}
> -
> /*
> * Where is the timer (VA)?
> */
> @@ -472,6 +443,52 @@ static void __init ap_init_irq_of(void)
> integrator_clk_init(false);
> }
>
> +/* For the Device Tree, add in the UART callbacks as AUXDATA */
> +static struct of_dev_auxdata ap_auxdata_lookup[] __initdata = {
> + OF_DEV_AUXDATA("arm,primecell", INTEGRATOR_RTC_BASE,
> + "rtc", NULL),
> + OF_DEV_AUXDATA("arm,primecell", INTEGRATOR_UART0_BASE,
> + "uart0", &integrator_uart_data),
> + OF_DEV_AUXDATA("arm,primecell", INTEGRATOR_UART1_BASE,
> + "uart1", &integrator_uart_data),
> + OF_DEV_AUXDATA("arm,primecell", KMI0_BASE,
> + "kmi0", NULL),
> + OF_DEV_AUXDATA("arm,primecell", KMI1_BASE,
> + "kmi1", NULL),
> + { /* sentinel */ },
why that?
Best Regards,
J.
More information about the linux-arm-kernel
mailing list