Files
android_kernel_samsung_sm86…/btfmcodec/btfm_codec_hw_interface.c
Balakrishna Godavarthi 897ecff742 soundwire: Update soundwire driver to support btfmcodec
This change add supports in both btfmcodec and soundwire
to support btfmcodec driver has interface.

Change-Id: I2e77afaea44778147b362175aae33961dcc5042e
Signed-off-by: Balakrishna Godavarthi <quic_bgodavar@quicinc.com>
2023-10-02 23:29:26 -07:00

97 lines
2.4 KiB
C

// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#include "btfm_codec.h"
#include "btfm_codec_hw_interface.h"
#include "btfm_codec_interface.h"
int btfmcodec_register_hw_ep (struct hwep_data *ep_info)
{
struct btfmcodec_data *btfmcodec;
struct hwep_data *hwep_info;
int ret = 0;
btfmcodec = btfm_get_btfmcodec();
mutex_lock(&btfmcodec->hwep_drv_lock);
if (!btfmcodec) {
BTFMCODEC_ERR("btfm codec driver it not initialized");
ret = -EPERM;
goto end;
}
if (ep_info->num_dai == 0) {
BTFMCODEC_ERR("no active information provided by hw ep interface");
ret = -EPERM;
goto end;
}
hwep_info = btfmcodec->hwep_info;
if (hwep_info) {
BTFMCODEC_ERR("driver already holds hardware endpoint info");
ret = -EPERM;
goto end;
}
hwep_info = kzalloc(sizeof(struct hwep_data), GFP_KERNEL);
if (!hwep_info) {
BTFMCODEC_ERR("%s: failed to allocate memory\n", __func__);
ret = -ENOMEM;
goto end;
}
btfmcodec->hwep_info = hwep_info;
memcpy(hwep_info, ep_info, sizeof(struct hwep_data));
BTFMCODEC_INFO("Below driver registered with btfm codec\n");
BTFMCODEC_INFO("Driver name: %s\n", hwep_info->driver_name);
BTFMCODEC_INFO("Num of dai: %d supported", hwep_info->num_dai);
BTFMCODEC_INFO("Master config enabled: %u\n", test_bit(BTADV_AUDIO_MASTER_CONFIG,
&hwep_info->flags));
ret = btfm_register_codec(hwep_info);
end:
mutex_unlock(&btfmcodec->hwep_drv_lock);
return ret;
}
int btfmcodec_unregister_hw_ep (char *driver_name)
{
struct btfmcodec_data *btfmcodec;
struct hwep_data *hwep_info;
int ret;
btfmcodec = btfm_get_btfmcodec();
mutex_lock(&btfmcodec->hwep_drv_lock);
if (!btfmcodec) {
BTFMCODEC_ERR("btfm codec driver it not initialized");
ret = -EPERM;
goto end;
}
hwep_info = btfmcodec->hwep_info;
if (!hwep_info) {
BTFMCODEC_ERR("%s: no active hardware endpoint registered\n", __func__);
ret = -EPERM;
goto end;
}
if(!strncmp(hwep_info->driver_name, driver_name, DEVICE_NAME_MAX_LEN)) {
btfm_unregister_codec();
kfree(hwep_info);
BTFMCODEC_INFO("%s: deleted %s hardware endpoint\n", __func__, driver_name);
ret = -1;
goto end;
} else {
BTFMCODEC_ERR("%s: No hardware endpoint registered with %s\n", __func__, driver_name);
ret = -1;
goto end;
}
end:
mutex_unlock(&btfmcodec->hwep_drv_lock);
return ret;
}
EXPORT_SYMBOL(btfmcodec_register_hw_ep);
EXPORT_SYMBOL(btfmcodec_unregister_hw_ep);