• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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