]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
pmdomain: imx: Fix i.MX8MP power notifier
authorPeng Fan <peng.fan@nxp.com>
Wed, 10 Jun 2026 14:39:10 +0000 (22:39 +0800)
committerUlf Hansson <ulfh@kernel.org>
Wed, 8 Jul 2026 15:11:50 +0000 (17:11 +0200)
Using imx8mm_vpu_power_notifier() for i.MX8MP is wrong, as it ungates
the VPU clocks to provide the ADB clock, which is necessary on i.MX8MM,
but on i.MX8MP there is a separate gate (bit 3) for the NoC. So add
imx8mp_vpu_power_notifier() for i.MX8MP.

Fixes: a1a5f15f7f6cb ("soc: imx: imx8m-blk-ctrl: add i.MX8MP VPU blk ctrl")
Cc: stable@vger.kernel.org
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
Signed-off-by: Ulf Hansson <ulfh@kernel.org>
drivers/pmdomain/imx/imx8m-blk-ctrl.c

index 19e992d2ee3b845bc9382bcd494a5d96f9c6ac44..e13a47eeed75d7189aa15370a7bee4cceb05a1d6 100644 (file)
@@ -514,9 +514,34 @@ static const struct imx8m_blk_ctrl_domain_data imx8mp_vpu_blk_ctl_domain_data[]
        },
 };
 
+static int imx8mp_vpu_power_notifier(struct notifier_block *nb,
+                                    unsigned long action, void *data)
+{
+       struct imx8m_blk_ctrl *bc = container_of(nb, struct imx8m_blk_ctrl,
+                                                power_nb);
+
+       if (action == GENPD_NOTIFY_ON) {
+               /*
+                * On power up we have no software backchannel to the GPC to
+                * wait for the ADB handshake to happen, so we just delay for a
+                * bit. On power down the GPC driver waits for the handshake.
+                */
+
+               udelay(5);
+
+               /* set "fuse" bits to enable the VPUs */
+               regmap_set_bits(bc->regmap, 0x8, 0xffffffff);
+               regmap_set_bits(bc->regmap, 0xc, 0xffffffff);
+               regmap_set_bits(bc->regmap, 0x10, 0xffffffff);
+               regmap_set_bits(bc->regmap, 0x14, 0xffffffff);
+       }
+
+       return NOTIFY_OK;
+}
+
 static const struct imx8m_blk_ctrl_data imx8mp_vpu_blk_ctl_dev_data = {
        .max_reg = 0x18,
-       .power_notifier_fn = imx8mm_vpu_power_notifier,
+       .power_notifier_fn = imx8mp_vpu_power_notifier,
        .domains = imx8mp_vpu_blk_ctl_domain_data,
        .num_domains = ARRAY_SIZE(imx8mp_vpu_blk_ctl_domain_data),
 };