On 2/28/25 11:10 AM, Alexander Stein wrote: Hi,
diff --git a/drivers/gpu/drm/panthor/panthor_device.c b/drivers/gpu/drm/panthor/panthor_device.c index 51ee9cae94504..4348b7e917b64 100644 --- a/drivers/gpu/drm/panthor/panthor_device.c +++ b/drivers/gpu/drm/panthor/panthor_device.c @@ -75,6 +75,58 @@ static int panthor_reset_init(struct panthor_device *ptdev) return 0; }+/* Generic power domain handling code, see drivers/gpu/drm/tiny/simpledrm.c */+static void panthor_detach_genpd(void *res) +{ + struct panthor_device *ptdev = res; + int i; + + if (ptdev->pwr_dom_count <= 1) + return; + + for (i = ptdev->pwr_dom_count - 1; i >= 0; i--) + dev_pm_domain_detach(ptdev->pwr_dom_devs[i], true); +} + +static int panthor_genpd_init(struct panthor_device *ptdev) +{ + struct device *dev = ptdev->base.dev; + int i, ret; + + ptdev->pwr_dom_count = of_count_phandle_with_args(dev->of_node, "power-domains", + "#power-domain-cells"); + /* + * Single power-domain devices are handled by driver core nothing to do + * here. The same for device nodes without "power-domains" property. + */ + if (ptdev->pwr_dom_count <= 1) + return 0; + + if (ptdev->pwr_dom_count > ARRAY_SIZE(ptdev->pwr_dom_devs)) { + drm_warn(&ptdev->base, "Too many power domains (%d) for this device\n", + ptdev->pwr_dom_count); + return -EINVAL; + } + + for (i = 0; i < ptdev->pwr_dom_count; i++) { + ptdev->pwr_dom_devs[i] = dev_pm_domain_attach_by_id(dev, i); + if (!IS_ERR(ptdev->pwr_dom_devs[i])) + continue; + + ret = PTR_ERR(ptdev->pwr_dom_devs[i]); + if (ret != -EPROBE_DEFER) { + drm_warn(&ptdev->base, "pm_domain_attach_by_id(%u) failed: %d\n", i, ret); + continue;Is it a good idea to continue if a power-domain is missing? Any access might stuck completely. IMHO returning an error is more sensible. Also some dev_err_probe() should be added here.
Fixed both, thanks .
