From: Grygorii Strashko <grygorii.strashko@ti.com>
To: Linus Walleij <linus.walleij@linaro.org>,
Alexandre Courbot <gnurou@gmail.com>, <ssantosh@kernel.org>,
Kevin Hilman <khilman@deeprootsystems.com>, <tony@atomide.com>
Cc: Javier Martinez Canillas <javier@dowhile0.org>,
<linux-omap@vger.kernel.org>, <linux-gpio@vger.kernel.org>,
<linux-kernel@vger.kernel.org>,
Grygorii Strashko <grygorii.strashko@ti.com>
Subject: [PATCH 3/7] gpio: omap: fix omap2_set_gpio_debounce
Date: Tue, 18 Aug 2015 14:10:54 +0300 [thread overview]
Message-ID: <1439896258-26449-4-git-send-email-grygorii.strashko@ti.com> (raw)
In-Reply-To: <1439896258-26449-1-git-send-email-grygorii.strashko@ti.com>
According to TRMs:
Required input line stable =
(the value of the GPIO_DEBOUNCINGTIME[7:0].DEBOUNCETIME + 1) × 31,
where the value of the GPIO_DEBOUNCINGTIME[7:0].DEBOUNCETIME bit field
is from 0 to 255.
But now omap2_set_gpio_debounce() will calculate debounce time and
behave incorrectly in the following cases:
1) requested debounce time is !0 and <32
calculated DEBOUNCETIME = 0x1 == 62 us;
expected value of DEBOUNCETIME = 0x0 == 31us
2) requested debounce time is 0
calculated DEBOUNCETIME = 0x1 == 62 us;
expected: disable debounce and DEBOUNCETIME = 0x0
3) requested debounce time is >32 and <63
calculated DEBOUNCETIME = 0x0 and debounce will be disabled;
expected: enable debounce and DEBOUNCETIME = 0x1 == 62 us
Hence, rework omap2_set_gpio_debounce() to fix above cases:
1) introduce local variable "enable" and use it to identify
when debounce need to be enabled or disabled. Disable debounce
if requested debounce time is 0.
2) use below formula for debounce time calculation:
debounce = (DIV_ROUND_UP(debounce, 31) - 1) & 0xFF;
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
---
drivers/gpio/gpio-omap.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 03fd111..9ed5a67 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -29,6 +29,7 @@
#include <linux/platform_data/gpio-omap.h>
#define OFF_MODE 1
+#define OMAP4_GPIO_DEBOUNCINGTIME_MASK 0xFF
static LIST_HEAD(omap_gpio_list);
@@ -204,8 +205,9 @@ static inline void omap_gpio_dbck_disable(struct gpio_bank *bank)
* @offset: the gpio number on this @bank
* @debounce: debounce time to use
*
- * OMAP's debounce time is in 31us steps so we need
- * to convert and round up to the closest unit.
+ * OMAP's debounce time is in 31us steps
+ * <debounce time> = (GPIO_DEBOUNCINGTIME[7:0].DEBOUNCETIME + 1) x 31
+ * so we need to convert and round up to the closest unit.
*/
static void omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned offset,
unsigned debounce)
@@ -213,16 +215,15 @@ static void omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned offset,
void __iomem *reg;
u32 val;
u32 l;
+ bool enable = !!debounce;
if (!bank->dbck_flag)
return;
- if (debounce < 32)
- debounce = 0x01;
- else if (debounce > 7936)
- debounce = 0xff;
- else
- debounce = (debounce / 0x1f) - 1;
+ if (enable) {
+ debounce = DIV_ROUND_UP(debounce, 31) - 1;
+ debounce &= OMAP4_GPIO_DEBOUNCINGTIME_MASK;
+ }
l = BIT(offset);
@@ -233,7 +234,7 @@ static void omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned offset,
reg = bank->base + bank->regs->debounce_en;
val = readl_relaxed(reg);
- if (debounce)
+ if (enable)
val |= l;
else
val &= ~l;
--
2.5.0
next prev parent reply other threads:[~2015-08-18 11:11 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-18 11:10 [PATCH 0/7] gpio: omap: fixes and improvements Grygorii Strashko
2015-08-18 11:10 ` [PATCH 1/7] gpio: omap: remove wrong irq_domain_remove usage in probe Grygorii Strashko
2015-08-26 7:45 ` Linus Walleij
2015-08-18 11:10 ` [PATCH 2/7] gpio: omap: switch to use platform_get_irq Grygorii Strashko
2015-08-26 7:47 ` Linus Walleij
2015-08-18 11:10 ` Grygorii Strashko [this message]
2015-08-26 7:49 ` [PATCH 3/7] gpio: omap: fix omap2_set_gpio_debounce Linus Walleij
2015-08-18 11:10 ` [PATCH 4/7] gpio: omap: protect regs access in omap_gpio_irq_handler Grygorii Strashko
2015-08-26 7:50 ` Linus Walleij
2015-08-18 11:10 ` [PATCH 5/7] gpio: omap: fix clk_prepare/unprepare usage Grygorii Strashko
2015-08-26 7:52 ` Linus Walleij
2015-08-18 11:10 ` [RFC PATCH 6/7] gpio: omap: move pm runtime in irq_chip.irq_bus_lock/sync_unlock Grygorii Strashko
2015-09-24 22:28 ` Linus Walleij
2015-09-24 22:35 ` Grygorii Strashko
2015-08-18 11:10 ` [RFC PATCH 7/7] gpio: omap: convert to use generic irq handler Grygorii Strashko
2015-08-18 16:12 ` [PATCH 0/7] gpio: omap: fixes and improvements santosh shilimkar
2015-08-19 6:38 ` Tony Lindgren
2015-08-21 8:13 ` Tony Lindgren
2015-08-25 11:41 ` Grygorii Strashko
2015-08-26 16:06 ` Tony Lindgren
2015-08-26 7:53 ` Linus Walleij
2015-09-07 11:40 ` Grygorii Strashko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1439896258-26449-4-git-send-email-grygorii.strashko@ti.com \
--to=grygorii.strashko@ti.com \
--cc=gnurou@gmail.com \
--cc=javier@dowhile0.org \
--cc=khilman@deeprootsystems.com \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=ssantosh@kernel.org \
--cc=tony@atomide.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome