static int __init asr_get_base_address(void) { unsigned char low, high; const char *type = ""; asr_length = 1; switch (asr_type) { case ASMTYPE_TOPAZ: /* SELECT SuperIO CHIP FOR QUERYING (WRITE 0x07 TO BOTH 0x2E and 0x2F) */ outb(0x07, 0x2e); outb(0x07, 0x2f); /* SELECT AND READ THE HIGH-NIBBLE OF THE GPIO BASE ADDRESS */ outb(0x60, 0x2e); high = inb(0x2f); /* SELECT AND READ THE LOW-NIBBLE OF THE GPIO BASE ADDRESS */ outb(0x61, 0x2e); low = inb(0x2f); asr_base = (high << 16) | low; asr_read_addr = asr_write_addr = asr_base + TOPAZ_ASR_REG_OFFSET; asr_length = 5; break; case ASMTYPE_JASPER: type = "Jaspers "; #if 0 u32 r; /* Suggested fix */ pdev = pci_get_bus_and_slot(0, DEVFN(0x1f, 0)); if (pdev == NULL) return -ENODEV; pci_read_config_dword(pdev, 0x58, &r); asr_base = r & 0xFFFE; pci_dev_put(pdev); #else /* FIXME: need to use pci_config_lock here, but it's not exported */ /* spin_lock_irqsave(&pci_config_lock, flags);*/ /* Select the SuperIO chip in the PCI I/O port register */ outl(0x8000f858, 0xcf8); /* BUS 0, Slot 1F, fnc 0, offset 58 */ /* * Read the base address for the SuperIO chip. * Only the lower 16 bits are valid, but the address is word * aligned so the last bit must be masked off. */ asr_base = inl(0xcfc) & 0xfffe; /* spin_unlock_irqrestore(&pci_config_lock, flags);*/ #endif asr_read_addr = asr_write_addr = asr_base + JASPER_ASR_REG_OFFSET; asr_toggle_mask = JASPER_ASR_TOGGLE_MASK; asr_disable_mask = JASPER_ASR_DISABLE_MASK; asr_length = JASPER_ASR_REG_OFFSET + 1; break; case ASMTYPE_PEARL: type = "Pearls "; asr_base = PEARL_BASE; asr_read_addr = PEARL_READ; asr_write_addr = PEARL_WRITE; asr_toggle_mask = PEARL_ASR_TOGGLE_MASK; asr_disable_mask = PEARL_ASR_DISABLE_MASK; asr_length = 4; break; case ASMTYPE_JUNIPER: type = "Junipers "; asr_base = JUNIPER_BASE_ADDRESS; asr_read_addr = asr_write_addr = asr_base; asr_toggle_mask = JUNIPER_ASR_TOGGLE_MASK; asr_disable_mask = JUNIPER_ASR_DISABLE_MASK; break; case ASMTYPE_SPRUCE: type = "Spruce's "; asr_base = SPRUCE_BASE_ADDRESS; asr_read_addr = asr_write_addr = asr_base; asr_toggle_mask = SPRUCE_ASR_TOGGLE_MASK; asr_disable_mask = SPRUCE_ASR_DISABLE_MASK; break; } if (!request_region(asr_base, asr_length, "ibmasr")) { pr_err("address %#x already in use\n", asr_base); return -EBUSY; } pr_info("found %sASR @ addr %#x\n", type, asr_base); return 0; }
static int __init asr_get_base_address(void) { unsigned char low, high; const char *type = ""; asr_length = 1; switch (asr_type) { case ASMTYPE_TOPAZ: /* */ outb(0x07, 0x2e); outb(0x07, 0x2f); /* */ outb(0x60, 0x2e); high = inb(0x2f); /* */ outb(0x61, 0x2e); low = inb(0x2f); asr_base = (high << 16) | low; asr_read_addr = asr_write_addr = asr_base + TOPAZ_ASR_REG_OFFSET; asr_length = 5; break; case ASMTYPE_JASPER: type = "Jaspers "; #if 0 u32 r; /* */ pdev = pci_get_bus_and_slot(0, DEVFN(0x1f, 0)); if (pdev == NULL) return -ENODEV; pci_read_config_dword(pdev, 0x58, &r); asr_base = r & 0xFFFE; pci_dev_put(pdev); #else /* */ /* */ /* */ outl(0x8000f858, 0xcf8); /* */ /* */ asr_base = inl(0xcfc) & 0xfffe; /* */ #endif asr_read_addr = asr_write_addr = asr_base + JASPER_ASR_REG_OFFSET; asr_toggle_mask = JASPER_ASR_TOGGLE_MASK; asr_disable_mask = JASPER_ASR_DISABLE_MASK; asr_length = JASPER_ASR_REG_OFFSET + 1; break; case ASMTYPE_PEARL: type = "Pearls "; asr_base = PEARL_BASE; asr_read_addr = PEARL_READ; asr_write_addr = PEARL_WRITE; asr_toggle_mask = PEARL_ASR_TOGGLE_MASK; asr_disable_mask = PEARL_ASR_DISABLE_MASK; asr_length = 4; break; case ASMTYPE_JUNIPER: type = "Junipers "; asr_base = JUNIPER_BASE_ADDRESS; asr_read_addr = asr_write_addr = asr_base; asr_toggle_mask = JUNIPER_ASR_TOGGLE_MASK; asr_disable_mask = JUNIPER_ASR_DISABLE_MASK; break; case ASMTYPE_SPRUCE: type = "Spruce's "; asr_base = SPRUCE_BASE_ADDRESS; asr_read_addr = asr_write_addr = asr_base; asr_toggle_mask = SPRUCE_ASR_TOGGLE_MASK; asr_disable_mask = SPRUCE_ASR_DISABLE_MASK; break; } if (!request_region(asr_base, asr_length, "ibmasr")) { pr_err("address %#x already in use\n", asr_base); return -EBUSY; } pr_info("found %sASR @ addr %#x\n", type, asr_base); return 0; }