lkml.org 
[lkml]   [2017]   [May]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.11 074/197] iio: stm32 trigger: fix sampling_frequency read
    Date
    4.11-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Fabrice Gasnier <fabrice.gasnier@st.com>

    commit 77a9febfd81f9e8550d09dc76e8e9c06307b7aca upstream.

    When prescaler (PSC) is 0, it means div factor is 1: counter clock
    frequency is equal to input clk / (PSC + 1).
    When reload value is 8 for example, counter counts 9 cycles, from 0 to 8.
    This is handled in frequency write routine, by writing respectively:
    - prescaler - 1 to PSC
    - reload value - 1 to ARR
    This fix does the opposite when reading the frequency from PSC and ARR:
    - prescaler is PSC + 1
    - reload value is ARR + 1

    Thus, PSC may be 0, depending on requested sampling frequency (div 1).
    In this case, reading freq wrongly reports 0, instead of computing and
    reporting correct value.
    Remove test on !psc and !arr.

    Small test on stm32f4 (example on tim1_trgo), before this fix:
    $ cd /sys/bus/iio/devices/triggerX
    $ echo 10000 > sampling_frequency
    $ cat sampling_frequency
    0

    After this fix:
    $ echo 10000 > sampling_frequency
    $ cat sampling_frequency
    10000

    Signed-off-by: Fabrice Gasnier <fabrice.gasnier@st.com>
    Signed-off-by: Jonathan Cameron <jic23@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/iio/trigger/stm32-timer-trigger.c | 6 +++---
    1 file changed, 3 insertions(+), 3 deletions(-)

    --- a/drivers/iio/trigger/stm32-timer-trigger.c
    +++ b/drivers/iio/trigger/stm32-timer-trigger.c
    @@ -152,10 +152,10 @@ static ssize_t stm32_tt_read_frequency(s
    regmap_read(priv->regmap, TIM_PSC, &psc);
    regmap_read(priv->regmap, TIM_ARR, &arr);

    - if (psc && arr && (cr1 & TIM_CR1_CEN)) {
    + if (cr1 & TIM_CR1_CEN) {
    freq = (unsigned long long)clk_get_rate(priv->clk);
    - do_div(freq, psc);
    - do_div(freq, arr);
    + do_div(freq, psc + 1);
    + do_div(freq, arr + 1);
    }

    return sprintf(buf, "%d\n", (unsigned int)freq);

    \
     
     \ /
      Last update: 2017-05-24 00:25    [W:4.142 / U:0.188 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site