linux/drivers/staging/greybus/audio_apbridgea.c
<<
>>
Prefs
   1/*
   2 * Greybus Audio Device Class Protocol helpers
   3 *
   4 * Copyright 2015-2016 Google Inc.
   5 *
   6 * Released under the GPLv2 only.
   7 */
   8
   9#include "greybus.h"
  10#include "greybus_protocols.h"
  11#include "audio_apbridgea.h"
  12#include "audio_codec.h"
  13
  14int gb_audio_apbridgea_set_config(struct gb_connection *connection,
  15                                  __u16 i2s_port, __u32 format, __u32 rate,
  16                                  __u32 mclk_freq)
  17{
  18        struct audio_apbridgea_set_config_request req;
  19
  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);
  25
  26        return gb_hd_output(connection->hd, &req, sizeof(req),
  27                            GB_APB_REQUEST_AUDIO_CONTROL, true);
  28}
  29EXPORT_SYMBOL_GPL(gb_audio_apbridgea_set_config);
  30
  31int gb_audio_apbridgea_register_cport(struct gb_connection *connection,
  32                                      __u16 i2s_port, __u16 cportid,
  33                                      __u8 direction)
  34{
  35        struct audio_apbridgea_register_cport_request req;
  36        int ret;
  37
  38        req.hdr.type = AUDIO_APBRIDGEA_TYPE_REGISTER_CPORT;
  39        req.hdr.i2s_port = cpu_to_le16(i2s_port);
  40        req.cport = cpu_to_le16(cportid);
  41        req.direction = direction;
  42
  43        ret = gb_pm_runtime_get_sync(connection->bundle);
  44        if (ret)
  45                return ret;
  46
  47        return gb_hd_output(connection->hd, &req, sizeof(req),
  48                            GB_APB_REQUEST_AUDIO_CONTROL, true);
  49}
  50EXPORT_SYMBOL_GPL(gb_audio_apbridgea_register_cport);
  51
  52int gb_audio_apbridgea_unregister_cport(struct gb_connection *connection,
  53                                        __u16 i2s_port, __u16 cportid,
  54                                        __u8 direction)
  55{
  56        struct audio_apbridgea_unregister_cport_request req;
  57        int ret;
  58
  59        req.hdr.type = AUDIO_APBRIDGEA_TYPE_UNREGISTER_CPORT;
  60        req.hdr.i2s_port = cpu_to_le16(i2s_port);
  61        req.cport = cpu_to_le16(cportid);
  62        req.direction = direction;
  63
  64        ret = gb_hd_output(connection->hd, &req, sizeof(req),
  65                           GB_APB_REQUEST_AUDIO_CONTROL, true);
  66
  67        gb_pm_runtime_put_autosuspend(connection->bundle);
  68
  69        return ret;
  70}
  71EXPORT_SYMBOL_GPL(gb_audio_apbridgea_unregister_cport);
  72
  73int gb_audio_apbridgea_set_tx_data_size(struct gb_connection *connection,
  74                                        __u16 i2s_port, __u16 size)
  75{
  76        struct audio_apbridgea_set_tx_data_size_request req;
  77
  78        req.hdr.type = AUDIO_APBRIDGEA_TYPE_SET_TX_DATA_SIZE;
  79        req.hdr.i2s_port = cpu_to_le16(i2s_port);
  80        req.size = cpu_to_le16(size);
  81
  82        return gb_hd_output(connection->hd, &req, sizeof(req),
  83                            GB_APB_REQUEST_AUDIO_CONTROL, true);
  84}
  85EXPORT_SYMBOL_GPL(gb_audio_apbridgea_set_tx_data_size);
  86
  87int gb_audio_apbridgea_prepare_tx(struct gb_connection *connection,
  88                                  __u16 i2s_port)
  89{
  90        struct audio_apbridgea_prepare_tx_request req;
  91
  92        req.hdr.type = AUDIO_APBRIDGEA_TYPE_PREPARE_TX;
  93        req.hdr.i2s_port = cpu_to_le16(i2s_port);
  94
  95        return gb_hd_output(connection->hd, &req, sizeof(req),
  96                            GB_APB_REQUEST_AUDIO_CONTROL, true);
  97}
  98EXPORT_SYMBOL_GPL(gb_audio_apbridgea_prepare_tx);
  99
 100int gb_audio_apbridgea_start_tx(struct gb_connection *connection,
 101                                __u16 i2s_port, __u64 timestamp)
 102{
 103        struct audio_apbridgea_start_tx_request req;
 104
 105        req.hdr.type = AUDIO_APBRIDGEA_TYPE_START_TX;
 106        req.hdr.i2s_port = cpu_to_le16(i2s_port);
 107        req.timestamp = cpu_to_le64(timestamp);
 108
 109        return gb_hd_output(connection->hd, &req, sizeof(req),
 110                            GB_APB_REQUEST_AUDIO_CONTROL, true);
 111}
 112EXPORT_SYMBOL_GPL(gb_audio_apbridgea_start_tx);
 113
 114int gb_audio_apbridgea_stop_tx(struct gb_connection *connection, __u16 i2s_port)
 115{
 116        struct audio_apbridgea_stop_tx_request req;
 117
 118        req.hdr.type = AUDIO_APBRIDGEA_TYPE_STOP_TX;
 119        req.hdr.i2s_port = cpu_to_le16(i2s_port);
 120
 121        return gb_hd_output(connection->hd, &req, sizeof(req),
 122                            GB_APB_REQUEST_AUDIO_CONTROL, true);
 123}
 124EXPORT_SYMBOL_GPL(gb_audio_apbridgea_stop_tx);
 125
 126int gb_audio_apbridgea_shutdown_tx(struct gb_connection *connection,
 127                                   __u16 i2s_port)
 128{
 129        struct audio_apbridgea_shutdown_tx_request req;
 130
 131        req.hdr.type = AUDIO_APBRIDGEA_TYPE_SHUTDOWN_TX;
 132        req.hdr.i2s_port = cpu_to_le16(i2s_port);
 133
 134        return gb_hd_output(connection->hd, &req, sizeof(req),
 135                            GB_APB_REQUEST_AUDIO_CONTROL, true);
 136}
 137EXPORT_SYMBOL_GPL(gb_audio_apbridgea_shutdown_tx);
 138
 139int gb_audio_apbridgea_set_rx_data_size(struct gb_connection *connection,
 140                                        __u16 i2s_port, __u16 size)
 141{
 142        struct audio_apbridgea_set_rx_data_size_request req;
 143
 144        req.hdr.type = AUDIO_APBRIDGEA_TYPE_SET_RX_DATA_SIZE;
 145        req.hdr.i2s_port = cpu_to_le16(i2s_port);
 146        req.size = cpu_to_le16(size);
 147
 148        return gb_hd_output(connection->hd, &req, sizeof(req),
 149                            GB_APB_REQUEST_AUDIO_CONTROL, true);
 150}
 151EXPORT_SYMBOL_GPL(gb_audio_apbridgea_set_rx_data_size);
 152
 153int gb_audio_apbridgea_prepare_rx(struct gb_connection *connection,
 154                                  __u16 i2s_port)
 155{
 156        struct audio_apbridgea_prepare_rx_request req;
 157
 158        req.hdr.type = AUDIO_APBRIDGEA_TYPE_PREPARE_RX;
 159        req.hdr.i2s_port = cpu_to_le16(i2s_port);
 160
 161        return gb_hd_output(connection->hd, &req, sizeof(req),
 162                            GB_APB_REQUEST_AUDIO_CONTROL, true);
 163}
 164EXPORT_SYMBOL_GPL(gb_audio_apbridgea_prepare_rx);
 165
 166int gb_audio_apbridgea_start_rx(struct gb_connection *connection,
 167                                __u16 i2s_port)
 168{
 169        struct audio_apbridgea_start_rx_request req;
 170
 171        req.hdr.type = AUDIO_APBRIDGEA_TYPE_START_RX;
 172        req.hdr.i2s_port = cpu_to_le16(i2s_port);
 173
 174        return gb_hd_output(connection->hd, &req, sizeof(req),
 175                            GB_APB_REQUEST_AUDIO_CONTROL, true);
 176}
 177EXPORT_SYMBOL_GPL(gb_audio_apbridgea_start_rx);
 178
 179int gb_audio_apbridgea_stop_rx(struct gb_connection *connection, __u16 i2s_port)
 180{
 181        struct audio_apbridgea_stop_rx_request req;
 182
 183        req.hdr.type = AUDIO_APBRIDGEA_TYPE_STOP_RX;
 184        req.hdr.i2s_port = cpu_to_le16(i2s_port);
 185
 186        return gb_hd_output(connection->hd, &req, sizeof(req),
 187                            GB_APB_REQUEST_AUDIO_CONTROL, true);
 188}
 189EXPORT_SYMBOL_GPL(gb_audio_apbridgea_stop_rx);
 190
 191int gb_audio_apbridgea_shutdown_rx(struct gb_connection *connection,
 192                                   __u16 i2s_port)
 193{
 194        struct audio_apbridgea_shutdown_rx_request req;
 195
 196        req.hdr.type = AUDIO_APBRIDGEA_TYPE_SHUTDOWN_RX;
 197        req.hdr.i2s_port = cpu_to_le16(i2s_port);
 198
 199        return gb_hd_output(connection->hd, &req, sizeof(req),
 200                            GB_APB_REQUEST_AUDIO_CONTROL, true);
 201}
 202EXPORT_SYMBOL_GPL(gb_audio_apbridgea_shutdown_rx);
 203
 204MODULE_LICENSE("GPL v2");
 205MODULE_ALIAS("greybus:audio-apbridgea");
 206MODULE_DESCRIPTION("Greybus Special APBridgeA Audio Protocol library");
 207MODULE_AUTHOR("Mark Greer <mgreer@animalcreek.com>");
 208