]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/staging/greybus/audio_codec.h
UBUNTU: Ubuntu-4.15.0-96.97
[mirror_ubuntu-bionic-kernel.git] / drivers / staging / greybus / audio_codec.h
CommitLineData
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
20enum {
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) */
27enum {
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
44enum 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 53struct gbaudio_stream_params {
6dd67645 54 int state;
31959392 55 u8 sig_bits, channels;
6dd67645
VA
56 uint32_t format, rate;
57};
58
19866603
VA
59struct 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
66struct 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
75struct gbaudio_widget {
76 __u8 id;
77 const char *name;
78 struct list_head list;
79};
80
81struct 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 90struct 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
103enum gbaudio_module_state {
104 GBAUDIO_MODULE_OFF = 0,
105 GBAUDIO_MODULE_ON,
106};
107
108struct 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 161int gbaudio_tplg_parse_data(struct gbaudio_module_info *module,
6339d232 162 struct gb_audio_topology *tplg_data);
6dd67645
VA
163void gbaudio_tplg_release(struct gbaudio_module_info *module);
164
165int 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
169int gbaudio_register_module(struct gbaudio_module_info *module);
170void gbaudio_unregister_module(struct gbaudio_module_info *module);
6339d232 171
2a70e49f 172/* protocol related */
6339d232
VA
173extern int gb_audio_gb_get_topology(struct gb_connection *connection,
174 struct gb_audio_topology **topology);
184992e3 175extern 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);
178extern 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);
181extern int gb_audio_gb_enable_widget(struct gb_connection *connection,
31959392 182 u8 widget_id);
184992e3 183extern int gb_audio_gb_disable_widget(struct gb_connection *connection,
31959392 184 u8 widget_id);
184992e3 185extern 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 189extern 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 193extern int gb_audio_gb_set_tx_data_size(struct gb_connection *connection,
79cb2b26 194 u16 data_cport, u16 size);
184992e3 195extern int gb_audio_gb_activate_tx(struct gb_connection *connection,
79cb2b26 196 u16 data_cport);
184992e3 197extern int gb_audio_gb_deactivate_tx(struct gb_connection *connection,
79cb2b26 198 u16 data_cport);
184992e3 199extern int gb_audio_gb_set_rx_data_size(struct gb_connection *connection,
79cb2b26 200 u16 data_cport, u16 size);
184992e3 201extern int gb_audio_gb_activate_rx(struct gb_connection *connection,
79cb2b26 202 u16 data_cport);
184992e3 203extern int gb_audio_gb_deactivate_rx(struct gb_connection *connection,
79cb2b26 204 u16 data_cport);
4dbf5056
MG
205extern int gb_audio_apbridgea_set_config(struct gb_connection *connection,
206 __u16 i2s_port, __u32 format,
207 __u32 rate, __u32 mclk_freq);
208extern int gb_audio_apbridgea_register_cport(struct gb_connection *connection,
4a8e5199
MG
209 __u16 i2s_port, __u16 cportid,
210 __u8 direction);
4dbf5056 211extern int gb_audio_apbridgea_unregister_cport(struct gb_connection *connection,
4a8e5199
MG
212 __u16 i2s_port, __u16 cportid,
213 __u8 direction);
4dbf5056
MG
214extern int gb_audio_apbridgea_set_tx_data_size(struct gb_connection *connection,
215 __u16 i2s_port, __u16 size);
5bbe14b7
MG
216extern int gb_audio_apbridgea_prepare_tx(struct gb_connection *connection,
217 __u16 i2s_port);
4dbf5056
MG
218extern int gb_audio_apbridgea_start_tx(struct gb_connection *connection,
219 __u16 i2s_port, __u64 timestamp);
220extern int gb_audio_apbridgea_stop_tx(struct gb_connection *connection,
221 __u16 i2s_port);
5bbe14b7
MG
222extern int gb_audio_apbridgea_shutdown_tx(struct gb_connection *connection,
223 __u16 i2s_port);
4dbf5056
MG
224extern int gb_audio_apbridgea_set_rx_data_size(struct gb_connection *connection,
225 __u16 i2s_port, __u16 size);
5bbe14b7
MG
226extern int gb_audio_apbridgea_prepare_rx(struct gb_connection *connection,
227 __u16 i2s_port);
4dbf5056
MG
228extern int gb_audio_apbridgea_start_rx(struct gb_connection *connection,
229 __u16 i2s_port);
230extern int gb_audio_apbridgea_stop_rx(struct gb_connection *connection,
231 __u16 i2s_port);
5bbe14b7
MG
232extern int gb_audio_apbridgea_shutdown_rx(struct gb_connection *connection,
233 __u16 i2s_port);
184992e3 234
7885342c 235#endif /* __LINUX_GBAUDIO_CODEC_H */