summaryrefslogtreecommitdiff
path: root/drivers/spi/spi-imx.c
diff options
context:
space:
mode:
authorHaibo Chen <haibo.chen@nxp.com>2018-08-09 20:48:03 +0800
committerLeonard Crestez <leonard.crestez@nxp.com>2018-08-24 12:41:33 +0300
commit3f7cd4215395fb4cf01c9d35b891fd22159dcd7f (patch)
tree5f49238f2d2b73baf4b3154cefb50bb79a9485a6 /drivers/spi/spi-imx.c
parent651dd2acf5596aab596ab7c5f678ca28011f8c26 (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.c54
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;