1 // SPDX-License-Identifier: GPL-2.0
3 * Greybus Audio Device Class Protocol helpers
5 * Copyright 2015-2016 Google Inc.
8 #include <linux/greybus.h>
9 #include "audio_codec.h"
11 /* TODO: Split into separate calls */
12 int gb_audio_gb_get_topology(struct gb_connection *connection,
13 struct gb_audio_topology **topology)
15 struct gb_audio_get_topology_size_response size_resp;
16 struct gb_audio_topology *topo;
20 ret = gb_operation_sync(connection, GB_AUDIO_TYPE_GET_TOPOLOGY_SIZE,
21 NULL, 0, &size_resp, sizeof(size_resp));
25 size = le16_to_cpu(size_resp.size);
26 if (size < sizeof(*topo))
29 topo = kzalloc(size, GFP_KERNEL);
33 ret = gb_operation_sync(connection, GB_AUDIO_TYPE_GET_TOPOLOGY, NULL, 0,
44 EXPORT_SYMBOL_GPL(gb_audio_gb_get_topology);
46 int gb_audio_gb_get_control(struct gb_connection *connection,
47 u8 control_id, u8 index,
48 struct gb_audio_ctl_elem_value *value)
50 struct gb_audio_get_control_request req;
51 struct gb_audio_get_control_response resp;
54 req.control_id = control_id;
57 ret = gb_operation_sync(connection, GB_AUDIO_TYPE_GET_CONTROL,
58 &req, sizeof(req), &resp, sizeof(resp));
62 memcpy(value, &resp.value, sizeof(*value));
66 EXPORT_SYMBOL_GPL(gb_audio_gb_get_control);
68 int gb_audio_gb_set_control(struct gb_connection *connection,
69 u8 control_id, u8 index,
70 struct gb_audio_ctl_elem_value *value)
72 struct gb_audio_set_control_request req;
74 req.control_id = control_id;
76 memcpy(&req.value, value, sizeof(req.value));
78 return gb_operation_sync(connection, GB_AUDIO_TYPE_SET_CONTROL,
79 &req, sizeof(req), NULL, 0);
81 EXPORT_SYMBOL_GPL(gb_audio_gb_set_control);
83 int gb_audio_gb_enable_widget(struct gb_connection *connection,
86 struct gb_audio_enable_widget_request req;
88 req.widget_id = widget_id;
90 return gb_operation_sync(connection, GB_AUDIO_TYPE_ENABLE_WIDGET,
91 &req, sizeof(req), NULL, 0);
93 EXPORT_SYMBOL_GPL(gb_audio_gb_enable_widget);
95 int gb_audio_gb_disable_widget(struct gb_connection *connection,
98 struct gb_audio_disable_widget_request req;
100 req.widget_id = widget_id;
102 return gb_operation_sync(connection, GB_AUDIO_TYPE_DISABLE_WIDGET,
103 &req, sizeof(req), NULL, 0);
105 EXPORT_SYMBOL_GPL(gb_audio_gb_disable_widget);
107 int gb_audio_gb_get_pcm(struct gb_connection *connection, u16 data_cport,
108 u32 *format, u32 *rate, u8 *channels,
111 struct gb_audio_get_pcm_request req;
112 struct gb_audio_get_pcm_response resp;
115 req.data_cport = cpu_to_le16(data_cport);
117 ret = gb_operation_sync(connection, GB_AUDIO_TYPE_GET_PCM,
118 &req, sizeof(req), &resp, sizeof(resp));
122 *format = le32_to_cpu(resp.format);
123 *rate = le32_to_cpu(resp.rate);
124 *channels = resp.channels;
125 *sig_bits = resp.sig_bits;
129 EXPORT_SYMBOL_GPL(gb_audio_gb_get_pcm);
131 int gb_audio_gb_set_pcm(struct gb_connection *connection, u16 data_cport,
132 u32 format, u32 rate, u8 channels,
135 struct gb_audio_set_pcm_request req;
137 req.data_cport = cpu_to_le16(data_cport);
138 req.format = cpu_to_le32(format);
139 req.rate = cpu_to_le32(rate);
140 req.channels = channels;
141 req.sig_bits = sig_bits;
143 return gb_operation_sync(connection, GB_AUDIO_TYPE_SET_PCM,
144 &req, sizeof(req), NULL, 0);
146 EXPORT_SYMBOL_GPL(gb_audio_gb_set_pcm);
148 int gb_audio_gb_set_tx_data_size(struct gb_connection *connection,
149 u16 data_cport, u16 size)
151 struct gb_audio_set_tx_data_size_request req;
153 req.data_cport = cpu_to_le16(data_cport);
154 req.size = cpu_to_le16(size);
156 return gb_operation_sync(connection, GB_AUDIO_TYPE_SET_TX_DATA_SIZE,
157 &req, sizeof(req), NULL, 0);
159 EXPORT_SYMBOL_GPL(gb_audio_gb_set_tx_data_size);
161 int gb_audio_gb_activate_tx(struct gb_connection *connection,
164 struct gb_audio_activate_tx_request req;
166 req.data_cport = cpu_to_le16(data_cport);
168 return gb_operation_sync(connection, GB_AUDIO_TYPE_ACTIVATE_TX,
169 &req, sizeof(req), NULL, 0);
171 EXPORT_SYMBOL_GPL(gb_audio_gb_activate_tx);
173 int gb_audio_gb_deactivate_tx(struct gb_connection *connection,
176 struct gb_audio_deactivate_tx_request req;
178 req.data_cport = cpu_to_le16(data_cport);
180 return gb_operation_sync(connection, GB_AUDIO_TYPE_DEACTIVATE_TX,
181 &req, sizeof(req), NULL, 0);
183 EXPORT_SYMBOL_GPL(gb_audio_gb_deactivate_tx);
185 int gb_audio_gb_set_rx_data_size(struct gb_connection *connection,
186 u16 data_cport, u16 size)
188 struct gb_audio_set_rx_data_size_request req;
190 req.data_cport = cpu_to_le16(data_cport);
191 req.size = cpu_to_le16(size);
193 return gb_operation_sync(connection, GB_AUDIO_TYPE_SET_RX_DATA_SIZE,
194 &req, sizeof(req), NULL, 0);
196 EXPORT_SYMBOL_GPL(gb_audio_gb_set_rx_data_size);
198 int gb_audio_gb_activate_rx(struct gb_connection *connection,
201 struct gb_audio_activate_rx_request req;
203 req.data_cport = cpu_to_le16(data_cport);
205 return gb_operation_sync(connection, GB_AUDIO_TYPE_ACTIVATE_RX,
206 &req, sizeof(req), NULL, 0);
208 EXPORT_SYMBOL_GPL(gb_audio_gb_activate_rx);
210 int gb_audio_gb_deactivate_rx(struct gb_connection *connection,
213 struct gb_audio_deactivate_rx_request req;
215 req.data_cport = cpu_to_le16(data_cport);
217 return gb_operation_sync(connection, GB_AUDIO_TYPE_DEACTIVATE_RX,
218 &req, sizeof(req), NULL, 0);
220 EXPORT_SYMBOL_GPL(gb_audio_gb_deactivate_rx);
222 MODULE_LICENSE("GPL v2");
223 MODULE_ALIAS("greybus:audio-gb");
224 MODULE_DESCRIPTION("Greybus Audio Device Class Protocol library");