]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/gpu/drm/sti/sti_hdmi.c
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux
[linux.git] / drivers / gpu / drm / sti / sti_hdmi.c
index 09e29e43423e21e6326b54e159ed81ffc4114b86..cd501563c0cc58f83b9992e7e83e09e048dfd32a 100644 (file)
@@ -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 @@ 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;
 }
 
@@ -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");