/* * * Efika 5K2 platform setup * Some code really inspired from the lite5200b platform. * * Copyright (C) 2006 bplan GmbH * * This file is licensed under the terms of the GNU General Public License * version 2. This program is licensed "as is" without any warranty of any * kind, whether express or implied. * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "efika.h" static void efika_show_cpuinfo(struct seq_file *m) { struct device_node *root; const char *revision = NULL; const char *codegendescription = NULL; const char *codegenvendor = NULL; root = of_find_node_by_path("/"); if (root) { revision = get_property(root, "revision", NULL); codegendescription = get_property(root, "CODEGEN,description", NULL); codegenvendor = get_property(root, "CODEGEN,vendor", NULL); of_node_put(root); } if (codegendescription) seq_printf(m, "machine\t\t: %s\n", codegendescription); else seq_printf(m, "machine\t\t: Efika\n"); if (revision) seq_printf(m, "revision\t: %s\n", revision); if (codegenvendor) seq_printf(m, "vendor\t\t: %s\n", codegenvendor); of_node_put(root); } static void __init efika_setup_arch(void) { rtas_initialize(); #ifdef CONFIG_BLK_DEV_INITRD initrd_below_start_ok = 1; if (initrd_start) ROOT_DEV = Root_RAM0; else #endif ROOT_DEV = Root_SDA2; /* sda2 (sda1 is for the kernel) */ efika_pcisetup(); if (ppc_md.progress) ppc_md.progress("Linux/PPC " UTS_RELEASE " runnung on Efika ;-)\n", 0x0); } static void __init efika_init(void) { struct device_node *np; struct device_node *cnp = NULL; const u32 *base; /* Find every child of the SOC node and add it to of_platform */ np = of_find_node_by_name(NULL, "builtin"); if (np) { char name[BUS_ID_SIZE]; while ((cnp = of_get_next_child(np, cnp))) { strcpy(name, cnp->name); base = get_property(cnp, "reg", NULL); if (base == NULL) continue; snprintf(name+strlen(name), BUS_ID_SIZE, "@%x", *base); of_platform_device_create(cnp, name, NULL); printk(KERN_INFO EFIKA_PLATFORM_NAME" : Added %s (type '%s' at '%s') to the known devices\n", name, cnp->type, cnp->full_name); } } if (ppc_md.progress) ppc_md.progress(" Have fun with your Efika! ", 0x7777); } static int __init efika_probe(void) { char *model = of_get_flat_dt_prop(of_get_flat_dt_root(), "model", NULL); if (model == NULL) return 0; if (strcmp(model, "EFIKA5K2")) return 0; ISA_DMA_THRESHOLD = ~0L; DMA_MODE_READ = 0x44; DMA_MODE_WRITE = 0x48; return 1; } define_machine(efika) { .name = EFIKA_PLATFORM_NAME, .probe = efika_probe, .setup_arch = efika_setup_arch, .init = efika_init, .show_cpuinfo = efika_show_cpuinfo, .init_IRQ = mpc52xx_init_irq, .get_irq = mpc52xx_get_irq, .restart = rtas_restart, .power_off = rtas_power_off, .halt = rtas_halt, .set_rtc_time = rtas_set_rtc_time, .get_rtc_time = rtas_get_rtc_time, .progress = rtas_progress, .get_boot_time = rtas_get_boot_time, .calibrate_decr = generic_calibrate_decr, .phys_mem_access_prot = pci_phys_mem_access_prot, };