[PATCH v4 09/17] irqchip: Add driver for Cirrus Logic Madera codecs

2017-07-28 Thread Richard Fitzgerald
The Cirrus Logic Madera codecs (Cirrus Logic CS47L35/85/90/91 and WM1840)
are highly complex devices containing up to 7 programmable DSPs and many
other internal sources of interrupts plus a number of GPIOs that can be
used as interrupt inputs. The large number (>150) of internal interrupt
sources are managed by an on-board interrupt controller.

This driver provides the handling for the interrupt controller. As the
codec is accessed via regmap, we can make use of the generic IRQ
functionality from regmap to do most of the work. Only around half of
the possible interrupt source are currently of interest from the driver
so only this subset is defined. Others can be added in future if needed.

The KConfig options are not user-configurable because this driver is
mandatory so is automatically included when the parent MFD driver is
selected.

Signed-off-by: Richard Fitzgerald 
Signed-off-by: Charles Keepax 
---
No changes since V3
 MAINTAINERS  |   2 +
 drivers/irqchip/Kconfig  |   3 +
 drivers/irqchip/Makefile |   1 +
 drivers/irqchip/irq-madera.c | 301 +++
 include/linux/irqchip/irq-madera-pdata.h |  23 +++
 include/linux/irqchip/irq-madera.h   |  96 ++
 6 files changed, 426 insertions(+)
 create mode 100644 drivers/irqchip/irq-madera.c
 create mode 100644 include/linux/irqchip/irq-madera-pdata.h
 create mode 100644 include/linux/irqchip/irq-madera.h

diff --git a/MAINTAINERS b/MAINTAINERS
index f335b2a..bc07a32 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3377,7 +3377,9 @@ T:git 
https://github.com/CirrusLogic/linux-drivers.git
 W: https://github.com/CirrusLogic/linux-drivers/wiki
 S: Supported
 F: Documentation/devicetree/bindings/mfd/madera.txt
