2023-09-29 21:37:21

by Abdel Alkuor

[permalink] [raw]
Subject: [PATCH v8 00/14] Add TPS25750 USB type-C PD controller support

From: Abdel Alkuor <[email protected]>

TPS25750 USB type-C PD controller has the same register offsets as
tps6598x. The following is a summary of incorporating TPS25750 into
TPS6598x driver:

- Only Check VID register (0x00) for TPS6598x and cd321x, as TPS25750 doesn't
have VID register.

- TypeC port registration will be registered differently for each PD
controller. TPS6598x uses system configuration register (0x28) to get
pr/dr capabilities. On the other hand, TPS25750 will use data role property
and PD status register (0x40) to get pr/dr capabilities as TPS25750 doesn't
have register 0x28 supported.

- TPS25750 requires writing a binary configuration to switch PD
controller from PTCH mode to APP mode which needs the following changes:
- Add PTCH mode to the modes list.
- Add an argument to tps6598x_check_mode to return the current mode.
- Currently, tps6598x_exec_cmd has cmd timeout hardcoded to 1 second,
and doesn't wait before checking DATA_OUT response. In TPS25750, patch 4CCs
take longer than 1 second to execute and some requires a delay before
checking DATA_OUT. To accommodate that, cmd_timeout and response_delay will
be added as arguments to tps6598x_exec_cmd.
- Implement applying patch sequence for TPS25750.

- In pm suspend callback, patch mode needs to be checked and the binary
configuration should be applied if needed.

- For interrupt, TPS25750 has only one event register (0x14) and one mask
register (0x16) of 11 bytes each, where TPS6598x has two event
and two mask registers of 8 bytes each. Both TPS25750 and TPS65986x
shares the same bit field offsets for events/masks/clear but many of
there fields are reserved in TPS25750, the following needs to be done in
tps6598x_interrupt:
- Read EVENT1 register as a block of 11 bytes when tps25750 is present
- Write CLEAR1 register as a block of 11 bytes when tps25750 is present
- Add trace_tps25750_irq
- During testing, I noticed that when a cable is plugged into the PD
controller and before PD controller switches to APP mode, there is a
lag between dr/pr updates and PlugInsertOrRemoval Event, so a check
for dr/pr change needs to be added along TPS_REG_INT_PLUG_EVENT check

- Add TPS25750 traces for status and power status registers. Trace for
data register won't be added as it doesn't exist in the device.

- Configure sleep mode for TPS25750.

v8:
- PATCH 1:
- Define reg-names at top-level
- PATCH 2:
- Add Reviewed-by
- PATCH 3:
- Revert mode check return
- PATCH 4:
- Return mode when mode is checked
- Use device_is_compatible instead of of_device_is_compatible
- PATCH 5,6:
- No changes
- PATCH 7:
- Use device_is_compatible instead of of_device_is_compatible
- PATCH 8,9:
- No changes
- PATCH 10:
- Change tps->cb to tps->data
- PATCH 11,12:
- No changes
- PATCH 13,14:
- Change tps->cb to tps->data

v7:
- PATCH 1:
- Define reg at top-level
- Remove description from reg-names
- PATCH 2..7: Add tps6598x to the subject
- PATCH 8:
- Add tps6598x to the subject
- Create tps25750 interrupt handler
- PATCH 9..11: Add tps6598x to the subject
- PATCH 12:
- Add driver name to commit subject
- Call trace_tps25750_irq directly from tps25750 interrupt
handler
- PATCH 13-14: Add tps6598x to the subject

