int __init find_via_pmu()

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 */
}