From patchwork Mon May 20 18:37:46 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajay Gupta X-Patchwork-Id: 10952215 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B37E776 for ; Mon, 20 May 2019 18:39:41 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A1D3728606 for ; Mon, 20 May 2019 18:39:41 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 95B6728911; Mon, 20 May 2019 18:39:41 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A61F328606 for ; Mon, 20 May 2019 18:39:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726566AbfETSjj (ORCPT ); Mon, 20 May 2019 14:39:39 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:37083 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725601AbfETSji (ORCPT ); Mon, 20 May 2019 14:39:38 -0400 Received: by mail-pf1-f194.google.com with SMTP id g3so7647886pfi.4; Mon, 20 May 2019 11:39:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=u+oHAcGtZPY9MkX964m6K0jEbxGlXsOBCtw8/XdWJBc=; b=dTmdtBTu0KfU3JKjyHehh3qdTB2scmcJhxCj36zjcU+iTyZ8nBnIZfbo9f8tuMMZOx yYV2j34uWSPLOZqAF5DmmLAwVUyo3rxtGRB4dicZ7O91HqPw5eQL0gGv7qzaJFxD+ZeG NTRYUPl0hM4JZ6IvqI/oBgJ3AygxFaRh5GruCm29Ht+UyItUWHxwTJNW51oriky8lYjV KSarYVsQ1REdWLaNuI0bAGqZL/BvoNWl5Ewda4qYwo3e7XU7TbC0PbZW6v133YZSrQPn qvtthTltLJV0jGhQlVofLC9Y19k/06hKet0qr6AIUvj7N5joQiPOBxXGHUnq33J9HKSk oi/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=u+oHAcGtZPY9MkX964m6K0jEbxGlXsOBCtw8/XdWJBc=; b=Mf8ngkUvnyltR8jXYahB1gDgsBZCa8hEknsEcMjUIlGMOAWxADGfnbtpPuO3vmR0d2 9+z5D9HP6xQSgP23aK6JZbT+92MSTfZ6JznrIuCVvx1FBdthlOQDOomoxGRFiqzcvg5u e1KJj3kf75xchgYb09A6TNAGXwAvUxBO0WP8W+6WAMETGQmqSGqi8VNiAe+FQh4zilSi Ke6+1EsBvHMXqh8IifMDZ8JwF/4oaSDdmXSKAIHUebkQJmnujig0QMZ7IyfFiijkDMr1 KzpU17meCpMOvK9RE8A3NGrrf1Djibs79kAW49JH89sC8A0hZux4wAtthpXvxIfwpsdz FG1Q== X-Gm-Message-State: APjAAAXD5dH/v8gmSRcTumE1GPlqws9etzSw5zzrTeNXFXYtjfj7fZNO zDJtisljndibzsFyNVB1Vak= X-Google-Smtp-Source: APXvYqxnoFEGqhsuPeiYEh66EFNa4z6hrkx+5iQk8asm+b8U77y78ez+hQhdN/LWoWnygndHWI6nWQ== X-Received: by 2002:a65:42c3:: with SMTP id l3mr52887154pgp.372.1558377577936; Mon, 20 May 2019 11:39:37 -0700 (PDT) Received: from ajayg.nvidia.com (searspoint.nvidia.com. [216.228.112.21]) by smtp.gmail.com with ESMTPSA id o20sm22321288pgj.70.2019.05.20.11.39.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 20 May 2019 11:39:37 -0700 (PDT) From: Ajay Gupta X-Google-Original-From: Ajay Gupta To: heikki.krogerus@linux.intel.com, wsa@the-dreams.de Cc: linux-usb@vger.kernel.org, linux-i2c@vger.kernel.org, Ajay Gupta Subject: [PATCH v2 1/5] i2c: nvidia-gpu: refactor master_xfer Date: Mon, 20 May 2019 11:37:46 -0700 Message-Id: <20190520183750.2932-2-ajayg@nvidia.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190520183750.2932-1-ajayg@nvidia.com> References: <20190520183750.2932-1-ajayg@nvidia.com> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Ajay Gupta Added a local variable "send_stop" to simplify "goto" statements. The "send_stop" handles below two case 1) When first i2c start fails and so i2c stop is not sent before exiting 2) When i2c stop failed after all transfers and we do not need to send another stop before exiting. Signed-off-by: Ajay Gupta --- drivers/i2c/busses/i2c-nvidia-gpu.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/drivers/i2c/busses/i2c-nvidia-gpu.c b/drivers/i2c/busses/i2c-nvidia-gpu.c index 1c8f708f212b..2d9561ec2320 100644 --- a/drivers/i2c/busses/i2c-nvidia-gpu.c +++ b/drivers/i2c/busses/i2c-nvidia-gpu.c @@ -169,6 +169,7 @@ static int gpu_i2c_master_xfer(struct i2c_adapter *adap, { struct gpu_i2c_dev *i2cd = i2c_get_adapdata(adap); int status, status2; + bool send_stop = true; int i, j; /* @@ -182,37 +183,41 @@ static int gpu_i2c_master_xfer(struct i2c_adapter *adap, /* gpu_i2c_read has implicit start */ status = gpu_i2c_read(i2cd, msgs[i].buf, msgs[i].len); if (status < 0) - goto stop; + goto exit; } else { u8 addr = i2c_8bit_addr_from_msg(msgs + i); status = gpu_i2c_start(i2cd); if (status < 0) { if (i == 0) - return status; - goto stop; + send_stop = false; + goto exit; } status = gpu_i2c_write(i2cd, addr); if (status < 0) - goto stop; + goto exit; for (j = 0; j < msgs[i].len; j++) { status = gpu_i2c_write(i2cd, msgs[i].buf[j]); if (status < 0) - goto stop; + goto exit; } } } status = gpu_i2c_stop(i2cd); - if (status < 0) - return status; + if (status < 0) { + send_stop = false; + goto exit; + } return i; -stop: - status2 = gpu_i2c_stop(i2cd); - if (status2 < 0) - dev_err(i2cd->dev, "i2c stop failed %d\n", status2); +exit: + if (send_stop) { + status2 = gpu_i2c_stop(i2cd); + if (status2 < 0) + dev_err(i2cd->dev, "i2c stop failed %d\n", status2); + } return status; } From patchwork Mon May 20 18:37:47 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajay Gupta X-Patchwork-Id: 10952213 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8DB7C1708 for ; Mon, 20 May 2019 18:39:41 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 794BB28910 for ; Mon, 20 May 2019 18:39:41 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6DB0C2891F; Mon, 20 May 2019 18:39:41 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 564B428910 for ; Mon, 20 May 2019 18:39:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726571AbfETSjj (ORCPT ); Mon, 20 May 2019 14:39:39 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:45674 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725601AbfETSjj (ORCPT ); Mon, 20 May 2019 14:39:39 -0400 Received: by mail-pf1-f196.google.com with SMTP id s11so7625554pfm.12; Mon, 20 May 2019 11:39:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=PZ/tbcFcCvHOSqEDz47sYlToMZ2Jk0dbzOiy+eRO5oU=; b=JicZLJLc7jIXqI88XOZcdgN5TXsjQ3T6CP4gdnV1/wQCIq76FIqPutTsBccpkk/nkP mMQ5MPuzb2GfapCogvNWb01r299RXx1yHch888LkrjLHwO7KJf1u9xKZieHQ2CkqHU6H EOhgUr3KRscSzOQUKgFi7k2JFjcn5HGflestELyFcZPHArhq/YxbS7aTFHtd6S+6/tW2 XR8rkRRqDMb21M15cqJpoAcbKrnjijQFD243sjyQUSt5M9vKt8T6NcLhONsQIf3HlX9v 2pg5Z/I5PoC/y1LBAT+YmS7JD/0ItrgZANCdG1miRx2UQIEsnhhsy1IwA9eIvLuThVmD 8P6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=PZ/tbcFcCvHOSqEDz47sYlToMZ2Jk0dbzOiy+eRO5oU=; b=gJ9Ugga39Rw4Kgg2EHn1drojx4bFPNR7yYr/bjIBh37wlQMXjgbbvo4icY0BACWZ+j OCClei3QLt1EnoRZAmC8fo16AaAPSnsAxouPWbbOV/f/S0ndRzmPUWE2P+hVhbm24CId qYsKZvzmur0nJ8Arc/GwKghi5a/plu5ARZWbpIkMjVrMB1hM1zYq79A/WyZTR2/EojwL TNtlPhA3G8hpZrUFe0J4J9DVyN1yLc+V8d8mnJK+EDpna4nlvnFUvLGytw4PNZgZHj8f hhIouHrrCLqZSV6tsLnvZPGHJJGEIJqSWMVwy9zClGmb6dImHrKFyfA2vLK9q3JmJaYu DAWQ== X-Gm-Message-State: APjAAAVFaCbppd3f95jlR1LBJ6xweNzXHi8Y+hwQQ3BENwQgGGv668f3 bfYc6dNpipdpJQxdWfJxuPE= X-Google-Smtp-Source: APXvYqzo5z0Pr7G9cVCeJIsivJDr8TrF7qaKOQDH2aRg8W/vIlYkiYD/eFaHCHEiM1c9e4Wwx1BX+g== X-Received: by 2002:a62:4607:: with SMTP id t7mr82834358pfa.138.1558377578988; Mon, 20 May 2019 11:39:38 -0700 (PDT) Received: from ajayg.nvidia.com (searspoint.nvidia.com. [216.228.112.21]) by smtp.gmail.com with ESMTPSA id o20sm22321288pgj.70.2019.05.20.11.39.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 20 May 2019 11:39:38 -0700 (PDT) From: Ajay Gupta X-Google-Original-From: Ajay Gupta To: heikki.krogerus@linux.intel.com, wsa@the-dreams.de Cc: linux-usb@vger.kernel.org, linux-i2c@vger.kernel.org, Ajay Gupta Subject: [PATCH v2 2/5] i2c: nvidia-gpu: add runtime pm support Date: Mon, 20 May 2019 11:37:47 -0700 Message-Id: <20190520183750.2932-3-ajayg@nvidia.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190520183750.2932-1-ajayg@nvidia.com> References: <20190520183750.2932-1-ajayg@nvidia.com> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Ajay Gupta Enable runtime pm support with autosuspend delay of three second. This is to make sure I2C client device Cypress CCGx has completed all transaction. Signed-off-by: Ajay Gupta --- Changes from v1->v2: None drivers/i2c/busses/i2c-nvidia-gpu.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-nvidia-gpu.c b/drivers/i2c/busses/i2c-nvidia-gpu.c index 2d9561ec2320..af445590041b 100644 --- a/drivers/i2c/busses/i2c-nvidia-gpu.c +++ b/drivers/i2c/busses/i2c-nvidia-gpu.c @@ -176,6 +176,7 @@ static int gpu_i2c_master_xfer(struct i2c_adapter *adap, * The controller supports maximum 4 byte read due to known * limitation of sending STOP after every read. */ + pm_runtime_get_sync(i2cd->dev); for (i = 0; i < num; i++) { if (msgs[i].flags & I2C_M_RD) { /* program client address before starting read */ @@ -211,6 +212,8 @@ static int gpu_i2c_master_xfer(struct i2c_adapter *adap, goto exit; } + pm_runtime_mark_last_busy(i2cd->dev); + pm_runtime_put_autosuspend(i2cd->dev); return i; exit: if (send_stop) { @@ -218,6 +221,8 @@ static int gpu_i2c_master_xfer(struct i2c_adapter *adap, if (status2 < 0) dev_err(i2cd->dev, "i2c stop failed %d\n", status2); } + pm_runtime_mark_last_busy(i2cd->dev); + pm_runtime_put_autosuspend(i2cd->dev); return status; } @@ -337,6 +342,11 @@ static int gpu_i2c_probe(struct pci_dev *pdev, const struct pci_device_id *id) goto del_adapter; } + pm_runtime_set_autosuspend_delay(&pdev->dev, 3000); + pm_runtime_use_autosuspend(&pdev->dev); + pm_runtime_put_autosuspend(&pdev->dev); + pm_runtime_allow(&pdev->dev); + return 0; del_adapter: @@ -350,10 +360,16 @@ static void gpu_i2c_remove(struct pci_dev *pdev) { struct gpu_i2c_dev *i2cd = dev_get_drvdata(&pdev->dev); + pm_runtime_get_noresume(i2cd->dev); i2c_del_adapter(&i2cd->adapter); pci_free_irq_vectors(pdev); } +static int gpu_i2c_suspend(struct device *dev) +{ + return 0; +} + static __maybe_unused int gpu_i2c_resume(struct device *dev) { struct gpu_i2c_dev *i2cd = dev_get_drvdata(dev); @@ -362,7 +378,8 @@ static __maybe_unused int gpu_i2c_resume(struct device *dev) return 0; } -static UNIVERSAL_DEV_PM_OPS(gpu_i2c_driver_pm, NULL, gpu_i2c_resume, NULL); +static UNIVERSAL_DEV_PM_OPS(gpu_i2c_driver_pm, gpu_i2c_suspend, gpu_i2c_resume, + NULL); static struct pci_driver gpu_i2c_driver = { .name = "nvidia-gpu", From patchwork Mon May 20 18:37:48 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajay Gupta X-Patchwork-Id: 10952217 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B81BD16C1 for ; Mon, 20 May 2019 18:39:42 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A69A0288FD for ; Mon, 20 May 2019 18:39:42 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9B39D2890C; Mon, 20 May 2019 18:39:42 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2782128606 for ; Mon, 20 May 2019 18:39:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726584AbfETSjl (ORCPT ); Mon, 20 May 2019 14:39:41 -0400 Received: from mail-pg1-f195.google.com ([209.85.215.195]:34347 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725601AbfETSjl (ORCPT ); Mon, 20 May 2019 14:39:41 -0400 Received: by mail-pg1-f195.google.com with SMTP id c13so7193729pgt.1; Mon, 20 May 2019 11:39:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ZNeknb8PGKUKLTWwoHkpexxbNOhtv1U320+t2geunDU=; b=XQpa+iKRqFGDkGMUxnwiTI4jcMagDJtTt2zUXinzlS/yfIxm13IF7gU3PRCrnb4xM2 +w+tQ6kI4L/JtskDeif8gDnWUaDFgKcBdh8s4wmAPNJA53GGGICbvtymsdodcfPUmGQ0 DUra2RiLvSd2y9D+i/vn6+voFQmboz0I8FOZRFxiYk6KJdhfetGyyx9XNDtgvheQOQyV imx2mTzN/XnnVMu8/A77EBZHwZxYftYHT0aB87gqqA8ZSLMuPTz+Ma3iiUzuZvwfsn/c jXJx6G2YyfHTWPX5rly5ym75I4A8NYJJe+lbRybmDYTuwSrXh3AgksH/2ZLPA8DRTsZf ukhA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ZNeknb8PGKUKLTWwoHkpexxbNOhtv1U320+t2geunDU=; b=VfLa+7nA9MDcW8xmuy5hv8xAd7JeOIr02th+FmKT6eLeCol3t0I6PJwFeuCqKdEnDh +1acjeYWhb1W5UR88sRbJQa5uRZJ5pwolm7XsVlYcCItxitEXPVm3JhBr1mbmZ7mumko Axz9MKtyZzN9K2IGFj4tm4TlJ5I8A5HgZ0wd5YxQ0e6xZaA+AwHYx3SUxCOsL97KMxg8 QySD1H8lBoggjSNBWiMFfiURY9sz1acK5TcK0wFElyIUJT2ZcgzHjcKb41Lsw0l5Qvvz 8SgJ7iA2TYvAzVrroR4ukDdkSAXFlcrkmPuCj+z1ojdfH2dIY/1JwhA4Al5iKQWRHT+u oWeA== X-Gm-Message-State: APjAAAVrebFNr/dMK1QU5R0mMJk8dTQ6rt7M+qf/CyujIlh/ZFUZaOAB /Yg025OTTjkFxn1ffVYbZZZXqQovnJs= X-Google-Smtp-Source: APXvYqypWz5ne83xcaprjSZ7xvdhZ+uNXhfnYWjzOsB97iMBn4kwA27hajkJ0KXVsBk71Yd+mqa6HQ== X-Received: by 2002:a62:4e86:: with SMTP id c128mr81377582pfb.39.1558377579972; Mon, 20 May 2019 11:39:39 -0700 (PDT) Received: from ajayg.nvidia.com (searspoint.nvidia.com. [216.228.112.21]) by smtp.gmail.com with ESMTPSA id o20sm22321288pgj.70.2019.05.20.11.39.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 20 May 2019 11:39:39 -0700 (PDT) From: Ajay Gupta X-Google-Original-From: Ajay Gupta To: heikki.krogerus@linux.intel.com, wsa@the-dreams.de Cc: linux-usb@vger.kernel.org, linux-i2c@vger.kernel.org, Ajay Gupta Subject: [PATCH v2 3/5] usb: typec: ucsi: ccg: enable runtime pm support Date: Mon, 20 May 2019 11:37:48 -0700 Message-Id: <20190520183750.2932-4-ajayg@nvidia.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190520183750.2932-1-ajayg@nvidia.com> References: <20190520183750.2932-1-ajayg@nvidia.com> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Ajay Gupta The change enables runtime pm support to UCSI CCG driver. ucsi_send_command() is used in resume path and so exported ucsi_send_command() symbol in ucsi.c for modular build. Signed-off-by: Ajay Gupta --- Changes from v1->v2 : None drivers/usb/typec/ucsi/ucsi.c | 1 + drivers/usb/typec/ucsi/ucsi_ccg.c | 60 +++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c index 7850b851cecd..e9454134d399 100644 --- a/drivers/usb/typec/ucsi/ucsi.c +++ b/drivers/usb/typec/ucsi/ucsi.c @@ -206,6 +206,7 @@ int ucsi_send_command(struct ucsi *ucsi, struct ucsi_control *ctrl, return ret; } +EXPORT_SYMBOL_GPL(ucsi_send_command); /* -------------------------------------------------------------------------- */ diff --git a/drivers/usb/typec/ucsi/ucsi_ccg.c b/drivers/usb/typec/ucsi/ucsi_ccg.c index 9d46aa9e4e35..cc7094ecda2d 100644 --- a/drivers/usb/typec/ucsi/ucsi_ccg.c +++ b/drivers/usb/typec/ucsi/ucsi_ccg.c @@ -14,6 +14,8 @@ #include #include #include +#include +#include #include #include "ucsi.h" @@ -210,6 +212,7 @@ static int ccg_read(struct ucsi_ccg *uc, u16 rab, u8 *data, u32 len) if (quirks && quirks->max_read_len) max_read_len = quirks->max_read_len; + pm_runtime_get_sync(uc->dev); while (rem_len > 0) { msgs[1].buf = &data[len - rem_len]; rlen = min_t(u16, rem_len, max_read_len); @@ -218,12 +221,14 @@ static int ccg_read(struct ucsi_ccg *uc, u16 rab, u8 *data, u32 len) status = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); if (status < 0) { dev_err(uc->dev, "i2c_transfer failed %d\n", status); + pm_runtime_put_sync(uc->dev); return status; } rab += rlen; rem_len -= rlen; } + pm_runtime_put_sync(uc->dev); return 0; } @@ -249,13 +254,16 @@ static int ccg_write(struct ucsi_ccg *uc, u16 rab, u8 *data, u32 len) msgs[0].len = len + sizeof(rab); msgs[0].buf = buf; + pm_runtime_get_sync(uc->dev); status = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); if (status < 0) { dev_err(uc->dev, "i2c_transfer failed %d\n", status); + pm_runtime_put_sync(uc->dev); kfree(buf); return status; } + pm_runtime_put_sync(uc->dev); kfree(buf); return 0; } @@ -1134,6 +1142,10 @@ static int ucsi_ccg_probe(struct i2c_client *client, if (status) dev_err(uc->dev, "cannot create sysfs group: %d\n", status); + pm_runtime_set_active(uc->dev); + pm_runtime_enable(uc->dev); + pm_runtime_idle(uc->dev); + return 0; } @@ -1143,6 +1155,7 @@ static int ucsi_ccg_remove(struct i2c_client *client) cancel_work_sync(&uc->work); ucsi_unregister_ppm(uc->ucsi); + pm_runtime_disable(uc->dev); free_irq(uc->irq, uc); sysfs_remove_group(&uc->dev->kobj, &ucsi_ccg_attr_group); @@ -1155,9 +1168,56 @@ static const struct i2c_device_id ucsi_ccg_device_id[] = { }; MODULE_DEVICE_TABLE(i2c, ucsi_ccg_device_id); +static int ucsi_ccg_suspend(struct device *dev) +{ + return 0; +} + +static int ucsi_ccg_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct ucsi_ccg *uc = i2c_get_clientdata(client); + struct ucsi *ucsi = uc->ucsi; + struct ucsi_control c; + int ret; + + /* restore UCSI notification enable mask */ + UCSI_CMD_SET_NTFY_ENABLE(c, UCSI_ENABLE_NTFY_ALL); + ret = ucsi_send_command(ucsi, &c, NULL, 0); + if (ret < 0) { + dev_err(uc->dev, "%s: failed to set notification enable - %d\n", + __func__, ret); + } + return 0; +} + +static int ucsi_ccg_runtime_suspend(struct device *dev) +{ + return 0; +} + +static int ucsi_ccg_runtime_resume(struct device *dev) +{ + return 0; +} + +static int ucsi_ccg_runtime_idle(struct device *dev) +{ + return 0; +} + +static const struct dev_pm_ops ucsi_ccg_pm = { + .suspend = ucsi_ccg_suspend, + .resume = ucsi_ccg_resume, + .runtime_suspend = ucsi_ccg_runtime_suspend, + .runtime_resume = ucsi_ccg_runtime_resume, + .runtime_idle = ucsi_ccg_runtime_idle, +}; + static struct i2c_driver ucsi_ccg_driver = { .driver = { .name = "ucsi_ccg", + .pm = &ucsi_ccg_pm, }, .probe = ucsi_ccg_probe, .remove = ucsi_ccg_remove, From patchwork Mon May 20 18:37:49 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajay Gupta X-Patchwork-Id: 10952219 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9118E16C1 for ; Mon, 20 May 2019 18:39:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 82091286A4 for ; Mon, 20 May 2019 18:39:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 768B628910; Mon, 20 May 2019 18:39:43 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 128AC288FD for ; Mon, 20 May 2019 18:39:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726590AbfETSjm (ORCPT ); Mon, 20 May 2019 14:39:42 -0400 Received: from mail-pl1-f195.google.com ([209.85.214.195]:38609 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726586AbfETSjl (ORCPT ); Mon, 20 May 2019 14:39:41 -0400 Received: by mail-pl1-f195.google.com with SMTP id f97so7099673plb.5; Mon, 20 May 2019 11:39:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Ut7E9wDK6wYglc03Ugsb4hwLeRPLBJfYWZ8fNdK57pM=; b=dYEvjzqcduv1KHlCLhyEWY54yfIP5wQnnlwn4d0AfXf6gIuWU8gcv2ApuVEvPg+LM+ yayDuZFW0dB3ZzshIzS9TJ25hEJEHplNl4GTCp29JLM7n1uKitoF06jybo1ZvcAP420J 3CLE7PZA7mUdtBdOqv6TueeLI1Qo0Li38D1FvMUEagQPCMt4fq2ncuIwodxigE7BX/DS 9Jh7GHWTk9THmtVcN8ySKSfzh3R/eWAEWhFpx5Z3w5hyfSb3kBQyXj15Fg37vFiCiXnh lIqIJ4u+ySIEc/3zm3aqtCa3EOhFcUmMrRNhYbX5Xniy1h1yNL49NbCSJhIlDLm4xYwe byVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Ut7E9wDK6wYglc03Ugsb4hwLeRPLBJfYWZ8fNdK57pM=; b=mZBdr/1KAQV/JxnxOXtPpO/fbJdV0cecyGNyfCA2wD06vu2kJiWm2du2La/T7I0Zsv QPtm3UMNtdWQSTEkKa2dI30rvoWwQUjgeCF0wSeCPHqJSPwKYoydIJRbiKqIyBn/ikW0 VmVJeB8+RUPfX7loFV98+ZpN9Cl72C4vBjk5+IO52M0egOnOOFKuflQgHz98i4Ns8tPd cl0iSACGHpxYHFFyPcMVbIA6Ut3XLr+pK5NJ9jSdwhrXB6AcHs3ST1RKHF01u1QnQvHW Ah/B8nwpY76lnCJyz95K5TetE1nhEwWOO5S/LJCIANz1F7NqjqDdZblz8anBZpPvEcwF ZptQ== X-Gm-Message-State: APjAAAWuRAtJjBv8h14ga69vLYpwnfAo5aJaGkIRFl35v0iRKYo7/aB+ kzx6zqdnGBGuCMVVx8V9uQ1lOU5g1fM= X-Google-Smtp-Source: APXvYqxKcD/bIq66EPuxVJBn76Frl3fxEbCCxw736+u1UzzufKZxmxfxoIPCPiaMpq3EoCWNFZtbHQ== X-Received: by 2002:a17:902:8d96:: with SMTP id v22mr1919386plo.282.1558377581004; Mon, 20 May 2019 11:39:41 -0700 (PDT) Received: from ajayg.nvidia.com (searspoint.nvidia.com. [216.228.112.21]) by smtp.gmail.com with ESMTPSA id o20sm22321288pgj.70.2019.05.20.11.39.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 20 May 2019 11:39:40 -0700 (PDT) From: Ajay Gupta X-Google-Original-From: Ajay Gupta To: heikki.krogerus@linux.intel.com, wsa@the-dreams.de Cc: linux-usb@vger.kernel.org, linux-i2c@vger.kernel.org, Ajay Gupta Subject: [PATCH v2 4/5] i2c: nvidia-gpu: resume ccgx i2c client Date: Mon, 20 May 2019 11:37:49 -0700 Message-Id: <20190520183750.2932-5-ajayg@nvidia.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190520183750.2932-1-ajayg@nvidia.com> References: <20190520183750.2932-1-ajayg@nvidia.com> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Ajay Gupta Cypress USB Type-C CCGx controller firmware version 3.1.10 (which is being used in many NVIDIA GPU cards) has known issue of not triggering interrupt when a USB device is hot plugged to runtime resume the controller. If any GPU card gets latest kernel with runtime pm support but does not get latest fixed firmware then also it should continue to work and therefore a workaround is required to check for any connector change event The workaround is to request runtime resume of i2c client which is UCSI Cypress CCGx driver. CCG driver will call the ISR for any connector change event only if NVIDIA GPU has old CCG firmware with the known issue. Signed-off-by: Ajay Gupta --- Changes from v1->v2: Fixed comment from Wolfram by fixing comment style. drivers/i2c/busses/i2c-nvidia-gpu.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/drivers/i2c/busses/i2c-nvidia-gpu.c b/drivers/i2c/busses/i2c-nvidia-gpu.c index af445590041b..6826740fd0f5 100644 --- a/drivers/i2c/busses/i2c-nvidia-gpu.c +++ b/drivers/i2c/busses/i2c-nvidia-gpu.c @@ -51,6 +51,7 @@ struct gpu_i2c_dev { void __iomem *regs; struct i2c_adapter adapter; struct i2c_board_info *gpu_ccgx_ucsi; + struct i2c_client *ccgx_client; }; static void gpu_enable_i2c_bus(struct gpu_i2c_dev *i2cd) @@ -271,8 +272,6 @@ static const struct property_entry ccgx_props[] = { static int gpu_populate_client(struct gpu_i2c_dev *i2cd, int irq) { - struct i2c_client *ccgx_client; - i2cd->gpu_ccgx_ucsi = devm_kzalloc(i2cd->dev, sizeof(*i2cd->gpu_ccgx_ucsi), GFP_KERNEL); @@ -284,8 +283,8 @@ static int gpu_populate_client(struct gpu_i2c_dev *i2cd, int irq) i2cd->gpu_ccgx_ucsi->addr = 0x8; i2cd->gpu_ccgx_ucsi->irq = irq; i2cd->gpu_ccgx_ucsi->properties = ccgx_props; - ccgx_client = i2c_new_device(&i2cd->adapter, i2cd->gpu_ccgx_ucsi); - if (!ccgx_client) + i2cd->ccgx_client = i2c_new_device(&i2cd->adapter, i2cd->gpu_ccgx_ucsi); + if (!i2cd->ccgx_client) return -ENODEV; return 0; @@ -375,6 +374,13 @@ static __maybe_unused int gpu_i2c_resume(struct device *dev) struct gpu_i2c_dev *i2cd = dev_get_drvdata(dev); gpu_enable_i2c_bus(i2cd); + /* + * Runtime resume ccgx client so that it can see for any + * connector change event. Old ccg firmware has known + * issue of not triggering interrupt when a device is + * connected to runtime resume the controller. + */ + pm_request_resume(&i2cd->ccgx_client->dev); return 0; } From patchwork Mon May 20 18:37:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajay Gupta X-Patchwork-Id: 10952221 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5BDDA76 for ; Mon, 20 May 2019 18:39:45 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4A852286A4 for ; Mon, 20 May 2019 18:39:45 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3E5E52891B; Mon, 20 May 2019 18:39:45 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 09A84286A4 for ; Mon, 20 May 2019 18:39:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726593AbfETSjn (ORCPT ); Mon, 20 May 2019 14:39:43 -0400 Received: from mail-pl1-f193.google.com ([209.85.214.193]:38609 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726586AbfETSjm (ORCPT ); Mon, 20 May 2019 14:39:42 -0400 Received: by mail-pl1-f193.google.com with SMTP id f97so7099692plb.5; Mon, 20 May 2019 11:39:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ZOfsNtweh+Zfa1pn2YhTWYIlRvL2lnuKPPzLBcE96WM=; b=jhfnJmkjglj/APKdpvtp0mfGWlki0cHW0q6KN0fSxAvvn4FDM/ID4IlluAlrAQ+W10 9nSFPs6NsfpX87TIppDqY3tsGEVetJtEuDmGTPplHzSUNlVbydpA8Fmkx9fmqqggUZxL 0SCAFxh9AGgpk14pBHix7NwNJFfEzO7u4JQxpRCPZcK7fwsUDllyEl5lZQf40MtLv32o 8zO0vARtMdh2sS4Ckxn+zRZ6tgZYdWVklVth+5O4qTAj7c2SBu0eMbyKbTZDuMYN/cA+ qEn0DylSdLxz2+p4IqKDUNlTQHblKiEo3164pGJysmMKIUlhzZ6bay9CSSP4BOwt1DS4 OgDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ZOfsNtweh+Zfa1pn2YhTWYIlRvL2lnuKPPzLBcE96WM=; b=K3KVsTfDB/tUAlxMPwodq16XDRk9FSB5UA/IJwUXpMK6XEw+u7i9v9Q2n0FTiTwG83 BzEtRbG4CxicomEtUkapTLyru3xl1Zj2GGFI2DXhl8fqb+QxFYnxUePikirazEgvx5Ut O4mOLNHlZc4wqB2QMQIBYJ2H8Jdifw4uCtHg59KsYgj9cGsF7qaP3Y4c9ZWlnwmeQl+k Xxl8nbAnrW1LtieWqe14DX7EsyizlJNM2LtkSqYTabrUFeJ0zNfMwkZqYUWQXLwLZYY4 S/84XtVzLEzIKVJuDzh+MFygqE0F9qROwNujNy6dreoOSkUHwUxaZ25b0Y1VKl8xI2Lz u31Q== X-Gm-Message-State: APjAAAVfF7qqf8tG5pLrIdRK/viDPxwvzoLEqxk0Dva2f7a/LQCNXkCn lDalKoKVouehq7JXi5H7U0Q= X-Google-Smtp-Source: APXvYqxXYC2PAIyyJfb2YMZpPHX3rNDrBaXc1+MmqmxJlrDh0iLxMhedgI9EptKxjP2pbEc336s6Pg== X-Received: by 2002:a17:902:ac90:: with SMTP id h16mr14637842plr.162.1558377582055; Mon, 20 May 2019 11:39:42 -0700 (PDT) Received: from ajayg.nvidia.com (searspoint.nvidia.com. [216.228.112.21]) by smtp.gmail.com with ESMTPSA id o20sm22321288pgj.70.2019.05.20.11.39.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 20 May 2019 11:39:41 -0700 (PDT) From: Ajay Gupta X-Google-Original-From: Ajay Gupta To: heikki.krogerus@linux.intel.com, wsa@the-dreams.de Cc: linux-usb@vger.kernel.org, linux-i2c@vger.kernel.org, Ajay Gupta Subject: [PATCH v2 5/5] usb: typec: ucsi: ccg: add runtime pm workaround Date: Mon, 20 May 2019 11:37:50 -0700 Message-Id: <20190520183750.2932-6-ajayg@nvidia.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190520183750.2932-1-ajayg@nvidia.com> References: <20190520183750.2932-1-ajayg@nvidia.com> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Ajay Gupta Cypress USB Type-C CCGx controller firmware version 3.1.10 (which is being used in many NVIDIA GPU cards) has known issue of not triggering interrupt when a USB device is hot plugged to runtime resume the controller. If any GPU card gets latest kernel with runtime pm support but does not get latest fixed firmware then also it should continue to work and therefore a workaround is required to check for any connector change event. The workaround is that i2c bus driver will call pm_request_resume() to runtime resume ucsi_ccg driver. CCG driver will call the ISR for any connector change event for NVIDIA GPU card and only if it has old CCG firmware with the known issue. Signed-off-by: Ajay Gupta --- Changes from v1->v2: - Fixed comment style - Added new macros for NVIDIA old FW builds instead of structure variable for them drivers/usb/typec/ucsi/ucsi_ccg.c | 80 +++++++++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 4 deletions(-) diff --git a/drivers/usb/typec/ucsi/ucsi_ccg.c b/drivers/usb/typec/ucsi/ucsi_ccg.c index cc7094ecda2d..0b9f60861497 100644 --- a/drivers/usb/typec/ucsi/ucsi_ccg.c +++ b/drivers/usb/typec/ucsi/ucsi_ccg.c @@ -109,12 +109,21 @@ struct version_format { __le16 build; u8 patch; u8 ver; +#define CCG_VERSION_PATCH(x) ((x) << 16) +#define CCG_VERSION(x) ((x) << 24) #define CCG_VERSION_MIN_SHIFT (0) #define CCG_VERSION_MIN_MASK (0xf << CCG_VERSION_MIN_SHIFT) #define CCG_VERSION_MAJ_SHIFT (4) #define CCG_VERSION_MAJ_MASK (0xf << CCG_VERSION_MAJ_SHIFT) } __packed; +/* + * Firmware version 3.1.10 or earlier, built for NVIDIA has known issue + * of missing interrupt when a device is connected for runtime resume + */ +#define CCG_FW_BUILD_NVIDIA (('n' << 8) | 'v') +#define CCG_OLD_FW_VERSION (CCG_VERSION(0x31) | CCG_VERSION_PATCH(10)) + struct version_info { struct version_format base; struct version_format app; @@ -172,6 +181,7 @@ struct ucsi_ccg { struct ccg_dev_info info; /* version info for boot, primary and secondary */ struct version_info version[FW2 + 1]; + u32 fw_version; /* CCG HPI communication flags */ unsigned long flags; #define RESET_PENDING 0 @@ -185,6 +195,8 @@ struct ucsi_ccg { /* fw build with vendor information */ u16 fw_build; + bool run_isr; /* flag to call ISR routine during resume */ + struct work_struct pm_work; }; static int ccg_read(struct ucsi_ccg *uc, u16 rab, u8 *data, u32 len) @@ -212,6 +224,18 @@ static int ccg_read(struct ucsi_ccg *uc, u16 rab, u8 *data, u32 len) if (quirks && quirks->max_read_len) max_read_len = quirks->max_read_len; + if (uc->fw_build == CCG_FW_BUILD_NVIDIA && + uc->fw_version <= CCG_OLD_FW_VERSION) { + mutex_lock(&uc->lock); + /* + * Do not schedule pm_work to run ISR in + * ucsi_ccg_runtime_resume() after pm_runtime_get_sync() + * since we are already in ISR path. + */ + uc->run_isr = false; + mutex_unlock(&uc->lock); + } + pm_runtime_get_sync(uc->dev); while (rem_len > 0) { msgs[1].buf = &data[len - rem_len]; @@ -254,6 +278,18 @@ static int ccg_write(struct ucsi_ccg *uc, u16 rab, u8 *data, u32 len) msgs[0].len = len + sizeof(rab); msgs[0].buf = buf; + if (uc->fw_build == CCG_FW_BUILD_NVIDIA && + uc->fw_version <= CCG_OLD_FW_VERSION) { + mutex_lock(&uc->lock); + /* + * Do not schedule pm_work to run ISR in + * ucsi_ccg_runtime_resume() after pm_runtime_get_sync() + * since we are already in ISR path. + */ + uc->run_isr = false; + mutex_unlock(&uc->lock); + } + pm_runtime_get_sync(uc->dev); status = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); if (status < 0) { @@ -383,6 +419,13 @@ static irqreturn_t ccg_irq_handler(int irq, void *data) return IRQ_HANDLED; } +static void ccg_pm_workaround_work(struct work_struct *pm_work) +{ + struct ucsi_ccg *uc = container_of(pm_work, struct ucsi_ccg, pm_work); + + ucsi_notify(uc->ucsi); +} + static int get_fw_info(struct ucsi_ccg *uc) { int err; @@ -392,6 +435,9 @@ static int get_fw_info(struct ucsi_ccg *uc) if (err < 0) return err; + uc->fw_version = CCG_VERSION(uc->version[FW2].app.ver) | + CCG_VERSION_PATCH(uc->version[FW2].app.patch); + err = ccg_read(uc, CCGX_RAB_DEVICE_MODE, (u8 *)(&uc->info), sizeof(uc->info)); if (err < 0) @@ -740,11 +786,12 @@ static bool ccg_check_fw_version(struct ucsi_ccg *uc, const char *fw_name, } /* compare input version with FWCT version */ - cur_version = le16_to_cpu(app->build) | app->patch << 16 | - app->ver << 24; + cur_version = le16_to_cpu(app->build) | CCG_VERSION_PATCH(app->patch) | + CCG_VERSION(app->ver); - new_version = le16_to_cpu(fw_cfg.app.build) | fw_cfg.app.patch << 16 | - fw_cfg.app.ver << 24; + new_version = le16_to_cpu(fw_cfg.app.build) | + CCG_VERSION_PATCH(fw_cfg.app.patch) | + CCG_VERSION(fw_cfg.app.ver); if (!ccg_check_vendor_version(uc, app, &fw_cfg)) goto out_release_firmware; @@ -1084,8 +1131,10 @@ static int ucsi_ccg_probe(struct i2c_client *client, uc->ppm.sync = ucsi_ccg_sync; uc->dev = dev; uc->client = client; + uc->run_isr = true; mutex_init(&uc->lock); INIT_WORK(&uc->work, ccg_update_firmware); + INIT_WORK(&uc->pm_work, ccg_pm_workaround_work); /* Only fail FW flashing when FW build information is not provided */ status = device_property_read_u16(dev, "ccgx,firmware-build", @@ -1153,6 +1202,7 @@ static int ucsi_ccg_remove(struct i2c_client *client) { struct ucsi_ccg *uc = i2c_get_clientdata(client); + cancel_work_sync(&uc->pm_work); cancel_work_sync(&uc->work); ucsi_unregister_ppm(uc->ucsi); pm_runtime_disable(uc->dev); @@ -1198,6 +1248,28 @@ static int ucsi_ccg_runtime_suspend(struct device *dev) static int ucsi_ccg_runtime_resume(struct device *dev) { + struct i2c_client *client = to_i2c_client(dev); + struct ucsi_ccg *uc = i2c_get_clientdata(client); + bool schedule = true; + + /* + * Firmware version 3.1.10 or earlier, built for NVIDIA has known issue + * of missing interrupt when a device is connected for runtime resume. + * Schedule a work to call ISR as a workaround. + */ + if (uc->fw_build == CCG_FW_BUILD_NVIDIA && + uc->fw_version <= CCG_OLD_FW_VERSION) { + mutex_lock(&uc->lock); + if (!uc->run_isr) { + uc->run_isr = true; + schedule = false; + } + mutex_unlock(&uc->lock); + + if (schedule) + schedule_work(&uc->pm_work); + } + return 0; }