linux-usb.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 00/11] usb: typec: ucsi: fix several issues manifesting on Qualcomm platforms
@ 2024-03-29  6:15 Dmitry Baryshkov
  2024-03-29  6:15 ` [PATCH v2 01/11] usb: typec: ucsi: allow non-partner GET_PDOS for Qualcomm devices Dmitry Baryshkov
                   ` (10 more replies)
  0 siblings, 11 replies; 19+ messages in thread
From: Dmitry Baryshkov @ 2024-03-29  6:15 UTC (permalink / raw)
  To: Heikki Krogerus, Greg Kroah-Hartman, Guenter Roeck,
	Bjorn Andersson, Neil Armstrong, Konrad Dybcio
  Cc: Johan Hovold, linux-usb, linux-arm-msm, Dmitry Baryshkov

Fix several issues discovered while debugging UCSI implementation on
Qualcomm platforms (ucsi_glink). With these patches I was able to
get a working Type-C port managament implementation. Tested on SC8280XP
(Lenovo X13s laptop), SM8350-HDK. Lightly tested on SC8180X Primus devices.

Depends: [1], [2], [3]

[1] https://lore.kernel.org/all/20240315171836.343830-2-jthies@google.com/
[2] https://lore.kernel.org/linux-usb/20240320073927.1641788-1-lk@c--e.de/
[3] https://lore.kernel.org/linux-usb/20240327224554.1772525-1-lk@c--e.de/

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
Changes in v2:
- Added a quirk to delay GET_PDOS / PD registration on Qualcomm platforms (Johan)
- Enabled UCSI on sc8180x after running the tests on the hardware
- Dropped the ACK_CC patches, replaced by dependency on Christian's
  series
- Link to v1: https://lore.kernel.org/r/20240313-qcom-ucsi-fixes-v1-0-74d90cb48a00@linaro.org

---
Dmitry Baryshkov (11):
      usb: typec: ucsi: allow non-partner GET_PDOS for Qualcomm devices
      usb: typec: ucsi: limit the UCSI_NO_PARTNER_PDOS even further
      usb: typec: ucsi: properly register partner's PD device
      usb: typec: ucsi: always register a link to USB PD device
      usb: typec: ucsi: simplify partner's PD caps registration
      usb: typec: ucsi: extract code to read PD caps
      usb: typec: ucsi: support delaying GET_PDOS for device
      usb: typec: ucsi_glink: rework quirks implementation
      usb: typec: ucsi_glink: enable the UCSI_DELAY_DEVICE_PDOS quirk
      soc: qcom: pmic_glink: reenable UCSI on sc8280xp
      soc: qcom: pmic_glink: enable UCSI on sc8180x

 drivers/soc/qcom/pmic_glink.c       |   5 --
 drivers/usb/typec/ucsi/ucsi.c       | 139 ++++++++++++++++--------------------
 drivers/usb/typec/ucsi/ucsi.h       |   1 +
 drivers/usb/typec/ucsi/ucsi_glink.c |  17 +++--
 4 files changed, 74 insertions(+), 88 deletions(-)
---
base-commit: 845042eeeaca808537b4dd6e1de3f19a0d747fa1
change-id: 20240312-qcom-ucsi-fixes-6578d236b60b

Best regards,
-- 
Dmitry Baryshkov <dmitry.baryshkov@linaro.org>


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH v2 01/11] usb: typec: ucsi: allow non-partner GET_PDOS for Qualcomm devices
  2024-03-29  6:15 [PATCH v2 00/11] usb: typec: ucsi: fix several issues manifesting on Qualcomm platforms Dmitry Baryshkov
@ 2024-03-29  6:15 ` Dmitry Baryshkov
  2024-03-29  6:15 ` [PATCH v2 02/11] usb: typec: ucsi: limit the UCSI_NO_PARTNER_PDOS even further Dmitry Baryshkov
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: Dmitry Baryshkov @ 2024-03-29  6:15 UTC (permalink / raw)
  To: Heikki Krogerus, Greg Kroah-Hartman, Guenter Roeck,
	Bjorn Andersson, Neil Armstrong, Konrad Dybcio
  Cc: Johan Hovold, linux-usb, linux-arm-msm, Dmitry Baryshkov

The name and description of the USB_NO_PARTNER_PDOS quirk specifies that
only retrieving PDOS of the attached device is crashing. Retrieving PDOS
of the UCSI device works. Fix the condition to limit the workaround only
to is_partner cases.

