Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp5619180imu; Mon, 26 Nov 2018 03:05:42 -0800 (PST) X-Google-Smtp-Source: AFSGD/WinJtYbKfdl2Q/Vy+VreSkG4UR8RPHd56/H13tuPqS/M5p1QWKNssEADa9AarK9vnWX5Mn X-Received: by 2002:a63:955a:: with SMTP id t26mr24682809pgn.449.1543230342891; Mon, 26 Nov 2018 03:05:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543230342; cv=none; d=google.com; s=arc-20160816; b=0+Lq4ys0OEQmtwdSlQhvlwnY/rKyPgWE0R52r+5zQ9UXiMcJ35lZ10WdcaWd4RxN+k Ficnh0oEPKfR7SwqYurxbRMcUE2WNmFEBXCBsAYd9jF7B4/XsX51Q9dSViIoMfDCWpu6 BcluVqC3srFNlt34PTWJYbst81SRUsrCFIVy4Hi/y8yMbdVnRgLByWUc5ceGoxTYWVZe lt9TfsWOEzO58c4FFRgjPhlyNIFpFIC+nqlhe+uMob33KWGYCJe22R4vN+okJ1+j4qsQ UektSE7wv/23Di40kgWd/sErvxFIpXE75UDzIthnVcBoecKfLsIu3xIIwjj5q4Nl4Axv O/Wg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=7vVb6iaJJ/pPhPnfKx6LMkTVfRvlQUafX3Zbd3S0hS8=; b=Wbr7Qh75y2zji+XHAbuzwLYdLvvY/mB3VZ6JLcPxdN/Gi1vkUDjOWLPgv/825VBSiD YxKVY7onblrWAS9J8Wu91kxEijYuACILh6E7cN2NYgH1aGFz8hX/sLFCp8K2WeUL8By/ Glk/pVNUcmP6ZRiH410WbVKCvvzRdctzv2/+ZPX59b15g1lRbCD5MtaFkiqiMujuoOS+ QtQ1ETSPapGSPgpkolBpbX+C8Q+fCKiiBNr9Jf/tEtAhF9x7jWkHkbhs8NHQFuxsZpzc NedwdnRkaTmTZ2U0wKgUKlNbCtTsmRvQhDri0+Rmhjmivu4P23YQYOiGJTs0YIJsyvHL kt4A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=tUUgyylC; 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 s192si64828547pgc.144.2018.11.26.03.05.28; Mon, 26 Nov 2018 03:05:42 -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=@kernel.org header.s=default header.b=tUUgyylC; 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 S1731136AbeKZV6i (ORCPT + 99 others); Mon, 26 Nov 2018 16:58:38 -0500 Received: from mail.kernel.org ([198.145.29.99]:43982 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726307AbeKZV6h (ORCPT ); Mon, 26 Nov 2018 16:58:37 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 395BD20645; Mon, 26 Nov 2018 11:04:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1543230291; bh=B7uStpCXEtydp7MEapUlFcLCwkNFP+Ox47CIe/gjSzE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=tUUgyylC7PvA7vK0ALMVpGNFqirHjbJq80GSEpfP3Q5F7qZsULoYwSN/1UKy4f5h7 iGHlPg8PdSWfb6nBVj5FbXT6P1BpHg/D6c8Q941VIwddtoQGO5Sq5nq3hEiDKM4mGx 703SZkbnwppLBJDUH9lO6SgEF8i6szPxP7E1+omU= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Kai-Heng Feng , Benjamin Tissoires , Jiri Kosina , Sasha Levin Subject: [PATCH 4.19 037/118] HID: i2c-hid: Add a small delay after sleep command for Raydium touchpanel Date: Mon, 26 Nov 2018 11:50:31 +0100 Message-Id: <20181126105102.203155837@linuxfoundation.org> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20181126105059.832485122@linuxfoundation.org> References: <20181126105059.832485122@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.19-stable review patch. If anyone has any objections, please let me know. ------------------ [ Upstream commit 00b790ea545b6ef30221adef6e9c3707e03b82b5 ] Raydium touchpanel (2386:4B33) sometimes does not work in desktop session although it works in display manager. During user logging, the display manager exits, close the HID device, then the device gets runtime suspended and powered off. The desktop session begins shortly after, opens the HID device, then the device gets runtime resumed and powered on. If the trasition from display manager to desktop sesesion is fast, the touchpanel cannot switch from powered off to powered on in short timeframe. So add a small delay to workaround the issue. Signed-off-by: Kai-Heng Feng Reviewed-by: Benjamin Tissoires Signed-off-by: Jiri Kosina Signed-off-by: Sasha Levin --- drivers/hid/hid-ids.h | 3 +++ drivers/hid/i2c-hid/i2c-hid.c | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index bc49909aba8e..636b9d903b26 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -921,6 +921,9 @@ #define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3003 0x3003 #define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3008 0x3008 +#define I2C_VENDOR_ID_RAYDIUM 0x2386 +#define I2C_PRODUCT_ID_RAYDIUM_4B33 0x4b33 + #define USB_VENDOR_ID_RAZER 0x1532 #define USB_DEVICE_ID_RAZER_BLADE_14 0x011D diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c index 4e3592e7a3f7..88daa388e1f6 100644 --- a/drivers/hid/i2c-hid/i2c-hid.c +++ b/drivers/hid/i2c-hid/i2c-hid.c @@ -48,6 +48,7 @@ #define I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV BIT(0) #define I2C_HID_QUIRK_NO_IRQ_AFTER_RESET BIT(1) #define I2C_HID_QUIRK_NO_RUNTIME_PM BIT(2) +#define I2C_HID_QUIRK_DELAY_AFTER_SLEEP BIT(3) /* flags */ #define I2C_HID_STARTED 0 @@ -157,6 +158,8 @@ struct i2c_hid { bool irq_wake_enabled; struct mutex reset_lock; + + unsigned long sleep_delay; }; static const struct i2c_hid_quirks { @@ -171,6 +174,8 @@ static const struct i2c_hid_quirks { { I2C_VENDOR_ID_HANTICK, I2C_PRODUCT_ID_HANTICK_5288, I2C_HID_QUIRK_NO_IRQ_AFTER_RESET | I2C_HID_QUIRK_NO_RUNTIME_PM }, + { I2C_VENDOR_ID_RAYDIUM, I2C_PRODUCT_ID_RAYDIUM_4B33, + I2C_HID_QUIRK_DELAY_AFTER_SLEEP }, { 0, 0 } }; @@ -386,6 +391,7 @@ static int i2c_hid_set_power(struct i2c_client *client, int power_state) { struct i2c_hid *ihid = i2c_get_clientdata(client); int ret; + unsigned long now, delay; i2c_hid_dbg(ihid, "%s\n", __func__); @@ -403,9 +409,22 @@ static int i2c_hid_set_power(struct i2c_client *client, int power_state) goto set_pwr_exit; } + if (ihid->quirks & I2C_HID_QUIRK_DELAY_AFTER_SLEEP && + power_state == I2C_HID_PWR_ON) { + now = jiffies; + if (time_after(ihid->sleep_delay, now)) { + delay = jiffies_to_usecs(ihid->sleep_delay - now); + usleep_range(delay, delay + 1); + } + } + ret = __i2c_hid_command(client, &hid_set_power_cmd, power_state, 0, NULL, 0, NULL, 0); + if (ihid->quirks & I2C_HID_QUIRK_DELAY_AFTER_SLEEP && + power_state == I2C_HID_PWR_SLEEP) + ihid->sleep_delay = jiffies + msecs_to_jiffies(20); + if (ret) dev_err(&client->dev, "failed to change power setting.\n"); -- 2.17.1