static int __init sh_mv_setup(char **cmdline_p) { #if defined(CONFIG_SH_UNKNOWN) extern struct sh_machine_vector mv_unknown; #endif struct sh_machine_vector *mv = NULL; char mv_name[MV_NAME_SIZE] = ""; unsigned long mv_io_base = 0; int mv_mmio_enable = 0; parse_cmdline(cmdline_p, mv_name, &mv, &mv_io_base, &mv_mmio_enable); #ifdef CONFIG_SH_GENERIC if (mv == NULL) { mv = &mv_unknown; if (*mv_name != '\0') { printk("Warning: Unsupported machine %s, using unknown\n", mv_name); } } sh_mv = *mv; #endif #ifdef CONFIG_SH_UNKNOWN sh_mv = mv_unknown; #endif /* * Manually walk the vec, fill in anything that the board hasn't yet * by hand, wrapping to the generic implementation. */ #define mv_set(elem) do { \ if (!sh_mv.mv_##elem) \ sh_mv.mv_##elem = generic_##elem; \ } while (0) mv_set(inb); mv_set(inw); mv_set(inl); mv_set(outb); mv_set(outw); mv_set(outl); mv_set(inb_p); mv_set(inw_p); mv_set(inl_p); mv_set(outb_p); mv_set(outw_p); mv_set(outl_p); mv_set(insb); mv_set(insw); mv_set(insl); mv_set(outsb); mv_set(outsw); mv_set(outsl); mv_set(readb); mv_set(readw); mv_set(readl); mv_set(writeb); mv_set(writew); mv_set(writel); mv_set(ioremap); mv_set(iounmap); mv_set(isa_port2addr); mv_set(irq_demux); #ifdef CONFIG_SH_UNKNOWN __set_io_port_base(mv_io_base); #endif return 0; }
void __init sh_mv_setup(void) { /* * Only overload the machvec if one hasn't been selected on * the command line with sh_mv= */ if (!machvec_selected) { unsigned long machvec_size; machvec_size = ((unsigned long)&__machvec_end - (unsigned long)&__machvec_start); /* * Sanity check for machvec section alignment. Ensure * __initmv hasn't been misused. */ if (machvec_size % sizeof(struct sh_machine_vector)) panic("machvec misaligned, invalid __initmv use?"); /* * If the machvec hasn't been preselected, use the first * vector (usually the only one) from .machvec.init. */ if (machvec_size >= sizeof(struct sh_machine_vector)) sh_mv = *(struct sh_machine_vector *)&__machvec_start; } printk(KERN_NOTICE "Booting machvec: %s\n", get_system_type()); /* * Manually walk the vec, fill in anything that the board hasn't yet * by hand, wrapping to the generic implementation. */ #define mv_set(elem) do { \ if (!sh_mv.mv_##elem) \ sh_mv.mv_##elem = generic_##elem; \ } while (0) mv_set(inb); mv_set(inw); mv_set(inl); mv_set(outb); mv_set(outw); mv_set(outl); mv_set(inb_p); mv_set(inw_p); mv_set(inl_p); mv_set(outb_p); mv_set(outw_p); mv_set(outl_p); mv_set(insb); mv_set(insw); mv_set(insl); mv_set(outsb); mv_set(outsw); mv_set(outsl); mv_set(ioport_map); mv_set(ioport_unmap); mv_set(irq_demux); mv_set(mode_pins); if (!sh_mv.mv_nr_irqs) sh_mv.mv_nr_irqs = NR_IRQS; __set_io_port_base(P2SEG); }