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