• Andrea Merello's avatar
    clocksource/drivers/arm_global_timer: Implement rate compensation whenever source clock changes · 171b45a4
    Andrea Merello authored
    This patch adds rate change notification support for the parent clock;
    should that clock change, then we try to adjust the our prescaler in order
    to compensate (i.e. we adjust to still get the same timer frequency).
    
    This is loosely based on what it's done in timer-cadence-ttc. timer-sun51,
    mips-gic-timer and smp_twd.c also seem to look at their parent clock rate
    and to perform some kind of adjustment whenever needed.
    
    In this particular case we have only one single counter and prescaler for
    all clocksource, clockevent and timer_delay, and we just update it for all
    (i.e. we don't let it go and call clockevents_update_freq() to notify to
    the kernel that our rate has changed).
    
    Note that, there is apparently no other way to fixup things, because once
    we call register_current_timer_delay(), specifying the timer rate, it seems
    that that rate is not supposed to change ever.
    
    In order for this mechanism to work, we have to make assumptions about how
    much the initial clock is supposed to eventually decrease from the initial
    one, and set our initial prescaler to a value that we can eventually
    decrease enough to compensate. We provide an option in KConfig for this.
    
    In case we end up in a situation in which we are not able to compensate the
    parent clock change, we fail returning NOTIFY_BAD.
    
    This fixes a real-world problem with Zynq arch not being able to use this
    driver and CPU_FREQ at the same time (because ARM global timer is fed by
    the CPU clock, which may keep changing when CPU_FREQ is enabled).
    Signed-off-by: default avatarAndrea Merello <andrea.merello@gmail.com>
    Cc: Patrice Chotard <patrice.chotard@st.com>
    Cc: linux-kernel@vger.kernel.org
    Cc: linux-arm-kernel@lists.infradead.org
    Cc: Michal Simek <michal.simek@xilinx.com>
    Cc: Sören Brinkmann <soren.brinkmann@xilinx.com>
    Reviewed-by: default avatarPatrice Chotard <patrice.chotard@foss.st.com>
    Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
    Link: https://lore.kernel.org/r/20210406130045.15491-2-andrea.merello@gmail.com
    171b45a4
arm_global_timer.c 11.2 KB