Am Donnerstag, 12. September 2024, 09:26:14 CEST schrieb Kever Yang: > In order to make the SD card hotplug working we need the card detect > function logic inside the controller always working. The runtime PM will > gate the clock and the power domain, which stops controller working when > no data transfer happen. > > So lets skip enable runtime PM when the card needs to detected by the > controller and the card is removable. > > Signed-off-by: Kever Yang <kever.yang@xxxxxxxxxxxxxx> So for the change itself this looks good, i.e. it fixes an issue for baords relying on the on-chip-card-detect. But for boards doing that, the controller will be running _all the time_ even if there is never any card inserted. So relying on the on-soc card-detect will effectively increase the power- consumption of the board - even it it'll never use any sd-card? > --- > > drivers/mmc/host/dw_mmc-rockchip.c | 23 +++++++++++++++++------ > 1 file changed, 17 insertions(+), 6 deletions(-) > > diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c > index b07190ba4b7a..df91205f9cd3 100644 > --- a/drivers/mmc/host/dw_mmc-rockchip.c > +++ b/drivers/mmc/host/dw_mmc-rockchip.c > @@ -345,28 +345,39 @@ static int dw_mci_rockchip_probe(struct platform_device *pdev) > const struct dw_mci_drv_data *drv_data; > const struct of_device_id *match; > int ret; > + bool use_rpm = true; > > if (!pdev->dev.of_node) > return -ENODEV; > > + if (!device_property_read_bool(&pdev->dev, "non-removable") && It would be nice to add a comment here about the fact that this will disable power-management for the controller. Also shouldn't non-removable already work, making the case above not necessary? Thanks Heiko > + !device_property_read_bool(&pdev->dev, "cd-gpios")) > + use_rpm = false; > + > match = of_match_node(dw_mci_rockchip_match, pdev->dev.of_node); > drv_data = match->data; > > pm_runtime_get_noresume(&pdev->dev); > pm_runtime_set_active(&pdev->dev); > - pm_runtime_enable(&pdev->dev); > - pm_runtime_set_autosuspend_delay(&pdev->dev, 50); > - pm_runtime_use_autosuspend(&pdev->dev); > + > + if (use_rpm) { > + pm_runtime_enable(&pdev->dev); > + pm_runtime_set_autosuspend_delay(&pdev->dev, 50); > + pm_runtime_use_autosuspend(&pdev->dev); > + } > > ret = dw_mci_pltfm_register(pdev, drv_data); > if (ret) { > - pm_runtime_disable(&pdev->dev); > - pm_runtime_set_suspended(&pdev->dev); > + if (use_rpm) { > + pm_runtime_disable(&pdev->dev); > + pm_runtime_set_suspended(&pdev->dev); > + } > pm_runtime_put_noidle(&pdev->dev); > return ret; > } > > - pm_runtime_put_autosuspend(&pdev->dev); > + if (use_rpm) > + pm_runtime_put_autosuspend(&pdev->dev); > > return 0; > } >