Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 331476
b: refs/heads/master
c: 4672cdd
h: refs/heads/master
v: v3
  • Loading branch information
Linus Walleij authored and Russell King committed Sep 17, 2012
1 parent 29a2992 commit 7043d81
Show file tree
Hide file tree
Showing 8 changed files with 270 additions and 54 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 4980f9bc2cec0f8ff0e0f2b021d46c7606ae1849
refs/heads/master: 4672cddff21f6edde857aa4b523bbc1bfc741cf8
38 changes: 38 additions & 0 deletions trunk/arch/arm/boot/dts/integrator.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,42 @@
reg = <0x14000000 0x100>;
clear-mask = <0xffffffff>;
};

fpga {
compatible = "arm,amba-bus", "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
ranges;
interrupt-parent = <&pic>;

/*
* These PrimeCells are in the same locations and using the
* same interrupts in all Integrators, however the silicon
* version deployed is different.
*/
rtc@15000000 {
reg = <0x15000000 0x1000>;
interrupts = <8>;
};

uart@16000000 {
reg = <0x16000000 0x1000>;
interrupts = <1>;
};

uart@17000000 {
reg = <0x17000000 0x1000>;
interrupts = <2>;
};

kmi@18000000 {
reg = <0x18000000 0x1000>;
interrupts = <3>;
};

kmi@19000000 {
reg = <0x19000000 0x1000>;
interrupts = <4>;
};
};
};
32 changes: 32 additions & 0 deletions trunk/arch/arm/boot/dts/integratorap.dts
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,36 @@
pic: pic@14000000 {
valid-mask = <0x003fffff>;
};

fpga {
/*
* The Integator/AP predates the idea to have magic numbers
* identifying the PrimeCell in hardware, thus we have to
* supply these from the device tree.
*/
rtc: rtc@15000000 {
compatible = "arm,pl030", "arm,primecell";
arm,primecell-periphid = <0x00041030>;
};

uart0: uart@16000000 {
compatible = "arm,pl010", "arm,primecell";
arm,primecell-periphid = <0x00041010>;
};

uart1: uart@17000000 {
compatible = "arm,pl010", "arm,primecell";
arm,primecell-periphid = <0x00041010>;
};

kmi0: kmi@18000000 {
compatible = "arm,pl050", "arm,primecell";
arm,primecell-periphid = <0x00041050>;
};

kmi1: kmi@19000000 {
compatible = "arm,pl050", "arm,primecell";
arm,primecell-periphid = <0x00041050>;
};
};
};
49 changes: 49 additions & 0 deletions trunk/arch/arm/boot/dts/integratorcp.dts
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,53 @@
clear-mask = <0x00000fff>;
valid-mask = <0x00000fff>;
};

fpga {
/*
* These PrimeCells are at the same location and using
* the same interrupts in all Integrators, but in the CP
* slightly newer versions are deployed.
*/
rtc@15000000 {
compatible = "arm,pl031", "arm,primecell";
};

uart@16000000 {
compatible = "arm,pl011", "arm,primecell";
};

uart@17000000 {
compatible = "arm,pl011", "arm,primecell";
};

kmi@18000000 {
compatible = "arm,pl050", "arm,primecell";
};

kmi@19000000 {
compatible = "arm,pl050", "arm,primecell";
};

/*
* These PrimeCells are only available on the Integrator/CP
*/
mmc@1c000000 {
compatible = "arm,pl180", "arm,primecell";
reg = <0x1c000000 0x1000>;
interrupts = <23 24>;
max-frequency = <515633>;
};

aaci@1d000000 {
compatible = "arm,pl041", "arm,primecell";
reg = <0x1d000000 0x1000>;
interrupts = <25>;
};

clcd@c0000000 {
compatible = "arm,pl110", "arm,primecell";
reg = <0xC0000000 0x1000>;
interrupts = <22>;
};
};
};
2 changes: 2 additions & 0 deletions trunk/arch/arm/mach-integrator/common.h
Original file line number Diff line number Diff line change
@@ -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);
Expand Down
8 changes: 6 additions & 2 deletions trunk/arch/arm/mach-integrator/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@
#include <asm/mach/time.h>
#include <asm/pgtable.h>

static struct amba_pl010_data integrator_uart_data;
#include "common.h"

#ifdef CONFIG_ATAGS

#define INTEGRATOR_RTC_IRQ { IRQ_RTCINT }
#define INTEGRATOR_UART0_IRQ { IRQ_UARTINT0 }
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -125,7 +129,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,
};

Expand Down
109 changes: 78 additions & 31 deletions trunk/arch/arm/mach-integrator/integrator_ap.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#include <linux/platform_data/clk-integrator.h>
#include <linux/of_irq.h>
#include <linux/of_address.h>
#include <linux/of_platform.h>
#include <video/vga.h>

#include <mach/hardware.h>
Expand Down Expand Up @@ -271,36 +272,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)?
*/
Expand Down Expand Up @@ -493,6 +464,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 */ },
};

static void __init ap_init_of(void)
{
unsigned long sc_dec;
int i;

of_platform_populate(NULL, of_default_bus_match_table,
ap_auxdata_lookup, NULL);

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);
}
}

static const char * ap_dt_board_compat[] = {
"arm,integrator-ap",
NULL,
Expand All @@ -506,7 +523,7 @@ DT_MACHINE_START(INTEGRATOR_AP_DT, "ARM Integrator/AP (Device Tree)")
.init_irq = ap_init_irq_of,
.handle_irq = fpga_handle_irq,
.timer = &ap_of_timer,
.init_machine = ap_init,
.init_machine = ap_init_of,
.restart = integrator_restart,
.dt_compat = ap_dt_board_compat,
MACHINE_END
Expand Down Expand Up @@ -560,6 +577,36 @@ static void __init ap_init_irq(void)
integrator_clk_init(false);
}

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);
}

MACHINE_START(INTEGRATOR, "ARM-Integrator")
/* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
.atag_offset = 0x100,
Expand Down
Loading

0 comments on commit 7043d81

Please sign in to comment.