static int __init ftm_timer_init()

in timer-fsl-ftm.c [298:354]


static int __init ftm_timer_init(struct device_node *np)
{
	unsigned long freq;
	int ret, irq;

	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;

	ret = -ENXIO;
	priv->clkevt_base = of_iomap(np, 0);
	if (!priv->clkevt_base) {
		pr_err("ftm: unable to map event timer registers\n");
		goto err_clkevt;
	}

	priv->clksrc_base = of_iomap(np, 1);
	if (!priv->clksrc_base) {
		pr_err("ftm: unable to map source timer registers\n");
		goto err_clksrc;
	}

	ret = -EINVAL;
	irq = irq_of_parse_and_map(np, 0);
	if (irq <= 0) {
		pr_err("ftm: unable to get IRQ from DT, %d\n", irq);
		goto err;
	}

	priv->big_endian = of_property_read_bool(np, "big-endian");

	freq = ftm_clk_init(np);
	if (!freq)
		goto err;

	ret = ftm_calc_closest_round_cyc(freq);
	if (ret)
		goto err;

	ret = ftm_clocksource_init(freq);
	if (ret)
		goto err;

	ret = ftm_clockevent_init(freq, irq);
	if (ret)
		goto err;

	return 0;

err:
	iounmap(priv->clksrc_base);
err_clksrc:
	iounmap(priv->clkevt_base);
err_clkevt:
	kfree(priv);
	return ret;
}