diff options
Diffstat (limited to 'drivers/spi/spi.c')
-rw-r--r-- | drivers/spi/spi.c | 16 |
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 | } |