Received: by 2002:a05:6358:489b:b0:bb:da1:e618 with SMTP id x27csp997763rwn; Thu, 15 Sep 2022 09:02:45 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4+miuAgxon6cHzPyH8p7uoP7ZwBqM3k7tGEEP1beDP5rAkbFywmikDOGMVSUA9bPrfdDVF X-Received: by 2002:a17:90b:3b41:b0:202:ec53:edfa with SMTP id ot1-20020a17090b3b4100b00202ec53edfamr625911pjb.136.1663257765499; Thu, 15 Sep 2022 09:02:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1663257765; cv=none; d=google.com; s=arc-20160816; b=Wi+PeYbTaagaAAbjU/SYHn6b++qSYUvAI0vYWICkfJIfDeNK+r7lmhMZO42fEvqWAP zsrL/J1ET+q8ci4U2hnwej8PjLBp5fBNKCMuJ5MMF3ZtSjgByXbj7doYMzaO6nnfgG7i 70003PHH+HQYjO1rLMgKyzsdT3bYPPkydmPbCoe5dnE0VUsDcH1wgjPWiz1EBhc7lrDr 6ETb+CMWpOOH9Fe93b3n9jyiB94N1DOVJRLM/C8Osc6uj26+qGj2qunP8ArHqot40UlE KFSnDEGLC+uptkGvBAMFn2y+BP3z5nTsRmm6EHEN26WZyfpYxBX/DdiXHBOXMtFa3Qjv OQFg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=RbcmCrt9MgNwVtS84rioFN6K+2EnzOOlimgTAZwP98I=; b=1DZoENGTh8CWu/3F+S+y5mtEAXqmgws4cx9r3F1nWueYfxyWfIGdsqjIM5EIulP4Cq nXQ4hylgZEO/zxeURBkMMYnURjbOjtmLjybk3c6RyJlhrSc1r0PWCu9eFpjMWozskEgG hhMVnTcAMbhL85YnXi0TwQKmMlJribo9B8N2h8sPSeyxIU/qGJbMJP1j56kMIocl7JjK AhRpg5HLhdWYpA6zcZdmKhmRq0S7TkZrnlMKG466zKZIfazgyr4elrc1jaCULS0FA9UZ jYSzy5DuDp9CgtJ+N+rXK639iP0FYbBUlVPFWPhBdIcemdEoc4x2Epue0mzCOEwCOck3 70fA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=ZWfyszh5; 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=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id s9-20020a63f049000000b00434df5a8524si19651651pgj.396.2022.09.15.09.02.32; Thu, 15 Sep 2022 09:02:45 -0700 (PDT) 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=@chromium.org header.s=google header.b=ZWfyszh5; 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=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229616AbiIOPtU (ORCPT + 99 others); Thu, 15 Sep 2022 11:49:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59890 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229544AbiIOPtK (ORCPT ); Thu, 15 Sep 2022 11:49:10 -0400 Received: from mail-io1-xd2d.google.com (mail-io1-xd2d.google.com [IPv6:2607:f8b0:4864:20::d2d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2A79B9926F for ; Thu, 15 Sep 2022 08:49:09 -0700 (PDT) Received: by mail-io1-xd2d.google.com with SMTP id n81so14810644iod.6 for ; Thu, 15 Sep 2022 08:49:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date; bh=RbcmCrt9MgNwVtS84rioFN6K+2EnzOOlimgTAZwP98I=; b=ZWfyszh5ASkbDN5lS0dfsNxWt9+T9r+fI0UExDTPZRhVQuglIZnwGXd9pcrBMwT+DF trkp5ZM/q57uF+azefdt/8dxoYLykqpa37Jz+ZulL03PsWodP3IVhsgjqanPo4bG8iPT htWBYNR5phBWSyLHfrPJuwYCya2nS+S7SWHcg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date; bh=RbcmCrt9MgNwVtS84rioFN6K+2EnzOOlimgTAZwP98I=; b=ybD5ehRn7gCaTVj+HTvhPInFCmq+2Hd/QfWz6sJeEL9LjLOJ4KqtfsGM1OaM4nkd2q a4Rr632HpS+Sx5A2pmaQDAnxvNTkO4csZaczydMJCZ/2LpM4ngUV0mpAsYDaUyVIlkJK rUJwDZN3MjdcPTWokf8T2S0iTpQCGkMvP9a3TTUx+a1eTY5KXlQTe34kPmEJJOSenY/9 2rybW5LVKHLBUYgo3F0ogV8SlRD29/uLL5FKSjGmwpmPyOVqWSo0PgVjaYvk6I54tz3b HaJEkOaNstwaDr+DiOq93Umy7XeGRMGMYlEvgJEdbyOiVsFfdY79XhCOFiHJ1qaQSOn7 gCYw== X-Gm-Message-State: ACrzQf1bY2HF8uIN6XO6Dyb7kqxcbLDnTLYDvuugnuUfCd9oenfNN28e jxOe2+uEnhYS+jYw2rLmyfIvzfwKEKCt4w== X-Received: by 2002:a02:cb92:0:b0:358:3b30:7d44 with SMTP id u18-20020a02cb92000000b003583b307d44mr279060jap.319.1663256948193; Thu, 15 Sep 2022 08:49:08 -0700 (PDT) Received: from mail-io1-f51.google.com (mail-io1-f51.google.com. [209.85.166.51]) by smtp.gmail.com with ESMTPSA id d14-20020a056e02214e00b002eb52f831f6sm8074977ilv.57.2022.09.15.08.49.03 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 15 Sep 2022 08:49:04 -0700 (PDT) Received: by mail-io1-f51.google.com with SMTP id g8so12593056iob.0 for ; Thu, 15 Sep 2022 08:49:03 -0700 (PDT) X-Received: by 2002:a05:6638:4110:b0:35a:6d6b:57f7 with SMTP id ay16-20020a056638411000b0035a6d6b57f7mr326227jab.134.1663256942370; Thu, 15 Sep 2022 08:49:02 -0700 (PDT) MIME-Version: 1.0 References: <20220914235801.1731478-1-rrangel@chromium.org> <20220914155914.v3.7.I8af4282adc72eb9f247adcd03676a43893a020a6@changeid> In-Reply-To: From: Raul Rangel Date: Thu, 15 Sep 2022 09:48:50 -0600 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v3 07/13] i2c: acpi: Use ACPI wake capability bit to set wake_irq To: Mika Westerberg Cc: Linux ACPI , linux-input , "jingle.wu" , "Rafael J. Wysocki" , Andy Shevchenko , "Limonciello, Mario" , Hans de Goede , Linus Walleij , Tim Van Patten , Dmitry Torokhov , Wolfram Sang , "open list:I2C SUBSYSTEM HOST DRIVERS" , linux-kernel Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Sep 15, 2022 at 4:46 AM Mika Westerberg wrote: > > On Wed, Sep 14, 2022 at 05:57:55PM -0600, Raul E Rangel wrote: > > Device tree already has a mechanism to pass the wake_irq. It does this > > by looking for the wakeup-source property and setting the > > I2C_CLIENT_WAKE flag. This CL adds the ACPI equivalent. It uses the > > ACPI interrupt wake flag to determine if the interrupt can be used to > > wake the system. Previously the i2c drivers had to make assumptions and > > blindly enable the wake IRQ. This can cause spurious wake events. e.g., > > If there is a device with an Active Low interrupt and the device gets > > powered off while suspending, the interrupt line will go low since it's > > no longer powered and wakes the system. For this reason we should > > respect the board designers wishes and honor the wake bit defined on the > > interrupt. > > > > Signed-off-by: Raul E Rangel > > --- > > > > Changes in v3: > > - Convert wake_capable to bool > > - Only update wake_capable pointer once > > - Move wake_capable local into local block > > > > Changes in v2: > > - Look at wake_cabple bit for IRQ/Interrupt resources > > > > drivers/i2c/i2c-core-acpi.c | 33 ++++++++++++++++++++++++--------- > > drivers/i2c/i2c-core-base.c | 8 +++++++- > > drivers/i2c/i2c-core.h | 4 ++-- > > 3 files changed, 33 insertions(+), 12 deletions(-) > > > > diff --git a/drivers/i2c/i2c-core-acpi.c b/drivers/i2c/i2c-core-acpi.c > > index c762a879c4cc6b..b3d68a9659ff4f 100644 > > --- a/drivers/i2c/i2c-core-acpi.c > > +++ b/drivers/i2c/i2c-core-acpi.c > > @@ -137,6 +137,11 @@ static const struct acpi_device_id i2c_acpi_ignored_device_ids[] = { > > {} > > }; > > > > +struct i2c_acpi_irq_context { > > + int irq; > > + bool wake_capable; > > +}; > > + > > static int i2c_acpi_do_lookup(struct acpi_device *adev, > > struct i2c_acpi_lookup *lookup) > > { > > @@ -170,11 +175,14 @@ static int i2c_acpi_do_lookup(struct acpi_device *adev, > > > > static int i2c_acpi_add_resource(struct acpi_resource *ares, void *data) > > { > > - int *irq = data; > > + struct i2c_acpi_irq_context *irq_ctx = data; > > struct resource r; > > > > - if (*irq <= 0 && acpi_dev_resource_interrupt(ares, 0, &r)) > > - *irq = i2c_dev_irq_from_resources(&r, 1); > > + if (irq_ctx->irq <= 0 && acpi_dev_resource_interrupt(ares, 0, &r)) { > > + irq_ctx->irq = i2c_dev_irq_from_resources(&r, 1); > > + irq_ctx->wake_capable = > > + !!(r.flags & IORESOURCE_IRQ_WAKECAPABLE); > > You don't need the !!() here. Just > > irq_ctx->wake_capable = r.flags & IORESOURCE_IRQ_WAKECAPABLE; > You know, I learned something new today! I was concerned about this setting `wake_capable` to something that wasn't 0 or 1, but apparently this is handled by the compiler! http://port70.net/~nsz/c/c11/n1570.html#6.3.1.2 > 6.3.1.2 Boolean type > When any scalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1. Whoah! > > + } > > > > return 1; /* No need to add resource to the list */ > > } > > @@ -182,31 +190,38 @@ static int i2c_acpi_add_resource(struct acpi_resource *ares, void *data) > > /** > > * i2c_acpi_get_irq - get device IRQ number from ACPI > > * @client: Pointer to the I2C client device > > + * @wake_capable: Set to true if the IRQ is wake capable > > * > > * Find the IRQ number used by a specific client device. > > * > > * Return: The IRQ number or an error code. > > */ > > -int i2c_acpi_get_irq(struct i2c_client *client) > > +int i2c_acpi_get_irq(struct i2c_client *client, bool *wake_capable) > > { > > struct acpi_device *adev = ACPI_COMPANION(&client->dev); > > struct list_head resource_list; > > - int irq = -ENOENT; > > + struct i2c_acpi_irq_context irq_ctx = { > > + .irq = -ENOENT, > > + }; > > int ret; > > > > INIT_LIST_HEAD(&resource_list); > > > > ret = acpi_dev_get_resources(adev, &resource_list, > > - i2c_acpi_add_resource, &irq); > > + i2c_acpi_add_resource, &irq_ctx); > > if (ret < 0) > > return ret; > > > > acpi_dev_free_resource_list(&resource_list); > > > > - if (irq == -ENOENT) > > - irq = acpi_dev_gpio_irq_get(adev, 0); > > + if (irq_ctx.irq == -ENOENT) > > + irq_ctx.irq = acpi_dev_gpio_irq_wake_get(adev, 0, > > + &irq_ctx.wake_capable); > > + > > + if (wake_capable) > > + *wake_capable = irq_ctx.wake_capable; > > > > - return irq; > > + return irq_ctx.irq; > > } > > > > static int i2c_acpi_get_info(struct acpi_device *adev, > > diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c > > index 91007558bcb260..c4debd46c6340f 100644 > > --- a/drivers/i2c/i2c-core-base.c > > +++ b/drivers/i2c/i2c-core-base.c > > @@ -487,8 +487,14 @@ static int i2c_device_probe(struct device *dev) > > if (irq == -EINVAL || irq == -ENODATA) > > irq = of_irq_get(dev->of_node, 0); > > } else if (ACPI_COMPANION(dev)) { > > - irq = i2c_acpi_get_irq(client); > > + bool wake_capable; > > + > > + irq = i2c_acpi_get_irq(client, &wake_capable); > > + > > Drop the empty line here. Done > > > + if (irq > 0 && wake_capable) > > + client->flags |= I2C_CLIENT_WAKE; > > } > > + > > Unrelated whitespace change. Done > > With those fixed feel free to add, > > Reviewed-by: Mika Westerberg Added, thanks!