Fixes: 1d103d6af241 ("usb: typec: ucsi: fix UCSI on buggy Qualcomm devices")
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/usb/typec/ucsi/ucsi.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
index 48f093a1dc09..42cc1c0e2f73 100644
--- a/drivers/usb/typec/ucsi/ucsi.c
+++ b/drivers/usb/typec/ucsi/ucsi.c
@@ -619,7 +619,8 @@ static int ucsi_read_pdos(struct ucsi_connector *con,
 	u64 command;
 	int ret;
 
-	if (ucsi->quirks & UCSI_NO_PARTNER_PDOS)
+	if (is_partner &&
+	    ucsi->quirks & UCSI_NO_PARTNER_PDOS)
 		return 0;
 
 	command = UCSI_COMMAND(UCSI_GET_PDOS) | UCSI_CONNECTOR_NUMBER(con->num);

-- 
2.39.2


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v2 02/11] usb: typec: ucsi: limit the UCSI_NO_PARTNER_PDOS even further
  2024-03-29  6:15 [PATCH v2 00/11] usb: typec: ucsi: fix several issues manifesting on Qualcomm platforms Dmitry Baryshkov
  2024-03-29  6:15 ` [PATCH v2 01/11] usb: typec: ucsi: allow non-partner GET_PDOS for Qualcomm devices Dmitry Baryshkov
@ 2024-03-29  6:15 ` Dmitry Baryshkov
  2024-03-29  6:15 ` [PATCH v2 03/11] usb: typec: ucsi: properly register partner's PD device Dmitry Baryshkov
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: Dmitry Baryshkov @ 2024-03-29  6:15 UTC (permalink / raw)
  To: Heikki Krogerus, Greg Kroah-Hartman, Guenter Roeck,
	Bjorn Andersson, Neil Armstrong, Konrad Dybcio
  Cc: Johan Hovold, linux-usb, linux-arm-msm, Dmitry Baryshkov

Reading Partner Source PDOs for the consumer Connectors appears to be
working. Permit getting PDOs in this case in order to populate
capabilities of the connected power supply in the sysfs.

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/usb/typec/ucsi/ucsi.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
index 42cc1c0e2f73..92886b3b0167 100644
--- a/drivers/usb/typec/ucsi/ucsi.c
+++ b/drivers/usb/typec/ucsi/ucsi.c
@@ -620,7 +620,9 @@ static int ucsi_read_pdos(struct ucsi_connector *con,
 	int ret;
 
 	if (is_partner &&
-	    ucsi->quirks & UCSI_NO_PARTNER_PDOS)
+	    ucsi->quirks & UCSI_NO_PARTNER_PDOS &&
+	    ((con->status.flags & UCSI_CONSTAT_PWR_DIR) ||
+	     !is_source(role)))
 		return 0;
 
 	command = UCSI_COMMAND(UCSI_GET_PDOS) | UCSI_CONNECTOR_NUMBER(con->num);

-- 
2.39.2


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v2 03/11] usb: typec: ucsi: properly register partner's PD device
  2024-03-29  6:15 [PATCH v2 00/11] usb: typec: ucsi: fix several issues manifesting on Qualcomm platforms Dmitry Baryshkov
  2024-03-29  6:15 ` [PATCH v2 01/11] usb: typec: ucsi: allow non-partner GET_PDOS for Qualcomm devices Dmitry Baryshkov
  2024-03-29  6:15 ` [PATCH v2 02/11] usb: typec: ucsi: limit the UCSI_NO_PARTNER_PDOS even further Dmitry Baryshkov
@ 2024-03-29  6:15 ` Dmitry Baryshkov
  2024-03-29  6:15 ` [PATCH v2 04/11] usb: typec: ucsi: always register a link to USB " Dmitry Baryshkov
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: Dmitry Baryshkov @ 2024-03-29  6:15 UTC (permalink / raw)
  To: Heikki Krogerus, Greg Kroah-Hartman, Guenter Roeck,
	Bjorn Andersson, Neil Armstrong, Konrad Dybcio
  Cc: Johan Hovold, linux-usb, linux-arm-msm, Dmitry Baryshkov

Use typec_partner_usb_power_delivery_register() to register PD device
for Type-C partner so that the PD device is nested under the partner's
device in sysfs.

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/usb/typec/ucsi/ucsi.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
index 92886b3b0167..7666142d8bbb 100644
--- a/drivers/usb/typec/ucsi/ucsi.c
+++ b/drivers/usb/typec/ucsi/ucsi.c
@@ -811,7 +811,7 @@ static int ucsi_register_partner_pdos(struct ucsi_connector *con)
 	if (con->partner_pd)
 		return 0;
 
-	con->partner_pd = usb_power_delivery_register(NULL, &desc);
+	con->partner_pd = typec_partner_usb_power_delivery_register(con->partner, &desc);
 	if (IS_ERR(con->partner_pd))
 		return PTR_ERR(con->partner_pd);
 

-- 
2.39.2


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v2 04/11] usb: typec: ucsi: always register a link to USB PD device
  2024-03-29  6:15 [PATCH v2 00/11] usb: typec: ucsi: fix several issues manifesting on Qualcomm platforms Dmitry Baryshkov
                   ` (2 preceding siblings ...)
  2024-03-29  6:15 ` [PATCH v2 03/11] usb: typec: ucsi: properly register partner's PD device Dmitry Baryshkov
@ 2024-03-29  6:15 ` Dmitry Baryshkov
  2024-04-02 10:38   ` Heikki Krogerus
  2024-03-29  6:15 ` [PATCH v2 05/11] usb: typec: ucsi: simplify partner's PD caps registration Dmitry Baryshkov
                   ` (6 subsequent siblings)
  10 siblings, 1 reply; 19+ messages in thread
From: Dmitry Baryshkov @ 2024-03-29  6:15 UTC (permalink / raw)
  To: Heikki Krogerus, Greg Kroah-Hartman, Guenter Roeck,
	Bjorn Andersson, Neil Armstrong, Konrad Dybcio
  Cc: Johan Hovold, linux-usb, linux-arm-msm, Dmitry Baryshkov

UCSI driver will attempt to set a USB PD device only if it was able to
read PDOs from the firmware. This results in suboptimal behaviour, since
the PD device will be created anyway. Move calls to
typec_port_set_usb_power_delivery() out of conditional code and call it
after reading capabilities.

Fixes: b04e1747fbcc ("usb: typec: ucsi: Register USB Power Delivery Capabilities")
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/usb/typec/ucsi/ucsi.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
index 7666142d8bbb..d1a45ce7f660 100644
--- a/drivers/usb/typec/ucsi/ucsi.c
+++ b/drivers/usb/typec/ucsi/ucsi.c
@@ -1569,7 +1569,6 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)
 		}
 
 		con->port_source_caps = pd_cap;
-		typec_port_set_usb_power_delivery(con->port, con->pd);
 	}
 
 	memset(&pd_caps, 0, sizeof(pd_caps));
@@ -1586,9 +1585,10 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)
 		}
 
 		con->port_sink_caps = pd_cap;
-		typec_port_set_usb_power_delivery(con->port, con->pd);
 	}
 
+	typec_port_set_usb_power_delivery(con->port, con->pd);
+
 	/* Alternate modes */
 	ret = ucsi_register_altmodes(con, UCSI_RECIPIENT_CON);
 	if (ret) {

-- 
2.39.2


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v2 05/11] usb: typec: ucsi: simplify partner's PD caps registration
  2024-03-29  6:15 [PATCH v2 00/11] usb: typec: ucsi: fix several issues manifesting on Qualcomm platforms Dmitry Baryshkov
                   ` (3 preceding siblings ...)
  2024-03-29  6:15 ` [PATCH v2 04/11] usb: typec: ucsi: always register a link to USB " Dmitry Baryshkov
@ 2024-03-29  6:15 ` Dmitry Baryshkov
  2024-04-02 10:40   ` Heikki Krogerus
  2024-03-29  6:15 ` [PATCH v2 06/11] usb: typec: ucsi: extract code to read PD caps Dmitry Baryshkov
                   ` (5 subsequent siblings)
  10 siblings, 1 reply; 19+ messages in thread
From: Dmitry Baryshkov @ 2024-03-29  6:15 UTC (permalink / raw)
  To: Heikki Krogerus, Greg Kroah-Hartman, Guenter Roeck,
	Bjorn Andersson, Neil Armstrong, Konrad Dybcio
  Cc: Johan Hovold, linux-usb, linux-arm-msm, Dmitry Baryshkov

In a way similar to the previous commit, move
typec_partner_set_usb_power_delivery() to be called after reading the PD
caps. This also removes calls to
usb_power_delivery_unregister_capabilities() from the error path. Keep
all capabilities registered until they are cleared by
ucsi_unregister_partner_pdos().

Fixes: b04e1747fbcc ("usb: typec: ucsi: Register USB Power Delivery Capabilities")
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/usb/typec/ucsi/ucsi.c | 14 +-------------
 1 file changed, 1 insertion(+), 13 deletions(-)

diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
index d1a45ce7f660..35366b1a3d78 100644
--- a/drivers/usb/typec/ucsi/ucsi.c
+++ b/drivers/usb/typec/ucsi/ucsi.c
@@ -826,12 +826,6 @@ static int ucsi_register_partner_pdos(struct ucsi_connector *con)
 			return PTR_ERR(cap);
 
 		con->partner_source_caps = cap;
-
-		ret = typec_partner_set_usb_power_delivery(con->partner, con->partner_pd);
-		if (ret) {
-			usb_power_delivery_unregister_capabilities(con->partner_source_caps);
-			return ret;
-		}
 	}
 
 	ret = ucsi_get_pdos(con, TYPEC_SINK, 1, caps.pdo);
@@ -846,15 +840,9 @@ static int ucsi_register_partner_pdos(struct ucsi_connector *con)
 			return PTR_ERR(cap);
 
 		con->partner_sink_caps = cap;
-
-		ret = typec_partner_set_usb_power_delivery(con->partner, con->partner_pd);
-		if (ret) {
-			usb_power_delivery_unregister_capabilities(con->partner_sink_caps);
-			return ret;
-		}
 	}
 
-	return 0;
+	return typec_partner_set_usb_power_delivery(con->partner, con->partner_pd);
 }
 
 static void ucsi_unregister_partner_pdos(struct ucsi_connector *con)

-- 
2.39.2


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v2 06/11] usb: typec: ucsi: extract code to read PD caps
  2024-03-29  6:15 [PATCH v2 00/11] usb: typec: ucsi: fix several issues manifesting on Qualcomm platforms Dmitry Baryshkov
                   ` (4 preceding siblings ...)
  2024-03-29  6:15 ` [PATCH v2 05/11] usb: typec: ucsi: simplify partner's PD caps registration Dmitry Baryshkov
@ 2024-03-29  6:15 ` Dmitry Baryshkov
  2024-04-02 10:41   ` Heikki Krogerus
  2024-03-29  6:15 ` [PATCH v2 07/11] usb: typec: ucsi: support delaying GET_PDOS for device Dmitry Baryshkov
                   ` (4 subsequent siblings)
  10 siblings, 1 reply; 19+ messages in thread
From: Dmitry Baryshkov @ 2024-03-29  6:15 UTC (permalink / raw)
  To: Heikki Krogerus, Greg Kroah-Hartman, Guenter Roeck,
	Bjorn Andersson, Neil Armstrong, Konrad Dybcio
  Cc: Johan Hovold, linux-usb, linux-arm-msm, Dmitry Baryshkov

Extract function to read PDOs from the port and set PD capabilities
accordingly.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/usb/typec/ucsi/ucsi.c | 85 ++++++++++++++++---------------------------
 1 file changed, 32 insertions(+), 53 deletions(-)

diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
index 35366b1a3d78..18b2e4ffc57e 100644
--- a/drivers/usb/typec/ucsi/ucsi.c
+++ b/drivers/usb/typec/ucsi/ucsi.c
@@ -677,6 +677,26 @@ static int ucsi_get_src_pdos(struct ucsi_connector *con)
 	return ret;
 }
 
+static struct usb_power_delivery_capabilities *ucsi_get_pd_caps(struct ucsi_connector *con,
+								enum typec_role role,
+								bool is_partner)
+{
+	struct usb_power_delivery_capabilities_desc pd_caps;
+	int ret;
+
+	ret = ucsi_get_pdos(con, role, is_partner, pd_caps.pdo);
+	if (ret <= 0)
+		return ERR_PTR(ret);
+
+	if (ret < PDO_MAX_OBJECTS)
+		pd_caps.pdo[ret] = 0;
+
+	pd_caps.role = role;
+
+	return usb_power_delivery_register_capabilities(is_partner ? con->partner_pd : con->pd,
+							&pd_caps);
+}
+
 static int ucsi_read_identity(struct ucsi_connector *con, u8 recipient,
 			      u8 offset, u8 bytes, void *resp)
 {
@@ -804,9 +824,7 @@ static int ucsi_check_altmodes(struct ucsi_connector *con)
 static int ucsi_register_partner_pdos(struct ucsi_connector *con)
 {
 	struct usb_power_delivery_desc desc = { con->ucsi->cap.pd_version };
-	struct usb_power_delivery_capabilities_desc caps;
 	struct usb_power_delivery_capabilities *cap;
-	int ret;
 
 	if (con->partner_pd)
 		return 0;
@@ -815,32 +833,17 @@ static int ucsi_register_partner_pdos(struct ucsi_connector *con)
 	if (IS_ERR(con->partner_pd))
 		return PTR_ERR(con->partner_pd);
 
-	ret = ucsi_get_pdos(con, TYPEC_SOURCE, 1, caps.pdo);
-	if (ret > 0) {
-		if (ret < PDO_MAX_OBJECTS)
-			caps.pdo[ret] = 0;
-
-		caps.role = TYPEC_SOURCE;
-		cap = usb_power_delivery_register_capabilities(con->partner_pd, &caps);
-		if (IS_ERR(cap))
-			return PTR_ERR(cap);
-
-		con->partner_source_caps = cap;
-	}
-
-	ret = ucsi_get_pdos(con, TYPEC_SINK, 1, caps.pdo);
-	if (ret > 0) {
-		if (ret < PDO_MAX_OBJECTS)
-			caps.pdo[ret] = 0;
+	cap = ucsi_get_pd_caps(con, TYPEC_SOURCE, true);
+	if (IS_ERR(cap))
+	    return PTR_ERR(cap);
 
-		caps.role = TYPEC_SINK;
+	con->partner_source_caps = cap;
 
-		cap = usb_power_delivery_register_capabilities(con->partner_pd, &caps);
-		if (IS_ERR(cap))
-			return PTR_ERR(cap);
+	cap = ucsi_get_pd_caps(con, TYPEC_SINK, true);
+	if (IS_ERR(cap))
+	    return PTR_ERR(cap);
 
-		con->partner_sink_caps = cap;
-	}
+	con->partner_sink_caps = cap;
 
 	return typec_partner_set_usb_power_delivery(con->partner, con->partner_pd);
 }
@@ -1463,7 +1466,6 @@ static struct fwnode_handle *ucsi_find_fwnode(struct ucsi_connector *con)
 static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)
 {
 	struct usb_power_delivery_desc desc = { ucsi->cap.pd_version};
-	struct usb_power_delivery_capabilities_desc pd_caps;
 	struct usb_power_delivery_capabilities *pd_cap;
 	struct typec_capability *cap = &con->typec_cap;
 	enum typec_accessory *accessory = cap->accessory;
@@ -1544,36 +1546,13 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)
 
 	con->pd = usb_power_delivery_register(ucsi->dev, &desc);
 
-	ret = ucsi_get_pdos(con, TYPEC_SOURCE, 0, pd_caps.pdo);
-	if (ret > 0) {
-		if (ret < PDO_MAX_OBJECTS)
-			pd_caps.pdo[ret] = 0;
-
-		pd_caps.role = TYPEC_SOURCE;
-		pd_cap = usb_power_delivery_register_capabilities(con->pd, &pd_caps);
-		if (IS_ERR(pd_cap)) {
-			ret = PTR_ERR(pd_cap);
-			goto out;
-		}
-
+	pd_cap = ucsi_get_pd_caps(con, TYPEC_SOURCE, false);
+	if (!IS_ERR(pd_cap))
 		con->port_source_caps = pd_cap;
-	}
-
-	memset(&pd_caps, 0, sizeof(pd_caps));
-	ret = ucsi_get_pdos(con, TYPEC_SINK, 0, pd_caps.pdo);
-	if (ret > 0) {
-		if (ret < PDO_MAX_OBJECTS)
-			pd_caps.pdo[ret] = 0;
-
-		pd_caps.role = TYPEC_SINK;
-		pd_cap = usb_power_delivery_register_capabilities(con->pd, &pd_caps);
-		if (IS_ERR(pd_cap)) {
-			ret = PTR_ERR(pd_cap);
-			goto out;
-		}
 
+	pd_cap = ucsi_get_pd_caps(con, TYPEC_SINK, false);
+	if (!IS_ERR(pd_cap))
 		con->port_sink_caps = pd_cap;
-	}
 
 	typec_port_set_usb_power_delivery(con->port, con->pd);
 

-- 
2.39.2


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v2 07/11] usb: typec: ucsi: support delaying GET_PDOS for device
  2024-03-29  6:15 [PATCH v2 00/11] usb: typec: ucsi: fix several issues manifesting on Qualcomm platforms Dmitry Baryshkov
                   ` (5 preceding siblings ...)
  2024-03-29  6:15 ` [PATCH v2 06/11] usb: typec: ucsi: extract code to read PD caps Dmitry Baryshkov
@ 2024-03-29  6:15 ` Dmitry Baryshkov
  2024-04-02 11:04   ` Heikki Krogerus
  2024-03-29  6:15 ` [PATCH v2 08/11] usb: typec: ucsi_glink: rework quirks implementation Dmitry Baryshkov
                   ` (3 subsequent siblings)
  10 siblings, 1 reply; 19+ messages in thread
From: Dmitry Baryshkov @ 2024-03-29  6:15 UTC (permalink / raw)
  To: Heikki Krogerus, Greg Kroah-Hartman, Guenter Roeck,
	Bjorn Andersson, Neil Armstrong, Konrad Dybcio
  Cc: Johan Hovold, linux-usb, linux-arm-msm, Dmitry Baryshkov

Qualcomm firmware doesn't return sane information for device's PDOs
unless the partner is also using a PD mode. On SC8280XP this even
results in the Error bit being set in the UCSI response (with 0 error
status).

Add a quirk to delay reading USB PD capabilities for a device until we
detect a partner in PD mode.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/usb/typec/ucsi/ucsi.c | 41 ++++++++++++++++++++++++++++-------------
 drivers/usb/typec/ucsi/ucsi.h |  1 +
 2 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
index 18b2e4ffc57e..f5ec776b84d6 100644
--- a/drivers/usb/typec/ucsi/ucsi.c
+++ b/drivers/usb/typec/ucsi/ucsi.c
@@ -821,6 +821,28 @@ static int ucsi_check_altmodes(struct ucsi_connector *con)
 	return ret;
 }
 
+static void ucsi_register_device_pdos(struct ucsi_connector *con)
+{
+	struct ucsi *ucsi = con->ucsi;
+	struct usb_power_delivery_desc desc = { ucsi->cap.pd_version };
+	struct usb_power_delivery_capabilities *pd_cap;
+
+	if (con->pd)
+		return;
+
+	con->pd = usb_power_delivery_register(ucsi->dev, &desc);
+
+	pd_cap = ucsi_get_pd_caps(con, TYPEC_SOURCE, false);
+	if (!IS_ERR(pd_cap))
+		con->port_source_caps = pd_cap;
+
+	pd_cap = ucsi_get_pd_caps(con, TYPEC_SINK, false);
+	if (!IS_ERR(pd_cap))
+		con->port_sink_caps = pd_cap;
+
+	typec_port_set_usb_power_delivery(con->port, con->pd);
+}
+
 static int ucsi_register_partner_pdos(struct ucsi_connector *con)
 {
 	struct usb_power_delivery_desc desc = { con->ucsi->cap.pd_version };
@@ -981,6 +1003,9 @@ static int ucsi_register_partner(struct ucsi_connector *con)
 		break;
 	}
 
+	if (pwr_opmode == UCSI_CONSTAT_PWR_OPMODE_PD)
+		ucsi_register_device_pdos(con);
+
 	desc.identity = &con->partner_identity;
 	desc.usb_pd = pwr_opmode == UCSI_CONSTAT_PWR_OPMODE_PD;
 	desc.pd_revision = UCSI_CONCAP_FLAG_PARTNER_PD_MAJOR_REV_AS_BCD(con->cap.flags);
@@ -1465,8 +1490,6 @@ static struct fwnode_handle *ucsi_find_fwnode(struct ucsi_connector *con)
 
 static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)
 {
-	struct usb_power_delivery_desc desc = { ucsi->cap.pd_version};
-	struct usb_power_delivery_capabilities *pd_cap;
 	struct typec_capability *cap = &con->typec_cap;
 	enum typec_accessory *accessory = cap->accessory;
 	enum usb_role u_role = USB_ROLE_NONE;
@@ -1544,17 +1567,8 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)
 		goto out;
 	}
 
-	con->pd = usb_power_delivery_register(ucsi->dev, &desc);
-
-	pd_cap = ucsi_get_pd_caps(con, TYPEC_SOURCE, false);
-	if (!IS_ERR(pd_cap))
-		con->port_source_caps = pd_cap;
-
-	pd_cap = ucsi_get_pd_caps(con, TYPEC_SINK, false);
-	if (!IS_ERR(pd_cap))
-		con->port_sink_caps = pd_cap;
-
-	typec_port_set_usb_power_delivery(con->port, con->pd);
+	if (!(ucsi->quirks & UCSI_DELAY_DEVICE_PDOS))
+		ucsi_register_device_pdos(con);
 
 	/* Alternate modes */
 	ret = ucsi_register_altmodes(con, UCSI_RECIPIENT_CON);
@@ -1617,6 +1631,7 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)
 	if (con->partner &&
 	    UCSI_CONSTAT_PWR_OPMODE(con->status.flags) ==
 	    UCSI_CONSTAT_PWR_OPMODE_PD) {
+		ucsi_register_device_pdos(con);
 		ucsi_get_src_pdos(con);
 		ucsi_check_altmodes(con);
 	}
diff --git a/drivers/usb/typec/ucsi/ucsi.h b/drivers/usb/typec/ucsi/ucsi.h
index 591f734d457b..2caf2969668c 100644
--- a/drivers/usb/typec/ucsi/ucsi.h
+++ b/drivers/usb/typec/ucsi/ucsi.h
@@ -406,6 +406,7 @@ struct ucsi {
 
 	unsigned long quirks;
 #define UCSI_NO_PARTNER_PDOS	BIT(0)	/* Don't read partner's PDOs */
+#define UCSI_DELAY_DEVICE_PDOS	BIT(1)	/* Reading PDOs fails until the parter is in PD mode */
 };
 
 #define UCSI_MAX_SVID		5

-- 
2.39.2


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v2 08/11] usb: typec: ucsi_glink: rework quirks implementation
  2024-03-29  6:15 [PATCH v2 00/11] usb: typec: ucsi: fix several issues manifesting on Qualcomm platforms Dmitry Baryshkov
                   ` (6 preceding siblings ...)
  2024-03-29  6:15 ` [PATCH v2 07/11] usb: typec: ucsi: support delaying GET_PDOS for device Dmitry Baryshkov
@ 2024-03-29  6:15 ` Dmitry Baryshkov
  2024-04-02 11:06   ` Heikki Krogerus
  2024-03-29  6:15 ` [PATCH v2 09/11] usb: typec: ucsi_glink: enable the UCSI_DELAY_DEVICE_PDOS quirk Dmitry Baryshkov
                   ` (2 subsequent siblings)
  10 siblings, 1 reply; 19+ messages in thread
From: Dmitry Baryshkov @ 2024-03-29  6:15 UTC (permalink / raw)
  To: Heikki Krogerus, Greg Kroah-Hartman, Guenter Roeck,
	Bjorn Andersson, Neil Armstrong, Konrad Dybcio
  Cc: Johan Hovold, linux-usb, linux-arm-msm, Dmitry Baryshkov

In preparation to adding more quirks, extract quirks to the static
variables and reference them through match->data. Otherwise adding
more quirks will add the table really cumbersome.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/usb/typec/ucsi/ucsi_glink.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/usb/typec/ucsi/ucsi_glink.c b/drivers/usb/typec/ucsi/ucsi_glink.c
index 932e7bf69447..d7a18950faab 100644
--- a/drivers/usb/typec/ucsi/ucsi_glink.c
+++ b/drivers/usb/typec/ucsi/ucsi_glink.c
@@ -297,12 +297,14 @@ static void pmic_glink_ucsi_destroy(void *data)
 	mutex_unlock(&ucsi->lock);
 }
 
+static unsigned long quirk_sc8180x = UCSI_NO_PARTNER_PDOS;
+
 static const struct of_device_id pmic_glink_ucsi_of_quirks[] = {
-	{ .compatible = "qcom,qcm6490-pmic-glink", .data = (void *)UCSI_NO_PARTNER_PDOS, },
-	{ .compatible = "qcom,sc8180x-pmic-glink", .data = (void *)UCSI_NO_PARTNER_PDOS, },
-	{ .compatible = "qcom,sc8280xp-pmic-glink", .data = (void *)UCSI_NO_PARTNER_PDOS, },
-	{ .compatible = "qcom,sm8350-pmic-glink", .data = (void *)UCSI_NO_PARTNER_PDOS, },
-	{ .compatible = "qcom,sm8550-pmic-glink", .data = (void *)UCSI_NO_PARTNER_PDOS, },
+	{ .compatible = "qcom,qcm6490-pmic-glink", .data = &quirk_sc8180x, },
+	{ .compatible = "qcom,sc8180x-pmic-glink", .data = &quirk_sc8180x, },
+	{ .compatible = "qcom,sc8280xp-pmic-glink", .data = &quirk_sc8180x, },
+	{ .compatible = "qcom,sm8350-pmic-glink", .data = &quirk_sc8180x, },
+	{ .compatible = "qcom,sm8550-pmic-glink", .data = &quirk_sc8180x, },
 	{}
 };
 
@@ -340,7 +342,7 @@ static int pmic_glink_ucsi_probe(struct auxiliary_device *adev,
 
 	match = of_match_device(pmic_glink_ucsi_of_quirks, dev->parent);
 	if (match)
-		ucsi->ucsi->quirks = (unsigned long)match->data;
+		ucsi->ucsi->quirks = *(unsigned long *)match->data;
 
 	ucsi_set_drvdata(ucsi->ucsi, ucsi);
 

-- 
2.39.2


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v2 09/11] usb: typec: ucsi_glink: enable the UCSI_DELAY_DEVICE_PDOS quirk
  2024-03-29  6:15 [PATCH v2 00/11] usb: typec: ucsi: fix several issues manifesting on Qualcomm platforms Dmitry Baryshkov
                   ` (7 preceding siblings ...)
  2024-03-29  6:15 ` [PATCH v2 08/11] usb: typec: ucsi_glink: rework quirks implementation Dmitry Baryshkov
@ 2024-03-29  6:15 ` Dmitry Baryshkov
  2024-04-02 11:07   ` Heikki Krogerus
  2024-03-29  6:15 ` [PATCH v2 10/11] soc: qcom: pmic_glink: reenable UCSI on sc8280xp Dmitry Baryshkov
  2024-03-29  6:15 ` [PATCH v2 11/11] soc: qcom: pmic_glink: enable UCSI on sc8180x Dmitry Baryshkov
  10 siblings, 1 reply; 19+ messages in thread
From: Dmitry Baryshkov @ 2024-03-29  6:15 UTC (permalink / raw)
  To: Heikki Krogerus, Greg Kroah-Hartman, Guenter Roeck,
	Bjorn Andersson, Neil Armstrong, Konrad Dybcio
  Cc: Johan Hovold, linux-usb, linux-arm-msm, Dmitry Baryshkov

Enable the UCSI_DELAY_DEVICE_PDOS quirk on anything past sc8180x /
sm8350.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/usb/typec/ucsi/ucsi_glink.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/typec/ucsi/ucsi_glink.c b/drivers/usb/typec/ucsi/ucsi_glink.c
index d7a18950faab..bd5ad1898a4a 100644
--- a/drivers/usb/typec/ucsi/ucsi_glink.c
+++ b/drivers/usb/typec/ucsi/ucsi_glink.c
@@ -298,13 +298,16 @@ static void pmic_glink_ucsi_destroy(void *data)
 }
 
 static unsigned long quirk_sc8180x = UCSI_NO_PARTNER_PDOS;
+static unsigned long quirk_sc8280xp = UCSI_NO_PARTNER_PDOS | UCSI_DELAY_DEVICE_PDOS;
+static unsigned long quirk_sm8450 = UCSI_DELAY_DEVICE_PDOS;
 
 static const struct of_device_id pmic_glink_ucsi_of_quirks[] = {
 	{ .compatible = "qcom,qcm6490-pmic-glink", .data = &quirk_sc8180x, },
 	{ .compatible = "qcom,sc8180x-pmic-glink", .data = &quirk_sc8180x, },
-	{ .compatible = "qcom,sc8280xp-pmic-glink", .data = &quirk_sc8180x, },
+	{ .compatible = "qcom,sc8280xp-pmic-glink", .data = &quirk_sc8280xp, },
 	{ .compatible = "qcom,sm8350-pmic-glink", .data = &quirk_sc8180x, },
-	{ .compatible = "qcom,sm8550-pmic-glink", .data = &quirk_sc8180x, },
+	{ .compatible = "qcom,sm8450-pmic-glink", .data = &quirk_sm8450, },
+	{ .compatible = "qcom,sm8550-pmic-glink", .data = &quirk_sc8280xp, },
 	{}
 };
 

-- 
2.39.2


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v2 10/11] soc: qcom: pmic_glink: reenable UCSI on sc8280xp
  2024-03-29  6:15 [PATCH v2 00/11] usb: typec: ucsi: fix several issues manifesting on Qualcomm platforms Dmitry Baryshkov
                   ` (8 preceding siblings ...)
  2024-03-29  6:15 ` [PATCH v2 09/11] usb: typec: ucsi_glink: enable the UCSI_DELAY_DEVICE_PDOS quirk Dmitry Baryshkov
@ 2024-03-29  6:15 ` Dmitry Baryshkov
  2024-03-29  6:15 ` [PATCH v2 11/11] soc: qcom: pmic_glink: enable UCSI on sc8180x Dmitry Baryshkov
  10 siblings, 0 replies; 19+ messages in thread
From: Dmitry Baryshkov @ 2024-03-29  6:15 UTC (permalink / raw)
  To: Heikki Krogerus, Greg Kroah-Hartman, Guenter Roeck,
	Bjorn Andersson, Neil Armstrong, Konrad Dybcio
  Cc: Johan Hovold, linux-usb, linux-arm-msm, Dmitry Baryshkov

Now as all UCSI issues have been fixed, reenable UCSI subdevice on the
Qualcomm SC8280XP platform.

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/soc/qcom/pmic_glink.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/soc/qcom/pmic_glink.c b/drivers/soc/qcom/pmic_glink.c
index f913e9bd57ed..e5a591733a0f 100644
--- a/drivers/soc/qcom/pmic_glink.c
+++ b/drivers/soc/qcom/pmic_glink.c
@@ -343,7 +343,6 @@ static const unsigned long pmic_glink_sm8450_client_mask = BIT(PMIC_GLINK_CLIENT
 
 static const struct of_device_id pmic_glink_of_match[] = {
 	{ .compatible = "qcom,sc8180x-pmic-glink", .data = &pmic_glink_sc8180x_client_mask },
-	{ .compatible = "qcom,sc8280xp-pmic-glink", .data = &pmic_glink_sc8180x_client_mask },
 	{ .compatible = "qcom,pmic-glink", .data = &pmic_glink_sm8450_client_mask },
 	{}
 };

-- 
2.39.2


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v2 11/11] soc: qcom: pmic_glink: enable UCSI on sc8180x
  2024-03-29  6:15 [PATCH v2 00/11] usb: typec: ucsi: fix several issues manifesting on Qualcomm platforms Dmitry Baryshkov
                   ` (9 preceding siblings ...)
  2024-03-29  6:15 ` [PATCH v2 10/11] soc: qcom: pmic_glink: reenable UCSI on sc8280xp Dmitry Baryshkov
@ 2024-03-29  6:15 ` Dmitry Baryshkov
  2024-04-02 11:07   ` Heikki Krogerus
  10 siblings, 1 reply; 19+ messages in thread
From: Dmitry Baryshkov @ 2024-03-29  6:15 UTC (permalink / raw)
  To: Heikki Krogerus, Greg Kroah-Hartman, Guenter Roeck,
	Bjorn Andersson, Neil Armstrong, Konrad Dybcio
  Cc: Johan Hovold, linux-usb, linux-arm-msm, Dmitry Baryshkov

Now as all UCSI issues have been fixed, enable UCSI subdevice on the
Qualcomm SC8180X platform.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/soc/qcom/pmic_glink.c | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/drivers/soc/qcom/pmic_glink.c b/drivers/soc/qcom/pmic_glink.c
index e5a591733a0f..c2f71d393bbb 100644
--- a/drivers/soc/qcom/pmic_glink.c
+++ b/drivers/soc/qcom/pmic_glink.c
@@ -334,15 +334,11 @@ static void pmic_glink_remove(struct platform_device *pdev)
 	mutex_unlock(&__pmic_glink_lock);
 }
 
-static const unsigned long pmic_glink_sc8180x_client_mask = BIT(PMIC_GLINK_CLIENT_BATT) |
-							    BIT(PMIC_GLINK_CLIENT_ALTMODE);
-
 static const unsigned long pmic_glink_sm8450_client_mask = BIT(PMIC_GLINK_CLIENT_BATT) |
 							   BIT(PMIC_GLINK_CLIENT_ALTMODE) |
 							   BIT(PMIC_GLINK_CLIENT_UCSI);
 
 static const struct of_device_id pmic_glink_of_match[] = {
-	{ .compatible = "qcom,sc8180x-pmic-glink", .data = &pmic_glink_sc8180x_client_mask },
 	{ .compatible = "qcom,pmic-glink", .data = &pmic_glink_sm8450_client_mask },
 	{}
 };

-- 
2.39.2


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH v2 04/11] usb: typec: ucsi: always register a link to USB PD device
  2024-03-29  6:15 ` [PATCH v2 04/11] usb: typec: ucsi: always register a link to USB " Dmitry Baryshkov
