]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/staging/greybus/audio_codec.h
greybus: audio: topology: Add helper API to map controlid with widget name
[mirror_ubuntu-bionic-kernel.git] / drivers / staging / greybus / audio_codec.h
CommitLineData
d3d2af51
VA
1/*
2 * Greybus audio driver
3 * Copyright 2015 Google Inc.
4 * Copyright 2015 Linaro Ltd.
5 *
6 * Released under the GPLv2 only.
7 */
8
7885342c
VA
9#ifndef __LINUX_GBAUDIO_CODEC_H
10#define __LINUX_GBAUDIO_CODEC_H
d3d2af51
VA
11
12#include <sound/soc.h>
64a7e2cc 13#include <sound/jack.h>
d3d2af51 14
184992e3
MG
15#include "greybus.h"
16#include "greybus_protocols.h"
17
d3d2af51 18#define NAME_SIZE 32
2a70e49f 19#define MAX_DAIS 2 /* APB1, APB2 */
d3d2af51
VA
20
21enum {
22 APB1_PCM = 0,
23 APB2_PCM,
24 NUM_CODEC_DAIS,
25};
26
27enum gbcodec_reg_index {
28 GBCODEC_CTL_REG,
29 GBCODEC_MUTE_REG,
30 GBCODEC_PB_LVOL_REG,
31 GBCODEC_PB_RVOL_REG,
32 GBCODEC_CAP_LVOL_REG,
33 GBCODEC_CAP_RVOL_REG,
34 GBCODEC_APB1_MUX_REG,
35 GBCODEC_APB2_MUX_REG,
36 GBCODEC_REG_COUNT
37};
38
89de9a06
VA
39/* device_type should be same as defined in audio.h (Android media layer) */
40enum {
41 GBAUDIO_DEVICE_NONE = 0x0,
42 /* reserved bits */
43 GBAUDIO_DEVICE_BIT_IN = 0x80000000,
44 GBAUDIO_DEVICE_BIT_DEFAULT = 0x40000000,
45 /* output devices */
46 GBAUDIO_DEVICE_OUT_SPEAKER = 0x2,
47 GBAUDIO_DEVICE_OUT_WIRED_HEADSET = 0x4,
48 GBAUDIO_DEVICE_OUT_WIRED_HEADPHONE = 0x8,
49 /* input devices */
50 GBAUDIO_DEVICE_IN_BUILTIN_MIC = GBAUDIO_DEVICE_BIT_IN | 0x4,
51 GBAUDIO_DEVICE_IN_WIRED_HEADSET = GBAUDIO_DEVICE_BIT_IN | 0x10,
52};
53
d3d2af51
VA
54/* bit 0-SPK, 1-HP, 2-DAC,
55 * 4-MIC, 5-HSMIC, 6-MIC2
56 */
57#define GBCODEC_CTL_REG_DEFAULT 0x00
58
59/* bit 0,1 - APB1-PB-L/R
60 * bit 2,3 - APB2-PB-L/R
61 * bit 4,5 - APB1-Cap-L/R
62 * bit 6,7 - APB2-Cap-L/R
63 */
64#define GBCODEC_MUTE_REG_DEFAULT 0x00
65
66/* 0-127 steps */
67#define GBCODEC_PB_VOL_REG_DEFAULT 0x00
68#define GBCODEC_CAP_VOL_REG_DEFAULT 0x00
69
70/* bit 0,1,2 - PB stereo, left, right
71 * bit 8,9,10 - Cap stereo, left, right
72 */
73#define GBCODEC_APB1_MUX_REG_DEFAULT 0x00
74#define GBCODEC_APB2_MUX_REG_DEFAULT 0x00
75
64a7e2cc
VA
76#define GBCODEC_JACK_MASK (SND_JACK_HEADSET | SND_JACK_LINEOUT | \
77 SND_JACK_LINEIN | SND_JACK_UNSUPPORTED)
78#define GBCODEC_JACK_BUTTON_MASK (SND_JACK_BTN_0 | SND_JACK_BTN_1 | \
79 SND_JACK_BTN_2 | SND_JACK_BTN_3)
80
d3d2af51
VA
81static const u8 gbcodec_reg_defaults[GBCODEC_REG_COUNT] = {
82 GBCODEC_CTL_REG_DEFAULT,
83 GBCODEC_MUTE_REG_DEFAULT,
84 GBCODEC_PB_VOL_REG_DEFAULT,
85 GBCODEC_PB_VOL_REG_DEFAULT,
86 GBCODEC_CAP_VOL_REG_DEFAULT,
87 GBCODEC_CAP_VOL_REG_DEFAULT,
88 GBCODEC_APB1_MUX_REG_DEFAULT,
89 GBCODEC_APB2_MUX_REG_DEFAULT,
90};
91
6dd67645
VA
92enum gbaudio_codec_state {
93 GBAUDIO_CODEC_SHUTDOWN = 0,
94 GBAUDIO_CODEC_STARTUP,
95 GBAUDIO_CODEC_HWPARAMS,
96 GBAUDIO_CODEC_PREPARE,
97 GBAUDIO_CODEC_START,
98 GBAUDIO_CODEC_STOP,
99};
100
101struct gbaudio_stream {
102 const char *dai_name;
103 int state;
104 uint8_t sig_bits, channels;
105 uint32_t format, rate;
106};
107
108struct gbaudio_codec_info {
109 struct device *dev;
110 struct snd_soc_codec *codec;
111 struct list_head module_list;
112 struct gbaudio_stream stream[2]; /* PB/CAP */
113 struct mutex lock;
114 u8 reg[GBCODEC_REG_COUNT];
115};
116
6339d232
VA
117struct gbaudio_widget {
118 __u8 id;
119 const char *name;
120 struct list_head list;
121};
122
123struct gbaudio_control {
124 __u8 id;
125 char *name;
0c15a9e0 126 char *wname;
6339d232
VA
127 const char * const *texts;
128 struct list_head list;
129};
130
6dd67645 131struct gbaudio_data_connection {
2a70e49f 132 __le16 data_cport;
6dd67645 133 int cport_configured;
2a70e49f
VA
134 char name[NAME_SIZE];
135 struct gb_connection *connection;
136 struct list_head list;
137};
138
6dd67645
VA
139/* stream direction */
140#define GB_PLAYBACK BIT(0)
141#define GB_CAPTURE BIT(1)
142
143enum gbaudio_module_state {
144 GBAUDIO_MODULE_OFF = 0,
145 GBAUDIO_MODULE_ON,
146};
147
148struct gbaudio_module_info {
2a70e49f 149 /* module info */
6dd67645 150 struct device *dev;
2a70e49f
VA
151 int dev_id; /* check if it should be bundle_id/hd_cport_id */
152 int vid;
153 int pid;
154 int slot;
155 int type;
17247da5 156 int set_uevent;
2a70e49f
VA
157 char vstr[NAME_SIZE];
158 char pstr[NAME_SIZE];
159 struct list_head list;
17247da5
VA
160 /* need to share this info to above user space */
161 int manager_id;
2a70e49f 162 char name[NAME_SIZE];
89de9a06
VA
163 unsigned int ip_devices;
164 unsigned int op_devices;
d3d2af51 165
64a7e2cc
VA
166 /* jack related */
167 char jack_name[NAME_SIZE];
168 char button_name[NAME_SIZE];
169 int num_jacks;
170 int jack_type;
171 int button_status;
172 struct snd_soc_jack headset_jack;
173 struct snd_soc_jack button_jack;
174
6dd67645 175 /* used by codec_ops */
6dd67645 176 int ctrlstate[2]; /* PB/CAP */
3994e0b1 177
6dd67645 178 /* connection info */
2a70e49f 179 struct gb_connection *mgmt_connection;
796fad44 180 size_t num_data_connections;
6dd67645
VA
181 struct list_head data_list;
182
796fad44 183 /* topology related */
2a70e49f 184 int num_dais;
6dd67645 185 int num_controls;
d3d2af51
VA
186 int num_dapm_widgets;
187 int num_dapm_routes;
6339d232
VA
188 unsigned long dai_offset;
189 unsigned long widget_offset;
190 unsigned long control_offset;
191 unsigned long route_offset;
6dd67645
VA
192 struct snd_kcontrol_new *controls;
193 struct snd_soc_dapm_widget *dapm_widgets;
194 struct snd_soc_dapm_route *dapm_routes;
2a70e49f
VA
195 struct snd_soc_dai_driver *dais;
196
6339d232 197 struct list_head widget_list;
6dd67645 198 struct list_head ctl_list;
6339d232 199 struct list_head widget_ctl_list;
6dd67645
VA
200
201 struct gb_audio_topology *topology;
d3d2af51
VA
202};
203
6dd67645 204int gbaudio_tplg_parse_data(struct gbaudio_module_info *module,
6339d232 205 struct gb_audio_topology *tplg_data);
6dd67645
VA
206void gbaudio_tplg_release(struct gbaudio_module_info *module);
207
208int gbaudio_module_update(struct gbaudio_codec_info *codec,
209 const char *w_name,
210 struct gbaudio_module_info *module,
211 int enable);
212int gbaudio_register_module(struct gbaudio_module_info *module);
213void gbaudio_unregister_module(struct gbaudio_module_info *module);
6339d232 214
2a70e49f 215/* protocol related */
6339d232
VA
216extern int gb_audio_gb_get_topology(struct gb_connection *connection,
217 struct gb_audio_topology **topology);
184992e3
MG
218extern int gb_audio_gb_get_control(struct gb_connection *connection,
219 uint8_t control_id, uint8_t index,
220 struct gb_audio_ctl_elem_value *value);
221extern int gb_audio_gb_set_control(struct gb_connection *connection,
222 uint8_t control_id, uint8_t index,
223 struct gb_audio_ctl_elem_value *value);
224extern int gb_audio_gb_enable_widget(struct gb_connection *connection,
225 uint8_t widget_id);
226extern int gb_audio_gb_disable_widget(struct gb_connection *connection,
227 uint8_t widget_id);
228extern int gb_audio_gb_get_pcm(struct gb_connection *connection,
229 uint16_t data_cport, uint32_t *format,
230 uint32_t *rate, uint8_t *channels,
231 uint8_t *sig_bits);
232extern int gb_audio_gb_set_pcm(struct gb_connection *connection,
233 uint16_t data_cport, uint32_t format,
234 uint32_t rate, uint8_t channels,
235 uint8_t sig_bits);
236extern int gb_audio_gb_set_tx_data_size(struct gb_connection *connection,
237 uint16_t data_cport, uint16_t size);
238extern int gb_audio_gb_get_tx_delay(struct gb_connection *connection,
239 uint16_t data_cport, uint32_t *delay);
240extern int gb_audio_gb_activate_tx(struct gb_connection *connection,
241 uint16_t data_cport);
242extern int gb_audio_gb_deactivate_tx(struct gb_connection *connection,
243 uint16_t data_cport);
244extern int gb_audio_gb_set_rx_data_size(struct gb_connection *connection,
245 uint16_t data_cport, uint16_t size);
246extern int gb_audio_gb_get_rx_delay(struct gb_connection *connection,
247 uint16_t data_cport, uint32_t *delay);
248extern int gb_audio_gb_activate_rx(struct gb_connection *connection,
249 uint16_t data_cport);
250extern int gb_audio_gb_deactivate_rx(struct gb_connection *connection,
251 uint16_t data_cport);
4dbf5056
MG
252extern int gb_audio_apbridgea_set_config(struct gb_connection *connection,
253 __u16 i2s_port, __u32 format,
254 __u32 rate, __u32 mclk_freq);
255extern int gb_audio_apbridgea_register_cport(struct gb_connection *connection,
4a8e5199
MG
256 __u16 i2s_port, __u16 cportid,
257 __u8 direction);
4dbf5056 258extern int gb_audio_apbridgea_unregister_cport(struct gb_connection *connection,
4a8e5199
MG
259 __u16 i2s_port, __u16 cportid,
260 __u8 direction);
4dbf5056
MG
261extern int gb_audio_apbridgea_set_tx_data_size(struct gb_connection *connection,
262 __u16 i2s_port, __u16 size);
263extern int gb_audio_apbridgea_get_tx_delay(struct gb_connection *connection,
264 __u16 i2s_port, __u32 *delay);
5bbe14b7
MG
265extern int gb_audio_apbridgea_prepare_tx(struct gb_connection *connection,
266 __u16 i2s_port);
4dbf5056
MG
267extern int gb_audio_apbridgea_start_tx(struct gb_connection *connection,
268 __u16 i2s_port, __u64 timestamp);
269extern int gb_audio_apbridgea_stop_tx(struct gb_connection *connection,
270 __u16 i2s_port);
5bbe14b7
MG
271extern int gb_audio_apbridgea_shutdown_tx(struct gb_connection *connection,
272 __u16 i2s_port);
4dbf5056
MG
273extern int gb_audio_apbridgea_set_rx_data_size(struct gb_connection *connection,
274 __u16 i2s_port, __u16 size);
275extern int gb_audio_apbridgea_get_rx_delay(struct gb_connection *connection,
276 __u16 i2s_port, __u32 *delay);
5bbe14b7
MG
277extern int gb_audio_apbridgea_prepare_rx(struct gb_connection *connection,
278 __u16 i2s_port);
4dbf5056
MG
279extern int gb_audio_apbridgea_start_rx(struct gb_connection *connection,
280 __u16 i2s_port);
281extern int gb_audio_apbridgea_stop_rx(struct gb_connection *connection,
282 __u16 i2s_port);
5bbe14b7
MG
283extern int gb_audio_apbridgea_shutdown_rx(struct gb_connection *connection,
284 __u16 i2s_port);
184992e3 285
7885342c 286#endif /* __LINUX_GBAUDIO_CODEC_H */