From: Mark Brown <broonie@opensource.wolfsonmicro.com>
To: Samuel Ortiz <sameo@linux.intel.com>
Cc: linux-kernel@vger.kernel.org,
patches@opensource.wolfsonmicro.com,
Mark Brown <broonie@opensource.wolfsonmicro.com>
Subject: [PATCH 04/15] mfd: arizona: Allow GPIO to be specified for IRQ line
Date: Mon, 1 Apr 2013 18:28:01 +0100 [thread overview]
Message-ID: <1364837292-30191-4-git-send-email-broonie@opensource.wolfsonmicro.com> (raw)
In-Reply-To: <1364837292-30191-1-git-send-email-broonie@opensource.wolfsonmicro.com>
If a GPIO is specified for the chip IRQ line then request it. This
improves support for systems that do not put pins into input mode when
used as interrupts.
Also use this GPIO when the primary IRQ is in edge triggered mode to
detect if we have handled pending interrupts in order to improve
robustness.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
---
drivers/mfd/arizona-irq.c | 66 +++++++++++++++++++++++++++++--------
include/linux/mfd/arizona/pdata.h | 3 ++
2 files changed, 56 insertions(+), 13 deletions(-)
diff --git a/drivers/mfd/arizona-irq.c b/drivers/mfd/arizona-irq.c
index aa25468..f761cc1 100644
--- a/drivers/mfd/arizona-irq.c
+++ b/drivers/mfd/arizona-irq.c
@@ -94,6 +94,7 @@ static irqreturn_t arizona_ctrlif_err(int irq, void *data)
static irqreturn_t arizona_irq_thread(int irq, void *data)
{
struct arizona *arizona = data;
+ bool poll;
unsigned int val;
int ret;
@@ -103,20 +104,39 @@ static irqreturn_t arizona_irq_thread(int irq, void *data)
return IRQ_NONE;
}
- /* Always handle the AoD domain */
- handle_nested_irq(irq_find_mapping(arizona->virq, 0));
+ do {
+ poll = false;
+
+ /* Always handle the AoD domain */
+ handle_nested_irq(irq_find_mapping(arizona->virq, 0));
+
+ /*
+ * Check if one of the main interrupts is asserted and only
+ * check that domain if it is.
+ */
+ ret = regmap_read(arizona->regmap, ARIZONA_IRQ_PIN_STATUS,
+ &val);
+ if (ret == 0 && val & ARIZONA_IRQ1_STS) {
+ handle_nested_irq(irq_find_mapping(arizona->virq, 1));
+ } else if (ret != 0) {
+ dev_err(arizona->dev,
+ "Failed to read main IRQ status: %d\n", ret);
+ }
- /*
- * Check if one of the main interrupts is asserted and only
- * check that domain if it is.
- */
- ret = regmap_read(arizona->regmap, ARIZONA_IRQ_PIN_STATUS, &val);
- if (ret == 0 && val & ARIZONA_IRQ1_STS) {
- handle_nested_irq(irq_find_mapping(arizona->virq, 1));
- } else if (ret != 0) {
- dev_err(arizona->dev, "Failed to read main IRQ status: %d\n",
- ret);
- }
+ /*
+ * Poll the IRQ pin status to see if we're really done
+ * if the interrupt controller can't do it for us.
+ */
+ if (!arizona->pdata.irq_gpio) {
+ break;
+ } else if (arizona->pdata.irq_flags & IRQF_TRIGGER_RISING &&
+ gpio_get_value_cansleep(arizona->pdata.irq_gpio)) {
+ poll = true;
+ } else if (arizona->pdata.irq_flags & IRQF_TRIGGER_FALLING &&
+ !gpio_get_value_cansleep(arizona->pdata.irq_gpio)) {
+ poll = true;
+ }
+ } while (poll);
pm_runtime_mark_last_busy(arizona->dev);
pm_runtime_put_autosuspend(arizona->dev);
@@ -262,6 +282,26 @@ int arizona_irq_init(struct arizona *arizona)
}
}
+ /* Used to emulate edge trigger and to work around broken pinmux */
+ if (arizona->pdata.irq_gpio) {
+ if (gpio_to_irq(arizona->pdata.irq_gpio) != arizona->irq) {
+ dev_warn(arizona->dev, "IRQ %d is not GPIO %d (%d)\n",
+ arizona->irq, arizona->pdata.irq_gpio,
+ gpio_to_irq(arizona->pdata.irq_gpio));
+ arizona->irq = gpio_to_irq(arizona->pdata.irq_gpio);
+ }
+
+ ret = devm_gpio_request_one(arizona->dev,
+ arizona->pdata.irq_gpio,
+ GPIOF_IN, "arizona IRQ");
+ if (ret != 0) {
+ dev_err(arizona->dev,
+ "Failed to request IRQ GPIO %d:: %d\n",
+ arizona->pdata.irq_gpio, ret);
+ arizona->pdata.irq_gpio = 0;
+ }
+ }
+
ret = request_threaded_irq(arizona->irq, NULL, arizona_irq_thread,
flags, "arizona", arizona);
diff --git a/include/linux/mfd/arizona/pdata.h b/include/linux/mfd/arizona/pdata.h
index 84fefed..8755dd0 100644
--- a/include/linux/mfd/arizona/pdata.h
+++ b/include/linux/mfd/arizona/pdata.h
@@ -163,6 +163,9 @@ struct arizona_pdata {
/** Haptic actuator type */
unsigned int hap_act;
+
+ /** GPIO for primary IRQ (used for edge triggered emulation) */
+ int irq_gpio;
};
#endif
--
1.7.10.4
next prev parent reply other threads:[~2013-04-01 17:30 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-01 17:27 [PATCH 0/15] arizona updates for v3.10 Mark Brown
2013-04-01 17:27 ` [PATCH 01/15] mfd: arizona: Disable all wake sources by default Mark Brown
2013-04-01 17:27 ` [PATCH 02/15] mfd: arizona: Clarify error message for failed primary IRQ request Mark Brown
2013-04-01 17:28 ` [PATCH 03/15] mfd: arizona: Basic support for edge triggered IRQs Mark Brown
2013-04-01 17:28 ` Mark Brown [this message]
2013-04-01 17:28 ` [PATCH 05/15] mfd: arizona: Try to use interrupt flags from interrupt controller Mark Brown
2013-04-01 17:28 ` [PATCH 06/15] mfd: arizona: Support configuring MICBIASes into bypass mode Mark Brown
2013-04-01 17:28 ` [PATCH 07/15] mfd: wm5102: Update patch for latest evaluation Mark Brown
2013-04-01 17:28 ` [PATCH 08/15] mfd: arizona: Fully support the use of MCLK1 as the 32kHz clock source Mark Brown
2013-04-01 17:28 ` [PATCH 09/15] mfd: arizona: Unconditionally enable 32kHz clock Mark Brown
2013-04-01 17:28 ` [PATCH 10/15] mfd: wm5102: Only use the lowest three bits of device revision Mark Brown
2013-04-01 17:28 ` [PATCH 11/15] mfd: wm5102: Manually apply register patch Mark Brown
2013-04-01 17:28 ` [PATCH 12/15] mfd: arizona: Factor out register polling Mark Brown
2013-04-01 17:28 ` [PATCH 13/15] mfd: arizona: Add a hardware patch mechanism Mark Brown
2013-04-01 17:28 ` [PATCH 14/15] mfd: wm5102: Deactivate standard boot sequence Mark Brown
2013-04-01 17:28 ` [PATCH 15/15] mfd: wm5102: Update defaults to match patch Mark Brown
2013-04-03 18:04 ` [PATCH 0/15] arizona updates for v3.10 Mark Brown
2013-04-03 18:05 ` [PATCH 1/3] mfd: arizona: Hold device in reset while ramping supplies Mark Brown
2013-04-03 18:05 ` [PATCH 2/3] mfd: arizona: Wait for internal clocks to startup after reset Mark Brown
2013-04-03 18:05 ` [PATCH 3/3] mfd: wm5102: Don't wait for boot when boot sequencer is disabled Mark Brown
2013-04-08 9:25 ` [PATCH 0/15] arizona updates for v3.10 Samuel Ortiz
2013-04-08 9:38 ` Samuel Ortiz
2013-04-08 10:04 ` Mark Brown
2013-04-08 10:19 ` Mark Brown
2013-04-08 14:31 ` Samuel Ortiz
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=1364837292-30191-4-git-send-email-broonie@opensource.wolfsonmicro.com \
--to=broonie@opensource.wolfsonmicro.com \
--cc=linux-kernel@vger.kernel.org \
--cc=patches@opensource.wolfsonmicro.com \
--cc=sameo@linux.intel.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