Commit dd7b01ad authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge branch 'staging_typec_move' into staging-next

Move the typec code out of staging into the USB tree.  This is on a
separate branch so that we can share it with the USB git tree and not
cause merge issues later on.
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parents 802d7d0b 76f0c53d
menu "USB Power Delivery and Type-C drivers" menu "USB Power Delivery and Type-C drivers"
config TYPEC_TCPM
tristate "USB Type-C Port Controller Manager"
depends on USB
select TYPEC
help
The Type-C Port Controller Manager provides a USB PD and USB Type-C
state machine for use with Type-C Port Controllers.
if TYPEC_TCPM if TYPEC_TCPM
config TYPEC_TCPCI config TYPEC_TCPCI
...@@ -17,8 +9,6 @@ config TYPEC_TCPCI ...@@ -17,8 +9,6 @@ config TYPEC_TCPCI
help help
Type-C Port Controller driver for TCPCI-compliant controller. Type-C Port Controller driver for TCPCI-compliant controller.
source "drivers/staging/typec/fusb302/Kconfig"
endif endif
endmenu endmenu
obj-$(CONFIG_TYPEC_TCPM) += tcpm.o
obj-$(CONFIG_TYPEC_TCPCI) += tcpci.o obj-$(CONFIG_TYPEC_TCPCI) += tcpci.o
obj-y += fusb302/
tcpm:
- Add documentation (at the very least for the API to low level drivers)
- Split PD code into separate file
- Check if it makes sense to use tracepoints instead of debugfs for debug logs
- Implement Alternate Mode handling
- Address "#if 0" code if not addressed with the above
- Validate all comments marked with "XXX"; either address or remove comments
- Add support for USB PD 3.0. While not mandatory, at least fast role swap
as well as authentication support would be very desirable.
tcpci: tcpci:
- Test with real hardware - Test with real hardware
......
fusb302:
- Find a better logging scheme, at least not having the same debugging/logging
code replicated here and in tcpm
- Find a non-hacky way to coordinate between PM and I2C access
- Documentation? The FUSB302 datasheet provides information on the chip to help
understand the code. But it may still be helpful to have a documentation.
- We may want to replace the "fcs,max-snk-microvolt", "fcs,max-snk-microamp",
"fcs,max-snk-microwatt" and "fcs,operating-snk-microwatt" device(tree)
properties with properties which are part of a generic type-c controller
devicetree binding.
...@@ -20,11 +20,11 @@ ...@@ -20,11 +20,11 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/usb/pd.h>
#include <linux/usb/tcpm.h>
#include <linux/usb/typec.h> #include <linux/usb/typec.h>
#include "pd.h"
#include "tcpci.h" #include "tcpci.h"
#include "tcpm.h"
#define PD_RETRY_COUNT 3 #define PD_RETRY_COUNT 3
......
...@@ -4,6 +4,20 @@ menu "USB Power Delivery and Type-C drivers" ...@@ -4,6 +4,20 @@ menu "USB Power Delivery and Type-C drivers"
config TYPEC config TYPEC
tristate tristate
config TYPEC_TCPM
tristate "USB Type-C Port Controller Manager"
depends on USB
select TYPEC
help
The Type-C Port Controller Manager provides a USB PD and USB Type-C
state machine for use with Type-C Port Controllers.
if TYPEC_TCPM
source "drivers/usb/typec/fusb302/Kconfig"
endif
config TYPEC_WCOVE config TYPEC_WCOVE
tristate "Intel WhiskeyCove PMIC USB Type-C PHY driver" tristate "Intel WhiskeyCove PMIC USB Type-C PHY driver"
depends on ACPI depends on ACPI
......
obj-$(CONFIG_TYPEC) += typec.o obj-$(CONFIG_TYPEC) += typec.o
obj-$(CONFIG_TYPEC_TCPM) += tcpm.o
obj-y += fusb302/
obj-$(CONFIG_TYPEC_WCOVE) += typec_wcove.o obj-$(CONFIG_TYPEC_WCOVE) += typec_wcove.o
obj-$(CONFIG_TYPEC_UCSI) += ucsi/ obj-$(CONFIG_TYPEC_UCSI) += ucsi/
...@@ -37,11 +37,11 @@ ...@@ -37,11 +37,11 @@
#include <linux/string.h> #include <linux/string.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/usb/typec.h> #include <linux/usb/typec.h>
#include <linux/usb/tcpm.h>
#include <linux/usb/pd.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include "fusb302_reg.h" #include "fusb302_reg.h"
#include "../tcpm.h"
#include "../pd.h"
/* /*
* When the device is SNK, BC_LVL interrupt is used to monitor cc pins * When the device is SNK, BC_LVL interrupt is used to monitor cc pins
......
...@@ -26,14 +26,13 @@ ...@@ -26,14 +26,13 @@
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/usb/pd.h>
#include <linux/usb/pd_bdo.h>
#include <linux/usb/pd_vdo.h>
#include <linux/usb/tcpm.h>
#include <linux/usb/typec.h> #include <linux/usb/typec.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include "pd.h"
#include "pd_vdo.h"
#include "pd_bdo.h"
#include "tcpm.h"
#define FOREACH_STATE(S) \ #define FOREACH_STATE(S) \
S(INVALID_STATE), \ S(INVALID_STATE), \
S(DRP_TOGGLING), \ S(DRP_TOGGLING), \
...@@ -908,27 +907,6 @@ static void svdm_consume_identity(struct tcpm_port *port, const __le32 *payload, ...@@ -908,27 +907,6 @@ static void svdm_consume_identity(struct tcpm_port *port, const __le32 *payload,
memset(&port->mode_data, 0, sizeof(port->mode_data)); memset(&port->mode_data, 0, sizeof(port->mode_data));
#if 0 /* Not really a match */
switch (PD_IDH_PTYPE(vdo)) {
case IDH_PTYPE_UNDEF:
port->partner.type = TYPEC_PARTNER_NONE; /* no longer exists */
break;
case IDH_PTYPE_HUB:
break;
case IDH_PTYPE_PERIPH:
break;
case IDH_PTYPE_PCABLE:
break;
case IDH_PTYPE_ACABLE:
break;
case IDH_PTYPE_AMA:
port->partner.type = TYPEC_PARTNER_ALTMODE;
break;
default:
break;
}
#endif
port->partner_ident.id_header = vdo; port->partner_ident.id_header = vdo;
port->partner_ident.cert_stat = le32_to_cpu(payload[VDO_INDEX_CSTAT]); port->partner_ident.cert_stat = le32_to_cpu(payload[VDO_INDEX_CSTAT]);
port->partner_ident.product = product; port->partner_ident.product = product;
...@@ -1103,11 +1081,7 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt, ...@@ -1103,11 +1081,7 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt,
response[0] = VDO(svid, 1, CMD_DISCOVER_MODES); response[0] = VDO(svid, 1, CMD_DISCOVER_MODES);
rlen = 1; rlen = 1;
} else { } else {
#if 0 /* enter alternate mode if/when implemented */
response[0] = pd_dfp_enter_mode(port, 0, 0);
if (response[0])
rlen = 1;
#endif
} }
break; break;
case CMD_ENTER_MODE: case CMD_ENTER_MODE:
...@@ -1145,10 +1119,6 @@ static void tcpm_handle_vdm_request(struct tcpm_port *port, ...@@ -1145,10 +1119,6 @@ static void tcpm_handle_vdm_request(struct tcpm_port *port,
if (PD_VDO_SVDM(p0)) if (PD_VDO_SVDM(p0))
rlen = tcpm_pd_svdm(port, payload, cnt, response); rlen = tcpm_pd_svdm(port, payload, cnt, response);
#if 0
else
rlen = tcpm_pd_custom_vdm(port, cnt, payload, response);
#endif
if (rlen > 0) { if (rlen > 0) {
tcpm_queue_vdm(port, response[0], &response[1], rlen - 1); tcpm_queue_vdm(port, response[0], &response[1], rlen - 1);
...@@ -2442,7 +2412,6 @@ static void run_state_machine(struct tcpm_port *port) ...@@ -2442,7 +2412,6 @@ static void run_state_machine(struct tcpm_port *port)
tcpm_set_state(port, SNK_STARTUP, 0); tcpm_set_state(port, SNK_STARTUP, 0);
break; break;
case SNK_STARTUP: case SNK_STARTUP:
/* XXX: callback into infrastructure */
opmode = tcpm_get_pwr_opmode(port->polarity ? opmode = tcpm_get_pwr_opmode(port->polarity ?
port->cc2 : port->cc1); port->cc2 : port->cc1);
typec_set_pwr_opmode(port->typec_port, opmode); typec_set_pwr_opmode(port->typec_port, opmode);
...@@ -3589,11 +3558,6 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc) ...@@ -3589,11 +3558,6 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
port->partner_desc.identity = &port->partner_ident; port->partner_desc.identity = &port->partner_ident;
port->port_type = tcpc->config->type; port->port_type = tcpc->config->type;
/*
* TODO:
* - alt_modes, set_alt_mode
* - {debug,audio}_accessory
*/
port->typec_port = typec_register_port(port->dev, &port->typec_caps); port->typec_port = typec_register_port(port->dev, &port->typec_caps);
if (!port->typec_port) { if (!port->typec_port) {
......
...@@ -104,6 +104,11 @@ static inline unsigned int pd_header_msgid_le(__le16 header) ...@@ -104,6 +104,11 @@ static inline unsigned int pd_header_msgid_le(__le16 header)
#define PD_MAX_PAYLOAD 7 #define PD_MAX_PAYLOAD 7
/**
* struct pd_message - PD message as seen on wire
* @header: PD message header
* @payload: PD message payload
*/
struct pd_message { struct pd_message {
__le16 header; __le16 header;
__le32 payload[PD_MAX_PAYLOAD]; __le32 payload[PD_MAX_PAYLOAD];
......
...@@ -54,6 +54,27 @@ enum tcpm_transmit_type { ...@@ -54,6 +54,27 @@ enum tcpm_transmit_type {
TCPC_TX_BIST_MODE_2 = 7 TCPC_TX_BIST_MODE_2 = 7
}; };
/**
* struct tcpc_config - Port configuration
* @src_pdo: PDO parameters sent to port partner as response to
* PD_CTRL_GET_SOURCE_CAP message
* @nr_src_pdo: Number of entries in @src_pdo
* @snk_pdo: PDO parameters sent to partner as response to
* PD_CTRL_GET_SINK_CAP message
* @nr_snk_pdo: Number of entries in @snk_pdo
* @max_snk_mv: Maximum acceptable sink voltage in mV
* @max_snk_ma: Maximum sink current in mA
* @max_snk_mw: Maximum required sink power in mW
* @operating_snk_mw:
* Required operating sink power in mW
* @type: Port type (TYPEC_PORT_DFP, TYPEC_PORT_UFP, or
* TYPEC_PORT_DRP)
* @default_role:
* Default port role (TYPEC_SINK or TYPEC_SOURCE).
* Set to TYPEC_NO_PREFERRED_ROLE if no default role.
* @try_role_hw:True if try.{Src,Snk} is implemented in hardware
* @alt_modes: List of supported alternate modes
*/
struct tcpc_config { struct tcpc_config {
const u32 *src_pdo; const u32 *src_pdo;
unsigned int nr_src_pdo; unsigned int nr_src_pdo;
...@@ -79,7 +100,6 @@ struct tcpc_config { ...@@ -79,7 +100,6 @@ struct tcpc_config {
enum tcpc_usb_switch { enum tcpc_usb_switch {
TCPC_USB_SWITCH_CONNECT, TCPC_USB_SWITCH_CONNECT,
TCPC_USB_SWITCH_DISCONNECT, TCPC_USB_SWITCH_DISCONNECT,
TCPC_USB_SWITCH_RESTORE, /* TODO FIXME */
}; };
/* Mux state attributes */ /* Mux state attributes */
...@@ -104,17 +124,40 @@ struct tcpc_mux_dev { ...@@ -104,17 +124,40 @@ struct tcpc_mux_dev {
void *priv_data; void *priv_data;
}; };
/**
* struct tcpc_dev - Port configuration and callback functions
* @config: Pointer to port configuration
* @get_vbus: Called to read current VBUS state
* @get_current_limit:
* Optional; called by the tcpm core when configured as a snk
* and cc=Rp-def. This allows the tcpm to provide a fallback
* current-limit detection method for the cc=Rp-def case.
* For example, some tcpcs may include BC1.2 charger detection
* and use that in this case.
* @set_cc: Called to set value of CC pins
* @get_cc: Called to read current CC pin values
* @set_polarity:
* Called to set polarity
* @set_vconn: Called to enable or disable VCONN
* @set_vbus: Called to enable or disable VBUS
* @set_current_limit:
* Optional; called to set current limit as negotiated
* with partner.
* @set_pd_rx: Called to enable or disable reception of PD messages
* @set_roles: Called to set power and data roles
* @start_drp_toggling:
* Optional; if supported by hardware, called to start DRP
* toggling. DRP toggling is stopped automatically if
* a connection is established.
* @try_role: Optional; called to set a preferred role
* @pd_transmit:Called to transmit PD message
* @mux: Pointer to multiplexer data
*/
struct tcpc_dev { struct tcpc_dev {
const struct tcpc_config *config; const struct tcpc_config *config;
int (*init)(struct tcpc_dev *dev); int (*init)(struct tcpc_dev *dev);
int (*get_vbus)(struct tcpc_dev *dev); int (*get_vbus)(struct tcpc_dev *dev);
/*
* This optional callback gets called by the tcpm core when configured
* as a snk and cc=Rp-def. This allows the tcpm to provide a fallback
* current-limit detection method for the cc=Rp-def case. E.g. some
* tcpcs may include BC1.2 charger detection and use that in this case.
*/
int (*get_current_limit)(struct tcpc_dev *dev); int (*get_current_limit)(struct tcpc_dev *dev);
int (*set_cc)(struct tcpc_dev *dev, enum typec_cc_status cc); int (*set_cc)(struct tcpc_dev *dev, enum typec_cc_status cc);
int (*get_cc)(struct tcpc_dev *dev, enum typec_cc_status *cc1, int (*get_cc)(struct tcpc_dev *dev, enum typec_cc_status *cc1,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment