Commit 638d8488 authored by Douglas Anderson's avatar Douglas Anderson Committed by Mark Brown

spi: spi-geni-qcom: Don't set the cs if it was already right

Setting the chip select on the Qualcomm geni SPI controller isn't
exactly cheap.  Let's cache the current setting and avoid setting the
chip select if it's already right.

Using "flashrom" to read or write the EC firmware on a Chromebook
shows roughly a 25% reduction in interrupts and a 15% speedup.
Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
Link: https://lore.kernel.org/r/20200626151946.1.I06134fd669bf91fd387dc6ecfe21d44c202bd412@changeidSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 1ac6f21a
...@@ -79,6 +79,7 @@ struct spi_geni_master { ...@@ -79,6 +79,7 @@ struct spi_geni_master {
unsigned int oversampling; unsigned int oversampling;
spinlock_t lock; spinlock_t lock;
int irq; int irq;
bool cs_flag;
}; };
static int get_spi_clk_cfg(unsigned int speed_hz, static int get_spi_clk_cfg(unsigned int speed_hz,
...@@ -146,10 +147,15 @@ static void spi_geni_set_cs(struct spi_device *slv, bool set_flag) ...@@ -146,10 +147,15 @@ static void spi_geni_set_cs(struct spi_device *slv, bool set_flag)
struct geni_se *se = &mas->se; struct geni_se *se = &mas->se;
unsigned long time_left; unsigned long time_left;
pm_runtime_get_sync(mas->dev);
if (!(slv->mode & SPI_CS_HIGH)) if (!(slv->mode & SPI_CS_HIGH))
set_flag = !set_flag; set_flag = !set_flag;
if (set_flag == mas->cs_flag)
return;
mas->cs_flag = set_flag;
pm_runtime_get_sync(mas->dev);
spin_lock_irq(&mas->lock); spin_lock_irq(&mas->lock);
reinit_completion(&mas->cs_done); reinit_completion(&mas->cs_done);
if (set_flag) if (set_flag)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment