Skip to content

Commit 02e6d54

Browse files
lokeshvutladlezcano
authored andcommitted
clocksource/drivers/timer-ti-dm: Enable autoreload in set_pwm
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 <[email protected]> Acked-by: Tony Lindgren <[email protected]> Signed-off-by: Daniel Lezcano <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 92fd868 commit 02e6d54

File tree

3 files changed

+12
-17
lines changed

3 files changed

+12
-17
lines changed

drivers/clocksource/timer-ti-dm.c

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -562,21 +562,13 @@ static int omap_dm_timer_stop(struct omap_dm_timer *timer)
562562
return 0;
563563
}
564564

565-
static int omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload,
565+
static int omap_dm_timer_set_load(struct omap_dm_timer *timer,
566566
unsigned int load)
567567
{
568-
u32 l;
569-
570568
if (unlikely(!timer))
571569
return -EINVAL;
572570

573571
omap_dm_timer_enable(timer);
574-
l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);
575-
if (autoreload)
576-
l |= OMAP_TIMER_CTRL_AR;
577-
else
578-
l &= ~OMAP_TIMER_CTRL_AR;
579-
omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l);
580572
omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load);
581573

582574
omap_dm_timer_disable(timer);
@@ -605,7 +597,7 @@ static int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable,
605597
}
606598

607599
static int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on,
608-
int toggle, int trigger)
600+
int toggle, int trigger, int autoreload)
609601
{
610602
u32 l;
611603

@@ -615,12 +607,14 @@ static int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on,
615607
omap_dm_timer_enable(timer);
616608
l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);
617609
l &= ~(OMAP_TIMER_CTRL_GPOCFG | OMAP_TIMER_CTRL_SCPWM |
618-
OMAP_TIMER_CTRL_PT | (0x03 << 10));
610+
OMAP_TIMER_CTRL_PT | (0x03 << 10) | OMAP_TIMER_CTRL_AR);
619611
if (def_on)
620612
l |= OMAP_TIMER_CTRL_SCPWM;
621613
if (toggle)
622614
l |= OMAP_TIMER_CTRL_PT;
623615
l |= trigger << 10;
616+
if (autoreload)
617+
l |= OMAP_TIMER_CTRL_AR;
624618
omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l);
625619

626620
omap_dm_timer_disable(timer);

drivers/pwm/pwm-omap-dmtimer.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ static int pwm_omap_dmtimer_config(struct pwm_chip *chip,
183183
if (timer_active)
184184
omap->pdata->stop(omap->dm_timer);
185185

186-
omap->pdata->set_load(omap->dm_timer, true, load_value);
186+
omap->pdata->set_load(omap->dm_timer, load_value);
187187
omap->pdata->set_match(omap->dm_timer, true, match_value);
188188

189189
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,
192192
omap->pdata->set_pwm(omap->dm_timer,
193193
pwm_get_polarity(pwm) == PWM_POLARITY_INVERSED,
194194
true,
195-
PWM_OMAP_DMTIMER_TRIGGER_OVERFLOW_AND_COMPARE);
195+
PWM_OMAP_DMTIMER_TRIGGER_OVERFLOW_AND_COMPARE,
196+
true);
196197

197198
/* If config was called while timer was running it must be reenabled. */
198199
if (timer_active)
@@ -222,7 +223,8 @@ static int pwm_omap_dmtimer_set_polarity(struct pwm_chip *chip,
222223
omap->pdata->set_pwm(omap->dm_timer,
223224
polarity == PWM_POLARITY_INVERSED,
224225
true,
225-
PWM_OMAP_DMTIMER_TRIGGER_OVERFLOW_AND_COMPARE);
226+
PWM_OMAP_DMTIMER_TRIGGER_OVERFLOW_AND_COMPARE,
227+
true);
226228
mutex_unlock(&omap->mutex);
227229

228230
return 0;

include/linux/platform_data/dmtimer-omap.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,11 @@ struct omap_dm_timer_ops {
3030
int (*stop)(struct omap_dm_timer *timer);
3131
int (*set_source)(struct omap_dm_timer *timer, int source);
3232

33-
int (*set_load)(struct omap_dm_timer *timer, int autoreload,
34-
unsigned int value);
33+
int (*set_load)(struct omap_dm_timer *timer, unsigned int value);
3534
int (*set_match)(struct omap_dm_timer *timer, int enable,
3635
unsigned int match);
3736
int (*set_pwm)(struct omap_dm_timer *timer, int def_on,
38-
int toggle, int trigger);
37+
int toggle, int trigger, int autoreload);
3938
int (*get_pwm_status)(struct omap_dm_timer *timer);
4039
int (*set_prescaler)(struct omap_dm_timer *timer, int prescaler);
4140

0 commit comments

Comments
 (0)