lkml.org 
[lkml]   [2018]   [Feb]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.15 47/55] serial: 8250_dw: Revert "Improve clock rate setting"
    Date
    4.15-stable review patch.  If anyone has any objections, please let me know.

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

    From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

    commit c14b65feac9ebed649d6fe79c6b6d64d21d0287d upstream.

    The commit

    de9e33bdfa22 ("serial: 8250_dw: Improve clock rate setting")

    obviously tries to cure symptoms, and not a root cause.

    The root cause is the non-flexible rate calculation inside the
    corresponding clock driver. What we need is to provide maximum UART
    divisor value to the clock driver to allow it do the job transparently
    to the caller.

    Since from the initial commit message I have got no clue which clock
    driver actually needs to be amended, I leave this exercise to the people
    who know better the case.

    Moreover, it seems [1] the fix introduced a regression. And possible
    even one more [2].

    Taking above, revert the commit de9e33bdfa22 for now.

    [1]: https://www.spinics.net/lists/linux-serial/msg28872.html
    [2]: https://github.com/Dunedan/mbp-2016-linux/issues/29#issuecomment-357583782

    Fixes: de9e33bdfa22 ("serial: 8250_dw: Improve clock rate setting")
    Cc: Ed Blake <ed.blake@sondrel.com>
    Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com>
    Cc: Lukas Wunner <lukas@wunner.de>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/tty/serial/8250/8250_dw.c | 30 ++++++++++++------------------
    1 file changed, 12 insertions(+), 18 deletions(-)

    --- a/drivers/tty/serial/8250/8250_dw.c
    +++ b/drivers/tty/serial/8250/8250_dw.c
    @@ -252,31 +252,25 @@ static void dw8250_set_termios(struct ua
    struct ktermios *old)
    {
    unsigned int baud = tty_termios_baud_rate(termios);
    - unsigned int target_rate, min_rate, max_rate;
    struct dw8250_data *d = p->private_data;
    long rate;
    - int i, ret;
    + int ret;

    if (IS_ERR(d->clk) || !old)
    goto out;

    - /* Find a clk rate within +/-1.6% of an integer multiple of baudx16 */
    - target_rate = baud * 16;
    - min_rate = target_rate - (target_rate >> 6);
    - max_rate = target_rate + (target_rate >> 6);
    -
    - for (i = 1; i <= UART_DIV_MAX; i++) {
    - rate = clk_round_rate(d->clk, i * target_rate);
    - if (rate >= i * min_rate && rate <= i * max_rate)
    - break;
    - }
    - if (i <= UART_DIV_MAX) {
    - clk_disable_unprepare(d->clk);
    + clk_disable_unprepare(d->clk);
    + rate = clk_round_rate(d->clk, baud * 16);
    + if (rate < 0)
    + ret = rate;
    + else if (rate == 0)
    + ret = -ENOENT;
    + else
    ret = clk_set_rate(d->clk, rate);
    - clk_prepare_enable(d->clk);
    - if (!ret)
    - p->uartclk = rate;
    - }
    + clk_prepare_enable(d->clk);
    +
    + if (!ret)
    + p->uartclk = rate;

    out:
    p->status &= ~UPSTAT_AUTOCTS;

    \
     
     \ /
      Last update: 2018-02-02 18:30    [W:4.891 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site