static int __init init_hrt_clocksource(void) { if (!scx200_cb_present()) return -ENODEV; if (!request_region(scx200_cb_base + SCx200_TIMER_OFFSET, SCx200_TIMER_SIZE, "NatSemi SCx200 High-Resolution Timer")) { printk(KERN_WARNING NAME ": unable to lock timer region\n"); return -ENODEV; } outb(HR_TMEN | (mhz27 ? HR_TMCLKSEL : 0), scx200_cb_base + SCx200_TMCNFG_OFFSET); if (mhz27) { cs_hrt.shift = HRT_SHIFT_27; cs_hrt.mult = clocksource_hz2mult((HRT_FREQ + ppm) * 27, cs_hrt.shift); } else { cs_hrt.shift = HRT_SHIFT_1; cs_hrt.mult = clocksource_hz2mult(HRT_FREQ + ppm, cs_hrt.shift); } printk(KERN_INFO "enabling scx200 high-res timer (%s MHz +%d ppm)\n", mhz27 ? "27":"1", ppm); return clocksource_register(&cs_hrt); }
static int __init init_hrt_clocksource(void) { /* Make sure scx200 has initialized the configuration block */ if (!scx200_cb_present()) return -ENODEV; /* Reserve the timer's ISA io-region for ourselves */ if (!request_region(scx200_cb_base + SCx200_TIMER_OFFSET, SCx200_TIMER_SIZE, "NatSemi SCx200 High-Resolution Timer")) { ; return -ENODEV; } /* write timer config */ outb(HR_TMEN | (mhz27 ? HR_TMCLKSEL : 0), scx200_cb_base + SCx200_TMCNFG_OFFSET); if (mhz27) { cs_hrt.shift = HRT_SHIFT_27; cs_hrt.mult = clocksource_hz2mult((HRT_FREQ + ppm) * 27, cs_hrt.shift); } else { cs_hrt.shift = HRT_SHIFT_1; cs_hrt.mult = clocksource_hz2mult(HRT_FREQ + ppm, cs_hrt.shift); } // printk(KERN_INFO "enabling scx200 high-res timer (%s MHz +%d ppm)\n", ; return clocksource_register(&cs_hrt); }
static int __init init_hrt_clocksource(void) { u32 freq; if (!scx200_cb_present()) return -ENODEV; if (!request_region(scx200_cb_base + SCx200_TIMER_OFFSET, SCx200_TIMER_SIZE, "NatSemi SCx200 High-Resolution Timer")) { pr_warn("unable to lock timer region\n"); return -ENODEV; } outb(HR_TMEN | (mhz27 ? HR_TMCLKSEL : 0), scx200_cb_base + SCx200_TMCNFG_OFFSET); freq = (HRT_FREQ + ppm); if (mhz27) freq *= 27; pr_info("enabling scx200 high-res timer (%s MHz +%d ppm)\n", mhz27 ? "27":"1", ppm); return clocksource_register_hz(&cs_hrt, freq); }
static int __init init_scx200_docflash(void) { unsigned u; unsigned base; unsigned ctrl; unsigned pmr; struct pci_dev *bridge; printk(KERN_DEBUG NAME ": NatSemi SCx200 DOCCS Flash Driver\n"); if ((bridge = pci_get_device(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_SCx200_BRIDGE, NULL)) == NULL) return -ENODEV; /* */ if (!scx200_cb_present()) { pci_dev_put(bridge); return -ENODEV; } if (probe) { /* */ pci_read_config_dword(bridge, SCx200_DOCCS_BASE, &base); pci_read_config_dword(bridge, SCx200_DOCCS_CTRL, &ctrl); pci_dev_put(bridge); pmr = inl(scx200_cb_base + SCx200_PMR); if (base == 0 || (ctrl & 0x07000000) != 0x07000000 || (ctrl & 0x0007ffff) == 0) return -ENODEV; size = ((ctrl&0x1fff)<<13) + (1<<13); for (u = size; u > 1; u >>= 1) ; if (u != 1) return -ENODEV; if (pmr & (1<<6)) width = 16; else width = 8; docmem.start = base; docmem.end = base + size; if (request_resource(&iomem_resource, &docmem)) { printk(KERN_ERR NAME ": unable to allocate memory for flash mapping\n"); return -ENOMEM; } } else {