v6:
- PATCH 1: Use reg property for patch address
- PATCH 2: Use tps6598x_exec_cmd as a wrapper
- PATCH 3: Return current mode and check it directly
- PATCH 4:
- Don't check VID for tps25750 as the VID register doesn't exist
- Remove is_tps25750 flag from tps6598x struct
- Get patch address from reg property
- PATCH 5: Update eeprom macro to use TPS instead
- PATCH 6: No changes
- PATCH 7: Check tps25750 using is_compatiable device node
- PATCH 8: Create tipd callbacks factory
- PATCH 9: No changes
- PATCH 10: Add port registration to tipd data factory
- PATCH 11: Use tps25750_init instead of tps25750_apply_patch in resume
as it initializes sleep mode
- PATCH 12: Add trace irq to tipd callbacks factory
- PATCH 13: Add trace power status to tipd data factory
- PATCH 14: Add trace status to tipd data factory
v5:
- PATCH 1: Add tps25750 bindings to tps6598x
- PATCH 2: Remove tps25750 driver and incorperate tps25750
into tps6598x driver
- PATCH [3..15]: Incorporating tps25750 into tps6598x driver
v4:
- PATCH 1: No change
- PATCH 2: Fix comments style and drop of_match_ptr
v3:
- PATCH 1: Fix node name
- PATCH 2: Upload tps25750 driver patch
v2:
- PATCH 1: General properties clean up

Abdel Alkuor (14):
dt-bindings: usb: tps6598x: Add tps25750
USB: typec: tsp6598x: Add cmd timeout and response delay
USB: typec: tps6598x: Add patch mode to tps6598x
USB: typec: tps6598x: Load TPS25750 patch bundle
USB: typec: tps6598x: Check for EEPROM present
USB: typec: tps6598x: Clear dead battery flag
USB: typec: tps6598x: Apply patch again after power resume
USB: typec: tps6598x: Add interrupt support for TPS25750
USB: typec: tps6598x: Refactor tps6598x port registration
USB: typec: tps6598x: Add port registration for tps25750
USB: typec: tps6598x: Enable sleep mode for tps25750
USB: typec: tps6598x: Add trace for tps25750 irq
USB: typec: tps6598x: Add power status trace for tps25750
USB: typec: tps6598x: Add status trace for tps25750

.../devicetree/bindings/usb/ti,tps6598x.yaml | 81 ++-
drivers/usb/typec/tipd/core.c | 637 +++++++++++++++---
drivers/usb/typec/tipd/tps6598x.h | 36 +
drivers/usb/typec/tipd/trace.h | 92 +++
4 files changed, 770 insertions(+), 76 deletions(-)

--
2.34.1


2023-09-29 21:54:06

by Abdel Alkuor

[permalink] [raw]
Subject: [PATCH v8 02/14] USB: typec: tsp6598x: Add cmd timeout and response delay

From: Abdel Alkuor <[email protected]>

Some commands in tps25750 take longer than 1 second
to complete, and some responses need some delay before
the result becomes available.

Signed-off-by: Abdel Alkuor <[email protected]>
Reviewed-by: Heikki Krogerus <[email protected]>
---
Changes in v8:
- Add Reviewed-by
Changes in v7:
- Add driver name to commit subject
Changes in v6:
- Use tps6598x_exec_cmd as a wrapper
Changes in v5:
- Incorporating tps25750 into tps6598x driver

drivers/usb/typec/tipd/core.c | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c
index 37b56ce75f39..32420c61660d 100644
--- a/drivers/usb/typec/tipd/core.c
+++ b/drivers/usb/typec/tipd/core.c
@@ -282,9 +282,10 @@ static void tps6598x_disconnect(struct tps6598x *tps, u32 status)
power_supply_changed(tps->psy);
}

