Received: by 2002:a25:c593:0:0:0:0:0 with SMTP id v141csp3866010ybe; Mon, 16 Sep 2019 02:41:08 -0700 (PDT) X-Google-Smtp-Source: APXvYqwYDEQF5ftJq9AJUTvCL6GwVbK194QSxt3ya6D8PcNeNZAhOPn63Hd4X7hUs2hkSokcPpys X-Received: by 2002:a17:907:10c2:: with SMTP id rv2mr49390217ejb.305.1568626868529; Mon, 16 Sep 2019 02:41:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1568626868; cv=none; d=google.com; s=arc-20160816; b=qO/tlxlyLlM48M3gIxcu3rTv2pb/8jKkTslLZMZ+nLsnkj3nB/v74JiwroOubQQ/2M O7HksROL4px9mN3McU8F6q3D6DnO/7ujR/96itR8Do8LkbCUKqHorYzmcvnkaF6fHSjL UwShD6N/MLw9qA8Distoh9ntMuEOUR9VDQHiIk2fNgB8dHMWS/F4aTmoWvo/tW2fPauH LM1YP/zc7K7dC0iyoHA6F5ogLJW1iaB5wtQlHK4nzyx8MdFJ7llCWva5KpI0jt3zt0sO lN2kUzC4MPjGyXCUtbKnX2h5xorriYwl34xjSGJynbFRvmi/HigVI8OhQRzS5psifEvo Lwgg== 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; bh=IBwvL2kUmj/z6nJ0nCb/6osDtOT7bsTHH19VBNFzEKY=; b=yCVgw59BgeL7Olw3w45GDAxs5aW6K/Sc1Nzr8iurB3X3hybx0KrkRPuAHuXucndSBU +k//JbIAFV+fwX7HWShF2QnnlxLYOAOogAtGhyzI92Fa2RNnKFFMZYQpzcIU/JmacL69 dH3PIJxjTwVSCcpp2g1/3vkMvuVZivTPVjYneN5/jfiz9hk5EhsBhNUte5IYeB7gquLF QmEwq26ua63/oUBLSop7qnOa2ymUXFqAakcE151J7lbgnIJNKRUgkhG/wrMdS52J3B4/ WHZ1ppyqhr4auwzXYk/laKIMLBQPTBjLYDNQqYo/N0Gaw816EtMhPScrYZHJPeQWOzT+ txUw== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id gt10si18665730ejb.282.2019.09.16.02.40.44; Mon, 16 Sep 2019 02:41:08 -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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nxp.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729708AbfIPGIq (ORCPT + 99 others); Mon, 16 Sep 2019 02:08:46 -0400 Received: from inva020.nxp.com ([92.121.34.13]:53098 "EHLO inva020.nxp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729398AbfIPGIp (ORCPT ); Mon, 16 Sep 2019 02:08:45 -0400 Received: from inva020.nxp.com (localhost [127.0.0.1]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 384761A053A; Mon, 16 Sep 2019 08:08:43 +0200 (CEST) Received: from invc005.ap-rdc01.nxp.com (invc005.ap-rdc01.nxp.com [165.114.16.14]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 254F11A0532; Mon, 16 Sep 2019 08:08:38 +0200 (CEST) Received: from titan.ap.freescale.net (TITAN.ap.freescale.net [10.192.208.233]) by invc005.ap-rdc01.nxp.com (Postfix) with ESMTP id A02CD402BF; Mon, 16 Sep 2019 14:08:31 +0800 (SGT) From: Hui Song To: Shawn Guo , Li Yang , Rob Herring , Mark Rutland , Linus Walleij , Bartosz Golaszewski Cc: linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, Song Hui Subject: [PATCH v5] gpio/mpc8xxx: change irq handler from chained to normal Date: Mon, 16 Sep 2019 13:58:17 +0800 Message-Id: <20190916055817.43425-1-hui.song_1@nxp.com> X-Mailer: git-send-email 2.9.5 X-Virus-Scanned: ClamAV using ClamSMTP Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Song Hui More than one gpio controllers can share one interrupt, change the driver to request shared irq. Signed-off-by: Laurentiu Tudor Signed-off-by: Alex Marginean Signed-off-by: Song Hui --- Changes in v5: - add traverse every bit function. Changes in v4: - convert 'pr_err' to 'dev_err'. Changes in v3: - update the patch description. Changes in v2: - delete the compatible of ls1088a. drivers/gpio/gpio-mpc8xxx.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/drivers/gpio/gpio-mpc8xxx.c b/drivers/gpio/gpio-mpc8xxx.c index 16a47de..3a06ca9 100644 --- a/drivers/gpio/gpio-mpc8xxx.c +++ b/drivers/gpio/gpio-mpc8xxx.c @@ -22,6 +22,7 @@ #include #include #include +#include #define MPC8XXX_GPIO_PINS 32 @@ -127,20 +128,20 @@ static int mpc8xxx_gpio_to_irq(struct gpio_chip *gc, unsigned offset) return -ENXIO; } -static void mpc8xxx_gpio_irq_cascade(struct irq_desc *desc) +static irqreturn_t mpc8xxx_gpio_irq_cascade(int irq, void *data) { - struct mpc8xxx_gpio_chip *mpc8xxx_gc = irq_desc_get_handler_data(desc); - struct irq_chip *chip = irq_desc_get_chip(desc); + struct mpc8xxx_gpio_chip *mpc8xxx_gc = (struct mpc8xxx_gpio_chip *)data; struct gpio_chip *gc = &mpc8xxx_gc->gc; unsigned int mask; + int i; mask = gc->read_reg(mpc8xxx_gc->regs + GPIO_IER) & gc->read_reg(mpc8xxx_gc->regs + GPIO_IMR); - if (mask) + for_each_set_bit(i, &mask, 32) generic_handle_irq(irq_linear_revmap(mpc8xxx_gc->irq, - 32 - ffs(mask))); - if (chip->irq_eoi) - chip->irq_eoi(&desc->irq_data); + 31 - i)); + + return IRQ_HANDLED; } static void mpc8xxx_irq_unmask(struct irq_data *d) @@ -388,8 +389,8 @@ static int mpc8xxx_probe(struct platform_device *pdev) ret = gpiochip_add_data(gc, mpc8xxx_gc); if (ret) { - pr_err("%pOF: GPIO chip registration failed with status %d\n", - np, ret); + dev_err(&pdev->dev, "%pOF: GPIO chip registration failed with status %d\n", + np, ret); goto err; } @@ -409,8 +410,15 @@ static int mpc8xxx_probe(struct platform_device *pdev) if (devtype->gpio_dir_in_init) devtype->gpio_dir_in_init(gc); - irq_set_chained_handler_and_data(mpc8xxx_gc->irqn, - mpc8xxx_gpio_irq_cascade, mpc8xxx_gc); + ret = request_irq(mpc8xxx_gc->irqn, mpc8xxx_gpio_irq_cascade, + IRQF_NO_THREAD | IRQF_SHARED, "gpio-cascade", + mpc8xxx_gc); + if (ret) { + dev_err(&pdev->dev, "%s: failed to request_irq(%d), ret = %d\n", + np->full_name, mpc8xxx_gc->irqn, ret); + goto err; + } + return 0; err: iounmap(mpc8xxx_gc->regs); -- 2.9.5