@@ -2407,7 +2407,8 @@ static int hdmi_probe(struct platform_device *pdev)
}
out_get_ddc_adpt:
- hdata->ddc_adpt = of_find_i2c_adapter_by_node(ddc_node);
+ hdata->ddc_adpt = of_get_i2c_adapter_by_node(ddc_node);
+ of_node_put(ddc_node);
if (!hdata->ddc_adpt) {
DRM_ERROR("Failed to get ddc i2c adapter by node\n");
return -EPROBE_DEFER;
@@ -2485,7 +2486,7 @@ err_hdmiphy:
if (hdata->hdmiphy_port)
put_device(&hdata->hdmiphy_port->dev);
err_ddc:
- put_device(&hdata->ddc_adpt->dev);
+ i2c_put_adapter(hdata->ddc_adpt);
return ret;
}
@@ -2501,7 +2502,7 @@ static int hdmi_remove(struct platform_device *pdev)
if (hdata->hdmiphy_port)
put_device(&hdata->hdmiphy_port->dev);
- put_device(&hdata->ddc_adpt->dev);
+ i2c_put_adapter(hdata->ddc_adpt);
pm_runtime_disable(&pdev->dev);
component_del(&pdev->dev, &hdmi_component_ops);
This change is needed to properly lock I2C bus driver, which serves DDC. On release of_get_i2c_adapter_by_node() requires i2c_put_adapter() call, which replaces put_device(). By the way added of_node_put(ddc_node) to eliminate memory leak, if OF_DYNAMIC is enabled. Signed-off-by: Vladimir Zapolskiy <vladimir_zapolskiy@mentor.com> --- drivers/gpu/drm/exynos/exynos_hdmi.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)