|
@@ -36,9 +36,7 @@
|
|
|
#include <asm/hardware/arm_timer.h>
|
|
|
#include <asm/hardware/icst.h>
|
|
|
|
|
|
-#include <mach/cm.h>
|
|
|
#include <mach/lm.h>
|
|
|
-#include <mach/irqs.h>
|
|
|
|
|
|
#include <asm/mach/arch.h>
|
|
|
#include <asm/mach/irq.h>
|
|
@@ -50,6 +48,7 @@
|
|
|
#include <plat/clcd.h>
|
|
|
#include <plat/sched_clock.h>
|
|
|
|
|
|
+#include "cm.h"
|
|
|
#include "common.h"
|
|
|
|
|
|
/* Base address to the CP controller */
|
|
@@ -249,7 +248,6 @@ static void __init intcp_init_early(void)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_OF
|
|
|
static const struct of_device_id fpga_irq_of_match[] __initconst = {
|
|
|
{ .compatible = "arm,versatile-fpga-irq", .data = fpga_irq_of_init, },
|
|
|
{ /* Sentinel */ }
|
|
@@ -257,6 +255,7 @@ static const struct of_device_id fpga_irq_of_match[] __initconst = {
|
|
|
|
|
|
static void __init intcp_init_irq_of(void)
|
|
|
{
|
|
|
+ cm_init();
|
|
|
of_irq_init(fpga_irq_of_match);
|
|
|
integrator_clk_init(true);
|
|
|
}
|
|
@@ -287,6 +286,11 @@ static struct of_dev_auxdata intcp_auxdata_lookup[] __initdata = {
|
|
|
{ /* sentinel */ },
|
|
|
};
|
|
|
|
|
|
+static const struct of_device_id intcp_syscon_match[] = {
|
|
|
+ { .compatible = "arm,integrator-cp-syscon"},
|
|
|
+ { },
|
|
|
+};
|
|
|
+
|
|
|
static void __init intcp_init_of(void)
|
|
|
{
|
|
|
struct device_node *root;
|
|
@@ -301,7 +305,8 @@ static void __init intcp_init_of(void)
|
|
|
root = of_find_node_by_path("/");
|
|
|
if (!root)
|
|
|
return;
|
|
|
- cpcon = of_find_node_by_path("/cpcon");
|
|
|
+
|
|
|
+ cpcon = of_find_matching_node(root, intcp_syscon_match);
|
|
|
if (!cpcon)
|
|
|
return;
|
|
|
|
|
@@ -354,175 +359,3 @@ DT_MACHINE_START(INTEGRATOR_CP_DT, "ARM Integrator/CP (Device Tree)")
|
|
|
.restart = integrator_restart,
|
|
|
.dt_compat = intcp_dt_board_compat,
|
|
|
MACHINE_END
|
|
|
-
|
|
|
-#endif
|
|
|
-
|
|
|
-#ifdef CONFIG_ATAGS
|
|
|
-
|
|
|
-/*
|
|
|
- * For the ATAG boot some static mappings are needed. This will
|
|
|
- * go away with the ATAG support down the road.
|
|
|
- */
|
|
|
-
|
|
|
-static struct map_desc intcp_io_desc_atag[] __initdata = {
|
|
|
- {
|
|
|
- .virtual = IO_ADDRESS(INTEGRATOR_CP_CTL_BASE),
|
|
|
- .pfn = __phys_to_pfn(INTEGRATOR_CP_CTL_BASE),
|
|
|
- .length = SZ_4K,
|
|
|
- .type = MT_DEVICE
|
|
|
- },
|
|
|
-};
|
|
|
-
|
|
|
-static void __init intcp_map_io_atag(void)
|
|
|
-{
|
|
|
- iotable_init(intcp_io_desc_atag, ARRAY_SIZE(intcp_io_desc_atag));
|
|
|
- intcp_con_base = __io_address(INTEGRATOR_CP_CTL_BASE);
|
|
|
- intcp_map_io();
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-/*
|
|
|
- * This is where non-devicetree initialization code is collected and stashed
|
|
|
- * for eventual deletion.
|
|
|
- */
|
|
|
-
|
|
|
-#define INTCP_FLASH_SIZE SZ_32M
|
|
|
-
|
|
|
-static struct resource intcp_flash_resource = {
|
|
|
- .start = INTCP_PA_FLASH_BASE,
|
|
|
- .end = INTCP_PA_FLASH_BASE + INTCP_FLASH_SIZE - 1,
|
|
|
- .flags = IORESOURCE_MEM,
|
|
|
-};
|
|
|
-
|
|
|
-static struct platform_device intcp_flash_device = {
|
|
|
- .name = "physmap-flash",
|
|
|
- .id = 0,
|
|
|
- .dev = {
|
|
|
- .platform_data = &intcp_flash_data,
|
|
|
- },
|
|
|
- .num_resources = 1,
|
|
|
- .resource = &intcp_flash_resource,
|
|
|
-};
|
|
|
-
|
|
|
-#define INTCP_ETH_SIZE 0x10
|
|
|
-
|
|
|
-static struct resource smc91x_resources[] = {
|
|
|
- [0] = {
|
|
|
- .start = INTEGRATOR_CP_ETH_BASE,
|
|
|
- .end = INTEGRATOR_CP_ETH_BASE + INTCP_ETH_SIZE - 1,
|
|
|
- .flags = IORESOURCE_MEM,
|
|
|
- },
|
|
|
- [1] = {
|
|
|
- .start = IRQ_CP_ETHINT,
|
|
|
- .end = IRQ_CP_ETHINT,
|
|
|
- .flags = IORESOURCE_IRQ,
|
|
|
- },
|
|
|
-};
|
|
|
-
|
|
|
-static struct platform_device smc91x_device = {
|
|
|
- .name = "smc91x",
|
|
|
- .id = 0,
|
|
|
- .num_resources = ARRAY_SIZE(smc91x_resources),
|
|
|
- .resource = smc91x_resources,
|
|
|
-};
|
|
|
-
|
|
|
-static struct platform_device *intcp_devs[] __initdata = {
|
|
|
- &intcp_flash_device,
|
|
|
- &smc91x_device,
|
|
|
-};
|
|
|
-
|
|
|
-#define INTCP_VA_CIC_BASE __io_address(INTEGRATOR_HDR_BASE + 0x40)
|
|
|
-#define INTCP_VA_PIC_BASE __io_address(INTEGRATOR_IC_BASE)
|
|
|
-#define INTCP_VA_SIC_BASE __io_address(INTEGRATOR_CP_SIC_BASE)
|
|
|
-
|
|
|
-static void __init intcp_init_irq(void)
|
|
|
-{
|
|
|
- u32 pic_mask, cic_mask, sic_mask;
|
|
|
-
|
|
|
- /* These masks are for the HW IRQ registers */
|
|
|
- pic_mask = ~((~0u) << (11 - 0));
|
|
|
- pic_mask |= (~((~0u) << (29 - 22))) << 22;
|
|
|
- cic_mask = ~((~0u) << (1 + IRQ_CIC_END - IRQ_CIC_START));
|
|
|
- sic_mask = ~((~0u) << (1 + IRQ_SIC_END - IRQ_SIC_START));
|
|
|
-
|
|
|
- /*
|
|
|
- * Disable all interrupt sources
|
|
|
- */
|
|
|
- writel(0xffffffff, INTCP_VA_PIC_BASE + IRQ_ENABLE_CLEAR);
|
|
|
- writel(0xffffffff, INTCP_VA_PIC_BASE + FIQ_ENABLE_CLEAR);
|
|
|
- writel(0xffffffff, INTCP_VA_CIC_BASE + IRQ_ENABLE_CLEAR);
|
|
|
- writel(0xffffffff, INTCP_VA_CIC_BASE + FIQ_ENABLE_CLEAR);
|
|
|
- writel(sic_mask, INTCP_VA_SIC_BASE + IRQ_ENABLE_CLEAR);
|
|
|
- writel(sic_mask, INTCP_VA_SIC_BASE + FIQ_ENABLE_CLEAR);
|
|
|
-
|
|
|
- fpga_irq_init(INTCP_VA_PIC_BASE, "PIC", IRQ_PIC_START,
|
|
|
- -1, pic_mask, NULL);
|
|
|
-
|
|
|
- fpga_irq_init(INTCP_VA_CIC_BASE, "CIC", IRQ_CIC_START,
|
|
|
- -1, cic_mask, NULL);
|
|
|
-
|
|
|
- fpga_irq_init(INTCP_VA_SIC_BASE, "SIC", IRQ_SIC_START,
|
|
|
- IRQ_CP_CPPLDINT, sic_mask, NULL);
|
|
|
-
|
|
|
- integrator_clk_init(true);
|
|
|
-}
|
|
|
-
|
|
|
-#define TIMER0_VA_BASE __io_address(INTEGRATOR_TIMER0_BASE)
|
|
|
-#define TIMER1_VA_BASE __io_address(INTEGRATOR_TIMER1_BASE)
|
|
|
-#define TIMER2_VA_BASE __io_address(INTEGRATOR_TIMER2_BASE)
|
|
|
-
|
|
|
-static void __init cp_timer_init(void)
|
|
|
-{
|
|
|
- writel(0, TIMER0_VA_BASE + TIMER_CTRL);
|
|
|
- writel(0, TIMER1_VA_BASE + TIMER_CTRL);
|
|
|
- writel(0, TIMER2_VA_BASE + TIMER_CTRL);
|
|
|
-
|
|
|
- sp804_clocksource_init(TIMER2_VA_BASE, "timer2");
|
|
|
- sp804_clockevents_init(TIMER1_VA_BASE, IRQ_TIMERINT1, "timer1");
|
|
|
-}
|
|
|
-
|
|
|
-#define INTEGRATOR_CP_MMC_IRQS { IRQ_CP_MMCIINT0, IRQ_CP_MMCIINT1 }
|
|
|
-#define INTEGRATOR_CP_AACI_IRQS { IRQ_CP_AACIINT }
|
|
|
-
|
|
|
-static AMBA_APB_DEVICE(mmc, "mmci", 0, INTEGRATOR_CP_MMC_BASE,
|
|
|
- INTEGRATOR_CP_MMC_IRQS, &mmc_data);
|
|
|
-
|
|
|
-static AMBA_APB_DEVICE(aaci, "aaci", 0, INTEGRATOR_CP_AACI_BASE,
|
|
|
- INTEGRATOR_CP_AACI_IRQS, NULL);
|
|
|
-
|
|
|
-static AMBA_AHB_DEVICE(clcd, "clcd", 0, INTCP_PA_CLCD_BASE,
|
|
|
- { IRQ_CP_CLCDCINT }, &clcd_data);
|
|
|
-
|
|
|
-static struct amba_device *amba_devs[] __initdata = {
|
|
|
- &mmc_device,
|
|
|
- &aaci_device,
|
|
|
- &clcd_device,
|
|
|
-};
|
|
|
-
|
|
|
-static void __init intcp_init(void)
|
|
|
-{
|
|
|
- int i;
|
|
|
-
|
|
|
- platform_add_devices(intcp_devs, ARRAY_SIZE(intcp_devs));
|
|
|
-
|
|
|
- for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
|
|
|
- struct amba_device *d = amba_devs[i];
|
|
|
- amba_device_register(d, &iomem_resource);
|
|
|
- }
|
|
|
- integrator_init(true);
|
|
|
-}
|
|
|
-
|
|
|
-MACHINE_START(CINTEGRATOR, "ARM-IntegratorCP")
|
|
|
- /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
|
|
|
- .atag_offset = 0x100,
|
|
|
- .reserve = integrator_reserve,
|
|
|
- .map_io = intcp_map_io_atag,
|
|
|
- .init_early = intcp_init_early,
|
|
|
- .init_irq = intcp_init_irq,
|
|
|
- .handle_irq = fpga_handle_irq,
|
|
|
- .init_time = cp_timer_init,
|
|
|
- .init_machine = intcp_init,
|
|
|
- .restart = integrator_restart,
|
|
|
-MACHINE_END
|
|
|
-
|
|
|
-#endif
|