aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-davinci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/spi/spi-davinci.c')
-rw-r--r--drivers/spi/spi-davinci.c100
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
401static 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
446static void davinci_spi_cleanup(struct spi_device *spi) 474static 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
452static int davinci_spi_check_error(struct davinci_spi *dspi, int int_status) 483static 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;