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"
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
obj-$(CONFIG_TYPEC_TCPM) += tcpm.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:
- 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 @@
#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
......
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,
......
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