drm/tegra: dsi - Implement VDD supply support
authorThierry Reding <treding@nvidia.com>
Fri, 14 Mar 2014 13:07:50 +0000 (14:07 +0100)
committerThierry Reding <treding@nvidia.com>
Thu, 5 Jun 2014 21:09:28 +0000 (23:09 +0200)
The DSI controllers are powered by a (typically 1.2V) regulator. Usually
this is always on, so there was no need to support enabling or disabling
it thus far. But in order not to consume any power when DSI is inactive,
give the driver a chance to enable or disable the supply as needed.

Signed-off-by: Thierry Reding <treding@nvidia.com>
Documentation/devicetree/bindings/gpu/nvidia,tegra20-host1x.txt
drivers/gpu/drm/tegra/dsi.c

index f13a6b8263d38fbcd432423db5cfa23c9eb6de99..b48f4ef31d937ff8c4944e379d55357045653f02 100644 (file)
@@ -181,6 +181,7 @@ of the following host1x client modules:
     See ../reset/reset.txt for details.
   - reset-names: Must include the following entries:
     - dsi
+  - avdd-dsi-supply: phandle of a supply that powers the DSI controller
   - nvidia,mipi-calibrate: Should contain a phandle and a specifier specifying
     which pads are used by this DSI output and need to be calibrated. See also
     ../mipi/nvidia,tegra114-mipi.txt.
index 5e2bd843dbe23d87b821b74cf63e8c2e74c80421..fbb13ce1ed18e783124324a467fd4d9c4f0ee2fd 100644 (file)
@@ -14,6 +14,8 @@
 #include <linux/platform_device.h>
 #include <linux/reset.h>
 
+#include <linux/regulator/consumer.h>
+
 #include <drm/drm_mipi_dsi.h>
 #include <drm/drm_panel.h>
 
@@ -48,6 +50,8 @@ struct tegra_dsi {
 
        struct tegra_mipi_device *mipi;
        struct mipi_dsi_host host;
+
+       struct regulator *vdd;
 };
 
 static inline struct tegra_dsi *
@@ -821,6 +825,18 @@ static int tegra_dsi_probe(struct platform_device *pdev)
                return err;
        }
 
+       dsi->vdd = devm_regulator_get(&pdev->dev, "avdd-dsi-csi");
+       if (IS_ERR(dsi->vdd)) {
+               dev_err(&pdev->dev, "cannot get VDD supply\n");
+               return PTR_ERR(dsi->vdd);
+       }
+
+       err = regulator_enable(dsi->vdd);
+       if (err < 0) {
+               dev_err(&pdev->dev, "cannot enable VDD supply\n");
+               return err;
+       }
+
        err = tegra_dsi_setup_clocks(dsi);
        if (err < 0) {
                dev_err(&pdev->dev, "cannot setup clocks\n");
@@ -876,6 +892,7 @@ static int tegra_dsi_remove(struct platform_device *pdev)
        mipi_dsi_host_unregister(&dsi->host);
        tegra_mipi_free(dsi->mipi);
 
+       regulator_disable(dsi->vdd);
        clk_disable_unprepare(dsi->clk_parent);
        clk_disable_unprepare(dsi->clk_lp);
        clk_disable_unprepare(dsi->clk);