Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1734583

[PATCH v4 2/3] irqchip: brcmstb-l2: Abstract register accesses

Path csiph.com!news.mixmin.net!aioe.org!bofh.it!news.nic.it!robomod
From Doug Berger <opendmb@gmail.com>
Newsgroups linux.kernel
Subject [PATCH v4 2/3] irqchip: brcmstb-l2: Abstract register accesses
Date Tue, 19 Sep 2017 03:10:02 +0200
Message-ID <urfd0-5PD-17@gated-at.bofh.it> (permalink)
References <urfcZ-5PD-3@gated-at.bofh.it>
Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=IbrrHQz/cgm55gwVaBLNYq1yvs0GincIzQiqR0hbpmQ=; b=Tsp6jTR+VS2Lznx1eLtkqULS3KKETeCld+LEhdiOQpnlsNMf3QQqC2bQRchVNPwnEs GKGfxBLpbbI4andm06wF6D5Hlyk72FG3KA9Pt7xd8aiYOfyDpg/ud631FlsnivI1Aowu 0/oC98yNdGLzJDgVq9r9EgphyHKgAx5X84BGIcAPIo8rVsWQRJMh7vaPiVXbK+W+Uoce C1MPxqA/NxYyOLWHvmrrylCBOpeohcq1d6TAGmnmYRjqaphgmgRrwL8E/OB2n0KiUGB5 rxMgY6CK/J+KUVQ4JPwzgGwcql7YlLTKBZjpt8bqu98ml+54x12Sv9TPBIGWrV4gVdzN H1Dw==
X-Google-Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=IbrrHQz/cgm55gwVaBLNYq1yvs0GincIzQiqR0hbpmQ=; b=NVZeMNtqU8m05fOAWp+0lhZJUHkSop4Ekd7DKXi7naQbYgD8CysFVQ/rKA5nqLwsND gyxKJUuGSIGhkZfnVQmhS+HEmp87vVjNpUN5XJq/Ir2sji0WuLxQfZXsO2YRw8Y2pWDY W6KbVSwy2tNgJi2jjvBQmcjYEQRqq+Qr1TBSQj31/s5u6ZmrqHVYq3/ck3pBqvRjgIeF zYJbaYWH95rmP+a6HJbiPNI/m5yUBs8zvtH3tI1CUCqB/HlTEuMGG4kW+AYbjuhRpCNb Sm46XTuGDmOE6W3ad7oN/w/IrNbSpDj0+t0eHpW9iVyzq7ASgxGt0o8buhlEOCp9U6Au bobg==
X-Gm-Message-State AHPjjUjS6pet1PUuBb4afSFavcMtOUmxRcRFkzFZ29E4OhyexlZP43/K ZyJ8r/ajRNon+Q==
X-Google-SMTP-Source AOwi7QAucKF37OzgjdrSbq1iWpzQCmuqOQgnfdgAam+hN0PqEM/f/DxpACOKFRtVcXt8TlgqQ+Mfbg==
X-Received by 10.237.39.7 with SMTP id n7mr51267531qtd.124.1505782822049; Mon, 18 Sep 2017 18:00:22 -0700 (PDT)
X-Mailer git-send-email 2.14.1
Sender robomod@news.nic.it
List-ID <linux-kernel.vger.kernel.org>
X-Mailing-List linux-kernel@vger.kernel.org
Approved robomod@news.nic.it
Lines 103
Organization linux.* mail to news gateway
X-Original-Cc Doug Berger <opendmb@gmail.com>, Jason Cooper <jason@lakedaemon.net>, Marc Zyngier <marc.zyngier@arm.com>, Rob Herring <robh+dt@kernel.org>, Mark Rutland <mark.rutland@arm.com>, Kevin Cernekee <cernekee@gmail.com>, Florian Fainelli <f.fainelli@gmail.com>, Brian Norris <computersforpeace@gmail.com>, Gregory Fong <gregory.0xf0@gmail.com>, bcm-kernel-feedback-list@broadcom.com, Marc Gonzalez <marc_gonzalez@sigmadesigns.com>, Mans Rullgard <mans@mansr.com>, Mason <slash.tmp@free.fr>, Bartosz Golaszewski <brgl@bgdev.pl>, Sebastian Frias <sf84@laposte.net>, Boris Brezillon <boris.brezillon@free-electrons.com>, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-mips@linux-mips.org, linux-arm-kernel@lists.infradead.org
X-Original-Date Mon, 18 Sep 2017 17:59:59 -0700
X-Original-Message-ID <20170919010000.32072-3-opendmb@gmail.com>
X-Original-References <20170919010000.32072-1-opendmb@gmail.com>
X-Original-Sender linux-kernel-owner@vger.kernel.org
Xref csiph.com linux.kernel:1734583

Show key headers only | View raw


Added register block offsets to the brcmstb_l2_intc_data structure
for the status and mask registers to support reading the active
interupts in an abstracted way.  It seems like an irq_chip method
should have been provided for this, but it's not there yet.

