1
2
3#ifndef __LINUX_USB_TYPEC_H
4#define __LINUX_USB_TYPEC_H
5
6#include <linux/types.h>
7
8
9#define ALTMODE_MAX_MODES 6
10
11
12#define USB_TYPEC_REV_1_0 0x100
13#define USB_TYPEC_REV_1_1 0x110
14#define USB_TYPEC_REV_1_2 0x120
15
16struct typec_altmode;
17struct typec_partner;
18struct typec_cable;
19struct typec_plug;
20struct typec_port;
21
22struct fwnode_handle;
23
24enum typec_port_type {
25 TYPEC_PORT_SRC,
26 TYPEC_PORT_SNK,
27 TYPEC_PORT_DRP,
28};
29
30enum typec_port_data {
31 TYPEC_PORT_DFP,
32 TYPEC_PORT_UFP,
33 TYPEC_PORT_DRD,
34};
35
36enum typec_plug_type {
37 USB_PLUG_NONE,
38 USB_PLUG_TYPE_A,
39 USB_PLUG_TYPE_B,
40 USB_PLUG_TYPE_C,
41 USB_PLUG_CAPTIVE,
42};
43
44enum typec_data_role {
45 TYPEC_DEVICE,
46 TYPEC_HOST,
47};
48
49enum typec_role {
50 TYPEC_SINK,
51 TYPEC_SOURCE,
52};
53
54enum typec_pwr_opmode {
55 TYPEC_PWR_MODE_USB,
56 TYPEC_PWR_MODE_1_5A,
57 TYPEC_PWR_MODE_3_0A,
58 TYPEC_PWR_MODE_PD,
59};
60
61enum typec_accessory {
62 TYPEC_ACCESSORY_NONE,
63 TYPEC_ACCESSORY_AUDIO,
64 TYPEC_ACCESSORY_DEBUG,
65};
66
67#define TYPEC_MAX_ACCESSORY 3
68
69enum typec_orientation {
70 TYPEC_ORIENTATION_NONE,
71 TYPEC_ORIENTATION_NORMAL,
72 TYPEC_ORIENTATION_REVERSE,
73};
74
75
76
77
78
79
80
81
82
83
84
85
86struct usb_pd_identity {
87 u32 id_header;
88 u32 cert_stat;
89 u32 product;
90};
91
92int typec_partner_set_identity(struct typec_partner *partner);
93int typec_cable_set_identity(struct typec_cable *cable);
94
95
96
97
98
99
100
101
102
103
104
105
106
107struct typec_mode_desc {
108 int index;
109 u32 vdo;
110 char *desc;
111
112 enum typec_port_type roles;
113};
114
115
116
117
118
119
120
121
122
123
124
125struct typec_altmode_desc {
126 u16 svid;
127 int n_modes;
128 struct typec_mode_desc modes[ALTMODE_MAX_MODES];
129};
130
131struct typec_altmode
132*typec_partner_register_altmode(struct typec_partner *partner,
133 const struct typec_altmode_desc *desc);
134struct typec_altmode
135*typec_plug_register_altmode(struct typec_plug *plug,
136 const struct typec_altmode_desc *desc);
137struct typec_altmode
138*typec_port_register_altmode(struct typec_port *port,
139 const struct typec_altmode_desc *desc);
140void typec_unregister_altmode(struct typec_altmode *altmode);
141
142struct typec_port *typec_altmode2port(struct typec_altmode *alt);
143
144void typec_altmode_update_active(struct typec_altmode *alt, int mode,
145 bool active);
146
147enum typec_plug_index {
148 TYPEC_PLUG_SOP_P,
149 TYPEC_PLUG_SOP_PP,
150};
151
152
153
154
155
156
157
158
159struct typec_plug_desc {
160 enum typec_plug_index index;
161};
162
163
164
165
166
167
168
169
170
171struct typec_cable_desc {
172 enum typec_plug_type type;
173 unsigned int active:1;
174 struct usb_pd_identity *identity;
175};
176
177
178
179
180
181
182
183
184
185
186
187struct typec_partner_desc {
188 unsigned int usb_pd:1;
189 enum typec_accessory accessory;
190 struct usb_pd_identity *identity;
191};
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213struct typec_capability {
214 enum typec_port_type type;
215 enum typec_port_data data;
216 u16 revision;
217 u16 pd_revision;
218 int prefer_role;
219 enum typec_accessory accessory[TYPEC_MAX_ACCESSORY];
220
221 struct typec_switch *sw;
222 struct typec_mux *mux;
223 struct fwnode_handle *fwnode;
224
225 int (*try_role)(const struct typec_capability *,
226 int role);
227
228 int (*dr_set)(const struct typec_capability *,
229 enum typec_data_role);
230 int (*pr_set)(const struct typec_capability *,
231 enum typec_role);
232 int (*vconn_set)(const struct typec_capability *,
233 enum typec_role);
234
235 int (*activate_mode)(const struct typec_capability *,
236 int mode, int activate);
237 int (*port_type_set)(const struct typec_capability *,
238 enum typec_port_type);
239
240};
241
242
243#define TYPEC_NO_PREFERRED_ROLE (-1)
244
245struct typec_port *typec_register_port(struct device *parent,
246 const struct typec_capability *cap);
247void typec_unregister_port(struct typec_port *port);
248
249struct typec_partner *typec_register_partner(struct typec_port *port,
250 struct typec_partner_desc *desc);
251void typec_unregister_partner(struct typec_partner *partner);
252
253struct typec_cable *typec_register_cable(struct typec_port *port,
254 struct typec_cable_desc *desc);
255void typec_unregister_cable(struct typec_cable *cable);
256
257struct typec_plug *typec_register_plug(struct typec_cable *cable,
258 struct typec_plug_desc *desc);
259void typec_unregister_plug(struct typec_plug *plug);
260
261void typec_set_data_role(struct typec_port *port, enum typec_data_role role);
262void typec_set_pwr_role(struct typec_port *port, enum typec_role role);
263void typec_set_vconn_role(struct typec_port *port, enum typec_role role);
264void typec_set_pwr_opmode(struct typec_port *port, enum typec_pwr_opmode mode);
265
266int typec_set_orientation(struct typec_port *port,
267 enum typec_orientation orientation);
268int typec_set_mode(struct typec_port *port, int mode);
269
270#endif
271