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 "audio_apbridgea.h"
12 #include "audio_codec.h"
14 int gb_audio_apbridgea_set_config(struct gb_connection *connection,
15 __u16 i2s_port, __u32 format, __u32 rate,
18 struct audio_apbridgea_set_config_request req;
20 req.hdr.type = AUDIO_APBRIDGEA_TYPE_SET_CONFIG;
21 req.hdr.i2s_port = cpu_to_le16(i2s_port);
22 req.format = cpu_to_le32(format);
23 req.rate = cpu_to_le32(rate);
24 req.mclk_freq = cpu_to_le32(mclk_freq);
26 return gb_hd_output(connection->hd, &req, sizeof(req),
27 GB_APB_REQUEST_AUDIO_CONTROL, true);
29 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_set_config);
31 int gb_audio_apbridgea_register_cport(struct gb_connection *connection,
32 __u16 i2s_port, __u16 cportid,
35 struct audio_apbridgea_register_cport_request req;
37 req.hdr.type = AUDIO_APBRIDGEA_TYPE_REGISTER_CPORT;
38 req.hdr.i2s_port = cpu_to_le16(i2s_port);
39 req.cport = cpu_to_le16(cportid);
40 req.direction = direction;
42 return gb_hd_output(connection->hd, &req, sizeof(req),
43 GB_APB_REQUEST_AUDIO_CONTROL, true);
45 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_register_cport);
47 int gb_audio_apbridgea_unregister_cport(struct gb_connection *connection,
48 __u16 i2s_port, __u16 cportid,
51 struct audio_apbridgea_unregister_cport_request req;
53 req.hdr.type = AUDIO_APBRIDGEA_TYPE_UNREGISTER_CPORT;
54 req.hdr.i2s_port = cpu_to_le16(i2s_port);
55 req.cport = cpu_to_le16(cportid);
56 req.direction = direction;
58 return gb_hd_output(connection->hd, &req, sizeof(req),
59 GB_APB_REQUEST_AUDIO_CONTROL, true);
61 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_unregister_cport);
63 int gb_audio_apbridgea_set_tx_data_size(struct gb_connection *connection,
64 __u16 i2s_port, __u16 size)
66 struct audio_apbridgea_set_tx_data_size_request req;
68 req.hdr.type = AUDIO_APBRIDGEA_TYPE_SET_TX_DATA_SIZE;
69 req.hdr.i2s_port = cpu_to_le16(i2s_port);
70 req.size = cpu_to_le16(size);
72 return gb_hd_output(connection->hd, &req, sizeof(req),
73 GB_APB_REQUEST_AUDIO_CONTROL, true);
75 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_set_tx_data_size);
77 int gb_audio_apbridgea_get_tx_delay(struct gb_connection *connection,
78 __u16 i2s_port, __u32 *delay)
83 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_get_tx_delay);
85 int gb_audio_apbridgea_prepare_tx(struct gb_connection *connection,
88 struct audio_apbridgea_prepare_tx_request req;
90 req.hdr.type = AUDIO_APBRIDGEA_TYPE_PREPARE_TX;
91 req.hdr.i2s_port = cpu_to_le16(i2s_port);
93 return gb_hd_output(connection->hd, &req, sizeof(req),
94 GB_APB_REQUEST_AUDIO_CONTROL, true);
96 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_prepare_tx);
98 int gb_audio_apbridgea_start_tx(struct gb_connection *connection,
99 __u16 i2s_port, __u64 timestamp)
101 struct audio_apbridgea_start_tx_request req;
103 req.hdr.type = AUDIO_APBRIDGEA_TYPE_START_TX;
104 req.hdr.i2s_port = cpu_to_le16(i2s_port);
105 req.timestamp = cpu_to_le64(timestamp);
107 return gb_hd_output(connection->hd, &req, sizeof(req),
108 GB_APB_REQUEST_AUDIO_CONTROL, true);
110 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_start_tx);
112 int gb_audio_apbridgea_stop_tx(struct gb_connection *connection, __u16 i2s_port)
114 struct audio_apbridgea_stop_tx_request req;
116 req.hdr.type = AUDIO_APBRIDGEA_TYPE_STOP_TX;
117 req.hdr.i2s_port = cpu_to_le16(i2s_port);
119 return gb_hd_output(connection->hd, &req, sizeof(req),
120 GB_APB_REQUEST_AUDIO_CONTROL, true);
122 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_stop_tx);
124 int gb_audio_apbridgea_shutdown_tx(struct gb_connection *connection,
127 struct audio_apbridgea_shutdown_tx_request req;
129 req.hdr.type = AUDIO_APBRIDGEA_TYPE_SHUTDOWN_TX;
130 req.hdr.i2s_port = cpu_to_le16(i2s_port);
132 return gb_hd_output(connection->hd, &req, sizeof(req),
133 GB_APB_REQUEST_AUDIO_CONTROL, true);
135 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_shutdown_tx);
137 int gb_audio_apbridgea_set_rx_data_size(struct gb_connection *connection,
138 __u16 i2s_port, __u16 size)
140 struct audio_apbridgea_set_rx_data_size_request req;
142 req.hdr.type = AUDIO_APBRIDGEA_TYPE_SET_RX_DATA_SIZE;
143 req.hdr.i2s_port = cpu_to_le16(i2s_port);
144 req.size = cpu_to_le16(size);
146 return gb_hd_output(connection->hd, &req, sizeof(req),
147 GB_APB_REQUEST_AUDIO_CONTROL, true);
149 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_set_rx_data_size);
151 int gb_audio_apbridgea_get_rx_delay(struct gb_connection *connection,
152 __u16 i2s_port, __u32 *delay)
154 /* TODO: implement */
157 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_get_rx_delay);
159 int gb_audio_apbridgea_prepare_rx(struct gb_connection *connection,
162 struct audio_apbridgea_prepare_rx_request req;
164 req.hdr.type = AUDIO_APBRIDGEA_TYPE_PREPARE_RX;
165 req.hdr.i2s_port = cpu_to_le16(i2s_port);
167 return gb_hd_output(connection->hd, &req, sizeof(req),
168 GB_APB_REQUEST_AUDIO_CONTROL, true);
170 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_prepare_rx);
172 int gb_audio_apbridgea_start_rx(struct gb_connection *connection,
175 struct audio_apbridgea_start_rx_request req;
177 req.hdr.type = AUDIO_APBRIDGEA_TYPE_START_RX;
178 req.hdr.i2s_port = cpu_to_le16(i2s_port);
180 return gb_hd_output(connection->hd, &req, sizeof(req),
181 GB_APB_REQUEST_AUDIO_CONTROL, true);
183 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_start_rx);
185 int gb_audio_apbridgea_stop_rx(struct gb_connection *connection, __u16 i2s_port)
187 struct audio_apbridgea_stop_rx_request req;
189 req.hdr.type = AUDIO_APBRIDGEA_TYPE_STOP_RX;
190 req.hdr.i2s_port = cpu_to_le16(i2s_port);
192 return gb_hd_output(connection->hd, &req, sizeof(req),
193 GB_APB_REQUEST_AUDIO_CONTROL, true);
195 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_stop_rx);
197 int gb_audio_apbridgea_shutdown_rx(struct gb_connection *connection,
200 struct audio_apbridgea_shutdown_rx_request req;
202 req.hdr.type = AUDIO_APBRIDGEA_TYPE_SHUTDOWN_RX;
203 req.hdr.i2s_port = cpu_to_le16(i2s_port);
205 return gb_hd_output(connection->hd, &req, sizeof(req),
206 GB_APB_REQUEST_AUDIO_CONTROL, true);
208 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_shutdown_rx);
210 MODULE_LICENSE("GPL v2");
211 MODULE_ALIAS("greybus:audio-apbridgea");
212 MODULE_DESCRIPTION("Greybus Special APBridgeA Audio Protocol library");
213 MODULE_AUTHOR("Mark Greer <mgreer@animalcreek.com>");