diff options
Diffstat (limited to 'drivers/video/tegra/dc/dc.c')
-rw-r--r-- | drivers/video/tegra/dc/dc.c | 19 |
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; |