[PATCH v6 09/18] drm/bridge: inno-hdmi: Allow the register map to come from a parent
Heiko Stuebner
heiko at sntech.de
Fri Oct 30 11:01:08 PDT 2026
Am Donnerstag, 29. Oktober 2026, 08:53:43 Mitteleuropäische Normalzeit schrieb Michal Wilczynski:
> On some SoCs the HDMI controller does not own its register window. The
> StarFive JH7110 documents one 64 KB block, u0_hdmitx, that holds both
> the controller and the PHY, so the parent device maps it and owns the
> regmap while the two children share it.
>
> Use a regmap supplied by the parent device when there is one, and keep
> mapping our own resource when there is not, so platforms that own their
> register window are unaffected.
>
> Reviewed-by: Joshua Peisach <jpeisach at ubuntu.com>
> Tested-by: Byron Stanoszek <gandalf at winds.org>
> Tested-by: OOHehir <oo.hehir at gmail.com>
> Signed-off-by: Michal Wilczynski <m.wilczynski at samsung.com>
> ---
> drivers/gpu/drm/bridge/inno-hdmi.c | 31 ++++++++++++++++++++++++++++---
> 1 file changed, 28 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/inno-hdmi.c b/drivers/gpu/drm/bridge/inno-hdmi.c
> index 222f6522844ee60ae9a07ab2dcca748dbf7403e4..a8905bf627a224d7e3918514195f1810164dc26f 100644
> --- a/drivers/gpu/drm/bridge/inno-hdmi.c
> +++ b/drivers/gpu/drm/bridge/inno-hdmi.c
> @@ -397,6 +397,7 @@ struct inno_hdmi {
> struct clk *pclk;
> struct clk *refclk;
> void __iomem *regs;
> + struct regmap *regmap;
> struct regmap *grf;
>
> struct inno_hdmi_i2c *i2c;
> @@ -470,11 +471,25 @@ static int inno_hdmi_find_phy_config(struct inno_hdmi *hdmi,
>
> static inline u8 hdmi_readb(struct inno_hdmi *hdmi, u16 offset)
> {
> + u32 val;
> +
> + if (hdmi->regmap) {
> + if (regmap_read(hdmi->regmap, offset * 4, &val))
> + return 0;
> +
> + return val;
> + }
> +
> return readl_relaxed(hdmi->regs + (offset) * 0x04);
> }
>
> static inline void hdmi_writeb(struct inno_hdmi *hdmi, u16 offset, u32 val)
> {
> + if (hdmi->regmap) {
> + regmap_write(hdmi->regmap, offset * 4, val);
> + return;
> + }
> +
> writel_relaxed(val, hdmi->regs + (offset) * 0x04);
> }
>
> @@ -1101,9 +1116,19 @@ struct inno_hdmi *inno_hdmi_probe(struct platform_device *pdev,
> hdmi->dev = dev;
> hdmi->plat_data = plat_data;
>
> - hdmi->regs = devm_platform_ioremap_resource(pdev, 0);
> - if (IS_ERR(hdmi->regs))
> - return ERR_CAST(hdmi->regs);
> + /*
> + * On platforms where the controller shares a register space with
> + * other blocks, the parent owns the regmap. Fall back to mapping
> + * our own resource where it does not.
> + */
> + if (dev->parent)
> + hdmi->regmap = dev_get_regmap(dev->parent, NULL);
> +
> + if (!hdmi->regmap) {
> + hdmi->regs = devm_platform_ioremap_resource(pdev, 0);
> + if (IS_ERR(hdmi->regs))
> + return ERR_CAST(hdmi->regs);
> + }
why can't you just also use a mmio regmap here? Because with this change
the driver now has 2 competing register interfaces and you need those
conditionals all the time.
Just convert the existing user to also use a regmap please.
Heiko
More information about the linux-arm-kernel
mailing list