Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/806508/?format=api
{ "id": 806508, "url": "http://patchwork.ozlabs.org/api/patches/806508/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-imx/patch/20170828105344.8338-3-afaerber@suse.de/", "project": { "id": 19, "url": "http://patchwork.ozlabs.org/api/projects/19/?format=api", "name": "Linux IMX development", "link_name": "linux-imx", "list_id": "linux-imx-kernel.lists.patchwork.ozlabs.org", "list_email": "linux-imx-kernel@lists.patchwork.ozlabs.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20170828105344.8338-3-afaerber@suse.de>", "list_archive_url": null, "date": "2017-08-28T10:53:43", "name": "[v2,2/3] irqchip: Add Realtek RTD1295 mux driver", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "e0249fed3ee8e03d3c0efe53a2ef43747234f85c", "submitter": { "id": 9542, "url": "http://patchwork.ozlabs.org/api/people/9542/?format=api", "name": "Andreas Färber", "email": "afaerber@suse.de" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linux-imx/patch/20170828105344.8338-3-afaerber@suse.de/mbox/", "series": [ { "id": 131, "url": "http://patchwork.ozlabs.org/api/series/131/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-imx/list/?series=131", "date": "2017-08-28T10:53:42", "name": "arm64: Realtek RTD1295 IRQ mux", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/131/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/806508/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/806508/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<linux-arm-kernel-bounces+incoming-imx=patchwork.ozlabs.org@lists.infradead.org>", "X-Original-To": "incoming-imx@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming-imx@bilbo.ozlabs.org", "Authentication-Results": [ "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=lists.infradead.org\n\t(client-ip=65.50.211.133; helo=bombadil.infradead.org;\n\tenvelope-from=linux-arm-kernel-bounces+incoming-imx=patchwork.ozlabs.org@lists.infradead.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org; dkim=pass (2048-bit key;\n\tunprotected) header.d=lists.infradead.org\n\theader.i=@lists.infradead.org\n\theader.b=\"fL+P6LLU\"; dkim-atps=neutral" ], "Received": [ "from bombadil.infradead.org (bombadil.infradead.org\n\t[65.50.211.133])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xgptQ27Bkz9s8J\n\tfor <incoming-imx@patchwork.ozlabs.org>;\n\tMon, 28 Aug 2017 21:09:02 +1000 (AEST)", "from localhost ([127.0.0.1] helo=bombadil.infradead.org)\n\tby bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux))\n\tid 1dmHuZ-0006TN-Ml; Mon, 28 Aug 2017 11:08:55 +0000", "from mx2.suse.de ([195.135.220.15] helo=mx1.suse.de)\n\tby bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux))\n\tid 1dmHgR-0006rP-3u for linux-arm-kernel@lists.infradead.org;\n\tMon, 28 Aug 2017 10:54:23 +0000", "from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254])\n\tby mx1.suse.de (Postfix) with ESMTP id 110CBABFC;\n\tMon, 28 Aug 2017 10:53:55 +0000 (UTC)" ], "DKIM-Signature": "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;\n\td=lists.infradead.org; s=bombadil.20170209; h=Sender:\n\tContent-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post:\n\tList-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:\n\tMessage-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description:\n\tResent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:\n\tList-Owner; bh=2y1Q3mmyXbfA8Lv+9KmBVIjJ5M42LCU67WEaD871fuU=;\n\tb=fL+P6LLUnOepSd\n\t69u9mDYZhS+fmB+utMhZ4WEHJYlcEUinCKe0SOAaxAMgC2mVp3+g/cAS1BWeywyXW7IC3mF7W1+6m\n\tQSskXob/UHCDPYOltIsYlQcBdzb8Apmlv7fQYHqVlUk4ysN5uwnj1ARVv+uWv1KNPROcI9fNGgP6P\n\tAh+VwAeSp+bJp1XlEL23WY1i+hKHFLMQ9ueiM9IEbN+m/5Y+4shzVfnZlYc2OaW19KrR3H6yTVHbJ\n\trwYKosXpugBWMjWT0E/MYbfnxeCwwMMNsev5Em4OOM9Fnbva6NMZlAsZGGUqPTmW8q2mv9HLgzXev\n\tvA7pBUKu1d0Rn/Zjvqqg==;", "X-Virus-Scanned": "by amavisd-new at test-mx.suse.de", "From": "=?utf-8?q?Andreas_F=C3=A4rber?= <afaerber@suse.de>", "To": "Thomas Gleixner <tglx@linutronix.de>, Jason Cooper <jason@lakedaemon.net>,\n\tMarc Zyngier <marc.zyngier@arm.com>, linux-arm-kernel@lists.infradead.org", "Subject": "[PATCH v2 2/3] irqchip: Add Realtek RTD1295 mux driver", "Date": "Mon, 28 Aug 2017 12:53:43 +0200", "Message-Id": "<20170828105344.8338-3-afaerber@suse.de>", "X-Mailer": "git-send-email 2.12.3", "In-Reply-To": "<20170828105344.8338-1-afaerber@suse.de>", "References": "<20170828105344.8338-1-afaerber@suse.de>", "MIME-Version": "1.0", "X-CRM114-Version": "20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 ", "X-CRM114-CacheID": "sfid-20170828_035419_541212_1140DF7C ", "X-CRM114-Status": "GOOD ( 16.43 )", "X-Spam-Score": "-4.2 (----)", "X-Spam-Report": "SpamAssassin version 3.4.1 on bombadil.infradead.org summary:\n\tContent analysis details: (-4.2 points)\n\tpts rule name description\n\t---- ----------------------\n\t--------------------------------------------------\n\t-2.3 RCVD_IN_DNSWL_MED RBL: Sender listed at http://www.dnswl.org/,\n\tmedium trust [195.135.220.15 listed in list.dnswl.org]\n\t-0.0 SPF_PASS SPF: sender matches SPF record\n\t-0.0 RP_MATCHES_RCVD Envelope sender domain matches handover relay\n\tdomain\n\t-1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1%\n\t[score: 0.0000]", "X-BeenThere": "linux-arm-kernel@lists.infradead.org", "X-Mailman-Version": "2.1.21", "Precedence": "list", "List-Unsubscribe": "<http://lists.infradead.org/mailman/options/linux-arm-kernel>,\n\t<mailto:linux-arm-kernel-request@lists.infradead.org?subject=unsubscribe>", "List-Archive": "<http://lists.infradead.org/pipermail/linux-arm-kernel/>", "List-Post": "<mailto:linux-arm-kernel@lists.infradead.org>", "List-Help": "<mailto:linux-arm-kernel-request@lists.infradead.org?subject=help>", "List-Subscribe": "<http://lists.infradead.org/mailman/listinfo/linux-arm-kernel>,\n\t<mailto:linux-arm-kernel-request@lists.infradead.org?subject=subscribe>", "Cc": "=?utf-8?b?6JKL5Li955C0?= <jiang.liqin@geniatech.com>,\n\tlinux-kernel@vger.kernel.org, =?utf-8?q?Andreas_F=C3=A4rber?=\n\t<afaerber@suse.de>, Roc He <hepeng@zidoo.tv>", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "base64", "Sender": "\"linux-arm-kernel\" <linux-arm-kernel-bounces@lists.infradead.org>", "Errors-To": "linux-arm-kernel-bounces+incoming-imx=patchwork.ozlabs.org@lists.infradead.org", "List-Id": "linux-imx-kernel.lists.patchwork.ozlabs.org" }, "content": "This irq mux driver is derived from the RTD1295 vendor DT and assumes a\nlinear mapping between intr_en and intr_status registers.\nCode for RTD119x indicates this may not always be the case (i2c_3).\n\nBased in part on QNAP's arch/arm/mach-rtk119x/rtk_irq_mux.c code.\n\nSigned-off-by: Andreas Färber <afaerber@suse.de>\n---\n v1 -> v2:\n * Renamed struct fields to avoid ambiguity (Marc)\n * Refactored offset lookup to avoid per-compatible init functions\n * Inserted white lines to clarify balanced locking (Marc)\n * Dropped forwarding of set_affinity to GIC (Marc)\n * Added spinlocks for consistency (Marc)\n * Limited initialization quirk to iso mux\n * Fixed spinlock initialization (Andrew)\n \n drivers/irqchip/Makefile | 1 +\n drivers/irqchip/irq-rtd119x-mux.c | 204 ++++++++++++++++++++++++++++++++++++++\n 2 files changed, 205 insertions(+)\n create mode 100644 drivers/irqchip/irq-rtd119x-mux.c", "diff": "diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile\nindex e88d856cc09c..46202a0b7d96 100644\n--- a/drivers/irqchip/Makefile\n+++ b/drivers/irqchip/Makefile\n@@ -78,3 +78,4 @@ obj-$(CONFIG_EZNPS_GIC)\t\t\t+= irq-eznps.o\n obj-$(CONFIG_ARCH_ASPEED)\t\t+= irq-aspeed-vic.o irq-aspeed-i2c-ic.o\n obj-$(CONFIG_STM32_EXTI) \t\t+= irq-stm32-exti.o\n obj-$(CONFIG_QCOM_IRQ_COMBINER)\t\t+= qcom-irq-combiner.o\n+obj-$(CONFIG_ARCH_REALTEK)\t\t+= irq-rtd119x-mux.o\ndiff --git a/drivers/irqchip/irq-rtd119x-mux.c b/drivers/irqchip/irq-rtd119x-mux.c\nnew file mode 100644\nindex 000000000000..65d22e163bef\n--- /dev/null\n+++ b/drivers/irqchip/irq-rtd119x-mux.c\n@@ -0,0 +1,204 @@\n+/*\n+ * Realtek RTD129x IRQ mux\n+ *\n+ * Copyright (c) 2017 Andreas Färber\n+ *\n+ * SPDX-License-Identifier: GPL-2.0+\n+ */\n+\n+#include <linux/io.h>\n+#include <linux/irqchip.h>\n+#include <linux/irqchip/chained_irq.h>\n+#include <linux/irqdomain.h>\n+#include <linux/of_address.h>\n+#include <linux/of_irq.h>\n+#include <linux/slab.h>\n+\n+struct rtd119x_irq_mux_info {\n+\tunsigned intr_status_offset;\n+\tunsigned intr_en_offset;\n+};\n+\n+struct rtd119x_irq_mux_data {\n+\tvoid __iomem *intr_status;\n+\tvoid __iomem *intr_en;\n+\tint irq;\n+\tstruct irq_domain *domain;\n+\tspinlock_t lock;\n+};\n+\n+static void rtd119x_mux_irq_handle(struct irq_desc *desc)\n+{\n+\tstruct rtd119x_irq_mux_data *data = irq_desc_get_handler_data(desc);\n+\tstruct irq_chip *chip = irq_desc_get_chip(desc);\n+\tu32 intr_en, intr_status, status;\n+\tint ret;\n+\n+\tchained_irq_enter(chip, desc);\n+\n+\tspin_lock(&data->lock);\n+\tintr_en = readl(data->intr_en);\n+\tintr_status = readl(data->intr_status);\n+\tspin_unlock(&data->lock);\n+\n+\tstatus = intr_status & intr_en;\n+\tif (status != 0) {\n+\t\tunsigned irq = __ffs(status);\n+\t\tret = generic_handle_irq(irq_find_mapping(data->domain, irq));\n+\t\tif (ret == 0) {\n+\t\t\tspin_lock(&data->lock);\n+\n+\t\t\tintr_status = readl(data->intr_status);\n+\t\t\tintr_status |= BIT(irq - 1);\n+\t\t\twritel(intr_status, data->intr_status);\n+\n+\t\t\tspin_unlock(&data->lock);\n+\t\t}\n+\t}\n+\n+\tchained_irq_exit(chip, desc);\n+}\n+\n+static void rtd119x_mux_mask_irq(struct irq_data *data)\n+{\n+\tstruct rtd119x_irq_mux_data *mux_data = irq_data_get_irq_chip_data(data);\n+\tu32 intr_status;\n+\n+\tspin_lock(&mux_data->lock);\n+\n+\tintr_status = readl(mux_data->intr_status);\n+\tintr_status |= BIT(data->hwirq);\n+\twritel(intr_status, mux_data->intr_status);\n+\n+\tspin_unlock(&mux_data->lock);\n+}\n+\n+static void rtd119x_mux_unmask_irq(struct irq_data *data)\n+{\n+\tstruct rtd119x_irq_mux_data *mux_data = irq_data_get_irq_chip_data(data);\n+\tu32 intr_en;\n+\n+\tspin_lock(&mux_data->lock);\n+\n+\tintr_en = readl(mux_data->intr_en);\n+\tintr_en |= BIT(data->hwirq);\n+\twritel(intr_en, mux_data->intr_en);\n+\n+\tspin_unlock(&mux_data->lock);\n+}\n+\n+static int rtd119x_mux_set_affinity(struct irq_data *d,\n+\t\t\tconst struct cpumask *mask_val, bool force)\n+{\n+\t/* Forwarding the affinity to the parent would affect all 32 interrupts. */\n+\treturn -EINVAL;\n+}\n+\n+static struct irq_chip rtd119x_mux_irq_chip = {\n+\t.name\t\t\t= \"rtd119x-mux\",\n+\t.irq_mask\t\t= rtd119x_mux_mask_irq,\n+\t.irq_unmask\t\t= rtd119x_mux_unmask_irq,\n+\t.irq_set_affinity\t= rtd119x_mux_set_affinity,\n+};\n+\n+static int rtd119x_mux_irq_domain_map(struct irq_domain *d,\n+\t\tunsigned int irq, irq_hw_number_t hw)\n+{\n+\tstruct rtd119x_irq_mux_data *data = d->host_data;\n+\n+\tirq_set_chip_and_handler(irq, &rtd119x_mux_irq_chip, handle_level_irq);\n+\tirq_set_chip_data(irq, data);\n+\tirq_set_probe(irq);\n+\n+\treturn 0;\n+}\n+\n+static struct irq_domain_ops rtd119x_mux_irq_domain_ops = {\n+\t.xlate\t= irq_domain_xlate_onecell,\n+\t.map\t= rtd119x_mux_irq_domain_map,\n+};\n+\n+static const struct rtd119x_irq_mux_info rtd1295_iso_irq_mux_info = {\n+\t.intr_status_offset\t= 0x0,\n+\t.intr_en_offset\t\t= 0x40,\n+};\n+\n+static const struct rtd119x_irq_mux_info rtd1295_irq_mux_info = {\n+\t.intr_status_offset\t= 0xc,\n+\t.intr_en_offset\t\t= 0x80,\n+};\n+\n+static const struct of_device_id rtd1295_irq_mux_dt_matches[] = {\n+\t{\n+\t\t.compatible = \"realtek,rtd1295-iso-irq-mux\",\n+\t\t.data = &rtd1295_iso_irq_mux_info,\n+\t}, {\n+\t\t.compatible = \"realtek,rtd1295-irq-mux\",\n+\t\t.data = &rtd1295_irq_mux_info,\n+\t}, {\n+\t}\n+};\n+\n+static int __init rtd119x_irq_mux_init(struct device_node *node,\n+\t\t\t\t struct device_node *parent)\n+{\n+\tstruct rtd119x_irq_mux_data *data;\n+\tconst struct of_device_id *match;\n+\tconst struct rtd119x_irq_mux_info *info;\n+\tvoid __iomem *base;\n+\tu32 val;\n+\n+\tmatch = of_match_node(rtd1295_irq_mux_dt_matches, node);\n+\tif (!match)\n+\t\treturn -EINVAL;\n+\n+\tinfo = match->data;\n+\tif (!info)\n+\t\treturn -EINVAL;\n+\n+\tbase = of_iomap(node, 0);\n+\tif (IS_ERR(base))\n+\t\treturn PTR_ERR(base);\n+\n+\tdata = kzalloc(sizeof(*data), GFP_KERNEL);\n+\tif (!data)\n+\t\treturn -ENOMEM;\n+\n+\tdata->intr_status = base + info->intr_status_offset;\n+\tdata->intr_en = base + info->intr_en_offset;\n+\n+\tdata->irq = irq_of_parse_and_map(node, 0);\n+\tif (data->irq <= 0) {\n+\t\tkfree(data);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tspin_lock_init(&data->lock);\n+\n+\tdata->domain = irq_domain_add_linear(node, 32,\n+\t\t\t\t&rtd119x_mux_irq_domain_ops, data);\n+\tif (!data->domain) {\n+\t\tkfree(data);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tif (of_device_is_compatible(node, \"realtek,rtd1295-iso-irq-mux\")) {\n+\t\tconst int uart0_irq = 2;\n+\n+\t\tspin_lock(&data->lock);\n+\n+\t\tval = readl(data->intr_en);\n+\t\tval &= ~BIT(uart0_irq);\n+\t\twritel(val, data->intr_en);\n+\n+\t\twritel(BIT(uart0_irq), data->intr_status);\n+\n+\t\tspin_unlock(&data->lock);\n+\t}\n+\n+\tirq_set_chained_handler_and_data(data->irq, rtd119x_mux_irq_handle, data);\n+\n+\treturn 0;\n+}\n+IRQCHIP_DECLARE(rtd1295_iso_mux, \"realtek,rtd1295-iso-irq-mux\", rtd119x_irq_mux_init);\n+IRQCHIP_DECLARE(rtd1295_mux, \"realtek,rtd1295-irq-mux\", rtd119x_irq_mux_init);\n", "prefixes": [ "v2", "2/3" ] }