aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpio-omap.c
diff options
context:
space:
mode:
authorTarun Kanti DebBarma <tarun.kanti@ti.com>2011-11-23 16:33:28 -0500
committerTarun Kanti DebBarma <tarun.kanti@ti.com>2012-02-06 06:11:35 -0500
commit72f83af99838bb663f85b65386db5b875748f379 (patch)
tree612ddc67b783a82a40650acbf8a5a2e40f712307 /drivers/gpio/gpio-omap.c
parent2dc983c565e03f6f6f96c5fe7449b65d86af4dee (diff)
gpio/omap: fix debounce clock handling
The dbck_enable_mask indicates which all GPIOs within a bank have debounce enabled and dbck is enabled/disabled based upon this. But there is no mechanism to track the dbck state. In order to manage the dbck state we need additional flag and logic so that turning off/on dbck is synchronized with pm_runtime_put/get_sync calls. Signed-off-by: Tarun Kanti DebBarma <tarun.kanti@ti.com> Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Reviewed-by: Kevin Hilman <khilman@ti.com> Signed-off-by: Kevin Hilman <khilman@ti.com>
Diffstat (limited to 'drivers/gpio/gpio-omap.c')
-rw-r--r--drivers/gpio/gpio-omap.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index d483cc9f0c63..69e61aecab71 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -67,6 +67,7 @@ struct gpio_bank {
67 struct clk *dbck; 67 struct clk *dbck;
68 u32 mod_usage; 68 u32 mod_usage;
69 u32 dbck_enable_mask; 69 u32 dbck_enable_mask;
70 bool dbck_enabled;
70 struct device *dev; 71 struct device *dev;
71 bool is_mpuio; 72 bool is_mpuio;
72 bool dbck_flag; 73 bool dbck_flag;
@@ -158,6 +159,22 @@ static inline void _gpio_rmw(void __iomem *base, u32 reg, u32 mask, bool set)
158 __raw_writel(l, base + reg); 159 __raw_writel(l, base + reg);
159} 160}
160 161
162static inline void _gpio_dbck_enable(struct gpio_bank *bank)
163{
164 if (bank->dbck_enable_mask && !bank->dbck_enabled) {
165 clk_enable(bank->dbck);
166 bank->dbck_enabled = true;
167 }
168}
169
170static inline void _gpio_dbck_disable(struct gpio_bank *bank)
171{
172 if (bank->dbck_enable_mask && bank->dbck_enabled) {
173 clk_disable(bank->dbck);
174 bank->dbck_enabled = false;
175 }
176}
177
161/** 178/**
162 * _set_gpio_debounce - low level gpio debounce time 179 * _set_gpio_debounce - low level gpio debounce time
163 * @bank: the gpio bank we're acting upon 180 * @bank: the gpio bank we're acting upon
@@ -1178,6 +1195,7 @@ save_gpio_context:
1178 bank->get_context_loss_count(bank->dev); 1195 bank->get_context_loss_count(bank->dev);
1179 1196
1180 omap_gpio_save_context(bank); 1197 omap_gpio_save_context(bank);
1198 _gpio_dbck_disable(bank);
1181 spin_unlock_irqrestore(&bank->lock, flags); 1199 spin_unlock_irqrestore(&bank->lock, flags);
1182 1200
1183 return 0; 1201 return 0;
@@ -1192,6 +1210,7 @@ static int omap_gpio_runtime_resume(struct device *dev)
1192 unsigned long flags; 1210 unsigned long flags;
1193 1211
1194 spin_lock_irqsave(&bank->lock, flags); 1212 spin_lock_irqsave(&bank->lock, flags);
1213 _gpio_dbck_enable(bank);
1195 if (!bank->enabled_non_wakeup_gpios || !bank->workaround_enabled) { 1214 if (!bank->enabled_non_wakeup_gpios || !bank->workaround_enabled) {
1196 spin_unlock_irqrestore(&bank->lock, flags); 1215 spin_unlock_irqrestore(&bank->lock, flags);
1197 return 0; 1216 return 0;
@@ -1274,16 +1293,11 @@ void omap2_gpio_prepare_for_idle(int pwr_mode)
1274 struct gpio_bank *bank; 1293 struct gpio_bank *bank;
1275 1294
1276 list_for_each_entry(bank, &omap_gpio_list, node) { 1295 list_for_each_entry(bank, &omap_gpio_list, node) {
1277 int j;
1278
1279 if (!bank->mod_usage || !bank->loses_context) 1296 if (!bank->mod_usage || !bank->loses_context)
1280 continue; 1297 continue;
1281 1298
1282 bank->power_mode = pwr_mode; 1299 bank->power_mode = pwr_mode;
1283 1300
1284 for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++)
1285 clk_disable(bank->dbck);
1286
1287 pm_runtime_put_sync_suspend(bank->dev); 1301 pm_runtime_put_sync_suspend(bank->dev);
1288 } 1302 }
1289} 1303}
@@ -1293,14 +1307,9 @@ void omap2_gpio_resume_after_idle(void)
1293 struct gpio_bank *bank; 1307 struct gpio_bank *bank;
1294 1308
1295 list_for_each_entry(bank, &omap_gpio_list, node) { 1309 list_for_each_entry(bank, &omap_gpio_list, node) {
1296 int j;
1297
1298 if (!bank->mod_usage || !bank->loses_context) 1310 if (!bank->mod_usage || !bank->loses_context)
1299 continue; 1311 continue;
1300 1312
1301 for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++)
1302 clk_enable(bank->dbck);
1303
1304 pm_runtime_get_sync(bank->dev); 1313 pm_runtime_get_sync(bank->dev);
1305 } 1314 }
1306} 1315}