Commit fa4c221f authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull pmdomain fixes from Ulf Hansson:
 "Core:
   - Fix a couple of memory-leaks during genpd init/remove

  Providers:
   - imx: Adjust delay for gpcv2 to fix power up handshake
   - mediatek: Fix DT bindings by adding another nested power-domain
     layer"

* tag 'pmdomain-v6.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm:
  pmdomain: imx: gpcv2: Adjust delay after power up handshake
  pmdomain: core: Fix error path in pm_genpd_init() when ida alloc fails
  pmdomain: core: Add missing put_device()
  dt-bindings: power: mediatek: Add another nested power-domain layer
parents b8f52214 2379fb93
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -55,6 +55,10 @@ patternProperties:
            patternProperties:
              "^power-domain@[0-9a-f]+$":
                $ref: "#/$defs/power-domain-node"
                patternProperties:
                  "^power-domain@[0-9a-f]+$":
                    $ref: "#/$defs/power-domain-node"
                    unevaluatedProperties: false
                unevaluatedProperties: false
            unevaluatedProperties: false
        unevaluatedProperties: false
+20 −17
Original line number Diff line number Diff line
@@ -2172,8 +2172,24 @@ static int genpd_alloc_data(struct generic_pm_domain *genpd)
	}

	genpd->gd = gd;
	return 0;
	device_initialize(&genpd->dev);

	if (!genpd_is_dev_name_fw(genpd)) {
		dev_set_name(&genpd->dev, "%s", genpd->name);
	} else {
		ret = ida_alloc(&genpd_ida, GFP_KERNEL);
		if (ret < 0)
			goto put;

		genpd->device_id = ret;
		dev_set_name(&genpd->dev, "%s_%u", genpd->name, genpd->device_id);
	}

	return 0;
put:
	put_device(&genpd->dev);
	if (genpd->free_states == genpd_free_default_power_state)
		kfree(genpd->states);
free:
	if (genpd_is_cpu_domain(genpd))
		free_cpumask_var(genpd->cpus);
@@ -2183,6 +2199,9 @@ static int genpd_alloc_data(struct generic_pm_domain *genpd)

static void genpd_free_data(struct generic_pm_domain *genpd)
{
	put_device(&genpd->dev);
	if (genpd->device_id != -ENXIO)
		ida_free(&genpd_ida, genpd->device_id);
	if (genpd_is_cpu_domain(genpd))
		free_cpumask_var(genpd->cpus);
	if (genpd->free_states)
@@ -2271,20 +2290,6 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
	if (ret)
		return ret;

	device_initialize(&genpd->dev);

	if (!genpd_is_dev_name_fw(genpd)) {
		dev_set_name(&genpd->dev, "%s", genpd->name);
	} else {
		ret = ida_alloc(&genpd_ida, GFP_KERNEL);
		if (ret < 0) {
			put_device(&genpd->dev);
			return ret;
		}
		genpd->device_id = ret;
		dev_set_name(&genpd->dev, "%s_%u", genpd->name, genpd->device_id);
	}

	mutex_lock(&gpd_list_lock);
	list_add(&genpd->gpd_list_node, &gpd_list);
	mutex_unlock(&gpd_list_lock);
@@ -2325,8 +2330,6 @@ static int genpd_remove(struct generic_pm_domain *genpd)
	genpd_unlock(genpd);
	genpd_debug_remove(genpd);
	cancel_work_sync(&genpd->power_off_work);
	if (genpd->device_id != -ENXIO)
		ida_free(&genpd_ida, genpd->device_id);
	genpd_free_data(genpd);

	pr_debug("%s: removed %s\n", __func__, dev_name(&genpd->dev));
+1 −1
Original line number Diff line number Diff line
@@ -403,7 +403,7 @@ static int imx_pgc_power_up(struct generic_pm_domain *genpd)
		 * already reaches target before udelay()
		 */
		regmap_read_bypassed(domain->regmap, domain->regs->hsk, &reg_val);
		udelay(5);
		udelay(10);
	}

	/* Disable reset clocks for all devices in the domain */