drm/exynos: hdmi: make 'hdmi-en' regulator optional and keep it enabled
authorMarek Szyprowski <m.szyprowski@samsung.com>
Tue, 1 Jul 2014 08:10:06 +0000 (10:10 +0200)
committerInki Dae <daeinki@gmail.com>
Sun, 3 Aug 2014 07:52:13 +0000 (16:52 +0900)
HDMI_EN regulator is additional regulator for providing voltage source
for DCC lines available on HDMI connector. When there is no power
provided for DDC epprom, some TV-sets do not pulls up HPD (hot plug
detect) line, what causes HDMI block to stay turned off. This patch
enables HDMI_EN regulator (if available) on driver probe and keep it
enabled all the time to let TV-set correctly signal HPD event.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/gpu/drm/exynos/exynos_hdmi.c

index 738f2d7..9ec787f 100644 (file)
@@ -84,6 +84,7 @@ struct hdmi_resources {
        struct clk                      *sclk_hdmiphy;
        struct clk                      *mout_hdmi;
        struct regulator_bulk_data      *regul_bulk;
+       struct regulator                *reg_hdmi_en;
        int                             regul_count;
 };
 
@@ -2167,7 +2168,6 @@ static int hdmi_resources_init(struct hdmi_context *hdata)
        struct device *dev = hdata->dev;
        struct hdmi_resources *res = &hdata->res;
        static char *supply[] = {
-               "hdmi-en",
                "vdd",
                "vdd_osc",
                "vdd_pll",
@@ -2227,6 +2227,20 @@ static int hdmi_resources_init(struct hdmi_context *hdata)
        }
        res->regul_count = ARRAY_SIZE(supply);
 
+       res->reg_hdmi_en = devm_regulator_get(dev, "hdmi-en");
+       if (IS_ERR(res->reg_hdmi_en) && PTR_ERR(res->reg_hdmi_en) != -ENOENT) {
+               DRM_ERROR("failed to get hdmi-en regulator\n");
+               return PTR_ERR(res->reg_hdmi_en);
+       }
+       if (!IS_ERR(res->reg_hdmi_en)) {
+               ret = regulator_enable(res->reg_hdmi_en);
+               if (ret) {
+                       DRM_ERROR("failed to enable hdmi-en regulator\n");
+                       return ret;
+               }
+       } else
+               res->reg_hdmi_en = NULL;
+
        return ret;
 fail:
        DRM_ERROR("HDMI resource init - failed\n");
@@ -2493,6 +2507,9 @@ static int hdmi_remove(struct platform_device *pdev)
 
        cancel_delayed_work_sync(&hdata->hotplug_work);
 
+       if (hdata->res.reg_hdmi_en)
+               regulator_disable(hdata->res.reg_hdmi_en);
+
        put_device(&hdata->hdmiphy_port->dev);
        put_device(&hdata->ddc_adpt->dev);