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 <[email protected]> > --- > 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@15000000 { > + compatible = "arm,pl031", "arm,primecell"; > + reg = <0x15000000 0x1000>; > + interrupt-parent = <&pic>; > + interrupts = <8>; > + arm,primecell-periphid = <0x00041030>; > + }; > + > + uart0: uart@16000000 { > + compatible = "arm,pl011", "arm,primecell"; > + reg = <0x16000000 0x1000>; > + interrupt-parent = <&pic>; > + interrupts = <1>; > + arm,primecell-periphid = <0x00041010>; > + }; > + > + uart1: uart@17000000 { > + compatible = "arm,pl011", "arm,primecell"; > + reg = <0x17000000 0x1000>; > + interrupt-parent = <&pic>; > + interrupts = <2>; > + arm,primecell-periphid = <0x00041010>; > + }; > + > + kmi0: kmi@18000000 { > + compatible = "arm,pl050", "arm,primecell"; > + reg = <0x18000000 0x1000>; > + interrupt-parent = <&pic>; > + interrupts = <3>; > + arm,primecell-periphid = <0x00041050>; > + }; > + > + kmi1: kmi@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@15000000 { > + compatible = "arm,pl031", "arm,primecell"; > + reg = <0x15000000 0x1000>; > + interrupt-parent = <&pic>; > + interrupts = <8>; > + }; > + > + uart0: uart@16000000 { > + compatible = "arm,pl011", "arm,primecell"; > + reg = <0x16000000 0x1000>; > + interrupt-parent = <&pic>; > + interrupts = <1>; > + }; > + > + uart1: uart@17000000 { > + compatible = "arm,pl011", "arm,primecell"; > + reg = <0x17000000 0x1000>; > + interrupt-parent = <&pic>; > + interrupts = <2>; > + }; > + > + kmi0: kmi@18000000 { > + compatible = "arm,pl050", "arm,primecell"; > + reg = <0x18000000 0x1000>; > + interrupt-parent = <&pic>; > + interrupts = <3>; > + }; > + > + kmi1: kmi@19000000 { > + compatible = "arm,pl050", "arm,primecell"; > + reg = <0x19000000 0x1000>; > + interrupt-parent = <&pic>; > + interrupts = <4>; > + }; > + > + mmci: mmc@1C000000 { > + compatible = "arm,pl180", "arm,primecell"; > + reg = <0x1C000000 0x1000>; > + interrupt-parent = <&pic>; > + interrupts = <23 24>; > + max-frequency = <515633>; > + }; > + > + aaci: aaci@1D000000 { > + compatible = "arm,pl041", "arm,primecell"; > + reg = <0x1D000000 0x1000>; > + interrupt-parent = <&pic>; > + interrupts = <25>; > + }; > + > + clcd: clcd@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. _______________________________________________ devicetree-discuss mailing list [email protected] https://lists.ozlabs.org/listinfo/devicetree-discuss
