2 * Greybus Audio Device Class Protocol helpers
4 * Copyright 2015-2016 Google Inc.
6 * Released under the GPLv2 only.
10 #include "greybus_protocols.h"
11 #include "operation.h"
12 #include "audio_codec.h"
14 /* TODO: Split into separate calls */
15 int gb_audio_gb_get_topology(struct gb_connection *connection,
16 struct gb_audio_topology **topology)
18 struct gb_audio_get_topology_size_response size_resp;
19 struct gb_audio_topology *topo;
23 ret = gb_operation_sync(connection, GB_AUDIO_TYPE_GET_TOPOLOGY_SIZE,
24 NULL, 0, &size_resp, sizeof(size_resp));
28 size = le16_to_cpu(size_resp.size);
29 if (size < sizeof(*topo))
32 topo = kzalloc(size, GFP_KERNEL);
36 ret = gb_operation_sync(connection, GB_AUDIO_TYPE_GET_TOPOLOGY, NULL, 0,
47 EXPORT_SYMBOL_GPL(gb_audio_gb_get_topology);
49 int gb_audio_gb_get_control(struct gb_connection *connection,
50 u8 control_id, u8 index,
51 struct gb_audio_ctl_elem_value *value)
53 struct gb_audio_get_control_request req;
54 struct gb_audio_get_control_response resp;
57 req.control_id = control_id;
60 ret = gb_operation_sync(connection, GB_AUDIO_TYPE_GET_CONTROL,
61 &req, sizeof(req), &resp, sizeof(resp));
65 memcpy(value, &resp.value, sizeof(*value));
69 EXPORT_SYMBOL_GPL(gb_audio_gb_get_control);
71 int gb_audio_gb_set_control(struct gb_connection *connection,
72 u8 control_id, u8 index,
73 struct gb_audio_ctl_elem_value *value)
75 struct gb_audio_set_control_request req;
77 req.control_id = control_id;
79 memcpy(&req.value, value, sizeof(req.value));
81 return gb_operation_sync(connection, GB_AUDIO_TYPE_SET_CONTROL,
82 &req, sizeof(req), NULL, 0);
84 EXPORT_SYMBOL_GPL(gb_audio_gb_set_control);
86 int gb_audio_gb_enable_widget(struct gb_connection *connection,
89 struct gb_audio_enable_widget_request req;
91 req.widget_id = widget_id;
93 return gb_operation_sync(connection, GB_AUDIO_TYPE_ENABLE_WIDGET,
94 &req, sizeof(req), NULL, 0);
96 EXPORT_SYMBOL_GPL(gb_audio_gb_enable_widget);
98 int gb_audio_gb_disable_widget(struct gb_connection *connection,
101 struct gb_audio_disable_widget_request req;
103 req.widget_id = widget_id;
105 return gb_operation_sync(connection, GB_AUDIO_TYPE_DISABLE_WIDGET,
106 &req, sizeof(req), NULL, 0);
108 EXPORT_SYMBOL_GPL(gb_audio_gb_disable_widget);
110 int gb_audio_gb_get_pcm(struct gb_connection *connection, u16 data_cport,
111 u32 *format, u32 *rate, u8 *channels,
114 struct gb_audio_get_pcm_request req;
115 struct gb_audio_get_pcm_response resp;
118 req.data_cport = cpu_to_le16(data_cport);
120 ret = gb_operation_sync(connection, GB_AUDIO_TYPE_GET_PCM,
121 &req, sizeof(req), &resp, sizeof(resp));
125 *format = le32_to_cpu(resp.format);
126 *rate = le32_to_cpu(resp.rate);
127 *channels = resp.channels;
128 *sig_bits = resp.sig_bits;
132 EXPORT_SYMBOL_GPL(gb_audio_gb_get_pcm);
134 int gb_audio_gb_set_pcm(struct gb_connection *connection, u16 data_cport,
135 u32 format, u32 rate, u8 channels,
138 struct gb_audio_set_pcm_request req;
140 req.data_cport = cpu_to_le16(data_cport);
141 req.format = cpu_to_le32(format);
142 req.rate = cpu_to_le32(rate);
143 req.channels = channels;
144 req.sig_bits = sig_bits;
146 return gb_operation_sync(connection, GB_AUDIO_TYPE_SET_PCM,
147 &req, sizeof(req), NULL, 0);
149 EXPORT_SYMBOL_GPL(gb_audio_gb_set_pcm);
151 int gb_audio_gb_set_tx_data_size(struct gb_connection *connection,
152 u16 data_cport, u16 size)
154 struct gb_audio_set_tx_data_size_request req;
156 req.data_cport = cpu_to_le16(data_cport);
157 req.size = cpu_to_le16(size);
159 return gb_operation_sync(connection, GB_AUDIO_TYPE_SET_TX_DATA_SIZE,
160 &req, sizeof(req), NULL, 0);
162 EXPORT_SYMBOL_GPL(gb_audio_gb_set_tx_data_size);
164 int gb_audio_gb_activate_tx(struct gb_connection *connection,
167 struct gb_audio_activate_tx_request req;
169 req.data_cport = cpu_to_le16(data_cport);
171 return gb_operation_sync(connection, GB_AUDIO_TYPE_ACTIVATE_TX,
172 &req, sizeof(req), NULL, 0);
174 EXPORT_SYMBOL_GPL(gb_audio_gb_activate_tx);
176 int gb_audio_gb_deactivate_tx(struct gb_connection *connection,
179 struct gb_audio_deactivate_tx_request req;
181 req.data_cport = cpu_to_le16(data_cport);
183 return gb_operation_sync(connection, GB_AUDIO_TYPE_DEACTIVATE_TX,
184 &req, sizeof(req), NULL, 0);
186 EXPORT_SYMBOL_GPL(gb_audio_gb_deactivate_tx);
188 int gb_audio_gb_set_rx_data_size(struct gb_connection *connection,
189 u16 data_cport, u16 size)
191 struct gb_audio_set_rx_data_size_request req;
193 req.data_cport = cpu_to_le16(data_cport);
194 req.size = cpu_to_le16(size);
196 return gb_operation_sync(connection, GB_AUDIO_TYPE_SET_RX_DATA_SIZE,
197 &req, sizeof(req), NULL, 0);
199 EXPORT_SYMBOL_GPL(gb_audio_gb_set_rx_data_size);
201 int gb_audio_gb_activate_rx(struct gb_connection *connection,
204 struct gb_audio_activate_rx_request req;
206 req.data_cport = cpu_to_le16(data_cport);
208 return gb_operation_sync(connection, GB_AUDIO_TYPE_ACTIVATE_RX,
209 &req, sizeof(req), NULL, 0);
211 EXPORT_SYMBOL_GPL(gb_audio_gb_activate_rx);
213 int gb_audio_gb_deactivate_rx(struct gb_connection *connection,
216 struct gb_audio_deactivate_rx_request req;
218 req.data_cport = cpu_to_le16(data_cport);
220 return gb_operation_sync(connection, GB_AUDIO_TYPE_DEACTIVATE_RX,
221 &req, sizeof(req), NULL, 0);
223 EXPORT_SYMBOL_GPL(gb_audio_gb_deactivate_rx);
225 MODULE_LICENSE("GPL v2");
226 MODULE_ALIAS("greybus:audio-gb");
227 MODULE_DESCRIPTION("Greybus Audio Device Class Protocol library");
228 MODULE_AUTHOR("Mark Greer <mgreer@animalcreek.com>");