|
@@ -205,3 +205,153 @@ static struct platform_device v2m_cf_device = {
|
|
|
};
|
|
|
|
|
|
static struct mmci_platform_data v2m_mmci_data = {
|
|
|
+ .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
|
|
|
+ .gpio_wp = VEXPRESS_GPIO_MMC_WPROT,
|
|
|
+ .gpio_cd = VEXPRESS_GPIO_MMC_CARDIN,
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource v2m_sysreg_resources[] = {
|
|
|
+ {
|
|
|
+ .start = V2M_SYSREGS,
|
|
|
+ .end = V2M_SYSREGS + 0xfff,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device v2m_sysreg_device = {
|
|
|
+ .name = "vexpress-sysreg",
|
|
|
+ .id = -1,
|
|
|
+ .resource = v2m_sysreg_resources,
|
|
|
+ .num_resources = ARRAY_SIZE(v2m_sysreg_resources),
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device v2m_muxfpga_device = {
|
|
|
+ .name = "vexpress-muxfpga",
|
|
|
+ .id = 0,
|
|
|
+ .num_resources = 1,
|
|
|
+ .resource = (struct resource []) {
|
|
|
+ VEXPRESS_RES_FUNC(0, 7),
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device v2m_shutdown_device = {
|
|
|
+ .name = "vexpress-shutdown",
|
|
|
+ .id = 0,
|
|
|
+ .num_resources = 1,
|
|
|
+ .resource = (struct resource []) {
|
|
|
+ VEXPRESS_RES_FUNC(0, 8),
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device v2m_reboot_device = {
|
|
|
+ .name = "vexpress-reboot",
|
|
|
+ .id = 0,
|
|
|
+ .num_resources = 1,
|
|
|
+ .resource = (struct resource []) {
|
|
|
+ VEXPRESS_RES_FUNC(0, 9),
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device v2m_dvimode_device = {
|
|
|
+ .name = "vexpress-dvimode",
|
|
|
+ .id = 0,
|
|
|
+ .num_resources = 1,
|
|
|
+ .resource = (struct resource []) {
|
|
|
+ VEXPRESS_RES_FUNC(0, 11),
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+static AMBA_APB_DEVICE(aaci, "mb:aaci", 0, V2M_AACI, IRQ_V2M_AACI, NULL);
|
|
|
+static AMBA_APB_DEVICE(mmci, "mb:mmci", 0, V2M_MMCI, IRQ_V2M_MMCI, &v2m_mmci_data);
|
|
|
+static AMBA_APB_DEVICE(kmi0, "mb:kmi0", 0, V2M_KMI0, IRQ_V2M_KMI0, NULL);
|
|
|
+static AMBA_APB_DEVICE(kmi1, "mb:kmi1", 0, V2M_KMI1, IRQ_V2M_KMI1, NULL);
|
|
|
+static AMBA_APB_DEVICE(uart0, "mb:uart0", 0, V2M_UART0, IRQ_V2M_UART0, NULL);
|
|
|
+static AMBA_APB_DEVICE(uart1, "mb:uart1", 0, V2M_UART1, IRQ_V2M_UART1, NULL);
|
|
|
+static AMBA_APB_DEVICE(uart2, "mb:uart2", 0, V2M_UART2, IRQ_V2M_UART2, NULL);
|
|
|
+static AMBA_APB_DEVICE(uart3, "mb:uart3", 0, V2M_UART3, IRQ_V2M_UART3, NULL);
|
|
|
+static AMBA_APB_DEVICE(wdt, "mb:wdt", 0, V2M_WDT, IRQ_V2M_WDT, NULL);
|
|
|
+static AMBA_APB_DEVICE(rtc, "mb:rtc", 0, V2M_RTC, IRQ_V2M_RTC, NULL);
|
|
|
+
|
|
|
+static struct amba_device *v2m_amba_devs[] __initdata = {
|
|
|
+ &aaci_device,
|
|
|
+ &mmci_device,
|
|
|
+ &kmi0_device,
|
|
|
+ &kmi1_device,
|
|
|
+ &uart0_device,
|
|
|
+ &uart1_device,
|
|
|
+ &uart2_device,
|
|
|
+ &uart3_device,
|
|
|
+ &wdt_device,
|
|
|
+ &rtc_device,
|
|
|
+};
|
|
|
+
|
|
|
+static void __init v2m_timer_init(void)
|
|
|
+{
|
|
|
+ vexpress_clk_init(ioremap(V2M_SYSCTL, SZ_4K));
|
|
|
+ v2m_sp804_init(ioremap(V2M_TIMER01, SZ_4K), IRQ_V2M_TIMER0);
|
|
|
+}
|
|
|
+
|
|
|
+static struct sys_timer v2m_timer = {
|
|
|
+ .init = v2m_timer_init,
|
|
|
+};
|
|
|
+
|
|
|
+static void __init v2m_init_early(void)
|
|
|
+{
|
|
|
+ if (ct_desc->init_early)
|
|
|
+ ct_desc->init_early();
|
|
|
+ versatile_sched_clock_init(vexpress_get_24mhz_clock_base(), 24000000);
|
|
|
+}
|
|
|
+
|
|
|
+struct ct_desc *ct_desc;
|
|
|
+
|
|
|
+static struct ct_desc *ct_descs[] __initdata = {
|
|
|
+#ifdef CONFIG_ARCH_VEXPRESS_CA9X4
|
|
|
+ &ct_ca9x4_desc,
|
|
|
+#endif
|
|
|
+};
|
|
|
+
|
|
|
+static void __init v2m_populate_ct_desc(void)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ u32 current_tile_id;
|
|
|
+
|
|
|
+ ct_desc = NULL;
|
|
|
+ current_tile_id = vexpress_get_procid(VEXPRESS_SITE_MASTER)
|
|
|
+ & V2M_CT_ID_MASK;
|
|
|
+
|
|
|
+ for (i = 0; i < ARRAY_SIZE(ct_descs) && !ct_desc; ++i)
|
|
|
+ if (ct_descs[i]->id == current_tile_id)
|
|
|
+ ct_desc = ct_descs[i];
|
|
|
+
|
|
|
+ if (!ct_desc)
|
|
|
+ panic("vexpress: this kernel does not support core tile ID 0x%08x when booting via ATAGs.\n"
|
|
|
+ "You may need a device tree blob or a different kernel to boot on this board.\n",
|
|
|
+ current_tile_id);
|
|
|
+}
|
|
|
+
|
|
|
+static void __init v2m_map_io(void)
|
|
|
+{
|
|
|
+ iotable_init(v2m_io_desc, ARRAY_SIZE(v2m_io_desc));
|
|
|
+ vexpress_sysreg_early_init(ioremap(V2M_SYSREGS, SZ_4K));
|
|
|
+ v2m_populate_ct_desc();
|
|
|
+ ct_desc->map_io();
|
|
|
+}
|
|
|
+
|
|
|
+static void __init v2m_init_irq(void)
|
|
|
+{
|
|
|
+ ct_desc->init_irq();
|
|
|
+}
|
|
|
+
|
|
|
+static void __init v2m_init(void)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ regulator_register_fixed(0, v2m_eth_supplies,
|
|
|
+ ARRAY_SIZE(v2m_eth_supplies));
|
|
|
+
|
|
|
+ platform_device_register(&v2m_muxfpga_device);
|
|
|
+ platform_device_register(&v2m_shutdown_device);
|
|
|
+ platform_device_register(&v2m_reboot_device);
|
|
|
+ platform_device_register(&v2m_dvimode_device);
|
|
|
+
|
|
|
+ platform_device_register(&v2m_sysreg_device);
|