All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jon Hunter <jon-hunter@ti.com>
To: Linus Walleij <linus.walleij@linaro.org>,
	Grant Likely <grant.likely@secretlab.ca>,
	Santosh Shilimkar <santosh.shilimkar@ti.com>,
	Kevin Hilman <khilman@linaro.org>
Cc: device-tree <devicetree-discuss@lists.ozlabs.org>,
	linux-omap <linux-omap@vger.kernel.org>,
	linux-arm <linux-arm-kernel@lists.infradead.org>,
	Jon Hunter <jon-hunter@ti.com>, Felipe Balbi <balbi@ti.com>
Subject: [PATCH 3/5] gpio/omap: optimise interrupt service routine
Date: Thu, 4 Apr 2013 15:16:14 -0500	[thread overview]
Message-ID: <1365106576-31816-4-git-send-email-jon-hunter@ti.com> (raw)
In-Reply-To: <1365106576-31816-1-git-send-email-jon-hunter@ti.com>

The OMAP GPIO interrupt service routine is checking each bit in the
GPIO interrupt status register to see which bits are set. It is not
efficient to check every bit especially if only a few bits are set.
Therefore, instead of checking every bit use the __ffs() function,
which returns the location of the first set bit, to find all the set
bits.

This optimisation was suggested-by and developed in collaboration
with Felipe Balbi.

Cc: Felipe Balbi <balbi@ti.com>

