* [PATCH v7 01/14] dt-bindings: connector: add properties for typec
2018-06-25 8:08 [PATCH v7 00/14] staging: typec: tcpci: move out of staging Li Jun
@ 2018-06-25 8:08 ` Li Jun
2018-06-25 8:08 ` [PATCH v7 02/14] dt-bindings: usb: add documentation for typec port controller(TCPCI) Li Jun
` (12 subsequent siblings)
13 siblings, 0 replies; 18+ messages in thread
From: Li Jun @ 2018-06-25 8:08 UTC (permalink / raw)
To: robh+dt, gregkh, heikki.krogerus, linux
Cc: a.hajda, jun.li, cw00.choi, shufan_lee, peter.chen, devicetree,
linux-usb, linux-imx
Add bindings supported by current typec driver, so user can pass
all those properties via dt.
Reviewed-by: Rob Herring <robh@kernel.org>
Signed-off-by: Li Jun <jun.li@nxp.com>
---
.../bindings/connector/usb-connector.txt | 44 +++++++++++++++
include/dt-bindings/usb/pd.h | 62 ++++++++++++++++++++++
2 files changed, 106 insertions(+)
diff --git a/Documentation/devicetree/bindings/connector/usb-connector.txt b/Documentation/devicetree/bindings/connector/usb-connector.txt
index e1463f1..8855bfc 100644
--- a/Documentation/devicetree/bindings/connector/usb-connector.txt
+++ b/Documentation/devicetree/bindings/connector/usb-connector.txt
@@ -15,6 +15,33 @@ Optional properties:
- type: size of the connector, should be specified in case of USB-A, USB-B
non-fullsize connectors: "mini", "micro".
+Optional properties for usb-c-connector:
+- power-role: should be one of "source", "sink" or "dual"(DRP) if typec
+ connector has power support.
+- try-power-role: preferred power role if "dual"(DRP) can support Try.SNK
+ or Try.SRC, should be "sink" for Try.SNK or "source" for Try.SRC.
+- data-role: should be one of "host", "device", "dual"(DRD) if typec
+ connector supports USB data.
+
+Required properties for usb-c-connector with power delivery support:
+- source-pdos: An array of u32 with each entry providing supported power
+ source data object(PDO), the detailed bit definitions of PDO can be found
+ in "Universal Serial Bus Power Delivery Specification" chapter 6.4.1.2
+ Source_Capabilities Message, the order of each entry(PDO) should follow
+ the PD spec chapter 6.4.1. Required for power source and power dual role.
+ User can specify the source PDO array via PDO_FIXED/BATT/VAR() defined in
+ dt-bindings/usb/pd.h.
+- sink-pdos: An array of u32 with each entry providing supported power
+ sink data object(PDO), the detailed bit definitions of PDO can be found
+ in "Universal Serial Bus Power Delivery Specification" chapter 6.4.1.3
+ Sink Capabilities Message, the order of each entry(PDO) should follow
+ the PD spec chapter 6.4.1. Required for power sink and power dual role.
+ User can specify the sink PDO array via PDO_FIXED/BATT/VAR() defined in
+ dt-bindings/usb/pd.h.
+- op-sink-microwatt: Sink required operating power in microwatt, if source
+ can't offer the power, Capability Mismatch is set. Required for power
+ sink and power dual role.
+
Required nodes:
- any data bus to the connector should be modeled using the OF graph bindings
specified in bindings/graph.txt, unless the bus is between parent node and
@@ -73,3 +100,20 @@ ccic: s2mm005@33 {
};
};
};
+
+3. USB-C connector attached to a typec port controller(ptn5110), which has
+power delivery support and enables drp.
+
+typec: ptn5110@50 {
+ ...
+ usb_con: connector {
+ compatible = "usb-c-connector";
+ label = "USB-C";
+ power-role = "dual";
+ try-power-role = "sink";
+ source-pdos = <PDO_FIXED(5000, 2000, PDO_FIXED_USB_COMM)>;
+ sink-pdos = <PDO_FIXED(5000, 2000, PDO_FIXED_USB_COMM)
+ PDO_VAR(5000, 12000, 2000)>;
+ op-sink-microwatt = <10000000>;
+ };
+};
diff --git a/include/dt-bindings/usb/pd.h b/include/dt-bindings/usb/pd.h
new file mode 100644
index 0000000..7b7a92f
--- /dev/null
+++ b/include/dt-bindings/usb/pd.h
@@ -0,0 +1,62 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __DT_POWER_DELIVERY_H
+#define __DT_POWER_DELIVERY_H
+
+/* Power delivery Power Data Object definitions */
+#define PDO_TYPE_FIXED 0
+#define PDO_TYPE_BATT 1
+#define PDO_TYPE_VAR 2
+#define PDO_TYPE_APDO 3
+
+#define PDO_TYPE_SHIFT 30
+#define PDO_TYPE_MASK 0x3
+
+#define PDO_TYPE(t) ((t) << PDO_TYPE_SHIFT)
+
+#define PDO_VOLT_MASK 0x3ff
+#define PDO_CURR_MASK 0x3ff
+#define PDO_PWR_MASK 0x3ff
+
+#define PDO_FIXED_DUAL_ROLE (1 << 29) /* Power role swap supported */
+#define PDO_FIXED_SUSPEND (1 << 28) /* USB Suspend supported (Source) */
+#define PDO_FIXED_HIGHER_CAP (1 << 28) /* Requires more than vSafe5V (Sink) */
+#define PDO_FIXED_EXTPOWER (1 << 27) /* Externally powered */
+#define PDO_FIXED_USB_COMM (1 << 26) /* USB communications capable */
+#define PDO_FIXED_DATA_SWAP (1 << 25) /* Data role swap supported */
+#define PDO_FIXED_VOLT_SHIFT 10 /* 50mV units */
+#define PDO_FIXED_CURR_SHIFT 0 /* 10mA units */
+
+#define PDO_FIXED_VOLT(mv) ((((mv) / 50) & PDO_VOLT_MASK) << PDO_FIXED_VOLT_SHIFT)
+#define PDO_FIXED_CURR(ma) ((((ma) / 10) & PDO_CURR_MASK) << PDO_FIXED_CURR_SHIFT)
+
+#define PDO_FIXED(mv, ma, flags) \
+ (PDO_TYPE(PDO_TYPE_FIXED) | (flags) | \
+ PDO_FIXED_VOLT(mv) | PDO_FIXED_CURR(ma))
+
+#define VSAFE5V 5000 /* mv units */
+
+#define PDO_BATT_MAX_VOLT_SHIFT 20 /* 50mV units */
+#define PDO_BATT_MIN_VOLT_SHIFT 10 /* 50mV units */
+#define PDO_BATT_MAX_PWR_SHIFT 0 /* 250mW units */
+
+#define PDO_BATT_MIN_VOLT(mv) ((((mv) / 50) & PDO_VOLT_MASK) << PDO_BATT_MIN_VOLT_SHIFT)
+#define PDO_BATT_MAX_VOLT(mv) ((((mv) / 50) & PDO_VOLT_MASK) << PDO_BATT_MAX_VOLT_SHIFT)
+#define PDO_BATT_MAX_POWER(mw) ((((mw) / 250) & PDO_PWR_MASK) << PDO_BATT_MAX_PWR_SHIFT)
+
+#define PDO_BATT(min_mv, max_mv, max_mw) \
+ (PDO_TYPE(PDO_TYPE_BATT) | PDO_BATT_MIN_VOLT(min_mv) | \
+ PDO_BATT_MAX_VOLT(max_mv) | PDO_BATT_MAX_POWER(max_mw))
+
+#define PDO_VAR_MAX_VOLT_SHIFT 20 /* 50mV units */
+#define PDO_VAR_MIN_VOLT_SHIFT 10 /* 50mV units */
+#define PDO_VAR_MAX_CURR_SHIFT 0 /* 10mA units */
+
+#define PDO_VAR_MIN_VOLT(mv) ((((mv) / 50) & PDO_VOLT_MASK) << PDO_VAR_MIN_VOLT_SHIFT)
+#define PDO_VAR_MAX_VOLT(mv) ((((mv) / 50) & PDO_VOLT_MASK) << PDO_VAR_MAX_VOLT_SHIFT)
+#define PDO_VAR_MAX_CURR(ma) ((((ma) / 10) & PDO_CURR_MASK) << PDO_VAR_MAX_CURR_SHIFT)
+
+#define PDO_VAR(min_mv, max_mv, max_ma) \
+ (PDO_TYPE(PDO_TYPE_VAR) | PDO_VAR_MIN_VOLT(min_mv) | \
+ PDO_VAR_MAX_VOLT(max_mv) | PDO_VAR_MAX_CURR(max_ma))
+
+ #endif /* __DT_POWER_DELIVERY_H */
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v7 02/14] dt-bindings: usb: add documentation for typec port controller(TCPCI)
2018-06-25 8:08 [PATCH v7 00/14] staging: typec: tcpci: move out of staging Li Jun
2018-06-25 8:08 ` [PATCH v7 01/14] dt-bindings: connector: add properties for typec Li Jun
@ 2018-06-25 8:08 ` Li Jun
2018-06-25 8:08 ` [PATCH v7 03/14] staging: typec: tcpci: add compatible string for nxp ptn5110 Li Jun
` (11 subsequent siblings)
13 siblings, 0 replies; 18+ messages in thread
From: Li Jun @ 2018-06-25 8:08 UTC (permalink / raw)
To: robh+dt, gregkh, heikki.krogerus, linux
Cc: a.hajda, jun.li, cw00.choi, shufan_lee, peter.chen, devicetree,
linux-usb, linux-imx
TCPCI stands for typec port controller interface, its implementation
has full typec port control with power delivery support, it's a
standard i2c slave with GPIO input as irq interface, detail see spec
"Universal Serial Bus Type-C Port Controller Interface Specification
Revision 1.0, Version 1.1"
Reviewed-by: Rob Herring <robh@kernel.org>
Signed-off-by: Li Jun <jun.li@nxp.com>
---
.../devicetree/bindings/usb/typec-tcpci.txt | 49 ++++++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/Documentation/devicetree/bindings/usb/typec-tcpci.txt b/Documentation/devicetree/bindings/usb/typec-tcpci.txt
new file mode 100644
index 0000000..0dd1469
--- /dev/null
+++ b/Documentation/devicetree/bindings/usb/typec-tcpci.txt
@@ -0,0 +1,49 @@
+TCPCI(Typec port cotroller interface) binding
+---------------------------------------------
+
+Required properties:
+- compatible: should be set one of following:
+ - "nxp,ptn5110" for NXP USB PD TCPC PHY IC ptn5110.
+
+- reg: the i2c slave address of typec port controller device.
+- interrupt-parent: the phandle to the interrupt controller which provides
+ the interrupt.
+- interrupts: interrupt specification for tcpci alert.
+
+Required sub-node:
+- connector: The "usb-c-connector" attached to the tcpci chip, the bindings
+ of connector node are specified in
+ Documentation/devicetree/bindings/connector/usb-connector.txt
+
+Example:
+
+ptn5110@50 {
+ compatible = "nxp,ptn5110";
+ reg = <0x50>;
+ interrupt-parent = <&gpio3>;
+ interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
+
+ usb_con: connector {
+ compatible = "usb-c-connector";
+ label = "USB-C";
+ data-role = "dual";
+ power-role = "dual";
+ try-power-role = "sink";
+ source-pdos = <PDO_FIXED(5000, 2000, PDO_FIXED_USB_COMM)>;
+ sink-pdos = <PDO_FIXED(5000, 2000, PDO_FIXED_USB_COMM)
+ PDO_VAR(5000, 12000, 2000)>;
+ op-sink-microwatt = <10000000>;
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@1 {
+ reg = <1>;
+ usb_con_ss: endpoint {
+ remote-endpoint = <&usb3_data_ss>;
+ };
+ };
+ };
+ };
+};
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v7 03/14] staging: typec: tcpci: add compatible string for nxp ptn5110
2018-06-25 8:08 [PATCH v7 00/14] staging: typec: tcpci: move out of staging Li Jun
2018-06-25 8:08 ` [PATCH v7 01/14] dt-bindings: connector: add properties for typec Li Jun
2018-06-25 8:08 ` [PATCH v7 02/14] dt-bindings: usb: add documentation for typec port controller(TCPCI) Li Jun
@ 2018-06-25 8:08 ` Li Jun
2018-06-25 8:08 ` [PATCH v7 04/14] usb: typec: add fwnode to tcpc Li Jun
` (10 subsequent siblings)
13 siblings, 0 replies; 18+ messages in thread
From: Li Jun @ 2018-06-25 8:08 UTC (permalink / raw)
To: robh+dt, gregkh, heikki.krogerus, linux
Cc: a.hajda, jun.li, cw00.choi, shufan_lee, peter.chen, devicetree,
linux-usb, linux-imx
Add nxp ptn5110 typec controller compatible string: "nxp,ptn5110",
which is a standard tcpci chip with power delivery support. Meanwhile
remove "usb,tcpci" because it doesn't follow the binding format rule
and has not been used yet.
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Li Jun <jun.li@nxp.com>
---
drivers/staging/typec/tcpci.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/staging/typec/tcpci.c b/drivers/staging/typec/tcpci.c
index 076d97e..dd29288 100644
--- a/drivers/staging/typec/tcpci.c
+++ b/drivers/staging/typec/tcpci.c
@@ -575,7 +575,7 @@ MODULE_DEVICE_TABLE(i2c, tcpci_id);
#ifdef CONFIG_OF
static const struct of_device_id tcpci_of_match[] = {
- { .compatible = "usb,tcpci", },
+ { .compatible = "nxp,ptn5110", },
{},
};
MODULE_DEVICE_TABLE(of, tcpci_of_match);
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v7 04/14] usb: typec: add fwnode to tcpc
2018-06-25 8:08 [PATCH v7 00/14] staging: typec: tcpci: move out of staging Li Jun
` (2 preceding siblings ...)
2018-06-25 8:08 ` [PATCH v7 03/14] staging: typec: tcpci: add compatible string for nxp ptn5110 Li Jun
@ 2018-06-25 8:08 ` Li Jun
2018-06-25 8:08 ` [PATCH v7 05/14] usb: typec: add API to get typec basic port power and data config Li Jun
` (9 subsequent siblings)
13 siblings, 0 replies; 18+ messages in thread
From: Li Jun @ 2018-06-25 8:08 UTC (permalink / raw)
To: robh+dt, gregkh, heikki.krogerus, linux
Cc: a.hajda, jun.li, cw00.choi, shufan_lee, peter.chen, devicetree,
linux-usb, linux-imx
Add fwnode handle to get the fwnode so we can get typec configs
it contains.
Suggested-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Li Jun <jun.li@nxp.com>
---
drivers/staging/typec/tcpci.c | 7 +++++++
drivers/usb/typec/tcpm.c | 1 +
include/linux/usb/tcpm.h | 2 ++
3 files changed, 10 insertions(+)
diff --git a/drivers/staging/typec/tcpci.c b/drivers/staging/typec/tcpci.c
index dd29288..e59547a 100644
--- a/drivers/staging/typec/tcpci.c
+++ b/drivers/staging/typec/tcpci.c
@@ -10,6 +10,7 @@
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/interrupt.h>
+#include <linux/property.h>
#include <linux/regmap.h>
#include <linux/usb/pd.h>
#include <linux/usb/tcpm.h>
@@ -474,6 +475,12 @@ static int tcpci_parse_config(struct tcpci *tcpci)
/* TODO: Populate struct tcpc_config from ACPI/device-tree */
tcpci->tcpc.config = &tcpci_tcpc_config;
+ tcpci->tcpc.fwnode = device_get_named_child_node(tcpci->dev,
+ "connector");
+ if (!tcpci->tcpc.fwnode) {
+ dev_err(tcpci->dev, "Can't find connector node.\n");
+ return -EINVAL;
+ }
return 0;
}
diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c
index 8a201dd..d22b37b 100644
--- a/drivers/usb/typec/tcpm.c
+++ b/drivers/usb/typec/tcpm.c
@@ -4576,6 +4576,7 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
else
port->try_role = TYPEC_NO_PREFERRED_ROLE;
+ port->typec_caps.fwnode = tcpc->fwnode;
port->typec_caps.prefer_role = tcpc->config->default_role;
port->typec_caps.type = tcpc->config->type;
port->typec_caps.data = tcpc->config->data;
diff --git a/include/linux/usb/tcpm.h b/include/linux/usb/tcpm.h
index b231b93..193920a 100644
--- a/include/linux/usb/tcpm.h
+++ b/include/linux/usb/tcpm.h
@@ -110,6 +110,7 @@ enum tcpc_mux_mode {
/**
* struct tcpc_dev - Port configuration and callback functions
* @config: Pointer to port configuration
+ * @fwnode: Pointer to port fwnode
* @get_vbus: Called to read current VBUS state
* @get_current_limit:
* Optional; called by the tcpm core when configured as a snk
@@ -138,6 +139,7 @@ enum tcpc_mux_mode {
*/
struct tcpc_dev {
const struct tcpc_config *config;
+ struct fwnode_handle *fwnode;
int (*init)(struct tcpc_dev *dev);
int (*get_vbus)(struct tcpc_dev *dev);
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v7 05/14] usb: typec: add API to get typec basic port power and data config
2018-06-25 8:08 [PATCH v7 00/14] staging: typec: tcpci: move out of staging Li Jun
` (3 preceding siblings ...)
2018-06-25 8:08 ` [PATCH v7 04/14] usb: typec: add fwnode to tcpc Li Jun
@ 2018-06-25 8:08 ` Li Jun
2018-06-26 8:14 ` Heikki Krogerus
2018-06-25 8:08 ` [PATCH v7 06/14] usb: typec: tcpm: support get typec and pd config from device properties Li Jun
` (8 subsequent siblings)
13 siblings, 1 reply; 18+ messages in thread
From: Li Jun @ 2018-06-25 8:08 UTC (permalink / raw)
To: robh+dt, gregkh, heikki.krogerus, linux
Cc: a.hajda, jun.li, cw00.choi, shufan_lee, peter.chen, devicetree,
linux-usb, linux-imx
This patch adds 3 APIs to get the typec port power and data type,
and preferred power role by its name string.
Signed-off-by: Li Jun <jun.li@nxp.com>
---
drivers/usb/typec/class.c | 58 +++++++++++++++++++++++++++++++++++++++++++----
include/linux/usb/typec.h | 3 +++
2 files changed, 57 insertions(+), 4 deletions(-)
diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c
index 53df10d..6331059 100644
--- a/drivers/usb/typec/class.c
+++ b/drivers/usb/typec/class.c
@@ -796,12 +796,18 @@ static const char * const typec_data_roles[] = {
[TYPEC_HOST] = "host",
};
-static const char * const typec_port_types[] = {
+static const char * const typec_port_power_roles[] = {
[TYPEC_PORT_SRC] = "source",
[TYPEC_PORT_SNK] = "sink",
[TYPEC_PORT_DRP] = "dual",
};
+static const char * const typec_port_data_roles[] = {
+ [TYPEC_PORT_DFP] = "host",
+ [TYPEC_PORT_UFP] = "device",
+ [TYPEC_PORT_DRD] = "dual",
+};
+
static const char * const typec_port_types_drp[] = {
[TYPEC_PORT_SRC] = "dual [source] sink",
[TYPEC_PORT_SNK] = "dual source [sink]",
@@ -932,7 +938,7 @@ static ssize_t power_role_store(struct device *dev,
mutex_lock(&port->port_type_lock);
if (port->port_type != TYPEC_PORT_DRP) {
dev_dbg(dev, "port type fixed at \"%s\"",
- typec_port_types[port->port_type]);
+ typec_port_power_roles[port->port_type]);
ret = -EOPNOTSUPP;
goto unlock_and_ret;
}
@@ -973,7 +979,7 @@ port_type_store(struct device *dev, struct device_attribute *attr,
return -EOPNOTSUPP;
}
- ret = sysfs_match_string(typec_port_types, buf);
+ ret = sysfs_match_string(typec_port_power_roles, buf);
if (ret < 0)
return ret;
@@ -1007,7 +1013,7 @@ port_type_show(struct device *dev, struct device_attribute *attr,
return sprintf(buf, "%s\n",
typec_port_types_drp[port->port_type]);
- return sprintf(buf, "[%s]\n", typec_port_types[port->cap->type]);
+ return sprintf(buf, "[%s]\n", typec_port_power_roles[port->cap->type]);
}
static DEVICE_ATTR_RW(port_type);
@@ -1252,6 +1258,50 @@ void typec_set_pwr_opmode(struct typec_port *port,
}
EXPORT_SYMBOL_GPL(typec_set_pwr_opmode);
+/**
+ * typec_find_port_power_role - Get the typec port power capability
+ * @name: port power capability string
+ *
+ * This routine is used to find the typec_port_type by its string name.
+ *
+ * Returns typec_port_type if success, otherwise negative error code.
+ */
+int typec_find_port_power_role(const char *name)
+{
+ return match_string(typec_port_power_roles,
+ ARRAY_SIZE(typec_port_power_roles), name);
+}
+EXPORT_SYMBOL_GPL(typec_find_port_power_role);
+
+/**
+ * typec_find_power_role - Find the typec one specific power role
+ * @name: power role string
+ *
+ * This routine is used to find the typec_role by its string name.
+ *
+ * Returns typec_role if success, otherwise negative error code.
+ */
+int typec_find_power_role(const char *name)
+{
+ return match_string(typec_roles, ARRAY_SIZE(typec_roles), name);
+}
+EXPORT_SYMBOL_GPL(typec_find_power_role);
+
+/**
+ * typec_find_port_data_role - Get the typec port data capability
+ * @name: port data capability string
+ *
+ * This routine is used to find the typec_port_data by its string name.
+ *
+ * Returns typec_port_data if success, otherwise negative error code.
+ */
+int typec_find_port_data_role(const char *name)
+{
+ return match_string(typec_port_data_roles,
+ ARRAY_SIZE(typec_port_data_roles), name);
+}
+EXPORT_SYMBOL_GPL(typec_find_port_data_role);
+
/* ------------------------------------------ */
/* API for Multiplexer/DeMultiplexer Switches */
diff --git a/include/linux/usb/typec.h b/include/linux/usb/typec.h
index 672b39b..15f8d9a 100644
--- a/include/linux/usb/typec.h
+++ b/include/linux/usb/typec.h
@@ -267,4 +267,7 @@ int typec_set_orientation(struct typec_port *port,
enum typec_orientation orientation);
int typec_set_mode(struct typec_port *port, int mode);
+int typec_find_port_power_role(const char *name);
+int typec_find_power_role(const char *name);
+int typec_find_port_data_role(const char *name);
#endif /* __LINUX_USB_TYPEC_H */
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* Re: [PATCH v7 05/14] usb: typec: add API to get typec basic port power and data config
2018-06-25 8:08 ` [PATCH v7 05/14] usb: typec: add API to get typec basic port power and data config Li Jun
@ 2018-06-26 8:14 ` Heikki Krogerus
0 siblings, 0 replies; 18+ messages in thread
From: Heikki Krogerus @ 2018-06-26 8:14 UTC (permalink / raw)
To: Li Jun
Cc: robh+dt, gregkh, linux, a.hajda, cw00.choi, shufan_lee,
peter.chen, devicetree, linux-usb, linux-imx
On Mon, Jun 25, 2018 at 04:08:37PM +0800, Li Jun wrote:
> This patch adds 3 APIs to get the typec port power and data type,
> and preferred power role by its name string.
>
> Signed-off-by: Li Jun <jun.li@nxp.com>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> ---
> drivers/usb/typec/class.c | 58 +++++++++++++++++++++++++++++++++++++++++++----
> include/linux/usb/typec.h | 3 +++
> 2 files changed, 57 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c
> index 53df10d..6331059 100644
> --- a/drivers/usb/typec/class.c
> +++ b/drivers/usb/typec/class.c
> @@ -796,12 +796,18 @@ static const char * const typec_data_roles[] = {
> [TYPEC_HOST] = "host",
> };
>
> -static const char * const typec_port_types[] = {
> +static const char * const typec_port_power_roles[] = {
> [TYPEC_PORT_SRC] = "source",
> [TYPEC_PORT_SNK] = "sink",
> [TYPEC_PORT_DRP] = "dual",
> };
>
> +static const char * const typec_port_data_roles[] = {
> + [TYPEC_PORT_DFP] = "host",
> + [TYPEC_PORT_UFP] = "device",
> + [TYPEC_PORT_DRD] = "dual",
> +};
> +
> static const char * const typec_port_types_drp[] = {
> [TYPEC_PORT_SRC] = "dual [source] sink",
> [TYPEC_PORT_SNK] = "dual source [sink]",
> @@ -932,7 +938,7 @@ static ssize_t power_role_store(struct device *dev,
> mutex_lock(&port->port_type_lock);
> if (port->port_type != TYPEC_PORT_DRP) {
> dev_dbg(dev, "port type fixed at \"%s\"",
> - typec_port_types[port->port_type]);
> + typec_port_power_roles[port->port_type]);
> ret = -EOPNOTSUPP;
> goto unlock_and_ret;
> }
> @@ -973,7 +979,7 @@ port_type_store(struct device *dev, struct device_attribute *attr,
> return -EOPNOTSUPP;
> }
>
> - ret = sysfs_match_string(typec_port_types, buf);
> + ret = sysfs_match_string(typec_port_power_roles, buf);
> if (ret < 0)
> return ret;
>
> @@ -1007,7 +1013,7 @@ port_type_show(struct device *dev, struct device_attribute *attr,
> return sprintf(buf, "%s\n",
> typec_port_types_drp[port->port_type]);
>
> - return sprintf(buf, "[%s]\n", typec_port_types[port->cap->type]);
> + return sprintf(buf, "[%s]\n", typec_port_power_roles[port->cap->type]);
> }
> static DEVICE_ATTR_RW(port_type);
>
> @@ -1252,6 +1258,50 @@ void typec_set_pwr_opmode(struct typec_port *port,
> }
> EXPORT_SYMBOL_GPL(typec_set_pwr_opmode);
>
> +/**
> + * typec_find_port_power_role - Get the typec port power capability
> + * @name: port power capability string
> + *
> + * This routine is used to find the typec_port_type by its string name.
> + *
> + * Returns typec_port_type if success, otherwise negative error code.
> + */
> +int typec_find_port_power_role(const char *name)
> +{
> + return match_string(typec_port_power_roles,
> + ARRAY_SIZE(typec_port_power_roles), name);
> +}
> +EXPORT_SYMBOL_GPL(typec_find_port_power_role);
> +
> +/**
> + * typec_find_power_role - Find the typec one specific power role
> + * @name: power role string
> + *
> + * This routine is used to find the typec_role by its string name.
> + *
> + * Returns typec_role if success, otherwise negative error code.
> + */
> +int typec_find_power_role(const char *name)
> +{
> + return match_string(typec_roles, ARRAY_SIZE(typec_roles), name);
> +}
> +EXPORT_SYMBOL_GPL(typec_find_power_role);
> +
> +/**
> + * typec_find_port_data_role - Get the typec port data capability
> + * @name: port data capability string
> + *
> + * This routine is used to find the typec_port_data by its string name.
> + *
> + * Returns typec_port_data if success, otherwise negative error code.
> + */
> +int typec_find_port_data_role(const char *name)
> +{
> + return match_string(typec_port_data_roles,
> + ARRAY_SIZE(typec_port_data_roles), name);
> +}
> +EXPORT_SYMBOL_GPL(typec_find_port_data_role);
> +
> /* ------------------------------------------ */
> /* API for Multiplexer/DeMultiplexer Switches */
>
> diff --git a/include/linux/usb/typec.h b/include/linux/usb/typec.h
> index 672b39b..15f8d9a 100644
> --- a/include/linux/usb/typec.h
> +++ b/include/linux/usb/typec.h
> @@ -267,4 +267,7 @@ int typec_set_orientation(struct typec_port *port,
> enum typec_orientation orientation);
> int typec_set_mode(struct typec_port *port, int mode);
>
> +int typec_find_port_power_role(const char *name);
> +int typec_find_power_role(const char *name);
> +int typec_find_port_data_role(const char *name);
> #endif /* __LINUX_USB_TYPEC_H */
Thanks,
--
heikki
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v7 06/14] usb: typec: tcpm: support get typec and pd config from device properties
2018-06-25 8:08 [PATCH v7 00/14] staging: typec: tcpci: move out of staging Li Jun
` (4 preceding siblings ...)
2018-06-25 8:08 ` [PATCH v7 05/14] usb: typec: add API to get typec basic port power and data config Li Jun
@ 2018-06-25 8:08 ` Li Jun
2018-06-25 10:45 ` Adam Thomson
2018-06-25 8:08 ` [PATCH v7 07/14] staging: typec: tcpci: remove unused tcpci_tcpc_config Li Jun
` (7 subsequent siblings)
13 siblings, 1 reply; 18+ messages in thread
From: Li Jun @ 2018-06-25 8:08 UTC (permalink / raw)
To: robh+dt, gregkh, heikki.krogerus, linux
Cc: a.hajda, jun.li, cw00.choi, shufan_lee, peter.chen, devicetree,
linux-usb, linux-imx
This patch adds support of get typec and power delivery config from
firmware description.
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Li Jun <jun.li@nxp.com>
---
drivers/usb/typec/tcpm.c | 132 +++++++++++++++++++++++++++++++++++++++--------
1 file changed, 110 insertions(+), 22 deletions(-)
diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c
index d22b37b..0454654 100644
--- a/drivers/usb/typec/tcpm.c
+++ b/drivers/usb/typec/tcpm.c
@@ -4236,6 +4236,81 @@ static int tcpm_copy_vdos(u32 *dest_vdo, const u32 *src_vdo,
return nr_vdo;
}
+static int tcpm_fw_get_caps(struct tcpm_port *port,
+ struct fwnode_handle *fwnode)
+{
+ const char *cap_str;
+ int ret;
+ u32 mw;
+
+ if (!fwnode)
+ return -EINVAL;
+
+ /* USB data support is optional */
+ ret = fwnode_property_read_string(fwnode, "data-role", &cap_str);
+ if (ret == 0) {
+ port->typec_caps.data = typec_find_port_data_role(cap_str);
+ if (port->typec_caps.data < 0)
+ return -EINVAL;
+ }
+
+ ret = fwnode_property_read_string(fwnode, "power-role", &cap_str);
+ if (ret < 0)
+ return ret;
+
+ port->typec_caps.type = typec_find_port_power_role(cap_str);
+ if (port->typec_caps.type < 0)
+ return -EINVAL;
+ port->port_type = port->typec_caps.type;
+
+ if (port->port_type == TYPEC_PORT_SNK)
+ goto sink;
+
+ /* Get source pdos */
+ ret = fwnode_property_read_u32_array(fwnode, "source-pdos",
+ NULL, 0);
+ if (ret <= 0)
+ return -EINVAL;
+
+ port->nr_src_pdo = min(ret, PDO_MAX_OBJECTS);
+ ret = fwnode_property_read_u32_array(fwnode, "source-pdos",
+ port->src_pdo, port->nr_src_pdo);
+ if ((ret < 0) || tcpm_validate_caps(port, port->src_pdo,
+ port->nr_src_pdo))
+ return -EINVAL;
+
+ if (port->port_type == TYPEC_PORT_SRC)
+ return 0;
+
+ /* Get the preferred power role for DRP */
+ ret = fwnode_property_read_string(fwnode, "try-power-role", &cap_str);
+ if (ret < 0)
+ return ret;
+
+ port->typec_caps.prefer_role = typec_find_power_role(cap_str);
+ if (port->typec_caps.prefer_role < 0)
+ return -EINVAL;
+sink:
+ /* Get sink pdos */
+ ret = fwnode_property_read_u32_array(fwnode, "sink-pdos",
+ NULL, 0);
+ if (ret <= 0)
+ return -EINVAL;
+
+ port->nr_snk_pdo = min(ret, PDO_MAX_OBJECTS);
+ ret = fwnode_property_read_u32_array(fwnode, "sink-pdos",
+ port->snk_pdo, port->nr_snk_pdo);
+ if ((ret < 0) || tcpm_validate_caps(port, port->snk_pdo,
+ port->nr_snk_pdo))
+ return -EINVAL;
+
+ if (fwnode_property_read_u32(fwnode, "op-sink-microwatt", &mw) < 0)
+ return -EINVAL;
+ port->operating_snk_mw = mw / 1000;
+
+ return 0;
+}
+
int tcpm_update_source_capabilities(struct tcpm_port *port, const u32 *pdo,
unsigned int nr_pdo)
{
@@ -4521,12 +4596,36 @@ static int devm_tcpm_psy_register(struct tcpm_port *port)
return PTR_ERR_OR_ZERO(port->psy);
}
+static int tcpm_copy_caps(struct tcpm_port *port,
+ const struct tcpc_config *tcfg)
+{
+ if (tcpm_validate_caps(port, tcfg->src_pdo, tcfg->nr_src_pdo) ||
+ tcpm_validate_caps(port, tcfg->snk_pdo, tcfg->nr_snk_pdo))
+ return -EINVAL;
+
+ port->nr_src_pdo = tcpm_copy_pdos(port->src_pdo, tcfg->src_pdo,
+ tcfg->nr_src_pdo);
+ port->nr_snk_pdo = tcpm_copy_pdos(port->snk_pdo, tcfg->snk_pdo,
+ tcfg->nr_snk_pdo);
+
+ port->nr_snk_vdo = tcpm_copy_vdos(port->snk_vdo, tcfg->snk_vdo,
+ tcfg->nr_snk_vdo);
+
+ port->operating_snk_mw = tcfg->operating_snk_mw;
+
+ port->typec_caps.prefer_role = tcfg->default_role;
+ port->typec_caps.type = tcfg->type;
+ port->typec_caps.data = tcfg->data;
+
+ return 0;
+}
+
struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
{
struct tcpm_port *port;
int i, err;
- if (!dev || !tcpc || !tcpc->config ||
+ if (!dev || !tcpc ||
!tcpc->get_vbus || !tcpc->set_cc || !tcpc->get_cc ||
!tcpc->set_polarity || !tcpc->set_vconn || !tcpc->set_vbus ||
!tcpc->set_pd_rx || !tcpc->set_roles || !tcpc->pd_transmit)
@@ -4556,30 +4655,19 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
init_completion(&port->pps_complete);
tcpm_debugfs_init(port);
- if (tcpm_validate_caps(port, tcpc->config->src_pdo,
- tcpc->config->nr_src_pdo) ||
- tcpm_validate_caps(port, tcpc->config->snk_pdo,
- tcpc->config->nr_snk_pdo)) {
- err = -EINVAL;
+ if (tcpc->config)
+ err = tcpm_copy_caps(port, tcpc->config);
+ else
+ err = tcpm_fw_get_caps(port, tcpc->fwnode);
+ if (err < 0)
goto out_destroy_wq;
- }
- port->nr_src_pdo = tcpm_copy_pdos(port->src_pdo, tcpc->config->src_pdo,
- tcpc->config->nr_src_pdo);
- port->nr_snk_pdo = tcpm_copy_pdos(port->snk_pdo, tcpc->config->snk_pdo,
- tcpc->config->nr_snk_pdo);
- port->nr_snk_vdo = tcpm_copy_vdos(port->snk_vdo, tcpc->config->snk_vdo,
- tcpc->config->nr_snk_vdo);
-
- port->operating_snk_mw = tcpc->config->operating_snk_mw;
- if (!tcpc->config->try_role_hw)
- port->try_role = tcpc->config->default_role;
+
+ if (!tcpc->config || !tcpc->config->try_role_hw)
+ port->try_role = port->typec_caps.prefer_role;
else
port->try_role = TYPEC_NO_PREFERRED_ROLE;
port->typec_caps.fwnode = tcpc->fwnode;
- port->typec_caps.prefer_role = tcpc->config->default_role;
- port->typec_caps.type = tcpc->config->type;
- port->typec_caps.data = tcpc->config->data;
port->typec_caps.revision = 0x0120; /* Type-C spec release 1.2 */
port->typec_caps.pd_revision = 0x0300; /* USB-PD spec release 3.0 */
port->typec_caps.dr_set = tcpm_dr_set;
@@ -4589,7 +4677,7 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
port->typec_caps.port_type_set = tcpm_port_type_set;
port->partner_desc.identity = &port->partner_ident;
- port->port_type = tcpc->config->type;
+ port->port_type = port->typec_caps.type;
port->role_sw = usb_role_switch_get(port->dev);
if (IS_ERR(port->role_sw)) {
@@ -4607,7 +4695,7 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
goto out_destroy_wq;
}
- if (tcpc->config->alt_modes) {
+ if (tcpc->config && tcpc->config->alt_modes) {
const struct typec_altmode_desc *paltmode = tcpc->config->alt_modes;
i = 0;
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* RE: [PATCH v7 06/14] usb: typec: tcpm: support get typec and pd config from device properties
2018-06-25 8:08 ` [PATCH v7 06/14] usb: typec: tcpm: support get typec and pd config from device properties Li Jun
@ 2018-06-25 10:45 ` Adam Thomson
2018-06-26 15:01 ` Jun Li
0 siblings, 1 reply; 18+ messages in thread
From: Adam Thomson @ 2018-06-25 10:45 UTC (permalink / raw)
To: Li Jun, robh+dt@kernel.org, gregkh@linuxfoundation.org,
heikki.krogerus@linux.intel.com, linux@roeck-us.net
Cc: a.hajda@samsung.com, cw00.choi@samsung.com,
shufan_lee@richtek.com, peter.chen@nxp.com,
devicetree@vger.kernel.org, linux-usb@vger.kernel.org,
linux-imx@nxp.com
On 25 June 2018 09:09, Li Jun wrote:
> This patch adds support of get typec and power delivery config from
> firmware description.
>
> Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> Reviewed-by: Guenter Roeck <linux@roeck-us.net>
> Signed-off-by: Li Jun <jun.li@nxp.com>
> ---
> drivers/usb/typec/tcpm.c | 132 +++++++++++++++++++++++++++++++++++++++-----
> ---
> 1 file changed, 110 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c
> index d22b37b..0454654 100644
> --- a/drivers/usb/typec/tcpm.c
> +++ b/drivers/usb/typec/tcpm.c
> @@ -4236,6 +4236,81 @@ static int tcpm_copy_vdos(u32 *dest_vdo, const u32
> *src_vdo,
> return nr_vdo;
> }
...
> struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
> {
> struct tcpm_port *port;
> int i, err;
>
> - if (!dev || !tcpc || !tcpc->config ||
> + if (!dev || !tcpc ||
> !tcpc->get_vbus || !tcpc->set_cc || !tcpc->get_cc ||
> !tcpc->set_polarity || !tcpc->set_vconn || !tcpc->set_vbus ||
> !tcpc->set_pd_rx || !tcpc->set_roles || !tcpc->pd_transmit)
> @@ -4556,30 +4655,19 @@ struct tcpm_port *tcpm_register_port(struct device
> *dev, struct tcpc_dev *tcpc)
> init_completion(&port->pps_complete);
> tcpm_debugfs_init(port);
>
> - if (tcpm_validate_caps(port, tcpc->config->src_pdo,
> - tcpc->config->nr_src_pdo) ||
> - tcpm_validate_caps(port, tcpc->config->snk_pdo,
> - tcpc->config->nr_snk_pdo)) {
> - err = -EINVAL;
> + if (tcpc->config)
> + err = tcpm_copy_caps(port, tcpc->config);
> + else
> + err = tcpm_fw_get_caps(port, tcpc->fwnode);
> + if (err < 0)
Should we not be favouring the generic FW based capabilities over values defined
in a Type C port controller driver, if the FW config is present? For example
fusb302 driver has a hard coded config so that would always be selected rather
than the FW based config, unless I'm missing something obvious?
^ permalink raw reply [flat|nested] 18+ messages in thread* RE: [PATCH v7 06/14] usb: typec: tcpm: support get typec and pd config from device properties
2018-06-25 10:45 ` Adam Thomson
@ 2018-06-26 15:01 ` Jun Li
0 siblings, 0 replies; 18+ messages in thread
From: Jun Li @ 2018-06-26 15:01 UTC (permalink / raw)
To: Adam Thomson, robh+dt@kernel.org, gregkh@linuxfoundation.org,
heikki.krogerus@linux.intel.com, linux@roeck-us.net
Cc: a.hajda@samsung.com, cw00.choi@samsung.com,
shufan_lee@richtek.com, Peter Chen, devicetree@vger.kernel.org,
linux-usb@vger.kernel.org, dl-linux-imx
Hi
> -----Original Message-----
> From: Adam Thomson [mailto:Adam.Thomson.Opensource@diasemi.com]
> Sent: 2018年6月25日 18:46
> To: Jun Li <jun.li@nxp.com>; robh+dt@kernel.org; gregkh@linuxfoundation.org;
> heikki.krogerus@linux.intel.com; linux@roeck-us.net
> Cc: a.hajda@samsung.com; cw00.choi@samsung.com; shufan_lee@richtek.com;
> Peter Chen <peter.chen@nxp.com>; devicetree@vger.kernel.org;
> linux-usb@vger.kernel.org; dl-linux-imx <linux-imx@nxp.com>
> Subject: RE: [PATCH v7 06/14] usb: typec: tcpm: support get typec and pd config
> from device properties
>
> On 25 June 2018 09:09, Li Jun wrote:
>
> > This patch adds support of get typec and power delivery config from
> > firmware description.
> >
> > Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> > Reviewed-by: Guenter Roeck <linux@roeck-us.net>
> > Signed-off-by: Li Jun <jun.li@nxp.com>
> > ---
> > drivers/usb/typec/tcpm.c | 132
> > +++++++++++++++++++++++++++++++++++++++-----
> > ---
> > 1 file changed, 110 insertions(+), 22 deletions(-)
> >
> > diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c index
> > d22b37b..0454654 100644
> > --- a/drivers/usb/typec/tcpm.c
> > +++ b/drivers/usb/typec/tcpm.c
> > @@ -4236,6 +4236,81 @@ static int tcpm_copy_vdos(u32 *dest_vdo, const
> > u32 *src_vdo,
> > return nr_vdo;
> > }
>
> ...
>
> > struct tcpm_port *tcpm_register_port(struct device *dev, struct
> > tcpc_dev *tcpc) {
> > struct tcpm_port *port;
> > int i, err;
> >
> > - if (!dev || !tcpc || !tcpc->config ||
> > + if (!dev || !tcpc ||
> > !tcpc->get_vbus || !tcpc->set_cc || !tcpc->get_cc ||
> > !tcpc->set_polarity || !tcpc->set_vconn || !tcpc->set_vbus ||
> > !tcpc->set_pd_rx || !tcpc->set_roles || !tcpc->pd_transmit) @@
> > -4556,30 +4655,19 @@ struct tcpm_port *tcpm_register_port(struct
> > device *dev, struct tcpc_dev *tcpc)
> > init_completion(&port->pps_complete);
> > tcpm_debugfs_init(port);
> >
> > - if (tcpm_validate_caps(port, tcpc->config->src_pdo,
> > - tcpc->config->nr_src_pdo) ||
> > - tcpm_validate_caps(port, tcpc->config->snk_pdo,
> > - tcpc->config->nr_snk_pdo)) {
> > - err = -EINVAL;
> > + if (tcpc->config)
> > + err = tcpm_copy_caps(port, tcpc->config);
> > + else
> > + err = tcpm_fw_get_caps(port, tcpc->fwnode);
> > + if (err < 0)
>
> Should we not be favouring the generic FW based capabilities over values
> defined in a Type C port controller driver, if the FW config is present? For
> example
> fusb302 driver has a hard coded config so that would always be selected rather
> than the FW based config, unless I'm missing something obvious?
You are right, I will change it to be below:
err = tcpm_fw_get_caps(port, tcpc->fwnode);
if ((err < 0) && tcpc->config)
err = tcpm_copy_caps(port, tcpc->config);
thanks
Jun
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v7 07/14] staging: typec: tcpci: remove unused tcpci_tcpc_config
2018-06-25 8:08 [PATCH v7 00/14] staging: typec: tcpci: move out of staging Li Jun
` (5 preceding siblings ...)
2018-06-25 8:08 ` [PATCH v7 06/14] usb: typec: tcpm: support get typec and pd config from device properties Li Jun
@ 2018-06-25 8:08 ` Li Jun
2018-06-25 8:08 ` [PATCH v7 08/14] staging: typec: tcpci: use IS_ERR() instead of PTR_ERR_OR_ZERO() Li Jun
` (6 subsequent siblings)
13 siblings, 0 replies; 18+ messages in thread
From: Li Jun @ 2018-06-25 8:08 UTC (permalink / raw)
To: robh+dt, gregkh, heikki.krogerus, linux
Cc: a.hajda, jun.li, cw00.choi, shufan_lee, peter.chen, devicetree,
linux-usb, linux-imx
Since we will use config settings via device properties, so
remove the hard code tcpci_tcpc_config.
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Li Jun <jun.li@nxp.com>
---
drivers/staging/typec/tcpci.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/drivers/staging/typec/tcpci.c b/drivers/staging/typec/tcpci.c
index e59547a..076498a 100644
--- a/drivers/staging/typec/tcpci.c
+++ b/drivers/staging/typec/tcpci.c
@@ -464,17 +464,10 @@ static const struct regmap_config tcpci_regmap_config = {
.max_register = 0x7F, /* 0x80 .. 0xFF are vendor defined */
};
-static const struct tcpc_config tcpci_tcpc_config = {
- .type = TYPEC_PORT_DFP,
- .default_role = TYPEC_SINK,
-};
-
static int tcpci_parse_config(struct tcpci *tcpci)
{
tcpci->controls_vbus = true; /* XXX */
- /* TODO: Populate struct tcpc_config from ACPI/device-tree */
- tcpci->tcpc.config = &tcpci_tcpc_config;
tcpci->tcpc.fwnode = device_get_named_child_node(tcpci->dev,
"connector");
if (!tcpci->tcpc.fwnode) {
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v7 08/14] staging: typec: tcpci: use IS_ERR() instead of PTR_ERR_OR_ZERO()
2018-06-25 8:08 [PATCH v7 00/14] staging: typec: tcpci: move out of staging Li Jun
` (6 preceding siblings ...)
2018-06-25 8:08 ` [PATCH v7 07/14] staging: typec: tcpci: remove unused tcpci_tcpc_config Li Jun
@ 2018-06-25 8:08 ` Li Jun
2018-06-25 8:08 ` [PATCH v7 09/14] staging: typec: tcpci: register port before request irq Li Jun
` (5 subsequent siblings)
13 siblings, 0 replies; 18+ messages in thread
From: Li Jun @ 2018-06-25 8:08 UTC (permalink / raw)
To: robh+dt, gregkh, heikki.krogerus, linux
Cc: a.hajda, jun.li, cw00.choi, shufan_lee, peter.chen, devicetree,
linux-usb, linux-imx
As tcpm_register_port() and tcpci_register_port() never return
NULL and NULL is not a success in this case, use IS_ERR() to check
the return value of both.
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Li Jun <jun.li@nxp.com>
---
drivers/staging/typec/tcpci.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/staging/typec/tcpci.c b/drivers/staging/typec/tcpci.c
index 076498a..b63f147 100644
--- a/drivers/staging/typec/tcpci.c
+++ b/drivers/staging/typec/tcpci.c
@@ -509,7 +509,7 @@ struct tcpci *tcpci_register_port(struct device *dev, struct tcpci_data *data)
return ERR_PTR(err);
tcpci->port = tcpm_register_port(tcpci->dev, &tcpci->tcpc);
- if (PTR_ERR_OR_ZERO(tcpci->port))
+ if (IS_ERR(tcpci->port))
return ERR_CAST(tcpci->port);
return tcpci;
@@ -551,7 +551,7 @@ static int tcpci_probe(struct i2c_client *client,
return err;
chip->tcpci = tcpci_register_port(&client->dev, &chip->data);
- if (PTR_ERR_OR_ZERO(chip->tcpci))
+ if (IS_ERR(chip->tcpci))
return PTR_ERR(chip->tcpci);
i2c_set_clientdata(client, chip);
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v7 09/14] staging: typec: tcpci: register port before request irq
2018-06-25 8:08 [PATCH v7 00/14] staging: typec: tcpci: move out of staging Li Jun
` (7 preceding siblings ...)
2018-06-25 8:08 ` [PATCH v7 08/14] staging: typec: tcpci: use IS_ERR() instead of PTR_ERR_OR_ZERO() Li Jun
@ 2018-06-25 8:08 ` Li Jun
2018-06-25 8:08 ` [PATCH v7 10/14] staging: typec: tcpci: enable vbus detection Li Jun
` (4 subsequent siblings)
13 siblings, 0 replies; 18+ messages in thread
From: Li Jun @ 2018-06-25 8:08 UTC (permalink / raw)
To: robh+dt, gregkh, heikki.krogerus, linux
Cc: a.hajda, jun.li, cw00.choi, shufan_lee, peter.chen, devicetree,
linux-usb, linux-imx
From: Peter Chen <peter.chen@nxp.com>
With that we can clear any pending events and the port is registered
so driver can be ready to handle typec events once we request irq.
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Peter Chen <peter.chen@nxp.com>
Signed-off-by: Li Jun <jun.li@nxp.com>
---
drivers/staging/typec/tcpci.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/drivers/staging/typec/tcpci.c b/drivers/staging/typec/tcpci.c
index b63f147..3b35fce 100644
--- a/drivers/staging/typec/tcpci.c
+++ b/drivers/staging/typec/tcpci.c
@@ -537,24 +537,27 @@ static int tcpci_probe(struct i2c_client *client,
if (IS_ERR(chip->data.regmap))
return PTR_ERR(chip->data.regmap);
+ i2c_set_clientdata(client, chip);
+
/* Disable chip interrupts before requesting irq */
err = regmap_raw_write(chip->data.regmap, TCPC_ALERT_MASK, &val,
sizeof(u16));
if (err < 0)
return err;
+ chip->tcpci = tcpci_register_port(&client->dev, &chip->data);
+ if (IS_ERR(chip->tcpci))
+ return PTR_ERR(chip->tcpci);
+
err = devm_request_threaded_irq(&client->dev, client->irq, NULL,
_tcpci_irq,
IRQF_ONESHOT | IRQF_TRIGGER_LOW,
dev_name(&client->dev), chip);
- if (err < 0)
+ if (err < 0) {
+ tcpci_unregister_port(chip->tcpci);
return err;
+ }
- chip->tcpci = tcpci_register_port(&client->dev, &chip->data);
- if (IS_ERR(chip->tcpci))
- return PTR_ERR(chip->tcpci);
-
- i2c_set_clientdata(client, chip);
return 0;
}
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v7 10/14] staging: typec: tcpci: enable vbus detection
2018-06-25 8:08 [PATCH v7 00/14] staging: typec: tcpci: move out of staging Li Jun
` (8 preceding siblings ...)
2018-06-25 8:08 ` [PATCH v7 09/14] staging: typec: tcpci: register port before request irq Li Jun
@ 2018-06-25 8:08 ` Li Jun
2018-06-25 8:08 ` [PATCH v7 11/14] typec: tcpm: add starting value for drp toggling Li Jun
` (3 subsequent siblings)
13 siblings, 0 replies; 18+ messages in thread
From: Li Jun @ 2018-06-25 8:08 UTC (permalink / raw)
To: robh+dt, gregkh, heikki.krogerus, linux
Cc: a.hajda, jun.li, cw00.choi, shufan_lee, peter.chen, devicetree,
linux-usb, linux-imx
TCPCI implementation may need SW to enable VBUS detection to generate
power status events.
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Li Jun <jun.li@nxp.com>
---
drivers/staging/typec/tcpci.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/staging/typec/tcpci.c b/drivers/staging/typec/tcpci.c
index 3b35fce..4d3b0ae 100644
--- a/drivers/staging/typec/tcpci.c
+++ b/drivers/staging/typec/tcpci.c
@@ -373,6 +373,12 @@ static int tcpci_init(struct tcpc_dev *tcpc)
if (ret < 0)
return ret;
+ /* Enable Vbus detection */
+ ret = regmap_write(tcpci->regmap, TCPC_COMMAND,
+ TCPC_CMD_ENABLE_VBUS_DETECT);
+ if (ret < 0)
+ return ret;
+
reg = TCPC_ALERT_TX_SUCCESS | TCPC_ALERT_TX_FAILED |
TCPC_ALERT_TX_DISCARDED | TCPC_ALERT_RX_STATUS |
TCPC_ALERT_RX_HARD_RST | TCPC_ALERT_CC_STATUS;
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v7 11/14] typec: tcpm: add starting value for drp toggling
2018-06-25 8:08 [PATCH v7 00/14] staging: typec: tcpci: move out of staging Li Jun
` (9 preceding siblings ...)
2018-06-25 8:08 ` [PATCH v7 10/14] staging: typec: tcpci: enable vbus detection Li Jun
@ 2018-06-25 8:08 ` Li Jun
2018-06-25 8:08 ` [PATCH v7 12/14] staging: typec: tcpci: keep the disconnected cc line open Li Jun
` (2 subsequent siblings)
13 siblings, 0 replies; 18+ messages in thread
From: Li Jun @ 2018-06-25 8:08 UTC (permalink / raw)
To: robh+dt, gregkh, heikki.krogerus, linux
Cc: a.hajda, jun.li, cw00.choi, shufan_lee, peter.chen, devicetree,
linux-usb, linux-imx
As DRP port autonomously toggles the Rp/Rd need a start value to
begin with, so add one parameter for it in tcpm_start_drp_toggling.
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Li Jun <jun.li@nxp.com>
---
drivers/usb/typec/tcpm.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c
index 0454654..c80f1a4 100644
--- a/drivers/usb/typec/tcpm.c
+++ b/drivers/usb/typec/tcpm.c
@@ -2431,15 +2431,15 @@ static int tcpm_set_charge(struct tcpm_port *port, bool charge)
return 0;
}
-static bool tcpm_start_drp_toggling(struct tcpm_port *port)
+static bool tcpm_start_drp_toggling(struct tcpm_port *port,
+ enum typec_cc_status cc)
{
int ret;
if (port->tcpc->start_drp_toggling &&
port->port_type == TYPEC_PORT_DRP) {
tcpm_log_force(port, "Start DRP toggling");
- ret = port->tcpc->start_drp_toggling(port->tcpc,
- tcpm_rp_cc(port));
+ ret = port->tcpc->start_drp_toggling(port->tcpc, cc);
if (!ret)
return true;
}
@@ -2747,7 +2747,7 @@ static void run_state_machine(struct tcpm_port *port)
if (!port->non_pd_role_swap)
tcpm_swap_complete(port, -ENOTCONN);
tcpm_src_detach(port);
- if (tcpm_start_drp_toggling(port)) {
+ if (tcpm_start_drp_toggling(port, tcpm_rp_cc(port))) {
tcpm_set_state(port, DRP_TOGGLING, 0);
break;
}
@@ -2922,7 +2922,7 @@ static void run_state_machine(struct tcpm_port *port)
tcpm_swap_complete(port, -ENOTCONN);
tcpm_pps_complete(port, -ENOTCONN);
tcpm_snk_detach(port);
- if (tcpm_start_drp_toggling(port)) {
+ if (tcpm_start_drp_toggling(port, TYPEC_CC_RD)) {
tcpm_set_state(port, DRP_TOGGLING, 0);
break;
}
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v7 12/14] staging: typec: tcpci: keep the disconnected cc line open
2018-06-25 8:08 [PATCH v7 00/14] staging: typec: tcpci: move out of staging Li Jun
` (10 preceding siblings ...)
2018-06-25 8:08 ` [PATCH v7 11/14] typec: tcpm: add starting value for drp toggling Li Jun
@ 2018-06-25 8:08 ` Li Jun
2018-06-25 8:08 ` [PATCH v7 13/14] staging: typec: tcpci: Only touch target bit when enable vconn Li Jun
2018-06-25 8:08 ` [PATCH v7 14/14] staging: typec: tcpci: move tcpci drivers out of staging Li Jun
13 siblings, 0 replies; 18+ messages in thread
From: Li Jun @ 2018-06-25 8:08 UTC (permalink / raw)
To: robh+dt, gregkh, heikki.krogerus, linux
Cc: a.hajda, jun.li, cw00.choi, shufan_lee, peter.chen, devicetree,
linux-usb, linux-imx
While set polarity, we should keep the disconnected cc line to be
open.
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Li Jun <jun.li@nxp.com>
---
drivers/staging/typec/tcpci.c | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/drivers/staging/typec/tcpci.c b/drivers/staging/typec/tcpci.c
index 4d3b0ae..11c2d37 100644
--- a/drivers/staging/typec/tcpci.c
+++ b/drivers/staging/typec/tcpci.c
@@ -185,15 +185,25 @@ static int tcpci_set_polarity(struct tcpc_dev *tcpc,
enum typec_cc_polarity polarity)
{
struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
+ unsigned int reg;
int ret;
- ret = regmap_write(tcpci->regmap, TCPC_TCPC_CTRL,
- (polarity == TYPEC_POLARITY_CC2) ?
- TCPC_TCPC_CTRL_ORIENTATION : 0);
+ /* Keep the disconnect cc line open */
+ ret = regmap_read(tcpci->regmap, TCPC_ROLE_CTRL, ®);
if (ret < 0)
return ret;
- return 0;
+ if (polarity == TYPEC_POLARITY_CC2)
+ reg |= TCPC_ROLE_CTRL_CC_OPEN << TCPC_ROLE_CTRL_CC1_SHIFT;
+ else
+ reg |= TCPC_ROLE_CTRL_CC_OPEN << TCPC_ROLE_CTRL_CC2_SHIFT;
+ ret = regmap_write(tcpci->regmap, TCPC_ROLE_CTRL, reg);
+ if (ret < 0)
+ return ret;
+
+ return regmap_write(tcpci->regmap, TCPC_TCPC_CTRL,
+ (polarity == TYPEC_POLARITY_CC2) ?
+ TCPC_TCPC_CTRL_ORIENTATION : 0);
}
static int tcpci_set_vconn(struct tcpc_dev *tcpc, bool enable)
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v7 13/14] staging: typec: tcpci: Only touch target bit when enable vconn
2018-06-25 8:08 [PATCH v7 00/14] staging: typec: tcpci: move out of staging Li Jun
` (11 preceding siblings ...)
2018-06-25 8:08 ` [PATCH v7 12/14] staging: typec: tcpci: keep the disconnected cc line open Li Jun
@ 2018-06-25 8:08 ` Li Jun
2018-06-25 8:08 ` [PATCH v7 14/14] staging: typec: tcpci: move tcpci drivers out of staging Li Jun
13 siblings, 0 replies; 18+ messages in thread
From: Li Jun @ 2018-06-25 8:08 UTC (permalink / raw)
To: robh+dt, gregkh, heikki.krogerus, linux
Cc: a.hajda, jun.li, cw00.choi, shufan_lee, peter.chen, devicetree,
linux-usb, linux-imx
We need regmap_update_bits to avoid touch any other bits when
enable or disable vconn.
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Li Jun <jun.li@nxp.com>
---
drivers/staging/typec/tcpci.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/drivers/staging/typec/tcpci.c b/drivers/staging/typec/tcpci.c
index 11c2d37..ac6b418 100644
--- a/drivers/staging/typec/tcpci.c
+++ b/drivers/staging/typec/tcpci.c
@@ -218,12 +218,9 @@ static int tcpci_set_vconn(struct tcpc_dev *tcpc, bool enable)
return ret;
}
- ret = regmap_write(tcpci->regmap, TCPC_POWER_CTRL,
- enable ? TCPC_POWER_CTRL_VCONN_ENABLE : 0);
- if (ret < 0)
- return ret;
-
- return 0;
+ return regmap_update_bits(tcpci->regmap, TCPC_POWER_CTRL,
+ TCPC_POWER_CTRL_VCONN_ENABLE,
+ enable ? TCPC_POWER_CTRL_VCONN_ENABLE : 0);
}
static int tcpci_set_roles(struct tcpc_dev *tcpc, bool attached,
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread* [PATCH v7 14/14] staging: typec: tcpci: move tcpci drivers out of staging
2018-06-25 8:08 [PATCH v7 00/14] staging: typec: tcpci: move out of staging Li Jun
` (12 preceding siblings ...)
2018-06-25 8:08 ` [PATCH v7 13/14] staging: typec: tcpci: Only touch target bit when enable vconn Li Jun
@ 2018-06-25 8:08 ` Li Jun
13 siblings, 0 replies; 18+ messages in thread
From: Li Jun @ 2018-06-25 8:08 UTC (permalink / raw)
To: robh+dt, gregkh, heikki.krogerus, linux
Cc: a.hajda, jun.li, cw00.choi, shufan_lee, peter.chen, devicetree,
linux-usb, linux-imx
Move TCPCI(Typec port controller interface) driver and rt1711h
driver out of staging.
Signed-off-by: Li Jun <jun.li@nxp.com>
---
drivers/staging/Kconfig | 2 --
drivers/staging/Makefile | 1 -
drivers/staging/typec/Kconfig | 22 ----------------------
drivers/staging/typec/Makefile | 2 --
drivers/staging/typec/TODO | 5 -----
drivers/usb/typec/Kconfig | 15 +++++++++++++++
drivers/usb/typec/Makefile | 2 ++
drivers/{staging => usb}/typec/tcpci.c | 0
drivers/{staging => usb}/typec/tcpci.h | 0
drivers/{staging => usb}/typec/tcpci_rt1711h.c | 0
10 files changed, 17 insertions(+), 32 deletions(-)
diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig
index 75a4804..af9a82f 100644
--- a/drivers/staging/Kconfig
+++ b/drivers/staging/Kconfig
@@ -106,8 +106,6 @@ source "drivers/staging/greybus/Kconfig"
source "drivers/staging/vc04_services/Kconfig"
-source "drivers/staging/typec/Kconfig"
-
source "drivers/staging/vboxvideo/Kconfig"
source "drivers/staging/pi433/Kconfig"
diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile
index e84959a..8479d47 100644
--- a/drivers/staging/Makefile
+++ b/drivers/staging/Makefile
@@ -2,7 +2,6 @@
# Makefile for staging directory
obj-y += media/
-obj-y += typec/
obj-$(CONFIG_PRISM2_USB) += wlan-ng/
obj-$(CONFIG_COMEDI) += comedi/
obj-$(CONFIG_FB_OLPC_DCON) += olpc_dcon/
diff --git a/drivers/staging/typec/Kconfig b/drivers/staging/typec/Kconfig
deleted file mode 100644
index 3aa981f..0000000
--- a/drivers/staging/typec/Kconfig
+++ /dev/null
@@ -1,22 +0,0 @@
-menu "USB Power Delivery and Type-C drivers"
-
-if TYPEC_TCPM
-
-config TYPEC_TCPCI
- tristate "Type-C Port Controller Interface driver"
- depends on I2C
- select REGMAP_I2C
- help
- Type-C Port Controller driver for TCPCI-compliant controller.
-
-config TYPEC_RT1711H
- tristate "Richtek RT1711H Type-C chip driver"
- select TYPEC_TCPCI
- help
- Richtek RT1711H Type-C chip driver that works with
- Type-C Port Controller Manager to provide USB PD and USB
- Type-C functionalities.
-
-endif
-
-endmenu
diff --git a/drivers/staging/typec/Makefile b/drivers/staging/typec/Makefile
deleted file mode 100644
index 7803d48..0000000
--- a/drivers/staging/typec/Makefile
+++ /dev/null
@@ -1,2 +0,0 @@
-obj-$(CONFIG_TYPEC_TCPCI) += tcpci.o
-obj-$(CONFIG_TYPEC_RT1711H) += tcpci_rt1711h.o
diff --git a/drivers/staging/typec/TODO b/drivers/staging/typec/TODO
deleted file mode 100644
index 53fe2f7..0000000
--- a/drivers/staging/typec/TODO
+++ /dev/null
@@ -1,5 +0,0 @@
-tcpci:
-- Test with real hardware
-
-Please send patches to Guenter Roeck <linux@roeck-us.net> and copy
-Heikki Krogerus <heikki.krogerus@linux.intel.com>.
diff --git a/drivers/usb/typec/Kconfig b/drivers/usb/typec/Kconfig
index 2c8eab1..972fd19 100644
--- a/drivers/usb/typec/Kconfig
+++ b/drivers/usb/typec/Kconfig
@@ -56,6 +56,21 @@ config TYPEC_TCPM
if TYPEC_TCPM
+config TYPEC_TCPCI
+ tristate "Type-C Port Controller Interface driver"
+ depends on I2C
+ select REGMAP_I2C
+ help
+ Type-C Port Controller driver for TCPCI-compliant controller.
+
+config TYPEC_RT1711H
+ tristate "Richtek RT1711H Type-C chip driver"
+ select TYPEC_TCPCI
+ help
+ Richtek RT1711H Type-C chip driver that works with
+ Type-C Port Controller Manager to provide USB PD and USB
+ Type-C functionalities.
+
source "drivers/usb/typec/fusb302/Kconfig"
config TYPEC_WCOVE
diff --git a/drivers/usb/typec/Makefile b/drivers/usb/typec/Makefile
index 1f599a6..46f86ee 100644
--- a/drivers/usb/typec/Makefile
+++ b/drivers/usb/typec/Makefile
@@ -7,3 +7,5 @@ obj-$(CONFIG_TYPEC_WCOVE) += typec_wcove.o
obj-$(CONFIG_TYPEC_UCSI) += ucsi/
obj-$(CONFIG_TYPEC_TPS6598X) += tps6598x.o
obj-$(CONFIG_TYPEC) += mux/
+obj-$(CONFIG_TYPEC_TCPCI) += tcpci.o
+obj-$(CONFIG_TYPEC_RT1711H) += tcpci_rt1711h.o
diff --git a/drivers/staging/typec/tcpci.c b/drivers/usb/typec/tcpci.c
similarity index 100%
rename from drivers/staging/typec/tcpci.c
rename to drivers/usb/typec/tcpci.c
diff --git a/drivers/staging/typec/tcpci.h b/drivers/usb/typec/tcpci.h
similarity index 100%
rename from drivers/staging/typec/tcpci.h
rename to drivers/usb/typec/tcpci.h
diff --git a/drivers/staging/typec/tcpci_rt1711h.c b/drivers/usb/typec/tcpci_rt1711h.c
similarity index 100%
rename from drivers/staging/typec/tcpci_rt1711h.c
rename to drivers/usb/typec/tcpci_rt1711h.c
--
2.7.4
^ permalink raw reply related [flat|nested] 18+ messages in thread