diff options
author | Tomasz Figa <t.figa@samsung.com> | 2013-04-23 11:46:30 -0400 |
---|---|---|
committer | Olof Johansson <olof@lixom.net> | 2013-04-28 15:17:05 -0400 |
commit | 81d4f7bfdc9417e7d8fc1133c762daa4458eec5e (patch) | |
tree | a9942c9fb2ec8d830ead2fb01517b7f95985fb80 /drivers/clocksource | |
parent | 6fe4dfd041dadbc1cc2460ed8680f2734dc3dc95 (diff) |
clocksource: samsung_pwm_timer: Work around rounding errors in clockevents core
Due to rounding errors in clockevents core (in conversions between ticks
and nsecs), it might happen that the set_next_event callback gets called
with cycles = 0, causing the code to incorrectly program the PWM timer.
This patch modifies the callback to program the timer for 1 tick, if
received tick count value is 0.
Signed-off-by: Tomasz Figa <t.figa@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Kukjin Kim <kgene.kim@samsung.com>
Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'drivers/clocksource')
-rw-r--r-- | drivers/clocksource/samsung_pwm_timer.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/clocksource/samsung_pwm_timer.c b/drivers/clocksource/samsung_pwm_timer.c index 92b2f130ae9b..0234c8d2c8f2 100644 --- a/drivers/clocksource/samsung_pwm_timer.c +++ b/drivers/clocksource/samsung_pwm_timer.c | |||
@@ -176,6 +176,19 @@ static void samsung_time_start(unsigned int channel, bool periodic) | |||
176 | static int samsung_set_next_event(unsigned long cycles, | 176 | static int samsung_set_next_event(unsigned long cycles, |
177 | struct clock_event_device *evt) | 177 | struct clock_event_device *evt) |
178 | { | 178 | { |
179 | /* | ||
180 | * This check is needed to account for internal rounding | ||
181 | * errors inside clockevents core, which might result in | ||
182 | * passing cycles = 0, which in turn would not generate any | ||
183 | * timer interrupt and hang the system. | ||
184 | * | ||
185 | * Another solution would be to set up the clockevent device | ||
186 | * with min_delta = 2, but this would unnecessarily increase | ||
187 | * the minimum sleep period. | ||
188 | */ | ||
189 | if (!cycles) | ||
190 | cycles = 1; | ||
191 | |||
179 | samsung_time_setup(pwm.event_id, cycles); | 192 | samsung_time_setup(pwm.event_id, cycles); |
180 | samsung_time_start(pwm.event_id, false); | 193 | samsung_time_start(pwm.event_id, false); |
181 | 194 | ||