Received: by 10.192.165.148 with SMTP id m20csp3096233imm; Mon, 7 May 2018 06:37:53 -0700 (PDT) X-Google-Smtp-Source: AB8JxZoMT9CnAy3OHQq4dMw5zvUaFiYN0JwJcrhD2h4qsfBSe9tJ/+KwkPxGCgAtxRkrKEZuF6qO X-Received: by 2002:a17:902:598d:: with SMTP id p13-v6mr38283140pli.191.1525700273579; Mon, 07 May 2018 06:37:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525700273; cv=none; d=google.com; s=arc-20160816; b=kTw50QOzdxIGuPi63/Ln9tz2rmxEVicNZd/nN4VnTWwxnQ+VBvBj9FfxOhV9UMlfRS 9Nwnevs+arqMKO1dioSSFMFX1Z5FFPqzo6ZvRgbf6qDO2I3EhsZJrQfJh6rNEo+2uIMH XtZK1GUViiU9T3pOzhF3NM4KI5cETqdYnwTDTFr39iynYcisKbGL59alyuTgMHDC8Nm/ P+wc0+kZAuoDV2m7AstOc/SZrBZfGacu/iXHuxGzukuvQim9fq9Y8enFy6zhAEBcOByO ERa/bVPRCdprpH+s4yYkXJZd3acEpFmh+8J2uFeYLUF3LRtkqF0gK0NnGIJuljh1tcE5 M1Gw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :arc-authentication-results; bh=2W9cI2IFYwI4eD0qnyNjB7eYBx3aMEUhgblLUV0j6KM=; b=ZlCtS/g2PI/n8Zj4hg13naoDpq6sOtYMzgqbdzJNO5iX7xwm6AzKhcvolm8XwNbEuS cjMceiuYEQ3s2+Q5Loyr+pXce9Om7boB0lZ1YDAzFOYopLmKbjgQxHeYxZlgE9EfyZ1T zIayyCl9QBI+PKxkGp1wndgOBxS2bJ53Jy1kmiBokn2HheomY2vwvIYOXEm0pCLVz7H2 iTRGTFh9IH2TERlNPLjKrerg/PF9WGJKZ7tSP9tGwKhSCJiVLIzAaWwdaBVI7KIehuuV grzmX5PQt6mHtoUiND5wLyl+a9VdKuUvlhO5Lwjig8mL5/yCU//xTvv7FPsQC7PI8Db2 fSOQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t3-v6si17853887pgf.356.2018.05.07.06.37.38; Mon, 07 May 2018 06:37:53 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752101AbeEGNh1 (ORCPT + 99 others); Mon, 7 May 2018 09:37:27 -0400 Received: from nbd.name ([46.4.11.11]:48184 "EHLO nbd.name" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750732AbeEGNh0 (ORCPT ); Mon, 7 May 2018 09:37:26 -0400 From: John Crispin To: Thomas Gleixner , Jason Cooper , Marc Zyngier Cc: linux-kernel@vger.kernel.org, linux-mips@linux-mips.org, John Crispin Subject: [PATCH] irqchip/irq-ath79-intc: add irq cascade driver for QCA9556 SoCs Date: Mon, 7 May 2018 15:37:14 +0200 Message-Id: <20180507133714.17384-1-john@phrozen.org> X-Mailer: git-send-email 2.11.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The QCA ATH79 MIPS target is being converted to pure OF. Right now the platform code will setup the IRQ cascade found on the QCA9556 and newer SoCs and uses fixed IRQ numbers for the peripherals attached to the cascade. This patch adds a proper driver based on the code previously located inside arch/mips/ath79/irq.c. Signed-off-by: John Crispin --- drivers/irqchip/Makefile | 1 + drivers/irqchip/irq-ath79-intc.c | 108 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 drivers/irqchip/irq-ath79-intc.c diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile index d27e3e3619e0..f63c94a92e25 100644 --- a/drivers/irqchip/Makefile +++ b/drivers/irqchip/Makefile @@ -3,6 +3,7 @@ obj-$(CONFIG_IRQCHIP) += irqchip.o obj-$(CONFIG_ALPINE_MSI) += irq-alpine-msi.o obj-$(CONFIG_ATH79) += irq-ath79-cpu.o +obj-$(CONFIG_ATH79) += irq-ath79-intc.o obj-$(CONFIG_ATH79) += irq-ath79-misc.o obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2835.o obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2836.o diff --git a/drivers/irqchip/irq-ath79-intc.c b/drivers/irqchip/irq-ath79-intc.c new file mode 100644 index 000000000000..ba15b1ac98b3 --- /dev/null +++ b/drivers/irqchip/irq-ath79-intc.c @@ -0,0 +1,108 @@ +/* + * Atheros QCA955X specific interrupt cascade handling + * + * Copyright (C) 2018 John Crispin + * + * 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 + +#define ATH79_MAX_INTC_CASCADE 3 + +struct ath79_intc { + struct irq_chip chip; + u32 irq; + u32 pending_mask; + u32 irq_mask[ATH79_MAX_INTC_CASCADE]; +}; + +static void ath79_intc_irq_handler(struct irq_desc *desc) +{ + struct irq_domain *domain = irq_desc_get_handler_data(desc); + struct ath79_intc *intc = domain->host_data; + u32 pending; + + pending = ath79_reset_rr(QCA955X_RESET_REG_EXT_INT_STATUS); + pending &= intc->pending_mask; + + if (pending) { + int i; + + for (i = 0; i < domain->hwirq_max; i++) + if (pending & intc->irq_mask[i]) + generic_handle_irq(irq_find_mapping(domain, i)); + } else { + spurious_interrupt(); + } +} + +static void ath79_intc_irq_unmask(struct irq_data *d) +{ +} + +static void ath79_intc_irq_mask(struct irq_data *d) +{ +} + +static int ath79_intc_map(struct irq_domain *d, unsigned int irq, + irq_hw_number_t hw) +{ + struct ath79_intc *intc = d->host_data; + + irq_set_chip_and_handler(irq, &intc->chip, handle_level_irq); + + return 0; +} + +static const struct irq_domain_ops ath79_irq_domain_ops = { + .xlate = irq_domain_xlate_onecell, + .map = ath79_intc_map, +}; + +static int __init qca9556_intc_of_init( + struct device_node *node, struct device_node *parent) +{ + struct irq_domain *domain; + struct ath79_intc *intc; + int cnt, i; + + cnt = of_property_count_u32_elems(node, "qcom,pending-bits"); + if (cnt > ATH79_MAX_INTC_CASCADE) + panic("Too many INTC pending bits\n"); + + intc = kzalloc(sizeof(*intc), GFP_KERNEL); + if (!intc) + panic("Failed to allocate INTC memory\n"); + intc->chip.name = "INTC"; + intc->chip.irq_unmask = ath79_intc_irq_unmask, + intc->chip.irq_mask = ath79_intc_irq_mask, + + of_property_read_u32_array(node, "qcom,pending-bits", intc->irq_mask, + cnt); + for (i = 0; i < cnt; i++) + intc->pending_mask |= intc->irq_mask[i]; + + intc->irq = irq_of_parse_and_map(node, 0); + if (!intc->irq) + panic("Failed to get INTC IRQ"); + + domain = irq_domain_add_linear(node, cnt, &ath79_irq_domain_ops, + intc); + irq_set_chained_handler_and_data(intc->irq, ath79_intc_irq_handler, + domain); + + return 0; +} +IRQCHIP_DECLARE(qca9556_intc, "qcom,qca9556-intc", + qca9556_intc_of_init); -- 2.11.0