From patchwork Mon Jan 15 04:50:51 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kai-Heng Feng X-Patchwork-Id: 188021 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:693c:2614:b0:101:6a76:bbe3 with SMTP id mm20csp1504479dyc; Sun, 14 Jan 2024 21:00:33 -0800 (PST) X-Google-Smtp-Source: AGHT+IH2M3/Q5D9GgqrpQDaZpDxi44n2SYQAp30t6S8tSm8rxoe+dYidyyciKCenUofUIvaFlJtY X-Received: by 2002:a9d:75d4:0:b0:6dd:f0a6:dfea with SMTP id c20-20020a9d75d4000000b006ddf0a6dfeamr4418094otl.26.1705294833489; Sun, 14 Jan 2024 21:00:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1705294833; cv=none; d=google.com; s=arc-20160816; b=DNzAWTB9YIDNJ147lMO68Kb/Datr88sycGJXzKt52aJ9knC8Y4z2ipWej5yaPlyz3v Fcbs+isbzNhYpUCFJRq8worm0mSf14SHxPWC0lDEpvj3LhDhE0OCA4rSR0b6arb7lK4y 7NgTOTcVYhy2rXXf3aoolmtFBgw8EVihUAAAidmSdJOiTN+KS+GeIYzUzfE3IQTjXoLa /WLBiA3CVjivhxp3T9rvit+qJMHpuKlZx8B3b6zvYgD0lRZNseKwMo6W3igC1eTZqna0 Q+f7KeFXjBPr8/Hjbvqjmvm31+Q2Mo9fbf1XNX2oAGO3TD4csVzsc7mQgQVUdWAJsj5G cMVQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:message-id:date:subject:cc:to :from:dkim-signature; bh=/h0ueumzQRHlEhJDa988fwbrKEXZ/2rrzQgvraRlQ6s=; fh=teIsOfx9okDd29+EcvTpaGLvEtPi+i88lIKea4hNp/0=; b=lbOuhEcW6li63Wc4VZo9lZV99/XaoynGmiu61bNwskWREOouJ3Y5wEcREpy4ssBvt9 5r8fvuGxkfyJLEf8mdFjsYI5kJBLigwkGJH8nSQnZKYLFejv/JJ0LnDFbrZlkGzUzkJi M8BHVo1PA2GjCk0GrPTDopyR68Q8uXfeaGKzIe7k9nbucxrtSPHoiLbXIqQaW0boZw59 HqWVws90svMHZOb9rx/WlHUN6WqchS/TaD8K2rVVUDR3F9GuM4bfRYw0jfxUOzc2R4ux VRxBVp8IYUj+CO+75i2EhI6imureJ2kYM77r2aOHWMmWryJEIStrQR+IfD4U604IMHhG xDyA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@canonical.com header.s=20210705 header.b=XvTh11TF; spf=pass (google.com: domain of linux-kernel+bounces-25626-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-25626-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=canonical.com Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id b6-20020a6567c6000000b005bda1051dacsi7885248pgs.471.2024.01.14.21.00.33 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 14 Jan 2024 21:00:33 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-25626-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@canonical.com header.s=20210705 header.b=XvTh11TF; spf=pass (google.com: domain of linux-kernel+bounces-25626-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-25626-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=canonical.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id BE7FFB20E68 for ; Mon, 15 Jan 2024 05:00:28 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id F25CF3C23; Mon, 15 Jan 2024 05:00:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=canonical.com header.i=@canonical.com header.b="XvTh11TF" Received: from smtp-relay-canonical-1.canonical.com (smtp-relay-canonical-1.canonical.com [185.125.188.121]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A281717CF; Mon, 15 Jan 2024 05:00:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=canonical.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=canonical.com Received: from localhost.localdomain (unknown [10.101.196.174]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-canonical-1.canonical.com (Postfix) with ESMTPSA id 090B03F722; Mon, 15 Jan 2024 04:51:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1705294302; bh=/h0ueumzQRHlEhJDa988fwbrKEXZ/2rrzQgvraRlQ6s=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=XvTh11TFw0EDTwDxRedeNeFkn2S20dhKqZYkET3YbEsT0Im3PVCgGfK1t4sIYpbCW UFcIPZwX9gWN250kSEvp1DtvkOz9D2aRJ9q0q2WLZnrgdNMYlej0bVjm3JSRGoeNCY QctqYkRWuV41PjSo07wbOt6AgW4iHQkKudSe7yQc4qaav44S3i18RLN8tmpcO5hzTl MzLYWkJK0IHaJBo4RTjdb5as1v3idXBFC5Y+tcW7IJakerky6EP3XaaDqrVuSoUcEF zRhC5H+Y7BOQY1wek1WE7Qa1kDMW5aiuTf1wbG7BaR+NWmhCd5+26/BtcRRsdEzdtA x/h+Hy9hS+2qA== From: Kai-Heng Feng To: jikos@kernel.org, benjamin.tissoires@redhat.com Cc: Kai-Heng Feng , Douglas Anderson , Hans de Goede , Maxime Ripard , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Johan Hovold , linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] HID: i2c-hid: Skip SET_POWER SLEEP for Cirque touchpad on system suspend Date: Mon, 15 Jan 2024 12:50:51 +0800 Message-Id: <20240115045054.1170294-1-kai.heng.feng@canonical.com> X-Mailer: git-send-email 2.34.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1788131234990830904 X-GMAIL-MSGID: 1788131234990830904 There's a Cirque touchpad that wakes system up without anything touched the touchpad. The input report is empty when this happens. The reason is stated in HID over I2C spec, 7.2.8.2: "If the DEVICE wishes to wake the HOST from its low power state, it can issue a wake by asserting the interrupt." This is fine if OS can put system back to suspend by identifying input wakeup count stays the same on resume, like Chrome OS Dark Resume [0]. But for regular distro such policy is lacking. Though the change doesn't bring any impact on power consumption for touchpad is minimal, other i2c-hid device may depends on SLEEP control power. So use a quirk to limit the change scope. [0] https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/power_manager/docs/dark_resume.md Signed-off-by: Kai-Heng Feng Reviewed-by: Douglas Anderson --- v2: - Use quirk instead of applying the change universally. drivers/hid/hid-ids.h | 3 +++ drivers/hid/i2c-hid/i2c-hid-core.c | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index fb30e228d35f..828a5c022c64 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -298,6 +298,9 @@ #define USB_VENDOR_ID_CIDC 0x1677 +#define I2C_VENDOR_ID_CIRQUE 0x0488 +#define I2C_PRODUCT_ID_CIRQUE_1063 0x1063 + #define USB_VENDOR_ID_CJTOUCH 0x24b8 #define USB_DEVICE_ID_CJTOUCH_MULTI_TOUCH_0020 0x0020 #define USB_DEVICE_ID_CJTOUCH_MULTI_TOUCH_0040 0x0040 diff --git a/drivers/hid/i2c-hid/i2c-hid-core.c b/drivers/hid/i2c-hid/i2c-hid-core.c index 90f316ae9819..2df1ab3c31cc 100644 --- a/drivers/hid/i2c-hid/i2c-hid-core.c +++ b/drivers/hid/i2c-hid/i2c-hid-core.c @@ -49,6 +49,7 @@ #define I2C_HID_QUIRK_RESET_ON_RESUME BIT(2) #define I2C_HID_QUIRK_BAD_INPUT_SIZE BIT(3) #define I2C_HID_QUIRK_NO_WAKEUP_AFTER_RESET BIT(4) +#define I2C_HID_QUIRK_NO_SLEEP_ON_SUSPEND BIT(5) /* Command opcodes */ #define I2C_HID_OPCODE_RESET 0x01 @@ -131,6 +132,8 @@ static const struct i2c_hid_quirks { I2C_HID_QUIRK_RESET_ON_RESUME }, { USB_VENDOR_ID_ITE, I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720, I2C_HID_QUIRK_BAD_INPUT_SIZE }, + { I2C_VENDOR_ID_CIRQUE, I2C_PRODUCT_ID_CIRQUE_1063, + I2C_HID_QUIRK_NO_SLEEP_ON_SUSPEND }, /* * Sending the wakeup after reset actually break ELAN touchscreen controller */ @@ -956,7 +959,8 @@ static int i2c_hid_core_suspend(struct i2c_hid *ihid, bool force_poweroff) return ret; /* Save some power */ - i2c_hid_set_power(ihid, I2C_HID_PWR_SLEEP); + if (!(ihid->quirks & I2C_HID_QUIRK_NO_SLEEP_ON_SUSPEND)) + i2c_hid_set_power(ihid, I2C_HID_PWR_SLEEP); disable_irq(client->irq);