All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 01/17] drm/tegra: dc: Add powergate support
@ 2014-11-03  9:27 Thierry Reding
  2014-11-03  9:27 ` [PATCH 02/17] drm/tegra: Do not enable output on .mode_set() Thierry Reding
                   ` (16 more replies)
  0 siblings, 17 replies; 38+ messages in thread
From: Thierry Reding @ 2014-11-03  9:27 UTC (permalink / raw)
  To: Thierry Reding; +Cc: dri-devel

From: Thierry Reding <treding@nvidia.com>

Both display controllers are in their own power partition. Currently the
driver relies on the assumption that these partitions are on (which is
the hardware default). However some bootloaders may disable them, so the
driver must make sure to turn them back on to avoid hangs.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 drivers/gpu/drm/tegra/dc.c  | 45 ++++++++++++++++++++++++++++++++++++++++++---
 drivers/gpu/drm/tegra/drm.h |  1 +
 2 files changed, 43 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c
index 6553fd238685..4a015232e2e8 100644
--- a/drivers/gpu/drm/tegra/dc.c
+++ b/drivers/gpu/drm/tegra/dc.c
@@ -11,6 +11,8 @@
 #include <linux/debugfs.h>
 #include <linux/reset.h>
 
+#include <soc/tegra/pmc.h>
+
 #include "dc.h"
 #include "drm.h"
 #include "gem.h"
