aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/spi/spi.c')
-rw-r--r--drivers/spi/spi.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 978dda2c5239..361cced68069 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -553,6 +553,10 @@ static void spi_pump_messages(struct kthread_work *work)
553 master->unprepare_transfer_hardware(master)) 553 master->unprepare_transfer_hardware(master))
554 dev_err(&master->dev, 554 dev_err(&master->dev,
555 "failed to unprepare transfer hardware\n"); 555 "failed to unprepare transfer hardware\n");
556 if (master->auto_runtime_pm) {
557 pm_runtime_mark_last_busy(master->dev.parent);
558 pm_runtime_put_autosuspend(master->dev.parent);
559 }
556 return; 560 return;
557 } 561 }
558 562
@@ -572,11 +576,23 @@ static void spi_pump_messages(struct kthread_work *work)
572 master->busy = true; 576 master->busy = true;
573 spin_unlock_irqrestore(&master->queue_lock, flags); 577 spin_unlock_irqrestore(&master->queue_lock, flags);
574 578
579 if (!was_busy && master->auto_runtime_pm) {
580 ret = pm_runtime_get_sync(master->dev.parent);
581 if (ret < 0) {
582 dev_err(&master->dev, "Failed to power device: %d\n",
583 ret);
584 return;
585 }
586 }
587
575 if (!was_busy && master->prepare_transfer_hardware) { 588 if (!was_busy && master->prepare_transfer_hardware) {
576 ret = master->prepare_transfer_hardware(master); 589 ret = master->prepare_transfer_hardware(master);
577 if (ret) { 590 if (ret) {
578 dev_err(&master->dev, 591 dev_err(&master->dev,
579 "failed to prepare transfer hardware\n"); 592 "failed to prepare transfer hardware\n");
593
594 if (master->auto_runtime_pm)
595 pm_runtime_put(master->dev.parent);
580 return; 596 return;
581 } 597 }
582 } 598 }