@ 2024-04-02 10:38   ` Heikki Krogerus
  0 siblings, 0 replies; 19+ messages in thread
From: Heikki Krogerus @ 2024-04-02 10:38 UTC (permalink / raw)
  To: Dmitry Baryshkov
  Cc: Greg Kroah-Hartman, Guenter Roeck, Bjorn Andersson,
	Neil Armstrong, Konrad Dybcio, Johan Hovold, linux-usb,
	linux-arm-msm

On Fri, Mar 29, 2024 at 08:15:36AM +0200, Dmitry Baryshkov wrote:
> UCSI driver will attempt to set a USB PD device only if it was able to
> read PDOs from the firmware. This results in suboptimal behaviour, since
> the PD device will be created anyway. Move calls to
> typec_port_set_usb_power_delivery() out of conditional code and call it
> after reading capabilities.
> 
> Fixes: b04e1747fbcc ("usb: typec: ucsi: Register USB Power Delivery Capabilities")
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>

> ---
>  drivers/usb/typec/ucsi/ucsi.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
> index 7666142d8bbb..d1a45ce7f660 100644
> --- a/drivers/usb/typec/ucsi/ucsi.c
> +++ b/drivers/usb/typec/ucsi/ucsi.c
> @@ -1569,7 +1569,6 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)
>  		}
>  
>  		con->port_source_caps = pd_cap;
> -		typec_port_set_usb_power_delivery(con->port, con->pd);
>  	}
>  
>  	memset(&pd_caps, 0, sizeof(pd_caps));
> @@ -1586,9 +1585,10 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)
>  		}
>  
>  		con->port_sink_caps = pd_cap;
> -		typec_port_set_usb_power_delivery(con->port, con->pd);
>  	}
>  
> +	typec_port_set_usb_power_delivery(con->port, con->pd);
> +
>  	/* Alternate modes */
>  	ret = ucsi_register_altmodes(con, UCSI_RECIPIENT_CON);
>  	if (ret) {
> 
> -- 
> 2.39.2

-- 
heikki

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2 05/11] usb: typec: ucsi: simplify partner's PD caps registration
  2024-03-29  6:15 ` [PATCH v2 05/11] usb: typec: ucsi: simplify partner's PD caps registration Dmitry Baryshkov
