diff options
author | Haibo Chen <haibo.chen@nxp.com> | 2018-08-09 20:48:03 +0800 |
---|---|---|
committer | Leonard Crestez <leonard.crestez@nxp.com> | 2018-08-24 12:41:33 +0300 |
commit | 3f7cd4215395fb4cf01c9d35b891fd22159dcd7f (patch) | |
tree | 5f49238f2d2b73baf4b3154cefb50bb79a9485a6 /drivers/spi/spi-imx.c | |
parent | 651dd2acf5596aab596ab7c5f678ca28011f8c26 (diff) |
MLK-18994 spi: ecspi: correct the request cs gpio resoures process
This patch revert "MLK-17619: spi: ecspi: request gpio resources
before setting the value", because spi_imx_setup() will be called
several times accroding to the spc definition. So remove the gpio
request operation out from spi_imx_setup(), and back to probe(),
and move up the location, just incase set the cs gpio value before
request gpio resources.
This reverts commit aba5f6342002ffe1f13a71dbddf30ec15ee1edba.
(cherry picked from commit d3ffb8c31c6d6c10baa8f3e4f2a598e75ac2fd59)
Conflicts:
drivers/spi/spi-imx.c
Diffstat (limited to 'drivers/spi/spi-imx.c')
-rw-r--r-- | drivers/spi/spi-imx.c | 54 |
1 files changed, 35 insertions, 19 deletions
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index 3029713b24db..91764a44c6f7 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c @@ -1122,21 +1122,12 @@ static int spi_imx_transfer(struct spi_device *spi, static int spi_imx_setup(struct spi_device *spi) { - int ret; - dev_dbg(&spi->dev, "%s: mode %d, %u bpw, %d hz\n", __func__, spi->mode, spi->bits_per_word, spi->max_speed_hz); - if (gpio_is_valid(spi->cs_gpio)) { - ret = devm_gpio_request(&spi->master->dev, spi->cs_gpio, - dev_name(&spi->master->dev)); - if (ret) { - dev_err(&spi->master->dev, "Can't get CS GPIO \n"); - return ret; - } + if (gpio_is_valid(spi->cs_gpio)) gpio_direction_output(spi->cs_gpio, spi->mode & SPI_CS_HIGH ? 0 : 1); - } spi_imx_chipselect(spi, BITBANG_CS_INACTIVE); @@ -1186,13 +1177,21 @@ static int spi_imx_probe(struct platform_device *pdev) struct spi_master *master; struct spi_imx_data *spi_imx; struct resource *res; - int i, ret, irq; + int i, ret, irq, num_cs; if (!np && !mxc_platform_info) { dev_err(&pdev->dev, "can't get the platform data\n"); return -EINVAL; } + ret = of_property_read_u32(np, "fsl,spi-num-chipselects", &num_cs); + if (ret < 0) { + if (mxc_platform_info) + num_cs = mxc_platform_info->num_chipselect; + else + return ret; + } + master = spi_alloc_master(&pdev->dev, sizeof(struct spi_imx_data)); if (!master) return -ENOMEM; @@ -1201,6 +1200,7 @@ static int spi_imx_probe(struct platform_device *pdev) master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32); master->bus_num = np ? -1 : pdev->id; + master->num_chipselect = num_cs; spi_imx = spi_master_get_devdata(master); spi_imx->bitbang.master = master; @@ -1209,16 +1209,32 @@ static int spi_imx_probe(struct platform_device *pdev) spi_imx->devtype_data = of_id ? of_id->data : (struct spi_imx_devtype_data *)pdev->id_entry->driver_data; - if (mxc_platform_info) { - master->num_chipselect = mxc_platform_info->num_chipselect; - master->cs_gpios = devm_kzalloc(&master->dev, + master->cs_gpios = devm_kzalloc(&master->dev, sizeof(int) * master->num_chipselect, GFP_KERNEL); - if (!master->cs_gpios) - return -ENOMEM; - for (i = 0; i < master->num_chipselect; i++) - master->cs_gpios[i] = mxc_platform_info->chipselect[i]; - } + if (!master->cs_gpios) { + dev_err(&pdev->dev, "No CS GPIOs available\n"); + ret = -EINVAL; + goto out_master_put; + } + + for (i = 0; i < master->num_chipselect; i++) { + int cs_gpio = of_get_named_gpio(np, "cs-gpios", i); + if (!gpio_is_valid(cs_gpio) && mxc_platform_info) + cs_gpio = mxc_platform_info->chipselect[i]; + + master->cs_gpios[i] = cs_gpio; + if (!gpio_is_valid(cs_gpio)) + continue; + + ret = devm_gpio_request(&pdev->dev, master->cs_gpios[i], + DRIVER_NAME); + if (ret) { + dev_err(&pdev->dev, "Can't get CS GPIO %i\n", + master->cs_gpios[i]); + goto out_master_put; + } + } spi_imx->bitbang.chipselect = spi_imx_chipselect; spi_imx->bitbang.setup_transfer = spi_imx_setupxfer; |