Signed-off-by: Jon Hunter <jon-hunter@ti.com>
---
 drivers/gpio/gpio-omap.c |   14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 5af7acd..685e850 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -689,7 +689,7 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
 {
 	void __iomem *isr_reg = NULL;
 	u32 isr;
-	unsigned int i;
+	unsigned int bit;
 	struct gpio_bank *bank;
 	int unmasked = 0;
 	struct irq_chip *chip = irq_desc_get_chip(desc);
@@ -730,9 +730,9 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
 		if (!isr)
 			break;
 
-		for (i = 0; isr != 0; isr >>= 1, i++) {
-			if (!(isr & 1))
-				continue;
+		while (isr) {
+			bit = __ffs(isr);
+			isr &= ~(1 << bit);
 
 			/*
 			 * Some chips can't respond to both rising and falling
@@ -741,10 +741,10 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
 			 * to respond to the IRQ for the opposite direction.
 			 * This will be indicated in the bank toggle_mask.
 			 */
-			if (bank->toggle_mask & (1 << i))
-				_toggle_gpio_edge_triggering(bank, i);
+			if (bank->toggle_mask & (1 << bit))
+				_toggle_gpio_edge_triggering(bank, bit);
 
-			generic_handle_irq(irq_find_mapping(bank->domain, i));
+			generic_handle_irq(irq_find_mapping(bank->domain, bit));
 		}
 	}
 	/* if bank has any level sensitive GPIO pin interrupt
-- 
1.7.10.4


WARNING: multiple messages have this Message-ID (diff)
From: jon-hunter@ti.com (Jon Hunter)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 3/5] gpio/omap: optimise interrupt service routine
Date: Thu, 4 Apr 2013 15:16:14 -0500	[thread overview]
Message-ID: <1365106576-31816-4-git-send-email-jon-hunter@ti.com> (raw)
In-Reply-To: <1365106576-31816-1-git-send-email-jon-hunter@ti.com>

The OMAP GPIO interrupt service routine is checking each bit in the
GPIO interrupt status register to see which bits are set. It is not
efficient to check every bit especially if only a few bits are set.
Therefore, instead of checking every bit use the __ffs() function,
which returns the location of the first set bit, to find all the set
bits.

This optimisation was suggested-by and developed in collaboration
with Felipe Balbi.

Cc: Felipe Balbi <balbi@ti.com>

Signed-off-by: Jon Hunter <jon-hunter@ti.com>
---
 drivers/gpio/gpio-omap.c |   14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 5af7acd..685e850 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -689,7 +689,7 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
 {
 	void __iomem *isr_reg = NULL;
 	u32 isr;
-	unsigned int i;
+	unsigned int bit;
 	struct gpio_bank *bank;
 	int unmasked = 0;
 	struct irq_chip *chip = irq_desc_get_chip(desc);
@@ -730,9 +730,9 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
 		if (!isr)
 			break;
 
-		for (i = 0; isr != 0; isr >>= 1, i++) {
-			if (!(isr & 1))
-				continue;
+		while (isr) {
+			bit = __ffs(isr);
+			isr &= ~(1 << bit);
 
 			/*
 			 * Some chips can't respond to both rising and falling
@@ -741,10 +741,10 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
 			 * to respond to the IRQ for the opposite direction.
 			 * This will be indicated in the bank toggle_mask.
 			 */
-			if (bank->toggle_mask & (1 << i))
-				_toggle_gpio_edge_triggering(bank, i);
+			if (bank->toggle_mask & (1 << bit))
+				_toggle_gpio_edge_triggering(bank, bit);
 
-			generic_handle_irq(irq_find_mapping(bank->domain, i));
+			generic_handle_irq(irq_find_mapping(bank->domain, bit));
 		}
 	}
 	/* if bank has any level sensitive GPIO pin interrupt
-- 
1.7.10.4

  parent reply	other threads:[~2013-04-04 20:16 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-04-04 20:16 [PATCH 0/5] gpio/omap: 2nd batch of updates for v3.10 Jon Hunter
2013-04-04 20:16 ` Jon Hunter
2013-04-04 20:16 ` [PATCH 1/5] gpio/omap: free irq domain in probe() failure paths Jon Hunter
2013-04-04 20:16   ` Jon Hunter
2013-04-10 19:33   ` Linus Walleij
2013-04-10 19:33     ` Linus Walleij
2013-04-10 19:48     ` Jon Hunter
2013-04-10 19:48       ` Jon Hunter
2013-04-15 22:06       ` Kevin Hilman
2013-04-15 22:06         ` Kevin Hilman
2013-04-04 20:16 ` [PATCH 2/5] gpio/omap: remove extra context restores in *_runtime_resume() Jon Hunter
2013-04-04 20:16   ` Jon Hunter
2013-04-10 19:34   ` Linus Walleij
2013-04-10 19:34     ` Linus Walleij
2013-04-04 20:16 ` Jon Hunter [this message]
2013-04-04 20:16   ` [PATCH 3/5] gpio/omap: optimise interrupt service routine Jon Hunter
2013-04-05  9:19   ` Felipe Balbi
2013-04-05  9:19     ` Felipe Balbi
2013-04-10 19:37   ` Linus Walleij
2013-04-10 19:37     ` Linus Walleij
2013-04-04 20:16 ` [PATCH 4/5] gpio/omap: force restore if context loss is not detectable Jon Hunter
2013-04-04 20:16   ` Jon Hunter
2013-04-10 19:39   ` Linus Walleij
2013-04-10 19:39     ` Linus Walleij
     [not found]     ` <CACRpkdbeABuFXr0Gt6gRto3Pmo0m88AFn_xKJq14VonGg7Doww-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-04-10 19:41       ` Jon Hunter
2013-04-10 19:41         ` Jon Hunter
2013-04-10 19:44         ` Linus Walleij
2013-04-10 19:44           ` Linus Walleij
2013-04-10 19:50           ` Jon Hunter
2013-04-10 19:50             ` Jon Hunter
2013-04-10 20:47             ` Linus Walleij
2013-04-10 20:47               ` Linus Walleij
2013-04-04 20:16 ` [PATCH 5/5] ARM: dts: OMAP2+: Identify GPIO banks that are always powered Jon Hunter
2013-04-04 20:16   ` Jon Hunter
2013-04-04 20:35   ` Tony Lindgren
2013-04-04 20:35     ` Tony Lindgren
2013-04-04 21:01     ` Jon Hunter
2013-04-04 21:01       ` Jon Hunter
2013-04-04 21:08       ` Tony Lindgren
2013-04-04 21:08         ` Tony Lindgren
2013-04-05  6:35 ` [PATCH 0/5] gpio/omap: 2nd batch of updates for v3.10 Santosh Shilimkar
2013-04-05  6:35   ` Santosh Shilimkar
2013-04-05 12:18   ` Jon Hunter
2013-04-05 12:18     ` Jon Hunter
2013-04-05 17:56 ` Kevin Hilman
2013-04-05 17:56   ` Kevin Hilman

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=1365106576-31816-4-git-send-email-jon-hunter@ti.com \
    --to=jon-hunter@ti.com \
    --cc=balbi@ti.com \
    --cc=devicetree-discuss@lists.ozlabs.org \
    --cc=grant.likely@secretlab.ca \
    --cc=khilman@linaro.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=santosh.shilimkar@ti.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 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.