diff options
Diffstat (limited to 'drivers/spi/spi-ti-qspi.c')
-rw-r--r-- | drivers/spi/spi-ti-qspi.c | 46 |
1 files changed, 9 insertions, 37 deletions
diff --git a/drivers/spi/spi-ti-qspi.c b/drivers/spi/spi-ti-qspi.c index e12d962a289f..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", |
@@ -532,7 +504,7 @@ static int ti_qspi_probe(struct platform_device *pdev) | |||
532 | if (!of_property_read_u32(np, "spi-max-frequency", &max_freq)) | 504 | if (!of_property_read_u32(np, "spi-max-frequency", &max_freq)) |
533 | qspi->spi_max_frequency = max_freq; | 505 | qspi->spi_max_frequency = max_freq; |
534 | 506 | ||
535 | ret = spi_register_master(master); | 507 | ret = devm_spi_register_master(&pdev->dev, master); |
536 | if (ret) | 508 | if (ret) |
537 | goto free_master; | 509 | goto free_master; |
538 | 510 | ||
@@ -547,7 +519,7 @@ static int ti_qspi_remove(struct platform_device *pdev) | |||
547 | { | 519 | { |
548 | struct ti_qspi *qspi = platform_get_drvdata(pdev); | 520 | struct ti_qspi *qspi = platform_get_drvdata(pdev); |
549 | 521 | ||
550 | spi_unregister_master(qspi->master); | 522 | ti_qspi_write(qspi, QSPI_WC_INT_DISABLE, QSPI_INTR_ENABLE_CLEAR_REG); |
551 | 523 | ||
552 | return 0; | 524 | return 0; |
553 | } | 525 | } |
@@ -558,7 +530,7 @@ static const struct dev_pm_ops ti_qspi_pm_ops = { | |||
558 | 530 | ||
559 | static struct platform_driver ti_qspi_driver = { | 531 | static struct platform_driver ti_qspi_driver = { |
560 | .probe = ti_qspi_probe, | 532 | .probe = ti_qspi_probe, |
561 | .remove = ti_qspi_remove, | 533 | .remove = ti_qspi_remove, |
562 | .driver = { | 534 | .driver = { |
563 | .name = "ti,dra7xxx-qspi", | 535 | .name = "ti,dra7xxx-qspi", |
564 | .owner = THIS_MODULE, | 536 | .owner = THIS_MODULE, |