From patchwork Wed Nov 20 19:20:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 1198489 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=siemens.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 47JCN262FVz9sPn for ; Thu, 21 Nov 2019 06:25:54 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727415AbfKTTZy (ORCPT ); Wed, 20 Nov 2019 14:25:54 -0500 Received: from goliath.siemens.de ([192.35.17.28]:43211 "EHLO goliath.siemens.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727474AbfKTTZx (ORCPT ); Wed, 20 Nov 2019 14:25:53 -0500 X-Greylist: delayed 325 seconds by postgrey-1.27 at vger.kernel.org; Wed, 20 Nov 2019 14:25:50 EST Received: from mail2.sbs.de (mail2.sbs.de [192.129.41.66]) by goliath.siemens.de (8.15.2/8.15.2) with ESMTPS id xAKJKF28030990 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 20 Nov 2019 20:20:15 +0100 Received: from md1f2u6c.ad001.siemens.net ([139.25.68.37]) by mail2.sbs.de (8.15.2/8.15.2) with ESMTP id xAKJKFQf024611; Wed, 20 Nov 2019 20:20:15 +0100 From: Jan Kiszka To: Andy Shevchenko , Linus Walleij , Bartosz Golaszewski Cc: Linux Kernel Mailing List , linux-gpio@vger.kernel.org, Mika Westerberg , ACPI Devel Maling List , "Rafael J . Wysocki" Subject: [PATCH v3 2/2] gpio: sch: Hook into ACPI SCI handler to catch GPIO edge events Date: Wed, 20 Nov 2019 20:20:14 +0100 Message-Id: X-Mailer: git-send-email 2.16.4 In-Reply-To: References: In-Reply-To: References: Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org From: Jan Kiszka The ACPI description on the Quark platform does not provide the required information to do establish generic handling. Therefore, we need to hook from the driver directly into SCI handler of the ACPI subsystem in order to catch and report GPIO-related events. Validated on the Quark-based IOT2000 platform. Signed-off-by: Jan Kiszka Reviewed-by: Mika Westerberg --- drivers/gpio/gpio-sch.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/gpio/gpio-sch.c b/drivers/gpio/gpio-sch.c index 6a9c5500800c..75c95da145d8 100644 --- a/drivers/gpio/gpio-sch.c +++ b/drivers/gpio/gpio-sch.c @@ -155,6 +155,31 @@ static const struct gpio_chip sch_gpio_chip = { .to_irq = sch_gpio_to_irq, }; +static u32 sch_sci_handler(void *context) +{ + struct sch_gpio *sch = context; + unsigned long core_status, resume_status; + unsigned int resume_gpios, offset; + + core_status = inl(sch->iobase + GTS); + resume_status = inl(sch->iobase + GTS + 0x20); + + if (core_status == 0 && resume_status == 0) + return ACPI_INTERRUPT_NOT_HANDLED; + + for_each_set_bit(offset, &core_status, sch->resume_base) + generic_handle_irq(sch->irq_base + offset); + + resume_gpios = sch->chip.ngpio - sch->resume_base; + for_each_set_bit(offset, &resume_status, resume_gpios) + generic_handle_irq(sch->irq_base + sch->resume_base + offset); + + outl(core_status, sch->iobase + GTS); + outl(resume_status, sch->iobase + GTS + 0x20); + + return ACPI_INTERRUPT_HANDLED; +} + static int sch_irq_type(struct irq_data *d, unsigned int type) { struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); @@ -215,6 +240,7 @@ static int sch_gpio_probe(struct platform_device *pdev) struct irq_chip_type *ct; struct sch_gpio *sch; struct resource *res; + acpi_status status; int irq_base, ret; sch = devm_kzalloc(&pdev->dev, sizeof(*sch), GFP_KERNEL); @@ -303,6 +329,10 @@ static int sch_gpio_probe(struct platform_device *pdev) if (ret) return ret; + status = acpi_install_sci_handler(sch_sci_handler, sch); + if (ACPI_FAILURE(status)) + return -EINVAL; + return 0; }