From nobody Fri Sep 25 12:38:49 2026 Received: from mail-oi2-f7.google.com (mail-oi2-f7.google.com [74.125.231.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 29FD239BFFE for ; Sat, 12 Sep 2026 18:32:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.231.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789237972; cv=none; b=bDKWFLo9h0GcU6RL9w5QTsDWy4Gsk5Tnglg6zl7gfRrpYAr80qjpRzix+u/a7o7M8j4MeoG4RuLsi/KVE8GSn/ldWfw3SEpsD7/8z2Oru0NWK6uOmj9IzK4jj944MyWP9VQ56qs+aMV1L0U9rTyjAw3d0ezhJD5zVdaJOBKshrQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789237972; c=relaxed/simple; bh=kjP5JtckQ81EhZbmB1tB2Jw41rIoGsoQz3j/P8a8WNk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=GmoKle8nvMvd6IUA7jMF0mSQos8gFJCee9p0N9LxgZSW1vV5+C/18HD4VDoDsfjWBzFrmmQ1dOpkQei6xons02aoggrbx8f+NXB/FBHdriF0bmOOip6zFk/O6mmGs+ZI7nhOjqU1Yq7UUdf9gDOZPNAJbP4tetBhTxuOyRZK0Xc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=SqmbK+46; arc=none smtp.client-ip=74.125.231.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="SqmbK+46" Received: by mail-oi2-f7.google.com with SMTP id 5614622812f47-4b38bf64bfcso896570b6e.0 for ; Sat, 12 Sep 2026 11:32:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789237970; x=1789842770; darn=vger.kernel.org; h=cc:to:message-id:content-transfer-encoding:content-type :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=pyGOuWl1kIoFr1BB5GPKM41t/39zE+ryKhiJyT6xB7s=; b=SqmbK+46tdU0QfSqcKSJnezGCt/eO98oe7Ac5/UF7utsbDC6jzPLvvkSfLC/eJtS4Y N13xiiEIY+TTxnrhYvcTZK6FPN5Tfag54dXEVoOhcwajL7qv3M42Vv0+v1XvMYfLBj9p zOyGMOWCSeV5WA/CHWm5GwHUxOvY5s6iIF0ASuCALj3qRDVb6CsGwXI2gKuZbQhGtrtT 47S9Pq0cYKiilZY6p1DGvkvNZ85Iuww3SIORTlatSzNcXBES+g9KtGXIsyltqJyXleop 6DjcKpxe9IhqOTyNU+qRUDnVyXlVKOyBLznKgoZmzjZS5XSn3YbtzmxsC9W1Efg93xN9 elyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789237970; x=1789842770; h=cc:to:message-id:content-transfer-encoding:content-type :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=pyGOuWl1kIoFr1BB5GPKM41t/39zE+ryKhiJyT6xB7s=; b=BAzNTCQsZtkDHg8G4DrKg0fzyfS9AbuskaNzyGnH1sayw+3cFylUxOP9ubk7wAsfZQ nbllUkqJI+qXAmUw7ny5VaAb9SwqzpDyuApAm4ucU2x/g60JwM/iB/MVKQw9ovJIoCQ2 8cJpqjty5Bcl/alXt06fAbH1PV4LJwp94pCpfqCBJdb3nRxD+ZcUy1BZLgmROG24XKly FmAz2OwUrfzom8N87vB0FaiSWsiAXlKGSajODKg5mX/dyAuGHVL9MK6jvTh83pX+MCjM G95OFcgmftPMeRLwOsacGElqCTYrs5Bxc8XmUvTfoP/G7YhTFPr7jMgUJ1a8KiAX8j/4 3rJA== X-Forwarded-Encrypted: i=1; AKwUvBzL23++Plx3/U+zL8N+a0X0Ko3H0DCQRh0PIKt/rVAvR26GOS6IOMzSZu1Sr6ou43LOcfBzXeHSpRVBYrk=@vger.kernel.org X-Gm-Message-State: AFuF++m144cyQzq+6ttK0AtW2nFecVDQP1oSWRRUi6Z4Pyc8HgltnO0h Eqw2YgmqEVL0oxbD2XlQOnNXEahEoTrEwsmdkcORqrsfpkVIIv2BflK7TPn7Et4wuoA= X-Gm-Gg: AYBFou1zqWqr7EbIHNvo6akvNX7jv2uI8zGW8OUlS4fsudCebwwaCghy/8jSa/dhRkV QjWO063a/TqQFxNNMCbRoWuLpQ89j+WYYfaba1pn+4xulLOL9/H4tie7SBCZHeKFgGyBVJu3kzF IgeGU0a9tfiwMUfC14O5fr2fstluk4veqylsm6xMp45YvuGW7Q+Lklbxj+E4pMaImWXOoWJEBTZ lTarX6dt14rlFpwO03EnXwvpMIanprsAVlRY+2bpaT/o/uxjeff4ITG5OfDT5MnvJluoKM7MR4c LeDymo3WCBBfNW0SdDFXQSiiK2b9RnjNpSK/Y3E+FPzcePkxNknchqIojmvmT4L/ffd1uFsikTe 5RH2dj1GjqBdMOHzptpucLnGlMDLu20dW0v48SxB/yzhmyGqyYNSx66y3f1FhfeVJBGbDjWUmeJ GMoSpDGIjQ2QaBEesqKTD9iJlN0nm6Vp+IKQ/pSD6E7n61QA7QqaUvgRfsd8nmyFga1xE= X-Received: by 2002:a05:6808:309a:b0:4b2:8dbf:771 with SMTP id 5614622812f47-4c31d65af5dmr8802662b6e.10.1789237969836; Sat, 12 Sep 2026 11:32:49 -0700 (PDT) Received: from [192.168.18.164] ([2600:8804:5716:d800::b712]) by smtp.gmail.com with ESMTPSA id 5614622812f47-4c330dac382sm5738229b6e.6.2026.09.12.11.32.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 12 Sep 2026 11:32:48 -0700 (PDT) From: Ryan Brue Date: Sat, 12 Sep 2026 13:32:40 -0500 Subject: [PATCH] clk: mediatek: mt8173-mfgtop: do not use the clk API from power_on Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260912-mfgtop-no-clk-api-power-on-v1-1-def157ad1277@gmail.com> X-B4-Tracking: v=1; b=H4sIAAAAAAAC/yXMSw6CMBAA0KuQWTtJacVEr2JcDHWA8dNpWhQSw t2tsHybt0DmJJzhUi2Q+CtZNBTUhwr8QKFnlHsxWGNP5lxbfHf9qBGDon89kaJg1IkTakBq2JC jo2udgxLExJ3MW3697c6f9sF+/I+wrj8G4Qv0fgAAAA== X-Change-ID: 20260912-mfgtop-no-clk-api-power-on-a5e0a3a43b33 To: Stephen Boyd , Brian Masney , Jerome Brunet , Matthias Brugger , AngeloGioacchino Del Regno , Chen-Yu Tsai Cc: Brian Masney , linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, Ryan Brue X-Mailer: b4 0.16.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789237967; l=5480; i=ryanbrue.dev@gmail.com; s=20260906; h=from:subject:message-id; bh=kjP5JtckQ81EhZbmB1tB2Jw41rIoGsoQz3j/P8a8WNk=; b=EoNfJiuU+dJD/9bK48PUcfIjZmE6xoozgkowDFLKya8/Wm+3V8PyJc4FDLJqz1oB/jWF+Fvz8 IZaSWfrqN5JBsqIIcVKZ1a3Zk5bsc9O+BY6mG9nN0OjhT8aFCanUqgp X-Developer-Key: i=ryanbrue.dev@gmail.com; a=ed25519; pk=KsUvVaP//v/2q+ZBuacc7cLbsyEYn+AD71Sn28oZWKo= clk_mt8173_mfgtop_power_on() calls clk_prepare_enable() on the mfg_26m gate that this same driver provides. That is a layering inversion which cannot work: clk_core_prepare() calls clk_pm_runtime_get() on the clock provider -- this driver's own device -- and genpd power transitions run at _noirq time, where runtime PM is disabled and pm_runtime_resume_and_get() returns -EACCES. Measured on mt8173 (amazon-suez) during resume from suspend-to-RAM, immediately after the secondary CPUs come back up: clk-mt8173-mfgtop 13fff000.clock-controller: 26 MHz clock enable failed: = -13 The failure is not survivable, because genpd_sync_power_on() ignores what power_on() returns and marks the domain on regardless. The clock is then left ungated-but-unprepared, and the next power_off() underflows its refcount: mfg_26m already disabled mfg_26m already unprepared WARNING: drivers/clk/clk.c:1048 at clk_core_unprepare Workqueue: pm genpd_power_off_work_fn clk_unprepare / clk_mt8173_mfgtop_power_off / _genpd_power_off Gate the bit with a direct regmap write instead. The vendor driver (mtk_mfgsys.c) also drives the four MFG CG bits with raw register writes from its power sequencing. The runtime-PM path was never affected, only the _noirq transitions of system suspend and resume. mfg_26m stays registered as a clock for any consumer that wants it; nothing currently does. Fixes: ebd0b73d2137 ("clk: mediatek: Add mt8173-mfgtop driver") Assisted-by: LLM Signed-off-by: Ryan Brue --- drivers/clk/mediatek/clk-mt8173-mfgtop.c | 39 +++++++++++++++++-----------= ---- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/drivers/clk/mediatek/clk-mt8173-mfgtop.c b/drivers/clk/mediate= k/clk-mt8173-mfgtop.c index 5669ca9954dc..fed6fa6100dc 100644 --- a/drivers/clk/mediatek/clk-mt8173-mfgtop.c +++ b/drivers/clk/mediatek/clk-mt8173-mfgtop.c @@ -30,6 +30,12 @@ static const struct mtk_gate_regs mfg_cg_regs =3D { .set_ofs =3D 0x0004, }; =20 +/* + * The 26 MHz gate, addressed directly rather than through the clk framewo= rk. + * See the comment in clk_mt8173_mfgtop_power_on(). + */ +#define MFG_CG_26M BIT(3) + #define GATE_MFG(_id, _name, _parent, _shift, _flags) \ GATE_MTK_FLAGS(_id, _name, _parent, &mfg_cg_regs, _shift, &mtk_clk_gate_o= ps_setclr, _flags) =20 @@ -46,7 +52,6 @@ struct mt8173_mfgtop_data { struct regmap *regmap; struct generic_pm_domain genpd; struct of_phandle_args parent_pd, child_pd; - struct clk *clk_26m; }; =20 /* Delay count in clock cycles */ @@ -66,12 +71,16 @@ struct mt8173_mfgtop_data { static int clk_mt8173_mfgtop_power_on(struct generic_pm_domain *domain) { struct mt8173_mfgtop_data *data =3D container_of(domain, struct mt8173_mf= gtop_data, genpd); - int ret; =20 - /* drives internal power management */ - ret =3D clk_prepare_enable(data->clk_26m); - if (ret) - return ret; + /* + * Ungate the 26 MHz clock, which drives the block's internal power + * management. This is a raw write to the gate's CG register, not + * clk_prepare_enable() on the mfg_26m gate this driver provides: that + * would call clk_pm_runtime_get() on our own device, and genpd power + * transitions run at _noirq time, where runtime PM is disabled and + * that returns -EACCES. mfg_26m stays registered for any consumer. + */ + regmap_write(data->regmap, mfg_cg_regs.clr_ofs, MFG_CG_26M); =20 /* Power on/off delays for various signals */ regmap_write(data->regmap, MFG_ACTIVE_POWER_CON0, @@ -102,8 +111,11 @@ static int clk_mt8173_mfgtop_power_off(struct generic_= pm_domain *domain) /* Magic numbers related to core switch sequence and delays */ regmap_write(data->regmap, 0xec, 0); =20 - /* drives internal power management */ - clk_disable_unprepare(data->clk_26m); + /* + * Gate the 26 MHz clock again; see power_on() for why this is a raw + * register write and not clk_disable_unprepare(). + */ + regmap_write(data->regmap, mfg_cg_regs.set_ofs, MFG_CG_26M); =20 return 0; } @@ -155,16 +167,10 @@ static int clk_mt8173_mfgtop_probe(struct platform_de= vice *pdev) goto put_pm_runtime; } =20 - data->clk_26m =3D clk_hw_get_clk(data->clk_data->hws[CLK_MFG_26M], "26m"); - if (IS_ERR(data->clk_26m)) { - ret =3D dev_err_probe(dev, PTR_ERR(data->clk_26m), "Failed to get 26 MHz= clock\n"); - goto unregister_clks; - } - ret =3D of_clk_add_hw_provider(node, of_clk_hw_onecell_get, data->clk_dat= a); if (ret) { dev_err_probe(dev, ret, "Failed to add clk OF provider\n"); - goto put_26m_clk; + goto unregister_clks; } =20 data->genpd.name =3D "mfg-top"; @@ -197,8 +203,6 @@ static int clk_mt8173_mfgtop_probe(struct platform_devi= ce *pdev) pm_genpd_remove(&data->genpd); del_clk_provider: of_clk_del_provider(node); -put_26m_clk: - clk_put(data->clk_26m); unregister_clks: mtk_clk_unregister_gates(mfg_clks, ARRAY_SIZE(mfg_clks), data->clk_data); put_pm_runtime: @@ -217,7 +221,6 @@ static void clk_mt8173_mfgtop_remove(struct platform_de= vice *pdev) of_genpd_del_provider(node); pm_genpd_remove(&data->genpd); of_clk_del_provider(node); - clk_put(data->clk_26m); mtk_clk_unregister_gates(mfg_clks, ARRAY_SIZE(mfg_clks), data->clk_data); of_node_put(data->parent_pd.np); } --- base-commit: df2908090cda368b01ff43709f51890076c56157 change-id: 20260912-mfgtop-no-clk-api-power-on-a5e0a3a43b33 Best regards, -- =20 Ryan Brue