Re: [PATCH] drm/mediatek: mtk_hdmi_common: take i2c adapter module reference

CK Hu (胡俊光) <[email protected]>
Newsgroups org.infradead.lists.linux-mediatek,org.freedesktop.lists.dri-devel,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On Thu, 2026-07-16 at 15:21 +0200, Johan Hovold wrote:
> The i2c subsystem currently blocks during adapter deregistration
> whenever there are consumers holding a reference.
> 
> Switch to using of_get_i2c_adapter_by_node() which also takes a
> reference to the adapter module so that an attempt to unload the module
> while in use fails gracefully instead of blocking uninterruptibly.

Reviewed-by: CK Hu <[email protected]>

> 
> Signed-off-by: Johan Hovold <[email protected]>
> ---
>  drivers/gpu/drm/mediatek/mtk_hdmi_common.c | 11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi_common.c b/drivers/gpu/drm/mediatek/mtk_hdmi_common.c
> index a049489daa2d..042b98e5a519 100644
> --- a/drivers/gpu/drm/mediatek/mtk_hdmi_common.c
> +++ b/drivers/gpu/drm/mediatek/mtk_hdmi_common.c
> @@ -290,6 +290,13 @@ static int mtk_hdmi_get_cec_dev(struct mtk_hdmi *hdmi, struct device *dev, struc
>  	return 0;
>  }
>  
> +static void mtk_hdmi_put_adapter(void *_adap)
> +{
> +	struct i2c_adapter *adap = _adap;
> +
> +	i2c_put_adapter(adap);
> +}
> +
>  static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi, struct platform_device *pdev,
>  				   const char * const *clk_names, size_t num_clocks)
>  {
> @@ -328,12 +335,12 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi, struct platform_device
>  	if (!i2c_np)
>  		return dev_err_probe(dev, -EINVAL, "No ddc-i2c-bus in connector\n");
>  
> -	hdmi->ddc_adpt = of_find_i2c_adapter_by_node(i2c_np);
> +	hdmi->ddc_adpt = of_get_i2c_adapter_by_node(i2c_np);
>  	of_node_put(i2c_np);
>  	if (!hdmi->ddc_adpt)
>  		return dev_err_probe(dev, -EPROBE_DEFER, "Failed to get ddc i2c adapter by node\n");
>  
> -	ret = devm_add_action_or_reset(dev, mtk_hdmi_put_device, &hdmi->ddc_adpt->dev);
> +	ret = devm_add_action_or_reset(dev, mtk_hdmi_put_adapter, hdmi->ddc_adpt);
>  	if (ret)
>  		return ret;
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.