Abstracted the implementation of the handler, suspend, and resume
functions to not use any hard coded register offsets.

Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Doug Berger <opendmb@gmail.com>
---
 drivers/irqchip/irq-brcmstb-l2.c | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/drivers/irqchip/irq-brcmstb-l2.c b/drivers/irqchip/irq-brcmstb-l2.c
index 48bd1a36c7d4..8d54cd7a090d 100644
--- a/drivers/irqchip/irq-brcmstb-l2.c
+++ b/drivers/irqchip/irq-brcmstb-l2.c
@@ -43,6 +43,8 @@
 struct brcmstb_l2_intc_data {
 	struct irq_domain *domain;
 	struct irq_chip_generic *gc;
+	int status_offset;
+	int mask_offset;
 	bool can_wake;
 	u32 saved_mask; /* for suspend/resume */
 };
@@ -82,8 +84,8 @@ static void brcmstb_l2_intc_irq_handle(struct irq_desc *desc)
 
 	chained_irq_enter(chip, desc);
 
-	status = irq_reg_readl(b->gc, CPU_STATUS) &
-		~(irq_reg_readl(b->gc, CPU_MASK_STATUS));
+	status = irq_reg_readl(b->gc, b->status_offset) &
+		~(irq_reg_readl(b->gc, b->mask_offset));
 
 	if (status == 0) {
 		raw_spin_lock(&desc->lock);
@@ -104,16 +106,17 @@ static void brcmstb_l2_intc_irq_handle(struct irq_desc *desc)
 static void brcmstb_l2_intc_suspend(struct irq_data *d)
 {
 	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
+	struct irq_chip_type *ct = irq_data_get_chip_type(d);
 	struct brcmstb_l2_intc_data *b = gc->private;
 
 	irq_gc_lock(gc);
 	/* Save the current mask */
-	b->saved_mask = irq_reg_readl(gc, CPU_MASK_STATUS);
+	b->saved_mask = irq_reg_readl(gc, ct->regs.mask);
 
 	if (b->can_wake) {
 		/* Program the wakeup mask */
-		irq_reg_writel(gc, ~gc->wake_active, CPU_MASK_SET);
-		irq_reg_writel(gc, gc->wake_active, CPU_MASK_CLEAR);
+		irq_reg_writel(gc, ~gc->wake_active, ct->regs.disable);
+		irq_reg_writel(gc, gc->wake_active, ct->regs.enable);
 	}
 	irq_gc_unlock(gc);
 }
@@ -121,15 +124,19 @@ static void brcmstb_l2_intc_suspend(struct irq_data *d)
 static void brcmstb_l2_intc_resume(struct irq_data *d)
 {
 	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
+	struct irq_chip_type *ct = irq_data_get_chip_type(d);
 	struct brcmstb_l2_intc_data *b = gc->private;
 
 	irq_gc_lock(gc);
-	/* Clear unmasked non-wakeup interrupts */
-	irq_reg_writel(gc, ~b->saved_mask & ~gc->wake_active, CPU_CLEAR);
+	if (ct->chip.irq_ack != irq_gc_noop) {
+		/* Clear unmasked non-wakeup interrupts */
+		irq_reg_writel(gc, ~b->saved_mask & ~gc->wake_active,
+				ct->regs.ack);
+	}
 
 	/* Restore the saved mask */
-	irq_reg_writel(gc, b->saved_mask, CPU_MASK_SET);
-	irq_reg_writel(gc, ~b->saved_mask, CPU_MASK_CLEAR);
+	irq_reg_writel(gc, b->saved_mask, ct->regs.disable);
+	irq_reg_writel(gc, ~b->saved_mask, ct->regs.enable);
 	irq_gc_unlock(gc);
 }
 
@@ -199,6 +206,9 @@ static int __init brcmstb_l2_intc_of_init(struct device_node *np,
 	data->gc = irq_get_domain_generic_chip(data->domain, 0);
 	data->gc->reg_base = base;
 	data->gc->private = data;
+	data->status_offset = CPU_STATUS;
+	data->mask_offset = CPU_MASK_STATUS;
+
 	ct = data->gc->chip_types;
 
 	ct->chip.irq_ack = irq_gc_ack_set_bit;
@@ -207,6 +217,7 @@ static int __init brcmstb_l2_intc_of_init(struct device_node *np,
 	ct->chip.irq_mask = irq_gc_mask_disable_reg;
 	ct->chip.irq_mask_ack = brcmstb_l2_mask_and_ack;
 	ct->regs.disable = CPU_MASK_SET;
+	ct->regs.mask = CPU_MASK_STATUS;
 
 	ct->chip.irq_unmask = irq_gc_unmask_enable_reg;
 	ct->regs.enable = CPU_MASK_CLEAR;
-- 
2.14.1

Back to linux.kernel | Previous | Next | Find similar | Unroll thread


Thread

[PATCH v4 2/3] irqchip: brcmstb-l2: Abstract register accesses Doug Berger <opendmb@gmail.com> - 2017-09-19 03:10 +0200

csiph-web