]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/clocksource/timer-imx-gpt.c
Merge branch 'for-4.8/core' of git://git.kernel.dk/linux-block
[karo-tx-linux.git] / drivers / clocksource / timer-imx-gpt.c
index 99ec96769dda899817bf1ee41fd836a4e2bbbc53..f595460bfc589c51474abcef244663334b0316bd 100644 (file)
@@ -407,8 +407,10 @@ static const struct imx_gpt_data imx6dl_gpt_data = {
        .set_next_event = v2_set_next_event,
 };
 
-static void __init _mxc_timer_init(struct imx_timer *imxtm)
+static int __init _mxc_timer_init(struct imx_timer *imxtm)
 {
+       int ret;
+
        switch (imxtm->type) {
        case GPT_TYPE_IMX1:
                imxtm->gpt = &imx1_gpt_data;
@@ -423,12 +425,12 @@ static void __init _mxc_timer_init(struct imx_timer *imxtm)
                imxtm->gpt = &imx6dl_gpt_data;
                break;
        default:
-               BUG();
+               return -EINVAL;
        }
 
        if (IS_ERR(imxtm->clk_per)) {
                pr_err("i.MX timer: unable to get clk\n");
-               return;
+               return PTR_ERR(imxtm->clk_per);
        }
 
        if (!IS_ERR(imxtm->clk_ipg))
@@ -446,8 +448,11 @@ static void __init _mxc_timer_init(struct imx_timer *imxtm)
        imxtm->gpt->gpt_setup_tctl(imxtm);
 
        /* init and register the timer to the framework */
-       mxc_clocksource_init(imxtm);
-       mxc_clockevent_init(imxtm);
+       ret = mxc_clocksource_init(imxtm);
+       if (ret)
+               return ret;
+
+       return mxc_clockevent_init(imxtm);
 }
 
 void __init mxc_timer_init(unsigned long pbase, int irq, enum imx_gpt_type type)
@@ -469,21 +474,27 @@ void __init mxc_timer_init(unsigned long pbase, int irq, enum imx_gpt_type type)
        _mxc_timer_init(imxtm);
 }
 
-static void __init mxc_timer_init_dt(struct device_node *np,  enum imx_gpt_type type)
+static int __init mxc_timer_init_dt(struct device_node *np,  enum imx_gpt_type type)
 {
        struct imx_timer *imxtm;
        static int initialized;
+       int ret;
 
        /* Support one instance only */
        if (initialized)
-               return;
+               return 0;
 
        imxtm = kzalloc(sizeof(*imxtm), GFP_KERNEL);
-       BUG_ON(!imxtm);
+       if (!imxtm)
+               return -ENOMEM;
 
        imxtm->base = of_iomap(np, 0);
-       WARN_ON(!imxtm->base);
+       if (!imxtm->base)
+               return -ENXIO;
+
        imxtm->irq = irq_of_parse_and_map(np, 0);
+       if (imxtm->irq <= 0)
+               return -EINVAL;
 
        imxtm->clk_ipg = of_clk_get_by_name(np, "ipg");
 
@@ -494,22 +505,26 @@ static void __init mxc_timer_init_dt(struct device_node *np,  enum imx_gpt_type
 
        imxtm->type = type;
 
-       _mxc_timer_init(imxtm);
+       ret = _mxc_timer_init(imxtm);
+       if (ret)
+               return ret;
 
        initialized = 1;
+
+       return 0;
 }
 
-static void __init imx1_timer_init_dt(struct device_node *np)
+static int __init imx1_timer_init_dt(struct device_node *np)
 {
-       mxc_timer_init_dt(np, GPT_TYPE_IMX1);
+       return mxc_timer_init_dt(np, GPT_TYPE_IMX1);
 }
 
-static void __init imx21_timer_init_dt(struct device_node *np)
+static int __init imx21_timer_init_dt(struct device_node *np)
 {
-       mxc_timer_init_dt(np, GPT_TYPE_IMX21);
+       return mxc_timer_init_dt(np, GPT_TYPE_IMX21);
 }
 
-static void __init imx31_timer_init_dt(struct device_node *np)
+static int __init imx31_timer_init_dt(struct device_node *np)
 {
        enum imx_gpt_type type = GPT_TYPE_IMX31;
 
@@ -522,12 +537,12 @@ static void __init imx31_timer_init_dt(struct device_node *np)
        if (of_machine_is_compatible("fsl,imx6dl"))
                type = GPT_TYPE_IMX6DL;
 
-       mxc_timer_init_dt(np, type);
+       return mxc_timer_init_dt(np, type);
 }
 
-static void __init imx6dl_timer_init_dt(struct device_node *np)
+static int __init imx6dl_timer_init_dt(struct device_node *np)
 {
-       mxc_timer_init_dt(np, GPT_TYPE_IMX6DL);
+       return mxc_timer_init_dt(np, GPT_TYPE_IMX6DL);
 }
 
 CLOCKSOURCE_OF_DECLARE(imx1_timer, "fsl,imx1-gpt", imx1_timer_init_dt);