static int s5pv210_cpufreq_probe()

in s5pv210-cpufreq.c [591:679]


static int s5pv210_cpufreq_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	struct device_node *np;
	int id, result = 0;

	/*
	 * HACK: This is a temporary workaround to get access to clock
	 * and DMC controller registers directly and remove static mappings
	 * and dependencies on platform headers. It is necessary to enable
	 * S5PV210 multi-platform support and will be removed together with
	 * this whole driver as soon as S5PV210 gets migrated to use
	 * cpufreq-dt driver.
	 */
	arm_regulator = regulator_get(NULL, "vddarm");
	if (IS_ERR(arm_regulator))
		return dev_err_probe(dev, PTR_ERR(arm_regulator),
				     "failed to get regulator vddarm\n");

	int_regulator = regulator_get(NULL, "vddint");
	if (IS_ERR(int_regulator)) {
		result = dev_err_probe(dev, PTR_ERR(int_regulator),
				       "failed to get regulator vddint\n");
		goto err_int_regulator;
	}

	np = of_find_compatible_node(NULL, NULL, "samsung,s5pv210-clock");
	if (!np) {
		dev_err(dev, "failed to find clock controller DT node\n");
		result = -ENODEV;
		goto err_clock;
	}

	clk_base = of_iomap(np, 0);
	of_node_put(np);
	if (!clk_base) {
		dev_err(dev, "failed to map clock registers\n");
		result = -EFAULT;
		goto err_clock;
	}

	for_each_compatible_node(np, NULL, "samsung,s5pv210-dmc") {
		id = of_alias_get_id(np, "dmc");
		if (id < 0 || id >= ARRAY_SIZE(dmc_base)) {
			dev_err(dev, "failed to get alias of dmc node '%pOFn'\n", np);
			of_node_put(np);
			result = id;
			goto err_clk_base;
		}

		dmc_base[id] = of_iomap(np, 0);
		if (!dmc_base[id]) {
			dev_err(dev, "failed to map dmc%d registers\n", id);
			of_node_put(np);
			result = -EFAULT;
			goto err_dmc;
		}
	}

	for (id = 0; id < ARRAY_SIZE(dmc_base); ++id) {
		if (!dmc_base[id]) {
			dev_err(dev, "failed to find dmc%d node\n", id);
			result = -ENODEV;
			goto err_dmc;
		}
	}

	register_reboot_notifier(&s5pv210_cpufreq_reboot_notifier);

	return cpufreq_register_driver(&s5pv210_driver);

err_dmc:
	for (id = 0; id < ARRAY_SIZE(dmc_base); ++id)
		if (dmc_base[id]) {
			iounmap(dmc_base[id]);
			dmc_base[id] = NULL;
		}

err_clk_base:
	iounmap(clk_base);

err_clock:
	regulator_put(int_regulator);

err_int_regulator:
	regulator_put(arm_regulator);

	return result;
}