diff options
author | Mark Brown <broonie@kernel.org> | 2014-10-20 12:55:07 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2014-10-20 13:27:32 -0400 |
commit | b7a40242c82cd73cfcea305f23e67d068dd8401a (patch) | |
tree | 251b49d19cd7c371847ae1f951e1b537ca0e1c15 /drivers/spi/spi-davinci.c | |
parent | d26833bfce5e56017bea9f1f50838f20e18e7b7e (diff) | |
parent | 9c6de47d53a3ce8df1642ae67823688eb98a190a (diff) |
Merge branch 'fix/dw' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi into spi-dw
Conflicts:
drivers/spi/spi-dw-mid.c
Diffstat (limited to 'drivers/spi/spi-davinci.c')
-rw-r--r-- | drivers/spi/spi-davinci.c | 100 |
1 files changed, 76 insertions, 24 deletions
diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c index 514852cb7b3c..63700ab7bd9f 100644 --- a/drivers/spi/spi-davinci.c +++ b/drivers/spi/spi-davinci.c | |||
@@ -65,6 +65,7 @@ | |||
65 | 65 | ||
66 | /* SPIDAT1 (upper 16 bit defines) */ | 66 | /* SPIDAT1 (upper 16 bit defines) */ |
67 | #define SPIDAT1_CSHOLD_MASK BIT(12) | 67 | #define SPIDAT1_CSHOLD_MASK BIT(12) |
68 | #define SPIDAT1_WDEL BIT(10) | ||
68 | 69 | ||
69 | /* SPIGCR1 */ | 70 | /* SPIGCR1 */ |
70 | #define SPIGCR1_CLKMOD_MASK BIT(1) | 71 | #define SPIGCR1_CLKMOD_MASK BIT(1) |
@@ -213,6 +214,7 @@ static void davinci_spi_chipselect(struct spi_device *spi, int value) | |||
213 | { | 214 | { |
214 | struct davinci_spi *dspi; | 215 | struct davinci_spi *dspi; |
215 | struct davinci_spi_platform_data *pdata; | 216 | struct davinci_spi_platform_data *pdata; |
217 | struct davinci_spi_config *spicfg = spi->controller_data; | ||
216 | u8 chip_sel = spi->chip_select; | 218 | u8 chip_sel = spi->chip_select; |
217 | u16 spidat1 = CS_DEFAULT; | 219 | u16 spidat1 = CS_DEFAULT; |
218 | bool gpio_chipsel = false; | 220 | bool gpio_chipsel = false; |
@@ -227,6 +229,10 @@ static void davinci_spi_chipselect(struct spi_device *spi, int value) | |||
227 | gpio = spi->cs_gpio; | 229 | gpio = spi->cs_gpio; |
228 | } | 230 | } |
229 | 231 | ||
232 | /* program delay transfers if tx_delay is non zero */ | ||
233 | if (spicfg->wdelay) | ||
234 | spidat1 |= SPIDAT1_WDEL; | ||
235 | |||
230 | /* | 236 | /* |
231 | * Board specific chip select logic decides the polarity and cs | 237 | * Board specific chip select logic decides the polarity and cs |
232 | * line for the controller | 238 | * line for the controller |
@@ -241,9 +247,9 @@ static void davinci_spi_chipselect(struct spi_device *spi, int value) | |||
241 | spidat1 |= SPIDAT1_CSHOLD_MASK; | 247 | spidat1 |= SPIDAT1_CSHOLD_MASK; |
242 | spidat1 &= ~(0x1 << chip_sel); | 248 | spidat1 &= ~(0x1 << chip_sel); |
243 | } | 249 | } |
244 | |||
245 | iowrite16(spidat1, dspi->base + SPIDAT1 + 2); | ||
246 | } | 250 | } |
251 | |||
252 | iowrite16(spidat1, dspi->base + SPIDAT1 + 2); | ||
247 | } | 253 | } |
248 | 254 | ||
249 | /** | 255 | /** |
@@ -289,7 +295,7 @@ static int davinci_spi_setup_transfer(struct spi_device *spi, | |||
289 | int prescale; | 295 | int prescale; |
290 | 296 | ||
291 | dspi = spi_master_get_devdata(spi->master); | 297 | dspi = spi_master_get_devdata(spi->master); |
292 | spicfg = (struct davinci_spi_config *)spi->controller_data; | 298 | spicfg = spi->controller_data; |
293 | if (!spicfg) | 299 | if (!spicfg) |
294 | spicfg = &davinci_spi_default_cfg; | 300 | spicfg = &davinci_spi_default_cfg; |
295 | 301 | ||
@@ -337,6 +343,14 @@ static int davinci_spi_setup_transfer(struct spi_device *spi, | |||
337 | spifmt |= SPIFMT_PHASE_MASK; | 343 | spifmt |= SPIFMT_PHASE_MASK; |
338 | 344 | ||
339 | /* | 345 | /* |
346 | * Assume wdelay is used only on SPI peripherals that has this field | ||
347 | * in SPIFMTn register and when it's configured from board file or DT. | ||
348 | */ | ||
349 | if (spicfg->wdelay) | ||
350 | spifmt |= ((spicfg->wdelay << SPIFMT_WDELAY_SHIFT) | ||
351 | & SPIFMT_WDELAY_MASK); | ||
352 | |||
353 | /* | ||
340 | * Version 1 hardware supports two basic SPI modes: | 354 | * Version 1 hardware supports two basic SPI modes: |
341 | * - Standard SPI mode uses 4 pins, with chipselect | 355 | * - Standard SPI mode uses 4 pins, with chipselect |
342 | * - 3 pin SPI is a 4 pin variant without CS (SPI_NO_CS) | 356 | * - 3 pin SPI is a 4 pin variant without CS (SPI_NO_CS) |
@@ -353,9 +367,6 @@ static int davinci_spi_setup_transfer(struct spi_device *spi, | |||
353 | 367 | ||
354 | u32 delay = 0; | 368 | u32 delay = 0; |
355 | 369 | ||
356 | spifmt |= ((spicfg->wdelay << SPIFMT_WDELAY_SHIFT) | ||
357 | & SPIFMT_WDELAY_MASK); | ||
358 | |||
359 | if (spicfg->odd_parity) | 370 | if (spicfg->odd_parity) |
360 | spifmt |= SPIFMT_ODD_PARITY_MASK; | 371 | spifmt |= SPIFMT_ODD_PARITY_MASK; |
361 | 372 | ||
@@ -387,6 +398,26 @@ static int davinci_spi_setup_transfer(struct spi_device *spi, | |||
387 | return 0; | 398 | return 0; |
388 | } | 399 | } |
389 | 400 | ||
401 | static int davinci_spi_of_setup(struct spi_device *spi) | ||
402 | { | ||
403 | struct davinci_spi_config *spicfg = spi->controller_data; | ||
404 | struct device_node *np = spi->dev.of_node; | ||
405 | u32 prop; | ||
406 | |||
407 | if (spicfg == NULL && np) { | ||
408 | spicfg = kzalloc(sizeof(*spicfg), GFP_KERNEL); | ||
409 | if (!spicfg) | ||
410 | return -ENOMEM; | ||
411 | *spicfg = davinci_spi_default_cfg; | ||
412 | /* override with dt configured values */ | ||
413 | if (!of_property_read_u32(np, "ti,spi-wdelay", &prop)) | ||
414 | spicfg->wdelay = (u8)prop; | ||
415 | spi->controller_data = spicfg; | ||
416 | } | ||
417 | |||
418 | return 0; | ||
419 | } | ||
420 | |||
390 | /** | 421 | /** |
391 | * davinci_spi_setup - This functions will set default transfer method | 422 | * davinci_spi_setup - This functions will set default transfer method |
392 | * @spi: spi device on which data transfer to be done | 423 | * @spi: spi device on which data transfer to be done |
@@ -401,36 +432,33 @@ static int davinci_spi_setup(struct spi_device *spi) | |||
401 | struct spi_master *master = spi->master; | 432 | struct spi_master *master = spi->master; |
402 | struct device_node *np = spi->dev.of_node; | 433 | struct device_node *np = spi->dev.of_node; |
403 | bool internal_cs = true; | 434 | bool internal_cs = true; |
404 | unsigned long flags = GPIOF_DIR_OUT; | ||
405 | 435 | ||
406 | dspi = spi_master_get_devdata(spi->master); | 436 | dspi = spi_master_get_devdata(spi->master); |
407 | pdata = &dspi->pdata; | 437 | pdata = &dspi->pdata; |
408 | 438 | ||
409 | flags |= (spi->mode & SPI_CS_HIGH) ? GPIOF_INIT_LOW : GPIOF_INIT_HIGH; | ||
410 | |||
411 | if (!(spi->mode & SPI_NO_CS)) { | 439 | if (!(spi->mode & SPI_NO_CS)) { |
412 | if (np && (master->cs_gpios != NULL) && (spi->cs_gpio >= 0)) { | 440 | if (np && (master->cs_gpios != NULL) && (spi->cs_gpio >= 0)) { |
413 | retval = gpio_request_one(spi->cs_gpio, | 441 | retval = gpio_direction_output( |
414 | flags, dev_name(&spi->dev)); | 442 | spi->cs_gpio, !(spi->mode & SPI_CS_HIGH)); |
415 | internal_cs = false; | 443 | internal_cs = false; |
416 | } else if (pdata->chip_sel && | 444 | } else if (pdata->chip_sel && |
417 | spi->chip_select < pdata->num_chipselect && | 445 | spi->chip_select < pdata->num_chipselect && |
418 | pdata->chip_sel[spi->chip_select] != SPI_INTERN_CS) { | 446 | pdata->chip_sel[spi->chip_select] != SPI_INTERN_CS) { |
419 | spi->cs_gpio = pdata->chip_sel[spi->chip_select]; | 447 | spi->cs_gpio = pdata->chip_sel[spi->chip_select]; |
420 | retval = gpio_request_one(spi->cs_gpio, | 448 | retval = gpio_direction_output( |
421 | flags, dev_name(&spi->dev)); | 449 | spi->cs_gpio, !(spi->mode & SPI_CS_HIGH)); |
422 | internal_cs = false; | 450 | internal_cs = false; |
423 | } | 451 | } |
424 | } | ||
425 | 452 | ||
426 | if (retval) { | 453 | if (retval) { |
427 | dev_err(&spi->dev, "GPIO %d setup failed (%d)\n", | 454 | dev_err(&spi->dev, "GPIO %d setup failed (%d)\n", |
428 | spi->cs_gpio, retval); | 455 | spi->cs_gpio, retval); |
429 | return retval; | 456 | return retval; |
430 | } | 457 | } |
431 | 458 | ||
432 | if (internal_cs) | 459 | if (internal_cs) |
433 | set_io_bits(dspi->base + SPIPC0, 1 << spi->chip_select); | 460 | set_io_bits(dspi->base + SPIPC0, 1 << spi->chip_select); |
461 | } | ||
434 | 462 | ||
435 | if (spi->mode & SPI_READY) | 463 | if (spi->mode & SPI_READY) |
436 | set_io_bits(dspi->base + SPIPC0, SPIPC0_SPIENA_MASK); | 464 | set_io_bits(dspi->base + SPIPC0, SPIPC0_SPIENA_MASK); |
@@ -440,13 +468,16 @@ static int davinci_spi_setup(struct spi_device *spi) | |||
440 | else | 468 | else |
441 | clear_io_bits(dspi->base + SPIGCR1, SPIGCR1_LOOPBACK_MASK); | 469 | clear_io_bits(dspi->base + SPIGCR1, SPIGCR1_LOOPBACK_MASK); |
442 | 470 | ||
443 | return retval; | 471 | return davinci_spi_of_setup(spi); |
444 | } | 472 | } |
445 | 473 | ||
446 | static void davinci_spi_cleanup(struct spi_device *spi) | 474 | static void davinci_spi_cleanup(struct spi_device *spi) |
447 | { | 475 | { |
448 | if (spi->cs_gpio >= 0) | 476 | struct davinci_spi_config *spicfg = spi->controller_data; |
449 | gpio_free(spi->cs_gpio); | 477 | |
478 | spi->controller_data = NULL; | ||
479 | if (spi->dev.of_node) | ||
480 | kfree(spicfg); | ||
450 | } | 481 | } |
451 | 482 | ||
452 | static int davinci_spi_check_error(struct davinci_spi *dspi, int int_status) | 483 | static int davinci_spi_check_error(struct davinci_spi *dspi, int int_status) |
@@ -971,6 +1002,27 @@ static int davinci_spi_probe(struct platform_device *pdev) | |||
971 | if (dspi->version == SPI_VERSION_2) | 1002 | if (dspi->version == SPI_VERSION_2) |
972 | dspi->bitbang.flags |= SPI_READY; | 1003 | dspi->bitbang.flags |= SPI_READY; |
973 | 1004 | ||
1005 | if (pdev->dev.of_node) { | ||
1006 | int i; | ||
1007 | |||
1008 | for (i = 0; i < pdata->num_chipselect; i++) { | ||
1009 | int cs_gpio = of_get_named_gpio(pdev->dev.of_node, | ||
1010 | "cs-gpios", i); | ||
1011 | |||
1012 | if (cs_gpio == -EPROBE_DEFER) { | ||
1013 | ret = cs_gpio; | ||
1014 | goto free_clk; | ||
1015 | } | ||
1016 | |||
1017 | if (gpio_is_valid(cs_gpio)) { | ||
1018 | ret = devm_gpio_request(&pdev->dev, cs_gpio, | ||
1019 | dev_name(&pdev->dev)); | ||
1020 | if (ret) | ||
1021 | goto free_clk; | ||
1022 | } | ||
1023 | } | ||
1024 | } | ||
1025 | |||
974 | r = platform_get_resource(pdev, IORESOURCE_DMA, 0); | 1026 | r = platform_get_resource(pdev, IORESOURCE_DMA, 0); |
975 | if (r) | 1027 | if (r) |
976 | dma_rx_chan = r->start; | 1028 | dma_rx_chan = r->start; |