diff options
| author | Mark Brown <broonie@linaro.org> | 2013-10-25 04:51:36 -0400 |
|---|---|---|
| committer | Mark Brown <broonie@linaro.org> | 2013-10-25 04:51:36 -0400 |
| commit | b3d6c80050900f55b3f51eba97c3e563d5d099c0 (patch) | |
| tree | ba3cb8f53715576f32cbd3e1b57a33628dd9edd3 | |
| parent | 982d6287435afb2cbd05bcabe1392658e20e613c (diff) | |
| parent | dabefd56c6ee883bae0bdce4d5396c3f21286ab8 (diff) | |
Merge remote-tracking branch 'spi/topic/qspi' into spi-next
| -rw-r--r-- | drivers/spi/spi-ti-qspi.c | 50 |
1 files changed, 16 insertions, 34 deletions
diff --git a/drivers/spi/spi-ti-qspi.c b/drivers/spi/spi-ti-qspi.c index 4e2109d9853d..0b71270fbf67 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) |
| @@ -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; |
| @@ -499,7 +473,6 @@ static int ti_qspi_probe(struct platform_device *pdev) | |||
| 499 | return irq; | 473 | return irq; |
| 500 | } | 474 | } |
| 501 | 475 | ||
| 502 | spin_lock_init(&qspi->lock); | ||
| 503 | mutex_init(&qspi->list_lock); | 476 | mutex_init(&qspi->list_lock); |
| 504 | 477 | ||
| 505 | qspi->base = devm_ioremap_resource(&pdev->dev, r); | 478 | qspi->base = devm_ioremap_resource(&pdev->dev, r); |
| @@ -508,8 +481,7 @@ static int ti_qspi_probe(struct platform_device *pdev) | |||
| 508 | goto free_master; | 481 | goto free_master; |
| 509 | } | 482 | } |
| 510 | 483 | ||
| 511 | ret = devm_request_threaded_irq(&pdev->dev, irq, ti_qspi_isr, | 484 | ret = devm_request_irq(&pdev->dev, irq, ti_qspi_isr, 0, |
| 512 | ti_qspi_threaded_isr, 0, | ||
| 513 | dev_name(&pdev->dev), qspi); | 485 | dev_name(&pdev->dev), qspi); |
| 514 | if (ret < 0) { | 486 | if (ret < 0) { |
| 515 | dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n", | 487 | dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n", |
| @@ -543,12 +515,22 @@ free_master: | |||
| 543 | return ret; | 515 | return ret; |
| 544 | } | 516 | } |
| 545 | 517 | ||
| 518 | static int ti_qspi_remove(struct platform_device *pdev) | ||
| 519 | { | ||
| 520 | struct ti_qspi *qspi = platform_get_drvdata(pdev); | ||
| 521 | |||
| 522 | ti_qspi_write(qspi, QSPI_WC_INT_DISABLE, QSPI_INTR_ENABLE_CLEAR_REG); | ||
| 523 | |||
| 524 | return 0; | ||
| 525 | } | ||
| 526 | |||
| 546 | static const struct dev_pm_ops ti_qspi_pm_ops = { | 527 | static const struct dev_pm_ops ti_qspi_pm_ops = { |
| 547 | .runtime_resume = ti_qspi_runtime_resume, | 528 | .runtime_resume = ti_qspi_runtime_resume, |
| 548 | }; | 529 | }; |
| 549 | 530 | ||
| 550 | static struct platform_driver ti_qspi_driver = { | 531 | static struct platform_driver ti_qspi_driver = { |
| 551 | .probe = ti_qspi_probe, | 532 | .probe = ti_qspi_probe, |
| 533 | .remove = ti_qspi_remove, | ||
| 552 | .driver = { | 534 | .driver = { |
| 553 | .name = "ti,dra7xxx-qspi", | 535 | .name = "ti,dra7xxx-qspi", |
| 554 | .owner = THIS_MODULE, | 536 | .owner = THIS_MODULE, |
