From: Brian Masney <bmasney@redhat.com>
To: Chen-Yu Tsai <wenst@chromium.org>
Cc: Stephen Boyd <sboyd@kernel.org>,
Matthias Brugger <matthias.bgg@gmail.com>,
AngeloGioacchino Del Regno
<angelogioacchino.delregno@collabora.com>,
Alessio Belle <alessio.belle@imgtec.com>,
Luigi Santivetti <luigi.santivetti@imgtec.com>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Maxime Ripard <mripard@kernel.org>,
Thomas Zimmermann <tzimmermann@suse.de>,
Dan Carpenter <dan.carpenter@linaro.org>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
linux-clk@vger.kernel.org, devicetree@vger.kernel.org,
linux-mediatek@lists.infradead.org,
linux-arm-kernel@lists.infradead.org,
imagination@lists.freedesktop.org,
dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
Icenowy Zheng <zhengxingda@iscas.ac.cn>,
YoungJoon Lee <getfeus@gmail.com>
Subject: Re: [PATCH v3 2/5] clk: mediatek: Add mt8173-mfgtop driver
Date: Mon, 27 Jul 2026 12:16:55 -0400 [thread overview]
Message-ID: <ameEd76Flq7_eUMy@redhat.com> (raw)
In-Reply-To: <20260727091555.1023910-3-wenst@chromium.org>
Hi Chen-Yu,
On Mon, Jul 27, 2026 at 05:15:51PM +0800, Chen-Yu Tsai wrote:
> The MFG (GPU) block on the MT8173 has a small glue layer, named MFG_TOP
> in the datasheet, that contains clock gates, some power sequence signal
> delays, and other unknown registers that get toggled when the GPU is
> powered on.
>
> The clock gates are exposed as clocks provided by a clock controller,
> while the power sequencing bits are exposed as one singular power domain.
>
> Tested-by: Icenowy Zheng <zhengxingda@iscas.ac.cn>
> Signed-off-by: Chen-Yu Tsai <wenst@chromium.org>
> ---
> Changes since v2:
> - Made COMMON_CLK_MT8173_MFGTOP depend on PM
> - Needed since the driver implements PM domains using the generic PM
> domain library, which also depends on PM
> - Fixes build breakage (kernel test robot)
> - Fixed "RST_DELAY_CNT" name (Brian)
> - Dropped unused mfg_desc (Brian)
> - Added check of clk_prepare_enable()'s return value in
> clk_mt8173_mfgtop_power_on() (Brian)
> - Saved error value for return in IS_ERR(data->clk_26m) branch
> (Dan Carpenter / kernel test robot w/ smatch)
> ---
[snip]
> +static int clk_mt8173_mfgtop_probe(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + struct device_node *node = dev->of_node;
> + struct mt8173_mfgtop_data *data;
> + int ret;
> +
> + data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
> + if (!data)
> + return -ENOMEM;
> +
> + platform_set_drvdata(pdev, data);
> +
> + data->clk_data = mtk_devm_alloc_clk_data(dev, ARRAY_SIZE(mfg_clks));
> + if (!data->clk_data)
> + return -ENOMEM;
> +
> + /* MTK clock gates also uses regmap */
> + data->regmap = device_node_to_regmap(node);
> + if (IS_ERR(data->regmap))
> + return dev_err_probe(dev, PTR_ERR(data->regmap), "Failed to get regmap\n");
> +
> + data->child_pd.np = node;
> + data->child_pd.args_count = 0;
> + ret = of_parse_phandle_with_args(node, "power-domains", "#power-domain-cells", 0,
> + &data->parent_pd);
> + if (ret)
> + return dev_err_probe(dev, ret, "Failed to parse power domain\n");
> +
> + devm_pm_runtime_enable(dev);
> + /*
> + * Do a pm_runtime_resume_and_get() to workaround a possible
> + * deadlock between clk_register() and the genpd framework.
> + */
> + ret = pm_runtime_resume_and_get(dev);
> + if (ret) {
> + dev_err_probe(dev, ret, "Failed to runtime resume device\n");
> + goto put_of_node;
> + }
> +
> + ret = mtk_clk_register_gates(dev, node, mfg_clks, ARRAY_SIZE(mfg_clks),
> + data->clk_data);
> + if (ret) {
> + dev_err_probe(dev, ret, "Failed to register clock gates\n");
> + goto put_pm_runtime;
> + }
> +
> + data->clk_26m = clk_hw_get_clk(data->clk_data->hws[CLK_MFG_26M], "26m");
> + if (IS_ERR(data->clk_26m)) {
> + ret = dev_err_probe(dev, PTR_ERR(data->clk_26m), "Failed to get 26 MHz clock\n");
> + goto unregister_clks;
> + }
> +
> + ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, data->clk_data);
> + if (ret) {
> + dev_err_probe(dev, ret, "Failed to add clk OF provider\n");
> + goto put_26m_clk;
> + }
> +
> + data->genpd.name = "mfg-top";
> + data->genpd.power_on = clk_mt8173_mfgtop_power_on;
> + data->genpd.power_off = clk_mt8173_mfgtop_power_off;
> + ret = pm_genpd_init(&data->genpd, NULL, true);
> + if (ret) {
> + dev_err_probe(dev, ret, "Failed to add power domain\n");
> + goto del_clk_provider;
> + }
> +
> + ret = of_genpd_add_provider_simple(node, &data->genpd);
> + if (ret) {
> + dev_err_probe(dev, ret, "Failed to add power domain OF provider\n");
> + goto remove_pd;
> + }
> +
> + ret = of_genpd_add_subdomain(&data->parent_pd, &data->child_pd);
> + if (ret) {
> + dev_err_probe(dev, ret, "Failed to link PM domains\n");
> + goto del_pd_provider;
> + }
> +
> + pm_runtime_put(dev);
> + return 0;
> +
> +del_pd_provider:
> + of_genpd_del_provider(node);
> +remove_pd:
> + 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:
> + pm_runtime_put(dev);
> +put_of_node:
> + of_node_put(data->parent_pd.np);
> + return ret;
> +}
> +
> +static void clk_mt8173_mfgtop_remove(struct platform_device *pdev)
> +{
> + struct mt8173_mfgtop_data *data = platform_get_drvdata(pdev);
> + struct device_node *node = pdev->dev.of_node;
> +
> + of_genpd_remove_subdomain(&data->parent_pd, &data->child_pd);
> + 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);
Looking at the error labels in the probe, does the remove also need:
of_node_put(data->parent_pd.np);
Otherwise this looks good. With that fixed:
Reviewed-by: Brian Masney <bmasney@redhat.com>
next prev parent reply other threads:[~2026-07-27 16:17 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-27 9:15 [PATCH v3 0/5] powervr: MT8173 GPU support Chen-Yu Tsai
2026-07-27 9:15 ` [PATCH v3 1/5] dt-bindings: clock: mediatek: Add mt8173 mfgtop Chen-Yu Tsai
2026-07-27 11:26 ` AngeloGioacchino Del Regno
2026-07-27 9:15 ` [PATCH v3 2/5] clk: mediatek: Add mt8173-mfgtop driver Chen-Yu Tsai
2026-07-27 9:29 ` sashiko-bot
2026-07-27 11:26 ` AngeloGioacchino Del Regno
2026-07-27 16:16 ` Brian Masney [this message]
2026-07-27 9:15 ` [PATCH v3 3/5] dt-bindings: gpu: powervr-rogue: Add MediaTek MT8173 GPU Chen-Yu Tsai
2026-07-27 9:26 ` sashiko-bot
2026-07-27 9:46 ` Chen-Yu Tsai
2026-07-27 9:15 ` [PATCH v3 4/5] arm64: dts: mediatek: mt8173: Fix MFG_ASYNC power domain clock Chen-Yu Tsai
2026-07-27 9:15 ` [PATCH v3 5/5] arm64: dts: mediatek: mt8173: Add GPU device nodes Chen-Yu Tsai
2026-07-27 15:48 ` [PATCH v3 0/5] powervr: MT8173 GPU support YoungJoon Lee
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ameEd76Flq7_eUMy@redhat.com \
--to=bmasney@redhat.com \
--cc=airlied@gmail.com \
--cc=alessio.belle@imgtec.com \
--cc=angelogioacchino.delregno@collabora.com \
--cc=dan.carpenter@linaro.org \
--cc=devicetree@vger.kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=getfeus@gmail.com \
--cc=imagination@lists.freedesktop.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=luigi.santivetti@imgtec.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=matthias.bgg@gmail.com \
--cc=mripard@kernel.org \
--cc=sboyd@kernel.org \
--cc=simona@ffwll.ch \
--cc=tzimmermann@suse.de \
--cc=wenst@chromium.org \
--cc=zhengxingda@iscas.ac.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.