/*
* audio codec driver
* Copyright 2016 Google Inc.
* Copyright 2016 Linaro Ltd.
*
* Released under the GPLv2 only.
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pm_runtime.h>
#include <sound/soc.h>
#include <sound/pcm_params.h>
#include <uapi/linux/input.h>
#include "audio_codec.h"
#include "audio_apbridgea.h"
#include "audio_manager.h"
static struct gbaudio_codec_info *gbcodec;
static struct gbaudio_data_connection *
find_data(struct gbaudio_module_info *module, const char *name)
{
struct gbaudio_data_connection *data;
list_for_each_entry(data, &module->data_list, list) {
if (name && !strncmp(data->name, name, NAME_SIZE))
return data;
}
return NULL;
}
static int find_stream(const char *name)
{
int stream = 0;
if (strnstr(name, "SPK Amp", NAME_SIZE))
stream |= GB_PLAYBACK;
return stream;
}
static int gbaudio_module_disable(struct gbaudio_codec_info *codec,
struct gbaudio_module_info *module,
int dir)
{
int ret = 0;
uint16_t data_cport, cportid, i2s_port;
int codec_state, module_state;
struct gbaudio_data_connection *data;
const char *dai_name;
mutex_lock(&codec->lock);
codec_state = codec->stream[dir].state;
if (codec_state == GBAUDIO_CODEC_SHUTDOWN) {
mutex_unlock(&codec->lock);
return 0;
}
dai_name = codec->stream[dir].dai_name;
module_state = module->ctrlstate[dir];
if (module_state == GBAUDIO_CODEC_SHUTDOWN) {
dev_dbg(codec->dev, "%s: module already configured\n",
module->name);
goto func_exit;
}
/* find the dai */
data = find_data(module, dai_name);
if (!data) {
dev_err(codec->dev, "%s:%s DATA connection missing\n",
dai_name, module->name);
ret = -ENODEV;
goto func_exit;
}
if (codec_state > GBAUDIO_CODEC_HWPARAMS) {
data_cport = data->connection->intf_cport_id;
switch(dir) {
case SNDRV_PCM_STREAM_CAPTURE:
ret = gb_audio_gb_deactivate_rx(
module->mgmt_connection,