From aeb8f8cb1537450e99f7d8f1a1d84d55b0fc6b26 Mon Sep 17 00:00:00 2001 From: Chris Brandt Date: Fri, 5 Aug 2016 09:36:03 -0400 Subject: spi: rspi: Increase accuracy of bit rate for RZ When you leave the clock divider at 0, 130kHz is the lowest you can go. Also, by adjusting the clock divider you can get more accurate resolutions for clock speeds lower than 16MHz. This patch uses the clock divider as part of the bit rate setup. Signed-off-by: Chris Brandt Signed-off-by: Mark Brown --- drivers/spi/spi-rspi.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'drivers/spi') diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c index 8188433..a816f07 100644 --- a/drivers/spi/spi-rspi.c +++ b/drivers/spi/spi-rspi.c @@ -295,14 +295,24 @@ static int rspi_set_config_register(struct rspi_data *rspi, int access_size) static int rspi_rz_set_config_register(struct rspi_data *rspi, int access_size) { int spbr; + int div = 0; + unsigned long clksrc; /* Sets output mode, MOSI signal, and (optionally) loopback */ rspi_write8(rspi, rspi->sppcr, RSPI_SPPCR); + clksrc = clk_get_rate(rspi->clk); + while (div < 3) { + if (rspi->max_speed_hz >= clksrc/4) /* 4=(CLK/2)/2 */ + break; + div++; + clksrc /= 2; + } + /* Sets transfer bit rate */ - spbr = DIV_ROUND_UP(clk_get_rate(rspi->clk), - 2 * rspi->max_speed_hz) - 1; + spbr = DIV_ROUND_UP(clksrc, 2 * rspi->max_speed_hz) - 1; rspi_write8(rspi, clamp(spbr, 0, 255), RSPI_SPBR); + rspi->spcmd |= div << 2; /* Disable dummy transmission, set byte access */ rspi_write8(rspi, SPDCR_SPLBYTE, RSPI_SPDCR); -- cgit v1.1 From f99008013e199e6b88ef26c98ecb042c94c7450c Mon Sep 17 00:00:00 2001 From: Phil Reid Date: Wed, 31 Aug 2016 15:31:38 +0800 Subject: spi: sc18is602: Add reset control via gpio pin. This sc18is602 has a reset pin that may need to be deasserted. Add optional binding to specifiy the reset pin via a gpio and deassert during probe. Signed-off-by: Phil Reid Signed-off-by: Mark Brown --- drivers/spi/spi-sc18is602.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'drivers/spi') diff --git a/drivers/spi/spi-sc18is602.c b/drivers/spi/spi-sc18is602.c index 36af4d4..5666b5d 100644 --- a/drivers/spi/spi-sc18is602.c +++ b/drivers/spi/spi-sc18is602.c @@ -23,6 +23,7 @@ #include #include #include +#include enum chips { sc18is602, sc18is602b, sc18is603 }; @@ -50,6 +51,8 @@ struct sc18is602 { u8 buffer[SC18IS602_BUFSIZ + 1]; int tlen; /* Data queued for tx in buffer */ int rindex; /* Receive data index in buffer */ + + struct gpio_desc *reset; }; static int sc18is602_wait_ready(struct sc18is602 *hw, int len) @@ -257,6 +260,12 @@ static int sc18is602_probe(struct i2c_client *client, hw = spi_master_get_devdata(master); i2c_set_clientdata(client, hw); + /* assert reset and then release */ + hw->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); + if (IS_ERR(hw->reset)) + return PTR_ERR(hw->reset); + gpiod_set_value(hw->reset, 0); + hw->master = master; hw->client = client; hw->dev = dev; -- cgit v1.1 From 6ffc84dd1590a7af837a23c8d2c405eaa0a7faef Mon Sep 17 00:00:00 2001 From: Geert Uytterhoeven Date: Wed, 31 Aug 2016 11:37:05 +0200 Subject: spi: sh-msiof: Use ARCH_SHMOBILE instead of SUPERH "spi_sh_msiof" is used on sh7723 and sh7724 only. As all of the above select ARCH_SHMOBILE, restrict its driver dependencies from SUPERH to ARCH_SHMOBILE. Signed-off-by: Geert Uytterhoeven Reviewed-by: Simon Horman Signed-off-by: Mark Brown --- drivers/spi/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/spi') diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index d6fb8d4..056e3ba 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig @@ -549,7 +549,7 @@ config SPI_SC18IS602 config SPI_SH_MSIOF tristate "SuperH MSIOF SPI controller" depends on HAVE_CLK && HAS_DMA - depends on SUPERH || ARCH_RENESAS || COMPILE_TEST + depends on ARCH_SHMOBILE || ARCH_RENESAS || COMPILE_TEST help SPI driver for SuperH and SH Mobile MSIOF blocks. -- cgit v1.1 From 42531686639d6a3fe49518f2baca3f7256708242 Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Sun, 5 Jun 2016 18:42:27 +0800 Subject: spi: st-ssc4: Fix misuse of devm_gpio_request/devm_gpio_free APIs devm_* API is supposed to be used only in probe function call. The resource is allocated at 'probe' and free automatically at 'remove'. Usage of devm_* functions outside probe sometimes leads to resource leak. Thus avoid using devm_* APIs in .setup/.cleanup callbacks. Signed-off-by: Axel Lin Signed-off-by: Mark Brown --- drivers/spi/spi-st-ssc4.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'drivers/spi') diff --git a/drivers/spi/spi-st-ssc4.c b/drivers/spi/spi-st-ssc4.c index a56eca0..e54b596 100644 --- a/drivers/spi/spi-st-ssc4.c +++ b/drivers/spi/spi-st-ssc4.c @@ -175,10 +175,7 @@ static int spi_st_transfer_one(struct spi_master *master, static void spi_st_cleanup(struct spi_device *spi) { - int cs = spi->cs_gpio; - - if (gpio_is_valid(cs)) - devm_gpio_free(&spi->dev, cs); + gpio_free(spi->cs_gpio); } /* the spi->mode bits understood by this driver: */ @@ -201,14 +198,15 @@ static int spi_st_setup(struct spi_device *spi) return -EINVAL; } - if (devm_gpio_request(&spi->dev, cs, dev_name(&spi->dev))) { + ret = gpio_request(cs, dev_name(&spi->dev)); + if (ret) { dev_err(&spi->dev, "could not request gpio:%d\n", cs); - return -EINVAL; + return ret; } ret = gpio_direction_output(cs, spi->mode & SPI_CS_HIGH); if (ret) - return ret; + goto out_free_gpio; spi_st_clk = clk_get_rate(spi_st->clk); @@ -217,7 +215,8 @@ static int spi_st_setup(struct spi_device *spi) if (sscbrg < 0x07 || sscbrg > BIT(16)) { dev_err(&spi->dev, "baudrate %d outside valid range %d\n", sscbrg, hz); - return -EINVAL; + ret = -EINVAL; + goto out_free_gpio; } spi_st->baud = spi_st_clk / (2 * sscbrg); @@ -266,6 +265,10 @@ static int spi_st_setup(struct spi_device *spi) readl_relaxed(spi_st->base + SSC_RBUF); return 0; + +out_free_gpio: + gpio_free(cs); + return ret; } /* Interrupt fired when TX shift register becomes empty */ -- cgit v1.1 From 76cce7e3a582e3a86becaa086f24277829e1e0f5 Mon Sep 17 00:00:00 2001 From: Phil Reid Date: Thu, 29 Sep 2016 10:41:02 +0800 Subject: spi: sc18is602: Change gpiod_set_value to gpiod_set_value_cansleep To avoid warning when using i2c gpio expander change call to the cansleep variant. There should be no issue with sleeping in the drivers probe function. Signed-off-by: Phil Reid Signed-off-by: Mark Brown --- drivers/spi/spi-sc18is602.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/spi') diff --git a/drivers/spi/spi-sc18is602.c b/drivers/spi/spi-sc18is602.c index 5666b5d..f63714f 100644 --- a/drivers/spi/spi-sc18is602.c +++ b/drivers/spi/spi-sc18is602.c @@ -264,7 +264,7 @@ static int sc18is602_probe(struct i2c_client *client, hw->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); if (IS_ERR(hw->reset)) return PTR_ERR(hw->reset); - gpiod_set_value(hw->reset, 0); + gpiod_set_value_cansleep(hw->reset, 0); hw->master = master; hw->client = client; -- cgit v1.1