drm/exynos: dsi: add simple runtime pm support
authorMarek Szyprowski <m.szyprowski@samsung.com>
Thu, 23 Jun 2016 12:23:40 +0000 (14:23 +0200)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Wed, 6 Jul 2016 04:03:50 +0000 (13:03 +0900)
Add simple runtime pm to let driver to control power domain. No runtime pm
callbacks are defined, because state of the driver is already handled by
the DRM core.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
[Add error routine for component_add like decon driver from probe]
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Change-Id: I77cdcf9b669c2bee45c14ba8d86f7fd1bbf8ba9c

drivers/gpu/drm/exynos/exynos_drm_dsi.c

index b1dd7ef..720bfed 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/of_graph.h>
 #include <linux/phy/phy.h>
 #include <linux/regulator/consumer.h>
+#include <linux/pm_runtime.h>
 #include <linux/component.h>
 
 #include <video/mipi_display.h>
@@ -1458,10 +1459,14 @@ static int exynos_dsi_poweron(struct exynos_dsi *dsi)
        struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
        int ret, i;
 
+       ret = pm_runtime_get_sync(dsi->dev);
+       if (ret < 0)
+               return ret;
+
        ret = regulator_bulk_enable(ARRAY_SIZE(dsi->supplies), dsi->supplies);
        if (ret < 0) {
                dev_err(dsi->dev, "cannot enable regulators %d\n", ret);
-               return ret;
+               goto err_pm;
        }
 
        for (i = 0; i < driver_data->num_clks; i++) {
@@ -1482,6 +1487,8 @@ err_clk:
        while (--i > -1)
                clk_disable_unprepare(dsi->clks[i]);
        regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies);
+err_pm:
+       pm_runtime_put(dsi->dev);
 
        return ret;
 }
@@ -1511,6 +1518,7 @@ static void exynos_dsi_poweroff(struct exynos_dsi *dsi)
        ret = regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies);
        if (ret < 0)
                dev_err(dsi->dev, "cannot disable regulators %d\n", ret);
+       pm_runtime_put(dsi->dev);
 }
 
 static int exynos_dsi_enable(struct exynos_dsi *dsi)
@@ -1950,13 +1958,24 @@ static int exynos_dsi_probe(struct platform_device *pdev)
        }
 
        platform_set_drvdata(pdev, &dsi->display);
+       pm_runtime_enable(dev);
+
+       ret = component_add(dev, &exynos_dsi_component_ops);
+       if (ret)
+               goto err_pm;
+
+       return 0;
 
-       return component_add(dev, &exynos_dsi_component_ops);
+err_pm:
+       pm_runtime_disable(dev);
+
+       return ret;
 }
 
 static int exynos_dsi_remove(struct platform_device *pdev)
 {
        component_del(&pdev->dev, &exynos_dsi_component_ops);
+       pm_runtime_disable(&pdev->dev);
 
        return 0;
 }