|
@@ -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 @@ err_sysfs:
|
|
|
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)
|