]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/clocksource/em_sti.c
Merge tag 'sound-4.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai...
[mirror_ubuntu-bionic-kernel.git] / drivers / clocksource / em_sti.c
index aff87df07449d62d0fc0b401f4038463b18ab326..bc48cbf6a7957198d4ecd6bf91840df350843d48 100644 (file)
@@ -78,15 +78,12 @@ static int em_sti_enable(struct em_sti_priv *p)
        int ret;
 
        /* enable clock */
-       ret = clk_prepare_enable(p->clk);
+       ret = clk_enable(p->clk);
        if (ret) {
                dev_err(&p->pdev->dev, "cannot enable clock\n");
                return ret;
        }
 
-       /* configure channel, periodic mode and maximum timeout */
-       p->rate = clk_get_rate(p->clk);
-
        /* reset the counter */
        em_sti_write(p, STI_SET_H, 0x40000000);
        em_sti_write(p, STI_SET_L, 0x00000000);
@@ -107,7 +104,7 @@ static void em_sti_disable(struct em_sti_priv *p)
        em_sti_write(p, STI_INTENCLR, 3);
 
        /* stop clock */
-       clk_disable_unprepare(p->clk);
+       clk_disable(p->clk);
 }
 
 static u64 em_sti_count(struct em_sti_priv *p)
@@ -205,13 +202,9 @@ static u64 em_sti_clocksource_read(struct clocksource *cs)
 
 static int em_sti_clocksource_enable(struct clocksource *cs)
 {
-       int ret;
        struct em_sti_priv *p = cs_to_em_sti(cs);
 
-       ret = em_sti_start(p, USER_CLOCKSOURCE);
-       if (!ret)
-               __clocksource_update_freq_hz(cs, p->rate);
-       return ret;
+       return em_sti_start(p, USER_CLOCKSOURCE);
 }
 
 static void em_sti_clocksource_disable(struct clocksource *cs)
@@ -240,8 +233,7 @@ static int em_sti_register_clocksource(struct em_sti_priv *p)
 
        dev_info(&p->pdev->dev, "used as clock source\n");
 
-       /* Register with dummy 1 Hz value, gets updated in ->enable() */
-       clocksource_register_hz(cs, 1);
+       clocksource_register_hz(cs, p->rate);
        return 0;
 }
 
@@ -263,7 +255,6 @@ static int em_sti_clock_event_set_oneshot(struct clock_event_device *ced)
 
        dev_info(&p->pdev->dev, "used for oneshot clock events\n");
        em_sti_start(p, USER_CLOCKEVENT);
-       clockevents_config(&p->ced, p->rate);
        return 0;
 }
 
@@ -294,8 +285,7 @@ static void em_sti_register_clockevent(struct em_sti_priv *p)
 
        dev_info(&p->pdev->dev, "used for clock events\n");
 
-       /* Register with dummy 1 Hz value, gets updated in ->set_state_oneshot() */
-       clockevents_config_and_register(ced, 1, 2, 0xffffffff);
+       clockevents_config_and_register(ced, p->rate, 2, 0xffffffff);
 }
 
 static int em_sti_probe(struct platform_device *pdev)
@@ -303,6 +293,7 @@ static int em_sti_probe(struct platform_device *pdev)
        struct em_sti_priv *p;
        struct resource *res;
        int irq;
+       int ret;
 
        p = devm_kzalloc(&pdev->dev, sizeof(*p), GFP_KERNEL);
        if (p == NULL)
@@ -323,6 +314,13 @@ static int em_sti_probe(struct platform_device *pdev)
        if (IS_ERR(p->base))
                return PTR_ERR(p->base);
 
+       if (devm_request_irq(&pdev->dev, irq, em_sti_interrupt,
+                            IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING,
+                            dev_name(&pdev->dev), p)) {
+               dev_err(&pdev->dev, "failed to request low IRQ\n");
+               return -ENOENT;
+       }
+
        /* get hold of clock */
        p->clk = devm_clk_get(&pdev->dev, "sclk");
        if (IS_ERR(p->clk)) {
@@ -330,12 +328,20 @@ static int em_sti_probe(struct platform_device *pdev)
                return PTR_ERR(p->clk);
        }
 
-       if (devm_request_irq(&pdev->dev, irq, em_sti_interrupt,
-                            IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING,
-                            dev_name(&pdev->dev), p)) {
-               dev_err(&pdev->dev, "failed to request low IRQ\n");
-               return -ENOENT;
+       ret = clk_prepare(p->clk);
+       if (ret < 0) {
+               dev_err(&pdev->dev, "cannot prepare clock\n");
+               return ret;
+       }
+
+       ret = clk_enable(p->clk);
+       if (ret < 0) {
+               dev_err(&p->pdev->dev, "cannot enable clock\n");
+               clk_unprepare(p->clk);
+               return ret;
        }
+       p->rate = clk_get_rate(p->clk);
+       clk_disable(p->clk);
 
        raw_spin_lock_init(&p->lock);
        em_sti_register_clockevent(p);