-static int tps6598x_exec_cmd(struct tps6598x *tps, const char *cmd,
+static int tps6598x_exec_cmd_tmo(struct tps6598x *tps, const char *cmd,
size_t in_len, u8 *in_data,
- size_t out_len, u8 *out_data)
+ size_t out_len, u8 *out_data,
+ u32 cmd_timeout_ms, u32 res_delay_ms)
{
unsigned long timeout;
u32 val;
@@ -307,8 +308,7 @@ static int tps6598x_exec_cmd(struct tps6598x *tps, const char *cmd,
if (ret < 0)
return ret;

- /* XXX: Using 1s for now, but it may not be enough for every command. */
- timeout = jiffies + msecs_to_jiffies(1000);
+ timeout = jiffies + msecs_to_jiffies(cmd_timeout_ms);

do {
ret = tps6598x_read32(tps, TPS_REG_CMD1, &val);
@@ -321,6 +321,9 @@ static int tps6598x_exec_cmd(struct tps6598x *tps, const char *cmd,
return -ETIMEDOUT;
} while (val);

+ /* some commands require delay for the result to be available */
+ mdelay(res_delay_ms);
+
if (out_len) {
ret = tps6598x_block_read(tps, TPS_REG_DATA1,
out_data, out_len);
@@ -345,6 +348,14 @@ static int tps6598x_exec_cmd(struct tps6598x *tps, const char *cmd,
return 0;
}

+static int tps6598x_exec_cmd(struct tps6598x *tps, const char *cmd,
+ size_t in_len, u8 *in_data,
+ size_t out_len, u8 *out_data)
+{
+ return tps6598x_exec_cmd_tmo(tps, cmd, in_len, in_data,
+ out_len, out_data, 1000, 0);
+}
+
static int tps6598x_dr_set(struct typec_port *port, enum typec_data_role role)
{
const char *cmd = (role == TYPEC_DEVICE) ? "SWUF" : "SWDF";
--
2.34.1

2023-09-29 23:47:46

by Abdel Alkuor

[permalink] [raw]
Subject: [PATCH v8 11/14] USB: typec: tps6598x: Enable sleep mode for tps25750

From: Abdel Alkuor <[email protected]>

Allow controller to enter sleep mode after the device
is idle for sleep time.

Signed-off-by: Abdel Alkuor <[email protected]>
---
Changes in v8:
- No changes
Changes in v7:
- Add driver name to commit subject
Changes in v6:
- Use tps25750_init instead of tps25750_apply_patch in resume
as it initializes sleep mode
Changes in v5:
- Incorporating tps25750 into tps6598x driver

drivers/usb/typec/tipd/core.c | 23 +++++++++++++++++++++--
drivers/usb/typec/tipd/tps6598x.h | 3 +++
2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c
index dd2ecbea8031..0955ee214eb0 100644
--- a/drivers/usb/typec/tipd/core.c
+++ b/drivers/usb/typec/tipd/core.c
@@ -43,6 +43,7 @@
#define TPS_REG_PD_STATUS 0x40
#define TPS_REG_RX_IDENTITY_SOP 0x48
#define TPS_REG_DATA_STATUS 0x5f
+#define TPS_REG_SLEEP_CONF 0x70

/* TPS_REG_SYSTEM_CONF bits */
#define TPS_SYSCONF_PORTINFO(c) ((c) & 7)
@@ -1041,6 +1042,24 @@ static int tps25750_apply_patch(struct tps6598x *tps)
return 0;
};

+static int tps25750_init(struct tps6598x *tps)
+{
+ int ret;
+
+ ret = tps25750_apply_patch(tps);
+ if (ret)
+ return ret;
+
+ ret = tps6598x_write8(tps, TPS_REG_SLEEP_CONF,
+ TPS_SLEEP_CONF_SLEEP_MODE_ALLOWED);
+ if (ret)
+ dev_warn(tps->dev,
+ "%s: failed to enable sleep mode: %d\n",
+ __func__, ret);
+
+ return 0;
+}
+
static int
tps6598x_register_port(struct tps6598x *tps, struct fwnode_handle *fwnode)
{
@@ -1237,7 +1256,7 @@ static int tps6598x_probe(struct i2c_client *client)
return ret;

if (is_tps25750 && ret == TPS_MODE_PTCH) {
- ret = tps25750_apply_patch(tps);
+ ret = tps25750_init(tps);
if (ret)
return ret;
}
@@ -1374,7 +1393,7 @@ static int __maybe_unused tps6598x_resume(struct device *dev)
return ret;

if (device_is_compatible(tps->dev, "ti,tps25750") && ret == TPS_MODE_PTCH) {
- ret = tps25750_apply_patch(tps);
+ ret = tps25750_init(tps);
if (ret)
return ret;
}
diff --git a/drivers/usb/typec/tipd/tps6598x.h b/drivers/usb/typec/tipd/tps6598x.h
index 3a9a43394134..f86b5e96efba 100644
--- a/drivers/usb/typec/tipd/tps6598x.h
+++ b/drivers/usb/typec/tipd/tps6598x.h
@@ -213,4 +213,7 @@
#define TPS_PD_STATUS_PORT_TYPE_SOURCE 2
#define TPS_PD_STATUS_PORT_TYPE_SOURCE_SINK 3

+/* SLEEP CONF REG */
+#define TPS_SLEEP_CONF_SLEEP_MODE_ALLOWED BIT(0)
+
#endif /* __TPS6598X_H__ */
--
2.34.1

2023-09-30 08:37:40

by Abdel Alkuor

[permalink] [raw]
Subject: [PATCH v8 10/14] USB: typec: tps6598x: Add port registration for tps25750

From: Abdel Alkuor <[email protected]>

TPS25750 doesn't have system configuration register to get dr/pr of the
current applied binary configuration.

Get data role from the device node and power role from PD status register.

Signed-off-by: Abdel Alkuor <[email protected]>
---
Changes in v8:
- Change tps->cb to tps->data
Changes in v7:
- Add driver name to commit subject
Changes in v6:
- Add port registration to tipd data factory
Changes in v5:
- Incorporating tps25750 into tps6598x driver

drivers/usb/typec/tipd/core.c | 68 ++++++++++++++++++++++++++++++-
drivers/usb/typec/tipd/tps6598x.h | 10 +++++
2 files changed, 77 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c
index 580680986f66..dd2ecbea8031 100644
--- a/drivers/usb/typec/tipd/core.c
+++ b/drivers/usb/typec/tipd/core.c
@@ -40,6 +40,7 @@
#define TPS_REG_CTRL_CONF 0x29
#define TPS_REG_BOOT_STATUS 0x2D
#define TPS_REG_POWER_STATUS 0x3f
+#define TPS_REG_PD_STATUS 0x40
#define TPS_REG_RX_IDENTITY_SOP 0x48
#define TPS_REG_DATA_STATUS 0x5f

@@ -102,8 +103,11 @@ static const char *const modes[] = {
/* Unrecognized commands will be replaced with "!CMD" */
#define INVALID_CMD(_cmd_) (_cmd_ == 0x444d4321)

+struct tps6598x;
+
struct tipd_data {
irq_handler_t irq_handler;
+ int (*register_port)(struct tps6598x *tps, struct fwnode_handle *node);
};

struct tps6598x {
@@ -208,6 +212,11 @@ static inline int tps6598x_read64(struct tps6598x *tps, u8 reg, u64 *val)
return tps6598x_block_read(tps, reg, val, sizeof(u64));
}

+static inline int tps6598x_write8(struct tps6598x *tps, u8 reg, u8 val)
+{
+ return tps6598x_block_write(tps, reg, &val, sizeof(u8));
+}
+
static inline int tps6598x_write64(struct tps6598x *tps, u8 reg, u64 val)
{
return tps6598x_block_write(tps, reg, &val, sizeof(u64));
@@ -1084,16 +1093,73 @@ tps6598x_register_port(struct tps6598x *tps, struct fwnode_handle *fwnode)
return 0;
}

+static int
+tps25750_register_port(struct tps6598x *tps, struct fwnode_handle *fwnode)
+{
+ struct typec_capability typec_cap = { };
+ const char *data_role;
+ u8 pd_status;
+ int ret;
+
+ ret = tps6598x_read8(tps, TPS_REG_PD_STATUS, &pd_status);
+ if (ret)
+ return ret;
+
+ ret = fwnode_property_read_string(fwnode, "data-role", &data_role);
+ if (ret) {
+ dev_err(tps->dev, "data-role not found: %d\n", ret);
+ return ret;
+ }
+
+ ret = typec_find_port_data_role(data_role);
+ if (ret < 0) {
+ dev_err(tps->dev, "unknown data-role: %s\n", data_role);
+ return ret;
+ }
+
+ typec_cap.data = ret;
+ typec_cap.revision = USB_TYPEC_REV_1_3;
+ typec_cap.pd_revision = 0x300;
+ typec_cap.driver_data = tps;
+ typec_cap.ops = &tps6598x_ops;
+ typec_cap.fwnode = fwnode;
+ typec_cap.prefer_role = TYPEC_NO_PREFERRED_ROLE;
+
+ switch (TPS_PD_STATUS_PORT_TYPE(pd_status)) {
+ case TPS_PD_STATUS_PORT_TYPE_SINK_SOURCE:
+ case TPS_PD_STATUS_PORT_TYPE_SOURCE_SINK:
+ typec_cap.type = TYPEC_PORT_DRP;
+ break;
+ case TPS_PD_STATUS_PORT_TYPE_SINK:
+ typec_cap.type = TYPEC_PORT_SNK;
+ break;
+ case TPS_PD_STATUS_PORT_TYPE_SOURCE:
+ typec_cap.type = TYPEC_PORT_SRC;
+ break;
+ default:
+ return -ENODEV;
+ }
+
+ tps->port = typec_register_port(tps->dev, &typec_cap);
+ if (IS_ERR(tps->port))
+ return PTR_ERR(tps->port);
+
+ return 0;
+}
+
static const struct tipd_data cd321x_data = {
.irq_handler = cd321x_interrupt,
+ .register_port = tps6598x_register_port,
};

static const struct tipd_data tps6598x_data = {
.irq_handler = tps6598x_interrupt,
+ .register_port = tps6598x_register_port,
};

static const struct tipd_data tps25750_data = {
.irq_handler = tps25750_interrupt,
+ .register_port = tps25750_register_port,
};

static const struct of_device_id tps6598x_of_match[] = {
@@ -1206,7 +1272,7 @@ static int tps6598x_probe(struct i2c_client *client)
if (ret)
goto err_role_put;

- ret = tps6598x_register_port(tps, fwnode);
+ ret = tps->data->register_port(tps, fwnode);
if (ret)
goto err_role_put;

diff --git a/drivers/usb/typec/tipd/tps6598x.h b/drivers/usb/typec/tipd/tps6598x.h
index c000170f4547..3a9a43394134 100644
--- a/drivers/usb/typec/tipd/tps6598x.h
+++ b/drivers/usb/typec/tipd/tps6598x.h
@@ -203,4 +203,14 @@
#define TPS_BOOT_STATUS_DEAD_BATTERY_FLAG BIT(2)
#define TPS_BOOT_STATUS_I2C_EEPROM_PRESENT BIT(3)

+/* PD STATUS REG */
+#define TPS_REG_PD_STATUS_PORT_TYPE_MASK GENMASK(5, 4)
+#define TPS_PD_STATUS_PORT_TYPE(x) \
+ TPS_FIELD_GET(TPS_REG_PD_STATUS_PORT_TYPE_MASK, x)
+
+#define TPS_PD_STATUS_PORT_TYPE_SINK_SOURCE 0
+#define TPS_PD_STATUS_PORT_TYPE_SINK 1
+#define TPS_PD_STATUS_PORT_TYPE_SOURCE 2
+#define TPS_PD_STATUS_PORT_TYPE_SOURCE_SINK 3
+
#endif /* __TPS6598X_H__ */
--
2.34.1

2023-09-30 14:00:55

by Abdel Alkuor

[permalink] [raw]
Subject: [PATCH v8 03/14] USB: typec: tps6598x: Add patch mode to tps6598x

From: Abdel Alkuor <[email protected]>

TPS25750 has a patch mode indicating the device requires
a configuration to get the device into operational mode

Signed-off-by: Abdel Alkuor <[email protected]>
---
Changes in v8:
- Revert mode check return
Changes in v7:
- Add driver name to commit subject
Changes in v6:
- Return current mode and check it directly
Changes in v5:
- Incorporating tps25750 into tps6598x driver

drivers/usb/typec/tipd/core.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c
index 32420c61660d..c5bbf03cb74a 100644
--- a/drivers/usb/typec/tipd/core.c
+++ b/drivers/usb/typec/tipd/core.c
@@ -68,6 +68,7 @@ enum {
TPS_MODE_BOOT,
TPS_MODE_BIST,
TPS_MODE_DISC,
+ TPS_MODE_PTCH,
};

static const char *const modes[] = {
@@ -75,6 +76,7 @@ static const char *const modes[] = {
[TPS_MODE_BOOT] = "BOOT",
[TPS_MODE_BIST] = "BIST",
[TPS_MODE_DISC] = "DISC",
+ [TPS_MODE_PTCH] = "PTCH",
};

/* Unrecognized commands will be replaced with "!CMD" */
@@ -595,6 +597,7 @@ static int tps6598x_check_mode(struct tps6598x *tps)

switch (match_string(modes, ARRAY_SIZE(modes), mode)) {
case TPS_MODE_APP:
+ case TPS_MODE_PTCH:
return 0;
case TPS_MODE_BOOT:
dev_warn(tps->dev, "dead-battery condition\n");
--
2.34.1

2023-10-05 17:10:14

by Abdel Alkuor

[permalink] [raw]
Subject: [PATCH v8 05/14] USB: typec: tps6598x: Check for EEPROM present

From: Abdel Alkuor <[email protected]>

When an EEPROM is present, tps25750 loads the binary configuration from
EEPROM. Hence, all we need to do is wait for the device to switch to APP
mode

Signed-off-by: Abdel Alkuor <[email protected]>
---
Changes in v8:
- No changes
Changes in v7:
- Add driver name to commit subject
Changes in v6:
- Update eeprom macro to use TPS instead
Changes in v5:
- Incorporating tps25750 into tps6598x driver

drivers/usb/typec/tipd/core.c | 13 +++++++++++++
drivers/usb/typec/tipd/tps6598x.h | 3 +++
2 files changed, 16 insertions(+)

diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c
index 2e7b9eafaf04..21b0ea2c9627 100644
--- a/drivers/usb/typec/tipd/core.c
+++ b/drivers/usb/typec/tipd/core.c
@@ -37,6 +37,7 @@
#define TPS_REG_STATUS 0x1a
#define TPS_REG_SYSTEM_CONF 0x28
#define TPS_REG_CTRL_CONF 0x29
+#define TPS_REG_BOOT_STATUS 0x2D
#define TPS_REG_POWER_STATUS 0x3f
#define TPS_REG_RX_IDENTITY_SOP 0x48
#define TPS_REG_DATA_STATUS 0x5f
@@ -910,6 +911,17 @@ static int tps25750_apply_patch(struct tps6598x *tps)
{
int ret;
unsigned long timeout;
+ u64 status = 0;
+
+ ret = tps6598x_block_read(tps, TPS_REG_BOOT_STATUS, &status, 5);
+ if (ret)
+ return ret;
+ /*
+ * Nothing to be done if the configuration
+ * is being loaded from EERPOM
+ */
+ if (status & TPS_BOOT_STATUS_I2C_EEPROM_PRESENT)
+ goto wait_for_app;

ret = tps25750_start_patch_burst_mode(tps);
if (ret) {
@@ -921,6 +933,7 @@ static int tps25750_apply_patch(struct tps6598x *tps)
if (ret)
return ret;

+wait_for_app:
timeout = jiffies + msecs_to_jiffies(1000);

do {
diff --git a/drivers/usb/typec/tipd/tps6598x.h b/drivers/usb/typec/tipd/tps6598x.h
index 527857549d69..a80d0929f3ee 100644
--- a/drivers/usb/typec/tipd/tps6598x.h
+++ b/drivers/usb/typec/tipd/tps6598x.h
@@ -199,4 +199,7 @@
#define TPS_DATA_STATUS_DP_SPEC_PIN_ASSIGNMENT_A BIT(2)
#define TPS_DATA_STATUS_DP_SPEC_PIN_ASSIGNMENT_B (BIT(2) | BIT(1))

+/* BOOT STATUS REG*/
+#define TPS_BOOT_STATUS_I2C_EEPROM_PRESENT BIT(3)
+
#endif /* __TPS6598X_H__ */
--
2.34.1

2023-10-05 17:30:16

by Abdel Alkuor

[permalink] [raw]
Subject: [PATCH v8 01/14] dt-bindings: usb: tps6598x: Add tps25750

From: Abdel Alkuor <[email protected]>

TPS25750 is USB TypeC PD controller which is a subset of TPS6598x.

Signed-off-by: Abdel Alkuor <[email protected]>
---
Changes in v8:
- Define reg-names at top-level
Changes in v7:
- Define reg at top-level
- Remove description from reg-names
Changes in v6:
- Use reg property for patch address
Changes in v5:
- Add tps25750 bindings
.../devicetree/bindings/usb/ti,tps6598x.yaml | 81 ++++++++++++++++++-
1 file changed, 80 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/usb/ti,tps6598x.yaml b/Documentation/devicetree/bindings/usb/ti,tps6598x.yaml
index 5497a60cddbc..72ac534e6ed2 100644
--- a/Documentation/devicetree/bindings/usb/ti,tps6598x.yaml
+++ b/Documentation/devicetree/bindings/usb/ti,tps6598x.yaml
@@ -20,8 +20,23 @@ properties:
enum:
- ti,tps6598x
- apple,cd321x
+ - ti,tps25750
+
reg:
- maxItems: 1
+ minItems: 1
+ items:
+ - description: main PD controller address
+ - description: |
+ I2C slave address field in PBMs input data
+ which is used as the device address when writing the
+ patch for TPS25750.
+ The patch address can be any value except 0x00, 0x20,
+ 0x21, 0x22, and 0x23
+
+ reg-names:
+ items:
+ - const: main
+ - const: patch-address

wakeup-source: true

@@ -32,10 +47,42 @@ properties:
items:
- const: irq

+ firmware-name:
+ description: |
+ Should contain the name of the default patch binary
+ file located on the firmware search path which is
+ used to switch the controller into APP mode.
+ This is used when tps25750 doesn't have an EEPROM
+ connected to it.
+ maxItems: 1
+
required:
- compatible
- reg

+allOf:
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: ti,tps25750
+ then:
+ properties:
+ reg:
+ maxItems: 2
+
+ connector:
+ required:
+ - data-role
+
+ required:
+ - connector
+ - reg-names
+ else:
+ properties:
+ reg:
+ maxItems: 1
+
additionalProperties: true

examples:
@@ -68,4 +115,36 @@ examples:
};
};
};
+
+ - |
+ #include <dt-bindings/interrupt-controller/irq.h>
+ i2c {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ typec@21 {
+ compatible = "ti,tps25750";
+ reg = <0x21>, <0x0f>;
+ reg-names = "main", "patch-address";
+
+ interrupt-parent = <&msmgpio>;
+ interrupts = <100 IRQ_TYPE_LEVEL_LOW>;
+ interrupt-names = "irq";
+ firmware-name = "tps25750.bin";
+
+ pinctrl-names = "default";
+ pinctrl-0 = <&typec_pins>;
+
+ typec_con0: connector {
+ compatible = "usb-c-connector";
+ label = "USB-C";
+ data-role = "dual";
+ port {
+ typec_ep0: endpoint {
+ remote-endpoint = <&otg_ep>;
+ };
+ };
+ };
+ };
+ };
...
--
2.34.1