Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Greybus Audio Device Class Protocol helpers
0004  *
0005  * Copyright 2015-2016 Google Inc.
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>");