From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v3] usb: typec: tcpm: Extend the matching rules on PPS APDO selection From: Kyle Tso Message-Id: <20181217132213.91566-1-kyletso@google.com> Date: Mon, 17 Dec 2018 21:22:13 +0800 To: linux@roeck-us.net, heikki.krogerus@linux.intel.com, gregkh@linuxfoundation.org, Adam.Thomson.Opensource@diasemi.com Cc: badhri@google.com, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Kyle Tso List-ID: Q3VycmVudCBtYXRjaGluZyBydWxlcyBlbnN1cmUgdGhhdCB0aGUgdm9sdGFnZSByYW5nZSBvZiBz ZWxlY3RlZCBTb3VyY2UKQ2FwYWJpbGl0eSBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIHJhbmdlIGRl ZmluZWQgaW4gb25lIG9mIHRoZSBTaW5rCkNhcGFiaWxpdGllcy4gVGhpcyBpcyByZWFzb25hYmxl IGJ1dCBub3QgcHJhY3RpY2FsIGJlY2F1c2UgU2luayBtYXkgbm90CnN1cHBvcnQgd2lkZSByYW5n ZSBvZiB2b2x0YWdlIHdoZW4gc2lua2luZyBwb3dlciB3aGlsZSBTb3VyY2UgY291bGQKYWR2ZXJ0 aXNlIGl0cyBjYXBhYmlsaXRpZXMgaW4gcmVsYXRpdmVseSB3aWRlciByYW5nZS4gRm9yIGV4YW1w bGUsIGEKU291cmNlIFBETyBhZHZlcnRpc2luZyAzLjNWLTExVkAzQSAoOVYgUHJvZyBvZiBGaXhl ZCBOb21pbmFsIFZvbHRhZ2UpCndpbGwgbm90IGJlIHNlbGVjdGVkIGlmIHRoZSBTaW5rIHJlcXVp cmVzIDVWLTEyVkAzQSBQUFMgcG93ZXIuIEhvd2V2ZXIsCnRoZSBTaW5rIGNvdWxkIHdvcmsgd2Vs bCBpZiB0aGUgcmVxdWVzdGVkIHZvbHRhZ2UgcmFuZ2UgaW4gUkRPcyBpcwo1Vi0xMVZAM0EuCgpD dXJyZW50bHkgYWNjZXB0ZWQ6CgkJfC0tLS0tLS0tLSBzb3VyY2UgLS0tLS18Cgl8LS0tLS0tLS0t LS0gc2luayAtLS0tLS0tLS0tLS0tLS18CgpDdXJyZW50bHkgbm90IGFjY2VwdGVkOgoJCQl8LS0t LS0tLS0tIHNvdXJjZSAtLS0tLXwKCXwtLS0tLS0tLS0tLSBzaW5rIC0tLS0tLS0tLS0tLS0tLXwK Cgl8LS0tLS0tLS0tIHNvdXJjZSAtLS0tLXwKCQl8LS0tLS0tLS0tLS0gc2luayAtLS0tLS0tLS0t LS0tLS18CgoJfC0tLS0tLS0tLSBzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS18CgkJfC0tLS0tLSBz aW5rIC0tLS0tLS18CgpUbyBpbXByb3ZlIHRoZSB1c2FiaWxpdHksIGNoYW5nZSB0aGUgbWF0Y2hp bmcgcnVsZXMgdG8gd2hhdCBsaXN0ZWQKYmVsb3c6CmEuIFRoZSBTb3VyY2UgUERPIGlzIHNlbGVj dGFibGUgaWYgYW55IHBvcnRpb24gb2YgdGhlIHZvbHRhZ2UgcmFuZ2UKICAgb3ZlcmxhcHMgb25l IG9mIHRoZSBTaW5rIFBETydzIHZvbHRhZ2UgcmFuZ2UuCmIuIFRoZSBtYXhpbXVtIG9wZXJhdGlv bmFsIHZvbHRhZ2Ugd2lsbCBiZSB0aGUgbG93ZXIgb25lIGJldHdlZW4gdGhlCiAgIHNlbGVjdGVk IFNvdXJjZSBQRE8gYW5kIHRoZSBtYXRjaGluZyBTaW5rIFBETy4KYy4gVGhlIG1heGltdW0gcG93 ZXIgd2lsbCBiZSB0aGUgbWF4aW11bSBvcGVyYXRpb25hbCB2b2x0YWdlIHRpbWVzIHRoZQogICBt YXhpbXVtIGN1cnJlbnQgZGVmaW5lZCBpbiB0aGUgc2VsZWN0ZWQgU291cmNlIFBETwpkLiBTZWxl Y3QgdGhlIFNvdXJjZSBQRE8gd2l0aCB0aGUgaGlnaGVzdCBtYXhpbXVtIHBvd2VyCgpTaWduZWQt b2ZmLWJ5OiBLeWxlIFRzbyA8a3lsZXRzb0Bnb29nbGUuY29tPgotLS0KQ2hhbmdlbG9nIHNpbmNl IHYxOgotIHVwZGF0ZWQgdGhlIGNvbW1pdCBtZXNzYWdlIGFzIHN1Z2dlc3RlZCBieSBHdWVudGVy IFJvZWNrIDxsaW51eEByb2Vjay11cy5uZXQ+CgpDaGFuZ2Vsb2cgc2luY2UgdjI6Ci0gZml4ZWQg dGhlIGNvZGluZyBzdHlsZSBwcm9ibGVtcyBhcyBzdWdnZXN0ZWQgYnkgSGVpa2tpIEtyb2dlcnVz CiAgPGhlaWtraS5rcm9nZXJ1c0BsaW51eC5pbnRlbC5jb20+Ci0gQ29ycmVjdGVkIGEgd3Jvbmcg d29yZCBpbiB0aGUgY29tbWl0IG1lc3NhZ2UgYXMgc3VnZ2VzdGVkIGJ5IEFkYW0gVGhvbXNvbgog IDxBZGFtLlRob21zb24uT3BlbnNvdXJjZUBkaWFzZW1pLmNvbT4KLS0tCiBkcml2ZXJzL3VzYi90 eXBlYy90Y3BtL3RjcG0uYyB8IDM1ICsrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0t CiAxIGZpbGUgY2hhbmdlZCwgMjAgaW5zZXJ0aW9ucygrKSwgMTUgZGVsZXRpb25zKC0pCgpkaWZm IC0tZ2l0IGEvZHJpdmVycy91c2IvdHlwZWMvdGNwbS90Y3BtLmMgYi9kcml2ZXJzL3VzYi90eXBl Yy90Y3BtL3RjcG0uYwppbmRleCAzNjIwZWZlZTI2ODguLjRiYzI5YjU4NjY5OCAxMDA2NDQKLS0t IGEvZHJpdmVycy91c2IvdHlwZWMvdGNwbS90Y3BtLmMKKysrIGIvZHJpdmVycy91c2IvdHlwZWMv dGNwbS90Y3BtLmMKQEAgLTIyMTMsNyArMjIxMyw4IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgdGNw bV9wZF9zZWxlY3RfcHBzX2FwZG8oc3RydWN0IHRjcG1fcG9ydCAqcG9ydCkKIAl1bnNpZ25lZCBp bnQgaSwgaiwgbWF4X213ID0gMCwgbWF4X212ID0gMDsKIAl1bnNpZ25lZCBpbnQgbWluX3NyY19t diwgbWF4X3NyY19tdiwgc3JjX21hLCBzcmNfbXc7CiAJdW5zaWduZWQgaW50IG1pbl9zbmtfbXYs IG1heF9zbmtfbXY7Ci0JdTMyIHBkbzsKKwl1bnNpZ25lZCBpbnQgbWF4X29wX212OworCXUzMiBw ZG8sIHNyYywgc25rOwogCXVuc2lnbmVkIGludCBzcmNfcGRvID0gMCwgc25rX3BkbyA9IDA7CiAK IAkvKgpAQCAtMjI2MywxNiArMjI2NCwxOCBAQCBzdGF0aWMgdW5zaWduZWQgaW50IHRjcG1fcGRf c2VsZWN0X3Bwc19hcGRvKHN0cnVjdCB0Y3BtX3BvcnQgKnBvcnQpCiAJCQkJCWNvbnRpbnVlOwog CQkJCX0KIAotCQkJCWlmIChtYXhfc3JjX212IDw9IG1heF9zbmtfbXYgJiYKLQkJCQkgICAgbWlu X3NyY19tdiA+PSBtaW5fc25rX212KSB7CisJCQkJaWYgKG1pbl9zcmNfbXYgPD0gbWF4X3Nua19t diAmJgorCQkJCSAgICBtYXhfc3JjX212ID49IG1pbl9zbmtfbXYpIHsKKwkJCQkJbWF4X29wX212 ID0gbWluKG1heF9zcmNfbXYsIG1heF9zbmtfbXYpOworCQkJCQlzcmNfbXcgPSAobWF4X29wX212 ICogc3JjX21hKSAvIDEwMDA7CiAJCQkJCS8qIFByZWZlciBoaWdoZXIgdm9sdGFnZXMgaWYgYXZh aWxhYmxlICovCiAJCQkJCWlmICgoc3JjX213ID09IG1heF9tdyAmJgotCQkJCQkgICAgIG1pbl9z cmNfbXYgPiBtYXhfbXYpIHx8CisJCQkJCSAgICAgbWF4X29wX212ID4gbWF4X212KSB8fAogCQkJ CQkgICAgc3JjX213ID4gbWF4X213KSB7CiAJCQkJCQlzcmNfcGRvID0gaTsKIAkJCQkJCXNua19w ZG8gPSBqOwogCQkJCQkJbWF4X213ID0gc3JjX213OwotCQkJCQkJbWF4X212ID0gbWF4X3NyY19t djsKKwkJCQkJCW1heF9tdiA9IG1heF9vcF9tdjsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTIy ODUsMTYgKzIyODgsMTggQEAgc3RhdGljIHVuc2lnbmVkIGludCB0Y3BtX3BkX3NlbGVjdF9wcHNf YXBkbyhzdHJ1Y3QgdGNwbV9wb3J0ICpwb3J0KQogCX0KIAogCWlmIChzcmNfcGRvKSB7Ci0JCXBk byA9IHBvcnQtPnNvdXJjZV9jYXBzW3NyY19wZG9dOwotCi0JCXBvcnQtPnBwc19kYXRhLm1pbl92 b2x0ID0gcGRvX3Bwc19hcGRvX21pbl92b2x0YWdlKHBkbyk7Ci0JCXBvcnQtPnBwc19kYXRhLm1h eF92b2x0ID0gcGRvX3Bwc19hcGRvX21heF92b2x0YWdlKHBkbyk7Ci0JCXBvcnQtPnBwc19kYXRh Lm1heF9jdXJyID0KLQkJCW1pbl9wcHNfYXBkb19jdXJyZW50KHBkbywgcG9ydC0+c25rX3Bkb1tz bmtfcGRvXSk7Ci0JCXBvcnQtPnBwc19kYXRhLm91dF92b2x0ID0KLQkJCW1pbihwZG9fcHBzX2Fw ZG9fbWF4X3ZvbHRhZ2UocGRvKSwgcG9ydC0+cHBzX2RhdGEub3V0X3ZvbHQpOwotCQlwb3J0LT5w cHNfZGF0YS5vcF9jdXJyID0KLQkJCW1pbihwb3J0LT5wcHNfZGF0YS5tYXhfY3VyciwgcG9ydC0+ cHBzX2RhdGEub3BfY3Vycik7CisJCXNyYyA9IHBvcnQtPnNvdXJjZV9jYXBzW3NyY19wZG9dOwor CQlzbmsgPSBwb3J0LT5zbmtfcGRvW3Nua19wZG9dOworCisJCXBvcnQtPnBwc19kYXRhLm1pbl92 b2x0ID0gbWF4KHBkb19wcHNfYXBkb19taW5fdm9sdGFnZShzcmMpLAorCQkJCQkgICAgICBwZG9f cHBzX2FwZG9fbWluX3ZvbHRhZ2Uoc25rKSk7CisJCXBvcnQtPnBwc19kYXRhLm1heF92b2x0ID0g bWluKHBkb19wcHNfYXBkb19tYXhfdm9sdGFnZShzcmMpLAorCQkJCQkgICAgICBwZG9fcHBzX2Fw ZG9fbWF4X3ZvbHRhZ2Uoc25rKSk7CisJCXBvcnQtPnBwc19kYXRhLm1heF9jdXJyID0gbWluX3Bw c19hcGRvX2N1cnJlbnQoc3JjLCBzbmspOworCQlwb3J0LT5wcHNfZGF0YS5vdXRfdm9sdCA9IG1p bihwb3J0LT5wcHNfZGF0YS5tYXhfdm9sdCwKKwkJCQkJICAgICAgcG9ydC0+cHBzX2RhdGEub3V0 X3ZvbHQpOworCQlwb3J0LT5wcHNfZGF0YS5vcF9jdXJyID0gbWluKHBvcnQtPnBwc19kYXRhLm1h eF9jdXJyLAorCQkJCQkgICAgIHBvcnQtPnBwc19kYXRhLm9wX2N1cnIpOwogCX0KIAogCXJldHVy biBzcmNfcGRvOwo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B032DC43387 for ; Mon, 17 Dec 2018 13:22:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7D297204FD for ; Mon, 17 Dec 2018 13:22:28 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="qYroXTS4" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732778AbeLQNW1 (ORCPT ); Mon, 17 Dec 2018 08:22:27 -0500 Received: from mail-qk1-f201.google.com ([209.85.222.201]:54727 "EHLO mail-qk1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732521AbeLQNW0 (ORCPT ); Mon, 17 Dec 2018 08:22:26 -0500 Received: by mail-qk1-f201.google.com with SMTP id i37so15200036qkh.21 for ; Mon, 17 Dec 2018 05:22:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:message-id:mime-version:subject:from:to:cc; bh=eChXhE6DxIh/we37Q5Zla+fn+L5z5gFtFhFXKWl5OP4=; b=qYroXTS4U9VE5GtX3yTaETPEPsrB/JqejYfiuxSBDtEPYKsN6G8NJf4LVIBSl9rV5Y j6y+KZSHdcbUkcHJwxrVHBMGFveC5Iu4i+dt6vST5firRTY2lqdzIgK16UMBtGmU9FI5 CyAuj8NKRArRrKlYOtDE9CbiyVdrGfbiGCt2hkqWyJkzs800IfG/wDubeUheWJawaznJ 7pxTQoX8XOXd8hYPjEh6lxEC7X8gFmxPO+MVwMvlC1iOPARkpRzb8Q2H8dfx2xJ5zi1r GDWpkjChDjG8qShJMb8Fn5zVBrV369FmKlUOoouzuW7APCcO7c+12jQPU2JeOP69J5N5 Hd0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=eChXhE6DxIh/we37Q5Zla+fn+L5z5gFtFhFXKWl5OP4=; b=If7+SpDvOpAAF+3kcJ5pXCZws0rZO11eu+JGVr6mGD7M7J5aCvtOZYc2qQnJ3NxREM Ea17XoDmXwoowwNhyH8eqfcX9+KVJmT/hMnylf/cqoZEn+rgq3sI440GF6nMbqp+gPnP Iz1O/jTyN9CgS7Cxzb4kPeZzjsRBQahqijePvwU3bG0VDkH/KUFhFT1AqCj4BTYx7k/I vXkyobVLT2QpXsCvhXKLR/klXkOLbiaarSVFFgXuregLAqPKV+gPWOo4huBHIOQ9/VeF mcfMewN3XHwXF1xCnwHK7jM/Nqvcg8W6p/tr2AxlIXhaZHHr51F5iJH+ODssJu/wVFkR Xzsw== X-Gm-Message-State: AA+aEWZFczmrlWE6R7ifJjV5WIa3mNBnws22yFbJf39jMuyhP0UoImFV Vx1uySCFmqs5MpAor+DAfWbf0BOcL3qM X-Google-Smtp-Source: AFSGD/VRcKqvreslmIyjADA2vxaI3O882z6uuoupOfvu7A8JPlat6sTdatMJ/fD7wz66ms2m985+uhS6KeST X-Received: by 2002:a37:a315:: with SMTP id m21mr14143142qke.30.1545052945663; Mon, 17 Dec 2018 05:22:25 -0800 (PST) Date: Mon, 17 Dec 2018 21:22:13 +0800 Message-Id: <20181217132213.91566-1-kyletso@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.20.0.405.gbc1bbc6f85-goog Subject: [PATCH v3] usb: typec: tcpm: Extend the matching rules on PPS APDO selection From: Kyle Tso To: linux@roeck-us.net, heikki.krogerus@linux.intel.com, gregkh@linuxfoundation.org, Adam.Thomson.Opensource@diasemi.com Cc: badhri@google.com, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Kyle Tso Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Current matching rules ensure that the voltage range of selected Source Capability is entirely within the range defined in one of the Sink Capabilities. This is reasonable but not practical because Sink may not support wide range of voltage when sinking power while Source could advertise its capabilities in relatively wider range. For example, a Source PDO advertising 3.3V-11V@3A (9V Prog of Fixed Nominal Voltage) will not be selected if the Sink requires 5V-12V@3A PPS power. However, the Sink could work well if the requested voltage range in RDOs is 5V-11V@3A. Currently accepted: |--------- source -----| |----------- sink ---------------| Currently not accepted: |--------- source -----| |----------- sink ---------------| |--------- source -----| |----------- sink ---------------| |--------- source -----------------| |------ sink -------| To improve the usability, change the matching rules to what listed below: a. The Source PDO is selectable if any portion of the voltage range overlaps one of the Sink PDO's voltage range. b. The maximum operational voltage will be the lower one between the selected Source PDO and the matching Sink PDO. c. The maximum power will be the maximum operational voltage times the maximum current defined in the selected Source PDO d. Select the Source PDO with the highest maximum power Signed-off-by: Kyle Tso --- Changelog since v1: - updated the commit message as suggested by Guenter Roeck Changelog since v2: - fixed the coding style problems as suggested by Heikki Krogerus - Corrected a wrong word in the commit message as suggested by Adam Thomson --- drivers/usb/typec/tcpm/tcpm.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index 3620efee2688..4bc29b586698 100644 --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c @@ -2213,7 +2213,8 @@ static unsigned int tcpm_pd_select_pps_apdo(struct tcpm_port *port) unsigned int i, j, max_mw = 0, max_mv = 0; unsigned int min_src_mv, max_src_mv, src_ma, src_mw; unsigned int min_snk_mv, max_snk_mv; - u32 pdo; + unsigned int max_op_mv; + u32 pdo, src, snk; unsigned int src_pdo = 0, snk_pdo = 0; /* @@ -2263,16 +2264,18 @@ static unsigned int tcpm_pd_select_pps_apdo(struct tcpm_port *port) continue; } - if (max_src_mv <= max_snk_mv && - min_src_mv >= min_snk_mv) { + if (min_src_mv <= max_snk_mv && + max_src_mv >= min_snk_mv) { + max_op_mv = min(max_src_mv, max_snk_mv); + src_mw = (max_op_mv * src_ma) / 1000; /* Prefer higher voltages if available */ if ((src_mw == max_mw && - min_src_mv > max_mv) || + max_op_mv > max_mv) || src_mw > max_mw) { src_pdo = i; snk_pdo = j; max_mw = src_mw; - max_mv = max_src_mv; + max_mv = max_op_mv; } } } @@ -2285,16 +2288,18 @@ static unsigned int tcpm_pd_select_pps_apdo(struct tcpm_port *port) } if (src_pdo) { - pdo = port->source_caps[src_pdo]; - - port->pps_data.min_volt = pdo_pps_apdo_min_voltage(pdo); - port->pps_data.max_volt = pdo_pps_apdo_max_voltage(pdo); - port->pps_data.max_curr = - min_pps_apdo_current(pdo, port->snk_pdo[snk_pdo]); - port->pps_data.out_volt = - min(pdo_pps_apdo_max_voltage(pdo), port->pps_data.out_volt); - port->pps_data.op_curr = - min(port->pps_data.max_curr, port->pps_data.op_curr); + src = port->source_caps[src_pdo]; + snk = port->snk_pdo[snk_pdo]; + + port->pps_data.min_volt = max(pdo_pps_apdo_min_voltage(src), + pdo_pps_apdo_min_voltage(snk)); + port->pps_data.max_volt = min(pdo_pps_apdo_max_voltage(src), + pdo_pps_apdo_max_voltage(snk)); + port->pps_data.max_curr = min_pps_apdo_current(src, snk); + port->pps_data.out_volt = min(port->pps_data.max_volt, + port->pps_data.out_volt); + port->pps_data.op_curr = min(port->pps_data.max_curr, + port->pps_data.op_curr); } return src_pdo; -- 2.20.0.405.gbc1bbc6f85-goog