@@ -698,14 +698,10 @@ static int sti_hdmi_bind(struct device *dev, struct device *master, void *data)
ddc = of_parse_phandle(dev->of_node, "ddc", 0);
if (ddc) {
- hdmi->ddc_adapt = of_find_i2c_adapter_by_node(ddc);
- if (!hdmi->ddc_adapt) {
- err = -EPROBE_DEFER;
- of_node_put(ddc);
- return err;
- }
-
+ hdmi->ddc_adapt = of_get_i2c_adapter_by_node(ddc);
of_node_put(ddc);
+ if (!hdmi->ddc_adapt)
+ return -EPROBE_DEFER;
}
/* Set the drm device handle */
@@ -762,14 +758,15 @@ err_sysfs:
err_connector:
drm_connector_cleanup(drm_connector);
err_adapt:
- put_device(&hdmi->ddc_adapt->dev);
+ i2c_put_adapter(hdmi->ddc_adapt);
+
return -EINVAL;
}
static void sti_hdmi_unbind(struct device *dev,
struct device *master, void *data)
{
- /* do nothing */
+ i2c_put_adapter(hdmi->ddc_adapt);
}
static const struct component_ops sti_hdmi_ops = {
@@ -885,10 +882,8 @@ static int sti_hdmi_remove(struct platform_device *pdev)
{
struct sti_hdmi *hdmi = dev_get_drvdata(&pdev->dev);
- if (hdmi->ddc_adapt)
- put_device(&hdmi->ddc_adapt->dev);
-
component_del(&pdev->dev, &sti_hdmi_ops);
+
return 0;
}
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. Note, that prior to the change put_device() coupled with of_find_i2c_adapter_by_node() was incorrectly placed to sti_hdmi_remove() instead of sti_hdmi_unbind(). Signed-off-by: Vladimir Zapolskiy <vladimir_zapolskiy@mentor.com> --- drivers/gpu/drm/sti/sti_hdmi.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-)