Received: by 2002:ac0:8c9a:0:0:0:0:0 with SMTP id r26csp5238093ima; Tue, 5 Feb 2019 08:28:23 -0800 (PST) X-Google-Smtp-Source: AHgI3IZ5vb0CTsfGbrSOFeUoTR+vP0n1oVy5UuEnlxT1jviz8q+iI5nM7U0uOnlK2cGgp4ssE+OP X-Received: by 2002:a63:960a:: with SMTP id c10mr5299024pge.106.1549384103360; Tue, 05 Feb 2019 08:28:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549384103; cv=none; d=google.com; s=arc-20160816; b=cAd+IxTOjfG1DlI73gG2ya5GHRv5WRt6B/8JJ4bxDWxvK6WZDUpQIGviv78YXWMd0W NBWBrhNHcbnKlofsLA1PTnKhyUS8a9iYjYC+dY3gS2O2nmRIc5f5OKM2EcZvaQSCpQhC 425XpcNJ12VkgGTzuOWCkuOHspi/aOg9SpPH6YjZVnwWIawA12yUliDyDHBGy/kdGtr/ rULC5PD8ObHS2vBj7gtAZV/0rX3nZ8pgRAPnjpdmHhF4/AiuXVjm8SHrGzvye1ZxczNm h2E/LEVVTQajbyNS9AiY2efseAGwTb2j8c/1wnPq91T6s9XCIWqRuqmPtqjdct/Du5SV AzlQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:content-transfer-encoding :content-language:accept-language:in-reply-to:references:message-id :date:thread-index:thread-topic:subject:cc:to:from:dkim-signature; bh=ONYkPZG6nTYID11Y4qjPUrq+iYk2C0EKc03ZurAndsw=; b=XBLMqAuRqINhHOsYZ37hquv1H1L1rpCzwkbY3SAM+Gwl4PETXxCccf+du6CuPFxSEQ yKFdWRt2Gc4wFn5nWbdRVTzY8sWEsF6RR/ttjgxsRCxOXCD8IBDpu9rn5HfYSt5pifDx P8Rc9HsGIl2tPExXZa2URfvosu9Q8wcllyWhJECyJ+Fa6N4Dl3d3+g3z4XJi3nDp/9NV IpIROJiexp5ZDkSBepOsgyfbtgPfch26Mz21JFQYr2yWZnGQU6Io2Mjr82DzZktItzjw zyS9xHVAGOIsl4GiXX+B8Qu/SPRclFzwZtMAsAjVCJpqRlXaHRns4uzPvUHF7xGnySqJ 0/Yg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@analog.onmicrosoft.com header.s=selector1-analog-com header.b=EeRdbvNv; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 39si3862903plc.153.2019.02.05.08.28.07; Tue, 05 Feb 2019 08:28:23 -0800 (PST) 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; dkim=pass header.i=@analog.onmicrosoft.com header.s=selector1-analog-com header.b=EeRdbvNv; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728762AbfBEP5I (ORCPT + 99 others); Tue, 5 Feb 2019 10:57:08 -0500 Received: from mail-eopbgr780084.outbound.protection.outlook.com ([40.107.78.84]:36317 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726550AbfBEP5H (ORCPT ); Tue, 5 Feb 2019 10:57:07 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.onmicrosoft.com; s=selector1-analog-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ONYkPZG6nTYID11Y4qjPUrq+iYk2C0EKc03ZurAndsw=; b=EeRdbvNv6bwq2ac3AAjNmYoco03djZhHxgT58ho8EAPiMxEfpSGUsl2yhGLZ3Fm8kYXa8o3RiphcpzqUTfgEEjoxooZoj8CzkiN++ejUZMpGUvP3Kka7LQelkcNHnjxt5wvZI1LLv+d8Rez0pJTrHWERYW/GYP7UDwr2Oe21wa0= Received: from BY1PR0301MB0901.namprd03.prod.outlook.com (10.160.195.140) by BY1PR0301MB1319.namprd03.prod.outlook.com (10.161.206.27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1580.20; Tue, 5 Feb 2019 15:57:02 +0000 Received: from BY1PR0301MB0901.namprd03.prod.outlook.com ([fe80::fcbe:8732:1ba9:5036]) by BY1PR0301MB0901.namprd03.prod.outlook.com ([fe80::fcbe:8732:1ba9:5036%5]) with mapi id 15.20.1558.026; Tue, 5 Feb 2019 15:57:02 +0000 From: "Hennerich, Michael" To: Nikolaus Voss , Linus Walleij CC: "linux-gpio@vger.kernel.org" , "linux-kernel@vger.kernel.org" , Nikolaus Voss Subject: RE: [PATCH 2/2] drivers/gpio/gpio-adp5588.c: switch to events system Thread-Topic: [PATCH 2/2] drivers/gpio/gpio-adp5588.c: switch to events system Thread-Index: AQHUvWXkd7oK00JUOkqKtQyho5Jlo6XRWsHw Date: Tue, 5 Feb 2019 15:57:02 +0000 Message-ID: References: <3230ace6f820fccadb51097ae9ba9f5ee247d79b.1549379326.git.nikolaus.voss@loewensteinmedical.de> In-Reply-To: <3230ace6f820fccadb51097ae9ba9f5ee247d79b.1549379326.git.nikolaus.voss@loewensteinmedical.de> Accept-Language: de-DE, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=Michael.Hennerich@analog.com; x-originating-ip: [137.71.226.54] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1;BY1PR0301MB1319;6:31x1uE0WoimCHEUFCHAKddXLOD0B6qi/9imnL6QkBE7gm3aWn/WuQvVlFzYiFEVJXVaJsqqrZvkfxCHLTZ/5q9csrr0lpoxeE2rB3jJXYPGcjzjYG/brf6zr0eGh7M/kdEsrn8Fyuw5sCql1lvTW8ESvsGBXxC4Ck6NwDipv1D9tcWvvCt8/QuYoshx+9eNZzJPQIV3ZkrnFTrdNbBpL2xUzlwzR7LlR1ufjzNjIE+TdEfZngaFaT7mt/bDPKNKbxRmb4wqH8OwqPvyzPtFuC4CTKcF1DzMwgySTjqvoHH7c4KCgJPr2jSZKz9zBpzjpZKn/cqgSOuOEOutUa0nGl3HecsMp+k2TMsgHBTwLbajkTLkLlpEUcmS8kLxEcT11H8t5+yF/Q4iVz9/i1xlev8/NalJOC0xfsncP4xMXRoM1xBc7dSyKohPY8YsL49uj9iL1WJrKXtFB6HWLvuTxsA==;5:o1v7jVs12Eypfz9DRY2OAxJrB+gNxP2tKrd5EmGbEUhM1tqmko5zyRCXlfrDldSTCcemBRI6d6WesxzvVR+ZdFmTvKw92bky09IGIhhiPXVaAbeINjCG6or6sNdkAoX5rtjzBnl6Pt1eJeeZMNftUELS6w6A+F68NGslebseB0FAf0VE7shiiWfuEzMcoLtSs1BQynvBLUadQ3t/8Fi4JA==;7:PlDr9+ueoLBezAg0cPqKYV864aTWFaeBuH3iSu7sRnTfMpfGQPWbMcLnkflIxXyGXl9hcCCPdg0YNCp1FJcYyZRfiWxFALKx4Nnb6ZMLfxpnC/1C2fKnMjIvgqBP78UU8c9Q3kiee0qTlE1bRrr8wA== x-ms-office365-filtering-correlation-id: 22431f17-f333-4fb2-2e33-08d68b8291c4 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600110)(711020)(4605077)(4618075)(2017052603328)(7153060)(7193020);SRVR:BY1PR0301MB1319; x-ms-traffictypediagnostic: BY1PR0301MB1319: x-microsoft-antispam-prvs: x-forefront-prvs: 0939529DE2 x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(136003)(39860400002)(376002)(346002)(396003)(366004)(13464003)(189003)(199004)(76176011)(486006)(7696005)(99286004)(68736007)(256004)(33656002)(53936002)(71190400001)(72206003)(106356001)(4326008)(55016002)(9686003)(478600001)(25786009)(2906002)(66066001)(446003)(26005)(97736004)(6436002)(6506007)(81166006)(316002)(105586002)(110136005)(11346002)(14444005)(305945005)(476003)(81156014)(54906003)(7736002)(8676002)(71200400001)(14454004)(74316002)(102836004)(229853002)(6116002)(3846002)(86362001)(6246003)(186003)(53546011)(8936002);DIR:OUT;SFP:1101;SCL:1;SRVR:BY1PR0301MB1319;H:BY1PR0301MB0901.namprd03.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:1; received-spf: None (protection.outlook.com: analog.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: vu+JJT93QyU7j8oOXJbNUvToukRdJuPU28hCjUPnzrAwZc/xGYAsZQEkc8jWGIAgDxaX0pYU9LtSlyXVBQJBN6wmfHGsAJLGNbdTbFBiPEglbH4qWdd58NyF9ww8NQlAYelongf0SUS0iTQdYKNVuTTRKie9TTAG+GIskKE0eIqXIWZybQC9oQ2rP/2PL5crN4jqGi8gL8Bo3uDo3oW0tlZmud7iRJbkacrysYAweATcTJIcJLrs6aMUFDk08My8aBy+3vhSV+0EOCGbv+6J2Y5TsLnKP6SYz+fA3S0ax5j8RtnBBBhktWfZDr1/Mi179jRJzJbM6qdzow5isRyKUlCn8YpMY4wWMnywFyEIK1WwK/SvUS2y31C0bB+7UH4aiVnhWcPRhl0faTNdNi+AhUXRZ2z364ncrxj/YkWu3sE= Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: analog.com X-MS-Exchange-CrossTenant-Network-Message-Id: 22431f17-f333-4fb2-2e33-08d68b8291c4 X-MS-Exchange-CrossTenant-originalarrivaltime: 05 Feb 2019 15:57:02.4874 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: eaa689b4-8f87-40e0-9c6f-7228de4d754a X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR0301MB1319 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org > -----Original Message----- > From: Nikolaus Voss [mailto:nv@vosn.de] > Sent: Dienstag, 5. Februar 2019 14:31 > To: Hennerich, Michael ; Linus Walleij > Cc: linux-gpio@vger.kernel.org; linux-kernel@vger.kernel.org; Nikolaus Vo= ss > Subject: [PATCH 2/2] drivers/gpio/gpio-adp5588.c: switch to events system >=20 > Interupts were generated using GPIN interrupts of > ADP5588. These interrupts have two important limitations: > 1. Interrupts can only be generated for either rising or > falling edges but not both. > 2. Interrupts are reasserted as long as the interrupt condition > persists (i.e. high or low level on that GPIN). This generates > lots of interrupts unless the event is very short. >=20 > To overcome this, ADP5588 provides an event system which queues > up to 10 events in a buffer. GPIN events are queued whenever the > GPIN is asserted or deasserted. This makes it possible to support > generating GPIN interrupts for both edges and to generate only one > interrupt per state change. > Thus it is possible to chain the gpio-keys driver for some GPIOs. Looks like a viable and much better solution. This already works pretty wel= l for the input driver. I can't test at the moment, but I assume you already did. Well done and thanks for this patch! >=20 > Signed-off-by: Nikolaus Voss Acked-by: Michael Hennerich > --- > drivers/gpio/gpio-adp5588.c | 85 ++++++++++++++----------------------- > 1 file changed, 32 insertions(+), 53 deletions(-) >=20 > diff --git a/drivers/gpio/gpio-adp5588.c b/drivers/gpio/gpio-adp5588.c > index 0a8cfccba818..6583a3787035 100644 > --- a/drivers/gpio/gpio-adp5588.c > +++ b/drivers/gpio/gpio-adp5588.c > @@ -36,12 +36,11 @@ struct adp5588_gpio { > struct mutex irq_lock; > uint8_t dat_out[3]; > uint8_t dir[3]; > - uint8_t int_lvl[3]; > + uint8_t int_lvl_low[3]; > + uint8_t int_lvl_high[3]; > uint8_t int_en[3]; > uint8_t irq_mask[3]; > - uint8_t irq_stat[3]; > uint8_t int_input_en[3]; > - uint8_t int_lvl_cached[3]; > }; >=20 > static int adp5588_gpio_read(struct i2c_client *client, u8 reg) > @@ -180,15 +179,9 @@ static void adp5588_irq_bus_sync_unlock(struct irq_d= ata *d) > mutex_unlock(&dev->lock); > } >=20 > - if (dev->int_lvl_cached[i] !=3D dev->int_lvl[i]) { > - dev->int_lvl_cached[i] =3D dev->int_lvl[i]; > - adp5588_gpio_write(dev->client, GPIO_INT_LVL1 + i= , > - dev->int_lvl[i]); > - } > - > if (dev->int_en[i] ^ dev->irq_mask[i]) { > dev->int_en[i] =3D dev->irq_mask[i]; > - adp5588_gpio_write(dev->client, GPIO_INT_EN1 + i, > + adp5588_gpio_write(dev->client, GPI_EM1 + i, > dev->int_en[i]); > } > } > @@ -219,21 +212,17 @@ static int adp5588_irq_set_type(struct irq_data *d,= unsigned int type) > uint16_t gpio =3D d->hwirq; > unsigned bank, bit; >=20 > - if ((type & IRQ_TYPE_EDGE_BOTH)) { > - dev_err(&dev->client->dev, "irq %d: unsupported type %d\n= ", > - d->irq, type); > - return -EINVAL; > - } > - > bank =3D ADP5588_BANK(gpio); > bit =3D ADP5588_BIT(gpio); >=20 > - if (type & IRQ_TYPE_LEVEL_HIGH) > - dev->int_lvl[bank] |=3D bit; > - else if (type & IRQ_TYPE_LEVEL_LOW) > - dev->int_lvl[bank] &=3D ~bit; > - else > - return -EINVAL; > + dev->int_lvl_low[bank] &=3D ~bit; > + dev->int_lvl_high[bank] &=3D ~bit; > + > + if (type & IRQ_TYPE_EDGE_BOTH || type & IRQ_TYPE_LEVEL_HIGH) > + dev->int_lvl_high[bank] |=3D bit; > + > + if (type & IRQ_TYPE_EDGE_BOTH || type & IRQ_TYPE_LEVEL_LOW) > + dev->int_lvl_low[bank] |=3D bit; >=20 > dev->int_input_en[bank] |=3D bit; >=20 > @@ -249,41 +238,32 @@ static struct irq_chip adp5588_irq_chip =3D { > .irq_set_type =3D adp5588_irq_set_type, > }; >=20 > -static int adp5588_gpio_read_intstat(struct i2c_client *client, u8 *buf) > -{ > - int ret =3D i2c_smbus_read_i2c_block_data(client, GPIO_INT_STAT1,= 3, buf); > - > - if (ret < 0) > - dev_err(&client->dev, "Read INT_STAT Error\n"); > - > - return ret; > -} > - > static irqreturn_t adp5588_irq_handler(int irq, void *devid) > { > struct adp5588_gpio *dev =3D devid; > - unsigned status, bank, bit, pending; > - int ret; > - status =3D adp5588_gpio_read(dev->client, INT_STAT); > + int status =3D adp5588_gpio_read(dev->client, INT_STAT); >=20 > - if (status & ADP5588_GPI_INT) { > - ret =3D adp5588_gpio_read_intstat(dev->client, dev->irq_s= tat); > - if (ret < 0) > - memset(dev->irq_stat, 0, ARRAY_SIZE(dev->irq_stat= )); > + if (status & ADP5588_KE_INT) { > + int ev_cnt =3D adp5588_gpio_read(dev->client, KEY_LCK_EC_= STAT); >=20 > - for (bank =3D 0, bit =3D 0; bank <=3D ADP5588_BANK(ADP558= 8_MAXGPIO); > - bank++, bit =3D 0) { > - pending =3D dev->irq_stat[bank] & dev->irq_mask[b= ank]; > + if (ev_cnt > 0) { > + int i; >=20 > - while (pending) { > - if (pending & (1 << bit)) { > - handle_nested_irq( > - irq_find_mapping( > - dev->gpio_chip.irq.dom= ain, > - (bank << 3) + bit)); > - pending &=3D ~(1 << bit); > - } > - bit++; > + for (i =3D 0; i < (ev_cnt & ADP5588_KEC); i++) { > + int key =3D adp5588_gpio_read(dev->client= , > + Key_EVENTA + = i); > + /* GPIN events begin at 97, > + * bit 7 indicates logic level > + */ > + int gpio =3D (key & 0x7f) - 97; > + int lvl =3D key & (1 << 7); > + int bank =3D ADP5588_BANK(gpio); > + int bit =3D ADP5588_BIT(gpio); > + > + if ((lvl && dev->int_lvl_high[bank] & bit= ) || > + (!lvl && dev->int_lvl_low[bank] & bit= )) > + handle_nested_irq(irq_find_mappin= g( > + dev->gpio_chip.irq.domain, = gpio)); > } > } > } > @@ -303,7 +283,6 @@ static int adp5588_irq_setup(struct adp5588_gpio *dev= ) >=20 > adp5588_gpio_write(client, CFG, ADP5588_AUTO_INC); > adp5588_gpio_write(client, INT_STAT, -1); /* status is W1C */ > - adp5588_gpio_read_intstat(client, dev->irq_stat); /* read to clea= r */ >=20 > mutex_init(&dev->irq_lock); >=20 > @@ -330,7 +309,7 @@ static int adp5588_irq_setup(struct adp5588_gpio *dev= ) > client->irq); >=20 > adp5588_gpio_write(client, CFG, > - ADP5588_AUTO_INC | ADP5588_INT_CFG | ADP5588_GPI_INT); > + ADP5588_AUTO_INC | ADP5588_INT_CFG | ADP5588_KE_IEN); >=20 > return 0; > } > -- > 2.17.1