1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 *
4 * HDF is dual licensed: you can use it either under the terms of
5 * the GPL, or the BSD license, at your option.
6 * See the LICENSE file in the root of this repository for complete details.
7 */
8
9 #include "hi3516_codec_ops.h"
10 #include "audio_sapm.h"
11 #include "audio_platform_base.h"
12 #include "hi3516_codec_impl.h"
13 #include "audio_driver_log.h"
14 #include "audio_codec_base.h"
15
16 #define HDF_LOG_TAG hi3516_codec_ops
17
18 static const struct AudioSapmRoute g_audioRoutes[] = {
19 { "SPKL", "Dacl enable", "DACL"},
20 { "SPKR", "Dacr enable", "DACR"},
21
22 { "ADCL", NULL, "LPGA"},
23 { "LPGA", "LPGA MIC Switch", "MIC"},
24
25 { "ADCR", NULL, "RPGA"},
26 { "RPGA", "RPGA MIC Switch", "MIC"},
27 };
28
CodecDeviceInit(struct AudioCard * audioCard,const struct CodecDevice * codec)29 int32_t CodecDeviceInit(struct AudioCard *audioCard, const struct CodecDevice *codec)
30 {
31 if (audioCard == NULL || codec == NULL || codec->devData == NULL ||
32 codec->devData->sapmComponents == NULL || codec->devData->controls == NULL) {
33 AUDIO_DRIVER_LOG_ERR("input para is NULL.");
34 return HDF_ERR_INVALID_OBJECT;
35 }
36
37 if (CodecSetCtlFunc(codec->devData, AudioCodecAiaoGetCtrlOps, AudioCodecAiaoSetCtrlOps) != HDF_SUCCESS) {
38 AUDIO_DRIVER_LOG_ERR("AudioCodecSetCtlFunc failed.");
39 return HDF_FAILURE;
40 }
41
42 if (CodecHalSysInit(codec->devData) != HDF_SUCCESS) {
43 AUDIO_DRIVER_LOG_ERR("CodecHalSysInit failed.");
44 return HDF_FAILURE;
45 }
46
47 if (CodecRegDefaultInit(codec->devData->regCfgGroup) != HDF_SUCCESS) {
48 AUDIO_DRIVER_LOG_ERR("CodecRegDefaultInit failed.");
49 return HDF_FAILURE;
50 }
51
52 if (AudioAddControls(audioCard, codec->devData->controls, codec->devData->numControls) != HDF_SUCCESS) {
53 AUDIO_DRIVER_LOG_ERR("add controls failed.");
54 return HDF_FAILURE;
55 }
56
57 if (AudioSapmNewComponents(audioCard, codec->devData->sapmComponents,
58 codec->devData->numSapmComponent) != HDF_SUCCESS) {
59 AUDIO_DRIVER_LOG_ERR("new components failed.");
60 return HDF_FAILURE;
61 }
62
63 if (AudioSapmAddRoutes(audioCard, g_audioRoutes, HDF_ARRAY_SIZE(g_audioRoutes)) != HDF_SUCCESS) {
64 AUDIO_DRIVER_LOG_ERR("add route failed.");
65 return HDF_FAILURE;
66 }
67
68 if (AudioSapmNewControls(audioCard) != HDF_SUCCESS) {
69 AUDIO_DRIVER_LOG_ERR("add sapm controls failed.");
70 return HDF_FAILURE;
71 }
72
73 if (AudioSapmSleep(audioCard) != HDF_SUCCESS) {
74 AUDIO_DRIVER_LOG_ERR("add sapm sleep modular failed.");
75 return HDF_FAILURE;
76 }
77
78 AUDIO_DRIVER_LOG_DEBUG("success.");
79 return HDF_SUCCESS;
80 }
81
CodecDaiDeviceInit(struct AudioCard * card,const struct DaiDevice * device)82 int32_t CodecDaiDeviceInit(struct AudioCard *card, const struct DaiDevice *device)
83 {
84 if (device == NULL || device->devDaiName == NULL) {
85 AUDIO_DRIVER_LOG_ERR("input para is NULL.");
86 return HDF_FAILURE;
87 }
88
89 AUDIO_DRIVER_LOG_DEBUG("codec dai device name: %s\n", device->devDaiName);
90 (void)card;
91 return HDF_SUCCESS;
92 }
93
CodecDaiHwParams(const struct AudioCard * card,const struct AudioPcmHwParams * param)94 int32_t CodecDaiHwParams(const struct AudioCard *card, const struct AudioPcmHwParams *param)
95 {
96 unsigned int bitWidth;
97 struct CodecDaiParamsVal codecDaiParamsVal;
98
99 if (param == NULL || param->cardServiceName == NULL || card == NULL ||
100 card->rtd == NULL || card->rtd->codecDai == NULL || card->rtd->codecDai->devData == NULL ||
101 card->rtd->codecDai->devData->regCfgGroup == NULL) {
102 AUDIO_DRIVER_LOG_ERR("input para is NULL.");
103 return HDF_FAILURE;
104 }
105
106 (void)memset_s(&bitWidth, sizeof(unsigned int), 0, sizeof(unsigned int));
107 int ret = AudioFramatToBitWidth(param->format, &bitWidth);
108 if (ret != HDF_SUCCESS) {
109 return HDF_FAILURE;
110 }
111
112 (void)memset_s(&codecDaiParamsVal, sizeof(struct CodecDaiParamsVal), 0, sizeof(struct CodecDaiParamsVal));
113 codecDaiParamsVal.frequencyVal = param->rate;
114 codecDaiParamsVal.formatVal = bitWidth;
115 ret = CodecDaiParamsUpdate(card->rtd->codecDai->devData->regCfgGroup, codecDaiParamsVal);
116 if (ret != HDF_SUCCESS) {
117 AUDIO_DRIVER_LOG_ERR("CodecDaiParamsUpdate failed.");
118 return HDF_FAILURE;
119 }
120 return HDF_SUCCESS;
121 }
122
CodecDaiStartup(const struct AudioCard * card,const struct DaiDevice * device)123 int32_t CodecDaiStartup(const struct AudioCard *card, const struct DaiDevice *device)
124 {
125 int32_t ret;
126 if (device == NULL || device->devData == NULL ||
127 device->devData->regCfgGroup == NULL) {
128 AUDIO_DRIVER_LOG_ERR("input para is NULL.");
129 return HDF_FAILURE;
130 }
131 (void)card;
132 ret = CodecSetAdcTuneEnable(device->devData->regCfgGroup);
133 if (ret != HDF_SUCCESS) {
134 AUDIO_DRIVER_LOG_ERR("CodecSetAdcTuneEnable failed.");
135 return HDF_FAILURE;
136 }
137 AUDIO_DRIVER_LOG_DEBUG("success.");
138 return HDF_SUCCESS;
139 }
140
141