mirror of https://github.com/torvalds/linux.git
drm/panfrost: Implement ability to turn on/off regulators in suspend
Some platforms/SoCs can power off the GPU entirely by completely cutting off power, greatly enhancing battery time during system suspend: add a new pm_feature GPU_PM_VREG_OFF to allow turning off the GPU regulators during full suspend only on selected platforms. Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Reviewed-by: Steven Price <steven.price@arm.com> Signed-off-by: Steven Price <steven.price@arm.com> Link: https://patchwork.freedesktop.org/patch/msgid/20231109102543.42971-6-angelogioacchino.delregno@collabora.com
This commit is contained in:
parent
32f175d426
commit
889a2b06f8
|
|
@ -431,10 +431,21 @@ static int panfrost_device_resume(struct device *dev)
|
|||
struct panfrost_device *pfdev = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
if (pfdev->comp->pm_features & BIT(GPU_PM_VREG_OFF)) {
|
||||
unsigned long freq = pfdev->pfdevfreq.fast_rate;
|
||||
struct dev_pm_opp *opp;
|
||||
|
||||
opp = dev_pm_opp_find_freq_ceil(dev, &freq);
|
||||
if (IS_ERR(opp))
|
||||
return PTR_ERR(opp);
|
||||
dev_pm_opp_set_opp(dev, opp);
|
||||
dev_pm_opp_put(opp);
|
||||
}
|
||||
|
||||
if (pfdev->comp->pm_features & BIT(GPU_PM_CLK_DIS)) {
|
||||
ret = clk_enable(pfdev->clock);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_clk;
|
||||
|
||||
if (pfdev->bus_clock) {
|
||||
ret = clk_enable(pfdev->bus_clock);
|
||||
|
|
@ -455,6 +466,9 @@ static int panfrost_device_resume(struct device *dev)
|
|||
err_bus_clk:
|
||||
if (pfdev->comp->pm_features & BIT(GPU_PM_CLK_DIS))
|
||||
clk_disable(pfdev->clock);
|
||||
err_clk:
|
||||
if (pfdev->comp->pm_features & BIT(GPU_PM_VREG_OFF))
|
||||
dev_pm_opp_set_opp(dev, NULL);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -474,6 +488,9 @@ static int panfrost_device_suspend(struct device *dev)
|
|||
clk_disable(pfdev->clock);
|
||||
}
|
||||
|
||||
if (pfdev->comp->pm_features & BIT(GPU_PM_VREG_OFF))
|
||||
dev_pm_opp_set_opp(dev, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -28,9 +28,11 @@ struct panfrost_perfcnt;
|
|||
/**
|
||||
* enum panfrost_gpu_pm - Supported kernel power management features
|
||||
* @GPU_PM_CLK_DIS: Allow disabling clocks during system suspend
|
||||
* @GPU_PM_VREG_OFF: Allow turning off regulators during system suspend
|
||||
*/
|
||||
enum panfrost_gpu_pm {
|
||||
GPU_PM_CLK_DIS,
|
||||
GPU_PM_VREG_OFF,
|
||||
};
|
||||
|
||||
struct panfrost_features {
|
||||
|
|
|
|||
Loading…
Reference in New Issue