Skip to content

Commit

Permalink
clocksource/drivers/mips-gic-timer: Convert init function to return e…
Browse files Browse the repository at this point in the history
…rror

The init functions do not return any error. They behave as the following:

  - panic, thus leading to a kernel crash while another timer may work and
       make the system boot up correctly

  or

  - print an error and let the caller unaware if the state of the system

Change that by converting the init functions to return an error conforming
to the CLOCKSOURCE_OF_RET prototype.

Proper error handling (rollback, errno value) will be changed later case
by case, thus this change just return back an error or success in the init
function.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
  • Loading branch information
Daniel Lezcano committed Jun 28, 2016
1 parent ca46acb commit d8152bf
Showing 1 changed file with 17 additions and 9 deletions.
26 changes: 17 additions & 9 deletions drivers/clocksource/mips-gic-timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ static struct clocksource gic_clocksource = {
.archdata = { .vdso_clock_mode = VDSO_CLOCK_GIC },
};

static void __init __gic_clocksource_init(void)
static int __init __gic_clocksource_init(void)
{
int ret;

Expand All @@ -159,6 +159,8 @@ static void __init __gic_clocksource_init(void)
ret = clocksource_register_hz(&gic_clocksource, gic_frequency);
if (ret < 0)
pr_warn("GIC: Unable to register clocksource\n");

return ret;
}

void __init gic_clocksource_init(unsigned int frequency)
Expand All @@ -179,31 +181,35 @@ static void __init gic_clocksource_of_init(struct device_node *node)
struct clk *clk;
int ret;

if (WARN_ON(!gic_present || !node->parent ||
!of_device_is_compatible(node->parent, "mti,gic")))
return;
if (!gic_present || !node->parent ||
!of_device_is_compatible(node->parent, "mti,gic")) {
pr_warn("No DT definition for the mips gic driver");
return -ENXIO;
}

clk = of_clk_get(node, 0);
if (!IS_ERR(clk)) {
if (clk_prepare_enable(clk) < 0) {
pr_err("GIC failed to enable clock\n");
clk_put(clk);
return;
return PTR_ERR(clk);
}

gic_frequency = clk_get_rate(clk);
} else if (of_property_read_u32(node, "clock-frequency",
&gic_frequency)) {
pr_err("GIC frequency not specified.\n");
return;
return -EINVAL;;
}
gic_timer_irq = irq_of_parse_and_map(node, 0);
if (!gic_timer_irq) {
pr_err("GIC timer IRQ not specified.\n");
return;
return -EINVAL;;
}

__gic_clocksource_init();
ret = __gic_clocksource_init();
if (ret)
return ret;

ret = gic_clockevent_init();
if (!ret && !IS_ERR(clk)) {
Expand All @@ -213,6 +219,8 @@ static void __init gic_clocksource_of_init(struct device_node *node)

/* And finally start the counter */
gic_start_count();

return 0;
}
CLOCKSOURCE_OF_DECLARE(mips_gic_timer, "mti,gic-timer",
CLOCKSOURCE_OF_DECLARE_RET(mips_gic_timer, "mti,gic-timer",
gic_clocksource_of_init);

0 comments on commit d8152bf

Please sign in to comment.