1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
|
/* Copyright 2017 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef __CROS_EC_USBC_PPC_H
#define __CROS_EC_USBC_PPC_H
#include "common.h"
#include "usb_pd_tcpm.h"
/* Common APIs for USB Type-C Power Path Controllers (PPC) */
/*
* Number of times a port may overcurrent before we latch off the port until a
* physical disconnect is detected.
*/
#define PPC_OC_CNT_THRESH 3
/*
* Number of seconds until a latched-off port is re-enabled for sourcing after
* detecting a physical disconnect.
*/
#define PPC_OC_COOLDOWN_DELAY_US (2 * SECOND)
/*
* NOTE: The pointers to functions in the ppc_drv structure can now be NULL
* which will indicate and return NOT_IMPLEMENTED from the main calling
* function
*/
struct ppc_drv {
/**
* Initialize the PPC.
*
* @param port: The Type-C port number.
* @return EC_SUCCESS when init was successful, error otherwise.
*/
int (*init)(int port);
/**
* Is the port sourcing Vbus?
*
* @param port: The Type-C port number.
* @return 1 if sourcing Vbus, 0 if not.
*/
int (*is_sourcing_vbus)(int port);
/**
* Turn on/off the charge path FET, such that current flows into the
* system.
*
* @param port: The Type-C port number.
* @param enable: 1: Turn on the FET, 0: turn off the FET.
* @return EC_SUCCESS on success, error otherwise.
*/
int (*vbus_sink_enable)(int port, int enable);
/**
* Turn on/off the source path FET, such that current flows from the
* system.
*
* @param port: The Type-C port number.
* @param enable: 1: Turn on the FET, 0: turn off the FET.
* @return EC_SUCCESS on success, error otherwise.
*/
int (*vbus_source_enable)(int port, int enable);
#ifdef CONFIG_USBC_PPC_POLARITY
/**
* Inform the PPC of the polarity of the CC pins.
*
* @param port: The Type-C port number.
* @param polarity: 1: CC2 used for comms, 0: CC1 used for comms.
* @return EC_SUCCESS on success, error otherwise.
*/
int (*set_polarity)(int port, int polarity);
#endif
/**
* Set the Vbus source path current limit
*
* @param port: The Type-C port number.
* @param rp: The Rp value which to approximately set the current limit.
* @return EC_SUCCESS on success, error otherwise.
*/
int (*set_vbus_source_current_limit)(int port, enum tcpc_rp_value rp);
/**
* Discharge PD VBUS on src/sink disconnect & power role swap
*
* @param port: The Type-C port number.
* @param enable: 1 -> discharge vbus, 0 -> stop discharging vbus
* @return EC_SUCCESS on success, error otherwise.
*/
int (*discharge_vbus)(int port, int enable);
#ifdef CONFIG_USBC_PPC_SBU
/**
* Turn on/off the SBU FETs.
*
* @param port: The Type-C port number.
* @param enable: 1: enable SBU FETs 0: disable SBU FETs.
*/
int (*set_sbu)(int port, int enable);
#endif /* CONFIG_USBC_PPC_SBU */
#ifdef CONFIG_USBC_PPC_VCONN
/**
* Turn on/off the VCONN FET.
*
* @param port: The Type-C port number.
* @param enable: 1: enable VCONN FET 0: disable VCONN FET.
*/
int (*set_vconn)(int port, int enable);
#endif
#ifdef CONFIG_CMD_PPC_DUMP
/**
* Perform a register dump of the PPC.
*
* @param port: The Type-C port number.
* @return EC_SUCCESS on success, error otherwise.
*/
int (*reg_dump)(int port);
#endif /* defined(CONFIG_CMD_PPC_DUMP) */
#ifdef CONFIG_USB_PD_VBUS_DETECT_PPC
/**
* Determine if VBUS is present or not.
*
* @param port: The Type-C port number.
* @return 1 if VBUS is present, 0 if not.
*/
int (*is_vbus_present)(int port);
#endif /* defined(CONFIG_USB_PD_VBUS_DETECT_PPC) */
/**
* Optional method to put the PPC into its lowest power state. In this
* state it should still fire interrupts if Vbus changes etc.
*
* @param port: The Type-C port number.
* @return EC_SUCCESS on success, error otherwise.
*/
int (*enter_low_power_mode)(int port);
};
struct ppc_config_t {
int i2c_port;
uint16_t i2c_addr_flags;
const struct ppc_drv *drv;
};
extern struct ppc_config_t ppc_chips[];
extern unsigned int ppc_cnt;
/**
* Increment the overcurrent event counter.
*
* @param port: The Type-C port that has overcurrented.
* @return EC_SUCCESS on success, EC_ERROR_INVAL if non-existent port.
*/
int ppc_add_oc_event(int port);
/**
* Clear the overcurrent event counter.
*
* @param port: The Type-C port's counter to clear.
* @return EC_SUCCESS on success, EC_ERROR_INVAL if non-existent port.
*/
int ppc_clear_oc_event_counter(int port);
/**
* Discharge PD VBUS on src/sink disconnect & power role swap
*
* @param port: The Type-C port number.
* @param enable: 1 -> discharge vbus, 0 -> stop discharging vbus
* @return EC_SUCCESS on success, error otherwise.
*/
int ppc_discharge_vbus(int port, int enable);
/**
* Initializes the PPC for the specified port.
*
* @param port: The Type-C port number.
* @return EC_SUCCESS on success, error otherwise.
*/
int ppc_init(int port);
/**
* Is the port latched off due to multiple overcurrent events in succession?
*
* @param port: The Type-C port number.
* @return 1 if the port is latched off, 0 if it is not latched off.
*/
int ppc_is_port_latched_off(int port);
/**
* Is the port sourcing Vbus?
*
* @param port: The Type-C port number.
* @return 1 if sourcing Vbus, 0 if not.
*/
int ppc_is_sourcing_vbus(int port);
/**
* Determine if VBUS is present or not.
*
* @param port: The Type-C port number.
* @return 1 if VBUS is present, 0 if not.
*/
int ppc_is_vbus_present(int port);
/**
* Inform the PPC module that a sink is connected.
*
* This is used such that it can determine when to clear the overcurrent events
* counter for a port.
* @param port: The Type-C port number.
* @param is_connected: 1: if sink is connected on this port, 0: if not
* connected.
*/
void ppc_sink_is_connected(int port, int is_connected);
/**
* Inform the PPC of the polarity of the CC pins.
*
* @param port: The Type-C port number.
* @param polarity: 1: CC2 used for comms, 0: CC1 used for comms.
* @return EC_SUCCESS on success, error otherwise.
*/
int ppc_set_polarity(int port, int polarity);
/**
* Set the Vbus source path current limit
*
* @param port: The Type-C port number.
* @param rp: The Rp value which to approximately set the current limit.
* @return EC_SUCCESS on success, error otherwise.
*/
int ppc_set_vbus_source_current_limit(int port, enum tcpc_rp_value rp);
/**
* Turn on/off the SBU FETs.
*
* @param port: The Type-C port number.
* @param enable: 1: enable SBU FETs 0: disable SBU FETs.
*/
int ppc_set_sbu(int port, int enable);
/**
* Turn on/off the VCONN FET.
*
* @param port: The Type-C port number.
* @param enable: 1: enable VCONN FET 0: disable VCONN FET.
*/
int ppc_set_vconn(int port, int enable);
/**
* Turn on/off the charge path FET, such that current flows into the
* system.
*
* @param port: The Type-C port number.
* @param enable: 1: Turn on the FET, 0: turn off the FET.
* @return EC_SUCCESS on success, error otherwise.
*/
int ppc_vbus_sink_enable(int port, int enable);
/**
* Turn on/off the source path FET, such that current flows from the
* system.
*
* @param port: The Type-C port number.
* @param enable: 1: Turn on the FET, 0: turn off the FET.
* @return EC_SUCCESS on success, error otherwise.
*/
int ppc_vbus_source_enable(int port, int enable);
/**
* Board specific callback when a port overcurrents.
*
* @param port: The Type-C port which overcurrented.
* @param is_overcurrented: 1 if port overcurrented, 0 if the condition is gone.
*/
void board_overcurrent_event(int port, int is_overcurrented);
/**
* Put the PPC into its lowest power state. In this state it should still fire
* interrupts if Vbus changes etc. This is called by board-specific code when
* appropriate.
*
* @param port: The Type-C port number.
* @return EC_SUCCESS on success, error otherwise.
*/
int ppc_enter_low_power_mode(int port);
/**
* Board specific callback to check if the PPC interrupt is still asserted
*
* @param port: The Type-C port number to check
* @return 0 if interrupt is cleared, 1 if it is still on
*/
int ppc_get_alert_status(int port);
#endif /* !defined(__CROS_EC_USBC_PPC_H) */
|