0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/greybus.h>
0009 #include "audio_apbridgea.h"
0010 #include "audio_codec.h"
0011
0012 int gb_audio_apbridgea_set_config(struct gb_connection *connection,
0013 __u16 i2s_port, __u32 format, __u32 rate,
0014 __u32 mclk_freq)
0015 {
0016 struct audio_apbridgea_set_config_request req;
0017
0018 req.hdr.type = AUDIO_APBRIDGEA_TYPE_SET_CONFIG;
0019 req.hdr.i2s_port = cpu_to_le16(i2s_port);
0020 req.format = cpu_to_le32(format);
0021 req.rate = cpu_to_le32(rate);
0022 req.mclk_freq = cpu_to_le32(mclk_freq);
0023
0024 return gb_hd_output(connection->hd, &req, sizeof(req),
0025 GB_APB_REQUEST_AUDIO_CONTROL, true);
0026 }
0027 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_set_config);
0028
0029 int gb_audio_apbridgea_register_cport(struct gb_connection *connection,
0030 __u16 i2s_port, __u16 cportid,
0031 __u8 direction)
0032 {
0033 struct audio_apbridgea_register_cport_request req;
0034 int ret;
0035
0036 req.hdr.type = AUDIO_APBRIDGEA_TYPE_REGISTER_CPORT;
0037 req.hdr.i2s_port = cpu_to_le16(i2s_port);
0038 req.cport = cpu_to_le16(cportid);
0039 req.direction = direction;
0040
0041 ret = gb_pm_runtime_get_sync(connection->bundle);
0042 if (ret)
0043 return ret;
0044
0045 return gb_hd_output(connection->hd, &req, sizeof(req),
0046 GB_APB_REQUEST_AUDIO_CONTROL, true);
0047 }
0048 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_register_cport);
0049
0050 int gb_audio_apbridgea_unregister_cport(struct gb_connection *connection,
0051 __u16 i2s_port, __u16 cportid,
0052 __u8 direction)
0053 {
0054 struct audio_apbridgea_unregister_cport_request req;
0055 int ret;
0056
0057 req.hdr.type = AUDIO_APBRIDGEA_TYPE_UNREGISTER_CPORT;
0058 req.hdr.i2s_port = cpu_to_le16(i2s_port);
0059 req.cport = cpu_to_le16(cportid);
0060 req.direction = direction;
0061
0062 ret = gb_hd_output(connection->hd, &req, sizeof(req),
0063 GB_APB_REQUEST_AUDIO_CONTROL, true);
0064
0065 gb_pm_runtime_put_autosuspend(connection->bundle);
0066
0067 return ret;
0068 }
0069 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_unregister_cport);
0070
0071 int gb_audio_apbridgea_set_tx_data_size(struct gb_connection *connection,
0072 __u16 i2s_port, __u16 size)
0073 {
0074 struct audio_apbridgea_set_tx_data_size_request req;
0075
0076 req.hdr.type = AUDIO_APBRIDGEA_TYPE_SET_TX_DATA_SIZE;
0077 req.hdr.i2s_port = cpu_to_le16(i2s_port);
0078 req.size = cpu_to_le16(size);
0079
0080 return gb_hd_output(connection->hd, &req, sizeof(req),
0081 GB_APB_REQUEST_AUDIO_CONTROL, true);
0082 }
0083 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_set_tx_data_size);
0084
0085 int gb_audio_apbridgea_prepare_tx(struct gb_connection *connection,
0086 __u16 i2s_port)
0087 {
0088 struct audio_apbridgea_prepare_tx_request req;
0089
0090 req.hdr.type = AUDIO_APBRIDGEA_TYPE_PREPARE_TX;
0091 req.hdr.i2s_port = cpu_to_le16(i2s_port);
0092
0093 return gb_hd_output(connection->hd, &req, sizeof(req),
0094 GB_APB_REQUEST_AUDIO_CONTROL, true);
0095 }
0096 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_prepare_tx);
0097
0098 int gb_audio_apbridgea_start_tx(struct gb_connection *connection,
0099 __u16 i2s_port, __u64 timestamp)
0100 {
0101 struct audio_apbridgea_start_tx_request req;
0102
0103 req.hdr.type = AUDIO_APBRIDGEA_TYPE_START_TX;
0104 req.hdr.i2s_port = cpu_to_le16(i2s_port);
0105 req.timestamp = cpu_to_le64(timestamp);
0106
0107 return gb_hd_output(connection->hd, &req, sizeof(req),
0108 GB_APB_REQUEST_AUDIO_CONTROL, true);
0109 }
0110 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_start_tx);
0111
0112 int gb_audio_apbridgea_stop_tx(struct gb_connection *connection, __u16 i2s_port)
0113 {
0114 struct audio_apbridgea_stop_tx_request req;
0115
0116 req.hdr.type = AUDIO_APBRIDGEA_TYPE_STOP_TX;
0117 req.hdr.i2s_port = cpu_to_le16(i2s_port);
0118
0119 return gb_hd_output(connection->hd, &req, sizeof(req),
0120 GB_APB_REQUEST_AUDIO_CONTROL, true);
0121 }
0122 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_stop_tx);
0123
0124 int gb_audio_apbridgea_shutdown_tx(struct gb_connection *connection,
0125 __u16 i2s_port)
0126 {
0127 struct audio_apbridgea_shutdown_tx_request req;
0128
0129 req.hdr.type = AUDIO_APBRIDGEA_TYPE_SHUTDOWN_TX;
0130 req.hdr.i2s_port = cpu_to_le16(i2s_port);
0131
0132 return gb_hd_output(connection->hd, &req, sizeof(req),
0133 GB_APB_REQUEST_AUDIO_CONTROL, true);
0134 }
0135 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_shutdown_tx);
0136
0137 int gb_audio_apbridgea_set_rx_data_size(struct gb_connection *connection,
0138 __u16 i2s_port, __u16 size)
0139 {
0140 struct audio_apbridgea_set_rx_data_size_request req;
0141
0142 req.hdr.type = AUDIO_APBRIDGEA_TYPE_SET_RX_DATA_SIZE;
0143 req.hdr.i2s_port = cpu_to_le16(i2s_port);
0144 req.size = cpu_to_le16(size);
0145
0146 return gb_hd_output(connection->hd, &req, sizeof(req),
0147 GB_APB_REQUEST_AUDIO_CONTROL, true);
0148 }
0149 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_set_rx_data_size);
0150
0151 int gb_audio_apbridgea_prepare_rx(struct gb_connection *connection,
0152 __u16 i2s_port)
0153 {
0154 struct audio_apbridgea_prepare_rx_request req;
0155
0156 req.hdr.type = AUDIO_APBRIDGEA_TYPE_PREPARE_RX;
0157 req.hdr.i2s_port = cpu_to_le16(i2s_port);
0158
0159 return gb_hd_output(connection->hd, &req, sizeof(req),
0160 GB_APB_REQUEST_AUDIO_CONTROL, true);
0161 }
0162 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_prepare_rx);
0163
0164 int gb_audio_apbridgea_start_rx(struct gb_connection *connection,
0165 __u16 i2s_port)
0166 {
0167 struct audio_apbridgea_start_rx_request req;
0168
0169 req.hdr.type = AUDIO_APBRIDGEA_TYPE_START_RX;
0170 req.hdr.i2s_port = cpu_to_le16(i2s_port);
0171
0172 return gb_hd_output(connection->hd, &req, sizeof(req),
0173 GB_APB_REQUEST_AUDIO_CONTROL, true);
0174 }
0175 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_start_rx);
0176
0177 int gb_audio_apbridgea_stop_rx(struct gb_connection *connection, __u16 i2s_port)
0178 {
0179 struct audio_apbridgea_stop_rx_request req;
0180
0181 req.hdr.type = AUDIO_APBRIDGEA_TYPE_STOP_RX;
0182 req.hdr.i2s_port = cpu_to_le16(i2s_port);
0183
0184 return gb_hd_output(connection->hd, &req, sizeof(req),
0185 GB_APB_REQUEST_AUDIO_CONTROL, true);
0186 }
0187 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_stop_rx);
0188
0189 int gb_audio_apbridgea_shutdown_rx(struct gb_connection *connection,
0190 __u16 i2s_port)
0191 {
0192 struct audio_apbridgea_shutdown_rx_request req;
0193
0194 req.hdr.type = AUDIO_APBRIDGEA_TYPE_SHUTDOWN_RX;
0195 req.hdr.i2s_port = cpu_to_le16(i2s_port);
0196
0197 return gb_hd_output(connection->hd, &req, sizeof(req),
0198 GB_APB_REQUEST_AUDIO_CONTROL, true);
0199 }
0200 EXPORT_SYMBOL_GPL(gb_audio_apbridgea_shutdown_rx);
0201
0202 MODULE_LICENSE("GPL v2");
0203 MODULE_ALIAS("greybus:audio-apbridgea");
0204 MODULE_DESCRIPTION("Greybus Special APBridgeA Audio Protocol library");
0205 MODULE_AUTHOR("Mark Greer <mgreer@animalcreek.com>");