lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.8 254/633] spi: omap2-mcspi: Improve performance waiting for CHSTAT
    Date
    From: Aswath Govindraju <a-govindraju@ti.com>

    [ Upstream commit 7b1d96813317358312440d0d07abbfbeb0ef8d22 ]

    This reverts commit 13d515c796 (spi: omap2-mcspi: Switch to
    readl_poll_timeout()).

    The amount of time spent polling for the MCSPI_CHSTAT bits to be set on
    AM335x-icev2 platform is less than 1us (about 0.6us) in most cases, with
    or without using DMA. So, in most cases the function need not sleep.
    Also, setting the sleep_usecs to zero would not be optimal here because
    ktime_add_us() used in readl_poll_timeout() is slower compared to the
    direct addition used after the revert. So, it is sub-optimal to use
    readl_poll_timeout in this case.

    When DMA is not enabled, this revert results in an increase of about 27%
    in throughput and decrease of about 20% in CPU usage. However, the CPU
    usage and throughput are almost the same when used with DMA.

    Therefore, fix this by reverting the commit which switched to using
    readl_poll_timeout().

    Fixes: 13d515c796ad ("spi: omap2-mcspi: Switch to readl_poll_timeout()")
    Signed-off-by: Aswath Govindraju <a-govindraju@ti.com>
    Link: https://lore.kernel.org/r/20200910122624.8769-1-a-govindraju@ti.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/spi/spi-omap2-mcspi.c | 17 +++++++++++++----
    1 file changed, 13 insertions(+), 4 deletions(-)

    diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
    index e9e256718ef4a..10d8a722b0833 100644
    --- a/drivers/spi/spi-omap2-mcspi.c
    +++ b/drivers/spi/spi-omap2-mcspi.c
    @@ -24,7 +24,6 @@
    #include <linux/of.h>
    #include <linux/of_device.h>
    #include <linux/gcd.h>
    -#include <linux/iopoll.h>

    #include <linux/spi/spi.h>
    #include <linux/gpio.h>
    @@ -349,9 +348,19 @@ static void omap2_mcspi_set_fifo(const struct spi_device *spi,

    static int mcspi_wait_for_reg_bit(void __iomem *reg, unsigned long bit)
    {
    - u32 val;
    -
    - return readl_poll_timeout(reg, val, val & bit, 1, MSEC_PER_SEC);
    + unsigned long timeout;
    +
    + timeout = jiffies + msecs_to_jiffies(1000);
    + while (!(readl_relaxed(reg) & bit)) {
    + if (time_after(jiffies, timeout)) {
    + if (!(readl_relaxed(reg) & bit))
    + return -ETIMEDOUT;
    + else
    + return 0;
    + }
    + cpu_relax();
    + }
    + return 0;
    }

    static int mcspi_wait_for_completion(struct omap2_mcspi *mcspi,
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-10-27 18:14    [W:2.150 / U:0.512 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site