[PATCH v2 08/15] soc: starfive: Add jh7110-hdmi-subsystem driver
Philipp Zabel
p.zabel at pengutronix.de
Thu Sep 3 00:50:35 PDT 2026
On Fr, 2026-08-28 at 15:47 +0200, Michal Wilczynski wrote:
> Add the parent driver for the monolithic JH7110 HDMI IP block.
>
> This driver binds to the starfive,jh7110-hdmi-subsystem node. It maps the
> shared register block, creates a regmap, and calls
> devm_of_platform_populate() to create its hdmi_phy and hdmi_controller
> child devices, which retrieve the shared regmap from this parent.
>
> The NoC display-bus clock and reset gate access to the whole vout register
> region, and this subsystem's PHY child is the first device there to touch
> registers. Enable the bus before populating the children; PD_VOUT is
> handled by genpd through the power-domains property.
>
> Co-developed-by: Dominique Belhachemi <db at domibel.de>
> Signed-off-by: Dominique Belhachemi <db at domibel.de>
> Signed-off-by: Michal Wilczynski <m.wilczynski at samsung.com>
> ---
> drivers/soc/Kconfig | 1 +
> drivers/soc/Makefile | 1 +
> drivers/soc/starfive/Kconfig | 27 +++++++
> drivers/soc/starfive/Makefile | 2 +
> drivers/soc/starfive/jh7110-hdmi-subsystem.c | 114 +++++++++++++++++++++++++++
> 5 files changed, 145 insertions(+)
>
[...]
> diff --git a/drivers/soc/starfive/jh7110-hdmi-subsystem.c b/drivers/soc/starfive/jh7110-hdmi-subsystem.c
> new file mode 100644
> index 0000000000000000000000000000000000000000..d893c1c29f98b072b09d261343d3317dbf4c75fe
> --- /dev/null
> +++ b/drivers/soc/starfive/jh7110-hdmi-subsystem.c
> @@ -0,0 +1,114 @@
[...]
> +static int starfive_hdmi_subsys_probe(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + struct reset_control *bus_rst;
> + void __iomem *regs;
> + struct regmap *regmap;
> + struct clk *bus_clk;
> + int ret;
> +
> + /*
> + * The NoC display-bus clock and reset gate access to the whole vout
> + * register region, and this subsystem's PHY child is the first device in
> + * that region to touch registers. Bring the bus up here before
> + * populating the children; PD_VOUT is powered on by genpd through the
> + * power-domains property.
> + */
> + bus_clk = devm_clk_get(dev, NULL);
> + if (IS_ERR(bus_clk))
> + return dev_err_probe(dev, PTR_ERR(bus_clk),
> + "Failed to get NoC bus clock\n");
> +
> + ret = clk_prepare_enable(bus_clk);
> + if (ret)
> + return dev_err_probe(dev, ret, "Failed to enable NoC bus clock\n");
> +
> + ret = devm_add_action_or_reset(dev, starfive_hdmi_subsys_clk_disable, bus_clk);
> + if (ret)
> + return ret;
You can simplify this with devm_clk_get_enabled().
> + bus_rst = devm_reset_control_get_exclusive(dev, NULL);
> + if (IS_ERR(bus_rst))
> + return dev_err_probe(dev, PTR_ERR(bus_rst),
> + "Failed to get NoC bus reset\n");
> +
> + ret = reset_control_deassert(bus_rst);
> + if (ret)
> + return dev_err_probe(dev, ret, "Failed to deassert NoC bus reset\n");
> +
> + ret = devm_add_action_or_reset(dev, starfive_hdmi_subsys_rst_assert, bus_rst);
> + if (ret)
> + return ret;
You can simplify this with
devm_reset_control_get_exclusive_deasserted().
regards
Philipp
More information about the linux-phy
mailing list