summaryrefslogtreecommitdiff
path: root/drivers/video/tegra/dc/dc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/tegra/dc/dc.c')
-rw-r--r--drivers/video/tegra/dc/dc.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/video/tegra/dc/dc.c b/drivers/video/tegra/dc/dc.c
index c2f9dd37bb7f..f2098a1fa147 100644
--- a/drivers/video/tegra/dc/dc.c
+++ b/drivers/video/tegra/dc/dc.c
@@ -935,6 +935,25 @@ static inline void tegra_dc_create_debugfs(struct tegra_dc *dc) { };
static inline void tegra_dc_remove_debugfs(struct tegra_dc *dc) { };
#endif /* CONFIG_DEBUGFS */
+unsigned long tegra_dc_poll_register(struct tegra_dc *dc, u32 reg, u32 mask,
+ u32 exp_val, u32 poll_interval_us, u32 timeout_ms)
+{
+ unsigned long timeout_jf = jiffies + msecs_to_jiffies(timeout_ms);
+ u32 reg_val = 0;
+
+ do {
+ usleep_range(poll_interval_us, poll_interval_us << 1);
+ reg_val = tegra_dc_readl(dc, reg);
+ } while (((reg_val & mask) != exp_val) &&
+ time_after(timeout_jf, jiffies));
+
+ if ((reg_val & mask) == exp_val)
+ return 0; /* success */
+ dev_err(&dc->ndev->dev,
+ "dc_poll_register 0x%x: timeout\n", reg);
+ return jiffies - timeout_jf + 1;
+}
+
static int tegra_dc_set(struct tegra_dc *dc, int index)
{
int ret = 0;