@ 2024-04-02 10:40   ` Heikki Krogerus
  0 siblings, 0 replies; 19+ messages in thread
From: Heikki Krogerus @ 2024-04-02 10:40 UTC (permalink / raw)
  To: Dmitry Baryshkov
  Cc: Greg Kroah-Hartman, Guenter Roeck, Bjorn Andersson,
	Neil Armstrong, Konrad Dybcio, Johan Hovold, linux-usb,
	linux-arm-msm

On Fri, Mar 29, 2024 at 08:15:37AM +0200, Dmitry Baryshkov wrote:
> In a way similar to the previous commit, move
> typec_partner_set_usb_power_delivery() to be called after reading the PD
> caps. This also removes calls to
> usb_power_delivery_unregister_capabilities() from the error path. Keep
> all capabilities registered until they are cleared by
> ucsi_unregister_partner_pdos().
> 
> Fixes: b04e1747fbcc ("usb: typec: ucsi: Register USB Power Delivery Capabilities")
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>

> ---
>  drivers/usb/typec/ucsi/ucsi.c | 14 +-------------
>  1 file changed, 1 insertion(+), 13 deletions(-)
> 
> diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
> index d1a45ce7f660..35366b1a3d78 100644
> --- a/drivers/usb/typec/ucsi/ucsi.c
> +++ b/drivers/usb/typec/ucsi/ucsi.c
> @@ -826,12 +826,6 @@ static int ucsi_register_partner_pdos(struct ucsi_connector *con)
>  			return PTR_ERR(cap);
>  
>  		con->partner_source_caps = cap;
> -
> -		ret = typec_partner_set_usb_power_delivery(con->partner, con->partner_pd);
> -		if (ret) {
> -			usb_power_delivery_unregister_capabilities(con->partner_source_caps);
> -			return ret;
> -		}
>  	}
>  
>  	ret = ucsi_get_pdos(con, TYPEC_SINK, 1, caps.pdo);
> @@ -846,15 +840,9 @@ static int ucsi_register_partner_pdos(struct ucsi_connector *con)
>  			return PTR_ERR(cap);
>  
>  		con->partner_sink_caps = cap;
> -
> -		ret = typec_partner_set_usb_power_delivery(con->partner, con->partner_pd);
> -		if (ret) {
> -			usb_power_delivery_unregister_capabilities(con->partner_sink_caps);
> -			return ret;
> -		}
>  	}
>  
> -	return 0;
> +	return typec_partner_set_usb_power_delivery(con->partner, con->partner_pd);
>  }
>  
>  static void ucsi_unregister_partner_pdos(struct ucsi_connector *con)
> 
> -- 
> 2.39.2

-- 
heikki

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2 06/11] usb: typec: ucsi: extract code to read PD caps
  2024-03-29  6:15 ` [PATCH v2 06/11] usb: typec: ucsi: extract code to read PD caps Dmitry Baryshkov
