Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 807642d7 authored by Vladimir Zapolskiy's avatar Vladimir Zapolskiy Committed by Vincent Abriou
Browse files

drm/sti: hdmi fix i2c adapter device refcounting



The commit 53bdcf5f ("drm: sti: fix sub-components bind") moves
i2c adapter search and locking from .bind() to .probe(), however
proper error path in the modified .probe() is not implemented and
leftover of the related error path in .bind() remains. This change
fixes these issues.

Fixes: 53bdcf5f ("drm: sti: fix sub-components bind")
Signed-off-by: default avatarVladimir Zapolskiy <vladimir_zapolskiy@mentor.com>
Reviewed-by: default avatarVincent Abriou <vincent.abriou@st.com>
parent 3a36e186
Loading
Loading
Loading
Loading
+31 −18
Original line number Diff line number Diff line
@@ -701,18 +701,17 @@ static int sti_hdmi_bind(struct device *dev, struct device *master, void *data)

	encoder = sti_hdmi_find_encoder(drm_dev);
	if (!encoder)
		goto err_adapt;
		return -EINVAL;

	connector = devm_kzalloc(dev, sizeof(*connector), GFP_KERNEL);
	if (!connector)
		goto err_adapt;

		return -EINVAL;

	connector->hdmi = hdmi;

	bridge = devm_kzalloc(dev, sizeof(*bridge), GFP_KERNEL);
	if (!bridge)
		goto err_adapt;
		return -EINVAL;

	bridge->driver_private = hdmi;
	bridge->funcs = &sti_hdmi_bridge_funcs;
@@ -749,8 +748,7 @@ static int sti_hdmi_bind(struct device *dev, struct device *master, void *data)
	drm_connector_unregister(drm_connector);
err_connector:
	drm_connector_cleanup(drm_connector);
err_adapt:
	put_device(&hdmi->ddc_adapt->dev);

	return -EINVAL;
}

@@ -810,24 +808,29 @@ static int sti_hdmi_probe(struct platform_device *pdev)
	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hdmi-reg");
	if (!res) {
		DRM_ERROR("Invalid hdmi resource\n");
		return -ENOMEM;
		ret = -ENOMEM;
		goto release_adapter;
	}
	hdmi->regs = devm_ioremap_nocache(dev, res->start, resource_size(res));
	if (!hdmi->regs)
		return -ENOMEM;
	if (!hdmi->regs) {
		ret = -ENOMEM;
		goto release_adapter;
	}

	if (of_device_is_compatible(np, "st,stih416-hdmi")) {
		res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
						   "syscfg");
		if (!res) {
			DRM_ERROR("Invalid syscfg resource\n");
			return -ENOMEM;
			ret = -ENOMEM;
			goto release_adapter;
		}
		hdmi->syscfg = devm_ioremap_nocache(dev, res->start,
						    resource_size(res));
		if (!hdmi->syscfg)
			return -ENOMEM;

		if (!hdmi->syscfg) {
			ret = -ENOMEM;
			goto release_adapter;
		}
	}

	hdmi->phy_ops = (struct hdmi_phy_ops *)
@@ -837,25 +840,29 @@ static int sti_hdmi_probe(struct platform_device *pdev)
	hdmi->clk_pix = devm_clk_get(dev, "pix");
	if (IS_ERR(hdmi->clk_pix)) {
		DRM_ERROR("Cannot get hdmi_pix clock\n");
		return PTR_ERR(hdmi->clk_pix);
		ret = PTR_ERR(hdmi->clk_pix);
		goto release_adapter;
	}

	hdmi->clk_tmds = devm_clk_get(dev, "tmds");
	if (IS_ERR(hdmi->clk_tmds)) {
		DRM_ERROR("Cannot get hdmi_tmds clock\n");
		return PTR_ERR(hdmi->clk_tmds);
		ret = PTR_ERR(hdmi->clk_tmds);
		goto release_adapter;
	}

	hdmi->clk_phy = devm_clk_get(dev, "phy");
	if (IS_ERR(hdmi->clk_phy)) {
		DRM_ERROR("Cannot get hdmi_phy clock\n");
		return PTR_ERR(hdmi->clk_phy);
		ret = PTR_ERR(hdmi->clk_phy);
		goto release_adapter;
	}

	hdmi->clk_audio = devm_clk_get(dev, "audio");
	if (IS_ERR(hdmi->clk_audio)) {
		DRM_ERROR("Cannot get hdmi_audio clock\n");
		return PTR_ERR(hdmi->clk_audio);
		ret = PTR_ERR(hdmi->clk_audio);
		goto release_adapter;
	}

	hdmi->hpd = readl(hdmi->regs + HDMI_STA) & HDMI_STA_HOT_PLUG;
@@ -868,7 +875,7 @@ static int sti_hdmi_probe(struct platform_device *pdev)
			hdmi_irq_thread, IRQF_ONESHOT, dev_name(dev), hdmi);
	if (ret) {
		DRM_ERROR("Failed to register HDMI interrupt\n");
		return ret;
		goto release_adapter;
	}

	hdmi->reset = devm_reset_control_get(dev, "hdmi");
@@ -879,6 +886,12 @@ static int sti_hdmi_probe(struct platform_device *pdev)
	platform_set_drvdata(pdev, hdmi);

	return component_add(&pdev->dev, &sti_hdmi_ops);

 release_adapter:
	if (hdmi->ddc_adapt)
		put_device(&hdmi->ddc_adapt->dev);

	return ret;
}

static int sti_hdmi_remove(struct platform_device *pdev)