From patchwork Tue Jul 27 15:13:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kyle Tso X-Patchwork-Id: 486918 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=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, 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 F2078C4338F for ; Tue, 27 Jul 2021 15:13:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D3FBA61B28 for ; Tue, 27 Jul 2021 15:13:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236848AbhG0PNR (ORCPT ); Tue, 27 Jul 2021 11:13:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58580 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236977AbhG0PNR (ORCPT ); Tue, 27 Jul 2021 11:13:17 -0400 Received: from mail-qv1-xf49.google.com (mail-qv1-xf49.google.com [IPv6:2607:f8b0:4864:20::f49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 22A85C0613D3 for ; Tue, 27 Jul 2021 08:13:17 -0700 (PDT) Received: by mail-qv1-xf49.google.com with SMTP id b6-20020a0cbf460000b02902dbb4e0a8f2so8965845qvj.6 for ; Tue, 27 Jul 2021 08:13:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=eRPX9i2Qwxgyb840VTBcgurMoYEtKqMX2n5NCNoYN5s=; b=WHmyiWXjxEmfGiU9Vfl1WDVj9g7b5DFcRLrzPNPlZ2rD1seBdTFyl+uvQTVfSVf8LC Aojmwo6DSULDYMGPCCI/VlTIlGrFci16HL6L07bc5FNeKuoL9TjyfYzlgnYRntXOjkf1 wXG9X/ANDybpTyqUsliQanO6Hd3tPmP5pOUb8PA5uAZKILlzyhxOAgiCIaxNf5rwFJ2G kr6WDJfgtNRLXSIfdqQP/WiyNHireT23a+BeIH5SWIrTjf7rPIG69MNpJy4TNq6kdY9/ MEgIKk1HTqukO3X8mTcmCNAmJa4WUBmPU8OJSkX1CEdcp8rCFNiqV6ubDg50V1ue6jeY WoRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=eRPX9i2Qwxgyb840VTBcgurMoYEtKqMX2n5NCNoYN5s=; b=VnTpm6Cj14fzfwgszZLh5LiYDp0ODt0xe9n0BFFRteppEhyI3XfiH3KiHPs0O1mhKT GfhD4VNBBCqs96KcrY5yXacUZM9VhJHWAC/B+VIsafen94b3spe50tbdTqFBtVQpLNaV SfaIs2ypb/kJqaLU2Gx0+7rGxgodcaLXxbFmUiDEJxhTjbeU7uBf89DjhvkCW7z3IBLz 1v8uO3HiUIH/PAArMLADFt60x/+X0GODHp+i81dRBqfUm7q6S2QT5zndElHCDti2kaEO OXZCtXx23cjvg8p4zvg7kEq8w6JKyg2Soplco9Vj2m21hdEy4TrHW/5wsnOmW/okwRSd F3Vg== X-Gm-Message-State: AOAM533FFJOMjFjbTBmQHLZ3a04yIEGVlPlrnTvsgbb8yp9yAXDjWDZd fsPw5LcvV1/r+uQkNKVg8PAg2BFUrEGb X-Google-Smtp-Source: ABdhPJwP4hYxg86JWBvDQwckVtYazVArl6BotZSi0bs9vATCDKhYprIDAzbPvio67LbsImWsL5bFcO5HJoqp X-Received: from kyletso.ntc.corp.google.com ([2401:fa00:fc:202:da7f:a21b:ee74:66a2]) (user=kyletso job=sendgmr) by 2002:a0c:ac43:: with SMTP id m3mr14003604qvb.5.1627398796116; Tue, 27 Jul 2021 08:13:16 -0700 (PDT) Date: Tue, 27 Jul 2021 23:13:06 +0800 In-Reply-To: <20210727151307.2178352-1-kyletso@google.com> Message-Id: <20210727151307.2178352-2-kyletso@google.com> Mime-Version: 1.0 References: <20210727151307.2178352-1-kyletso@google.com> X-Mailer: git-send-email 2.32.0.432.gabb21c7263-goog Subject: [PATCH v2 1/2] dt-bindings: connector: Add pd-supported property From: Kyle Tso To: linux@roeck-us.net, heikki.krogerus@linux.intel.com, gregkh@linuxfoundation.org, robh+dt@kernel.org Cc: badhri@google.com, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Kyle Tso Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Set pd-supported property if the Type-C connector has power delivery support. Signed-off-by: Kyle Tso --- .../devicetree/bindings/connector/usb-connector.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Documentation/devicetree/bindings/connector/usb-connector.yaml b/Documentation/devicetree/bindings/connector/usb-connector.yaml index 92b49bc37939..8ed271feea08 100644 --- a/Documentation/devicetree/bindings/connector/usb-connector.yaml +++ b/Documentation/devicetree/bindings/connector/usb-connector.yaml @@ -111,6 +111,10 @@ properties: - 1.5A - 3.0A + pd-supported: + description: Set this property if the Type-C connector has power delivery support. + type: boolean + # The following are optional properties for "usb-c-connector" with power # delivery support. source-pdos: @@ -312,6 +316,7 @@ examples: label = "USB-C"; power-role = "dual"; try-power-role = "sink"; + pd-supported; source-pdos = ; sink-pdos = ; From patchwork Tue Jul 27 15:13:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kyle Tso X-Patchwork-Id: 488146 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=-26.3 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, 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 4D628C432BE for ; Tue, 27 Jul 2021 15:13:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 303C961B2F for ; Tue, 27 Jul 2021 15:13:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237014AbhG0PNV (ORCPT ); Tue, 27 Jul 2021 11:13:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58606 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237046AbhG0PNU (ORCPT ); Tue, 27 Jul 2021 11:13:20 -0400 Received: from mail-pj1-x1049.google.com (mail-pj1-x1049.google.com [IPv6:2607:f8b0:4864:20::1049]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5BD10C0613CF for ; Tue, 27 Jul 2021 08:13:20 -0700 (PDT) Received: by mail-pj1-x1049.google.com with SMTP id az9-20020a17090b0289b0290176a0987ce6so4675981pjb.0 for ; Tue, 27 Jul 2021 08:13:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=hbGtnsIAzxr6tiUv7BNyp1DfTM1V3RQ/gpLoDyjw7h4=; b=OGR/DHizIFvoeZavNRaqUL3+y6L8WzeRBOOndgl94sRCYx59qK5N8gKk5UGXPfvlTG 95Fc2/3UG+z44lAP+rT0lwvdt2WeY32EAIi8dASfF1aKa132+zgsH+8z5toBU9/Dfhjx PChqutqyOYmVt8vLxPzvpGxnAEdeJ3QCJ8JYFYwB5RGXZJi1xGEk/suySvTGmGfiZTxv bf1dZwM7wTTfQPy3s3yc1Hh+exw8oV1dqP94JvaYwRVOyGZjlSkpxcaEhT+YViQNtUHt hjjR9HiO56iggvMM11Oxdqo3uP9iRc6/6p6MHNxYRZpLs19IX6DqzXRJEYUBpBHeq+Qi Dnig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=hbGtnsIAzxr6tiUv7BNyp1DfTM1V3RQ/gpLoDyjw7h4=; b=Q8ghI2A/eR03/eeGzs6+3UHpEaX8aRPaNek+js0Ff8HWPIs4W3xD8RdHdnaTBDRT7s MafxG6JNKVr9uszMdr/hU8pM3Lo4jqtrtrQffIxUrk0YvoaomyMEqpnaN4asVVGnHw4z eWp3z1ErR0XlHCYiJEIeg6wW44YNqzcfgkUC346ZD3oKCCWqb2GHONHdT1St7bVz3BfF CFXX2jGGuzgIJGa0R2rM3esKy3LvSZjN0YhAa7ONMnXg0wEdxC8rUIggB9uh5bhlo2u8 Szmkaqos4mMGXmeq6cPZ4tZuZg7ZPsqyIs5Np4zTzEoXGi3KwYSfFYnTmZfGqo24/U6C lyOw== X-Gm-Message-State: AOAM530jyfmhohfUXV6VnpEqyc1ZpBB58Mqg7f6AQA3pC6qAMT0VonWD lyI5uP410Rs3fXZu91+hLAJgLle/4Pr+ X-Google-Smtp-Source: ABdhPJy4bCselEXuoX3UVrzUMZ4jb0x8Kpqxznmzuac+GSP2eSARHKtIDNWX+CY+F1M3jT7SXdzTEMJJCr6u X-Received: from kyletso.ntc.corp.google.com ([2401:fa00:fc:202:da7f:a21b:ee74:66a2]) (user=kyletso job=sendgmr) by 2002:a17:90b:3556:: with SMTP id lt22mr4848786pjb.174.1627398799814; Tue, 27 Jul 2021 08:13:19 -0700 (PDT) Date: Tue, 27 Jul 2021 23:13:07 +0800 In-Reply-To: <20210727151307.2178352-1-kyletso@google.com> Message-Id: <20210727151307.2178352-3-kyletso@google.com> Mime-Version: 1.0 References: <20210727151307.2178352-1-kyletso@google.com> X-Mailer: git-send-email 2.32.0.432.gabb21c7263-goog Subject: [PATCH v2 2/2] usb: typec: tcpm: Support non-PD mode From: Kyle Tso To: linux@roeck-us.net, heikki.krogerus@linux.intel.com, gregkh@linuxfoundation.org, robh+dt@kernel.org Cc: badhri@google.com, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, Kyle Tso Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Even if the Type-C controller supports PD, it is doable to disable PD capabilities with the current state machine in TCPM. Without enabling RX in low-level drivers and with skipping the power negotiation, the port is eligible to be a non-PD Type-C port. Use new flags whose values are populated from the device tree to decide the port PD capability. Adding "pd-supported" property in device tree indicates that the port supports PD. If "pd-supported" is not found, "typec-power-opmode" shall be added to specify the advertised Rp value if the port supports SRC role. Signed-off-by: Kyle Tso --- changes since v1: - Revised the patch to use dt properties - Added back the checks of callbacks set_pd_rx and pd_transmit - Added src_rp to indicate which Rp value should be used in SRC. This variable is derived from dt property "typec-power-opmode" drivers/usb/typec/tcpm/tcpm.c | 108 +++++++++++++++++++++++++--------- 1 file changed, 79 insertions(+), 29 deletions(-) diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index 5b22a1c931a9..4cf77c787f54 100644 --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c @@ -316,6 +316,7 @@ struct tcpm_port { struct typec_partner *partner; enum typec_cc_status cc_req; + enum typec_cc_status src_rp; /* work only if pd_supported == false */ enum typec_cc_status cc1; enum typec_cc_status cc2; @@ -323,6 +324,7 @@ struct tcpm_port { bool attached; bool connected; + bool pd_supported; enum typec_port_type port_type; /* @@ -804,6 +806,7 @@ static void tcpm_apply_rc(struct tcpm_port *port) } } + /* * Determine RP value to set based on maximum current supported * by a port if configured as source. @@ -815,6 +818,9 @@ static enum typec_cc_status tcpm_rp_cc(struct tcpm_port *port) int nr_pdo = port->nr_src_pdo; int i; + if (!port->pd_supported) + return port->src_rp; + /* * Search for first entry with matching voltage. * It should report the maximum supported current. @@ -3568,9 +3574,11 @@ static int tcpm_src_attach(struct tcpm_port *port) if (ret < 0) return ret; - ret = port->tcpc->set_pd_rx(port->tcpc, true); - if (ret < 0) - goto out_disable_mux; + if (port->pd_supported) { + ret = port->tcpc->set_pd_rx(port->tcpc, true); + if (ret < 0) + goto out_disable_mux; + } /* * USB Type-C specification, version 1.2, @@ -3600,7 +3608,8 @@ static int tcpm_src_attach(struct tcpm_port *port) out_disable_vconn: tcpm_set_vconn(port, false); out_disable_pd: - port->tcpc->set_pd_rx(port->tcpc, false); + if (port->pd_supported) + port->tcpc->set_pd_rx(port->tcpc, false); out_disable_mux: tcpm_mux_set(port, TYPEC_STATE_SAFE, USB_ROLE_NONE, TYPEC_ORIENTATION_NONE); @@ -3804,6 +3813,20 @@ static enum typec_pwr_opmode tcpm_get_pwr_opmode(enum typec_cc_status cc) } } +static enum typec_cc_status tcpm_pwr_opmode_to_rp(enum typec_pwr_opmode opmode) +{ + switch (opmode) { + case TYPEC_PWR_MODE_USB: + return TYPEC_CC_RP_DEF; + case TYPEC_PWR_MODE_1_5A: + return TYPEC_CC_RP_1_5; + case TYPEC_PWR_MODE_3_0A: + case TYPEC_PWR_MODE_PD: + default: + return TYPEC_CC_RP_3_0; + } +} + static void run_state_machine(struct tcpm_port *port) { int ret; @@ -3914,6 +3937,10 @@ static void run_state_machine(struct tcpm_port *port) if (port->ams == POWER_ROLE_SWAP || port->ams == FAST_ROLE_SWAP) tcpm_ams_finish(port); + if (!port->pd_supported) { + tcpm_set_state(port, SRC_READY, 0); + break; + } port->upcoming_state = SRC_SEND_CAPABILITIES; tcpm_ams_start(port, POWER_NEGOTIATION); break; @@ -4161,7 +4188,10 @@ static void run_state_machine(struct tcpm_port *port) current_lim = PD_P_SNK_STDBY_MW / 5; tcpm_set_current_limit(port, current_lim, 5000); tcpm_set_charge(port, true); - tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0); + if (!port->pd_supported) + tcpm_set_state(port, SNK_READY, 0); + else + tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0); break; } /* @@ -4389,7 +4419,8 @@ static void run_state_machine(struct tcpm_port *port) tcpm_set_vbus(port, true); if (port->ams == HARD_RESET) tcpm_ams_finish(port); - port->tcpc->set_pd_rx(port->tcpc, true); + if (port->pd_supported) + port->tcpc->set_pd_rx(port->tcpc, true); tcpm_set_attached_state(port, true); tcpm_set_state(port, SRC_UNATTACHED, PD_T_PS_SOURCE_ON); break; @@ -5898,6 +5929,7 @@ EXPORT_SYMBOL_GPL(tcpm_tcpc_reset); static int tcpm_fw_get_caps(struct tcpm_port *port, struct fwnode_handle *fwnode) { + const char *opmode_str; const char *cap_str; int ret; u32 mw, frs_current; @@ -5932,22 +5964,36 @@ static int tcpm_fw_get_caps(struct tcpm_port *port, return ret; port->typec_caps.type = ret; port->port_type = port->typec_caps.type; + port->pd_supported = fwnode_property_read_bool(fwnode, "pd-supported"); port->slow_charger_loop = fwnode_property_read_bool(fwnode, "slow-charger-loop"); if (port->port_type == TYPEC_PORT_SNK) goto sink; /* Get source pdos */ - ret = fwnode_property_count_u32(fwnode, "source-pdos"); - if (ret <= 0) - return -EINVAL; + if (port->pd_supported) { + ret = fwnode_property_count_u32(fwnode, "source-pdos"); + if (ret <= 0) + return -EINVAL; - port->nr_src_pdo = min(ret, PDO_MAX_OBJECTS); - ret = fwnode_property_read_u32_array(fwnode, "source-pdos", - port->src_pdo, port->nr_src_pdo); - if ((ret < 0) || tcpm_validate_caps(port, port->src_pdo, - port->nr_src_pdo)) - return -EINVAL; + port->nr_src_pdo = min(ret, PDO_MAX_OBJECTS); + ret = fwnode_property_read_u32_array(fwnode, "source-pdos", + port->src_pdo, port->nr_src_pdo); + if ((ret < 0) || tcpm_validate_caps(port, port->src_pdo, + port->nr_src_pdo)) + return -EINVAL; + } else { + port->nr_src_pdo = 0; + ret = fwnode_property_read_string(fwnode, "typec-power-opmode", &opmode_str); + if (ret == 0) { + ret = typec_find_pwr_opmode(opmode_str); + if (ret < 0) + return ret; + port->src_rp = tcpm_pwr_opmode_to_rp(ret); + } else { + return ret; + } + } if (port->port_type == TYPEC_PORT_SRC) return 0; @@ -5962,25 +6008,29 @@ static int tcpm_fw_get_caps(struct tcpm_port *port, return -EINVAL; sink: /* Get sink pdos */ - ret = fwnode_property_count_u32(fwnode, "sink-pdos"); - if (ret <= 0) - return -EINVAL; + if (port->pd_supported) { + ret = fwnode_property_count_u32(fwnode, "sink-pdos"); + if (ret <= 0) + return -EINVAL; - port->nr_snk_pdo = min(ret, PDO_MAX_OBJECTS); - ret = fwnode_property_read_u32_array(fwnode, "sink-pdos", - port->snk_pdo, port->nr_snk_pdo); - if ((ret < 0) || tcpm_validate_caps(port, port->snk_pdo, - port->nr_snk_pdo)) - return -EINVAL; + port->nr_snk_pdo = min(ret, PDO_MAX_OBJECTS); + ret = fwnode_property_read_u32_array(fwnode, "sink-pdos", + port->snk_pdo, port->nr_snk_pdo); + if ((ret < 0) || tcpm_validate_caps(port, port->snk_pdo, + port->nr_snk_pdo)) + return -EINVAL; - if (fwnode_property_read_u32(fwnode, "op-sink-microwatt", &mw) < 0) - return -EINVAL; - port->operating_snk_mw = mw / 1000; + if (fwnode_property_read_u32(fwnode, "op-sink-microwatt", &mw) < 0) + return -EINVAL; + port->operating_snk_mw = mw / 1000; + } else { + port->nr_snk_pdo = 0; + } port->self_powered = fwnode_property_read_bool(fwnode, "self-powered"); - /* FRS can only be supported byb DRP ports */ - if (port->port_type == TYPEC_PORT_DRP) { + /* FRS can only be supported by DRP ports */ + if (port->port_type == TYPEC_PORT_DRP && port->pd_supported) { ret = fwnode_property_read_u32(fwnode, "new-source-frs-typec-current", &frs_current); if (ret >= 0 && frs_current <= FRS_5V_3A)