Received: by 2002:a05:6a10:1a4d:0:0:0:0 with SMTP id nk13csp1468997pxb; Wed, 2 Feb 2022 05:46:46 -0800 (PST) X-Google-Smtp-Source: ABdhPJx0eHkMtzbdsXJI9X/JmAygOgmI0n94pxnFuOjXNuTEjVfHHc1wnn2rGzcXMl4slJvGXdRe X-Received: by 2002:a17:90a:2c0a:: with SMTP id m10mr8141115pjd.183.1643809606662; Wed, 02 Feb 2022 05:46:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643809606; cv=none; d=google.com; s=arc-20160816; b=0ONmrYf3iXSMXmGFLZjb0pWL5YIj0fRrSQVFxb4NdAmERqut/hj0jo1yzpAnbgxQrQ gF2l2pxGCrZfsSeFH6qsQZJaGMMLYzl6mPGuVxcr3DTRSVHo8FILMjt08SXUXYakpERm q7fWGDQgSg5NV7xV0MrenY5maEhMbwCloDONr57sCFg1cgUel+PB11t5gwDZXXWq6qyO PEee/UaNPtYhBXsf9RUQiX2gR019xUFKGqI9NRyIACBXSmsDnTYO3Dgo/++FV0MagLHo nMCesqSCJg7zoiV/SAHvf1HUK9V4tdt0BgLa1YvVusUqdnun1saM9NnKoyqobb9qkwzj cXVQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=rBAEWe0d14lBWb+Vsl5lHaaZyxn6U2i2/rJRhaGu09I=; b=lrtolKphg6x8DQMMQGFU3JYJWxdC0XyR176Y6I5Csmfuk/qBFnx3Kj4OfndDXxQYPY xSTaiAsqd2XOaOeMnpXEPr2c2t7bqAQin+IKzpryxlOwYqT+PR0Zq/CearPnvOfc1Eo6 PWAcgmf9qla4oe89pSw/eird3jDjFCe39ASTyQLpaPWxu/ca8jJydNMNHTUaWdLZkxh5 zJdeH8WXZrdD4iNW+x+EkGUzmAik7yO5kJ72CDC1DuylDN91kpC//ABHy4T13iUV0qzN Vi56QzmbYh6Hl50MBXlPD/iXK6hDGW00u+DvSiPTKnHGI4w8tl5ddKLzlH/s+o13v/bY HXSQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b="K8Pg/SnY"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id k10si18344379pll.198.2022.02.02.05.46.35; Wed, 02 Feb 2022 05:46:46 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b="K8Pg/SnY"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234215AbiBAUfD (ORCPT + 99 others); Tue, 1 Feb 2022 15:35:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54256 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229702AbiBAUfC (ORCPT ); Tue, 1 Feb 2022 15:35:02 -0500 Received: from mail-ej1-x62c.google.com (mail-ej1-x62c.google.com [IPv6:2a00:1450:4864:20::62c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1E52EC061714; Tue, 1 Feb 2022 12:35:02 -0800 (PST) Received: by mail-ej1-x62c.google.com with SMTP id j2so57177384ejk.6; Tue, 01 Feb 2022 12:35:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=rBAEWe0d14lBWb+Vsl5lHaaZyxn6U2i2/rJRhaGu09I=; b=K8Pg/SnYwiqGGwMKYRi5PWI7KLAJ3jN1eZ5+vwsnh1UO4bWxNmB5imh7fFIpaUKfwq ah4QJkBlyc59xahuWEaJjIj2sup3HeSXodD+LPjrt8Mrx+6PxY+7REFds+5mLu5NK+nx 1j5ZNTCgmW24YmAwBibZFbEg1k8wXbe669LEePnxMY1EZRYlneCymJzt7xe4zFyc+jgt wbogeHzmaz9RdzjzIPRQibpyBJp0s5dNyoyTLD7xCOPMbcWG4a8FsUoMuWOKdWjiuQx4 LFhBDZywoxbQjJW1ov+yXNEb+mT00+v9wBJKdzE/15a3z1/oNXSANK4Xj9XgqvPKgi5v vFhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=rBAEWe0d14lBWb+Vsl5lHaaZyxn6U2i2/rJRhaGu09I=; b=4plIUDScXmYxfpXqg/muWfIiZ2nQ3CDyOVVEItrEPU0GpFyCXhn60Oz1JtyctqHJ06 MBPxSEJYICQw2UK7NqSxwNpfAMOdv6ubTEQ/y1s9IsKW9ybQn5AD73x0Q+hViVogL2Zl ELNBZFk7vFRjY5r3MrM7tIHQjcReGopbCL2N67l7EA8yNZ7qOMaJO4Ucqd9RuaqgpUDi /6Cre5srierTboxyRtRLScbQJ1nJOzWT4n2QSEKa/67uL8VUDLVWYPwh8pry+b9VAUfo BxoHDVtGjjtMUpwOckVK2U9gUoWNk9J+36BxgR0qZ90aw9A9BaGPnzpBslp3f88/z7vk 328w== X-Gm-Message-State: AOAM531yaZWEQXdm60IyZJgPJ61oL651lnY1SxI2IbikZmmoi3Yl2K92 nINxka5mBeURUgsa5sMsb3ALQgVJ8A1n8S6Wyws= X-Received: by 2002:a17:906:7948:: with SMTP id l8mr22030548ejo.636.1643747700531; Tue, 01 Feb 2022 12:35:00 -0800 (PST) MIME-Version: 1.0 References: <6a62a531227cd4f20d77d50cdde60c7a18b9f052.1643625325.git.geert+renesas@glider.be> In-Reply-To: <6a62a531227cd4f20d77d50cdde60c7a18b9f052.1643625325.git.geert+renesas@glider.be> From: Andy Shevchenko Date: Tue, 1 Feb 2022 22:33:25 +0200 Message-ID: Subject: Re: [PATCH] gpio: aggregator: Fix calling into sleeping GPIO controllers To: Geert Uytterhoeven Cc: Linus Walleij , Bartosz Golaszewski , =?UTF-8?Q?Mikko_Salom=C3=A4ki?= , "open list:GPIO SUBSYSTEM" , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Feb 1, 2022 at 10:09 PM Geert Uytterhoeven wrote: > > If the parent GPIO controller is a sleeping controller (e.g. a GPIO > controller connected to I2C), getting or setting a GPIO triggers a > might_sleep() warning. This happens because the GPIO Aggregator takes > the can_sleep flag into account only for its internal locking, not for > calling into the parent GPIO controller. > > Fix this by using the gpiod_[gs]et*_cansleep() APIs when calling into a > sleeping GPIO controller. Reviewed-by: Andy Shevchenko One nit-pick below, though. > Reported-by: Mikko Salom=C3=A4ki > Fixes: 828546e24280f721 ("gpio: Add GPIO Aggregator") > Signed-off-by: Geert Uytterhoeven > --- > I considered splitting the .[gs]et{_multiple}() callbacks for the > sleeping vs. nonsleeping cases, but the code size increase (measured on > ARM) would be substantial: > +64 bytes for gpio_fwd_[gs]et_cansleep(), > +296 bytes for gpio_fwd_[gs]et_multiple_cansleep(). > --- > drivers/gpio/gpio-aggregator.c | 18 ++++++++++++++---- > 1 file changed, 14 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregato= r.c > index 869dc952cf45218b..0cb2664085cf8314 100644 > --- a/drivers/gpio/gpio-aggregator.c > +++ b/drivers/gpio/gpio-aggregator.c > @@ -278,7 +278,8 @@ static int gpio_fwd_get(struct gpio_chip *chip, unsig= ned int offset) > { > struct gpiochip_fwd *fwd =3D gpiochip_get_data(chip); > > - return gpiod_get_value(fwd->descs[offset]); > + return chip->can_sleep ? gpiod_get_value_cansleep(fwd->descs[offs= et]) > + : gpiod_get_value(fwd->descs[offset]); This indentation kills the perfectionist in me :-) What about: return chip->can_sleep ? gpiod_get_value_cansleep(fwd->descs[offset]) : gpiod_get_value(fwd->descs[offset]); ? Or as variant struct gpio_desc *desc =3D fwd->descs[offset]; return chip->can_sleep ? gpiod_get_value_cansleep(desc) : gpiod_get_value(desc); ? > } > > static int gpio_fwd_get_multiple(struct gpiochip_fwd *fwd, unsigned long= *mask, > @@ -293,7 +294,10 @@ static int gpio_fwd_get_multiple(struct gpiochip_fwd= *fwd, unsigned long *mask, > for_each_set_bit(i, mask, fwd->chip.ngpio) > descs[j++] =3D fwd->descs[i]; > > - error =3D gpiod_get_array_value(j, descs, NULL, values); > + if (fwd->chip.can_sleep) > + error =3D gpiod_get_array_value_cansleep(j, descs, NULL, = values); > + else > + error =3D gpiod_get_array_value(j, descs, NULL, values); > if (error) > return error; > > @@ -328,7 +332,10 @@ static void gpio_fwd_set(struct gpio_chip *chip, uns= igned int offset, int value) > { > struct gpiochip_fwd *fwd =3D gpiochip_get_data(chip); > > - gpiod_set_value(fwd->descs[offset], value); > + if (chip->can_sleep) > + gpiod_set_value_cansleep(fwd->descs[offset], value); > + else > + gpiod_set_value(fwd->descs[offset], value); > } > > static void gpio_fwd_set_multiple(struct gpiochip_fwd *fwd, unsigned lon= g *mask, > @@ -343,7 +350,10 @@ static void gpio_fwd_set_multiple(struct gpiochip_fw= d *fwd, unsigned long *mask, > descs[j++] =3D fwd->descs[i]; > } > > - gpiod_set_array_value(j, descs, NULL, values); > + if (fwd->chip.can_sleep) > + gpiod_set_array_value_cansleep(j, descs, NULL, values); > + else > + gpiod_set_array_value(j, descs, NULL, values); > } > > static void gpio_fwd_set_multiple_locked(struct gpio_chip *chip, > -- > 2.25.1 > --=20 With Best Regards, Andy Shevchenko