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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
commit
dd7b01ad12
@ -1,13 +1,5 @@
|
||||
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
|
||||
|
||||
config TYPEC_TCPCI
|
||||
@ -17,8 +9,6 @@ config TYPEC_TCPCI
|
||||
help
|
||||
Type-C Port Controller driver for TCPCI-compliant controller.
|
||||
|
||||
source "drivers/staging/typec/fusb302/Kconfig"
|
||||
|
||||
endif
|
||||
|
||||
endmenu
|
||||
|
@ -1,3 +1 @@
|
||||
obj-$(CONFIG_TYPEC_TCPM) += tcpm.o
|
||||
obj-$(CONFIG_TYPEC_TCPCI) += tcpci.o
|
||||
obj-y += fusb302/
|
||||
|
@ -1,13 +1,3 @@
|
||||
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:
|
||||
- Test with real hardware
|
||||
|
||||
|
@ -1,10 +0,0 @@
|
||||
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 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/usb/pd.h>
|
||||
#include <linux/usb/tcpm.h>
|
||||
#include <linux/usb/typec.h>
|
||||
|
||||
#include "pd.h"
|
||||
#include "tcpci.h"
|
||||
#include "tcpm.h"
|
||||
|
||||
#define PD_RETRY_COUNT 3
|
||||
|
||||
|
@ -4,6 +4,20 @@ menu "USB Power Delivery and Type-C drivers"
|
||||
config TYPEC
|
||||
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
|
||||
tristate "Intel WhiskeyCove PMIC USB Type-C PHY driver"
|
||||
depends on ACPI
|
||||
|
@ -1,3 +1,5 @@
|
||||
obj-$(CONFIG_TYPEC) += typec.o
|
||||
obj-$(CONFIG_TYPEC_TCPM) += tcpm.o
|
||||
obj-y += fusb302/
|
||||
obj-$(CONFIG_TYPEC_WCOVE) += typec_wcove.o
|
||||
obj-$(CONFIG_TYPEC_UCSI) += ucsi/
|
||||
|
@ -37,11 +37,11 @@
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/usb/typec.h>
|
||||
#include <linux/usb/tcpm.h>
|
||||
#include <linux/usb/pd.h>
|
||||
#include <linux/workqueue.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
|
@ -26,14 +26,13 @@
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/slab.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/workqueue.h>
|
||||
|
||||
#include "pd.h"
|
||||
#include "pd_vdo.h"
|
||||
#include "pd_bdo.h"
|
||||
#include "tcpm.h"
|
||||
|
||||
#define FOREACH_STATE(S) \
|
||||
S(INVALID_STATE), \
|
||||
S(DRP_TOGGLING), \
|
||||
@ -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));
|
||||
|
||||
#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.cert_stat = le32_to_cpu(payload[VDO_INDEX_CSTAT]);
|
||||
port->partner_ident.product = product;
|
||||
@ -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);
|
||||
rlen = 1;
|
||||
} else {
|
||||
#if 0
|
||||
response[0] = pd_dfp_enter_mode(port, 0, 0);
|
||||
if (response[0])
|
||||
rlen = 1;
|
||||
#endif
|
||||
/* enter alternate mode if/when implemented */
|
||||
}
|
||||
break;
|
||||
case CMD_ENTER_MODE:
|
||||
@ -1145,10 +1119,6 @@ static void tcpm_handle_vdm_request(struct tcpm_port *port,
|
||||
|
||||
if (PD_VDO_SVDM(p0))
|
||||
rlen = tcpm_pd_svdm(port, payload, cnt, response);
|
||||
#if 0
|
||||
else
|
||||
rlen = tcpm_pd_custom_vdm(port, cnt, payload, response);
|
||||
#endif
|
||||
|
||||
if (rlen > 0) {
|
||||
tcpm_queue_vdm(port, response[0], &response[1], rlen - 1);
|
||||
@ -2442,7 +2412,6 @@ static void run_state_machine(struct tcpm_port *port)
|
||||
tcpm_set_state(port, SNK_STARTUP, 0);
|
||||
break;
|
||||
case SNK_STARTUP:
|
||||
/* XXX: callback into infrastructure */
|
||||
opmode = tcpm_get_pwr_opmode(port->polarity ?
|
||||
port->cc2 : port->cc1);
|
||||
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)
|
||||
|
||||
port->partner_desc.identity = &port->partner_ident;
|
||||
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);
|
||||
if (!port->typec_port) {
|
@ -104,6 +104,11 @@ static inline unsigned int pd_header_msgid_le(__le16 header)
|
||||
|
||||
#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 {
|
||||
__le16 header;
|
||||
__le32 payload[PD_MAX_PAYLOAD];
|
@ -54,6 +54,27 @@ enum tcpm_transmit_type {
|
||||
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 {
|
||||
const u32 *src_pdo;
|
||||
unsigned int nr_src_pdo;
|
||||
@ -79,7 +100,6 @@ struct tcpc_config {
|
||||
enum tcpc_usb_switch {
|
||||
TCPC_USB_SWITCH_CONNECT,
|
||||
TCPC_USB_SWITCH_DISCONNECT,
|
||||
TCPC_USB_SWITCH_RESTORE, /* TODO FIXME */
|
||||
};
|
||||
|
||||
/* Mux state attributes */
|
||||
@ -104,17 +124,40 @@ struct tcpc_mux_dev {
|
||||
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 {
|
||||
const struct tcpc_config *config;
|
||||
|
||||
int (*init)(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 (*set_cc)(struct tcpc_dev *dev, enum typec_cc_status cc);
|
||||
int (*get_cc)(struct tcpc_dev *dev, enum typec_cc_status *cc1,
|
Loading…
x
Reference in New Issue
Block a user