From: Felipe Balbi <balbi@ti.com>
To: Tony Lindgren <tony@atomide.com>
Cc: Linux OMAP Mailing List <linux-omap@vger.kernel.org>,
Felipe Balbi <balbi@ti.com>
Subject: [PATCH 12/27] cbus: tahvo: give it an irq_chip
Date: Thu, 13 Oct 2011 11:34:47 +0300 [thread overview]
Message-ID: <1318494902-13093-12-git-send-email-balbi@ti.com> (raw)
In-Reply-To: <1318494902-13093-1-git-send-email-balbi@ti.com>
tahvo also has IRQs to demux to its children,
so lets give it a struct irq_chip so that child
drivers can use standard request_threaded_irq().
This is still an unused irq_chip, later patches
will come to make proper use of it.
Signed-off-by: Felipe Balbi <balbi@ti.com>
---
drivers/cbus/tahvo.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 120 insertions(+), 8 deletions(-)
diff --git a/drivers/cbus/tahvo.c b/drivers/cbus/tahvo.c
index a538f13..3aaf0eb 100644
--- a/drivers/cbus/tahvo.c
+++ b/drivers/cbus/tahvo.c
@@ -44,8 +44,17 @@ struct tahvo {
struct mutex mutex;
struct device *dev;
- unsigned int is_betty;
- unsigned int wide_backlight;
+ int irq_base;
+ int irq_end;
+ int irq;
+
+ int ack;
+ int mask;
+
+ unsigned int wide_backlight:1;
+ unsigned int mask_pending:1;
+ unsigned int ack_pending:1;
+ unsigned int is_betty:1;
};
static struct tahvo *the_tahvo;
@@ -300,6 +309,94 @@ void tahvo_free_irq(int id)
}
EXPORT_SYMBOL(tahvo_free_irq);
+/* -------------------------------------------------------------------------- */
+
+static void tahvo_irq_bus_lock(struct irq_data *data)
+{
+ struct tahvo *tahvo = irq_data_get_irq_chip_data(data);
+
+ mutex_lock(&tahvo->mutex);
+}
+
+static void tahvo_irq_bus_sync_unlock(struct irq_data *data)
+{
+ struct tahvo *tahvo = irq_data_get_irq_chip_data(data);
+
+ if (tahvo->mask_pending) {
+ __tahvo_write_reg(tahvo, TAHVO_REG_IMR, tahvo->mask);
+ tahvo->mask_pending = false;
+ }
+
+ if (tahvo->ack_pending) {
+ __tahvo_write_reg(tahvo, TAHVO_REG_IDR, tahvo->ack);
+ tahvo->ack_pending = false;
+ }
+
+ mutex_unlock(&tahvo->mutex);
+}
+
+static void tahvo_irq_mask(struct irq_data *data)
+{
+ struct tahvo *tahvo = irq_data_get_irq_chip_data(data);
+ int irq = data->irq;
+
+ tahvo->mask |= (1 << (irq - tahvo->irq_base));
+ tahvo->mask_pending = true;
+}
+
+static void tahvo_irq_unmask(struct irq_data *data)
+{
+ struct tahvo *tahvo = irq_data_get_irq_chip_data(data);
+ int irq = data->irq;
+
+ tahvo->mask &= ~(1 << (irq - tahvo->irq_base));
+ tahvo->mask_pending = true;
+}
+
+static void tahvo_irq_ack(struct irq_data *data)
+{
+ struct tahvo *tahvo = irq_data_get_irq_chip_data(data);
+ int irq = data->irq;
+
+ tahvo->ack |= (1 << (irq - tahvo->irq_base));
+ tahvo->ack_pending = true;
+}
+
+static struct irq_chip tahvo_irq_chip = {
+ .name = "tahvo",
+ .irq_bus_lock = tahvo_irq_bus_lock,
+ .irq_bus_sync_unlock = tahvo_irq_bus_sync_unlock,
+ .irq_mask = tahvo_irq_mask,
+ .irq_unmask = tahvo_irq_unmask,
+ .irq_ack = tahvo_irq_ack,
+};
+
+static inline void tahvo_irq_setup(int irq)
+{
+#ifdef CONFIG_ARM
+ set_irq_flags(irq, IRQF_VALID);
+#else
+ set_irq_noprobe(irq);
+#endif
+}
+
+static void tahvo_irq_init(struct tahvo *tahvo)
+{
+ int base = tahvo->irq_base;
+ int end = tahvo->irq_end;
+ int irq;
+
+ for (irq = base; irq < end; irq++) {
+ irq_set_chip_data(irq, tahvo);
+ irq_set_chip_and_handler(irq, &tahvo_irq_chip,
+ handle_simple_irq);
+ irq_set_nested_thread(irq, 1);
+ tahvo_irq_setup(irq);
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
static int __devinit tahvo_probe(struct platform_device *pdev)
{
struct tahvo *tahvo;
@@ -315,11 +412,24 @@ static int __devinit tahvo_probe(struct platform_device *pdev)
goto err0;
}
- the_tahvo = tahvo;
+ irq = platform_get_irq(pdev, 0);
platform_set_drvdata(pdev, tahvo);
mutex_init(&tahvo->mutex);
- tahvo->dev = &pdev->dev;
+
+ ret = irq_alloc_descs(-1, 0, MAX_TAHVO_IRQ_HANDLERS, 0);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "failed to allocate IRQ descs\n");
+ goto err1;
+ }
+
+ tahvo->irq_base = ret;
+ tahvo->irq_end = ret + MAX_TAHVO_IRQ_HANDLERS;
+ tahvo->dev = &pdev->dev;
+ tahvo->irq = irq;
+ the_tahvo = tahvo;
+
+ tahvo_irq_init(tahvo);
rev = __tahvo_read_reg(tahvo, TAHVO_REG_ASICR);
@@ -337,15 +447,13 @@ static int __devinit tahvo_probe(struct platform_device *pdev)
default:
dev_err(&pdev->dev, "Tahvo/Betty chip not found");
ret = -ENODEV;
- goto err1;
+ goto err2;
}
dev_err(&pdev->dev, "%s v%d.%d found\n",
tahvo->is_betty ? "Betty" : "Tahvo",
(rev >> 4) & 0x0f, rev & 0x0f);
- irq = platform_get_irq(pdev, 0);
-
/* Mask all TAHVO interrupts */
__tahvo_write_reg(tahvo, TAHVO_REG_IMR, 0xffff);
@@ -354,11 +462,14 @@ static int __devinit tahvo_probe(struct platform_device *pdev)
"tahvo", tahvo);
if (ret < 0) {
dev_err(&pdev->dev, "Unable to register IRQ handler\n");
- goto err1;
+ goto err2;
}
return 0;
+err2:
+ irq_free_descs(tahvo->irq_base, MAX_TAHVO_IRQ_HANDLERS);
+
err1:
kfree(tahvo);
@@ -376,6 +487,7 @@ static int __devexit tahvo_remove(struct platform_device *pdev)
/* Mask all TAHVO interrupts */
__tahvo_write_reg(tahvo, TAHVO_REG_IMR, 0xffff);
free_irq(irq, 0);
+ irq_free_descs(tahvo->irq_base, MAX_TAHVO_IRQ_HANDLERS);
kfree(tahvo);
the_tahvo = NULL;
--
1.7.6.396.ge0613
next prev parent reply other threads:[~2011-10-13 8:35 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-13 8:34 [PATCH 01/27] cbus: tahvo: convert spinlock into mutex Felipe Balbi
2011-10-13 8:34 ` [PATCH 02/27] cbus: tahvo: move to __devinit/__devexit sections Felipe Balbi
2011-10-13 8:34 ` [PATCH 03/27] cbus: tahvo: a switch looks better Felipe Balbi
2011-10-13 8:34 ` [PATCH 04/27] cbus: tahvo: don't go over 80 columns Felipe Balbi
2011-10-13 8:34 ` [PATCH 05/27] cbus: tahvo: drop the tasklet Felipe Balbi
2011-10-13 8:34 ` [PATCH 06/27] cbus: retu: set IRQF_ONESHOT flag Felipe Balbi
2011-10-13 8:34 ` [PATCH 07/27] cbus: tahvo: git it a context structure Felipe Balbi
2011-10-13 8:34 ` [PATCH 08/27] cbus: tahvo: pass tahvo to IRQ handler Felipe Balbi
2011-10-13 8:34 ` [PATCH 09/27] cbus: tahvo: introduce __tahvo_(read/write)_reg Felipe Balbi
2011-10-13 8:34 ` [PATCH 10/27] cbus: tahvo: drop some unneded defines Felipe Balbi
2011-10-13 8:34 ` [PATCH 11/27] cbus: retu: IRQ demux optimization Felipe Balbi
2011-10-13 8:34 ` Felipe Balbi [this message]
2011-10-13 8:34 ` [PATCH 13/27] cbus: tahvo: start using irq_chip Felipe Balbi
2011-10-13 8:34 ` [PATCH 14/27] cbus: tahvo: usb: fix up to use threaded irqs Felipe Balbi
2011-10-13 8:34 ` [PATCH 15/27] cbus: tahvo drop the legacy interfaces Felipe Balbi
2011-10-13 8:34 ` [PATCH 16/27] cbus: tahvo: usb: drop unused variable Felipe Balbi
2011-10-13 8:34 ` [PATCH 17/27] cbus: tahvo: no need to mask interrupts on exit Felipe Balbi
2011-10-13 8:34 ` [PATCH 18/27] cbus: tahvo: drop the get_status hack Felipe Balbi
2011-10-13 8:34 ` [PATCH 19/27] cbus: tahvo: drop more unused interfaces Felipe Balbi
2011-10-13 8:34 ` [PATCH 20/27] cbus: tahvo: pass child device pointer Felipe Balbi
2011-10-13 8:34 ` [PATCH 21/27] cbus: tahvo: drop backlight interfaces Felipe Balbi
2011-10-13 8:34 ` [PATCH 22/27] cbus: tahvo: drop static global pointer Felipe Balbi
2011-10-13 8:34 ` [PATCH 23/27] cbus: tahvo: prepare for children without IRQ Felipe Balbi
2011-10-13 8:34 ` [PATCH 24/27] cbus: tahvo: allocate tahvo-pwm child Felipe Balbi
2011-10-13 8:35 ` [PATCH 25/27] cbus: fix compile issue on tahvo and retu Felipe Balbi
2011-10-13 8:35 ` [PATCH 26/27] cbus: use platform_driver_register " Felipe Balbi
2011-10-13 8:35 ` [PATCH 27/27] cbus: mark dependencies for ARCH_OMAP Felipe Balbi
2011-10-17 17:20 ` [PATCH 01/27] cbus: tahvo: convert spinlock into mutex Tony Lindgren
2011-10-17 18:04 ` Felipe Balbi
2011-10-17 18:19 ` Tony Lindgren
2011-10-17 18:26 ` Felipe Balbi
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=1318494902-13093-12-git-send-email-balbi@ti.com \
--to=balbi@ti.com \
--cc=linux-omap@vger.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