1
2
3#ifndef __USB_TYPEC_ALTMODE_H
4#define __USB_TYPEC_ALTMODE_H
5
6#include <linux/mod_devicetable.h>
7#include <linux/usb/typec.h>
8#include <linux/device.h>
9
10#define MODE_DISCOVERY_MAX 6
11
12struct typec_altmode_ops;
13
14
15
16
17
18
19
20
21
22
23
24struct typec_altmode {
25 struct device dev;
26 u16 svid;
27 int mode;
28 u32 vdo;
29 unsigned int active:1;
30
31 char *desc;
32 const struct typec_altmode_ops *ops;
33};
34
35#define to_typec_altmode(d) container_of(d, struct typec_altmode, dev)
36
37static inline void typec_altmode_set_drvdata(struct typec_altmode *altmode,
38 void *data)
39{
40 dev_set_drvdata(&altmode->dev, data);
41}
42
43static inline void *typec_altmode_get_drvdata(struct typec_altmode *altmode)
44{
45 return dev_get_drvdata(&altmode->dev);
46}
47
48
49
50
51
52
53
54
55
56
57struct typec_altmode_ops {
58 int (*enter)(struct typec_altmode *altmode, u32 *vdo);
59 int (*exit)(struct typec_altmode *altmode);
60 void (*attention)(struct typec_altmode *altmode, u32 vdo);
61 int (*vdm)(struct typec_altmode *altmode, const u32 hdr,
62 const u32 *vdo, int cnt);
63 int (*notify)(struct typec_altmode *altmode, unsigned long conf,
64 void *data);
65 int (*activate)(struct typec_altmode *altmode, int activate);
66};
67
68int typec_altmode_enter(struct typec_altmode *altmode, u32 *vdo);
69int typec_altmode_exit(struct typec_altmode *altmode);
70void typec_altmode_attention(struct typec_altmode *altmode, u32 vdo);
71int typec_altmode_vdm(struct typec_altmode *altmode,
72 const u32 header, const u32 *vdo, int count);
73int typec_altmode_notify(struct typec_altmode *altmode, unsigned long conf,
74 void *data);
75const struct typec_altmode *
76typec_altmode_get_partner(struct typec_altmode *altmode);
77
78
79
80
81
82
83enum {
84 TYPEC_STATE_SAFE,
85 TYPEC_STATE_USB,
86 TYPEC_STATE_MODAL,
87};
88
89
90
91
92
93
94
95
96
97
98
99enum {
100 TYPEC_MODE_AUDIO = TYPEC_STATE_MODAL,
101 TYPEC_MODE_DEBUG,
102};
103
104
105
106
107
108
109
110
111
112
113
114enum {
115 TYPEC_MODE_USB2 = TYPEC_MODE_DEBUG,
116 TYPEC_MODE_USB3,
117 TYPEC_MODE_USB4
118};
119
120#define TYPEC_MODAL_STATE(_state_) ((_state_) + TYPEC_STATE_MODAL)
121
122struct typec_altmode *typec_altmode_get_plug(struct typec_altmode *altmode,
123 enum typec_plug_index index);
124void typec_altmode_put_plug(struct typec_altmode *plug);
125
126struct typec_altmode *typec_match_altmode(struct typec_altmode **altmodes,
127 size_t n, u16 svid, u8 mode);
128
129struct typec_altmode *
130typec_altmode_register_notifier(struct device *dev, u16 svid, u8 mode,
131 struct notifier_block *nb);
132
133void typec_altmode_unregister_notifier(struct typec_altmode *adev,
134 struct notifier_block *nb);
135
136
137
138
139
140static inline enum typec_orientation
141typec_altmode_get_orientation(struct typec_altmode *altmode)
142{
143 return typec_get_orientation(typec_altmode2port(altmode));
144}
145
146
147
148
149
150
151
152
153
154
155
156struct typec_altmode_driver {
157 const struct typec_device_id *id_table;
158 int (*probe)(struct typec_altmode *altmode);
159 void (*remove)(struct typec_altmode *altmode);
160 struct device_driver driver;
161};
162
163#define to_altmode_driver(d) container_of(d, struct typec_altmode_driver, \
164 driver)
165
166#define typec_altmode_register_driver(drv) \
167 __typec_altmode_register_driver(drv, THIS_MODULE)
168int __typec_altmode_register_driver(struct typec_altmode_driver *drv,
169 struct module *module);
170void typec_altmode_unregister_driver(struct typec_altmode_driver *drv);
171
172#define module_typec_altmode_driver(__typec_altmode_driver) \
173 module_driver(__typec_altmode_driver, typec_altmode_register_driver, \
174 typec_altmode_unregister_driver)
175
176#endif
177