diff options
Diffstat (limited to 'drivers/gpu/drm/sti/sti_hdmi.c')
| -rw-r--r-- | drivers/gpu/drm/sti/sti_hdmi.c | 69 | 
1 files changed, 38 insertions, 31 deletions
| diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c index 09e29e43423e..cd501563c0cc 100644 --- a/drivers/gpu/drm/sti/sti_hdmi.c +++ b/drivers/gpu/drm/sti/sti_hdmi.c @@ -628,7 +628,8 @@ struct drm_encoder *sti_hdmi_best_encoder(struct drm_connector *connector)  	return hdmi_connector->encoder;  } -static struct drm_connector_helper_funcs sti_hdmi_connector_helper_funcs = { +static const +struct drm_connector_helper_funcs sti_hdmi_connector_helper_funcs = {  	.get_modes = sti_hdmi_connector_get_modes,  	.mode_valid = sti_hdmi_connector_mode_valid,  	.best_encoder = sti_hdmi_best_encoder, @@ -663,7 +664,7 @@ static void sti_hdmi_connector_destroy(struct drm_connector *connector)  	kfree(hdmi_connector);  } -static struct drm_connector_funcs sti_hdmi_connector_funcs = { +static const struct drm_connector_funcs sti_hdmi_connector_funcs = {  	.dpms = drm_atomic_helper_connector_dpms,  	.fill_modes = drm_helper_probe_single_connector_modes,  	.detect = sti_hdmi_connector_detect, @@ -700,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; @@ -748,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;  } @@ -794,13 +793,10 @@ static int sti_hdmi_probe(struct platform_device *pdev)  	ddc = of_parse_phandle(pdev->dev.of_node, "ddc", 0);  	if (ddc) { -		hdmi->ddc_adapt = of_find_i2c_adapter_by_node(ddc); -		if (!hdmi->ddc_adapt) { -			of_node_put(ddc); -			return -EPROBE_DEFER; -		} - +		hdmi->ddc_adapt = of_get_i2c_adapter_by_node(ddc);  		of_node_put(ddc); +		if (!hdmi->ddc_adapt) +			return -EPROBE_DEFER;  	}  	hdmi->dev = pdev->dev; @@ -809,24 +805,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 *) @@ -836,25 +837,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; @@ -867,7 +872,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"); @@ -878,16 +883,20 @@ static int sti_hdmi_probe(struct platform_device *pdev)  	platform_set_drvdata(pdev, hdmi);  	return component_add(&pdev->dev, &sti_hdmi_ops); + + release_adapter: +	i2c_put_adapter(hdmi->ddc_adapt); + +	return ret;  }  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); - +	i2c_put_adapter(hdmi->ddc_adapt);  	component_del(&pdev->dev, &sti_hdmi_ops); +  	return 0;  } @@ -901,8 +910,6 @@ struct platform_driver sti_hdmi_driver = {  	.remove = sti_hdmi_remove,  }; -module_platform_driver(sti_hdmi_driver); -  MODULE_AUTHOR("Benjamin Gaignard <benjamin.gaignard@st.com>");  MODULE_DESCRIPTION("STMicroelectronics SoC DRM driver");  MODULE_LICENSE("GPL"); |