]>
Commit | Line | Data |
---|---|---|
eb50fd3a | 1 | // SPDX-License-Identifier: GPL-2.0 |
d3d2af51 VA |
2 | /* |
3 | * Greybus audio driver | |
4 | * Copyright 2015 Google Inc. | |
5 | * Copyright 2015 Linaro Ltd. | |
d3d2af51 VA |
6 | */ |
7 | ||
7885342c VA |
8 | #ifndef __LINUX_GBAUDIO_CODEC_H |
9 | #define __LINUX_GBAUDIO_CODEC_H | |
d3d2af51 VA |
10 | |
11 | #include <sound/soc.h> | |
64a7e2cc | 12 | #include <sound/jack.h> |
d3d2af51 | 13 | |
184992e3 MG |
14 | #include "greybus.h" |
15 | #include "greybus_protocols.h" | |
16 | ||
d3d2af51 | 17 | #define NAME_SIZE 32 |
2a70e49f | 18 | #define MAX_DAIS 2 /* APB1, APB2 */ |
d3d2af51 VA |
19 | |
20 | enum { | |
21 | APB1_PCM = 0, | |
22 | APB2_PCM, | |
23 | NUM_CODEC_DAIS, | |
24 | }; | |
25 | ||
89de9a06 VA |
26 | /* device_type should be same as defined in audio.h (Android media layer) */ |
27 | enum { | |
28 | GBAUDIO_DEVICE_NONE = 0x0, | |
29 | /* reserved bits */ | |
30 | GBAUDIO_DEVICE_BIT_IN = 0x80000000, | |
31 | GBAUDIO_DEVICE_BIT_DEFAULT = 0x40000000, | |
32 | /* output devices */ | |
33 | GBAUDIO_DEVICE_OUT_SPEAKER = 0x2, | |
34 | GBAUDIO_DEVICE_OUT_WIRED_HEADSET = 0x4, | |
35 | GBAUDIO_DEVICE_OUT_WIRED_HEADPHONE = 0x8, | |
36 | /* input devices */ | |
37 | GBAUDIO_DEVICE_IN_BUILTIN_MIC = GBAUDIO_DEVICE_BIT_IN | 0x4, | |
38 | GBAUDIO_DEVICE_IN_WIRED_HEADSET = GBAUDIO_DEVICE_BIT_IN | 0x10, | |
39 | }; | |
40 | ||
847175e8 VA |
41 | #define GBCODEC_JACK_MASK 0x0000FFFF |
42 | #define GBCODEC_JACK_BUTTON_MASK 0xFFFF0000 | |
64a7e2cc | 43 | |
6dd67645 VA |
44 | enum gbaudio_codec_state { |
45 | GBAUDIO_CODEC_SHUTDOWN = 0, | |
46 | GBAUDIO_CODEC_STARTUP, | |
47 | GBAUDIO_CODEC_HWPARAMS, | |
48 | GBAUDIO_CODEC_PREPARE, | |
49 | GBAUDIO_CODEC_START, | |
50 | GBAUDIO_CODEC_STOP, | |
51 | }; | |
52 | ||
19866603 | 53 | struct gbaudio_stream_params { |
6dd67645 | 54 | int state; |
31959392 | 55 | u8 sig_bits, channels; |
6dd67645 VA |
56 | uint32_t format, rate; |
57 | }; | |
58 | ||
19866603 VA |
59 | struct gbaudio_codec_dai { |
60 | int id; | |
61 | /* runtime params for playback/capture streams */ | |
62 | struct gbaudio_stream_params params[2]; | |
63 | struct list_head list; | |
64 | }; | |
65 | ||
6dd67645 VA |
66 | struct gbaudio_codec_info { |
67 | struct device *dev; | |
68 | struct snd_soc_codec *codec; | |
69 | struct list_head module_list; | |
19866603 VA |
70 | /* to maintain runtime stream params for each DAI */ |
71 | struct list_head dai_list; | |
6dd67645 | 72 | struct mutex lock; |
6dd67645 VA |
73 | }; |
74 | ||
6339d232 VA |
75 | struct gbaudio_widget { |
76 | __u8 id; | |
77 | const char *name; | |
78 | struct list_head list; | |
79 | }; | |
80 | ||
81 | struct gbaudio_control { | |
82 | __u8 id; | |
83 | char *name; | |
0c15a9e0 | 84 | char *wname; |
6339d232 | 85 | const char * const *texts; |
15c726ea | 86 | int items; |
6339d232 VA |
87 | struct list_head list; |
88 | }; | |
89 | ||
6dd67645 | 90 | struct gbaudio_data_connection { |
b7e7dc00 | 91 | int id; |
2a70e49f | 92 | __le16 data_cport; |
2a70e49f VA |
93 | struct gb_connection *connection; |
94 | struct list_head list; | |
591c4522 VA |
95 | /* maintain runtime state for playback/capture stream */ |
96 | int state[2]; | |
2a70e49f VA |
97 | }; |
98 | ||
6dd67645 VA |
99 | /* stream direction */ |
100 | #define GB_PLAYBACK BIT(0) | |
101 | #define GB_CAPTURE BIT(1) | |
102 | ||
103 | enum gbaudio_module_state { | |
104 | GBAUDIO_MODULE_OFF = 0, | |
105 | GBAUDIO_MODULE_ON, | |
106 | }; | |
107 | ||
108 | struct gbaudio_module_info { | |
2a70e49f | 109 | /* module info */ |
6dd67645 | 110 | struct device *dev; |
2a70e49f VA |
111 | int dev_id; /* check if it should be bundle_id/hd_cport_id */ |
112 | int vid; | |
113 | int pid; | |
2a70e49f | 114 | int type; |
17247da5 | 115 | int set_uevent; |
2a70e49f VA |
116 | char vstr[NAME_SIZE]; |
117 | char pstr[NAME_SIZE]; | |
118 | struct list_head list; | |
17247da5 VA |
119 | /* need to share this info to above user space */ |
120 | int manager_id; | |
2a70e49f | 121 | char name[NAME_SIZE]; |
89de9a06 VA |
122 | unsigned int ip_devices; |
123 | unsigned int op_devices; | |
d3d2af51 | 124 | |
64a7e2cc VA |
125 | /* jack related */ |
126 | char jack_name[NAME_SIZE]; | |
127 | char button_name[NAME_SIZE]; | |
64a7e2cc | 128 | int jack_type; |
847175e8 VA |
129 | int jack_mask; |
130 | int button_mask; | |
64a7e2cc VA |
131 | int button_status; |
132 | struct snd_soc_jack headset_jack; | |
133 | struct snd_soc_jack button_jack; | |
134 | ||
6dd67645 | 135 | /* connection info */ |
2a70e49f | 136 | struct gb_connection *mgmt_connection; |
796fad44 | 137 | size_t num_data_connections; |
6dd67645 VA |
138 | struct list_head data_list; |
139 | ||
796fad44 | 140 | /* topology related */ |
2a70e49f | 141 | int num_dais; |
6dd67645 | 142 | int num_controls; |
d3d2af51 VA |
143 | int num_dapm_widgets; |
144 | int num_dapm_routes; | |
6339d232 VA |
145 | unsigned long dai_offset; |
146 | unsigned long widget_offset; | |
147 | unsigned long control_offset; | |
148 | unsigned long route_offset; | |
6dd67645 VA |
149 | struct snd_kcontrol_new *controls; |
150 | struct snd_soc_dapm_widget *dapm_widgets; | |
151 | struct snd_soc_dapm_route *dapm_routes; | |
2a70e49f VA |
152 | struct snd_soc_dai_driver *dais; |
153 | ||
6339d232 | 154 | struct list_head widget_list; |
6dd67645 | 155 | struct list_head ctl_list; |
6339d232 | 156 | struct list_head widget_ctl_list; |
6dd67645 VA |
157 | |
158 | struct gb_audio_topology *topology; | |
d3d2af51 VA |
159 | }; |
160 | ||
6dd67645 | 161 | int gbaudio_tplg_parse_data(struct gbaudio_module_info *module, |
6339d232 | 162 | struct gb_audio_topology *tplg_data); |
6dd67645 VA |
163 | void gbaudio_tplg_release(struct gbaudio_module_info *module); |
164 | ||
165 | int gbaudio_module_update(struct gbaudio_codec_info *codec, | |
4ffca62a VA |
166 | struct snd_soc_dapm_widget *w, |
167 | struct gbaudio_module_info *module, | |
168 | int enable); | |
6dd67645 VA |
169 | int gbaudio_register_module(struct gbaudio_module_info *module); |
170 | void gbaudio_unregister_module(struct gbaudio_module_info *module); | |
6339d232 | 171 | |
2a70e49f | 172 | /* protocol related */ |
6339d232 VA |
173 | extern int gb_audio_gb_get_topology(struct gb_connection *connection, |
174 | struct gb_audio_topology **topology); | |
184992e3 | 175 | extern int gb_audio_gb_get_control(struct gb_connection *connection, |
31959392 | 176 | u8 control_id, u8 index, |
184992e3 MG |
177 | struct gb_audio_ctl_elem_value *value); |
178 | extern int gb_audio_gb_set_control(struct gb_connection *connection, | |
31959392 | 179 | u8 control_id, u8 index, |
184992e3 MG |
180 | struct gb_audio_ctl_elem_value *value); |
181 | extern int gb_audio_gb_enable_widget(struct gb_connection *connection, | |
31959392 | 182 | u8 widget_id); |
184992e3 | 183 | extern int gb_audio_gb_disable_widget(struct gb_connection *connection, |
31959392 | 184 | u8 widget_id); |
184992e3 | 185 | extern int gb_audio_gb_get_pcm(struct gb_connection *connection, |
79cb2b26 | 186 | u16 data_cport, uint32_t *format, |
31959392 CL |
187 | uint32_t *rate, u8 *channels, |
188 | u8 *sig_bits); | |
184992e3 | 189 | extern int gb_audio_gb_set_pcm(struct gb_connection *connection, |
79cb2b26 | 190 | u16 data_cport, uint32_t format, |
31959392 CL |
191 | uint32_t rate, u8 channels, |
192 | u8 sig_bits); | |
184992e3 | 193 | extern int gb_audio_gb_set_tx_data_size(struct gb_connection *connection, |
79cb2b26 | 194 | u16 data_cport, u16 size); |
184992e3 | 195 | extern int gb_audio_gb_activate_tx(struct gb_connection *connection, |
79cb2b26 | 196 | u16 data_cport); |
184992e3 | 197 | extern int gb_audio_gb_deactivate_tx(struct gb_connection *connection, |
79cb2b26 | 198 | u16 data_cport); |
184992e3 | 199 | extern int gb_audio_gb_set_rx_data_size(struct gb_connection *connection, |
79cb2b26 | 200 | u16 data_cport, u16 size); |
184992e3 | 201 | extern int gb_audio_gb_activate_rx(struct gb_connection *connection, |
79cb2b26 | 202 | u16 data_cport); |
184992e3 | 203 | extern int gb_audio_gb_deactivate_rx(struct gb_connection *connection, |
79cb2b26 | 204 | u16 data_cport); |
4dbf5056 MG |
205 | extern int gb_audio_apbridgea_set_config(struct gb_connection *connection, |
206 | __u16 i2s_port, __u32 format, | |
207 | __u32 rate, __u32 mclk_freq); | |
208 | extern int gb_audio_apbridgea_register_cport(struct gb_connection *connection, | |
4a8e5199 MG |
209 | __u16 i2s_port, __u16 cportid, |
210 | __u8 direction); | |
4dbf5056 | 211 | extern int gb_audio_apbridgea_unregister_cport(struct gb_connection *connection, |
4a8e5199 MG |
212 | __u16 i2s_port, __u16 cportid, |
213 | __u8 direction); | |
4dbf5056 MG |
214 | extern int gb_audio_apbridgea_set_tx_data_size(struct gb_connection *connection, |
215 | __u16 i2s_port, __u16 size); | |
5bbe14b7 MG |
216 | extern int gb_audio_apbridgea_prepare_tx(struct gb_connection *connection, |
217 | __u16 i2s_port); | |
4dbf5056 MG |
218 | extern int gb_audio_apbridgea_start_tx(struct gb_connection *connection, |
219 | __u16 i2s_port, __u64 timestamp); | |
220 | extern int gb_audio_apbridgea_stop_tx(struct gb_connection *connection, | |
221 | __u16 i2s_port); | |
5bbe14b7 MG |
222 | extern int gb_audio_apbridgea_shutdown_tx(struct gb_connection *connection, |
223 | __u16 i2s_port); | |
4dbf5056 MG |
224 | extern int gb_audio_apbridgea_set_rx_data_size(struct gb_connection *connection, |
225 | __u16 i2s_port, __u16 size); | |
5bbe14b7 MG |
226 | extern int gb_audio_apbridgea_prepare_rx(struct gb_connection *connection, |
227 | __u16 i2s_port); | |
4dbf5056 MG |
228 | extern int gb_audio_apbridgea_start_rx(struct gb_connection *connection, |
229 | __u16 i2s_port); | |
230 | extern int gb_audio_apbridgea_stop_rx(struct gb_connection *connection, | |
231 | __u16 i2s_port); | |
5bbe14b7 MG |
232 | extern int gb_audio_apbridgea_shutdown_rx(struct gb_connection *connection, |
233 | __u16 i2s_port); | |
184992e3 | 234 | |
7885342c | 235 | #endif /* __LINUX_GBAUDIO_CODEC_H */ |