|
@@ -355,3 +355,151 @@ static void __init v2m_init(void)
|
|
|
platform_device_register(&v2m_dvimode_device);
|
|
|
|
|
|
platform_device_register(&v2m_sysreg_device);
|
|
|
+ platform_device_register(&v2m_pcie_i2c_device);
|
|
|
+ platform_device_register(&v2m_ddc_i2c_device);
|
|
|
+ platform_device_register(&v2m_flash_device);
|
|
|
+ platform_device_register(&v2m_cf_device);
|
|
|
+ platform_device_register(&v2m_eth_device);
|
|
|
+ platform_device_register(&v2m_usb_device);
|
|
|
+
|
|
|
+ for (i = 0; i < ARRAY_SIZE(v2m_amba_devs); i++)
|
|
|
+ amba_device_register(v2m_amba_devs[i], &iomem_resource);
|
|
|
+
|
|
|
+ pm_power_off = vexpress_power_off;
|
|
|
+
|
|
|
+ ct_desc->init_tile();
|
|
|
+}
|
|
|
+
|
|
|
+MACHINE_START(VEXPRESS, "ARM-Versatile Express")
|
|
|
+ .atag_offset = 0x100,
|
|
|
+ .smp = smp_ops(vexpress_smp_ops),
|
|
|
+ .map_io = v2m_map_io,
|
|
|
+ .init_early = v2m_init_early,
|
|
|
+ .init_irq = v2m_init_irq,
|
|
|
+ .timer = &v2m_timer,
|
|
|
+ .handle_irq = gic_handle_irq,
|
|
|
+ .init_machine = v2m_init,
|
|
|
+ .restart = vexpress_restart,
|
|
|
+MACHINE_END
|
|
|
+
|
|
|
+static struct map_desc v2m_rs1_io_desc __initdata = {
|
|
|
+ .virtual = V2M_PERIPH,
|
|
|
+ .pfn = __phys_to_pfn(0x1c000000),
|
|
|
+ .length = SZ_2M,
|
|
|
+ .type = MT_DEVICE,
|
|
|
+};
|
|
|
+
|
|
|
+static int __init v2m_dt_scan_memory_map(unsigned long node, const char *uname,
|
|
|
+ int depth, void *data)
|
|
|
+{
|
|
|
+ const char **map = data;
|
|
|
+
|
|
|
+ if (strcmp(uname, "motherboard") != 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ *map = of_get_flat_dt_prop(node, "arm,v2m-memory-map", NULL);
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+void __init v2m_dt_map_io(void)
|
|
|
+{
|
|
|
+ const char *map = NULL;
|
|
|
+
|
|
|
+ of_scan_flat_dt(v2m_dt_scan_memory_map, &map);
|
|
|
+
|
|
|
+ if (map && strcmp(map, "rs1") == 0)
|
|
|
+ iotable_init(&v2m_rs1_io_desc, 1);
|
|
|
+ else
|
|
|
+ iotable_init(v2m_io_desc, ARRAY_SIZE(v2m_io_desc));
|
|
|
+
|
|
|
+#if defined(CONFIG_SMP)
|
|
|
+ vexpress_dt_smp_map_io();
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
+void __init v2m_dt_init_early(void)
|
|
|
+{
|
|
|
+ u32 dt_hbi;
|
|
|
+
|
|
|
+ vexpress_sysreg_of_early_init();
|
|
|
+
|
|
|
+ /* Confirm board type against DT property, if available */
|
|
|
+ if (of_property_read_u32(of_allnodes, "arm,hbi", &dt_hbi) == 0) {
|
|
|
+ u32 hbi = vexpress_get_hbi(VEXPRESS_SITE_MASTER);
|
|
|
+
|
|
|
+ if (WARN_ON(dt_hbi != hbi))
|
|
|
+ pr_warning("vexpress: DT HBI (%x) is not matching "
|
|
|
+ "hardware (%x)!\n", dt_hbi, hbi);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static struct of_device_id vexpress_irq_match[] __initdata = {
|
|
|
+ { .compatible = "arm,cortex-a9-gic", .data = gic_of_init, },
|
|
|
+ {}
|
|
|
+};
|
|
|
+
|
|
|
+static void __init v2m_dt_init_irq(void)
|
|
|
+{
|
|
|
+ of_irq_init(vexpress_irq_match);
|
|
|
+}
|
|
|
+
|
|
|
+static void __init v2m_dt_timer_init(void)
|
|
|
+{
|
|
|
+ struct device_node *node = NULL;
|
|
|
+
|
|
|
+ vexpress_clk_of_init();
|
|
|
+
|
|
|
+ do {
|
|
|
+ node = of_find_compatible_node(node, NULL, "arm,sp804");
|
|
|
+ } while (node && vexpress_get_site_by_node(node) != VEXPRESS_SITE_MB);
|
|
|
+ if (node) {
|
|
|
+ pr_info("Using SP804 '%s' as a clock & events source\n",
|
|
|
+ node->full_name);
|
|
|
+ v2m_sp804_init(of_iomap(node, 0),
|
|
|
+ irq_of_parse_and_map(node, 0));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (arch_timer_of_register() != 0)
|
|
|
+ twd_local_timer_of_register();
|
|
|
+
|
|
|
+ if (arch_timer_sched_clock_init() != 0)
|
|
|
+ versatile_sched_clock_init(vexpress_get_24mhz_clock_base(),
|
|
|
+ 24000000);
|
|
|
+}
|
|
|
+
|
|
|
+static struct sys_timer v2m_dt_timer = {
|
|
|
+ .init = v2m_dt_timer_init,
|
|
|
+};
|
|
|
+
|
|
|
+static const struct of_device_id v2m_dt_bus_match[] __initconst = {
|
|
|
+ { .compatible = "simple-bus", },
|
|
|
+ { .compatible = "arm,amba-bus", },
|
|
|
+ { .compatible = "arm,vexpress,config-bus", },
|
|
|
+ {}
|
|
|
+};
|
|
|
+
|
|
|
+static void __init v2m_dt_init(void)
|
|
|
+{
|
|
|
+ l2x0_of_init(0x00400000, 0xfe0fffff);
|
|
|
+ of_platform_populate(NULL, v2m_dt_bus_match, NULL, NULL);
|
|
|
+ pm_power_off = vexpress_power_off;
|
|
|
+}
|
|
|
+
|
|
|
+static const char * const v2m_dt_match[] __initconst = {
|
|
|
+ "arm,vexpress",
|
|
|
+ "xen,xenvm",
|
|
|
+ NULL,
|
|
|
+};
|
|
|
+
|
|
|
+DT_MACHINE_START(VEXPRESS_DT, "ARM-Versatile Express")
|
|
|
+ .dt_compat = v2m_dt_match,
|
|
|
+ .smp = smp_ops(vexpress_smp_ops),
|
|
|
+ .map_io = v2m_dt_map_io,
|
|
|
+ .init_early = v2m_dt_init_early,
|
|
|
+ .init_irq = v2m_dt_init_irq,
|
|
|
+ .timer = &v2m_dt_timer,
|
|
|
+ .init_machine = v2m_dt_init,
|
|
|
+ .handle_irq = gic_handle_irq,
|
|
|
+ .restart = vexpress_restart,
|
|
|
+MACHINE_END
|