diff options
author | Tomasz Figa <tomasz.figa@gmail.com> | 2013-08-11 02:33:29 +0200 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-08-11 14:06:30 +0100 |
commit | 0149871c428cc8cb44337703ca46a98a6b541b42 (patch) | |
tree | 4241d6555f8be9cfe0ad815d61bea1830eedfe48 /drivers/spi/spi-s3c64xx.c | |
parent | b1a8e78d173081c303bea88e92a1e1423befca63 (diff) | |
download | op-kernel-dev-0149871c428cc8cb44337703ca46a98a6b541b42.zip op-kernel-dev-0149871c428cc8cb44337703ca46a98a6b541b42.tar.gz |
spi: s3c64xx: Do not request CS GPIO on subsequent calls to .setup()
Comments in linux/spi/spi.h and observed behavior show that .setup()
callback can be called multiple times without corresponding calls to
.cleanup(), what was incorrectly assumed by spi-s3c64xx driver, leading
to failures trying to request CS GPIO multiple times.
This patch modifies the behavior of spi-s3c64xx driver to request CS
GPIO only on first call to .setup() after last .cleanup().
Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'drivers/spi/spi-s3c64xx.c')
-rw-r--r-- | drivers/spi/spi-s3c64xx.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c index d67384b..2330dce 100644 --- a/drivers/spi/spi-s3c64xx.c +++ b/drivers/spi/spi-s3c64xx.c @@ -1071,20 +1071,21 @@ static int s3c64xx_spi_setup(struct spi_device *spi) return -ENODEV; } - /* Request gpio only if cs line is asserted by gpio pins */ - if (sdd->cs_gpio) { - err = gpio_request_one(cs->line, GPIOF_OUT_INIT_HIGH, - dev_name(&spi->dev)); - if (err) { - dev_err(&spi->dev, - "Failed to get /CS gpio [%d]: %d\n", - cs->line, err); - goto err_gpio_req; + if (!spi_get_ctldata(spi)) { + /* Request gpio only if cs line is asserted by gpio pins */ + if (sdd->cs_gpio) { + err = gpio_request_one(cs->line, GPIOF_OUT_INIT_HIGH, + dev_name(&spi->dev)); + if (err) { + dev_err(&spi->dev, + "Failed to get /CS gpio [%d]: %d\n", + cs->line, err); + goto err_gpio_req; + } } - } - if (!spi_get_ctldata(spi)) spi_set_ctldata(spi, cs); + } sci = sdd->cntrlr_info; |