On Fri Jun 27, 2025 at 9:56 AM CEST, Javier Martinez Canillas wrote: > Luca Weiss <luca.we...@fairphone.com> writes: > >> Some devices might require keeping an interconnect path alive so that >> the framebuffer continues working. Add support for that by setting the >> bandwidth requirements appropriately for all provided interconnect >> paths. >> >> Reviewed-by: Thomas Zimmermann <tzimmerm...@suse.de> >> Signed-off-by: Luca Weiss <luca.we...@fairphone.com> >> --- >> drivers/video/fbdev/simplefb.c | 83 >> ++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 83 insertions(+) >> > > [...] > >> +static void simplefb_detach_icc(void *res) >> +{ >> + struct simplefb_par *par = res; >> + int i; >> + >> + for (i = par->icc_count - 1; i >= 0; i--) { >> + if (!IS_ERR_OR_NULL(par->icc_paths[i])) >> + icc_put(par->icc_paths[i]); >> + } >> +} >> + >> +static int simplefb_attach_icc(struct simplefb_par *par, >> + struct platform_device *pdev) >> +{ >> + struct device *dev = &pdev->dev; >> + int ret, count, i; >> + >> + count = of_count_phandle_with_args(dev->of_node, "interconnects", >> + "#interconnect-cells"); >> + if (count < 0) >> + return 0; >> + >> + /* An interconnect path consists of two elements */ >> + if (count % 2) { >> + dev_err(dev, "invalid interconnects value\n"); >> + return -EINVAL; >> + } >> + par->icc_count = count / 2; >> + >> + par->icc_paths = devm_kcalloc(dev, par->icc_count, >> + sizeof(*par->icc_paths), >> + GFP_KERNEL); >> + if (!par->icc_paths) >> + return -ENOMEM; >> + >> + for (i = 0; i < par->icc_count; i++) { >> + par->icc_paths[i] = of_icc_get_by_index(dev, i); >> + if (IS_ERR_OR_NULL(par->icc_paths[i])) { >> + ret = PTR_ERR(par->icc_paths[i]); >> + if (ret == -EPROBE_DEFER) >> + goto err; >> + dev_err(dev, "failed to get interconnect path %u: >> %d\n", i, ret); >> + continue; >> + } >> + >> + ret = icc_set_bw(par->icc_paths[i], 0, UINT_MAX); >> + if (ret) { >> + dev_err(dev, "failed to set interconnect bandwidth %u: >> %d\n", i, ret); >> + continue; >> + } >> + } >> + >> + return devm_add_action_or_reset(dev, simplefb_detach_icc, par); >> + >> +err: >> + while (i) { >> + --i; >> + if (!IS_ERR_OR_NULL(par->icc_paths[i])) >> + icc_put(par->icc_paths[i]); >> + } >> + return ret; >> +} >> +#else > > These two functions contain the same logic that you are using in the > simpledrm driver. I wonder if could be made helpers so that the code > isn't duplicated in both drivers.
I believe most resource handling code (clocks, regulators, power-domains, plus now interconnect) should be pretty generic between the two. > > But in any case it could be a follow-up of your series I think. To be fair, I don't think I'll work on this, I've got plenty of Qualcomm SoC-specific bits to work on :) Regards Luca > > Reviewed-by: Javier Martinez Canillas <javi...@redhat.com>