+F: include/linux/irqchip/irq-madera*
 F: include/linux/mfd/madera/*
+F: drivers/irqchip/irq-madera*
 F: drivers/mfd/madera*
 F: drivers/mfd/cs47l*
 
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index f1fd5f4..eb225ac 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -130,6 +130,9 @@ config IMGPDC_IRQ
select GENERIC_IRQ_CHIP
select IRQ_DOMAIN
 
+config MADERA_IRQ
+   bool
+
 config IRQ_MIPS_CPU
bool
select GENERIC_IRQ_CHIP
diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
index e88d856..388a5a2 100644
--- a/drivers/irqchip/Makefile
+++ b/drivers/irqchip/Makefile
@@ -16,6 +16,7 @@ obj-$(CONFIG_ARCH_S3C24XX)+= irq-s3c24xx.o
 obj-$(CONFIG_DW_APB_ICTL)  += irq-dw-apb-ictl.o
 obj-$(CONFIG_METAG)+= irq-metag-ext.o
 obj-$(CONFIG_METAG_PERFCOUNTER_IRQS)   += irq-metag.o
+obj-$(CONFIG_MADERA_IRQ)   += irq-madera.o
 obj-$(CONFIG_CLPS711X_IRQCHIP) += irq-clps711x.o
 obj-$(CONFIG_OR1K_PIC) += irq-or1k-pic.o
 obj-$(CONFIG_ORION_IRQCHIP)+= irq-orion.o
diff --git a/drivers/irqchip/irq-madera.c b/drivers/irqchip/irq-madera.c
new file mode 100644
index 000..d80c459
--- /dev/null
+++ b/drivers/irqchip/irq-madera.c
@@ -0,0 +1,301 @@
+/*
+ * Interrupt support for Cirrus Logic Madera codecs
+ *
+ * Copyright 2016-2017 Cirrus Logic
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct madera_irq_priv {
+   struct device   *dev;
+   int irq;
+   struct regmap_irq_chip_data *irq_data;
+   struct madera   *madera;
+};
+
+#define MADERA_IRQ(_irq, _reg)  \
+   [MADERA_IRQ_ ## _irq] = { .reg_offset = (_reg) - MADERA_IRQ1_STATUS_2, \
+   .mask = MADERA_ ## _irq ## _EINT1 }
+
+static const struct regmap_irq madera_irqs[MADERA_NUM_IRQ] = {
+   MADERA_IRQ(FLL1_LOCK,   MADERA_IRQ1_STATUS_2),
+   MADERA_IRQ(FLL2_LOCK,   MADERA_IRQ1_STATUS_2),
+   MADERA_IRQ(FLL3_LOCK,   MADERA_IRQ1_STATUS_2),
+   MADERA_IRQ(FLLAO_LOCK,  MADERA_IRQ1_STATUS_2),
+
+   MADERA_IRQ(MICDET1, MADERA_IRQ1_STATUS_6),
+   MADERA_IRQ(MICDET2, MADERA_IRQ1_STATUS_6),
+   MADERA_IRQ(HPDET,   MADERA_IRQ1_STATUS_6),
+
+   MADERA_IRQ(MICD_CLAMP_RISE, MADERA_IRQ1_STATUS_7),
+   MADERA_IRQ(MICD_CLAMP_FALL, MADERA_IRQ1_STATUS_7),
+   MADERA_IRQ(JD1_RISE,MADERA_IRQ1_STATUS_7),
+   MADERA_IRQ(JD1_FALL,MADERA_IRQ1_STATUS_7),
+
+   MADERA_IRQ(ASRC2_IN1_LOCK,  MADERA_IRQ1_STATUS_9),
+   

[PATCH v4 09/17] irqchip: Add driver for Cirrus Logic Madera codecs

2017-07-28 Thread Richard Fitzgerald
The Cirrus Logic Madera codecs (Cirrus Logic CS47L35/85/90/91 and WM1840)
are highly complex devices containing up to 7 programmable DSPs and many
other internal sources of interrupts plus a number of GPIOs that can be
used as interrupt inputs. The large number (>150) of internal interrupt
sources are managed by an on-board interrupt controller.

This driver provides the handling for the interrupt controller. As the
codec is accessed via regmap, we can make use of the generic IRQ
functionality from regmap to do most of the work. Only around half of
the possible interrupt source are currently of interest from the driver
so only this subset is defined. Others can be added in future if needed.

The KConfig options are not user-configurable because this driver is
mandatory so is automatically included when the parent MFD driver is
selected.

Signed-off-by: Richard Fitzgerald 
Signed-off-by: Charles Keepax 
---
No changes since V3
 MAINTAINERS  |   2 +
 drivers/irqchip/Kconfig  |   3 +
 drivers/irqchip/Makefile |   1 +
 drivers/irqchip/irq-madera.c | 301 +++
 include/linux/irqchip/irq-madera-pdata.h |  23 +++
 include/linux/irqchip/irq-madera.h   |  96 ++
 6 files changed, 426 insertions(+)
 create mode 100644 drivers/irqchip/irq-madera.c
 create mode 100644 include/linux/irqchip/irq-madera-pdata.h
 create mode 100644 include/linux/irqchip/irq-madera.h

diff --git a/MAINTAINERS b/MAINTAINERS
index f335b2a..bc07a32 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3377,7 +3377,9 @@ T:git 
https://github.com/CirrusLogic/linux-drivers.git
 W: https://github.com/CirrusLogic/linux-drivers/wiki
 S: Supported
 F: Documentation/devicetree/bindings/mfd/madera.txt
+F: include/linux/irqchip/irq-madera*
 F: include/linux/mfd/madera/*
+F: drivers/irqchip/irq-madera*
 F: drivers/mfd/madera*
 F: drivers/mfd/cs47l*
 
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index f1fd5f4..eb225ac 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -130,6 +130,9 @@ config IMGPDC_IRQ
select GENERIC_IRQ_CHIP
select IRQ_DOMAIN
 
+config MADERA_IRQ
+   bool
+
 config IRQ_MIPS_CPU
bool
select GENERIC_IRQ_CHIP
diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
index e88d856..388a5a2 100644
--- a/drivers/irqchip/Makefile
+++ b/drivers/irqchip/Makefile
@@ -16,6 +16,7 @@ obj-$(CONFIG_ARCH_S3C24XX)+= irq-s3c24xx.o
 obj-$(CONFIG_DW_APB_ICTL)  += irq-dw-apb-ictl.o
 obj-$(CONFIG_METAG)+= irq-metag-ext.o
 obj-$(CONFIG_METAG_PERFCOUNTER_IRQS)   += irq-metag.o
+obj-$(CONFIG_MADERA_IRQ)   += irq-madera.o
 obj-$(CONFIG_CLPS711X_IRQCHIP) += irq-clps711x.o
 obj-$(CONFIG_OR1K_PIC) += irq-or1k-pic.o
 obj-$(CONFIG_ORION_IRQCHIP)+= irq-orion.o
diff --git a/drivers/irqchip/irq-madera.c b/drivers/irqchip/irq-madera.c
new file mode 100644
index 000..d80c459
--- /dev/null
+++ b/drivers/irqchip/irq-madera.c
@@ -0,0 +1,301 @@
+/*
+ * Interrupt support for Cirrus Logic Madera codecs
+ *
+ * Copyright 2016-2017 Cirrus Logic
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct madera_irq_priv {
+   struct device   *dev;
+   int irq;
+   struct regmap_irq_chip_data *irq_data;
+   struct madera   *madera;
+};
+
+#define MADERA_IRQ(_irq, _reg)  \
+   [MADERA_IRQ_ ## _irq] = { .reg_offset = (_reg) - MADERA_IRQ1_STATUS_2, \
+   .mask = MADERA_ ## _irq ## _EINT1 }
+
+static const struct regmap_irq madera_irqs[MADERA_NUM_IRQ] = {
+   MADERA_IRQ(FLL1_LOCK,   MADERA_IRQ1_STATUS_2),
+   MADERA_IRQ(FLL2_LOCK,   MADERA_IRQ1_STATUS_2),
+   MADERA_IRQ(FLL3_LOCK,   MADERA_IRQ1_STATUS_2),
+   MADERA_IRQ(FLLAO_LOCK,  MADERA_IRQ1_STATUS_2),
+
+   MADERA_IRQ(MICDET1, MADERA_IRQ1_STATUS_6),
+   MADERA_IRQ(MICDET2, MADERA_IRQ1_STATUS_6),
+   MADERA_IRQ(HPDET,   MADERA_IRQ1_STATUS_6),
+
+   MADERA_IRQ(MICD_CLAMP_RISE, MADERA_IRQ1_STATUS_7),
+   MADERA_IRQ(MICD_CLAMP_FALL, MADERA_IRQ1_STATUS_7),
+   MADERA_IRQ(JD1_RISE,MADERA_IRQ1_STATUS_7),
+   MADERA_IRQ(JD1_FALL,MADERA_IRQ1_STATUS_7),
+
+   MADERA_IRQ(ASRC2_IN1_LOCK,  MADERA_IRQ1_STATUS_9),
+   MADERA_IRQ(ASRC2_IN2_LOCK,  MADERA_IRQ1_STATUS_9),
+