mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-26 23:40:55 +07:00
drm/tegra: dsi - Implement VDD supply support
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>
This commit is contained in:
parent
bcfc7acbca
commit
3b077afb3a
@ -181,6 +181,7 @@ of the following host1x client modules:
|
|||||||
See ../reset/reset.txt for details.
|
See ../reset/reset.txt for details.
|
||||||
- reset-names: Must include the following entries:
|
- reset-names: Must include the following entries:
|
||||||
- dsi
|
- dsi
|
||||||
|
- avdd-dsi-supply: phandle of a supply that powers the DSI controller
|
||||||
- nvidia,mipi-calibrate: Should contain a phandle and a specifier specifying
|
- 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
|
which pads are used by this DSI output and need to be calibrated. See also
|
||||||
../mipi/nvidia,tegra114-mipi.txt.
|
../mipi/nvidia,tegra114-mipi.txt.
|
||||||
|
@ -14,6 +14,8 @@
|
|||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/reset.h>
|
#include <linux/reset.h>
|
||||||
|
|
||||||
|
#include <linux/regulator/consumer.h>
|
||||||
|
|
||||||
#include <drm/drm_mipi_dsi.h>
|
#include <drm/drm_mipi_dsi.h>
|
||||||
#include <drm/drm_panel.h>
|
#include <drm/drm_panel.h>
|
||||||
|
|
||||||
@ -48,6 +50,8 @@ struct tegra_dsi {
|
|||||||
|
|
||||||
struct tegra_mipi_device *mipi;
|
struct tegra_mipi_device *mipi;
|
||||||
struct mipi_dsi_host host;
|
struct mipi_dsi_host host;
|
||||||
|
|
||||||
|
struct regulator *vdd;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct tegra_dsi *
|
static inline struct tegra_dsi *
|
||||||
@ -821,6 +825,18 @@ static int tegra_dsi_probe(struct platform_device *pdev)
|
|||||||
return err;
|
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);
|
err = tegra_dsi_setup_clocks(dsi);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
dev_err(&pdev->dev, "cannot setup clocks\n");
|
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);
|
mipi_dsi_host_unregister(&dsi->host);
|
||||||
tegra_mipi_free(dsi->mipi);
|
tegra_mipi_free(dsi->mipi);
|
||||||
|
|
||||||
|
regulator_disable(dsi->vdd);
|
||||||
clk_disable_unprepare(dsi->clk_parent);
|
clk_disable_unprepare(dsi->clk_parent);
|
||||||
clk_disable_unprepare(dsi->clk_lp);
|
clk_disable_unprepare(dsi->clk_lp);
|
||||||
clk_disable_unprepare(dsi->clk);
|
clk_disable_unprepare(dsi->clk);
|
||||||
|
Loading…
Reference in New Issue
Block a user