summaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-ath79.c
diff options
context:
space:
mode:
authorAlban Bedel2019-01-16 19:55:45 +0100
committerMark Brown2019-01-17 13:34:39 +0100
commit797622d7a3ab5192ff575288bdbec15c3a006280 (patch)
tree67b7c9872993e2ebc73adaa6dfa46ae5cfce9b87 /drivers/spi/spi-ath79.c
parentspi: bitbang: Don't call chipselect() in spi_bitbang_setup() (diff)
downloadkernel-qcow2-linux-797622d7a3ab5192ff575288bdbec15c3a006280.tar.gz
kernel-qcow2-linux-797622d7a3ab5192ff575288bdbec15c3a006280.tar.xz
kernel-qcow2-linux-797622d7a3ab5192ff575288bdbec15c3a006280.zip
spi: ath79: Simplify ath79_spi_chipselect()
First of all this callback was slightly misused to setup the clock polarity at the beginning of a transfer. Beside being at the wrong place, it is also useless as only SPI mode 1 is supported. Instead just make sure the base value used for IOC is suitable to start a transfer by clearing the clock and data bits during the controller setup. This also remove the last direct usage of the GPIO API, so we can remove the direct dependency on GPIOLIB. Signed-off-by: Alban Bedel <albeu@free.fr> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/spi/spi-ath79.c')
-rw-r--r--drivers/spi/spi-ath79.c40
1 files changed, 9 insertions, 31 deletions
diff --git a/drivers/spi/spi-ath79.c b/drivers/spi/spi-ath79.c
index ed1068ac055f..edf695a359f4 100644
--- a/drivers/spi/spi-ath79.c
+++ b/drivers/spi/spi-ath79.c
@@ -21,7 +21,6 @@
#include <linux/spi/spi.h>
#include <linux/spi/spi_bitbang.h>
#include <linux/bitops.h>
-#include <linux/gpio/consumer.h>
#include <linux/clk.h>
#include <linux/err.h>
@@ -67,38 +66,14 @@ static void ath79_spi_chipselect(struct spi_device *spi, int is_active)
{
struct ath79_spi *sp = ath79_spidev_to_sp(spi);
int cs_high = (spi->mode & SPI_CS_HIGH) ? is_active : !is_active;
+ u32 cs_bit = AR71XX_SPI_IOC_CS(spi->chip_select);
- if (is_active) {
- /* set initial clock polarity */
- if (spi->mode & SPI_CPOL)
- sp->ioc_base |= AR71XX_SPI_IOC_CLK;
- else
- sp->ioc_base &= ~AR71XX_SPI_IOC_CLK;
-
- ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base);
- }
-
- if (spi->cs_gpiod) {
- /*
- * SPI chipselect is normally active-low, but
- * inversion semantics are handled by gpiolib.
- *
- * FIXME: is this ever used? The driver doesn't
- * set SPI_MASTER_GPIO_SS so this callback should not
- * get called if a CS GPIO is found by the SPI core.
- */
- gpiod_set_value_cansleep(spi->cs_gpiod, is_active);
- } else {
- u32 cs_bit = AR71XX_SPI_IOC_CS(spi->chip_select);
-
- if (cs_high)
- sp->ioc_base |= cs_bit;
- else
- sp->ioc_base &= ~cs_bit;
-
- ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base);
- }
+ if (cs_high)
+ sp->ioc_base |= cs_bit;
+ else
+ sp->ioc_base &= ~cs_bit;
+ ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base);
}
static void ath79_spi_enable(struct ath79_spi *sp)
@@ -110,6 +85,9 @@ static void ath79_spi_enable(struct ath79_spi *sp)
sp->reg_ctrl = ath79_spi_rr(sp, AR71XX_SPI_REG_CTRL);
sp->ioc_base = ath79_spi_rr(sp, AR71XX_SPI_REG_IOC);
+ /* clear clk and mosi in the base state */
+ sp->ioc_base &= ~(AR71XX_SPI_IOC_DO | AR71XX_SPI_IOC_CLK);
+
/* TODO: setup speed? */
ath79_spi_wr(sp, AR71XX_SPI_REG_CTRL, 0x43);
}