From patchwork Sat Jan 15 01:28:04 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Henk Stegeman X-Patchwork-Id: 79282 X-Patchwork-Delegate: agust@denx.de Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from bilbo.ozlabs.org (localhost [127.0.0.1]) by ozlabs.org (Postfix) with ESMTP id A3A77B7385 for ; Tue, 18 Jan 2011 21:27:10 +1100 (EST) Received: by ozlabs.org (Postfix) id 836F7B70ED; Tue, 18 Jan 2011 21:27:04 +1100 (EST) Delivered-To: linuxppc-dev@ozlabs.org Received: from mail-ey0-f170.google.com (mail-ey0-f170.google.com [209.85.215.170]) (using TLSv1 with cipher RC4-MD5 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority" (verified OK)) by ozlabs.org (Postfix) with ESMTPS id 6CA9BB70EB for ; Tue, 18 Jan 2011 21:27:03 +1100 (EST) Received: by eyf5 with SMTP id 5so4185089eyf.15 for ; Tue, 18 Jan 2011 02:26:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references; bh=sVtbdcVNtIONSDiDfn4AA0lWt+repDcHkJ91rUKO2Sg=; b=qY5yubLxd7jvdYp/Bg0GEaUdSImIITcnX839RDgdYRsBrW8/1zOvEJuXTs3/85EEzR 6dL+R5Ip4LLeH55Nr0nmJ2MCVl8Qypaf+4XerGZ4qXZoLD0XcBf8vGA51RIGyOkuVA3+ KauE+u69XH1uVPHE/AlkB0Hoj3zjF5bMBcAUc= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; b=fQL32PVyCPeAh7vBRcNdURk3zJLl79utXxirKuCIsyBjgJWArY56GaEGRcpJJVhgTJ LH4yRuaIvn4ETse+49t0U6bOeiG6mPEoZnJNaNlc6g9bNYnsxkZX7aQPpixqwEzsHzfx y2IuNyVljqKF8s53UIHiYDEYWzXww2JJhaPjo= Received: by 10.213.113.196 with SMTP id b4mr911636ebq.21.1295346418435; Tue, 18 Jan 2011 02:26:58 -0800 (PST) Received: from localhost ([92.64.222.30]) by mx.google.com with ESMTPS id u1sm4447907eeh.22.2011.01.18.02.26.56 (version=TLSv1/SSLv3 cipher=RC4-MD5); Tue, 18 Jan 2011 02:26:57 -0800 (PST) From: Henk Stegeman To: linuxppc-dev@ozlabs.org grant.likely@secretlab.ca Subject: [PATCH] Fix masking of interrupts for 52xx GPT IRQ. Date: Sat, 15 Jan 2011 02:28:04 +0100 Message-Id: <1295054884-18540-1-git-send-email-henk.stegeman@gmail.com> X-Mailer: git-send-email 1.5.4.3 In-Reply-To: References: Cc: Henk Stegeman X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org When using the GPT as interrupt controller interupts were missing. It turned out the IrqEn bit of the GPT is not a mask bit, but it also disables interrupt generation. This modification masks interrupt one level down the cascade. Note that masking one level down the cascade is only valid here because the GPT as interrupt ontroller only serves one IRQ. Signed-off-by: Henk Stegeman --- arch/powerpc/platforms/52xx/mpc52xx_gpt.c | 25 ++++++++++++++++++++++--- 1 files changed, 22 insertions(+), 3 deletions(-) diff --git a/arch/powerpc/platforms/52xx/mpc52xx_gpt.c b/arch/powerpc/platforms/52xx/mpc52xx_gpt.c index 6f8ebe1..9ae2045 100644 --- a/arch/powerpc/platforms/52xx/mpc52xx_gpt.c +++ b/arch/powerpc/platforms/52xx/mpc52xx_gpt.c @@ -91,7 +91,7 @@ struct mpc52xx_gpt_priv { struct irq_host *irqhost; u32 ipb_freq; u8 wdt_mode; - + int cascade_virq; #if defined(CONFIG_GPIOLIB) struct of_gpio_chip of_gc; #endif @@ -136,18 +136,35 @@ DEFINE_MUTEX(mpc52xx_gpt_list_mutex); static void mpc52xx_gpt_irq_unmask(unsigned int virq) { struct mpc52xx_gpt_priv *gpt = get_irq_chip_data(virq); + + enable_irq(gpt->cascade_virq); + +} + +static void mpc52xx_gpt_irq_mask(unsigned int virq) +{ + struct mpc52xx_gpt_priv *gpt = get_irq_chip_data(virq); + + disable_irq(gpt->cascade_virq); +} + +static void mpc52xx_gpt_irq_enable(unsigned int virq) +{ + struct mpc52xx_gpt_priv *gpt = get_irq_chip_data(virq); unsigned long flags; + dev_dbg(gpt->dev, "%s %d\n", __func__, virq); spin_lock_irqsave(&gpt->lock, flags); setbits32(&gpt->regs->mode, MPC52xx_GPT_MODE_IRQ_EN); spin_unlock_irqrestore(&gpt->lock, flags); } -static void mpc52xx_gpt_irq_mask(unsigned int virq) +static void mpc52xx_gpt_irq_disable(unsigned int virq) { struct mpc52xx_gpt_priv *gpt = get_irq_chip_data(virq); unsigned long flags; + dev_dbg(gpt->dev, "%s %d\n", __func__, virq); spin_lock_irqsave(&gpt->lock, flags); clrbits32(&gpt->regs->mode, MPC52xx_GPT_MODE_IRQ_EN); spin_unlock_irqrestore(&gpt->lock, flags); @@ -184,6 +201,8 @@ static struct irq_chip mpc52xx_gpt_irq_chip = { .name = "MPC52xx GPT", .unmask = mpc52xx_gpt_irq_unmask, .mask = mpc52xx_gpt_irq_mask, + .enable = mpc52xx_gpt_irq_enable, + .disable = mpc52xx_gpt_irq_disable, .ack = mpc52xx_gpt_irq_ack, .set_type = mpc52xx_gpt_irq_set_type, }; @@ -268,7 +287,7 @@ mpc52xx_gpt_irq_setup(struct mpc52xx_gpt_priv *gpt, struct device_node *node) if ((mode & MPC52xx_GPT_MODE_MS_MASK) == 0) out_be32(&gpt->regs->mode, mode | MPC52xx_GPT_MODE_MS_IC); spin_unlock_irqrestore(&gpt->lock, flags); - + gpt->cascade_virq = cascade_virq; dev_dbg(gpt->dev, "%s() complete. virq=%i\n", __func__, cascade_virq); }