From nobody Mon Jun 22 20:25:19 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5B249C433EF for ; Thu, 17 Mar 2022 15:47:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236085AbiCQPtL (ORCPT ); Thu, 17 Mar 2022 11:49:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44816 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234278AbiCQPtK (ORCPT ); Thu, 17 Mar 2022 11:49:10 -0400 Received: from comms.puri.sm (comms.puri.sm [159.203.221.185]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 85E9713EB7; Thu, 17 Mar 2022 08:47:53 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id DD5ACE0139; Thu, 17 Mar 2022 08:47:52 -0700 (PDT) Received: from comms.puri.sm ([127.0.0.1]) by localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id T1hfA1Qg9heb; Thu, 17 Mar 2022 08:47:52 -0700 (PDT) From: Sebastian Krzyszkowiak To: Heikki Krogerus , linux-usb@vger.kernel.org Cc: Sebastian Krzyszkowiak , Greg Kroah-Hartman , Sven Peter , =?UTF-8?q?Guido=20G=C3=BCnther?= , Angus Ainslie , Hector Martin , "Bryan O'Donoghue" , linux-kernel@vger.kernel.org, kernel@puri.sm Subject: [PATCH 1/7] usb: typec: tipd: Only update power status on IRQ Date: Thu, 17 Mar 2022 16:45:12 +0100 Message-Id: <20220317154518.4082046-2-sebastian.krzyszkowiak@puri.sm> In-Reply-To: <20220317154518.4082046-1-sebastian.krzyszkowiak@puri.sm> References: <20220317154518.4082046-1-sebastian.krzyszkowiak@puri.sm> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Guido G=C3=BCnther Instead of refetching power status cache it and only update it when a change is signalled via irq. This simplifies tracing and adding more supply properties in follow up patches. Signed-off-by: Guido G=C3=BCnther Signed-off-by: Sebastian Krzyszkowiak Reviewed-by: Heikki Krogerus --- drivers/usb/typec/tipd/core.c | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c index 16b4560216ba..dfbba5ae9487 100644 --- a/drivers/usb/typec/tipd/core.c +++ b/drivers/usb/typec/tipd/core.c @@ -93,6 +93,8 @@ struct tps6598x { struct power_supply *psy; struct power_supply_desc psy_desc; enum power_supply_usb_type usb_type; + + u16 pwr_status; }; =20 static enum power_supply_property tps6598x_psy_props[] =3D { @@ -230,17 +232,12 @@ static int tps6598x_connect(struct tps6598x *tps, u32= status) { struct typec_partner_desc desc; enum typec_pwr_opmode mode; - u16 pwr_status; int ret; =20 if (tps->partner) return 0; =20 - ret =3D tps6598x_read16(tps, TPS_REG_POWER_STATUS, &pwr_status); - if (ret < 0) - return ret; - - mode =3D TPS_POWER_STATUS_PWROPMODE(pwr_status); + mode =3D TPS_POWER_STATUS_PWROPMODE(tps->pwr_status); =20 desc.usb_pd =3D mode =3D=3D TYPEC_PWR_MODE_PD; desc.accessory =3D TYPEC_ACCESSORY_NONE; /* XXX: handle accessories */ @@ -455,6 +452,7 @@ static bool tps6598x_read_power_status(struct tps6598x = *tps) dev_err(tps->dev, "failed to read power status: %d\n", ret); return false; } + tps->pwr_status =3D pwr_status; trace_tps6598x_power_status(pwr_status); =20 return true; @@ -601,15 +599,8 @@ static const struct regmap_config tps6598x_regmap_conf= ig =3D { static int tps6598x_psy_get_online(struct tps6598x *tps, union power_supply_propval *val) { - int ret; - u16 pwr_status; - - ret =3D tps6598x_read16(tps, TPS_REG_POWER_STATUS, &pwr_status); - if (ret < 0) - return ret; - - if (TPS_POWER_STATUS_CONNECTION(pwr_status) && - TPS_POWER_STATUS_SOURCESINK(pwr_status)) { + if (TPS_POWER_STATUS_CONNECTION(tps->pwr_status) && + TPS_POWER_STATUS_SOURCESINK(tps->pwr_status)) { val->intval =3D 1; } else { val->intval =3D 0; @@ -622,15 +613,11 @@ static int tps6598x_psy_get_prop(struct power_supply = *psy, union power_supply_propval *val) { struct tps6598x *tps =3D power_supply_get_drvdata(psy); - u16 pwr_status; int ret =3D 0; =20 switch (psp) { case POWER_SUPPLY_PROP_USB_TYPE: - ret =3D tps6598x_read16(tps, TPS_REG_POWER_STATUS, &pwr_status); - if (ret < 0) - return ret; - if (TPS_POWER_STATUS_PWROPMODE(pwr_status) =3D=3D TYPEC_PWR_MODE_PD) + if (TPS_POWER_STATUS_PWROPMODE(tps->pwr_status) =3D=3D TYPEC_PWR_MODE_PD) val->intval =3D POWER_SUPPLY_USB_TYPE_PD; else val->intval =3D POWER_SUPPLY_USB_TYPE_C; @@ -837,6 +824,11 @@ static int tps6598x_probe(struct i2c_client *client) fwnode_handle_put(fwnode); =20 if (status & TPS_STATUS_PLUG_PRESENT) { + ret =3D tps6598x_read16(tps, TPS_REG_POWER_STATUS, &tps->pwr_status); + if (ret < 0) { + dev_err(tps->dev, "failed to read power status: %d\n", ret); + goto err_role_put; + } ret =3D tps6598x_connect(tps, status); if (ret) dev_err(&client->dev, "failed to register partner\n"); --=20 2.35.1 From nobody Mon Jun 22 20:25:19 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F0838C433EF for ; Thu, 17 Mar 2022 15:48:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236113AbiCQPtW (ORCPT ); Thu, 17 Mar 2022 11:49:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45384 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236092AbiCQPtR (ORCPT ); Thu, 17 Mar 2022 11:49:17 -0400 Received: from comms.puri.sm (comms.puri.sm [159.203.221.185]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C6CD639BA2; Thu, 17 Mar 2022 08:47:57 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id A71A4E013C; Thu, 17 Mar 2022 08:47:57 -0700 (PDT) Received: from comms.puri.sm ([127.0.0.1]) by localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id JcpyOJZtPPGy; Thu, 17 Mar 2022 08:47:57 -0700 (PDT) From: Sebastian Krzyszkowiak To: Heikki Krogerus , linux-usb@vger.kernel.org Cc: Sebastian Krzyszkowiak , Greg Kroah-Hartman , Sven Peter , =?UTF-8?q?Guido=20G=C3=BCnther?= , Angus Ainslie , Hector Martin , "Bryan O'Donoghue" , linux-kernel@vger.kernel.org, kernel@puri.sm Subject: [PATCH 2/7] usb: typec: tipd: set the data role on tps IRQ Date: Thu, 17 Mar 2022 16:45:13 +0100 Message-Id: <20220317154518.4082046-3-sebastian.krzyszkowiak@puri.sm> In-Reply-To: <20220317154518.4082046-1-sebastian.krzyszkowiak@puri.sm> References: <20220317154518.4082046-1-sebastian.krzyszkowiak@puri.sm> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Angus Ainslie Don't immediately set the data role, only set it in response to the negotiated value notification from the tps6589x. Otherwise data role switch fails for DRP. We only use values cached from the IRQ instead of poking I2C all the time. The update is moved in a function that will become more useful in later commits. Fixes: 18a6c866bb19 ("usb: typec: tps6598x: Add USB role switching logic") Signed-off-by: Angus Ainslie Signed-off-by: Sebastian Krzyszkowiak --- drivers/usb/typec/tipd/core.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c index dfbba5ae9487..f387786ff95e 100644 --- a/drivers/usb/typec/tipd/core.c +++ b/drivers/usb/typec/tipd/core.c @@ -94,6 +94,7 @@ struct tps6598x { struct power_supply_desc psy_desc; enum power_supply_usb_type usb_type; =20 + u32 data_status; u16 pwr_status; }; =20 @@ -271,6 +272,15 @@ static int tps6598x_connect(struct tps6598x *tps, u32 = status) return 0; } =20 +static int +tps6598x_update_data_status(struct tps6598x *tps, u32 status) +{ + tps6598x_set_data_role(tps, TPS_STATUS_TO_TYPEC_DATAROLE(status), + !!(tps->data_status & TPS_DATA_STATUS_DATA_CONNECTION)); + trace_tps6598x_data_status(tps->data_status); + return 0; +} + static void tps6598x_disconnect(struct tps6598x *tps, u32 status) { if (!IS_ERR(tps->partner)) @@ -370,8 +380,6 @@ static int tps6598x_dr_set(struct typec_port *port, enu= m typec_data_role role) goto out_unlock; } =20 - tps6598x_set_data_role(tps, role, true); - out_unlock: mutex_unlock(&tps->lock); =20 @@ -437,6 +445,7 @@ static bool tps6598x_read_data_status(struct tps6598x *= tps) dev_err(tps->dev, "failed to read data status: %d\n", ret); return false; } + tps->data_status =3D data_status; trace_tps6598x_data_status(data_status); =20 return true; @@ -497,10 +506,13 @@ static irqreturn_t cd321x_interrupt(int irq, void *da= ta) if (!tps6598x_read_power_status(tps)) goto err_clear_ints; =20 - if (event & APPLE_CD_REG_INT_DATA_STATUS_UPDATE) + if (event & APPLE_CD_REG_INT_DATA_STATUS_UPDATE) { if (!tps6598x_read_data_status(tps)) goto err_clear_ints; =20 + tps6598x_update_data_status(tps, status); + } + /* Handle plug insert or removal */ if (event & APPLE_CD_REG_INT_PLUG_EVENT) tps6598x_handle_plug_event(tps, status); @@ -544,10 +556,13 @@ static irqreturn_t tps6598x_interrupt(int irq, void *= data) if (!tps6598x_read_power_status(tps)) goto err_clear_ints; =20 - if ((event1 | event2) & TPS_REG_INT_DATA_STATUS_UPDATE) + if ((event1 | event2) & TPS_REG_INT_DATA_STATUS_UPDATE) { if (!tps6598x_read_data_status(tps)) goto err_clear_ints; =20 + tps6598x_update_data_status(tps, status); + } + /* Handle plug insert or removal */ if ((event1 | event2) & TPS_REG_INT_PLUG_EVENT) tps6598x_handle_plug_event(tps, status); --=20 2.35.1 From nobody Mon Jun 22 20:25:19 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 864C3C433F5 for ; Thu, 17 Mar 2022 15:48:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236124AbiCQPtn (ORCPT ); Thu, 17 Mar 2022 11:49:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45948 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236121AbiCQPt1 (ORCPT ); Thu, 17 Mar 2022 11:49:27 -0400 Received: from comms.puri.sm (comms.puri.sm [159.203.221.185]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 074D026C2; Thu, 17 Mar 2022 08:48:02 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id 899DBE013D; Thu, 17 Mar 2022 08:48:02 -0700 (PDT) Received: from comms.puri.sm ([127.0.0.1]) by localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id FVmjhwqjJUqz; Thu, 17 Mar 2022 08:48:01 -0700 (PDT) From: Sebastian Krzyszkowiak To: Heikki Krogerus , linux-usb@vger.kernel.org Cc: Sebastian Krzyszkowiak , Greg Kroah-Hartman , Sven Peter , =?UTF-8?q?Guido=20G=C3=BCnther?= , Angus Ainslie , Hector Martin , "Bryan O'Donoghue" , linux-kernel@vger.kernel.org, kernel@puri.sm Subject: [PATCH 3/7] usb: typec: tipd: Add trace event for SINK PD contract Date: Thu, 17 Mar 2022 16:45:14 +0100 Message-Id: <20220317154518.4082046-4-sebastian.krzyszkowiak@puri.sm> In-Reply-To: <20220317154518.4082046-1-sebastian.krzyszkowiak@puri.sm> References: <20220317154518.4082046-1-sebastian.krzyszkowiak@puri.sm> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Angus Ainslie This allows to trace the negotiated contract as sink. It's only updated when the contract is actually established. Co-developed-by: Guido G=C3=BCnther Signed-off-by: Guido G=C3=BCnther Signed-off-by: Angus Ainslie Signed-off-by: Sebastian Krzyszkowiak --- drivers/usb/typec/tipd/core.c | 63 ++++++++++++++++++++++++++++++- drivers/usb/typec/tipd/tps6598x.h | 30 +++++++++++++++ drivers/usb/typec/tipd/trace.h | 38 +++++++++++++++++++ 3 files changed, 129 insertions(+), 2 deletions(-) diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c index f387786ff95e..80b4a9870caf 100644 --- a/drivers/usb/typec/tipd/core.c +++ b/drivers/usb/typec/tipd/core.c @@ -34,6 +34,7 @@ #define TPS_REG_STATUS 0x1a #define TPS_REG_SYSTEM_CONF 0x28 #define TPS_REG_CTRL_CONF 0x29 +#define TPS_REG_ACTIVE_CONTRACT 0x34 #define TPS_REG_POWER_STATUS 0x3f #define TPS_REG_RX_IDENTITY_SOP 0x48 #define TPS_REG_DATA_STATUS 0x5f @@ -93,6 +94,7 @@ struct tps6598x { struct power_supply *psy; struct power_supply_desc psy_desc; enum power_supply_usb_type usb_type; + struct tps6598x_pdo terms; =20 u32 data_status; u16 pwr_status; @@ -528,6 +530,47 @@ static irqreturn_t cd321x_interrupt(int irq, void *dat= a) return IRQ_NONE; } =20 +static int tps6598x_get_active_pd_contract(struct tps6598x *tps) +{ + u64 contract; + int type; + int max_power; + int ret =3D 0; + + ret =3D tps6598x_block_read(tps, TPS_REG_ACTIVE_CONTRACT, &contract, 6); + if (ret) + return ret; + + contract &=3D 0xFFFFFFFFFFFF; + type =3D TPS_PDO_CONTRACT_TYPE(contract); + memset(&tps->terms, 0, sizeof(struct tps6598x_pdo)); + + /* If there's no PD it decodes to all 0 */ + switch (type) { + case TPS_PDO_CONTRACT_FIXED: + tps->terms.max_voltage =3D TPS_PDO_FIXED_CONTRACT_VOLTAGE(contract); + tps->terms.max_current =3D TPS_PDO_FIXED_CONTRACT_MAX_CURRENT(contract); + break; + case TPS_PDO_CONTRACT_BATTERY: + tps->terms.max_voltage =3D TPS_PDO_BAT_CONTRACT_MAX_VOLTAGE(contract); + max_power =3D TPS_PDO_BAT_CONTRACT_MAX_POWER(contract); + tps->terms.max_current =3D 1000 * 1000 * max_power / tps->terms.max_volt= age; + break; + case TPS_PDO_CONTRACT_VARIABLE: + tps->terms.max_voltage =3D TPS_PDO_VAR_CONTRACT_MAX_VOLTAGE(contract); + tps->terms.max_current =3D TPS_PDO_VAR_CONTRACT_MAX_CURRENT(contract); + break; + default: + dev_warn(tps->dev, "Unknown contract type: %d\n", type); + return -EINVAL; + } + + tps->terms.pdo =3D contract; + trace_tps6598x_pdo(&tps->terms); + + return 0; +} + static irqreturn_t tps6598x_interrupt(int irq, void *data) { struct tps6598x *tps =3D data; @@ -563,6 +606,14 @@ static irqreturn_t tps6598x_interrupt(int irq, void *d= ata) tps6598x_update_data_status(tps, status); } =20 + if ((event1 | event2) & TPS_REG_INT_NEW_CONTRACT_AS_CONSUMER) { + ret =3D tps6598x_get_active_pd_contract(tps); + if (ret) { + dev_err(tps->dev, "failed to read pd contract: %d\n", ret); + goto err_clear_ints; + } + } + /* Handle plug insert or removal */ if ((event1 | event2) & TPS_REG_INT_PLUG_EVENT) tps6598x_handle_plug_event(tps, status); @@ -751,10 +802,11 @@ static int tps6598x_probe(struct i2c_client *client) =20 irq_handler =3D cd321x_interrupt; } else { - /* Enable power status, data status and plug event interrupts */ + /* Enable interrupts used by this driver */ mask1 =3D TPS_REG_INT_POWER_STATUS_UPDATE | TPS_REG_INT_DATA_STATUS_UPDATE | - TPS_REG_INT_PLUG_EVENT; + TPS_REG_INT_PLUG_EVENT | + TPS_REG_INT_NEW_CONTRACT_AS_CONSUMER; } =20 /* Make sure the controller has application firmware running */ @@ -847,6 +899,13 @@ static int tps6598x_probe(struct i2c_client *client) ret =3D tps6598x_connect(tps, status); if (ret) dev_err(&client->dev, "failed to register partner\n"); + + if ((TPS_POWER_STATUS_PWROPMODE(tps->pwr_status) =3D=3D TYPEC_PWR_MODE_P= D) && + (!(status & TPS_STATUS_PORTROLE))) { + ret =3D tps6598x_get_active_pd_contract(tps); + if (ret) + dev_err(tps->dev, "failed to read pd contract: %d\n", ret); + } } =20 ret =3D devm_request_threaded_irq(&client->dev, client->irq, NULL, diff --git a/drivers/usb/typec/tipd/tps6598x.h b/drivers/usb/typec/tipd/tps= 6598x.h index 527857549d69..546cd4881f1f 100644 --- a/drivers/usb/typec/tipd/tps6598x.h +++ b/drivers/usb/typec/tipd/tps6598x.h @@ -199,4 +199,34 @@ #define TPS_DATA_STATUS_DP_SPEC_PIN_ASSIGNMENT_A BIT(2) #define TPS_DATA_STATUS_DP_SPEC_PIN_ASSIGNMENT_B (BIT(2) | BIT(1)) =20 + +/* PDO decoding as in https://www.ti.com/lit/an/slva842/slva842.pdf */ +#define TPS_PDO_CONTRACT_TYPE(x) FIELD_GET(GENMASK(31, 30), x) +#define TPS_PDO_CONTRACT_FIXED 0 +#define TPS_PDO_CONTRACT_BATTERY 1 +#define TPS_PDO_CONTRACT_VARIABLE 2 + +#define TPS_PDO_FIXED_CONTRACT_DETAILS GENMASK(29, 25) +#define TPS_PDO_FIXED_CONTRACT_DR_POWER BIT(29) +#define TPS_PDO_FIXED_CONTRACT_USB_SUSPEND BIT(28) +#define TPS_PDO_FIXED_CONTRACT_EXTERNAL_PWR BIT(27) +#define TPS_PDO_FIXED_CONTRACT_USB_COMMS BIT(26) +#define TPS_PDO_FIXED_CONTRACT_DR_DATA BIT(25) + +#define TPS_PDO_FIXED_CONTRACT_VOLTAGE(x) (FIELD_GET(GENMASK(19, 10), x) *= 50000) +#define TPS_PDO_FIXED_CONTRACT_MAX_CURRENT(x) (FIELD_GET(GENMASK(9, 0), x)= * 10000) +#define TPS_PDO_VAR_CONTRACT_MAX_VOLTAGE(x) (FIELD_GET(GENMASK(29, 20), x)= * 50000) +#define TPS_PDO_VAR_CONTRACT_MIN_VOLTAGE(x) (FIELD_GET(GENMASK(19, 10), x)= * 50000) +#define TPS_PDO_VAR_CONTRACT_MAX_CURRENT(x) (FIELD_GET(GENMASK(9, 0), x) *= 10000) +#define TPS_PDO_BAT_CONTRACT_MAX_VOLTAGE(x) (FIELD_GET(GENMASK(29, 20), x)= * 50000) +#define TPS_PDO_BAT_CONTRACT_MIN_VOLTAGE(x) (FIELD_GET(GENMASK(19, 10), x)= * 50000) +#define TPS_PDO_BAT_CONTRACT_MAX_POWER(x) (FIELD_GET(GENMASK(9, 0), x) * 2= 50000) + +struct tps6598x_pdo { + u32 pdo; + int max_voltage; /* uV */ + int max_current; /* uA */ + int max_power; /* uW */ +}; + #endif /* __TPS6598X_H__ */ diff --git a/drivers/usb/typec/tipd/trace.h b/drivers/usb/typec/tipd/trace.h index 12cad1bde7cc..148e2ef3157b 100644 --- a/drivers/usb/typec/tipd/trace.h +++ b/drivers/usb/typec/tipd/trace.h @@ -194,6 +194,20 @@ (data_status & TPS_DATA_STATUS_DP_CONNECTION ? \ show_data_status_dp_pin_assignment(data_status) : "") =20 +#define show_pdo_contract_type(pdo) \ + __print_symbolic(TPS_PDO_CONTRACT_TYPE(pdo), \ + { TPS_PDO_CONTRACT_FIXED, "fixed" }, \ + { TPS_PDO_CONTRACT_BATTERY, "battery" }, \ + { TPS_PDO_CONTRACT_VARIABLE, "variable" }) + +#define show_pdo_contract_details(pdo) \ + __print_flags(pdo & TPS_PDO_FIXED_CONTRACT_DETAILS, "|", \ + { TPS_PDO_FIXED_CONTRACT_DR_POWER, "dr-power" }, \ + { TPS_PDO_FIXED_CONTRACT_USB_SUSPEND, "usb-suspend" }, \ + { TPS_PDO_FIXED_CONTRACT_EXTERNAL_PWR, "ext-power" }, \ + { TPS_PDO_FIXED_CONTRACT_USB_COMMS, "usb-comms" }, \ + { TPS_PDO_FIXED_CONTRACT_DR_DATA, "dr-data" }) + TRACE_EVENT(tps6598x_irq, TP_PROTO(u64 event1, u64 event2), @@ -296,6 +310,30 @@ TRACE_EVENT(tps6598x_data_status, ) ); =20 +TRACE_EVENT(tps6598x_pdo, + TP_PROTO(struct tps6598x_pdo *pdo), + TP_ARGS(pdo), + + TP_STRUCT__entry( + __field(u32, pdo) + __field(int, max_current) + __field(int, max_voltage) + ), + + TP_fast_assign( + __entry->pdo =3D pdo->pdo; + __entry->max_current =3D pdo->max_current; + __entry->max_voltage =3D pdo->max_voltage; + ), + + TP_printk("%s supply, max %duA, %duV, details: %s", + show_pdo_contract_type(__entry->pdo), + __entry->max_current, + __entry->max_voltage, + show_pdo_contract_details(__entry->pdo) + ) +); + #endif /* _TPS6598X_TRACE_H_ */ =20 /* This part must be outside protection */ --=20 2.35.1 From nobody Mon Jun 22 20:25:19 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 32150C433F5 for ; Thu, 17 Mar 2022 15:48:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236187AbiCQPuJ (ORCPT ); Thu, 17 Mar 2022 11:50:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47190 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236200AbiCQPuC (ORCPT ); Thu, 17 Mar 2022 11:50:02 -0400 Received: from comms.puri.sm (comms.puri.sm [159.203.221.185]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C787A7B574; Thu, 17 Mar 2022 08:48:38 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id 2BE54E014D; Thu, 17 Mar 2022 08:48:08 -0700 (PDT) Received: from comms.puri.sm ([127.0.0.1]) by localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id oXZf-2y21f8e; Thu, 17 Mar 2022 08:48:07 -0700 (PDT) From: Sebastian Krzyszkowiak To: Heikki Krogerus , linux-usb@vger.kernel.org Cc: Sebastian Krzyszkowiak , Greg Kroah-Hartman , Sven Peter , =?UTF-8?q?Guido=20G=C3=BCnther?= , Angus Ainslie , Hector Martin , "Bryan O'Donoghue" , linux-kernel@vger.kernel.org, kernel@puri.sm Subject: [PATCH 4/7] usb: typec: tipd: Provide POWER_SUPPLY_PROP_{CURRENT,VOLTAGE}_MAX Date: Thu, 17 Mar 2022 16:45:15 +0100 Message-Id: <20220317154518.4082046-5-sebastian.krzyszkowiak@puri.sm> In-Reply-To: <20220317154518.4082046-1-sebastian.krzyszkowiak@puri.sm> References: <20220317154518.4082046-1-sebastian.krzyszkowiak@puri.sm> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Angus Ainslie This helps downstream supplies to adjust their input limits. Signed-off-by: Angus Ainslie Signed-off-by: Guido G=C3=BCnther Signed-off-by: Sebastian Krzyszkowiak --- drivers/usb/typec/tipd/core.c | 76 ++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c index 80b4a9870caf..f3e8f1183f5b 100644 --- a/drivers/usb/typec/tipd/core.c +++ b/drivers/usb/typec/tipd/core.c @@ -39,6 +39,11 @@ #define TPS_REG_RX_IDENTITY_SOP 0x48 #define TPS_REG_DATA_STATUS 0x5f =20 +#define TPS_USB_500mA 500000 +#define TPS_TYPEC_1500mA 1500000 +#define TPS_TYPEC_3000mA 3000000 +#define TPS_USB_5V 5000000 + /* TPS_REG_SYSTEM_CONF bits */ #define TPS_SYSCONF_PORTINFO(c) ((c) & 7) =20 @@ -103,6 +108,8 @@ struct tps6598x { static enum power_supply_property tps6598x_psy_props[] =3D { POWER_SUPPLY_PROP_USB_TYPE, POWER_SUPPLY_PROP_ONLINE, + POWER_SUPPLY_PROP_CURRENT_MAX, + POWER_SUPPLY_PROP_VOLTAGE_MAX, }; =20 static enum power_supply_usb_type tps6598x_psy_usb_types[] =3D { @@ -294,6 +301,8 @@ static void tps6598x_disconnect(struct tps6598x *tps, u= 32 status) typec_set_orientation(tps->port, TYPEC_ORIENTATION_NONE); tps6598x_set_data_role(tps, TPS_STATUS_TO_TYPEC_DATAROLE(status), false); =20 + memset(&tps->terms, 0, sizeof(struct tps6598x_pdo)); + power_supply_changed(tps->psy); } =20 @@ -577,6 +586,7 @@ static irqreturn_t tps6598x_interrupt(int irq, void *da= ta) u64 event1; u64 event2; u32 status; + bool psy_changed =3D false; int ret; =20 mutex_lock(&tps->lock); @@ -595,10 +605,13 @@ static irqreturn_t tps6598x_interrupt(int irq, void *= data) if (!tps6598x_read_status(tps, &status)) goto err_clear_ints; =20 - if ((event1 | event2) & TPS_REG_INT_POWER_STATUS_UPDATE) + if ((event1 | event2) & TPS_REG_INT_POWER_STATUS_UPDATE) { if (!tps6598x_read_power_status(tps)) goto err_clear_ints; =20 + psy_changed =3D true; + } + if ((event1 | event2) & TPS_REG_INT_DATA_STATUS_UPDATE) { if (!tps6598x_read_data_status(tps)) goto err_clear_ints; @@ -612,12 +625,18 @@ static irqreturn_t tps6598x_interrupt(int irq, void *= data) dev_err(tps->dev, "failed to read pd contract: %d\n", ret); goto err_clear_ints; } + psy_changed =3D true; } =20 /* Handle plug insert or removal */ if ((event1 | event2) & TPS_REG_INT_PLUG_EVENT) tps6598x_handle_plug_event(tps, status); =20 + if ((event1 | event2) & TPS_REG_INT_HARD_RESET) { + memset(&tps->terms, 0, sizeof(struct tps6598x_pdo)); + psy_changed =3D true; + } + err_clear_ints: tps6598x_write64(tps, TPS_REG_INT_CLEAR1, event1); tps6598x_write64(tps, TPS_REG_INT_CLEAR2, event2); @@ -625,6 +644,9 @@ static irqreturn_t tps6598x_interrupt(int irq, void *da= ta) err_unlock: mutex_unlock(&tps->lock); =20 + if (psy_changed) + power_supply_changed(tps->psy); + if (event1 | event2) return IRQ_HANDLED; return IRQ_NONE; @@ -671,6 +693,49 @@ static int tps6598x_psy_get_online(struct tps6598x *tp= s, } else { val->intval =3D 0; } + + return 0; +} + +static int tps6598x_psy_get_max_current(struct tps6598x *tps, + union power_supply_propval *val) +{ + enum typec_pwr_opmode mode; + + mode =3D TPS_POWER_STATUS_PWROPMODE(tps->pwr_status); + switch (mode) { + case TYPEC_PWR_MODE_1_5A: + val->intval =3D TPS_TYPEC_1500mA; + break; + case TYPEC_PWR_MODE_3_0A: + val->intval =3D TPS_TYPEC_3000mA; + break; + case TYPEC_PWR_MODE_PD: + val->intval =3D tps->terms.max_current ?: TPS_USB_500mA; + break; + default: + case TYPEC_PWR_MODE_USB: + val->intval =3D TPS_USB_500mA; + } + return 0; +} + +static int tps6598x_psy_get_max_voltage(struct tps6598x *tps, + union power_supply_propval *val) +{ + enum typec_pwr_opmode mode; + + mode =3D TPS_POWER_STATUS_PWROPMODE(tps->pwr_status); + switch (mode) { + case TYPEC_PWR_MODE_PD: + val->intval =3D tps->terms.max_voltage ?: TPS_USB_5V; + break; + default: + case TYPEC_PWR_MODE_1_5A: + case TYPEC_PWR_MODE_3_0A: + case TYPEC_PWR_MODE_USB: + val->intval =3D TPS_USB_5V; + } return 0; } =20 @@ -691,6 +756,12 @@ static int tps6598x_psy_get_prop(struct power_supply *= psy, case POWER_SUPPLY_PROP_ONLINE: ret =3D tps6598x_psy_get_online(tps, val); break; + case POWER_SUPPLY_PROP_CURRENT_MAX: + ret =3D tps6598x_psy_get_max_current(tps, val); + break; + case POWER_SUPPLY_PROP_VOLTAGE_MAX: + ret =3D tps6598x_psy_get_max_voltage(tps, val); + break; default: ret =3D -EINVAL; break; @@ -806,7 +877,8 @@ static int tps6598x_probe(struct i2c_client *client) mask1 =3D TPS_REG_INT_POWER_STATUS_UPDATE | TPS_REG_INT_DATA_STATUS_UPDATE | TPS_REG_INT_PLUG_EVENT | - TPS_REG_INT_NEW_CONTRACT_AS_CONSUMER; + TPS_REG_INT_NEW_CONTRACT_AS_CONSUMER | + TPS_REG_INT_HARD_RESET; } =20 /* Make sure the controller has application firmware running */ --=20 2.35.1 From nobody Mon Jun 22 20:25:19 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2629EC433F5 for ; Thu, 17 Mar 2022 15:48:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233742AbiCQPuN (ORCPT ); Thu, 17 Mar 2022 11:50:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47224 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236174AbiCQPuF (ORCPT ); Thu, 17 Mar 2022 11:50:05 -0400 Received: from comms.puri.sm (comms.puri.sm [159.203.221.185]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C682FBB931; Thu, 17 Mar 2022 08:48:45 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id 09CCBE0142; Thu, 17 Mar 2022 08:48:15 -0700 (PDT) Received: from comms.puri.sm ([127.0.0.1]) by localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id wm80spgabJ9o; Thu, 17 Mar 2022 08:48:14 -0700 (PDT) From: Sebastian Krzyszkowiak To: Heikki Krogerus , linux-usb@vger.kernel.org Cc: Sebastian Krzyszkowiak , Greg Kroah-Hartman , Sven Peter , =?UTF-8?q?Guido=20G=C3=BCnther?= , Angus Ainslie , Hector Martin , "Bryan O'Donoghue" , linux-kernel@vger.kernel.org, kernel@puri.sm Subject: [PATCH 5/7] usb: typec: tipd: Provide POWER_SUPPLY_PROP_PRESENT Date: Thu, 17 Mar 2022 16:45:16 +0100 Message-Id: <20220317154518.4082046-6-sebastian.krzyszkowiak@puri.sm> In-Reply-To: <20220317154518.4082046-1-sebastian.krzyszkowiak@puri.sm> References: <20220317154518.4082046-1-sebastian.krzyszkowiak@puri.sm> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This allows userspace and downstream supplies to know whether something is plugged in. Signed-off-by: Sebastian Krzyszkowiak --- drivers/usb/typec/tipd/core.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c index f3e8f1183f5b..874528b02a99 100644 --- a/drivers/usb/typec/tipd/core.c +++ b/drivers/usb/typec/tipd/core.c @@ -108,6 +108,7 @@ struct tps6598x { static enum power_supply_property tps6598x_psy_props[] =3D { POWER_SUPPLY_PROP_USB_TYPE, POWER_SUPPLY_PROP_ONLINE, + POWER_SUPPLY_PROP_PRESENT, POWER_SUPPLY_PROP_CURRENT_MAX, POWER_SUPPLY_PROP_VOLTAGE_MAX, }; @@ -756,6 +757,9 @@ static int tps6598x_psy_get_prop(struct power_supply *p= sy, case POWER_SUPPLY_PROP_ONLINE: ret =3D tps6598x_psy_get_online(tps, val); break; + case POWER_SUPPLY_PROP_PRESENT: + val->intval =3D !!tps->partner; + break; case POWER_SUPPLY_PROP_CURRENT_MAX: ret =3D tps6598x_psy_get_max_current(tps, val); break; --=20 2.35.1 From nobody Mon Jun 22 20:25:19 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 801ACC433F5 for ; Thu, 17 Mar 2022 15:48:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236151AbiCQPuD (ORCPT ); Thu, 17 Mar 2022 11:50:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46314 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236137AbiCQPtq (ORCPT ); Thu, 17 Mar 2022 11:49:46 -0400 Received: from comms.puri.sm (comms.puri.sm [159.203.221.185]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 76C71E0A2; Thu, 17 Mar 2022 08:48:20 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id 216E2E0152; Thu, 17 Mar 2022 08:48:20 -0700 (PDT) Received: from comms.puri.sm ([127.0.0.1]) by localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id PXDfg9TV7vKz; Thu, 17 Mar 2022 08:48:19 -0700 (PDT) From: Sebastian Krzyszkowiak To: Heikki Krogerus , linux-usb@vger.kernel.org Cc: Sebastian Krzyszkowiak , Greg Kroah-Hartman , Sven Peter , =?UTF-8?q?Guido=20G=C3=BCnther?= , Angus Ainslie , Hector Martin , "Bryan O'Donoghue" , linux-kernel@vger.kernel.org, kernel@puri.sm Subject: [PATCH 6/7] usb: typec: tipd: Add debugfs entries for customer use word Date: Thu, 17 Mar 2022 16:45:17 +0100 Message-Id: <20220317154518.4082046-7-sebastian.krzyszkowiak@puri.sm> In-Reply-To: <20220317154518.4082046-1-sebastian.krzyszkowiak@puri.sm> References: <20220317154518.4082046-1-sebastian.krzyszkowiak@puri.sm> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Guido G=C3=BCnther This allows to verify that a sane firmware is on the device. Signed-off-by: Guido G=C3=BCnther Signed-off-by: Sebastian Krzyszkowiak --- drivers/usb/typec/tipd/core.c | 65 +++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c index 874528b02a99..d3c70aaf1a0c 100644 --- a/drivers/usb/typec/tipd/core.c +++ b/drivers/usb/typec/tipd/core.c @@ -6,6 +6,7 @@ * Author: Heikki Krogerus */ =20 +#include #include #include #include @@ -22,6 +23,7 @@ /* Register offsets */ #define TPS_REG_VID 0x00 #define TPS_REG_MODE 0x03 +#define TPS_REG_CUSTOMER_USE 0x06 #define TPS_REG_CMD1 0x08 #define TPS_REG_DATA1 0x09 #define TPS_REG_INT_EVENT1 0x14 @@ -99,10 +101,15 @@ struct tps6598x { struct power_supply *psy; struct power_supply_desc psy_desc; enum power_supply_usb_type usb_type; + struct tps6598x_pdo terms; =20 u32 data_status; u16 pwr_status; +#ifdef CONFIG_DEBUG_FS + struct dentry *dev_dentry; + struct dentry *customer_user_dentry; +#endif }; =20 static enum power_supply_property tps6598x_psy_props[] =3D { @@ -239,6 +246,62 @@ static void tps6598x_set_data_role(struct tps6598x *tp= s, typec_set_data_role(tps->port, role); } =20 +#ifdef CONFIG_DEBUG_FS +static struct dentry *rootdir; + +static int tps6598x_debug_customer_use_show(struct seq_file *s, void *v) +{ + struct tps6598x *tps =3D (struct tps6598x *)s->private; + u64 mode64; + int ret; + + mutex_lock(&tps->lock); + + ret =3D tps6598x_block_read(tps, TPS_REG_CUSTOMER_USE, &mode64, sizeof(m= ode64)); + if (!ret) + seq_printf(s, "0x%016llx\n", mode64); + + mutex_unlock(&tps->lock); + + return 0; +} +DEFINE_SHOW_ATTRIBUTE(tps6598x_debug_customer_use); + +static void tps6598x_debugfs_init(struct tps6598x *tps) +{ + struct dentry *dentry; + + if (!rootdir) + rootdir =3D debugfs_create_dir("tps6598x", NULL); + + dentry =3D debugfs_create_dir(dev_name(tps->dev), rootdir); + if (IS_ERR(dentry)) + return; + tps->dev_dentry =3D dentry; + + dentry =3D debugfs_create_file("customer_use", + S_IFREG | 0444, tps->dev_dentry, + tps, &tps6598x_debug_customer_use_fops); + if (IS_ERR(dentry)) + return; + tps->customer_user_dentry =3D dentry; +} + +static void tps6598x_debugfs_exit(struct tps6598x *tps) +{ + debugfs_remove(tps->customer_user_dentry); + debugfs_remove(tps->dev_dentry); + debugfs_remove(rootdir); + rootdir =3D NULL; +} + +#else + +static void tps6598x_debugfs_init(const struct tps6598x *tps) { } +static void tps6598x_debugfs_exit(const struct tps6598x *tps) { } + +#endif + static int tps6598x_connect(struct tps6598x *tps, u32 status) { struct typec_partner_desc desc; @@ -995,6 +1058,7 @@ static int tps6598x_probe(struct i2c_client *client) } =20 i2c_set_clientdata(client, tps); + tps6598x_debugfs_init(tps); =20 return 0; =20 @@ -1011,6 +1075,7 @@ static int tps6598x_remove(struct i2c_client *client) { struct tps6598x *tps =3D i2c_get_clientdata(client); =20 + tps6598x_debugfs_exit(tps); tps6598x_disconnect(tps, 0); typec_unregister_port(tps->port); usb_role_switch_put(tps->role_sw); --=20 2.35.1 From nobody Mon Jun 22 20:25:19 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 502DBC433FE for ; Thu, 17 Mar 2022 15:49:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236189AbiCQPuR (ORCPT ); Thu, 17 Mar 2022 11:50:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47174 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236164AbiCQPtv (ORCPT ); Thu, 17 Mar 2022 11:49:51 -0400 Received: from comms.puri.sm (comms.puri.sm [159.203.221.185]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 81D8E39BA2; Thu, 17 Mar 2022 08:48:28 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id 0C9D4E0186; Thu, 17 Mar 2022 08:48:28 -0700 (PDT) Received: from comms.puri.sm ([127.0.0.1]) by localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 8c350X3jHgUq; Thu, 17 Mar 2022 08:48:27 -0700 (PDT) From: Sebastian Krzyszkowiak To: Heikki Krogerus , linux-usb@vger.kernel.org Cc: Sebastian Krzyszkowiak , Greg Kroah-Hartman , Sven Peter , =?UTF-8?q?Guido=20G=C3=BCnther?= , Angus Ainslie , Hector Martin , "Bryan O'Donoghue" , linux-kernel@vger.kernel.org, kernel@puri.sm Subject: [PATCH 7/7] usb: typec: tipd: Fail probe when the controller is in BOOT mode Date: Thu, 17 Mar 2022 16:45:18 +0100 Message-Id: <20220317154518.4082046-8-sebastian.krzyszkowiak@puri.sm> In-Reply-To: <20220317154518.4082046-1-sebastian.krzyszkowiak@puri.sm> References: <20220317154518.4082046-1-sebastian.krzyszkowiak@puri.sm> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" BOOT mode means that the device isn't operational because of missing firmware, so there's no reason to try to continue in this condition (probe will fail in a different place anyway). Aside of that, the warning that used to be emited about "dead-battery condition" was misleading, as dead-battery condition is a different thing that's unrelated to operation mode. Therefore, assume that BOOT mode is not a supported mode of operation. Signed-off-by: Sebastian Krzyszkowiak Reviewed-by: Heikki Krogerus --- drivers/usb/typec/tipd/core.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c index d3c70aaf1a0c..c818cc40139d 100644 --- a/drivers/usb/typec/tipd/core.c +++ b/drivers/usb/typec/tipd/core.c @@ -729,8 +729,6 @@ static int tps6598x_check_mode(struct tps6598x *tps) case TPS_MODE_APP: return 0; case TPS_MODE_BOOT: - dev_warn(tps->dev, "dead-battery condition\n"); - return 0; case TPS_MODE_BIST: case TPS_MODE_DISC: default: --=20 2.35.1