Commit | Line | Data |
---|---|---|
f0690a25 GR |
1 | /* |
2 | * Copyright 2015-2017 Google, Inc | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or modify | |
5 | * it under the terms of the GNU General Public License as published by | |
6 | * the Free Software Foundation; either version 2 of the License, or | |
7 | * (at your option) any later version. | |
8 | * | |
9 | * This program is distributed in the hope that it will be useful, | |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | * GNU General Public License for more details. | |
13 | */ | |
14 | ||
15 | #ifndef __LINUX_USB_TCPM_H | |
16 | #define __LINUX_USB_TCPM_H | |
17 | ||
18 | #include <linux/bitops.h> | |
19 | #include <linux/usb/typec.h> | |
20 | #include "pd.h" | |
21 | ||
22 | enum typec_cc_status { | |
23 | TYPEC_CC_OPEN, | |
24 | TYPEC_CC_RA, | |
25 | TYPEC_CC_RD, | |
26 | TYPEC_CC_RP_DEF, | |
27 | TYPEC_CC_RP_1_5, | |
28 | TYPEC_CC_RP_3_0, | |
29 | }; | |
30 | ||
31 | enum typec_cc_polarity { | |
32 | TYPEC_POLARITY_CC1, | |
33 | TYPEC_POLARITY_CC2, | |
34 | }; | |
35 | ||
36 | /* Time to wait for TCPC to complete transmit */ | |
9adf9f9e GR |
37 | #define PD_T_TCPC_TX_TIMEOUT 100 /* in ms */ |
38 | #define PD_ROLE_SWAP_TIMEOUT (MSEC_PER_SEC * 10) | |
2eadc33f | 39 | #define PD_PPS_CTRL_TIMEOUT (MSEC_PER_SEC * 10) |
f0690a25 GR |
40 | |
41 | enum tcpm_transmit_status { | |
42 | TCPC_TX_SUCCESS = 0, | |
43 | TCPC_TX_DISCARDED = 1, | |
44 | TCPC_TX_FAILED = 2, | |
45 | }; | |
46 | ||
47 | enum tcpm_transmit_type { | |
48 | TCPC_TX_SOP = 0, | |
49 | TCPC_TX_SOP_PRIME = 1, | |
50 | TCPC_TX_SOP_PRIME_PRIME = 2, | |
51 | TCPC_TX_SOP_DEBUG_PRIME = 3, | |
52 | TCPC_TX_SOP_DEBUG_PRIME_PRIME = 4, | |
53 | TCPC_TX_HARD_RESET = 5, | |
54 | TCPC_TX_CABLE_RESET = 6, | |
55 | TCPC_TX_BIST_MODE_2 = 7 | |
56 | }; | |
57 | ||
98076fa6 GR |
58 | /** |
59 | * struct tcpc_config - Port configuration | |
60 | * @src_pdo: PDO parameters sent to port partner as response to | |
61 | * PD_CTRL_GET_SOURCE_CAP message | |
62 | * @nr_src_pdo: Number of entries in @src_pdo | |
63 | * @snk_pdo: PDO parameters sent to partner as response to | |
64 | * PD_CTRL_GET_SINK_CAP message | |
65 | * @nr_snk_pdo: Number of entries in @snk_pdo | |
98076fa6 GR |
66 | * @operating_snk_mw: |
67 | * Required operating sink power in mW | |
68 | * @type: Port type (TYPEC_PORT_DFP, TYPEC_PORT_UFP, or | |
69 | * TYPEC_PORT_DRP) | |
70 | * @default_role: | |
71 | * Default port role (TYPEC_SINK or TYPEC_SOURCE). | |
72 | * Set to TYPEC_NO_PREFERRED_ROLE if no default role. | |
73 | * @try_role_hw:True if try.{Src,Snk} is implemented in hardware | |
74 | * @alt_modes: List of supported alternate modes | |
75 | */ | |
f0690a25 GR |
76 | struct tcpc_config { |
77 | const u32 *src_pdo; | |
78 | unsigned int nr_src_pdo; | |
79 | ||
80 | const u32 *snk_pdo; | |
81 | unsigned int nr_snk_pdo; | |
82 | ||
193a6801 GR |
83 | const u32 *snk_vdo; |
84 | unsigned int nr_snk_vdo; | |
85 | ||
f0690a25 GR |
86 | unsigned int operating_snk_mw; |
87 | ||
88 | enum typec_port_type type; | |
ceeb1625 | 89 | enum typec_port_data data; |
f0690a25 GR |
90 | enum typec_role default_role; |
91 | bool try_role_hw; /* try.{src,snk} implemented in hardware */ | |
92 | ||
3c41dbde | 93 | const struct typec_altmode_desc *alt_modes; |
f0690a25 GR |
94 | }; |
95 | ||
f0690a25 GR |
96 | /* Mux state attributes */ |
97 | #define TCPC_MUX_USB_ENABLED BIT(0) /* USB enabled */ | |
98 | #define TCPC_MUX_DP_ENABLED BIT(1) /* DP enabled */ | |
99 | #define TCPC_MUX_POLARITY_INVERTED BIT(2) /* Polarity inverted */ | |
100 | ||
98076fa6 GR |
101 | /** |
102 | * struct tcpc_dev - Port configuration and callback functions | |
103 | * @config: Pointer to port configuration | |
5e85a04c | 104 | * @fwnode: Pointer to port fwnode |
98076fa6 GR |
105 | * @get_vbus: Called to read current VBUS state |
106 | * @get_current_limit: | |
107 | * Optional; called by the tcpm core when configured as a snk | |
108 | * and cc=Rp-def. This allows the tcpm to provide a fallback | |
109 | * current-limit detection method for the cc=Rp-def case. | |
110 | * For example, some tcpcs may include BC1.2 charger detection | |
111 | * and use that in this case. | |
112 | * @set_cc: Called to set value of CC pins | |
113 | * @get_cc: Called to read current CC pin values | |
114 | * @set_polarity: | |
115 | * Called to set polarity | |
116 | * @set_vconn: Called to enable or disable VCONN | |
117 | * @set_vbus: Called to enable or disable VBUS | |
118 | * @set_current_limit: | |
119 | * Optional; called to set current limit as negotiated | |
120 | * with partner. | |
121 | * @set_pd_rx: Called to enable or disable reception of PD messages | |
122 | * @set_roles: Called to set power and data roles | |
123 | * @start_drp_toggling: | |
124 | * Optional; if supported by hardware, called to start DRP | |
125 | * toggling. DRP toggling is stopped automatically if | |
126 | * a connection is established. | |
127 | * @try_role: Optional; called to set a preferred role | |
128 | * @pd_transmit:Called to transmit PD message | |
129 | * @mux: Pointer to multiplexer data | |
130 | */ | |
f0690a25 GR |
131 | struct tcpc_dev { |
132 | const struct tcpc_config *config; | |
5e85a04c | 133 | struct fwnode_handle *fwnode; |
f0690a25 GR |
134 | |
135 | int (*init)(struct tcpc_dev *dev); | |
136 | int (*get_vbus)(struct tcpc_dev *dev); | |
ea62cfc7 | 137 | int (*get_current_limit)(struct tcpc_dev *dev); |
f0690a25 GR |
138 | int (*set_cc)(struct tcpc_dev *dev, enum typec_cc_status cc); |
139 | int (*get_cc)(struct tcpc_dev *dev, enum typec_cc_status *cc1, | |
140 | enum typec_cc_status *cc2); | |
141 | int (*set_polarity)(struct tcpc_dev *dev, | |
142 | enum typec_cc_polarity polarity); | |
143 | int (*set_vconn)(struct tcpc_dev *dev, bool on); | |
144 | int (*set_vbus)(struct tcpc_dev *dev, bool on, bool charge); | |
145 | int (*set_current_limit)(struct tcpc_dev *dev, u32 max_ma, u32 mv); | |
146 | int (*set_pd_rx)(struct tcpc_dev *dev, bool on); | |
147 | int (*set_roles)(struct tcpc_dev *dev, bool attached, | |
148 | enum typec_role role, enum typec_data_role data); | |
149 | int (*start_drp_toggling)(struct tcpc_dev *dev, | |
150 | enum typec_cc_status cc); | |
151 | int (*try_role)(struct tcpc_dev *dev, int role); | |
152 | int (*pd_transmit)(struct tcpc_dev *dev, enum tcpm_transmit_type type, | |
153 | const struct pd_message *msg); | |
f0690a25 GR |
154 | }; |
155 | ||
156 | struct tcpm_port; | |
157 | ||
158 | struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc); | |
159 | void tcpm_unregister_port(struct tcpm_port *port); | |
160 | ||
5007e1b5 BJS |
161 | int tcpm_update_source_capabilities(struct tcpm_port *port, const u32 *pdo, |
162 | unsigned int nr_pdo); | |
163 | int tcpm_update_sink_capabilities(struct tcpm_port *port, const u32 *pdo, | |
164 | unsigned int nr_pdo, | |
5007e1b5 | 165 | unsigned int operating_snk_mw); |
f0690a25 GR |
166 | |
167 | void tcpm_vbus_change(struct tcpm_port *port); | |
168 | void tcpm_cc_change(struct tcpm_port *port); | |
169 | void tcpm_pd_receive(struct tcpm_port *port, | |
170 | const struct pd_message *msg); | |
171 | void tcpm_pd_transmit_complete(struct tcpm_port *port, | |
172 | enum tcpm_transmit_status status); | |
173 | void tcpm_pd_hard_reset(struct tcpm_port *port); | |
174 | void tcpm_tcpc_reset(struct tcpm_port *port); | |
175 | ||
176 | #endif /* __LINUX_USB_TCPM_H */ |