@ 2024-04-02 10:41   ` Heikki Krogerus
  0 siblings, 0 replies; 19+ messages in thread
From: Heikki Krogerus @ 2024-04-02 10:41 UTC (permalink / raw)
  To: Dmitry Baryshkov
  Cc: Greg Kroah-Hartman, Guenter Roeck, Bjorn Andersson,
	Neil Armstrong, Konrad Dybcio, Johan Hovold, linux-usb,
	linux-arm-msm

On Fri, Mar 29, 2024 at 08:15:38AM +0200, Dmitry Baryshkov wrote:
> Extract function to read PDOs from the port and set PD capabilities
> accordingly.
> 
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>

> ---
>  drivers/usb/typec/ucsi/ucsi.c | 85 ++++++++++++++++---------------------------
>  1 file changed, 32 insertions(+), 53 deletions(-)
> 
> diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
> index 35366b1a3d78..18b2e4ffc57e 100644
> --- a/drivers/usb/typec/ucsi/ucsi.c
> +++ b/drivers/usb/typec/ucsi/ucsi.c
> @@ -677,6 +677,26 @@ static int ucsi_get_src_pdos(struct ucsi_connector *con)
>  	return ret;
>  }
>  
> +static struct usb_power_delivery_capabilities *ucsi_get_pd_caps(struct ucsi_connector *con,
> +								enum typec_role role,
> +								bool is_partner)
> +{
> +	struct usb_power_delivery_capabilities_desc pd_caps;
> +	int ret;
> +
> +	ret = ucsi_get_pdos(con, role, is_partner, pd_caps.pdo);
> +	if (ret <= 0)
> +		return ERR_PTR(ret);
> +
> +	if (ret < PDO_MAX_OBJECTS)
> +		pd_caps.pdo[ret] = 0;
> +
> +	pd_caps.role = role;
> +
> +	return usb_power_delivery_register_capabilities(is_partner ? con->partner_pd : con->pd,
> +							&pd_caps);
> +}
> +
>  static int ucsi_read_identity(struct ucsi_connector *con, u8 recipient,
>  			      u8 offset, u8 bytes, void *resp)
>  {
> @@ -804,9 +824,7 @@ static int ucsi_check_altmodes(struct ucsi_connector *con)
>  static int ucsi_register_partner_pdos(struct ucsi_connector *con)
>  {
>  	struct usb_power_delivery_desc desc = { con->ucsi->cap.pd_version };
> -	struct usb_power_delivery_capabilities_desc caps;
>  	struct usb_power_delivery_capabilities *cap;
> -	int ret;
>  
>  	if (con->partner_pd)
>  		return 0;
> @@ -815,32 +833,17 @@ static int ucsi_register_partner_pdos(struct ucsi_connector *con)
>  	if (IS_ERR(con->partner_pd))
>  		return PTR_ERR(con->partner_pd);
>  
> -	ret = ucsi_get_pdos(con, TYPEC_SOURCE, 1, caps.pdo);
> -	if (ret > 0) {
> -		if (ret < PDO_MAX_OBJECTS)
> -			caps.pdo[ret] = 0;
> -
> -		caps.role = TYPEC_SOURCE;
> -		cap = usb_power_delivery_register_capabilities(con->partner_pd, &caps);
> -		if (IS_ERR(cap))
> -			return PTR_ERR(cap);
> -
> -		con->partner_source_caps = cap;
> -	}
> -
> -	ret = ucsi_get_pdos(con, TYPEC_SINK, 1, caps.pdo);
> -	if (ret > 0) {
> -		if (ret < PDO_MAX_OBJECTS)
> -			caps.pdo[ret] = 0;
> +	cap = ucsi_get_pd_caps(con, TYPEC_SOURCE, true);
> +	if (IS_ERR(cap))
> +	    return PTR_ERR(cap);
>  
> -		caps.role = TYPEC_SINK;
> +	con->partner_source_caps = cap;
>  
> -		cap = usb_power_delivery_register_capabilities(con->partner_pd, &caps);
> -		if (IS_ERR(cap))
> -			return PTR_ERR(cap);
> +	cap = ucsi_get_pd_caps(con, TYPEC_SINK, true);
> +	if (IS_ERR(cap))
> +	    return PTR_ERR(cap);
>  
> -		con->partner_sink_caps = cap;
> -	}
> +	con->partner_sink_caps = cap;
>  
>  	return typec_partner_set_usb_power_delivery(con->partner, con->partner_pd);
>  }
> @@ -1463,7 +1466,6 @@ static struct fwnode_handle *ucsi_find_fwnode(struct ucsi_connector *con)
>  static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)
>  {
>  	struct usb_power_delivery_desc desc = { ucsi->cap.pd_version};
> -	struct usb_power_delivery_capabilities_desc pd_caps;
>  	struct usb_power_delivery_capabilities *pd_cap;
>  	struct typec_capability *cap = &con->typec_cap;
>  	enum typec_accessory *accessory = cap->accessory;
> @@ -1544,36 +1546,13 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)
>  
>  	con->pd = usb_power_delivery_register(ucsi->dev, &desc);
>  
> -	ret = ucsi_get_pdos(con, TYPEC_SOURCE, 0, pd_caps.pdo);
> -	if (ret > 0) {
> -		if (ret < PDO_MAX_OBJECTS)
> -			pd_caps.pdo[ret] = 0;
> -
> -		pd_caps.role = TYPEC_SOURCE;
> -		pd_cap = usb_power_delivery_register_capabilities(con->pd, &pd_caps);
> -		if (IS_ERR(pd_cap)) {
> -			ret = PTR_ERR(pd_cap);
> -			goto out;
> -		}
> -
> +	pd_cap = ucsi_get_pd_caps(con, TYPEC_SOURCE, false);
> +	if (!IS_ERR(pd_cap))
>  		con->port_source_caps = pd_cap;
> -	}
> -
> -	memset(&pd_caps, 0, sizeof(pd_caps));
> -	ret = ucsi_get_pdos(con, TYPEC_SINK, 0, pd_caps.pdo);
> -	if (ret > 0) {
> -		if (ret < PDO_MAX_OBJECTS)
> -			pd_caps.pdo[ret] = 0;
> -
> -		pd_caps.role = TYPEC_SINK;
> -		pd_cap = usb_power_delivery_register_capabilities(con->pd, &pd_caps);
> -		if (IS_ERR(pd_cap)) {
> -			ret = PTR_ERR(pd_cap);
> -			goto out;
> -		}
>  
> +	pd_cap = ucsi_get_pd_caps(con, TYPEC_SINK, false);
> +	if (!IS_ERR(pd_cap))
>  		con->port_sink_caps = pd_cap;
> -	}
>  
>  	typec_port_set_usb_power_delivery(con->port, con->pd);
>  
> 
> -- 
> 2.39.2

-- 
heikki

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2 07/11] usb: typec: ucsi: support delaying GET_PDOS for device
  2024-03-29  6:15 ` [PATCH v2 07/11] usb: typec: ucsi: support delaying GET_PDOS for device Dmitry Baryshkov
