From patchwork Tue Feb 28 21:46:06 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Lezcano X-Patchwork-Id: 6979 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 9798023E4A for ; Tue, 28 Feb 2012 21:46:17 +0000 (UTC) Received: from mail-iy0-f180.google.com (mail-iy0-f180.google.com [209.85.210.180]) by fiordland.canonical.com (Postfix) with ESMTP id 59655A1802B for ; Tue, 28 Feb 2012 21:46:17 +0000 (UTC) Received: by mail-iy0-f180.google.com with SMTP id e36so2021488iag.11 for ; Tue, 28 Feb 2012 13:46:17 -0800 (PST) Received: from mr.google.com ([10.50.12.170]) by 10.50.12.170 with SMTP id z10mr4455560igb.55.1330465577205 (num_hops = 1); Tue, 28 Feb 2012 13:46:17 -0800 (PST) Received: by 10.50.12.170 with SMTP id z10mr3691548igb.55.1330465577142; Tue, 28 Feb 2012 13:46:17 -0800 (PST) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.231.11.10 with SMTP id r10csp17713ibr; Tue, 28 Feb 2012 13:46:16 -0800 (PST) Received: by 10.180.24.7 with SMTP id q7mr33933585wif.14.1330465575550; Tue, 28 Feb 2012 13:46:15 -0800 (PST) Received: from mail-wi0-f178.google.com (mail-wi0-f178.google.com [209.85.212.178]) by mx.google.com with ESMTPS id cy9si14253877wib.43.2012.02.28.13.46.15 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 28 Feb 2012 13:46:15 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of mail-wi0-f178.google.com designates 209.85.212.178 as permitted sender) client-ip=209.85.212.178; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of mail-wi0-f178.google.com designates 209.85.212.178 as permitted sender) smtp.mail= Received: by wibhm14 with SMTP id hm14so5108357wib.37 for ; Tue, 28 Feb 2012 13:46:15 -0800 (PST) Received-SPF: pass (google.com: domain of designates 10.180.90.212 as permitted sender) client-ip=10.180.90.212; Received: from mr.google.com ([10.180.90.212]) by 10.180.90.212 with SMTP id by20mr42740229wib.12.1330465575141 (num_hops = 1); Tue, 28 Feb 2012 13:46:15 -0800 (PST) MIME-Version: 1.0 Received: by 10.180.90.212 with SMTP id by20mr33952387wib.12.1330465575060; Tue, 28 Feb 2012 13:46:15 -0800 (PST) Received: from localhost.localdomain (AToulouse-159-1-63-219.w92-134.abo.wanadoo.fr. [92.134.214.219]) by mx.google.com with ESMTPS id dw7sm31483074wib.4.2012.02.28.13.46.13 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 28 Feb 2012 13:46:14 -0800 (PST) From: daniel.lezcano@linaro.org To: sameo@linux.intel.com Cc: linus.walleij@stericsson.com, linux-arm-kernel@lists.infradead.org, rickard.andersson@stericsson.com, patches@linaro.org, linaro-dev@lists.linaro.org Subject: [PATCH 2/5] mfd : ux500 - check there are pending irq on the gic Date: Tue, 28 Feb 2012 22:46:06 +0100 Message-Id: <1330465569-567-2-git-send-email-daniel.lezcano@linaro.org> X-Mailer: git-send-email 1.7.5.4 In-Reply-To: <1330465569-567-1-git-send-email-daniel.lezcano@linaro.org> References: <1330465569-567-1-git-send-email-daniel.lezcano@linaro.org> X-Gm-Message-State: ALoCoQkQWoIP8bnMkXfKYWBc3S4aOLEQDxMtx+3TEA0lDyYv8m3m1Ybr57EhiS7QNAIuI02MOozb From: Daniel Lezcano This patch introduces a routine to check if there are some irqs pending on the gic. Usually this check is not relevant because it appears racy (an irq can arrive right after this check), but in the ux500 it makes sense because the prcmu decouples the gic from the A9 cores. Signed-off-by: Daniel Lezcano --- drivers/mfd/db8500-prcmu.c | 33 +++++++++++++++++++++++++++++++++ include/linux/mfd/db8500-prcmu.h | 1 + include/linux/mfd/dbx500-prcmu.h | 8 ++++++++ 3 files changed, 42 insertions(+), 0 deletions(-) diff --git a/drivers/mfd/db8500-prcmu.c b/drivers/mfd/db8500-prcmu.c index d2244dc..8346a0e 100644 --- a/drivers/mfd/db8500-prcmu.c +++ b/drivers/mfd/db8500-prcmu.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -850,6 +851,38 @@ int db8500_prcmu_gic_recouple(void) return 0; } +#define PRCMU_GIC_NUMBER_REGS 5 + +/* + * This function checks if there are pending irq on the gic. It only + * makes sense if the gic has been decoupled before with the + * db8500_prcmu_gic_decouple function. Disabling an interrupt only + * disables the forwarding of the interrupt to any CPU interface. It + * does not prevent the interrupt from changing state, for example + * becoming pending, or active and pending if it is already + * active. Hence, we have to check the interrupt is pending *and* is + * active. + */ +bool db8500_prcmu_gic_pending_irq(void) +{ + u32 pr; /* Pending register */ + u32 er; /* Enable register */ + void __iomem *dist_base = __io_address(U8500_GIC_DIST_BASE); + int i; + + /* 5 registers. STI & PPI not skipped */ + for (i = 0; i < PRCMU_GIC_NUMBER_REGS; i++) { + + pr = readl_relaxed(dist_base + GIC_DIST_PENDING_SET + i * 4); + er = readl_relaxed(dist_base + GIC_DIST_ENABLE_SET + i * 4); + + if (pr & er) + return true; /* There is a pending interrupt */ + } + + return false; +} + /* This function should only be called while mb0_transfer.lock is held. */ static void config_wakeups(void) { diff --git a/include/linux/mfd/db8500-prcmu.h b/include/linux/mfd/db8500-prcmu.h index cf48aa76..92dac13 100644 --- a/include/linux/mfd/db8500-prcmu.h +++ b/include/linux/mfd/db8500-prcmu.h @@ -582,6 +582,7 @@ int db8500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, bool keep_ap_pll); u8 db8500_prcmu_get_power_state_result(void); int db8500_prcmu_gic_decouple(void); int db8500_prcmu_gic_recouple(void); +bool db8500_prcmu_gic_pending_irq(void); void db8500_prcmu_enable_wakeups(u32 wakeups); int db8500_prcmu_set_epod(u16 epod_id, u8 epod_state); int db8500_prcmu_request_clock(u8 clock, bool enable); diff --git a/include/linux/mfd/dbx500-prcmu.h b/include/linux/mfd/dbx500-prcmu.h index 5bf5c4f..1641874 100644 --- a/include/linux/mfd/dbx500-prcmu.h +++ b/include/linux/mfd/dbx500-prcmu.h @@ -297,6 +297,14 @@ static inline int prcmu_gic_recouple(void) return db8500_prcmu_gic_recouple(); } +static inline bool prcmu_gic_pending_irq(void) +{ + if (cpu_is_u5500()) + return -EINVAL; + else + return db8500_prcmu_gic_pending_irq(); +} + static inline int prcmu_set_epod(u16 epod_id, u8 epod_state) { if (cpu_is_u5500())