diff options
author | Jiri Kosina <jkosina@suse.cz> | 2013-12-19 09:08:03 -0500 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2013-12-19 09:08:32 -0500 |
commit | e23c34bb41da65f354fb7eee04300c56ee48f60c (patch) | |
tree | 549fbe449d55273b81ef104a9755109bf4ae7817 /drivers/spi/spi-ti-qspi.c | |
parent | b481c2cb3534c85dca625973b33eba15f9af3e4c (diff) | |
parent | 319e2e3f63c348a9b66db4667efa73178e18b17d (diff) |
Merge branch 'master' into for-next
Sync with Linus' tree to be able to apply fixes on top of newer things
in tree (efi-stub).
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/spi/spi-ti-qspi.c')
-rw-r--r-- | drivers/spi/spi-ti-qspi.c | 69 |
1 files changed, 28 insertions, 41 deletions
diff --git a/drivers/spi/spi-ti-qspi.c b/drivers/spi/spi-ti-qspi.c index e12d962a289f..4396bd448540 100644 --- a/drivers/spi/spi-ti-qspi.c +++ b/drivers/spi/spi-ti-qspi.c | |||
@@ -41,9 +41,6 @@ struct ti_qspi_regs { | |||
41 | struct ti_qspi { | 41 | struct ti_qspi { |
42 | struct completion transfer_complete; | 42 | struct completion transfer_complete; |
43 | 43 | ||
44 | /* IRQ synchronization */ | ||
45 | spinlock_t lock; | ||
46 | |||
47 | /* list synchronization */ | 44 | /* list synchronization */ |
48 | struct mutex list_lock; | 45 | struct mutex list_lock; |
49 | 46 | ||
@@ -57,7 +54,6 @@ struct ti_qspi { | |||
57 | u32 spi_max_frequency; | 54 | u32 spi_max_frequency; |
58 | u32 cmd; | 55 | u32 cmd; |
59 | u32 dc; | 56 | u32 dc; |
60 | u32 stat; | ||
61 | }; | 57 | }; |
62 | 58 | ||
63 | #define QSPI_PID (0x0) | 59 | #define QSPI_PID (0x0) |
@@ -165,7 +161,7 @@ static int ti_qspi_setup(struct spi_device *spi) | |||
165 | qspi->spi_max_frequency, clk_div); | 161 | qspi->spi_max_frequency, clk_div); |
166 | 162 | ||
167 | ret = pm_runtime_get_sync(qspi->dev); | 163 | ret = pm_runtime_get_sync(qspi->dev); |
168 | if (ret) { | 164 | if (ret < 0) { |
169 | dev_err(qspi->dev, "pm_runtime_get_sync() failed\n"); | 165 | dev_err(qspi->dev, "pm_runtime_get_sync() failed\n"); |
170 | return ret; | 166 | return ret; |
171 | } | 167 | } |
@@ -397,13 +393,12 @@ static irqreturn_t ti_qspi_isr(int irq, void *dev_id) | |||
397 | { | 393 | { |
398 | struct ti_qspi *qspi = dev_id; | 394 | struct ti_qspi *qspi = dev_id; |
399 | u16 int_stat; | 395 | u16 int_stat; |
396 | u32 stat; | ||
400 | 397 | ||
401 | irqreturn_t ret = IRQ_HANDLED; | 398 | irqreturn_t ret = IRQ_HANDLED; |
402 | 399 | ||
403 | spin_lock(&qspi->lock); | ||
404 | |||
405 | int_stat = ti_qspi_read(qspi, QSPI_INTR_STATUS_ENABLED_CLEAR); | 400 | int_stat = ti_qspi_read(qspi, QSPI_INTR_STATUS_ENABLED_CLEAR); |
406 | qspi->stat = ti_qspi_read(qspi, QSPI_SPI_STATUS_REG); | 401 | stat = ti_qspi_read(qspi, QSPI_SPI_STATUS_REG); |
407 | 402 | ||
408 | if (!int_stat) { | 403 | if (!int_stat) { |
409 | dev_dbg(qspi->dev, "No IRQ triggered\n"); | 404 | dev_dbg(qspi->dev, "No IRQ triggered\n"); |
@@ -411,35 +406,14 @@ static irqreturn_t ti_qspi_isr(int irq, void *dev_id) | |||
411 | goto out; | 406 | goto out; |
412 | } | 407 | } |
413 | 408 | ||
414 | ret = IRQ_WAKE_THREAD; | ||
415 | |||
416 | ti_qspi_write(qspi, QSPI_WC_INT_DISABLE, QSPI_INTR_ENABLE_CLEAR_REG); | ||
417 | ti_qspi_write(qspi, QSPI_WC_INT_DISABLE, | 409 | ti_qspi_write(qspi, QSPI_WC_INT_DISABLE, |
418 | QSPI_INTR_STATUS_ENABLED_CLEAR); | 410 | QSPI_INTR_STATUS_ENABLED_CLEAR); |
419 | 411 | if (stat & WC) | |
412 | complete(&qspi->transfer_complete); | ||
420 | out: | 413 | out: |
421 | spin_unlock(&qspi->lock); | ||
422 | |||
423 | return ret; | 414 | return ret; |
424 | } | 415 | } |
425 | 416 | ||
426 | static irqreturn_t ti_qspi_threaded_isr(int this_irq, void *dev_id) | ||
427 | { | ||
428 | struct ti_qspi *qspi = dev_id; | ||
429 | unsigned long flags; | ||
430 | |||
431 | spin_lock_irqsave(&qspi->lock, flags); | ||
432 | |||
433 | if (qspi->stat & WC) | ||
434 | complete(&qspi->transfer_complete); | ||
435 | |||
436 | spin_unlock_irqrestore(&qspi->lock, flags); | ||
437 | |||
438 | ti_qspi_write(qspi, QSPI_WC_INT_EN, QSPI_INTR_ENABLE_SET_REG); | ||
439 | |||
440 | return IRQ_HANDLED; | ||
441 | } | ||
442 | |||
443 | static int ti_qspi_runtime_resume(struct device *dev) | 417 | static int ti_qspi_runtime_resume(struct device *dev) |
444 | { | 418 | { |
445 | struct ti_qspi *qspi; | 419 | struct ti_qspi *qspi; |
@@ -472,7 +446,7 @@ static int ti_qspi_probe(struct platform_device *pdev) | |||
472 | if (!master) | 446 | if (!master) |
473 | return -ENOMEM; | 447 | return -ENOMEM; |
474 | 448 | ||
475 | master->mode_bits = SPI_CPOL | SPI_CPHA; | 449 | master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_RX_DUAL | SPI_RX_QUAD; |
476 | 450 | ||
477 | master->bus_num = -1; | 451 | master->bus_num = -1; |
478 | master->flags = SPI_MASTER_HALF_DUPLEX; | 452 | master->flags = SPI_MASTER_HALF_DUPLEX; |
@@ -485,11 +459,10 @@ static int ti_qspi_probe(struct platform_device *pdev) | |||
485 | if (!of_property_read_u32(np, "num-cs", &num_cs)) | 459 | if (!of_property_read_u32(np, "num-cs", &num_cs)) |
486 | master->num_chipselect = num_cs; | 460 | master->num_chipselect = num_cs; |
487 | 461 | ||
488 | platform_set_drvdata(pdev, master); | ||
489 | |||
490 | qspi = spi_master_get_devdata(master); | 462 | qspi = spi_master_get_devdata(master); |
491 | qspi->master = master; | 463 | qspi->master = master; |
492 | qspi->dev = &pdev->dev; | 464 | qspi->dev = &pdev->dev; |
465 | platform_set_drvdata(pdev, qspi); | ||
493 | 466 | ||
494 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 467 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
495 | 468 | ||
@@ -499,7 +472,6 @@ static int ti_qspi_probe(struct platform_device *pdev) | |||
499 | return irq; | 472 | return irq; |
500 | } | 473 | } |
501 | 474 | ||
502 | spin_lock_init(&qspi->lock); | ||
503 | mutex_init(&qspi->list_lock); | 475 | mutex_init(&qspi->list_lock); |
504 | 476 | ||
505 | qspi->base = devm_ioremap_resource(&pdev->dev, r); | 477 | qspi->base = devm_ioremap_resource(&pdev->dev, r); |
@@ -508,8 +480,7 @@ static int ti_qspi_probe(struct platform_device *pdev) | |||
508 | goto free_master; | 480 | goto free_master; |
509 | } | 481 | } |
510 | 482 | ||
511 | ret = devm_request_threaded_irq(&pdev->dev, irq, ti_qspi_isr, | 483 | ret = devm_request_irq(&pdev->dev, irq, ti_qspi_isr, 0, |
512 | ti_qspi_threaded_isr, 0, | ||
513 | dev_name(&pdev->dev), qspi); | 484 | dev_name(&pdev->dev), qspi); |
514 | if (ret < 0) { | 485 | if (ret < 0) { |
515 | dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n", | 486 | dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n", |
@@ -532,7 +503,7 @@ static int ti_qspi_probe(struct platform_device *pdev) | |||
532 | if (!of_property_read_u32(np, "spi-max-frequency", &max_freq)) | 503 | if (!of_property_read_u32(np, "spi-max-frequency", &max_freq)) |
533 | qspi->spi_max_frequency = max_freq; | 504 | qspi->spi_max_frequency = max_freq; |
534 | 505 | ||
535 | ret = spi_register_master(master); | 506 | ret = devm_spi_register_master(&pdev->dev, master); |
536 | if (ret) | 507 | if (ret) |
537 | goto free_master; | 508 | goto free_master; |
538 | 509 | ||
@@ -545,9 +516,25 @@ free_master: | |||
545 | 516 | ||
546 | static int ti_qspi_remove(struct platform_device *pdev) | 517 | static int ti_qspi_remove(struct platform_device *pdev) |
547 | { | 518 | { |
548 | struct ti_qspi *qspi = platform_get_drvdata(pdev); | 519 | struct spi_master *master; |
520 | struct ti_qspi *qspi; | ||
521 | int ret; | ||
522 | |||
523 | master = platform_get_drvdata(pdev); | ||
524 | qspi = spi_master_get_devdata(master); | ||
525 | |||
526 | ret = pm_runtime_get_sync(qspi->dev); | ||
527 | if (ret < 0) { | ||
528 | dev_err(qspi->dev, "pm_runtime_get_sync() failed\n"); | ||
529 | return ret; | ||
530 | } | ||
531 | |||
532 | ti_qspi_write(qspi, QSPI_WC_INT_DISABLE, QSPI_INTR_ENABLE_CLEAR_REG); | ||
533 | |||
534 | pm_runtime_put(qspi->dev); | ||
535 | pm_runtime_disable(&pdev->dev); | ||
549 | 536 | ||
550 | spi_unregister_master(qspi->master); | 537 | spi_unregister_master(master); |
551 | 538 | ||
552 | return 0; | 539 | return 0; |
553 | } | 540 | } |
@@ -558,7 +545,7 @@ static const struct dev_pm_ops ti_qspi_pm_ops = { | |||
558 | 545 | ||
559 | static struct platform_driver ti_qspi_driver = { | 546 | static struct platform_driver ti_qspi_driver = { |
560 | .probe = ti_qspi_probe, | 547 | .probe = ti_qspi_probe, |
561 | .remove = ti_qspi_remove, | 548 | .remove = ti_qspi_remove, |
562 | .driver = { | 549 | .driver = { |
563 | .name = "ti,dra7xxx-qspi", | 550 | .name = "ti,dra7xxx-qspi", |
564 | .owner = THIS_MODULE, | 551 | .owner = THIS_MODULE, |