From patchwork Mon Jun 3 17:05:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajay Gupta X-Patchwork-Id: 10973507 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 3E708933 for ; Mon, 3 Jun 2019 17:08:40 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1EF5726222 for ; Mon, 3 Jun 2019 17:08:40 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 12AA2286C4; Mon, 3 Jun 2019 17:08:40 +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 AE2A826222 for ; Mon, 3 Jun 2019 17:08:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728543AbfFCRIi (ORCPT ); Mon, 3 Jun 2019 13:08:38 -0400 Received: from mail-pg1-f196.google.com ([209.85.215.196]:40438 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726502AbfFCRIi (ORCPT ); Mon, 3 Jun 2019 13:08:38 -0400 Received: by mail-pg1-f196.google.com with SMTP id d30so8634932pgm.7; Mon, 03 Jun 2019 10:08:37 -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=0oU8V6DHCR89gYiqXIzSDaMJIWmUkeY1uDMM7H1JXJ8=; b=BH+934U03paTWpgYHnODuk2QEsJUD3bGa3+pPwbDAlPgUbx2PueKlO/Y7IcwV+2URH mxHaVW3uK3ZtoxKy2xM7q2hZdr8vjxn50Kx0D199SeZrjATqL9r1s7oatRgDDm8/eSzx 5HTrFx7qpliZv+x1XIedStFfmqe5juxhCN4dCEh9hD2uqxVMtlAP3untT7l7LovpYyrO mzKGxR49CkpJS/szD4FOdFSE0qsI7V2mQgTIh00ZqZ0kE9FHXBfeTNff7iSEn5QsvO8y 6lbs8NxLwKB6D/JleM48yih3c3CzwFoK1Xew23q3fPSZO/iEQUgqJp1D7+0JWxKNhXpa xWjA== 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=0oU8V6DHCR89gYiqXIzSDaMJIWmUkeY1uDMM7H1JXJ8=; b=KBVKWDtQ7bDbj6GKY2Y4BG3ukZgDrXIzGjjVttn9TuZ9T2P2D2qxMMjdJiyFAe4k2c BsGyg1F/ZQS2s2pvCIfMsYbsTxBzItCijUE14MA2QbaSxO7NB1QKtfHbufsCPF4qDnoC lez1FgqnZJfWWxbRsBbLJ/isMUlEMwwDkeEaTmVV0zX8QSsOEhgsKBEVOdjYW6rvYG2p 8iODH6RLRKTebgRWG1AX1seXXxksnH7PG7ZXVoC5thju6n16MhnT7y5F/K6tGEHOrP1K xsu9dJa1lyfSufm9zSAt5DCR1V35k+CEkr+47IXGlT9tW7gYW9xYWHUoGgmynCgZxvWv A5HQ== X-Gm-Message-State: APjAAAUfW6jFZX3bfQO+27Syhzx4Lk0cu6+pBHxahn8xrLRDvDUtFe3W 5/S0aHuV9gwb7SRcLZu/DDE= X-Google-Smtp-Source: APXvYqz5i5RreVE9yQJZloTTnO8Ece6e1MNgR6/repuV6J+v3X99eS003QoXVuGLayJYv89ZKj+nDA== X-Received: by 2002:a63:eb55:: with SMTP id b21mr29044717pgk.67.1559581717263; Mon, 03 Jun 2019 10:08:37 -0700 (PDT) Received: from ajayg.nvidia.com (searspoint.nvidia.com. [216.228.112.21]) by smtp.gmail.com with ESMTPSA id p63sm17988814pfb.70.2019.06.03.10.08.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 03 Jun 2019 10:08:36 -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 v4 1/5] i2c: nvidia-gpu: refactor master_xfer Date: Mon, 3 Jun 2019 10:05:41 -0700 Message-Id: <20190603170545.24004-2-ajayg@nvidia.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190603170545.24004-1-ajayg@nvidia.com> References: <20190603170545.24004-1-ajayg@nvidia.com> X-NVConfidentiality: public 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 --- Changes from v3->v4: - Further refactor master_xfer based on Wolfram's comment. drivers/i2c/busses/i2c-nvidia-gpu.c | 30 +++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/drivers/i2c/busses/i2c-nvidia-gpu.c b/drivers/i2c/busses/i2c-nvidia-gpu.c index 1c8f708f212b..f1771beb75ea 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,42 @@ 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); + send_stop = false; + status = i; +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 Jun 3 17:05:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajay Gupta X-Patchwork-Id: 10973509 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 78B1D933 for ; Mon, 3 Jun 2019 17:08:41 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 58E0126222 for ; Mon, 3 Jun 2019 17:08:41 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4D36B27FB1; Mon, 3 Jun 2019 17:08: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 2BF33286F7 for ; Mon, 3 Jun 2019 17:08:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728557AbfFCRIj (ORCPT ); Mon, 3 Jun 2019 13:08:39 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:37744 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726502AbfFCRIi (ORCPT ); Mon, 3 Jun 2019 13:08:38 -0400 Received: by mail-pf1-f194.google.com with SMTP id a23so10985453pff.4; Mon, 03 Jun 2019 10:08: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=dhA93XElDXWwQo4U49kdCfXrgdWn/GrVyfL9Vs9fqyU=; b=k3d39lJ6JKDURGUWCnCXw9KhJAaUWTr4nr06WWB0l8PdDOsqcjjVXk48J55bpMCyi7 o3HycYekoGFFdLYJ+cyyTmoLCZObOzPOSE7wLK3vA8AN/u+JkyOKd5mfGs3WXdAltX67 7uHRip+q7C0t/vslGqFPko0HiLiphTFjaaSScRbolKEGf61LJorUVb4BHZ/MGY3uaGPB uZlfFMXMxVmP8ocA3rE7jY3tpBbz2qsiXvVmFaCdP8touKDZiLfayiXdWYn3bMiiHrfm 7CKSU/XaplojZZwEYskrO2wI5IMRqqTGelFNMq3FKUZu8S2pM13mrJ9Fe/V7g/NISE44 qkfw== 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=dhA93XElDXWwQo4U49kdCfXrgdWn/GrVyfL9Vs9fqyU=; b=dUl2dNf6IYGWzQKdipmxguxS2JGriOajvRa4mTq21+2NUDm4DOIo93vkrc3NN+4eqW Vk+hxNPgONr2mpZfDYsOMKbIDA4AQdysg1Y9v3qfuZPoFI2igDlUmF8NdFAplptgcn1Z z/jiZoadclMhVM14oex5R1Jpa/rNOon6MogSsPTouhSS9AesAMxjlpLt3X9y5H3NorVU Je7c9ZUD1c6b4lQJ6Ft1RiFDPG0jbYZVYyitQlcmrf+A8roZgvbbnoFJr0iWZmOx22h2 TL+IohfM0JRutA7Xm7unHJ3y0IFlWodFGNgRfEIH0KqMQzKcTW6xXqhMFgU4Ao03dKr+ 7snQ== X-Gm-Message-State: APjAAAWV9u/rov1eqgXI7kq2LadBNSNj9iWxKpqirggcL//BM92w01uc kDHjpiY1x6PzVcbYFcSSF2I1M/dU X-Google-Smtp-Source: APXvYqx+HgSextq2WaOXDRuY9WHVWiNpSjqiI61KTnnkZoOcY0GSrOZsK46bMh5tZ1MJ/BmIMQAcug== X-Received: by 2002:a17:90a:d16:: with SMTP id t22mr31760518pja.130.1559581718246; Mon, 03 Jun 2019 10:08:38 -0700 (PDT) Received: from ajayg.nvidia.com (searspoint.nvidia.com. [216.228.112.21]) by smtp.gmail.com with ESMTPSA id p63sm17988814pfb.70.2019.06.03.10.08.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 03 Jun 2019 10:08: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 v4 2/5] i2c: nvidia-gpu: add runtime pm support Date: Mon, 3 Jun 2019 10:05:42 -0700 Message-Id: <20190603170545.24004-3-ajayg@nvidia.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190603170545.24004-1-ajayg@nvidia.com> References: <20190603170545.24004-1-ajayg@nvidia.com> X-NVConfidentiality: public 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 v3->v4: - Added comment on why stub gpu_i2c_suspend() is needed for runtime pm to work correctly. drivers/i2c/busses/i2c-nvidia-gpu.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-nvidia-gpu.c b/drivers/i2c/busses/i2c-nvidia-gpu.c index f1771beb75ea..ad1006e72a03 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 */ @@ -219,6 +220,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; } @@ -338,6 +341,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: @@ -351,10 +359,26 @@ 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); } +/* + * We need gpu_i2c_suspend() even if it is stub, for runtime pm to work + * correctly. Without it, lspci shows runtime pm status as "D0" for the card. + * Documentation/power/pci.txt also insists for driver to provide this: + * "First, a PCI device is put into a low-power state, or suspended, with the + * help of pm_schedule_suspend() or pm_runtime_suspend() which for PCI devices + * call pci_pm_runtime_suspend() to do the actual job. For this to work, the + * device's driver has to provide a pm->runtime_suspend() callback (see below), + * which is run by pci_pm_runtime_suspend() as the first action." + */ +static __maybe_unused 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); @@ -363,7 +387,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 Jun 3 17:05:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajay Gupta X-Patchwork-Id: 10973511 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 A78DB912 for ; Mon, 3 Jun 2019 17:08:42 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8843526222 for ; Mon, 3 Jun 2019 17:08:42 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7C5B6286C4; Mon, 3 Jun 2019 17:08: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 F215426222 for ; Mon, 3 Jun 2019 17:08:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728590AbfFCRIl (ORCPT ); Mon, 3 Jun 2019 13:08:41 -0400 Received: from mail-pf1-f195.google.com ([209.85.210.195]:46774 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726502AbfFCRIk (ORCPT ); Mon, 3 Jun 2019 13:08:40 -0400 Received: by mail-pf1-f195.google.com with SMTP id y11so10948002pfm.13; Mon, 03 Jun 2019 10:08: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=DfMv0tI9Sxt1KAM0N2MvIzkzaPOg12DI8SOd8yOWCQ0=; b=IKgApUGXntPLgf8K8Lrs8NNy6pke1y3NGjIkHlYkWYH0W9b3Qoco62KCXqD+O72YfL LhMxixL1yUtM0J8/tcQD0hZ5UyH8//VxS1gvu0eN7llrB835VaSeTNNAv/DffUYKiWie g7SNlBX8GD8y+VSUd3q1o2ydmun9pd25ZVVJ/NYpusnv+NG/gvOh1RcVy8mvu2cZWNhx qXrLtwVejQZR7kOMSUcqNZsbZVHjRNUVVE6C+ZzIUj0NTXjaZDsCZWBPPU1GMtv8+Yrn O2KA9Nnb783EOzEmy2WPE5Fdbq7/H5ScYGoqbRsGNT6I9SMpOXH6Mww4SyMdlqArDceU Oziw== 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=DfMv0tI9Sxt1KAM0N2MvIzkzaPOg12DI8SOd8yOWCQ0=; b=PXD0JW+p5nLyWcxUE5DAvkZ9CU8YcTxC0cys3RJ8luhgAzVoeQrlnEDIYKtygtgWeE cFNJ69gf18iDoYsBzRqTVv6sUKp94OVJWavu7Rw/5Hr854CHe36a1QUydAPLTTpY7x8P ZdrhttHq2DmSmiiXplg5TYQ5ditH00pcfIRTOndehK8S8rkDUcj5qCSeWdgvc8bkm64H RPQMOlO8Fsp6heMLxdWnG71yHOh0UXdxHucjc3aPKXrM0lKALeaTuIrHI1L6NZAsKKRF NCu9vjmWSCnGrc8hORt/ZaiJldLJDBmyzr+aUPU9BQd72nGEZLpIPky6G+CxYMHocTXM 5njA== X-Gm-Message-State: APjAAAVqHnE1Yg4cq9zSgcymQHnhG9E1+FwB4BRWuoiRqzbIkczbHfYP rbOZsf6kzjDn3XQI5m3Jdss= X-Google-Smtp-Source: APXvYqxHveLK0qBYcYqjFDsnSclsZjuvXSu981tMOWjemU71XCsQzNrOj5XOEmbRJ4uBmdswV7ttnQ== X-Received: by 2002:a17:90a:808a:: with SMTP id c10mr30774493pjn.67.1559581719526; Mon, 03 Jun 2019 10:08:39 -0700 (PDT) Received: from ajayg.nvidia.com (searspoint.nvidia.com. [216.228.112.21]) by smtp.gmail.com with ESMTPSA id p63sm17988814pfb.70.2019.06.03.10.08.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 03 Jun 2019 10:08: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 v4 3/5] usb: typec: ucsi: ccg: enable runtime pm support Date: Mon, 3 Jun 2019 10:05:43 -0700 Message-Id: <20190603170545.24004-4-ajayg@nvidia.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190603170545.24004-1-ajayg@nvidia.com> References: <20190603170545.24004-1-ajayg@nvidia.com> X-NVConfidentiality: public 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. Added ucsi_resume() function to enable notification after system reusme. Exported both ucsi_resume() and ucsi_send_command() symbols in ucsi.c for modular build. Signed-off-by: Ajay Gupta Acked-by: Heikki Krogerus --- Changes from v3->v4 : None drivers/usb/typec/ucsi/ucsi.c | 10 ++++++++ drivers/usb/typec/ucsi/ucsi.h | 1 + drivers/usb/typec/ucsi/ucsi_ccg.c | 38 +++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c index 7850b851cecd..ba288b964dc8 100644 --- a/drivers/usb/typec/ucsi/ucsi.c +++ b/drivers/usb/typec/ucsi/ucsi.c @@ -206,7 +206,17 @@ int ucsi_send_command(struct ucsi *ucsi, struct ucsi_control *ctrl, return ret; } +EXPORT_SYMBOL_GPL(ucsi_send_command); +int ucsi_resume(struct ucsi *ucsi) +{ + struct ucsi_control ctrl; + + /* Restore UCSI notification enable mask after system resume */ + UCSI_CMD_SET_NTFY_ENABLE(ctrl, UCSI_ENABLE_NTFY_ALL); + return ucsi_send_command(ucsi, &ctrl, NULL, 0); +} +EXPORT_SYMBOL_GPL(ucsi_resume); /* -------------------------------------------------------------------------- */ void ucsi_altmode_update_active(struct ucsi_connector *con) diff --git a/drivers/usb/typec/ucsi/ucsi.h b/drivers/usb/typec/ucsi/ucsi.h index 1e2981aef629..de87d0b8319d 100644 --- a/drivers/usb/typec/ucsi/ucsi.h +++ b/drivers/usb/typec/ucsi/ucsi.h @@ -430,6 +430,7 @@ int ucsi_send_command(struct ucsi *ucsi, struct ucsi_control *ctrl, void *retval, size_t size); void ucsi_altmode_update_active(struct ucsi_connector *con); +int ucsi_resume(struct ucsi *ucsi); #if IS_ENABLED(CONFIG_TYPEC_DP_ALTMODE) struct typec_altmode * diff --git a/drivers/usb/typec/ucsi/ucsi_ccg.c b/drivers/usb/typec/ucsi/ucsi_ccg.c index 9d46aa9e4e35..b15bc6c29c46 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,34 @@ static const struct i2c_device_id ucsi_ccg_device_id[] = { }; MODULE_DEVICE_TABLE(i2c, ucsi_ccg_device_id); +static int ucsi_ccg_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct ucsi_ccg *uc = i2c_get_clientdata(client); + + return ucsi_resume(uc->ucsi); +} + +static int ucsi_ccg_runtime_suspend(struct device *dev) +{ + return 0; +} + +static int ucsi_ccg_runtime_resume(struct device *dev) +{ + return 0; +} + +static const struct dev_pm_ops ucsi_ccg_pm = { + .resume = ucsi_ccg_resume, + .runtime_suspend = ucsi_ccg_runtime_suspend, + .runtime_resume = ucsi_ccg_runtime_resume, +}; + 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 Jun 3 17:05:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajay Gupta X-Patchwork-Id: 10973513 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 58874933 for ; Mon, 3 Jun 2019 17:08:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3869C26222 for ; Mon, 3 Jun 2019 17:08:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2C7FD286C4; Mon, 3 Jun 2019 17:08: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 C2DF426222 for ; Mon, 3 Jun 2019 17:08:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728596AbfFCRIm (ORCPT ); Mon, 3 Jun 2019 13:08:42 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:44883 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728576AbfFCRIl (ORCPT ); Mon, 3 Jun 2019 13:08:41 -0400 Received: by mail-pf1-f196.google.com with SMTP id t16so2150844pfe.11; Mon, 03 Jun 2019 10:08: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=E4+QVlZhPxqvppC8fwdZBINlVHKUj1lRFLO2bCQ8PZA=; b=leNPH82gRgwlpGZ0M42alITOYHYGn6n21dBw62aRjCYwtXqvFaiv7fxPlb/D0ZE1E+ QlBSCtgOZ0B0eVYdR+OkcujDyZCP+SZ/0U6NchfXM6jFq+/zg9nXMxa5W4WQTWg1UleY 1G+MolpgSktflcCAIZm7XjGQgJQeFurGNiOkNrj6plxsf8LU39ozCcSDYcp3aJT25L1B VUOonMssmKJ0cL/QOTyUzLI0cLZa5q2uXHkLZQ+04VjPxy1kvVpBEp6DTBMZ5ksPqn1o 8h5xTxt9X2WQTa/Q49cdI3NQAkD7c3cDGvlSmsZRNGBuUU0Jmsqt//jZIt7hyJiXBr+f AQoQ== 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=E4+QVlZhPxqvppC8fwdZBINlVHKUj1lRFLO2bCQ8PZA=; b=oKPc6dK1ERdzdKnxC+wtaKNYtLZ2A5qtud0z9kxBoswfIOKL4PKrHRt4f8TfCKVtSD 2gl80EiRSKPsHsLMpQKhbWg5pc2hlRpTYQEpgdKWCkukPUIt2CV1yssLBS+9d/sEaFqg xok2G0taRarP86ZfYKMN21KDpJijZP8LBcLLyj+5vxIpRRiN978yNF/qEFjxeatOqN+L AhluZErKcjWHu9E+Z75aMEXg2YOSsChNr+mEmBjg6q5ztbSZcQ3XsDrd0It7IFJ72aHG uDDsTOnNbynYn/XwhoaUKLMq79YK5T5u/bIWCH+ZJadx5C27f0aTO51Nqjyw/bMm0WvY 8JVA== X-Gm-Message-State: APjAAAVTOK48HX6vcBrNd8afNS7LIwkCKefgXv4Xc/I2eIl7aUpsE/py SbtLbsX0tDdsu/vWUm2cR1o= X-Google-Smtp-Source: APXvYqzPEj/dmmJLF2xqM+OTMV7MGq7DY7EfIS5GapWzBGaT0q0iXRpZV8oHbYnzl+804i55WlU3IQ== X-Received: by 2002:a63:2d41:: with SMTP id t62mr29997907pgt.113.1559581720584; Mon, 03 Jun 2019 10:08:40 -0700 (PDT) Received: from ajayg.nvidia.com (searspoint.nvidia.com. [216.228.112.21]) by smtp.gmail.com with ESMTPSA id p63sm17988814pfb.70.2019.06.03.10.08.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 03 Jun 2019 10:08: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 v4 4/5] i2c: nvidia-gpu: resume ccgx i2c client Date: Mon, 3 Jun 2019 10:05:44 -0700 Message-Id: <20190603170545.24004-5-ajayg@nvidia.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190603170545.24004-1-ajayg@nvidia.com> References: <20190603170545.24004-1-ajayg@nvidia.com> X-NVConfidentiality: public 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 v3->v4: None 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 ad1006e72a03..17a7cdf1dea0 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) @@ -270,8 +271,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); @@ -283,8 +282,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; @@ -384,6 +383,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 Jun 3 17:05:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajay Gupta X-Patchwork-Id: 10973515 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 6F3F8933 for ; Mon, 3 Jun 2019 17:08:44 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4EEA226222 for ; Mon, 3 Jun 2019 17:08:44 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 42C11286C4; Mon, 3 Jun 2019 17:08:44 +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 A145526222 for ; Mon, 3 Jun 2019 17:08:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728605AbfFCRIm (ORCPT ); Mon, 3 Jun 2019 13:08:42 -0400 Received: from mail-pf1-f193.google.com ([209.85.210.193]:44882 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728597AbfFCRIm (ORCPT ); Mon, 3 Jun 2019 13:08:42 -0400 Received: by mail-pf1-f193.google.com with SMTP id t16so2150872pfe.11; Mon, 03 Jun 2019 10:08: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=g56TmqRWYjNHYXDI2nMe/9QDp5VoFgsS1jxNUm6Gb/Y=; b=CSpyEDH0EaQ6ktFVq2Ct6rBPScVqz3FKKL15sOZNHMuGg6yW6Htb1WSumstiuXbNJX JtkEsB0dIlXiS/feO0WzjnWYzr/rMUGTN/lAg5CprOg1jbV+709HyVRV1cN5HvsSnn4h qlet9+h3zRbgVJxvVy9B+mAzlWFGhwGx1qZ002Z9YRt8MdyBOeCYGC5i2lyK303dpMTf sMg6NBeHhlIr2uRQdu3S5EqAbzRKcLxmy2ZFVz/cpMLQqlLZ8h53V3p6C3l70idUJoq3 FYD+2fJhiEz2/UnxWi/d0855h8hyA1i4T+eel0r/NqedlOxjvlJS/7hwKY8RZJEnpPkT rCzA== 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=g56TmqRWYjNHYXDI2nMe/9QDp5VoFgsS1jxNUm6Gb/Y=; b=HqYw6sESAvmTXahGuadsj+USdXemrYFH/6HoHnD/0tvSvFW4Wng8HvqmeFQ3hbEWcI MUB9yeAcSVicYrQxMnY9r8yPxqFUkjFkFrjkbji2fC7p5OY4zCB1c6uKlw7ZEFfQMD9a YbfSFbatjFkzgfozHthU/9pwoo7yKhmZRAOin59zCNfU45Cb5KeTcNlOFCqq+mDhja1G d+Gen1K2bEolEZnWcAycYdUznZLfZZcqah3zRvBxZefNriewCGNsGwpAhWA8s6XAnNbj GrFfyY3bFB0SV30NP7GJGrdsg2HMVpkhpSl9iJWMaRqfIBgyipMBxskv1fnbRxUvQpBb yHrA== X-Gm-Message-State: APjAAAXetprKfAdk4jDIJQjb8MLCPyeNSVBBObD9PWjdjrGhKmQv9pdi XUEXehB5wLS0JNLIOXTunGM= X-Google-Smtp-Source: APXvYqzGWiw4A30wnvUCuJO+wDQuwTzKfM8mCYEqBwl2Dj/r/BnM45N4kBMBbZ0IQn7g6/lYOBN6wg== X-Received: by 2002:a65:530d:: with SMTP id m13mr30303966pgq.68.1559581721586; Mon, 03 Jun 2019 10:08:41 -0700 (PDT) Received: from ajayg.nvidia.com (searspoint.nvidia.com. [216.228.112.21]) by smtp.gmail.com with ESMTPSA id p63sm17988814pfb.70.2019.06.03.10.08.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 03 Jun 2019 10:08: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 v4 5/5] usb: typec: ucsi: ccg: add runtime pm workaround Date: Mon, 3 Jun 2019 10:05:45 -0700 Message-Id: <20190603170545.24004-6-ajayg@nvidia.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190603170545.24004-1-ajayg@nvidia.com> References: <20190603170545.24004-1-ajayg@nvidia.com> X-NVConfidentiality: public 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 Acked-by: Heikki Krogerus --- Changes from v3->v4: None 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 b15bc6c29c46..a5b81c011148 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); @@ -1183,6 +1233,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; }