static int __init olpc_init(void) { unsigned char *romsig; /* The ioremap check is dangerous; limit what we run it on */ if (!is_geode() || cs5535_has_vsa2()) return 0; spin_lock_init(&ec_lock); romsig = ioremap(0xffffffc0, 16); if (!romsig) return 0; if (strncmp(romsig, "CL1 Q", 7)) goto unmap; if (strncmp(romsig+6, romsig+13, 3)) { printk(KERN_INFO "OLPC BIOS signature looks invalid. " "Assuming not OLPC\n"); goto unmap; } printk(KERN_INFO "OLPC board with OpenFirmware %.16s\n", romsig); olpc_platform_info.flags |= OLPC_F_PRESENT; /* get the platform revision */ platform_detect(); /* assume B1 and above models always have a DCON */ if (olpc_board_at_least(olpc_board(0xb1))) olpc_platform_info.flags |= OLPC_F_DCON; /* get the EC revision */ olpc_ec_cmd(EC_FIRMWARE_REV, NULL, 0, (unsigned char *) &olpc_platform_info.ecver, 1); #ifdef CONFIG_PCI_OLPC /* If the VSA exists let it emulate PCI, if not emulate in kernel */ if (!cs5535_has_vsa2()) x86_init.pci.arch_init = pci_olpc_init; #endif printk(KERN_INFO "OLPC board revision %s%X (EC=%x)\n", ((olpc_platform_info.boardrev & 0xf) < 8) ? "pre" : "", olpc_platform_info.boardrev >> 4, olpc_platform_info.ecver); unmap: iounmap(romsig); return 0; }
static int __init olpc_init(void) { int r = 0; if (!olpc_ofw_present() || !platform_detect()) return 0; spin_lock_init(&ec_lock); /* assume B1 and above models always have a DCON */ if (olpc_board_at_least(olpc_board(0xb1))) olpc_platform_info.flags |= OLPC_F_DCON; /* get the EC revision */ olpc_ec_cmd(EC_FIRMWARE_REV, NULL, 0, (unsigned char *) &olpc_platform_info.ecver, 1); #ifdef CONFIG_PCI_OLPC /* If the VSA exists let it emulate PCI, if not emulate in kernel. * XO-1 only. */ if (olpc_platform_info.boardrev < olpc_board_pre(0xd0) && !cs5535_has_vsa2()) x86_init.pci.arch_init = pci_olpc_init; #endif /* EC version 0x5f adds support for wide SCI mask */ if (olpc_platform_info.ecver >= 0x5f) olpc_platform_info.flags |= OLPC_F_EC_WIDE_SCI; printk(KERN_INFO "OLPC board revision %s%X (EC=%x)\n", ((olpc_platform_info.boardrev & 0xf) < 8) ? "pre" : "", olpc_platform_info.boardrev >> 4, olpc_platform_info.ecver); if (olpc_platform_info.boardrev < olpc_board_pre(0xd0)) { /* XO-1 */ r = add_xo1_platform_devices(); if (r) return r; } register_syscore_ops(&olpc_syscore_ops); setup_debugfs(); return 0; }
static int __init diag_init(void) { static struct proc_dir_entry *p; static struct platform_t *detected; detected = platform_detect(); if (!detected) { printk(MODULE_NAME ": Router model not detected.\n"); return -ENODEV; } memcpy(&platform, detected, sizeof(struct platform_t)); printk(MODULE_NAME ": Detected '%s'\n", platform.name); if (platform.platform_init != NULL) { platform.platform_init(); } if (!(diag = proc_mkdir("diag", NULL))) { printk(MODULE_NAME ": proc_mkdir on /proc/diag failed\n"); return -EINVAL; } p = proc_create("model", S_IRUSR, diag, &diag_model_fops); if (!p) { remove_proc_entry("diag", NULL); return -EINVAL; } p = proc_create("gpiomask", S_IRUSR | S_IWUSR, diag, &diag_gpiomask_fops); if (!p) { remove_proc_entry("model", diag); remove_proc_entry("diag", NULL); return -EINVAL; } if (platform.buttons) register_buttons(platform.buttons); if (platform.leds) register_leds(platform.leds); return 0; }
static int __init rtc_init(void) { int cr1; platform_detect(); if (sda_index == scl_index) { printk(KERN_ERR "RTC-RV5C386A: unrecognized platform!\n"); return -ENODEV; } i2c_init(); /* * Switch RTC to 24h mode */ spin_lock_irq(&rtc_lock); i2c_start(); i2c_outb(RTC_I2C_ADDRESS | I2C_WRITE_MASK); i2c_outb(0xE4); /* start at address 0xE, transmission mode 4 */ cr1 = i2c_inb(I2C_NAK); i2c_stop(); spin_unlock_irq(&rtc_lock); if ((cr1 & RTC_24HOUR_MODE_MASK) == 0) { /* RTC is running in 12h mode */ printk(KERN_INFO "rtc.o: switching to 24h mode\n"); spin_lock_irq(&rtc_lock); i2c_start(); i2c_outb(RTC_I2C_ADDRESS | I2C_WRITE_MASK); i2c_outb(0xE0); i2c_outb(cr1 | RTC_24HOUR_MODE_MASK); i2c_stop(); spin_unlock_irq(&rtc_lock); } misc_register(&rtc_dev); printk(KERN_INFO "RV5C386A Real Time Clock Driver loaded\n"); return 0; }
void board_init() { platform_detect(); target_detect(&board); target_baseband_detect(&board); }