get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/810596/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 810596,
    "url": "http://patchwork.ozlabs.org/api/patches/810596/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/linux-gpio/patch/1504704043-8052-10-git-send-email-rf@opensource.wolfsonmicro.com/",
    "project": {
        "id": 42,
        "url": "http://patchwork.ozlabs.org/api/projects/42/?format=api",
        "name": "Linux GPIO development",
        "link_name": "linux-gpio",
        "list_id": "linux-gpio.vger.kernel.org",
        "list_email": "linux-gpio@vger.kernel.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<1504704043-8052-10-git-send-email-rf@opensource.wolfsonmicro.com>",
    "list_archive_url": null,
    "date": "2017-09-06T13:20:35",
    "name": "[v5,09/17] irqchip: Add driver for Cirrus Logic Madera codecs",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "48dab75bf87bf043df4488e65fdbe29518559e37",
    "submitter": {
        "id": 65141,
        "url": "http://patchwork.ozlabs.org/api/people/65141/?format=api",
        "name": "Richard Fitzgerald",
        "email": "rf@opensource.wolfsonmicro.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/linux-gpio/patch/1504704043-8052-10-git-send-email-rf@opensource.wolfsonmicro.com/mbox/",
    "series": [
        {
            "id": 1804,
            "url": "http://patchwork.ozlabs.org/api/series/1804/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/linux-gpio/list/?series=1804",
            "date": "2017-09-06T13:20:36",
            "name": "Add support for Cirrus Logic CS47L35/L85/L90/L91 codecs",
            "version": 5,
            "mbox": "http://patchwork.ozlabs.org/series/1804/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/810596/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/810596/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<linux-gpio-owner@vger.kernel.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org",
        "Authentication-Results": [
            "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=linux-gpio-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)",
            "ppops.net;\n\tspf=none smtp.mailfrom=rf@opensource.wolfsonmicro.com"
        ],
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xnPTN5RlFz9t3Z\n\tfor <incoming@patchwork.ozlabs.org>;\n\tWed,  6 Sep 2017 23:25:12 +1000 (AEST)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1754529AbdIFNZK (ORCPT <rfc822;incoming@patchwork.ozlabs.org>);\n\tWed, 6 Sep 2017 09:25:10 -0400",
            "from mx0b-001ae601.pphosted.com ([67.231.152.168]:42784 \"EHLO\n\tmx0b-001ae601.pphosted.com\" rhost-flags-OK-OK-OK-OK)\n\tby vger.kernel.org with ESMTP id S1754265AbdIFNVE (ORCPT\n\t<rfc822; linux-gpio@vger.kernel.org>); Wed, 6 Sep 2017 09:21:04 -0400",
            "from pps.filterd (m0077474.ppops.net [127.0.0.1])\n\tby mx0b-001ae601.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id\n\tv86DJi88029115; Wed, 6 Sep 2017 08:20:47 -0500",
            "from mail4.cirrus.com ([87.246.98.35])\n\tby mx0b-001ae601.pphosted.com with ESMTP id 2cqs2mav68-1;\n\tWed, 06 Sep 2017 08:20:46 -0500",
            "from EX17.ad.cirrus.com (unknown [172.20.9.81])\n\tby mail4.cirrus.com (Postfix) with ESMTP id 86749611CE88;\n\tWed,  6 Sep 2017 08:20:44 -0500 (CDT)",
            "from imbe.wolfsonmicro.main (198.61.95.81) by EX17.ad.cirrus.com\n\t(172.20.9.81) with Microsoft SMTP Server id 14.3.301.0;\n\tWed, 6 Sep 2017 14:20:44 +0100",
            "from rf-debian.ad.cirrus.com (rf-debian.ad.cirrus.com\n\t[198.90.223.45]) by imbe.wolfsonmicro.main (8.14.4/8.14.4) with ESMTP\n\tid v86DKhDT032150;        Wed, 6 Sep 2017 14:20:44 +0100"
        ],
        "From": "Richard Fitzgerald <rf@opensource.wolfsonmicro.com>",
        "To": "<lee.jones@linaro.org>, <broonie@kernel.org>,\n\t<linus.walleij@linaro.org>, <gnurou@gmail.com>,\n\t<robh+dt@kernel.org>, <tglx@linutronix.de>, <jason@lakedaemon.net>",
        "CC": "<alsa-devel@alsa-project.org>, <patches@opensource.wolfsonmicro.com>,\n\t<linux-gpio@vger.kernel.org>, <devicetree@vger.kernel.org>,\n\t<linux-kernel@vger.kernel.org>",
        "Subject": "[PATCH v5 09/17] irqchip: Add driver for Cirrus Logic Madera codecs",
        "Date": "Wed, 6 Sep 2017 14:20:35 +0100",
        "Message-ID": "<1504704043-8052-10-git-send-email-rf@opensource.wolfsonmicro.com>",
        "X-Mailer": "git-send-email 1.9.1",
        "In-Reply-To": "<1504704043-8052-1-git-send-email-rf@opensource.wolfsonmicro.com>",
        "References": "<1504704043-8052-1-git-send-email-rf@opensource.wolfsonmicro.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Proofpoint-Spam-Details": "rule=notspam policy=default score=0\n\tpriorityscore=1501 malwarescore=0\n\tsuspectscore=1 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015\n\tlowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam\n\tadjust=0\n\treason=mlx scancount=1 engine=8.0.1-1707230000\n\tdefinitions=main-1709060186",
        "Sender": "linux-gpio-owner@vger.kernel.org",
        "Precedence": "bulk",
        "List-ID": "<linux-gpio.vger.kernel.org>",
        "X-Mailing-List": "linux-gpio@vger.kernel.org"
    },
    "content": "The Cirrus Logic Madera codecs (Cirrus Logic CS47L35/85/90/91 and WM1840)\nare highly complex devices containing up to 7 programmable DSPs and many\nother internal sources of interrupts plus a number of GPIOs that can be\nused as interrupt inputs. The large number (>150) of internal interrupt\nsources are managed by an on-board interrupt controller.\n\nThis driver provides the handling for the interrupt controller. As the\ncodec is accessed via regmap, we can make use of the generic IRQ\nfunctionality from regmap to do most of the work. Only around half of\nthe possible interrupt source are currently of interest from the driver\nso only this subset is defined. Others can be added in future if needed.\n\nThe KConfig options are not user-configurable because this driver is\nmandatory so is automatically included when the parent MFD driver is\nselected.\n\nSigned-off-by: Richard Fitzgerald <rf@opensource.wolfsonmicro.com>\nSigned-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>\n---\nChanges since V4:\n- Fixed missing include of linux/interrupt.h in irq-madera.h\n\n MAINTAINERS                              |   2 +\n drivers/irqchip/Kconfig                  |   3 +\n drivers/irqchip/Makefile                 |   1 +\n drivers/irqchip/irq-madera.c             | 301 +++++++++++++++++++++++++++++++\n include/linux/irqchip/irq-madera-pdata.h |  23 +++\n include/linux/irqchip/irq-madera.h       |  98 ++++++++++\n 6 files changed, 428 insertions(+)\n create mode 100644 drivers/irqchip/irq-madera.c\n create mode 100644 include/linux/irqchip/irq-madera-pdata.h\n create mode 100644 include/linux/irqchip/irq-madera.h",
    "diff": "diff --git a/MAINTAINERS b/MAINTAINERS\nindex 642b9be..ed94481 100644\n--- a/MAINTAINERS\n+++ b/MAINTAINERS\n@@ -3426,7 +3426,9 @@ T:\tgit https://github.com/CirrusLogic/linux-drivers.git\n W:\thttps://github.com/CirrusLogic/linux-drivers/wiki\n S:\tSupported\n F:\tDocumentation/devicetree/bindings/mfd/madera.txt\n+F:\tinclude/linux/irqchip/irq-madera*\n F:\tinclude/linux/mfd/madera/*\n+F:\tdrivers/irqchip/irq-madera*\n F:\tdrivers/mfd/madera*\n F:\tdrivers/mfd/cs47l*\n \ndiff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig\nindex 9d8a1dd..94df0f3 100644\n--- a/drivers/irqchip/Kconfig\n+++ b/drivers/irqchip/Kconfig\n@@ -135,6 +135,9 @@ config IMGPDC_IRQ\n \tselect GENERIC_IRQ_CHIP\n \tselect IRQ_DOMAIN\n \n+config MADERA_IRQ\n+\tbool\n+\n config IRQ_MIPS_CPU\n \tbool\n \tselect GENERIC_IRQ_CHIP\ndiff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile\nindex 845abc1..177cb95 100644\n--- a/drivers/irqchip/Makefile\n+++ b/drivers/irqchip/Makefile\n@@ -16,6 +16,7 @@ obj-$(CONFIG_ARCH_S3C24XX)\t\t+= irq-s3c24xx.o\n obj-$(CONFIG_DW_APB_ICTL)\t\t+= irq-dw-apb-ictl.o\n obj-$(CONFIG_METAG)\t\t\t+= irq-metag-ext.o\n obj-$(CONFIG_METAG_PERFCOUNTER_IRQS)\t+= irq-metag.o\n+obj-$(CONFIG_MADERA_IRQ)\t\t+= irq-madera.o\n obj-$(CONFIG_CLPS711X_IRQCHIP)\t\t+= irq-clps711x.o\n obj-$(CONFIG_OR1K_PIC)\t\t\t+= irq-or1k-pic.o\n obj-$(CONFIG_ORION_IRQCHIP)\t\t+= irq-orion.o\ndiff --git a/drivers/irqchip/irq-madera.c b/drivers/irqchip/irq-madera.c\nnew file mode 100644\nindex 0000000..d80c459\n--- /dev/null\n+++ b/drivers/irqchip/irq-madera.c\n@@ -0,0 +1,301 @@\n+/*\n+ * Interrupt support for Cirrus Logic Madera codecs\n+ *\n+ * Copyright 2016-2017 Cirrus Logic\n+ *\n+ * This program is free software; you can redistribute it and/or modify\n+ * it under the terms of the GNU General Public License version 2 as\n+ * published by the Free Software Foundation.\n+ */\n+\n+#include <linux/module.h>\n+#include <linux/gpio.h>\n+#include <linux/interrupt.h>\n+#include <linux/irq.h>\n+#include <linux/irqdomain.h>\n+#include <linux/pm_runtime.h>\n+#include <linux/regmap.h>\n+#include <linux/slab.h>\n+#include <linux/of.h>\n+#include <linux/of_device.h>\n+#include <linux/of_gpio.h>\n+#include <linux/of_irq.h>\n+#include <linux/irqchip/irq-madera.h>\n+#include <linux/irqchip/irq-madera-pdata.h>\n+#include <linux/mfd/madera/core.h>\n+#include <linux/mfd/madera/pdata.h>\n+#include <linux/mfd/madera/registers.h>\n+\n+struct madera_irq_priv {\n+\tstruct device\t\t\t*dev;\n+\tint\t\t\t\tirq;\n+\tstruct regmap_irq_chip_data\t*irq_data;\n+\tstruct madera\t\t\t*madera;\n+};\n+\n+#define MADERA_IRQ(_irq, _reg)\t\t\t\t\t\t     \\\n+\t[MADERA_IRQ_ ## _irq] = { .reg_offset = (_reg) - MADERA_IRQ1_STATUS_2, \\\n+\t\t\t\t.mask = MADERA_ ## _irq ## _EINT1 }\n+\n+static const struct regmap_irq madera_irqs[MADERA_NUM_IRQ] = {\n+\tMADERA_IRQ(FLL1_LOCK,\t\tMADERA_IRQ1_STATUS_2),\n+\tMADERA_IRQ(FLL2_LOCK,\t\tMADERA_IRQ1_STATUS_2),\n+\tMADERA_IRQ(FLL3_LOCK,\t\tMADERA_IRQ1_STATUS_2),\n+\tMADERA_IRQ(FLLAO_LOCK,\t\tMADERA_IRQ1_STATUS_2),\n+\n+\tMADERA_IRQ(MICDET1,\t\tMADERA_IRQ1_STATUS_6),\n+\tMADERA_IRQ(MICDET2,\t\tMADERA_IRQ1_STATUS_6),\n+\tMADERA_IRQ(HPDET,\t\tMADERA_IRQ1_STATUS_6),\n+\n+\tMADERA_IRQ(MICD_CLAMP_RISE,\tMADERA_IRQ1_STATUS_7),\n+\tMADERA_IRQ(MICD_CLAMP_FALL,\tMADERA_IRQ1_STATUS_7),\n+\tMADERA_IRQ(JD1_RISE,\t\tMADERA_IRQ1_STATUS_7),\n+\tMADERA_IRQ(JD1_FALL,\t\tMADERA_IRQ1_STATUS_7),\n+\n+\tMADERA_IRQ(ASRC2_IN1_LOCK,\tMADERA_IRQ1_STATUS_9),\n+\tMADERA_IRQ(ASRC2_IN2_LOCK,\tMADERA_IRQ1_STATUS_9),\n+\tMADERA_IRQ(ASRC1_IN1_LOCK,\tMADERA_IRQ1_STATUS_9),\n+\tMADERA_IRQ(ASRC1_IN2_LOCK,\tMADERA_IRQ1_STATUS_9),\n+\tMADERA_IRQ(DRC2_SIG_DET,\tMADERA_IRQ1_STATUS_9),\n+\tMADERA_IRQ(DRC1_SIG_DET,\tMADERA_IRQ1_STATUS_9),\n+\n+\tMADERA_IRQ(DSP_IRQ1,\t\tMADERA_IRQ1_STATUS_11),\n+\tMADERA_IRQ(DSP_IRQ2,\t\tMADERA_IRQ1_STATUS_11),\n+\tMADERA_IRQ(DSP_IRQ3,\t\tMADERA_IRQ1_STATUS_11),\n+\tMADERA_IRQ(DSP_IRQ4,\t\tMADERA_IRQ1_STATUS_11),\n+\tMADERA_IRQ(DSP_IRQ5,\t\tMADERA_IRQ1_STATUS_11),\n+\tMADERA_IRQ(DSP_IRQ6,\t\tMADERA_IRQ1_STATUS_11),\n+\tMADERA_IRQ(DSP_IRQ7,\t\tMADERA_IRQ1_STATUS_11),\n+\tMADERA_IRQ(DSP_IRQ8,\t\tMADERA_IRQ1_STATUS_11),\n+\tMADERA_IRQ(DSP_IRQ9,\t\tMADERA_IRQ1_STATUS_11),\n+\tMADERA_IRQ(DSP_IRQ10,\t\tMADERA_IRQ1_STATUS_11),\n+\tMADERA_IRQ(DSP_IRQ11,\t\tMADERA_IRQ1_STATUS_11),\n+\tMADERA_IRQ(DSP_IRQ12,\t\tMADERA_IRQ1_STATUS_11),\n+\tMADERA_IRQ(DSP_IRQ13,\t\tMADERA_IRQ1_STATUS_11),\n+\tMADERA_IRQ(DSP_IRQ14,\t\tMADERA_IRQ1_STATUS_11),\n+\tMADERA_IRQ(DSP_IRQ15,\t\tMADERA_IRQ1_STATUS_11),\n+\tMADERA_IRQ(DSP_IRQ16,\t\tMADERA_IRQ1_STATUS_11),\n+\n+\tMADERA_IRQ(HP3R_SC,\t\tMADERA_IRQ1_STATUS_12),\n+\tMADERA_IRQ(HP3L_SC,\t\tMADERA_IRQ1_STATUS_12),\n+\tMADERA_IRQ(HP2R_SC,\t\tMADERA_IRQ1_STATUS_12),\n+\tMADERA_IRQ(HP2L_SC,\t\tMADERA_IRQ1_STATUS_12),\n+\tMADERA_IRQ(HP1R_SC,\t\tMADERA_IRQ1_STATUS_12),\n+\tMADERA_IRQ(HP1L_SC,\t\tMADERA_IRQ1_STATUS_12),\n+\n+\tMADERA_IRQ(SPK_OVERHEAT_WARN,\tMADERA_IRQ1_STATUS_15),\n+\tMADERA_IRQ(SPK_OVERHEAT,\tMADERA_IRQ1_STATUS_15),\n+\n+\tMADERA_IRQ(DSP1_BUS_ERR,\tMADERA_IRQ1_STATUS_33),\n+\tMADERA_IRQ(DSP2_BUS_ERR,\tMADERA_IRQ1_STATUS_33),\n+\tMADERA_IRQ(DSP3_BUS_ERR,\tMADERA_IRQ1_STATUS_33),\n+\tMADERA_IRQ(DSP4_BUS_ERR,\tMADERA_IRQ1_STATUS_33),\n+\tMADERA_IRQ(DSP5_BUS_ERR,\tMADERA_IRQ1_STATUS_33),\n+\tMADERA_IRQ(DSP6_BUS_ERR,\tMADERA_IRQ1_STATUS_33),\n+\tMADERA_IRQ(DSP7_BUS_ERR,\tMADERA_IRQ1_STATUS_33),\n+};\n+\n+static const struct regmap_irq_chip madera_irq = {\n+\t.name\t\t= \"madera IRQ\",\n+\t.status_base\t= MADERA_IRQ1_STATUS_2,\n+\t.mask_base\t= MADERA_IRQ1_MASK_2,\n+\t.ack_base\t= MADERA_IRQ1_STATUS_2,\n+\t.runtime_pm\t= true,\n+\t.num_regs\t= 32,\n+\t.irqs\t\t= madera_irqs,\n+\t.num_irqs\t= ARRAY_SIZE(madera_irqs),\n+};\n+\n+static int madera_map_irq(struct madera *madera, int irq)\n+{\n+\tstruct madera_irq_priv *priv = dev_get_drvdata(madera->irq_dev);\n+\n+\tif (!madera->irq_dev)\n+\t\treturn -ENOENT;\n+\n+\treturn regmap_irq_get_virq(priv->irq_data, irq);\n+}\n+\n+int madera_request_irq(struct madera *madera, int irq, const char *name,\n+\t\t\tirq_handler_t handler, void *data)\n+{\n+\tirq = madera_map_irq(madera, irq);\n+\n+\tif (irq < 0)\n+\t\treturn irq;\n+\n+\treturn request_threaded_irq(irq, NULL, handler, IRQF_ONESHOT, name,\n+\t\t\t\t    data);\n+\n+}\n+EXPORT_SYMBOL_GPL(madera_request_irq);\n+\n+void madera_free_irq(struct madera *madera, int irq, void *data)\n+{\n+\tirq = madera_map_irq(madera, irq);\n+\n+\tif (irq < 0)\n+\t\treturn;\n+\n+\tfree_irq(irq, data);\n+}\n+EXPORT_SYMBOL_GPL(madera_free_irq);\n+\n+int madera_set_irq_wake(struct madera *madera, int irq, int on)\n+{\n+\tirq = madera_map_irq(madera, irq);\n+\n+\tif (irq < 0)\n+\t\treturn irq;\n+\n+\treturn irq_set_irq_wake(irq, on);\n+}\n+EXPORT_SYMBOL_GPL(madera_set_irq_wake);\n+\n+#ifdef CONFIG_PM_SLEEP\n+static int madera_suspend_noirq(struct device *dev)\n+{\n+\tstruct madera_irq_priv *priv = dev_get_drvdata(dev);\n+\n+\tdev_dbg(priv->dev, \"No IRQ suspend, reenabling IRQ\\n\");\n+\n+\tenable_irq(priv->irq);\n+\n+\treturn 0;\n+}\n+\n+static int madera_suspend(struct device *dev)\n+{\n+\tstruct madera_irq_priv *priv = dev_get_drvdata(dev);\n+\n+\tdev_dbg(priv->dev, \"Suspend, disabling IRQ\\n\");\n+\n+\tdisable_irq(priv->irq);\n+\n+\treturn 0;\n+}\n+\n+static int madera_resume_noirq(struct device *dev)\n+{\n+\tstruct madera_irq_priv *priv = dev_get_drvdata(dev);\n+\n+\tdev_dbg(priv->dev, \"No IRQ resume, disabling IRQ\\n\");\n+\n+\tdisable_irq(priv->irq);\n+\n+\treturn 0;\n+}\n+\n+static int madera_resume(struct device *dev)\n+{\n+\tstruct madera_irq_priv *priv = dev_get_drvdata(dev);\n+\n+\tdev_dbg(priv->dev, \"Resume, reenabling IRQ\\n\");\n+\n+\tenable_irq(priv->irq);\n+\n+\treturn 0;\n+}\n+#endif\n+\n+static const struct dev_pm_ops madera_irq_pm_ops = {\n+\tSET_SYSTEM_SLEEP_PM_OPS(madera_suspend, madera_resume)\n+\tSET_NOIRQ_SYSTEM_SLEEP_PM_OPS(madera_suspend_noirq,\n+\t\t\t\t      madera_resume_noirq)\n+};\n+\n+static int madera_irq_probe(struct platform_device *pdev)\n+{\n+\tstruct madera *madera = dev_get_drvdata(pdev->dev.parent);\n+\tstruct madera_irq_priv *priv;\n+\tstruct irq_data *irq_data;\n+\tunsigned int irq_flags = madera->pdata.irqchip.irq_flags;\n+\tint ret;\n+\n+\tdev_dbg(&pdev->dev, \"probe\\n\");\n+\n+\tpriv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);\n+\tif (!priv)\n+\t\treturn -ENOMEM;\n+\n+\tpriv->dev = &pdev->dev;\n+\tpriv->madera = madera;\n+\tpriv->irq = madera->irq;\n+\n+\t/* Read the flags from the interrupt controller if not specified */\n+\tif (!irq_flags) {\n+\t\tirq_data = irq_get_irq_data(priv->irq);\n+\t\tif (!irq_data) {\n+\t\t\tdev_err(priv->dev, \"Invalid IRQ: %d\\n\", priv->irq);\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\n+\t\tirq_flags = irqd_get_trigger_type(irq_data);\n+\n+\t\t/* Codec defaults to trigger low, use this if no flags given */\n+\t\tif (irq_flags == IRQ_TYPE_NONE)\n+\t\t\tirq_flags = IRQF_TRIGGER_LOW;\n+\t}\n+\n+\tif (irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) {\n+\t\tdev_err(priv->dev, \"Host interrupt not level-triggered\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (irq_flags & IRQF_TRIGGER_HIGH) {\n+\t\tret = regmap_update_bits(madera->regmap, MADERA_IRQ1_CTRL,\n+\t\t\t\t\t MADERA_IRQ_POL_MASK, 0);\n+\t\tif (ret) {\n+\t\t\tdev_err(priv->dev,\n+\t\t\t\t\"Failed to set IRQ polarity: %d\\n\", ret);\n+\t\t\treturn ret;\n+\t\t}\n+\t}\n+\n+\t/*\n+\t * NOTE: regmap registers this against the OF node of the parent of\n+\t * the regmap - that is, against the mfd driver\n+\t */\n+\tret = regmap_add_irq_chip(madera->regmap, priv->irq, IRQF_ONESHOT, 0,\n+\t\t\t\t  &madera_irq, &priv->irq_data);\n+\tif (ret) {\n+\t\tdev_err(priv->dev, \"add_irq_chip failed: %d\\n\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\tplatform_set_drvdata(pdev, priv);\n+\tmadera->irq_dev = priv->dev;\n+\n+\treturn 0;\n+}\n+\n+static int madera_irq_remove(struct platform_device *pdev)\n+{\n+\tstruct madera_irq_priv *priv = platform_get_drvdata(pdev);\n+\n+\t/*\n+\t * The IRQ is disabled by the parent MFD driver before\n+\t * it starts cleaning up all child drivers\n+\t */\n+\n+\tpriv->madera->irq_dev = NULL;\n+\n+\tregmap_del_irq_chip(priv->irq, priv->irq_data);\n+\tfree_irq(priv->irq, priv);\n+\n+\treturn 0;\n+}\n+\n+static struct platform_driver madera_irq_driver = {\n+\t.probe\t= madera_irq_probe,\n+\t.remove = madera_irq_remove,\n+\t.driver = {\n+\t\t.name\t= \"madera-irq\",\n+\t\t.pm\t= &madera_irq_pm_ops,\n+\t}\n+};\n+module_platform_driver(madera_irq_driver);\n+\n+MODULE_DESCRIPTION(\"Madera IRQ driver\");\n+MODULE_AUTHOR(\"Richard Fitzgerald <rf@opensource.wolfsonmicro.com>\");\n+MODULE_LICENSE(\"GPL v2\");\ndiff --git a/include/linux/irqchip/irq-madera-pdata.h b/include/linux/irqchip/irq-madera-pdata.h\nnew file mode 100644\nindex 0000000..1b6cc31\n--- /dev/null\n+++ b/include/linux/irqchip/irq-madera-pdata.h\n@@ -0,0 +1,23 @@\n+/*\n+ * Platform data for Cirrus Logic Madera codecs irqchip driver\n+ *\n+ * Copyright 2016-2017 Cirrus Logic\n+ *\n+ * This program is free software; you can redistribute it and/or modify\n+ * it under the terms of the GNU General Public License version 2 as\n+ * published by the Free Software Foundation.\n+ */\n+\n+#ifndef IRQCHIP_MADERA_PDATA_H\n+#define IRQCHIP_MADERA_PDATA_H\n+\n+/**\n+ * struct madera_irqchip_pdata - Configuration for Madera devices IRQ driver\n+ *\n+ * @irq_flags: Mode for primary IRQ (defaults to active low)\n+ */\n+struct madera_irqchip_pdata {\n+\tunsigned int irq_flags;\n+};\n+\n+#endif\ndiff --git a/include/linux/irqchip/irq-madera.h b/include/linux/irqchip/irq-madera.h\nnew file mode 100644\nindex 0000000..a7bc5fb\n--- /dev/null\n+++ b/include/linux/irqchip/irq-madera.h\n@@ -0,0 +1,98 @@\n+/*\n+ * Interrupt support for Cirrus Logic Madera codecs\n+ *\n+ * Copyright 2016-2017 Cirrus Logic\n+ *\n+ * This program is free software; you can redistribute it and/or modify\n+ * it under the terms of the GNU General Public License version 2 as\n+ * published by the Free Software Foundation.\n+ */\n+\n+#ifndef IRQCHIP_MADERA_H\n+#define IRQCHIP_MADERA_H\n+\n+#include <linux/interrupt.h>\n+\n+#define MADERA_IRQ_FLL1_LOCK\t\t0\n+#define MADERA_IRQ_FLL2_LOCK\t\t1\n+#define MADERA_IRQ_FLL3_LOCK\t\t2\n+#define MADERA_IRQ_FLLAO_LOCK\t\t3\n+#define MADERA_IRQ_CLK_SYS_ERR\t\t4\n+#define MADERA_IRQ_CLK_ASYNC_ERR\t5\n+#define MADERA_IRQ_CLK_DSP_ERR\t\t6\n+#define MADERA_IRQ_HPDET\t\t7\n+#define MADERA_IRQ_MICDET1\t\t8\n+#define MADERA_IRQ_MICDET2\t\t9\n+#define MADERA_IRQ_JD1_RISE\t\t10\n+#define MADERA_IRQ_JD1_FALL\t\t11\n+#define MADERA_IRQ_JD2_RISE\t\t12\n+#define MADERA_IRQ_JD2_FALL\t\t13\n+#define MADERA_IRQ_MICD_CLAMP_RISE\t14\n+#define MADERA_IRQ_MICD_CLAMP_FALL\t15\n+#define MADERA_IRQ_DRC2_SIG_DET\t\t16\n+#define MADERA_IRQ_DRC1_SIG_DET\t\t17\n+#define MADERA_IRQ_ASRC1_IN1_LOCK\t18\n+#define MADERA_IRQ_ASRC1_IN2_LOCK\t19\n+#define MADERA_IRQ_ASRC2_IN1_LOCK\t20\n+#define MADERA_IRQ_ASRC2_IN2_LOCK\t21\n+#define MADERA_IRQ_DSP_IRQ1\t\t22\n+#define MADERA_IRQ_DSP_IRQ2\t\t23\n+#define MADERA_IRQ_DSP_IRQ3\t\t24\n+#define MADERA_IRQ_DSP_IRQ4\t\t25\n+#define MADERA_IRQ_DSP_IRQ5\t\t26\n+#define MADERA_IRQ_DSP_IRQ6\t\t27\n+#define MADERA_IRQ_DSP_IRQ7\t\t28\n+#define MADERA_IRQ_DSP_IRQ8\t\t29\n+#define MADERA_IRQ_DSP_IRQ9\t\t30\n+#define MADERA_IRQ_DSP_IRQ10\t\t31\n+#define MADERA_IRQ_DSP_IRQ11\t\t32\n+#define MADERA_IRQ_DSP_IRQ12\t\t33\n+#define MADERA_IRQ_DSP_IRQ13\t\t34\n+#define MADERA_IRQ_DSP_IRQ14\t\t35\n+#define MADERA_IRQ_DSP_IRQ15\t\t36\n+#define MADERA_IRQ_DSP_IRQ16\t\t37\n+#define MADERA_IRQ_HP1L_SC\t\t38\n+#define MADERA_IRQ_HP1R_SC\t\t39\n+#define MADERA_IRQ_HP2L_SC\t\t40\n+#define MADERA_IRQ_HP2R_SC\t\t41\n+#define MADERA_IRQ_HP3L_SC\t\t42\n+#define MADERA_IRQ_HP3R_SC\t\t43\n+#define MADERA_IRQ_SPKOUTL_SC\t\t44\n+#define MADERA_IRQ_SPKOUTR_SC\t\t45\n+#define MADERA_IRQ_HP1L_ENABLE_DONE\t46\n+#define MADERA_IRQ_HP1R_ENABLE_DONE\t47\n+#define MADERA_IRQ_HP2L_ENABLE_DONE\t48\n+#define MADERA_IRQ_HP2R_ENABLE_DONE\t49\n+#define MADERA_IRQ_HP3L_ENABLE_DONE\t50\n+#define MADERA_IRQ_HP3R_ENABLE_DONE\t51\n+#define MADERA_IRQ_SPKOUTL_ENABLE_DONE\t52\n+#define MADERA_IRQ_SPKOUTR_ENABLE_DONE\t53\n+#define MADERA_IRQ_SPK_SHUTDOWN\t\t54\n+#define MADERA_IRQ_SPK_OVERHEAT\t\t55\n+#define MADERA_IRQ_SPK_OVERHEAT_WARN\t56\n+#define MADERA_IRQ_GPIO1\t\t57\n+#define MADERA_IRQ_GPIO2\t\t58\n+#define MADERA_IRQ_GPIO3\t\t59\n+#define MADERA_IRQ_GPIO4\t\t60\n+#define MADERA_IRQ_GPIO5\t\t61\n+#define MADERA_IRQ_GPIO6\t\t62\n+#define MADERA_IRQ_GPIO7\t\t63\n+#define MADERA_IRQ_GPIO8\t\t64\n+#define MADERA_IRQ_DSP1_BUS_ERR\t\t65\n+#define MADERA_IRQ_DSP2_BUS_ERR\t\t66\n+#define MADERA_IRQ_DSP3_BUS_ERR\t\t67\n+#define MADERA_IRQ_DSP4_BUS_ERR\t\t68\n+#define MADERA_IRQ_DSP5_BUS_ERR\t\t69\n+#define MADERA_IRQ_DSP6_BUS_ERR\t\t70\n+#define MADERA_IRQ_DSP7_BUS_ERR\t\t71\n+\n+#define MADERA_NUM_IRQ\t\t\t72\n+\n+struct madera;\n+\n+int madera_request_irq(struct madera *madera, int irq, const char *name,\n+\t\t       irq_handler_t handler, void *data);\n+void madera_free_irq(struct madera *madera, int irq, void *data);\n+int madera_set_irq_wake(struct madera *madera, int irq, int on);\n+\n+#endif\n",
    "prefixes": [
        "v5",
        "09/17"
    ]
}