mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 09:59:32 +00:00
ARM: integrator: delete non-devicetree boot path
The Device Tree boot path now supports everything the ATAG boot can provide, and the two are equivalent. This deletes the ATAG boot path from the Integrator/AP and Integrator/CP platforms to move them on to the future. Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
50564a794d
commit
d7057e1de8
5 changed files with 25 additions and 463 deletions
|
@ -317,6 +317,7 @@ config ARCH_INTEGRATOR
|
||||||
select NEED_MACH_MEMORY_H
|
select NEED_MACH_MEMORY_H
|
||||||
select PLAT_VERSATILE
|
select PLAT_VERSATILE
|
||||||
select SPARSE_IRQ
|
select SPARSE_IRQ
|
||||||
|
select USE_OF
|
||||||
select VERSATILE_FPGA_IRQ
|
select VERSATILE_FPGA_IRQ
|
||||||
help
|
help
|
||||||
Support for ARM's Integrator platform.
|
Support for ARM's Integrator platform.
|
||||||
|
|
|
@ -34,63 +34,6 @@
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
#ifdef CONFIG_ATAGS
|
|
||||||
|
|
||||||
#define INTEGRATOR_RTC_IRQ { IRQ_RTCINT }
|
|
||||||
#define INTEGRATOR_UART0_IRQ { IRQ_UARTINT0 }
|
|
||||||
#define INTEGRATOR_UART1_IRQ { IRQ_UARTINT1 }
|
|
||||||
#define KMI0_IRQ { IRQ_KMIINT0 }
|
|
||||||
#define KMI1_IRQ { IRQ_KMIINT1 }
|
|
||||||
|
|
||||||
static AMBA_APB_DEVICE(rtc, "rtc", 0,
|
|
||||||
INTEGRATOR_RTC_BASE, INTEGRATOR_RTC_IRQ, NULL);
|
|
||||||
|
|
||||||
static AMBA_APB_DEVICE(uart0, "uart0", 0,
|
|
||||||
INTEGRATOR_UART0_BASE, INTEGRATOR_UART0_IRQ, NULL);
|
|
||||||
|
|
||||||
static AMBA_APB_DEVICE(uart1, "uart1", 0,
|
|
||||||
INTEGRATOR_UART1_BASE, INTEGRATOR_UART1_IRQ, NULL);
|
|
||||||
|
|
||||||
static AMBA_APB_DEVICE(kmi0, "kmi0", 0, KMI0_BASE, KMI0_IRQ, NULL);
|
|
||||||
static AMBA_APB_DEVICE(kmi1, "kmi1", 0, KMI1_BASE, KMI1_IRQ, NULL);
|
|
||||||
|
|
||||||
static struct amba_device *amba_devs[] __initdata = {
|
|
||||||
&rtc_device,
|
|
||||||
&uart0_device,
|
|
||||||
&uart1_device,
|
|
||||||
&kmi0_device,
|
|
||||||
&kmi1_device,
|
|
||||||
};
|
|
||||||
|
|
||||||
int __init integrator_init(bool is_cp)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The Integrator/AP lacks necessary AMBA PrimeCell IDs, so we need to
|
|
||||||
* hard-code them. The Integator/CP and forward have proper cell IDs.
|
|
||||||
* Else we leave them undefined to the bus driver can autoprobe them.
|
|
||||||
*/
|
|
||||||
if (!is_cp && IS_ENABLED(CONFIG_ARCH_INTEGRATOR_AP)) {
|
|
||||||
rtc_device.periphid = 0x00041030;
|
|
||||||
uart0_device.periphid = 0x00041010;
|
|
||||||
uart1_device.periphid = 0x00041010;
|
|
||||||
kmi0_device.periphid = 0x00041050;
|
|
||||||
kmi1_device.periphid = 0x00041050;
|
|
||||||
uart0_device.dev.platform_data = &ap_uart_data;
|
|
||||||
uart1_device.dev.platform_data = &ap_uart_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
|
|
||||||
struct amba_device *d = amba_devs[i];
|
|
||||||
amba_device_register(d, &iomem_resource);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static DEFINE_RAW_SPINLOCK(cm_lock);
|
static DEFINE_RAW_SPINLOCK(cm_lock);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -402,8 +402,6 @@ void __init ap_init_early(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_OF
|
|
||||||
|
|
||||||
static void __init ap_of_timer_init(void)
|
static void __init ap_of_timer_init(void)
|
||||||
{
|
{
|
||||||
struct device_node *node;
|
struct device_node *node;
|
||||||
|
@ -564,136 +562,3 @@ DT_MACHINE_START(INTEGRATOR_AP_DT, "ARM Integrator/AP (Device Tree)")
|
||||||
.restart = integrator_restart,
|
.restart = integrator_restart,
|
||||||
.dt_compat = ap_dt_board_compat,
|
.dt_compat = ap_dt_board_compat,
|
||||||
MACHINE_END
|
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 ap_io_desc_atag[] __initdata = {
|
|
||||||
{
|
|
||||||
.virtual = IO_ADDRESS(INTEGRATOR_SC_BASE),
|
|
||||||
.pfn = __phys_to_pfn(INTEGRATOR_SC_BASE),
|
|
||||||
.length = SZ_4K,
|
|
||||||
.type = MT_DEVICE
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init ap_map_io_atag(void)
|
|
||||||
{
|
|
||||||
iotable_init(ap_io_desc_atag, ARRAY_SIZE(ap_io_desc_atag));
|
|
||||||
ap_map_io();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is where non-devicetree initialization code is collected and stashed
|
|
||||||
* for eventual deletion.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static struct platform_device pci_v3_device = {
|
|
||||||
.name = "pci-v3",
|
|
||||||
.id = 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct resource cfi_flash_resource = {
|
|
||||||
.start = INTEGRATOR_FLASH_BASE,
|
|
||||||
.end = INTEGRATOR_FLASH_BASE + INTEGRATOR_FLASH_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct platform_device cfi_flash_device = {
|
|
||||||
.name = "physmap-flash",
|
|
||||||
.id = 0,
|
|
||||||
.dev = {
|
|
||||||
.platform_data = &ap_flash_data,
|
|
||||||
},
|
|
||||||
.num_resources = 1,
|
|
||||||
.resource = &cfi_flash_resource,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __init ap_timer_init(void)
|
|
||||||
{
|
|
||||||
struct clk *clk;
|
|
||||||
unsigned long rate;
|
|
||||||
|
|
||||||
clk = clk_get_sys("ap_timer", NULL);
|
|
||||||
BUG_ON(IS_ERR(clk));
|
|
||||||
clk_prepare_enable(clk);
|
|
||||||
rate = clk_get_rate(clk);
|
|
||||||
|
|
||||||
writel(0, TIMER0_VA_BASE + TIMER_CTRL);
|
|
||||||
writel(0, TIMER1_VA_BASE + TIMER_CTRL);
|
|
||||||
writel(0, TIMER2_VA_BASE + TIMER_CTRL);
|
|
||||||
|
|
||||||
integrator_clocksource_init(rate, (void __iomem *)TIMER2_VA_BASE);
|
|
||||||
integrator_clockevent_init(rate, (void __iomem *)TIMER1_VA_BASE,
|
|
||||||
IRQ_TIMERINT1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define INTEGRATOR_SC_VALID_INT 0x003fffff
|
|
||||||
|
|
||||||
static void __init ap_init_irq(void)
|
|
||||||
{
|
|
||||||
/* Disable all interrupts initially. */
|
|
||||||
/* Do the core module ones */
|
|
||||||
writel(-1, VA_CMIC_BASE + IRQ_ENABLE_CLEAR);
|
|
||||||
|
|
||||||
/* do the header card stuff next */
|
|
||||||
writel(-1, VA_IC_BASE + IRQ_ENABLE_CLEAR);
|
|
||||||
writel(-1, VA_IC_BASE + FIQ_ENABLE_CLEAR);
|
|
||||||
|
|
||||||
fpga_irq_init(VA_IC_BASE, "SC", IRQ_PIC_START,
|
|
||||||
-1, INTEGRATOR_SC_VALID_INT, NULL);
|
|
||||||
integrator_clk_init(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __init ap_init(void)
|
|
||||||
{
|
|
||||||
unsigned long sc_dec;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
platform_device_register(&pci_v3_device);
|
|
||||||
platform_device_register(&cfi_flash_device);
|
|
||||||
|
|
||||||
ap_syscon_base = __io_address(INTEGRATOR_SC_BASE);
|
|
||||||
sc_dec = readl(ap_syscon_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,
|
|
||||||
.reserve = integrator_reserve,
|
|
||||||
.map_io = ap_map_io_atag,
|
|
||||||
.init_early = ap_init_early,
|
|
||||||
.init_irq = ap_init_irq,
|
|
||||||
.handle_irq = fpga_handle_irq,
|
|
||||||
.init_time = ap_timer_init,
|
|
||||||
.init_machine = ap_init,
|
|
||||||
.restart = integrator_restart,
|
|
||||||
MACHINE_END
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -249,7 +249,6 @@ static void __init intcp_init_early(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_OF
|
|
||||||
static const struct of_device_id fpga_irq_of_match[] __initconst = {
|
static const struct of_device_id fpga_irq_of_match[] __initconst = {
|
||||||
{ .compatible = "arm,versatile-fpga-irq", .data = fpga_irq_of_init, },
|
{ .compatible = "arm,versatile-fpga-irq", .data = fpga_irq_of_init, },
|
||||||
{ /* Sentinel */ }
|
{ /* Sentinel */ }
|
||||||
|
@ -354,175 +353,3 @@ DT_MACHINE_START(INTEGRATOR_CP_DT, "ARM Integrator/CP (Device Tree)")
|
||||||
.restart = integrator_restart,
|
.restart = integrator_restart,
|
||||||
.dt_compat = intcp_dt_board_compat,
|
.dt_compat = intcp_dt_board_compat,
|
||||||
MACHINE_END
|
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
|
|
||||||
|
|
|
@ -809,32 +809,6 @@ static u8 __init pci_v3_swizzle(struct pci_dev *dev, u8 *pinp)
|
||||||
return pci_common_swizzle(dev, pinp);
|
return pci_common_swizzle(dev, pinp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int irq_tab[4] __initdata = {
|
|
||||||
IRQ_AP_PCIINT0, IRQ_AP_PCIINT1, IRQ_AP_PCIINT2, IRQ_AP_PCIINT3
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* map the specified device/slot/pin to an IRQ. This works out such
|
|
||||||
* that slot 9 pin 1 is INT0, pin 2 is INT1, and slot 10 pin 1 is INT1.
|
|
||||||
*/
|
|
||||||
static int __init pci_v3_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
|
||||||
{
|
|
||||||
int intnr = ((slot - 9) + (pin - 1)) & 3;
|
|
||||||
|
|
||||||
return irq_tab[intnr];
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct hw_pci pci_v3 __initdata = {
|
|
||||||
.swizzle = pci_v3_swizzle,
|
|
||||||
.setup = pci_v3_setup,
|
|
||||||
.nr_controllers = 1,
|
|
||||||
.ops = &pci_v3_ops,
|
|
||||||
.preinit = pci_v3_preinit,
|
|
||||||
.postinit = pci_v3_postinit,
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef CONFIG_OF
|
|
||||||
|
|
||||||
static int __init pci_v3_map_irq_dt(const struct pci_dev *dev, u8 slot, u8 pin)
|
static int __init pci_v3_map_irq_dt(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
struct of_irq oirq;
|
struct of_irq oirq;
|
||||||
|
@ -851,14 +825,36 @@ static int __init pci_v3_map_irq_dt(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||||
oirq.size);
|
oirq.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init pci_v3_dtprobe(struct platform_device *pdev,
|
static struct hw_pci pci_v3 __initdata = {
|
||||||
struct device_node *np)
|
.swizzle = pci_v3_swizzle,
|
||||||
|
.setup = pci_v3_setup,
|
||||||
|
.nr_controllers = 1,
|
||||||
|
.ops = &pci_v3_ops,
|
||||||
|
.preinit = pci_v3_preinit,
|
||||||
|
.postinit = pci_v3_postinit,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init pci_v3_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
|
struct device_node *np = pdev->dev.of_node;
|
||||||
struct of_pci_range_parser parser;
|
struct of_pci_range_parser parser;
|
||||||
struct of_pci_range range;
|
struct of_pci_range range;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
int irq, ret;
|
int irq, ret;
|
||||||
|
|
||||||
|
/* Remap the Integrator system controller */
|
||||||
|
ap_syscon_base = ioremap(INTEGRATOR_SC_BASE, 0x100);
|
||||||
|
if (!ap_syscon_base) {
|
||||||
|
dev_err(&pdev->dev, "unable to remap the AP syscon for PCIv3\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Device tree probe path */
|
||||||
|
if (!np) {
|
||||||
|
dev_err(&pdev->dev, "no device tree node for PCIv3\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
if (of_pci_range_parser_init(&parser, np))
|
if (of_pci_range_parser_init(&parser, np))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
@ -925,76 +921,6 @@ static int __init pci_v3_dtprobe(struct platform_device *pdev,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
static inline int pci_v3_dtprobe(struct platform_device *pdev,
|
|
||||||
struct device_node *np)
|
|
||||||
{
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int __init pci_v3_probe(struct platform_device *pdev)
|
|
||||||
{
|
|
||||||
struct device_node *np = pdev->dev.of_node;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
/* Remap the Integrator system controller */
|
|
||||||
ap_syscon_base = ioremap(INTEGRATOR_SC_BASE, 0x100);
|
|
||||||
if (!ap_syscon_base) {
|
|
||||||
dev_err(&pdev->dev, "unable to remap the AP syscon for PCIv3\n");
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Device tree probe path */
|
|
||||||
if (np)
|
|
||||||
return pci_v3_dtprobe(pdev, np);
|
|
||||||
|
|
||||||
pci_v3_base = devm_ioremap(&pdev->dev, PHYS_PCI_V3_BASE, SZ_64K);
|
|
||||||
if (!pci_v3_base) {
|
|
||||||
dev_err(&pdev->dev, "unable to remap PCIv3 base\n");
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = devm_request_irq(&pdev->dev, IRQ_AP_V3INT, v3_irq, 0, "V3", NULL);
|
|
||||||
if (ret) {
|
|
||||||
dev_err(&pdev->dev, "unable to grab PCI error interrupt: %d\n",
|
|
||||||
ret);
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
conf_mem.name = "PCIv3 config";
|
|
||||||
conf_mem.start = PHYS_PCI_CONFIG_BASE;
|
|
||||||
conf_mem.end = PHYS_PCI_CONFIG_BASE + SZ_16M - 1;
|
|
||||||
conf_mem.flags = IORESOURCE_MEM;
|
|
||||||
|
|
||||||
io_mem.name = "PCIv3 I/O";
|
|
||||||
io_mem.start = PHYS_PCI_IO_BASE;
|
|
||||||
io_mem.end = PHYS_PCI_IO_BASE + SZ_16M - 1;
|
|
||||||
io_mem.flags = IORESOURCE_MEM;
|
|
||||||
|
|
||||||
non_mem_pci = 0x00000000;
|
|
||||||
non_mem_pci_sz = SZ_256M;
|
|
||||||
non_mem.name = "PCIv3 non-prefetched mem";
|
|
||||||
non_mem.start = PHYS_PCI_MEM_BASE;
|
|
||||||
non_mem.end = PHYS_PCI_MEM_BASE + SZ_256M - 1;
|
|
||||||
non_mem.flags = IORESOURCE_MEM;
|
|
||||||
|
|
||||||
pre_mem_pci = 0x10000000;
|
|
||||||
pre_mem_pci_sz = SZ_256M;
|
|
||||||
pre_mem.name = "PCIv3 prefetched mem";
|
|
||||||
pre_mem.start = PHYS_PCI_PRE_BASE + SZ_256M;
|
|
||||||
pre_mem.end = PHYS_PCI_PRE_BASE + SZ_256M - 1;
|
|
||||||
pre_mem.flags = IORESOURCE_MEM | IORESOURCE_PREFETCH;
|
|
||||||
|
|
||||||
pci_v3.map_irq = pci_v3_map_irq;
|
|
||||||
|
|
||||||
pci_common_init_dev(&pdev->dev, &pci_v3);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct of_device_id pci_ids[] = {
|
static const struct of_device_id pci_ids[] = {
|
||||||
{ .compatible = "v3,v360epc-pci", },
|
{ .compatible = "v3,v360epc-pci", },
|
||||||
{},
|
{},
|
||||||
|
|
Loading…
Reference in a new issue