From: Holger Dengler <dengler@linutronix.de>
To: linux-kernel@vger.kernel.org
Cc: Peter Mahler <mahler@xkrug.com>,
Juergen Bubeck <bubeck@xkrug.com>,
Benedikt Spranger <b.spranger@linutronix.de>,
Holger Dengler <dengler@linutronix.de>,
Samuel Ortiz <sameo@linux.intel.com>,
Lee Jones <lee.jones@linaro.org>
Subject: [PATCH 06/11] mfd: flexcard: add DMA interrupt domain
Date: Wed, 25 Mar 2015 10:51:55 +0100 [thread overview]
Message-ID: <1427277120-16924-7-git-send-email-dengler@linutronix.de> (raw)
In-Reply-To: <1427277120-16924-1-git-send-email-dengler@linutronix.de>
From: Benedikt Spranger <b.spranger@linutronix.de>
The Flexcard comprise an interrupt controller for the attached
tinys, timer, a Flexray related trigger and a second one for DMA.
Both controllers share a single IRQ line.
Add an interrupt domain for the DMA Controller interrupts.
Signed-off-by: Holger Dengler <dengler@linutronix.de>
Signed-off-by: Benedikt Spranger <b.spranger@linutronix.de>
cc: Samuel Ortiz <sameo@linux.intel.com>
cc: Lee Jones <lee.jones@linaro.org>
---
drivers/mfd/flexcard/irq.c | 95 +++++++++++++++++++++++++++++++++++++++++---
drivers/mfd/flexcard/irq.h | 11 +++++
include/linux/mfd/flexcard.h | 23 +++++++++++
3 files changed, 124 insertions(+), 5 deletions(-)
diff --git a/drivers/mfd/flexcard/irq.c b/drivers/mfd/flexcard/irq.c
index fefcb24..17e8b2c 100644
--- a/drivers/mfd/flexcard/irq.c
+++ b/drivers/mfd/flexcard/irq.c
@@ -27,11 +27,13 @@
static irqreturn_t flexcard_demux(int irq, void *data)
{
struct flexcard_device *priv = data;
- u32 stat;
+ u32 stat, dma_stat;
int i, cur;
stat = readl(&priv->conf->irs);
- if (!stat)
+ dma_stat = readl(&priv->conf->dma_irsr);
+
+ if (!stat && !dma_stat)
return IRQ_NONE;
for (i = 0; i < NR_FLEXCARD_IRQ; i++) {
@@ -41,6 +43,15 @@ static irqreturn_t flexcard_demux(int irq, void *data)
generic_handle_irq(cur);
}
}
+
+ for (i = 0; i < NR_FLEXCARD_DMA_IRQ; i++) {
+ if (dma_stat & flexcard_dma_irq_tab[i].status) {
+ cur = irq_find_mapping(priv->dma_domain, i);
+ if (cur)
+ generic_handle_irq(cur);
+ }
+ }
+
return IRQ_HANDLED;
}
@@ -125,6 +136,63 @@ static struct irq_domain_ops flexcard_irq_domain_ops = {
.map = flexcard_irq_domain_map,
};
+static void flexcard_dma_irq_ack(struct irq_data *d)
+{
+ struct flexcard_device *priv = irq_data_get_irq_chip_data(d);
+
+ writel(flexcard_dma_irq_tab[d->hwirq].reset, &priv->conf->dma_irsr);
+}
+
+static void flexcard_dma_irq_mask(struct irq_data *d)
+{
+ struct flexcard_device *priv = irq_data_get_irq_chip_data(d);
+ unsigned long flags;
+ u32 irer;
+
+ raw_spin_lock_irqsave(&priv->irq_lock, flags);
+ irer = readl(&priv->conf->dma_irer);
+ irer &= ~flexcard_dma_irq_tab[d->hwirq].enable;
+ writel(irer, &priv->conf->dma_irer);
+ raw_spin_unlock_irqrestore(&priv->irq_lock, flags);
+}
+
+static void flexcard_dma_irq_unmask(struct irq_data *d)
+{
+ struct flexcard_device *priv = irq_data_get_irq_chip_data(d);
+ unsigned long flags;
+ u32 irer;
+
+ raw_spin_lock_irqsave(&priv->irq_lock, flags);
+ irer = readl(&priv->conf->dma_irer);
+ irer |= FLEXCARD_DMA_IRER_DIRE | flexcard_dma_irq_tab[d->hwirq].enable;
+ writel(irer, &priv->conf->dma_irer);
+ raw_spin_unlock_irqrestore(&priv->irq_lock, flags);
+}
+
+static struct irq_chip flexcard_dma_irq_chip = {
+ .name = "flexcard_dma_irq",
+ .irq_ack = flexcard_dma_irq_ack,
+ .irq_mask = flexcard_dma_irq_mask,
+ .irq_unmask = flexcard_dma_irq_unmask,
+};
+
+static int flexcard_dma_irq_domain_map(struct irq_domain *d, unsigned int irq,
+ irq_hw_number_t hw)
+{
+ struct flexcard_device *priv = d->host_data;
+
+ irq_set_chip_and_handler_name(irq, &flexcard_dma_irq_chip,
+ handle_level_irq, "flexcard-dma");
+ irq_set_chip_data(irq, priv);
+ irq_modify_status(irq, IRQ_NOREQUEST | IRQ_NOAUTOEN, IRQ_NOPROBE);
+
+ return 0;
+}
+
+static struct irq_domain_ops flexcard_dma_irq_domain_ops = {
+ .map = flexcard_dma_irq_domain_map,
+};
+
int flexcard_setup_irq(struct pci_dev *pdev)
{
struct flexcard_device *priv = pci_get_drvdata(pdev);
@@ -143,12 +211,27 @@ int flexcard_setup_irq(struct pci_dev *pdev)
dev_err(&pdev->dev, "could not request irq domain\n");
return -ENODEV;
}
-
priv->irq_domain = domain;
+ domain = irq_domain_add_linear(NULL, NR_FLEXCARD_DMA_IRQ,
+ &flexcard_dma_irq_domain_ops, priv);
+ if (!domain) {
+ dev_err(&pdev->dev, "could not request dma irq domain\n");
+ ret = -ENODEV;
+ goto out_irq;
+ }
+ priv->dma_domain = domain;
+
ret = flexcard_req_irq(pdev);
if (ret)
- irq_domain_remove(priv->dma_domain);
+ goto out_dma;
+
+ return 0;
+
+out_dma:
+ irq_domain_remove(priv->dma_domain);
+out_irq:
+ irq_domain_remove(priv->irq_domain);
return ret;
}
@@ -161,7 +244,9 @@ void flexcard_remove_irq(struct pci_dev *pdev)
writel(0, &priv->conf->irc);
writel(0, &priv->conf->dma_irer);
+ irq_domain_remove(priv->dma_domain);
+ irq_domain_remove(priv->irq_domain);
+
free_irq(pdev->irq, priv);
pci_disable_msi(pdev);
- irq_domain_remove(priv->irq_domain);
}
diff --git a/drivers/mfd/flexcard/irq.h b/drivers/mfd/flexcard/irq.h
index b18fb5b..0e6fe18 100644
--- a/drivers/mfd/flexcard/irq.h
+++ b/drivers/mfd/flexcard/irq.h
@@ -1,6 +1,8 @@
#ifndef FLEXCARD_IRQ_H
#define FLEXCARD_IRQ_H
+#define FLEXCARD_DMA_IRER_DIRE (1 << 31)
+
struct flexcard_irq_tab {
u32 enable;
u32 reset;
@@ -47,4 +49,13 @@ static const struct flexcard_irq_tab flexcard_irq_tab[] = {
#define NR_FLEXCARD_IRQ ARRAY_SIZE(flexcard_irq_tab)
+static const struct flexcard_irq_tab flexcard_dma_irq_tab[] = {
+ to_irq_tab_ack(0, 0, 0), /* DMA_C0 */
+ to_irq_tab_ack(1, 1, 1), /* DMA_TE */
+ to_irq_tab_ack(4, 4, 4), /* DMA_TI */
+ to_irq_tab_ack(5, 5, 5), /* DMA_CBL */
+};
+
+#define NR_FLEXCARD_DMA_IRQ ARRAY_SIZE(flexcard_dma_irq_tab)
+
#endif /* FLEXCARD_IRQ_H */
diff --git a/include/linux/mfd/flexcard.h b/include/linux/mfd/flexcard.h
index f5b789f..f9b0962 100644
--- a/include/linux/mfd/flexcard.h
+++ b/include/linux/mfd/flexcard.h
@@ -30,6 +30,7 @@ struct flexcard_device {
struct miscdevice dev;
struct kref ref;
struct irq_domain *irq_domain;
+ struct irq_domain *dma_domain;
int cardnr;
char name[FLEXCARD_MAX_NAME];
};
@@ -39,4 +40,26 @@ enum flexcard_cell_id {
FLEXCARD_CELL_FLEXRAY,
};
+#define FLEXCARD_IRQ_CC1CCYS_OFF 0
+#define FLEXCARD_IRQ_CC2CCYS_OFF 1
+#define FLEXCARD_IRQ_CC3CCYS_OFF 2
+#define FLEXCARD_IRQ_CC4CCYS_OFF 3
+#define FLEXCARD_IRQ_WAKE4A_OFF 4
+#define FLEXCARD_IRQ_WAKE4B_OFF 5
+#define FLEXCARD_IRQ_WAKE3A_OFF 6
+#define FLEXCARD_IRQ_WAKE3B_OFF 7
+#define FLEXCARD_IRQ_WAKE2A_OFF 8
+#define FLEXCARD_IRQ_WAKE2B_OFF 9
+#define FLEXCARD_IRQ_WAKE1A_OFF 10
+#define FLEXCARD_IRQ_WAKE1B_OFF 11
+#define FLEXCARD_IRQ_CC1T0_OFF 12
+#define FLEXCARD_IRQ_CC2T0_OFF 13
+#define FLEXCARD_IRQ_CC3T0_OFF 14
+#define FLEXCARD_IRQ_CC4T0_OFF 15
+
+#define FLEXCARD_DMA_IRQ_CO 0
+#define FLEXCARD_DMA_IRQ_TE 1
+#define FLEXCARD_DMA_IRQ_TI 2
+#define FLEXCARD_DMA_IRQ_CBL 3
+
#endif /* FLEXCARD_H */
--
2.1.4
next prev parent reply other threads:[~2015-03-25 9:53 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-25 9:51 [PATCH 00/11] Eberspaecher Flexcard PMC II base support Holger Dengler
2015-03-25 9:51 ` [PATCH 01/11] mfd: Eberspaecher Flexcard PMC II Carrier Board support Holger Dengler
2015-03-30 7:57 ` Lee Jones
2015-03-25 9:51 ` [PATCH 02/11] mfd: flexcard: add flexcard core device Holger Dengler
2015-03-30 8:06 ` Lee Jones
2015-03-25 9:51 ` [PATCH 03/11] mfd: flexcard: add device attributes Holger Dengler
2015-03-30 8:15 ` Lee Jones
2015-03-25 9:51 ` [PATCH 04/11] mfd: flexcard: add clocksrc device Holger Dengler
2015-03-30 8:30 ` Lee Jones
2015-03-25 9:51 ` [PATCH 05/11] mfd: flexcard: add interrupt support Holger Dengler
2015-03-30 8:46 ` Lee Jones
2015-03-25 9:51 ` Holger Dengler [this message]
2015-03-30 8:50 ` [PATCH 06/11] mfd: flexcard: add DMA interrupt domain Lee Jones
2015-03-25 9:51 ` [PATCH 07/11] mfd: flexcard: add UIO IRQ devices Holger Dengler
2015-03-30 8:57 ` Lee Jones
2015-03-25 9:51 ` [PATCH 08/11] mfd: flexcard: add DMA device Holger Dengler
2015-03-30 8:59 ` Lee Jones
2015-03-25 9:51 ` [PATCH 09/11] mfd: flexcard: add DMA ringbuffer demux driver Holger Dengler
2015-03-30 9:02 ` Lee Jones
2015-03-25 9:51 ` [PATCH 10/11] clocksource: flexcard: Add basic timestamp counter support Holger Dengler
2015-03-26 9:41 ` Daniel Lezcano
2015-03-26 11:01 ` Holger Dengler
2015-03-26 16:34 ` John Stultz
2015-03-27 12:27 ` Holger Dengler
2015-03-25 9:52 ` [PATCH 11/11] clocksource: flexcard: Support timestamp trigger selection Holger Dengler
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=1427277120-16924-7-git-send-email-dengler@linutronix.de \
--to=dengler@linutronix.de \
--cc=b.spranger@linutronix.de \
--cc=bubeck@xkrug.com \
--cc=lee.jones@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mahler@xkrug.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;
as well as URLs for NNTP newsgroup(s).