@ 2024-04-02 11:04   ` Heikki Krogerus
  0 siblings, 0 replies; 19+ messages in thread
From: Heikki Krogerus @ 2024-04-02 11:04 UTC (permalink / raw)
  To: Dmitry Baryshkov
  Cc: Greg Kroah-Hartman, Guenter Roeck, Bjorn Andersson,
	Neil Armstrong, Konrad Dybcio, Johan Hovold, linux-usb,
	linux-arm-msm

On Fri, Mar 29, 2024 at 08:15:39AM +0200, Dmitry Baryshkov wrote:
> Qualcomm firmware doesn't return sane information for device's PDOs
> unless the partner is also using a PD mode. On SC8280XP this even
> results in the Error bit being set in the UCSI response (with 0 error
> status).
> 
> Add a quirk to delay reading USB PD capabilities for a device until we
> detect a partner in PD mode.
> 
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>

> ---
>  drivers/usb/typec/ucsi/ucsi.c | 41 ++++++++++++++++++++++++++++-------------
>  drivers/usb/typec/ucsi/ucsi.h |  1 +
>  2 files changed, 29 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
> index 18b2e4ffc57e..f5ec776b84d6 100644
> --- a/drivers/usb/typec/ucsi/ucsi.c
> +++ b/drivers/usb/typec/ucsi/ucsi.c
> @@ -821,6 +821,28 @@ static int ucsi_check_altmodes(struct ucsi_connector *con)
>  	return ret;
>  }
>  
> +static void ucsi_register_device_pdos(struct ucsi_connector *con)
> +{
> +	struct ucsi *ucsi = con->ucsi;
> +	struct usb_power_delivery_desc desc = { ucsi->cap.pd_version };
> +	struct usb_power_delivery_capabilities *pd_cap;
> +
> +	if (con->pd)
> +		return;
> +
> +	con->pd = usb_power_delivery_register(ucsi->dev, &desc);
> +
> +	pd_cap = ucsi_get_pd_caps(con, TYPEC_SOURCE, false);
> +	if (!IS_ERR(pd_cap))
> +		con->port_source_caps = pd_cap;
> +
> +	pd_cap = ucsi_get_pd_caps(con, TYPEC_SINK, false);
> +	if (!IS_ERR(pd_cap))
> +		con->port_sink_caps = pd_cap;
> +
> +	typec_port_set_usb_power_delivery(con->port, con->pd);
> +}
> +
>  static int ucsi_register_partner_pdos(struct ucsi_connector *con)
>  {
>  	struct usb_power_delivery_desc desc = { con->ucsi->cap.pd_version };
> @@ -981,6 +1003,9 @@ static int ucsi_register_partner(struct ucsi_connector *con)
>  		break;
>  	}
>  
> +	if (pwr_opmode == UCSI_CONSTAT_PWR_OPMODE_PD)
> +		ucsi_register_device_pdos(con);
> +
>  	desc.identity = &con->partner_identity;
>  	desc.usb_pd = pwr_opmode == UCSI_CONSTAT_PWR_OPMODE_PD;
>  	desc.pd_revision = UCSI_CONCAP_FLAG_PARTNER_PD_MAJOR_REV_AS_BCD(con->cap.flags);
> @@ -1465,8 +1490,6 @@ static struct fwnode_handle *ucsi_find_fwnode(struct ucsi_connector *con)
>  
>  static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)
>  {
> -	struct usb_power_delivery_desc desc = { ucsi->cap.pd_version};
> -	struct usb_power_delivery_capabilities *pd_cap;
>  	struct typec_capability *cap = &con->typec_cap;
>  	enum typec_accessory *accessory = cap->accessory;
>  	enum usb_role u_role = USB_ROLE_NONE;
> @@ -1544,17 +1567,8 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)
>  		goto out;
>  	}
>  
> -	con->pd = usb_power_delivery_register(ucsi->dev, &desc);
> -
> -	pd_cap = ucsi_get_pd_caps(con, TYPEC_SOURCE, false);
> -	if (!IS_ERR(pd_cap))
> -		con->port_source_caps = pd_cap;
> -
> -	pd_cap = ucsi_get_pd_caps(con, TYPEC_SINK, false);
> -	if (!IS_ERR(pd_cap))
> -		con->port_sink_caps = pd_cap;
> -
> -	typec_port_set_usb_power_delivery(con->port, con->pd);
> +	if (!(ucsi->quirks & UCSI_DELAY_DEVICE_PDOS))
> +		ucsi_register_device_pdos(con);
>  
>  	/* Alternate modes */
>  	ret = ucsi_register_altmodes(con, UCSI_RECIPIENT_CON);
> @@ -1617,6 +1631,7 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)
>  	if (con->partner &&
>  	    UCSI_CONSTAT_PWR_OPMODE(con->status.flags) ==
>  	    UCSI_CONSTAT_PWR_OPMODE_PD) {
> +		ucsi_register_device_pdos(con);
>  		ucsi_get_src_pdos(con);
>  		ucsi_check_altmodes(con);
>  	}
> diff --git a/drivers/usb/typec/ucsi/ucsi.h b/drivers/usb/typec/ucsi/ucsi.h
> index 591f734d457b..2caf2969668c 100644
> --- a/drivers/usb/typec/ucsi/ucsi.h
> +++ b/drivers/usb/typec/ucsi/ucsi.h
> @@ -406,6 +406,7 @@ struct ucsi {
>  
>  	unsigned long quirks;
>  #define UCSI_NO_PARTNER_PDOS	BIT(0)	/* Don't read partner's PDOs */
> +#define UCSI_DELAY_DEVICE_PDOS	BIT(1)	/* Reading PDOs fails until the parter is in PD mode */
>  };
>  
>  #define UCSI_MAX_SVID		5
> 
> -- 
> 2.39.2

-- 
heikki

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2 08/11] usb: typec: ucsi_glink: rework quirks implementation
  2024-03-29  6:15 ` [PATCH v2 08/11] usb: typec: ucsi_glink: rework quirks implementation Dmitry Baryshkov
