in via-pmu.c [285:409]
int __init find_via_pmu(void)
{
#ifdef CONFIG_PPC_PMAC
u64 taddr;
const u32 *reg;
if (pmu_state != uninitialized)
return 1;
vias = of_find_node_by_name(NULL, "via-pmu");
if (vias == NULL)
return 0;
reg = of_get_property(vias, "reg", NULL);
if (reg == NULL) {
printk(KERN_ERR "via-pmu: No \"reg\" property !\n");
goto fail;
}
taddr = of_translate_address(vias, reg);
if (taddr == OF_BAD_ADDR) {
printk(KERN_ERR "via-pmu: Can't translate address !\n");
goto fail;
}
spin_lock_init(&pmu_lock);
pmu_has_adb = 1;
pmu_intr_mask = PMU_INT_PCEJECT |
PMU_INT_SNDBRT |
PMU_INT_ADB |
PMU_INT_TICK;
if (of_node_name_eq(vias->parent, "ohare") ||
of_device_is_compatible(vias->parent, "ohare"))
pmu_kind = PMU_OHARE_BASED;
else if (of_device_is_compatible(vias->parent, "paddington"))
pmu_kind = PMU_PADDINGTON_BASED;
else if (of_device_is_compatible(vias->parent, "heathrow"))
pmu_kind = PMU_HEATHROW_BASED;
else if (of_device_is_compatible(vias->parent, "Keylargo")
|| of_device_is_compatible(vias->parent, "K2-Keylargo")) {
struct device_node *gpiop;
struct device_node *adbp;
u64 gaddr = OF_BAD_ADDR;
pmu_kind = PMU_KEYLARGO_BASED;
adbp = of_find_node_by_type(NULL, "adb");
pmu_has_adb = (adbp != NULL);
of_node_put(adbp);
pmu_intr_mask = PMU_INT_PCEJECT |
PMU_INT_SNDBRT |
PMU_INT_ADB |
PMU_INT_TICK |
PMU_INT_ENVIRONMENT;
gpiop = of_find_node_by_name(NULL, "gpio");
if (gpiop) {
reg = of_get_property(gpiop, "reg", NULL);
if (reg)
gaddr = of_translate_address(gpiop, reg);
if (gaddr != OF_BAD_ADDR)
gpio_reg = ioremap(gaddr, 0x10);
of_node_put(gpiop);
}
if (gpio_reg == NULL) {
printk(KERN_ERR "via-pmu: Can't find GPIO reg !\n");
goto fail;
}
} else
pmu_kind = PMU_UNKNOWN;
via1 = via2 = ioremap(taddr, 0x2000);
if (via1 == NULL) {
printk(KERN_ERR "via-pmu: Can't map address !\n");
goto fail_via_remap;
}
out_8(&via1[IER], IER_CLR | 0x7f); /* disable all intrs */
out_8(&via1[IFR], 0x7f); /* clear IFR */
pmu_state = idle;
if (!init_pmu())
goto fail_init;
sys_ctrler = SYS_CTRLER_PMU;
return 1;
fail_init:
iounmap(via1);
via1 = via2 = NULL;
fail_via_remap:
iounmap(gpio_reg);
gpio_reg = NULL;
fail:
of_node_put(vias);
vias = NULL;
pmu_state = uninitialized;
return 0;
#else
if (macintosh_config->adb_type != MAC_ADB_PB2)
return 0;
pmu_kind = PMU_UNKNOWN;
spin_lock_init(&pmu_lock);
pmu_has_adb = 1;
pmu_intr_mask = PMU_INT_PCEJECT |
PMU_INT_SNDBRT |
PMU_INT_ADB |
PMU_INT_TICK;
pmu_state = idle;
if (!init_pmu()) {
pmu_state = uninitialized;
return 0;
}
return 1;
#endif /* !CONFIG_PPC_PMAC */
}