• Sergei Shtylyov's avatar
    clocksource/drivers/sh_cmt: Fixup for 64-bit machines · 22627c6f
    Sergei Shtylyov authored
    When trying to use CMT for clockevents on R-Car gen3 SoCs, I noticed
    that 'max_delta_ns' for the broadcast timer (CMT) was shown as 1000 in
    /proc/timer_list. It turned out that when calculating it, the driver did
    1 << 32 (causing what I think was undefined behavior) resulting in a zero
    delta, later clamped to 1000 by cev_delta2ns(). The root cause turned out
    to be that the driver abused *unsigned long* for the CMT register values
    (which are 16/32-bit), so that the calculation of 'ch->max_match_value'
    in sh_cmt_setup_channel() used the wrong branch. Using more proper 'u32'
    instead fixed 'max_delta_ns' and even fixed the switching an active
    clocksource to CMT (which caused the system to turn non-interactive
    before).
    Signed-off-by: default avatarSergei Shtylyov <sergei.shtylyov@cogentembedded.com>
    Reviewed-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
    Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
    22627c6f
sh_cmt.c 27.2 KB