summaryrefslogtreecommitdiff
path: root/include/usbc_ocp.h
blob: 6c1d641931b3fab44f645b6d4e64ee10e91f0fa8 (plain)
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
/* Copyright 2020 The ChromiumOS Authors
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef __CROS_EC_USBC_OCP_H
#define __CROS_EC_USBC_OCP_H

#include "common.h"

/* Common APIs for USB Type-C Overcurrent Protection (OCP) Module */

/*
 * PD 3.1 Ver 1.3 7.1.7.1 Output Over Current Protection
 *
 * "After three consecutive over current events Source Shall go to
 * ErrorRecovery.
 *
 * Sources Should attempt to send a Hard Reset message when over
 * current protection engages followed by an Alert Message indicating
 * an OCP event once an Explicit Contract has been established.
 *
 * The Source Shall prevent continual system or port cycling if over
 * current protection continues to engage after initially resuming
 * either default operation or renegotiation. Latching off the port or
 * system is an acceptable response to recurring over current."
 *
 * Our policy will be first two OCPs -> hard reset
 * 3rd -> ErrorRecovery
 * 4th -> port latched off
 */
#define OCP_HR_CNT 2

#define OCP_MAX_CNT 4

/**
 * 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 usbc_ocp_add_event(int port);

/**
 * Clear the overcurrent event counter
 *
 * @param port: The Type-C port number.
 * @return EC_SUCCESS on success, EC_ERROR_INVAL if non-existent port
 */
int usbc_ocp_clear_event_counter(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 usbc_ocp_is_port_latched_off(int port);

/**
 * Register a port as having a sink connected
 *
 * @param port: The Type-C port number.
 * @param connected: true if sink is now connected on port
 */
void usbc_ocp_snk_is_connected(int port, bool connected);

/**
 * 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.
 */
__override_proto void board_overcurrent_event(int port, int is_overcurrented);

#endif /* !defined(__CROS_EC_USBC_OCP_H) */