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 <[email protected]>
>> Tested-by: Byron Stanoszek <[email protected]>
>> Tested-by: OOHehir <[email protected]>
>> Signed-off-by: Michal Wilczynski <[email protected]>
>> ---
>>  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 <[email protected]>

Reply via email to