Re: [PATCH v3 3/4] powercap: qcom: Add SPEL powercap driver
From: Krzysztof Kozlowski
Date: Fri Jul 03 2026 - 02:25:21 EST
On Thu, Jul 02, 2026 at 10:52:56PM +0530, Manaf Meethalavalappu Pallikunhi wrote:
> QUALCOMM TEE (QCOMTEE) DRIVER
> M: Amirreza Zarrabi <amirreza.zarrabi@xxxxxxxxxxxxxxxx>
> diff --git a/drivers/powercap/Kconfig b/drivers/powercap/Kconfig
> index 03c4c796d993..e3a47c653499 100644
> --- a/drivers/powercap/Kconfig
> +++ b/drivers/powercap/Kconfig
> @@ -93,4 +93,17 @@ config DTPM_DEVFREQ
> help
> This enables support for device power limitation based on
> energy model.
> +
> +config QCOM_SPEL
> + tristate "Qualcomm SPEL Powercap driver"
> + depends on ARM64 || COMPILE_TEST
Why does it depend on ARM64?
Where is dependency on ARCH_QCOM?
...
> +static int spel_probe(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + struct powercap_control_type *ct;
> + struct spel_system *sp;
> + int ret;
> +
> + sp = kzalloc_obj(struct spel_system);
I miss the point why you are not using devm. You are introducing
ordering issues now, because sp is freed before other cleanups are done.
> + if (!sp)
> + return -ENOMEM;
> +
> + sp->dev = dev;
> +
> + /* Map config registers (units, capabilities) */
> + sp->config_base = devm_platform_ioremap_resource_byname(pdev, "config");
> + if (IS_ERR(sp->config_base)) {
> + ret = PTR_ERR(sp->config_base);
> + goto err_free_sp;
> + }
> +
> + /* Map constraint registers (power limits) */
> + sp->constraint_base = devm_platform_ioremap_resource_byname(pdev, "constraints");
> + if (IS_ERR(sp->constraint_base)) {
> + ret = PTR_ERR(sp->constraint_base);
> + goto err_free_sp;
> + }
> +
> + /* Map spel domain registers (energy counters) */
> + sp->node_base = devm_platform_ioremap_resource_byname(pdev, "nodes");
> + if (IS_ERR(sp->node_base)) {
> + ret = PTR_ERR(sp->node_base);
> + goto err_free_sp;
> + }
> +
> + sp->control_type = powercap_register_control_type(NULL, "qcom-spel",
> + NULL);
> + if (IS_ERR(sp->control_type)) {
> + dev_err(dev, "Failed to register control type\n");
syntax is everywhere: ret = dev_err_probe
Since years already. Don't upstream your old downstream code, but write
something based on current Linux drivers.
> + ret = PTR_ERR(sp->control_type);
> + goto err_free_sp;
> + }
> +
> + /* Save control_type before it might be freed by spel_release_zone() */
> + ct = sp->control_type;
> +
> + /* Initialize system and domains */
> + ret = spel_init_system(sp, dev);
> + if (ret) {
> + dev_err(dev, "Failed to initialize system\n");
dev_err_probe
Best regards,
Krzysztof