@ 2024-04-02 11:06   ` Heikki Krogerus
  0 siblings, 0 replies; 19+ messages in thread
From: Heikki Krogerus @ 2024-04-02 11:06 UTC (permalink / raw)
  To: Dmitry Baryshkov
  Cc: Greg Kroah-Hartman, Guenter Roeck, Bjorn Andersson,
	Neil Armstrong, Konrad Dybcio, Johan Hovold, linux-usb,
	linux-arm-msm

On Fri, Mar 29, 2024 at 08:15:40AM +0200, Dmitry Baryshkov wrote:
> In preparation to adding more quirks, extract quirks to the static
> variables and reference them through match->data. Otherwise adding
> more quirks will add the table really cumbersome.
> 
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>

> ---
>  drivers/usb/typec/ucsi/ucsi_glink.c | 14 ++++++++------
>  1 file changed, 8 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/usb/typec/ucsi/ucsi_glink.c b/drivers/usb/typec/ucsi/ucsi_glink.c
> index 932e7bf69447..d7a18950faab 100644
> --- a/drivers/usb/typec/ucsi/ucsi_glink.c
> +++ b/drivers/usb/typec/ucsi/ucsi_glink.c
> @@ -297,12 +297,14 @@ static void pmic_glink_ucsi_destroy(void *data)
>  	mutex_unlock(&ucsi->lock);
>  }
>  
> +static unsigned long quirk_sc8180x = UCSI_NO_PARTNER_PDOS;
> +
>  static const struct of_device_id pmic_glink_ucsi_of_quirks[] = {
> -	{ .compatible = "qcom,qcm6490-pmic-glink", .data = (void *)UCSI_NO_PARTNER_PDOS, },
> -	{ .compatible = "qcom,sc8180x-pmic-glink", .data = (void *)UCSI_NO_PARTNER_PDOS, },
> -	{ .compatible = "qcom,sc8280xp-pmic-glink", .data = (void *)UCSI_NO_PARTNER_PDOS, },
> -	{ .compatible = "qcom,sm8350-pmic-glink", .data = (void *)UCSI_NO_PARTNER_PDOS, },
> -	{ .compatible = "qcom,sm8550-pmic-glink", .data = (void *)UCSI_NO_PARTNER_PDOS, },
> +	{ .compatible = "qcom,qcm6490-pmic-glink", .data = &quirk_sc8180x, },
> +	{ .compatible = "qcom,sc8180x-pmic-glink", .data = &quirk_sc8180x, },
> +	{ .compatible = "qcom,sc8280xp-pmic-glink", .data = &quirk_sc8180x, },
> +	{ .compatible = "qcom,sm8350-pmic-glink", .data = &quirk_sc8180x, },
> +	{ .compatible = "qcom,sm8550-pmic-glink", .data = &quirk_sc8180x, },
>  	{}
>  };
>  
> @@ -340,7 +342,7 @@ static int pmic_glink_ucsi_probe(struct auxiliary_device *adev,
>  
>  	match = of_match_device(pmic_glink_ucsi_of_quirks, dev->parent);
>  	if (match)
> -		ucsi->ucsi->quirks = (unsigned long)match->data;
> +		ucsi->ucsi->quirks = *(unsigned long *)match->data;
>  
>  	ucsi_set_drvdata(ucsi->ucsi, ucsi);
>  
> 
> -- 
> 2.39.2

-- 
heikki

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2 09/11] usb: typec: ucsi_glink: enable the UCSI_DELAY_DEVICE_PDOS quirk
  2024-03-29  6:15 ` [PATCH v2 09/11] usb: typec: ucsi_glink: enable the UCSI_DELAY_DEVICE_PDOS quirk Dmitry Baryshkov
