|
@@ -553,6 +553,10 @@ static void spi_pump_messages(struct kthread_work *work)
|
|
|
master->unprepare_transfer_hardware(master))
|
|
|
dev_err(&master->dev,
|
|
|
"failed to unprepare transfer hardware\n");
|
|
|
+ if (master->auto_runtime_pm) {
|
|
|
+ pm_runtime_mark_last_busy(master->dev.parent);
|
|
|
+ pm_runtime_put_autosuspend(master->dev.parent);
|
|
|
+ }
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -572,11 +576,23 @@ static void spi_pump_messages(struct kthread_work *work)
|
|
|
master->busy = true;
|
|
|
spin_unlock_irqrestore(&master->queue_lock, flags);
|
|
|
|
|
|
+ if (!was_busy && master->auto_runtime_pm) {
|
|
|
+ ret = pm_runtime_get_sync(master->dev.parent);
|
|
|
+ if (ret < 0) {
|
|
|
+ dev_err(&master->dev, "Failed to power device: %d\n",
|
|
|
+ ret);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (!was_busy && master->prepare_transfer_hardware) {
|
|
|
ret = master->prepare_transfer_hardware(master);
|
|
|
if (ret) {
|
|
|
dev_err(&master->dev,
|
|
|
"failed to prepare transfer hardware\n");
|
|
|
+
|
|
|
+ if (master->auto_runtime_pm)
|
|
|
+ pm_runtime_put(master->dev.parent);
|
|
|
return;
|
|
|
}
|
|
|
}
|