[PATCH v6 09/18] drm/bridge: inno-hdmi: Allow the register map to come from a parent

Michal Wilczynski m.wilczynski at samsung.com
Thu Nov 5 03:52:20 PST 2026



On 10/30/26 19:01, Heiko Stuebner wrote:
> 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.

OK. In v7 inno-hdmi will use a regmap.

Parent's where one exists, and otherwise a devm_regmap_init_mmio()
covering its own resource. hdmi_readb()/hdmi_writeb() can then drop
the conditionals.

That also switches rockchip hw from readl/writel over to regmap. I
can only build test those two so a Tested-by from anyone with the
actual hardware would be appreciated.

> 
> 
> Heiko
> 
> 
> 
> 

Best regards,
-- 
Michal Wilczynski <m.wilczynski at samsung.com>



More information about the linux-riscv mailing list