void __init spear_setup_of_timer(void) { struct device_node *np; int irq, ret; np = of_find_matching_node(NULL, timer_of_match); if (!np) { pr_err("%s: No timer passed via DT\n", __func__); return; } irq = irq_of_parse_and_map(np, 0); if (!irq) { pr_err("%s: No irq passed for timer via DT\n", __func__); return; } gpt_base = of_iomap(np, 0); if (!gpt_base) { pr_err("%s: of iomap failed\n", __func__); return; } gpt_clk = clk_get_sys("gpt0", NULL); if (!gpt_clk) { pr_err("%s:couldn't get clk for gpt\n", __func__); goto err_iomap; } ret = clk_prepare_enable(gpt_clk); if (ret < 0) { pr_err("%s:couldn't prepare-enable gpt clock\n", __func__); goto err_prepare_enable_clk; } spear_clockevent_init(irq); spear_clocksource_init(); return; err_prepare_enable_clk: clk_put(gpt_clk); err_iomap: iounmap(gpt_base); }
void __init spear_setup_timer(void) { int ret; if (!request_mem_region(SPEAR_GPT0_BASE, SZ_1K, "gpt0")) { pr_err("%s:cannot get IO addr\n", __func__); return; } gpt_base = (void __iomem *)ioremap(SPEAR_GPT0_BASE, SZ_1K); if (!gpt_base) { pr_err("%s:ioremap failed for gpt\n", __func__); goto err_mem; } gpt_clk = clk_get_sys("gpt0", NULL); if (!gpt_clk) { pr_err("%s:couldn't get clk for gpt\n", __func__); goto err_iomap; } ret = clk_enable(gpt_clk); if (ret < 0) { pr_err("%s:couldn't enable gpt clock\n", __func__); goto err_clk; } spear_clockevent_init(); spear_clocksource_init(); return; err_clk: clk_put(gpt_clk); err_iomap: iounmap(gpt_base); err_mem: release_mem_region(SPEAR_GPT0_BASE, SZ_1K); }