Patch "spi: img-spfi: fix multiple calls to request gpio" has been added to the 4.1-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
spi: img-spfi: fix multiple calls to request gpio
to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
spi-img-spfi-fix-multiple-calls-to-request-gpio.patch
and it can be found in the queue-4.1 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
b03ba9e314c12b2127243145b5c1f41b2408de62Mon Sep 17 00:00:00 2001
From: Sifan Naeem <[email protected]>
Date: Wed, 29 Jul 2015 11:55:26 +0100
Subject: spi: img-spfi: fix multiple calls to request gpio
From: Sifan Naeem <[email protected]>
commit b03ba9e314c12b2127243145b5c1f41b2408de62 upstream.
spfi_setup may be called many times by the spi framework, but gpio_request_one can only be called once without freeing, repeatedly calling gpio_request_one will cause an error to be thrown, which causes the request to spi_setup to be marked as failed.
We can have a per-spi_device flag that indicates whether or not the gpio has been requested. If the gpio has already been requested use gpio_direction_output to set the direction of the gpio.
--- drivers/spi/spi-img-spfi.c | 47 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-)
drivers/spi/spi-img-spfi.c +40 -7
@@ -105,6 +105,10 @@ struct img_spfi {bool rx_dma_busy; }; +struct img_spfi_device_data { +bool gpio_requested; +}; +static inline u32 spfi_readl (struct img_spfi *spfi,u32 reg) {return readl (spfi->regs + reg);
@@ -441,20 +445,49 @@ static int img_spfi_unprepare(struct spistatic int img_spfi_setup (struct spi_device *spi) {int ret; +struct img_spfi_device_data *spfi_data =spi_get_ctldata (spi); - ret =gpio_request_one (spi->cs_gpio, (spi->mode &SPI_CS_HIGH ) ? -GPIOF_OUT_INIT_LOW :GPIOF_OUT_INIT_HIGH , -dev_name (&spi->dev)); -if (ret) -dev_err (&spi->dev,"can't request chipselect gpio %d\n" , +if (!spfi_data) { + spfi_data =kzalloc (sizeof (*spfi_data),GFP_KERNEL ); +if (!spfi_data) +return -ENOMEM ; + spfi_data->gpio_requested = false; +spi_set_ctldata (spi, spfi_data); + } +if (!spfi_data->gpio_requested) { + ret =gpio_request_one (spi->cs_gpio, + (spi->mode &SPI_CS_HIGH ) ? +GPIOF_OUT_INIT_LOW :GPIOF_OUT_INIT_HIGH , +dev_name (&spi->dev)); +if (ret) +dev_err (&spi->dev,"can't request chipselect gpio %d\n" , spi->cs_gpio); - +else + spfi_data->gpio_requested = true; + }else { +if (gpio_is_valid (spi->cs_gpio)) { +int mode = ((spi->mode &SPI_CS_HIGH ) ? +GPIOF_OUT_INIT_LOW :GPIOF_OUT_INIT_HIGH ); + + ret =gpio_direction_output (spi->cs_gpio, mode); +if (ret) +dev_err (&spi->dev,"chipselect gpio %d setup failed (%d)\n" , + spi->cs_gpio, ret); + } + }return ret; }static void img_spfi_cleanup (struct spi_device *spi) { -gpio_free (spi->cs_gpio); +struct img_spfi_device_data *spfi_data =spi_get_ctldata (spi); + +if (spfi_data) { +if (spfi_data->gpio_requested) +gpio_free (spi->cs_gpio); +kfree (spfi_data); +spi_set_ctldata (spi,NULL ); + } } static void img_spfi_config(struct spi_master *master, struct spi_device *spi,
Patches currently in stable-queue which might be from [email protected] are
queue-4.1/spi-img-spfi-check-for-timeout-error-before-proceeding.patch queue-4.1/spi-img-spfi-fix-multiple-calls-to-request-gpio.patch queue-4.1/spi-img-spfi-fix-kbuild-test-robot-warning.patch