@ 2024-04-02 11:07   ` Heikki Krogerus
  0 siblings, 0 replies; 19+ messages in thread
From: Heikki Krogerus @ 2024-04-02 11:07 UTC (permalink / raw)
  To: Dmitry Baryshkov
  Cc: Greg Kroah-Hartman, Guenter Roeck, Bjorn Andersson,
	Neil Armstrong, Konrad Dybcio, Johan Hovold, linux-usb,
	linux-arm-msm

On Fri, Mar 29, 2024 at 08:15:41AM +0200, Dmitry Baryshkov wrote:
> Enable the UCSI_DELAY_DEVICE_PDOS quirk on anything past sc8180x /
> sm8350.
> 
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>

> ---
>  drivers/usb/typec/ucsi/ucsi_glink.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/usb/typec/ucsi/ucsi_glink.c b/drivers/usb/typec/ucsi/ucsi_glink.c
> index d7a18950faab..bd5ad1898a4a 100644
> --- a/drivers/usb/typec/ucsi/ucsi_glink.c
> +++ b/drivers/usb/typec/ucsi/ucsi_glink.c
> @@ -298,13 +298,16 @@ static void pmic_glink_ucsi_destroy(void *data)
>  }
>  
>  static unsigned long quirk_sc8180x = UCSI_NO_PARTNER_PDOS;
> +static unsigned long quirk_sc8280xp = UCSI_NO_PARTNER_PDOS | UCSI_DELAY_DEVICE_PDOS;
> +static unsigned long quirk_sm8450 = UCSI_DELAY_DEVICE_PDOS;
>  
>  static const struct of_device_id pmic_glink_ucsi_of_quirks[] = {
>  	{ .compatible = "qcom,qcm6490-pmic-glink", .data = &quirk_sc8180x, },
>  	{ .compatible = "qcom,sc8180x-pmic-glink", .data = &quirk_sc8180x, },
> -	{ .compatible = "qcom,sc8280xp-pmic-glink", .data = &quirk_sc8180x, },
> +	{ .compatible = "qcom,sc8280xp-pmic-glink", .data = &quirk_sc8280xp, },
>  	{ .compatible = "qcom,sm8350-pmic-glink", .data = &quirk_sc8180x, },
> -	{ .compatible = "qcom,sm8550-pmic-glink", .data = &quirk_sc8180x, },
> +	{ .compatible = "qcom,sm8450-pmic-glink", .data = &quirk_sm8450, },
> +	{ .compatible = "qcom,sm8550-pmic-glink", .data = &quirk_sc8280xp, },
>  	{}
>  };
>  
> 
> -- 
> 2.39.2

-- 
heikki

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v2 11/11] soc: qcom: pmic_glink: enable UCSI on sc8180x
  2024-03-29  6:15 ` [PATCH v2 11/11] soc: qcom: pmic_glink: enable UCSI on sc8180x Dmitry Baryshkov
@ 2024-04-02 11:07   ` Heikki Krogerus
  0 siblings, 0 replies; 19+ messages in thread
From: Heikki Krogerus @ 2024-04-02 11:07 UTC (permalink / raw)
  To: Dmitry Baryshkov
  Cc: Greg Kroah-Hartman, Guenter Roeck, Bjorn Andersson,
	Neil Armstrong, Konrad Dybcio, Johan Hovold, linux-usb,
	linux-arm-msm

On Fri, Mar 29, 2024 at 08:15:43AM +0200, Dmitry Baryshkov wrote:
> Now as all UCSI issues have been fixed, enable UCSI subdevice on the
> Qualcomm SC8180X platform.
> 
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>

> ---
>  drivers/soc/qcom/pmic_glink.c | 4 ----
>  1 file changed, 4 deletions(-)
> 
> diff --git a/drivers/soc/qcom/pmic_glink.c b/drivers/soc/qcom/pmic_glink.c
> index e5a591733a0f..c2f71d393bbb 100644
> --- a/drivers/soc/qcom/pmic_glink.c
> +++ b/drivers/soc/qcom/pmic_glink.c
> @@ -334,15 +334,11 @@ static void pmic_glink_remove(struct platform_device *pdev)
>  	mutex_unlock(&__pmic_glink_lock);
>  }
>  
> -static const unsigned long pmic_glink_sc8180x_client_mask = BIT(PMIC_GLINK_CLIENT_BATT) |
> -							    BIT(PMIC_GLINK_CLIENT_ALTMODE);
> -
>  static const unsigned long pmic_glink_sm8450_client_mask = BIT(PMIC_GLINK_CLIENT_BATT) |
>  							   BIT(PMIC_GLINK_CLIENT_ALTMODE) |
>  							   BIT(PMIC_GLINK_CLIENT_UCSI);
>  
>  static const struct of_device_id pmic_glink_of_match[] = {
> -	{ .compatible = "qcom,sc8180x-pmic-glink", .data = &pmic_glink_sc8180x_client_mask },
>  	{ .compatible = "qcom,pmic-glink", .data = &pmic_glink_sm8450_client_mask },
>  	{}
>  };
> 
> -- 
> 2.39.2

-- 
heikki

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2024-04-02 11:07 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-29  6:15 [PATCH v2 00/11] usb: typec: ucsi: fix several issues manifesting on Qualcomm platforms Dmitry Baryshkov
2024-03-29  6:15 ` [PATCH v2 01/11] usb: typec: ucsi: allow non-partner GET_PDOS for Qualcomm devices Dmitry Baryshkov
2024-03-29  6:15 ` [PATCH v2 02/11] usb: typec: ucsi: limit the UCSI_NO_PARTNER_PDOS even further Dmitry Baryshkov
2024-03-29  6:15 ` [PATCH v2 03/11] usb: typec: ucsi: properly register partner's PD device Dmitry Baryshkov
2024-03-29  6:15 ` [PATCH v2 04/11] usb: typec: ucsi: always register a link to USB " Dmitry Baryshkov
2024-04-02 10:38   ` Heikki Krogerus
2024-03-29  6:15 ` [PATCH v2 05/11] usb: typec: ucsi: simplify partner's PD caps registration Dmitry Baryshkov
2024-04-02 10:40   ` Heikki Krogerus
2024-03-29  6:15 ` [PATCH v2 06/11] usb: typec: ucsi: extract code to read PD caps Dmitry Baryshkov
2024-04-02 10:41   ` Heikki Krogerus
2024-03-29  6:15 ` [PATCH v2 07/11] usb: typec: ucsi: support delaying GET_PDOS for device Dmitry Baryshkov
2024-04-02 11:04   ` Heikki Krogerus
2024-03-29  6:15 ` [PATCH v2 08/11] usb: typec: ucsi_glink: rework quirks implementation Dmitry Baryshkov
2024-04-02 11:06   ` Heikki Krogerus
2024-03-29  6:15 ` [PATCH v2 09/11] usb: typec: ucsi_glink: enable the UCSI_DELAY_DEVICE_PDOS quirk Dmitry Baryshkov
2024-04-02 11:07   ` Heikki Krogerus
2024-03-29  6:15 ` [PATCH v2 10/11] soc: qcom: pmic_glink: reenable UCSI on sc8280xp Dmitry Baryshkov
2024-03-29  6:15 ` [PATCH v2 11/11] soc: qcom: pmic_glink: enable UCSI on sc8180x Dmitry Baryshkov
2024-04-02 11:07   ` Heikki Krogerus

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).