From patchwork Tue Apr 18 12:49:51 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fei Shao X-Patchwork-Id: 674879 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DB990C6FD18 for ; Tue, 18 Apr 2023 12:51:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232174AbjDRMvQ (ORCPT ); Tue, 18 Apr 2023 08:51:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43526 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232168AbjDRMvP (ORCPT ); Tue, 18 Apr 2023 08:51:15 -0400 Received: from mail-pf1-x42e.google.com (mail-pf1-x42e.google.com [IPv6:2607:f8b0:4864:20::42e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 351BC16B21 for ; Tue, 18 Apr 2023 05:50:53 -0700 (PDT) Received: by mail-pf1-x42e.google.com with SMTP id d2e1a72fcca58-63b5fca48bcso1709371b3a.0 for ; Tue, 18 Apr 2023 05:50:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1681822252; x=1684414252; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Y4OHoFWLVHVOU1gGJFIZyvFQwj4I/n5rmO4u4kQqp5s=; b=NaZDAMGrk+xiKbfMXkfc+hiiltFD0LlTuSqiIbDBkpzWQgLVSgj/O48zJ7VMGlzp68 pCDOEKpcmGwFU7dSgwQqjWorn5Z13vwzcfdi34+M2L5EwoQEbckdcNX1V9iuSn4j74qB 2IMNQfjqpLvm8WWUqmBcV11cHsW5gXqch7xqo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1681822252; x=1684414252; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Y4OHoFWLVHVOU1gGJFIZyvFQwj4I/n5rmO4u4kQqp5s=; b=dtQNtkurTw2eePdMhYXpg64daDMyft29HkcZs/+ytHs7RYDplKI1sTWWOcUAF/UXjd xhJcTHmkWDge81IkutzHeKo/aDRKAZy0ry1L19xh/SVWzZIze6mhoDWRAczuT+b30xcH tQKLtUNqBEN0zLe5/tqF2MalrMuNyEgRqWgS8duEGdbl0YX7TdAMpdCOymqHwanLIbjW m4a7lFrTh5U4qR+QFyGOhqths7HvYCNo+H+megjVY1/LWqPlt8QKqh3+KkP7LTDvbH+y o7sHWY12Cf/gASxhkZkazMCajUKmRF1RueOzO2Ki2L2cpn1Wd/l9Vgy+VM3oWmqOV5Jr HKaQ== X-Gm-Message-State: AAQBX9dVF0JygbDB2n+ySZD0eEL57+8W/veC7tIPRIz9aEL4CMz271IA w+XpoZSc8S/MrlLtREflBnyi6Q== X-Google-Smtp-Source: AKy350YD/mHUZFPaUut90TfJLzOLDCDlzOufYyFO14OjgVg1t2eEm+ULWpBI96mTSUIsyi0jY51ohg== X-Received: by 2002:a05:6a00:1483:b0:638:f0b1:4df1 with SMTP id v3-20020a056a00148300b00638f0b14df1mr25744364pfu.24.1681822252585; Tue, 18 Apr 2023 05:50:52 -0700 (PDT) Received: from fshao-glinux.tpe.corp.google.com ([2401:fa00:1:10:2fb7:301d:6083:752b]) by smtp.gmail.com with ESMTPSA id v11-20020a62a50b000000b0063afb08afeesm9323733pfm.67.2023.04.18.05.50.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Apr 2023 05:50:52 -0700 (PDT) From: Fei Shao To: Benjamin Tissoires , Douglas Anderson , Rob Herring Cc: linux-mediatek , Fei Shao , Dmitry Torokhov , Krzysztof Kozlowski , devicetree@vger.kernel.org, linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/2] dt-bindings: input: goodix: Add powered-in-suspend property Date: Tue, 18 Apr 2023 20:49:51 +0800 Message-ID: <20230418124953.3170028-2-fshao@chromium.org> X-Mailer: git-send-email 2.40.0.634.g4ca3ef3211-goog In-Reply-To: <20230418124953.3170028-1-fshao@chromium.org> References: <20230418124953.3170028-1-fshao@chromium.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org We observed that on Chromebook device Steelix, if Goodix GT7375P touchscreen is powered in suspend (because, for example, it connects to an always-on regulator) and with the reset GPIO asserted, it will introduce about 14mW power leakage. This property is used to indicate that the touchscreen is powered in suspend. If it's set, the driver will stop asserting the reset GPIO in power-down, and it will do it in power-up instead to ensure that the state is always reset after resuming. Signed-off-by: Fei Shao --- Documentation/devicetree/bindings/input/goodix,gt7375p.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Documentation/devicetree/bindings/input/goodix,gt7375p.yaml b/Documentation/devicetree/bindings/input/goodix,gt7375p.yaml index ce18d7dadae2..942acb286d77 100644 --- a/Documentation/devicetree/bindings/input/goodix,gt7375p.yaml +++ b/Documentation/devicetree/bindings/input/goodix,gt7375p.yaml @@ -43,6 +43,12 @@ properties: itself as long as it allows the main board to make signals compatible with what the touchscreen is expecting for its IO rails. + powered-in-suspend: + description: + This indicates that the touchscreen is powered in suspend, so the driver + will not assert the reset GPIO in power-down to prevent power leakage. + type: boolean + required: - compatible - reg From patchwork Tue Apr 18 12:49:52 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fei Shao X-Patchwork-Id: 675422 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 384FEC6FD18 for ; Tue, 18 Apr 2023 12:51:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232170AbjDRMvS (ORCPT ); Tue, 18 Apr 2023 08:51:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43576 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232171AbjDRMvR (ORCPT ); Tue, 18 Apr 2023 08:51:17 -0400 Received: from mail-pf1-x42d.google.com (mail-pf1-x42d.google.com [IPv6:2607:f8b0:4864:20::42d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9150816B31 for ; Tue, 18 Apr 2023 05:50:55 -0700 (PDT) Received: by mail-pf1-x42d.google.com with SMTP id d2e1a72fcca58-63b4a64c72bso1735978b3a.0 for ; Tue, 18 Apr 2023 05:50:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1681822255; x=1684414255; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Papc1sXd+qDh/1CZbyPf6tKXYxl99aL3JhfvjUH30aw=; b=W02vLdWJ3jV+eysJyBXOZkWpyU4OWVzVbN+pnYkJKHPtCh7O/8OzBlIMsLxX7PW6nI KCygHot6i9LcL4jrs0P04ul3KuPW4e9NzqPVzfenoRhX1c7dk2vGAvizQThTCS+fw7iT D9ZueUY62fFwpHtiVBQDwWXcMGdo7jK3LrapI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1681822255; x=1684414255; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Papc1sXd+qDh/1CZbyPf6tKXYxl99aL3JhfvjUH30aw=; b=cGeT8IMOvIiGKj5Vhu+CnWgX39hvghgkOF20G2dP6l1z2t/NhFYOQDZ3efQj+8yv3t 5cIhEf6PT7LnkEUP+PzZEF0I5BSY5Oam6Mup07ppipY9sTVwQ4wQPM29ApfDAosgFhTZ rZ2++0MWpXVEi/r5lo0Q4z97vgdAofhlRzE8jG0FkF6nBC+6xeNrn3w96RzVfHYBAFQO Tb9bWZ3zTRFwkLWFs93ROYkuczSNfWon2lpSA58SrpQQPngq2+guY+HjVCsxFCJlIEF3 nz2cyp30EEqO9XkL0jFglpZdN/u6WGDVQOKKbm/cYAE6Ds0+210fS/V5F1AwU/TlpFpO imGg== X-Gm-Message-State: AAQBX9cYi5JUsWiW63LJTDidXm7QY/e7/YCUDIYliwCO6rpVrJbbWp2Y jx6E8GKjgp5y/kT003mdAljT0Z9ys+WeflUgExI= X-Google-Smtp-Source: AKy350YSKwMcKwM7NQ08Mn+FjbYkwflE/RoqWCwGyKQZXouI16JZM1yOzG8VWacpqa+y30fpbCbEWg== X-Received: by 2002:a05:6a00:99e:b0:63b:3e:cbee with SMTP id u30-20020a056a00099e00b0063b003ecbeemr27392282pfg.32.1681822254999; Tue, 18 Apr 2023 05:50:54 -0700 (PDT) Received: from fshao-glinux.tpe.corp.google.com ([2401:fa00:1:10:2fb7:301d:6083:752b]) by smtp.gmail.com with ESMTPSA id v11-20020a62a50b000000b0063afb08afeesm9323733pfm.67.2023.04.18.05.50.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Apr 2023 05:50:54 -0700 (PDT) From: Fei Shao To: Benjamin Tissoires , Douglas Anderson , Rob Herring Cc: linux-mediatek , Fei Shao , Dmitry Torokhov , Jiri Kosina , Matthias Kaehlcke , Stephen Kitt , linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/2] HID: i2c-hid: goodix: Add support for powered-in-suspend property Date: Tue, 18 Apr 2023 20:49:52 +0800 Message-ID: <20230418124953.3170028-3-fshao@chromium.org> X-Mailer: git-send-email 2.40.0.634.g4ca3ef3211-goog In-Reply-To: <20230418124953.3170028-1-fshao@chromium.org> References: <20230418124953.3170028-1-fshao@chromium.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org In the beginning, commit 18eeef46d359 ("HID: i2c-hid: goodix: Tie the reset line to true state of the regulator") introduced a change to tie the reset line of the Goodix touchscreen to the state of the regulator to fix a power leakage issue in suspend. After some time, the change was deemed unnecessary and was reverted in commit 557e05fa9fdd ("HID: i2c-hid: goodix: Stop tying the reset line to the regulator") due to difficulties in managing regulator notifiers for designs like Evoker, which provides a second power rail to touchscreen. However, the revert caused a power regression on another Chromebook device Steelix in the field, which has a dedicated always-on regulator for touchscreen and was covered by the workaround in the first commit. To address both cases, this patch adds the support for the `powered-in-suspend` property in the driver that allows the driver to determine whether the touchscreen is still powered in suspend, and handle the reset GPIO accordingly as below: - When set to true, the driver does not assert the reset GPIO in power down. To ensure a clean start and the consistent behavior, it does the assertion in power up instead. This is for designs with a dedicated always-on regulator. - When set to false, the driver uses the original control flow and asserts GPIO and disable regulators normally. This is for the two-regulator and shared-regulator designs. Signed-off-by: Fei Shao --- drivers/hid/i2c-hid/i2c-hid-of-goodix.c | 46 +++++++++++++++++++++---- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/drivers/hid/i2c-hid/i2c-hid-of-goodix.c b/drivers/hid/i2c-hid/i2c-hid-of-goodix.c index 0060e3dcd775..b438db8ca6f4 100644 --- a/drivers/hid/i2c-hid/i2c-hid-of-goodix.c +++ b/drivers/hid/i2c-hid/i2c-hid-of-goodix.c @@ -28,6 +28,7 @@ struct i2c_hid_of_goodix { struct regulator *vdd; struct regulator *vddio; struct gpio_desc *reset_gpio; + bool powered_in_suspend; const struct goodix_i2c_hid_timing_data *timings; }; @@ -37,13 +38,34 @@ static int goodix_i2c_hid_power_up(struct i2chid_ops *ops) container_of(ops, struct i2c_hid_of_goodix, ops); int ret; - ret = regulator_enable(ihid_goodix->vdd); - if (ret) - return ret; - - ret = regulator_enable(ihid_goodix->vddio); - if (ret) - return ret; + /* + * This is to ensure that the reset GPIO will be asserted and the + * regulators will be enabled for all cases. + */ + if (ihid_goodix->powered_in_suspend) { + /* + * This is not mandatory, but we assert reset here (instead of + * in power-down) to ensure that the device will have a clean + * state later on just like the normal scenarios would have. + * + * Also, since the regulators were not disabled in power-down, + * we don't need to enable them here. + */ + gpiod_set_value_cansleep(ihid_goodix->reset_gpio, 1); + } else { + /* + * In this case, the reset is already asserted (either in + * probe or power-down). + * All we need is to enable the regulators. + */ + ret = regulator_enable(ihid_goodix->vdd); + if (ret) + return ret; + + ret = regulator_enable(ihid_goodix->vddio); + if (ret) + return ret; + } if (ihid_goodix->timings->post_power_delay_ms) msleep(ihid_goodix->timings->post_power_delay_ms); @@ -60,6 +82,13 @@ static void goodix_i2c_hid_power_down(struct i2chid_ops *ops) struct i2c_hid_of_goodix *ihid_goodix = container_of(ops, struct i2c_hid_of_goodix, ops); + /* + * Don't assert reset GPIO or disable regulators if we're keeping the + * device powered in suspend. + */ + if (ihid_goodix->powered_in_suspend) + return; + gpiod_set_value_cansleep(ihid_goodix->reset_gpio, 1); regulator_disable(ihid_goodix->vddio); regulator_disable(ihid_goodix->vdd); @@ -91,6 +120,9 @@ static int i2c_hid_of_goodix_probe(struct i2c_client *client) if (IS_ERR(ihid_goodix->vddio)) return PTR_ERR(ihid_goodix->vddio); + ihid_goodix->powered_in_suspend = + of_property_read_bool(client->dev.of_node, "powered-in-suspend"); + ihid_goodix->timings = device_get_match_data(&client->dev); return i2c_hid_core_probe(client, &ihid_goodix->ops, 0x0001, 0);