clocksource/drivers/timer-ti-dm: Enable autoreload in set_pwm
authorLokesh Vutla <lokeshvutla@ti.com>
Thu, 5 Mar 2020 08:27:15 +0000 (13:57 +0530)
committerDaniel Lezcano <daniel.lezcano@linaro.org>
Mon, 16 Mar 2020 11:40:51 +0000 (12:40 +0100)
dm timer ops set_load() api allows to configure the load value and to
set the auto reload feature. But auto reload feature is independent of
load value and should be part of configuring pwm. This way pwm can be
disabled by disabling auto reload feature using set_pwm() so that the
current pwm cycle will be completed. Else pwm disabling causes the
cycle to be stopped abruptly.

Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
Acked-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Link: https://lore.kernel.org/r/20200305082715.15861-7-lokeshvutla@ti.com
drivers/clocksource/timer-ti-dm.c
drivers/pwm/pwm-omap-dmtimer.c
include/linux/platform_data/dmtimer-omap.h

index 73ac73efdef83b7bfbf47892506ca78cd6326fb8..f5c73ebfe4caf765a4f9827c2e9f60aa750b1eba 100644 (file)
@@ -562,21 +562,13 @@ static int omap_dm_timer_stop(struct omap_dm_timer *timer)
        return 0;
 }
 
-static int omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload,
+static int omap_dm_timer_set_load(struct omap_dm_timer *timer,
                                  unsigned int load)
 {
-       u32 l;
-
        if (unlikely(!timer))
                return -EINVAL;
 
        omap_dm_timer_enable(timer);
-       l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);
-       if (autoreload)
-               l |= OMAP_TIMER_CTRL_AR;
-       else
-               l &= ~OMAP_TIMER_CTRL_AR;
-       omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l);
        omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load);
 
        omap_dm_timer_disable(timer);
@@ -605,7 +597,7 @@ static int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable,
 }
 
 static int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on,
-                                int toggle, int trigger)
+                                int toggle, int trigger, int autoreload)
 {
        u32 l;
 
@@ -615,12 +607,14 @@ static int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on,
        omap_dm_timer_enable(timer);
        l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);
        l &= ~(OMAP_TIMER_CTRL_GPOCFG | OMAP_TIMER_CTRL_SCPWM |
-              OMAP_TIMER_CTRL_PT | (0x03 << 10));
+              OMAP_TIMER_CTRL_PT | (0x03 << 10) | OMAP_TIMER_CTRL_AR);
        if (def_on)
                l |= OMAP_TIMER_CTRL_SCPWM;
        if (toggle)
                l |= OMAP_TIMER_CTRL_PT;
        l |= trigger << 10;
+       if (autoreload)
+               l |= OMAP_TIMER_CTRL_AR;
        omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l);
 
        omap_dm_timer_disable(timer);
index 88a3c5690fea22e5f8062c46f758063b4c8a651a..9e4378dc6897528d075c30e821525e00a613c9b4 100644 (file)
@@ -183,7 +183,7 @@ static int pwm_omap_dmtimer_config(struct pwm_chip *chip,
        if (timer_active)
                omap->pdata->stop(omap->dm_timer);
 
-       omap->pdata->set_load(omap->dm_timer, true, load_value);
+       omap->pdata->set_load(omap->dm_timer, load_value);
        omap->pdata->set_match(omap->dm_timer, true, match_value);
 
        dev_dbg(chip->dev, "load value: %#08x (%d), match value: %#08x (%d)\n",
@@ -192,7 +192,8 @@ static int pwm_omap_dmtimer_config(struct pwm_chip *chip,
        omap->pdata->set_pwm(omap->dm_timer,
                              pwm_get_polarity(pwm) == PWM_POLARITY_INVERSED,
                              true,
-                             PWM_OMAP_DMTIMER_TRIGGER_OVERFLOW_AND_COMPARE);
+                             PWM_OMAP_DMTIMER_TRIGGER_OVERFLOW_AND_COMPARE,
+                             true);
 
        /* If config was called while timer was running it must be reenabled. */
        if (timer_active)
@@ -222,7 +223,8 @@ static int pwm_omap_dmtimer_set_polarity(struct pwm_chip *chip,
        omap->pdata->set_pwm(omap->dm_timer,
                              polarity == PWM_POLARITY_INVERSED,
                              true,
-                             PWM_OMAP_DMTIMER_TRIGGER_OVERFLOW_AND_COMPARE);
+                             PWM_OMAP_DMTIMER_TRIGGER_OVERFLOW_AND_COMPARE,
+                             true);
        mutex_unlock(&omap->mutex);
 
        return 0;
index 3173b7b6ff6f30dd85d3e6c0e586d35144711e60..95d852aef130e3d630d5863cf24957d4f6767b31 100644 (file)
@@ -30,12 +30,11 @@ struct omap_dm_timer_ops {
        int     (*stop)(struct omap_dm_timer *timer);
        int     (*set_source)(struct omap_dm_timer *timer, int source);
 
-       int     (*set_load)(struct omap_dm_timer *timer, int autoreload,
-                           unsigned int value);
+       int     (*set_load)(struct omap_dm_timer *timer, unsigned int value);
        int     (*set_match)(struct omap_dm_timer *timer, int enable,
                             unsigned int match);
        int     (*set_pwm)(struct omap_dm_timer *timer, int def_on,
-                          int toggle, int trigger);
+                          int toggle, int trigger, int autoreload);
        int     (*get_pwm_status)(struct omap_dm_timer *timer);
        int     (*set_prescaler)(struct omap_dm_timer *timer, int prescaler);