@@ -20,6 +22,7 @@ struct tegra_dc_soc_info {
 	bool supports_cursor;
 	bool supports_block_linear;
 	unsigned int pitch_align;
+	bool has_powergate;
 };
 
 struct tegra_plane {
@@ -1357,6 +1360,7 @@ static const struct tegra_dc_soc_info tegra20_dc_soc_info = {
 	.supports_cursor = false,
 	.supports_block_linear = false,
 	.pitch_align = 8,
+	.has_powergate = false,
 };
 
 static const struct tegra_dc_soc_info tegra30_dc_soc_info = {
@@ -1364,6 +1368,7 @@ static const struct tegra_dc_soc_info tegra30_dc_soc_info = {
 	.supports_cursor = false,
 	.supports_block_linear = false,
 	.pitch_align = 8,
+	.has_powergate = false,
 };
 
 static const struct tegra_dc_soc_info tegra114_dc_soc_info = {
@@ -1371,6 +1376,7 @@ static const struct tegra_dc_soc_info tegra114_dc_soc_info = {
 	.supports_cursor = false,
 	.supports_block_linear = false,
 	.pitch_align = 64,
+	.has_powergate = true,
 };
 
 static const struct tegra_dc_soc_info tegra124_dc_soc_info = {
@@ -1378,6 +1384,7 @@ static const struct tegra_dc_soc_info tegra124_dc_soc_info = {
 	.supports_cursor = true,
 	.supports_block_linear = true,
 	.pitch_align = 64,
+	.has_powergate = true,
 };
 
 static const struct of_device_id tegra_dc_of_match[] = {
@@ -1385,6 +1392,9 @@ static const struct of_device_id tegra_dc_of_match[] = {
 		.compatible = "nvidia,tegra124-dc",
 		.data = &tegra124_dc_soc_info,
 	}, {
+		.compatible = "nvidia,tegra114-dc",
+		.data = &tegra114_dc_soc_info,
+	}, {
 		.compatible = "nvidia,tegra30-dc",
 		.data = &tegra30_dc_soc_info,
 	}, {
@@ -1467,9 +1477,34 @@ static int tegra_dc_probe(struct platform_device *pdev)
 		return PTR_ERR(dc->rst);
 	}
 
-	err = clk_prepare_enable(dc->clk);
-	if (err < 0)
-		return err;
+	if (dc->soc->has_powergate) {
+		if (dc->pipe == 0)
+			dc->powergate = TEGRA_POWERGATE_DIS;
+		else
+			dc->powergate = TEGRA_POWERGATE_DISB;
+
+		err = tegra_powergate_sequence_power_up(dc->powergate, dc->clk,
+							dc->rst);
+		if (err < 0) {
+			dev_err(&pdev->dev, "failed to power partition: %d\n",
+				err);
+			return err;
+		}
+	} else {
+		err = clk_prepare_enable(dc->clk);
+		if (err < 0) {
+			dev_err(&pdev->dev, "failed to enable clock: %d\n",
+				err);
+			return err;
+		}
+
+		err = reset_control_deassert(dc->rst);
+		if (err < 0) {
+			dev_err(&pdev->dev, "failed to deassert reset: %d\n",
+				err);
+			return err;
+		}
+	}
 
 	regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	dc->regs = devm_ioremap_resource(&pdev->dev, regs);
@@ -1523,6 +1558,10 @@ static int tegra_dc_remove(struct platform_device *pdev)
 	}
 
 	reset_control_assert(dc->rst);
+
+	if (dc->soc->has_powergate)
+		tegra_powergate_power_off(dc->powergate);
+
 	clk_disable_unprepare(dc->clk);
 
 	return 0;
diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
index e89c70fa82d5..b994c017971d 100644
--- a/drivers/gpu/drm/tegra/drm.h
+++ b/drivers/gpu/drm/tegra/drm.h
@@ -101,6 +101,7 @@ struct tegra_dc {
 	spinlock_t lock;
 
 	struct drm_crtc base;
+	int powergate;
 	int pipe;
 
 	struct clk *clk;
-- 
2.1.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 38+ messages in thread

end of thread, other threads:[~2014-11-04 16:38 UTC | newest]

Thread overview: 38+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-11-03  9:27 [PATCH 01/17] drm/tegra: dc: Add powergate support Thierry Reding
2014-11-03  9:27 ` [PATCH 02/17] drm/tegra: Do not enable output on .mode_set() Thierry Reding
2014-11-03 17:18   ` Sean Paul
2014-11-04 14:50     ` Thierry Reding
2014-11-04 15:11       ` Sean Paul
2014-11-04 15:26         ` Thierry Reding
2014-11-04 16:38           ` Daniel Vetter
2014-11-03  9:27 ` [PATCH 03/17] drm/tegra: dsi: Make FIFO depths host parameters Thierry Reding
2014-11-03 17:20   ` Sean Paul
2014-11-04 15:45     ` Thierry Reding
2014-11-03  9:27 ` [PATCH v2 04/17] drm/tegra: dsi: Add ganged mode support Thierry Reding
2014-11-03 18:30   ` Sean Paul
2014-11-04 15:49     ` Thierry Reding
2014-11-03  9:27 ` [PATCH 05/17] drm/tegra: dsi: Set up PHY_TIMING & BTA_TIMING registers earlier Thierry Reding
2014-11-03  9:27 ` [PATCH 06/17] drm/tegra: dc: Add missing call to drm_vblank_on() Thierry Reding
2014-11-03 18:45   ` Sean Paul
2014-11-03 18:50     ` Daniel Vetter
2014-11-04 14:08     ` Thierry Reding
2014-11-04  4:21   ` Alexandre Courbot
2014-11-03  9:27 ` [PATCH 07/17] drm/tegra: gem: Extract tegra_bo_alloc_object() Thierry Reding
2014-11-03  9:27 ` [PATCH 08/17] drm/tegra: gem: Cleanup tegra_bo_create_with_handle() Thierry Reding
2014-11-03  9:27 ` [PATCH 09/17] drm/tegra: gem: Remove redundant drm_gem_free_mmap_offset() Thierry Reding
2014-11-03  9:27 ` [PATCH 10/17] drm/tegra: gem: Use dma_mmap_writecombine() Thierry Reding
2014-11-03  9:27 ` [PATCH v5 11/17] drm/tegra: Add IOMMU support Thierry Reding
2014-11-03  9:27 ` [PATCH 12/17] drm/tegra: dc: Factor out DC, window and cursor commit Thierry Reding
2014-11-03  9:27 ` [PATCH 13/17] drm/tegra: dc: Registers are 32 bits wide Thierry Reding
2014-11-03  9:27 ` [PATCH 14/17] drm/tegra: dc: Universal plane support Thierry Reding
2014-11-03  9:27 ` [PATCH 15/17] drm/tegra: Fix potential bug on driver unload Thierry Reding
2014-11-04 10:59   ` Andrzej Hajda
2014-11-04 12:30     ` Thierry Reding
2014-11-03  9:27 ` [PATCH 16/17] drm/tegra: gem: dumb: pitch and size are outputs Thierry Reding
2014-11-03  9:51   ` Daniel Vetter
2014-11-03 10:12     ` Thierry Reding
2014-11-03  9:27 ` [PATCH 17/17] drm/tegra: fb: Do not destroy framebuffer Thierry Reding
2014-11-03  9:53   ` Daniel Vetter
2014-11-04 16:08     ` Thierry Reding
2014-11-03 17:15 ` [PATCH 01/17] drm/tegra: dc: Add powergate support Sean Paul
2014-11-04 12:34   ` Thierry Reding

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.