• 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 "audio_core.h"
10 #include "audio_driver_log.h"
11 #include "osal_io.h"
12 
13 #define HDF_LOG_TAG audio_core
14 
15 #define CHANNEL_MAX_NUM 2
16 #define CHANNEL_MIN_NUM 1
17 #define AUDIO_DAI_LINK_COMPLETE 1
18 #define AUDIO_DAI_LINK_UNCOMPLETE 0
19 
20 AUDIO_LIST_HEAD(daiController);
21 AUDIO_LIST_HEAD(platformController);
22 AUDIO_LIST_HEAD(codecController);
23 AUDIO_LIST_HEAD(dspController);
24 AUDIO_LIST_HEAD(accessoryController);
25 
AudioDeviceReadReg(unsigned long virtualAddress,uint32_t reg,uint32_t * val)26 int32_t AudioDeviceReadReg(unsigned long virtualAddress, uint32_t reg, uint32_t *val)
27 {
28     if (val == NULL) {
29         AUDIO_DRIVER_LOG_ERR("param val is null.");
30         return HDF_FAILURE;
31     }
32 
33     *val = OSAL_READL((void *)((uintptr_t)(virtualAddress + reg)));
34     return HDF_SUCCESS;
35 }
36 
AudioDeviceWriteReg(unsigned long virtualAddress,uint32_t reg,uint32_t value)37 int32_t AudioDeviceWriteReg(unsigned long virtualAddress, uint32_t reg, uint32_t value)
38 {
39     OSAL_WRITEL(value, (void *)((uintptr_t)(virtualAddress + reg)));
40     return HDF_SUCCESS;
41 }
42 
AudioSocRegisterPlatform(struct HdfDeviceObject * device,struct PlatformData * platformData)43 int32_t AudioSocRegisterPlatform(struct HdfDeviceObject *device, struct PlatformData *platformData)
44 {
45     struct PlatformDevice *platformDevice = NULL;
46 
47     if ((device == NULL) || (platformData == NULL)) {
48         ADM_LOG_ERR("Input params check error: device=%p, platformData=%p.", device, platformData);
49         return HDF_ERR_INVALID_OBJECT;
50     }
51 
52     platformDevice = (struct PlatformDevice *)OsalMemCalloc(sizeof(*platformDevice));
53     if (platformDevice == NULL) {
54         ADM_LOG_ERR("Malloc platformDevice device fail!");
55         return HDF_ERR_MALLOC_FAIL;
56     }
57 
58     platformDevice->devPlatformName = platformData->drvPlatformName;
59     platformDevice->devData = platformData;
60     platformDevice->device = device;
61     DListInsertHead(&platformDevice->list, &platformController);
62 
63     ADM_LOG_INFO("Register [%s] success.", platformDevice->devPlatformName);
64     return HDF_SUCCESS;
65 }
66 
AudioSocRegisterDai(struct HdfDeviceObject * device,struct DaiData * daiData)67 int32_t AudioSocRegisterDai(struct HdfDeviceObject *device, struct DaiData *daiData)
68 {
69     struct DaiDevice *dai = NULL;
70 
71     if ((device == NULL) || (daiData == NULL)) {
72         ADM_LOG_ERR("Input params check error: device=%p, daiData=%p.", device, daiData);
73         return HDF_ERR_INVALID_OBJECT;
74     }
75 
76     dai = (struct DaiDevice *)OsalMemCalloc(sizeof(*dai));
77     if (dai == NULL) {
78         ADM_LOG_ERR("Malloc dai device fail!");
79         return HDF_ERR_MALLOC_FAIL;
80     }
81 
82     dai->devDaiName = daiData->drvDaiName;
83     dai->devData = daiData;
84     dai->device = device;
85     DListInsertHead(&dai->list, &daiController);
86     ADM_LOG_INFO("Register [%s] success.", dai->devDaiName);
87 
88     return HDF_SUCCESS;
89 }
90 
AudioRegisterAccessory(struct HdfDeviceObject * device,struct AccessoryData * accessoryData,struct DaiData * daiData)91 int32_t AudioRegisterAccessory(struct HdfDeviceObject *device,
92     struct AccessoryData *accessoryData, struct DaiData *daiData)
93 {
94     struct AccessoryDevice *accessory = NULL;
95     int32_t ret;
96 
97     if (device == NULL || accessoryData == NULL || daiData == NULL) {
98         ADM_LOG_ERR("Input params check error: device=%p, accessoryData=%p, daiData=%p.",
99             device, accessoryData, daiData);
100         return HDF_ERR_INVALID_OBJECT;
101     }
102 
103     accessory = (struct AccessoryDevice *)OsalMemCalloc(sizeof(*accessory));
104     if (accessory == NULL) {
105         ADM_LOG_ERR("Malloc accessory device fail!");
106         return HDF_ERR_MALLOC_FAIL;
107     }
108 
109     OsalMutexInit(&accessory->mutex);
110     accessory->devAccessoryName = accessoryData->drvAccessoryName;
111     accessory->devData = accessoryData;
112     accessory->device = device;
113 
114     ret = AudioSocRegisterDai(device, daiData);
115     if (ret != HDF_SUCCESS) {
116         OsalMemFree(accessory);
117         ADM_LOG_ERR("Register accessory device fail ret=%d", ret);
118         return HDF_ERR_IO;
119     }
120     DListInsertHead(&accessory->list, &accessoryController);
121     ADM_LOG_INFO("Register [%s] success.", accessory->devAccessoryName);
122 
123     return HDF_SUCCESS;
124 }
125 
AudioRegisterCodec(struct HdfDeviceObject * device,struct CodecData * codecData,struct DaiData * daiData)126 int32_t AudioRegisterCodec(struct HdfDeviceObject *device, struct CodecData *codecData, struct DaiData *daiData)
127 {
128     struct CodecDevice *codec = NULL;
129     int32_t ret;
130 
131     if ((device == NULL) || (codecData == NULL) || (daiData == NULL)) {
132         ADM_LOG_ERR("Input params check error: device=%p, codecData=%p, daiData=%p.",
133             device, codecData, daiData);
134         return HDF_ERR_INVALID_OBJECT;
135     }
136 
137     codec = (struct CodecDevice *)OsalMemCalloc(sizeof(*codec));
138     if (codec == NULL) {
139         ADM_LOG_ERR("Malloc codec device fail!");
140         return HDF_ERR_MALLOC_FAIL;
141     }
142 
143     OsalMutexInit(&codec->mutex);
144     codec->devCodecName = codecData->drvCodecName;
145     codec->devData = codecData;
146     codec->device = device;
147 
148     ret = AudioSocRegisterDai(device, daiData);
149     if (ret != HDF_SUCCESS) {
150         OsalIoUnmap((void *)((uintptr_t)(codec->devData->virtualAddress)));
151         OsalMemFree(codec);
152         ADM_LOG_ERR("Register dai device fail ret=%d", ret);
153         return HDF_ERR_IO;
154     }
155     DListInsertHead(&codec->list, &codecController);
156     ADM_LOG_INFO("Register [%s] success.", codec->devCodecName);
157 
158     return HDF_SUCCESS;
159 }
160 
AudioRegisterDsp(struct HdfDeviceObject * device,struct DspData * dspData,struct DaiData * DaiData)161 int32_t AudioRegisterDsp(struct HdfDeviceObject *device, struct DspData *dspData, struct DaiData *DaiData)
162 {
163     struct DspDevice *dspDev = NULL;
164     int32_t ret;
165 
166     if ((device == NULL) || (dspData == NULL) || (DaiData == NULL)) {
167         ADM_LOG_ERR("Input params check error: device=%p, dspData=%p, daiData=%p.",
168             device, dspData, DaiData);
169         return HDF_ERR_INVALID_OBJECT;
170     }
171 
172     dspDev = (struct DspDevice *)OsalMemCalloc(sizeof(*dspDev));
173     if (dspDev == NULL) {
174         ADM_LOG_ERR("Malloc codec device fail!");
175         return HDF_ERR_MALLOC_FAIL;
176     }
177 
178     dspDev->devDspName = dspData->drvDspName;
179     dspDev->devData = dspData;
180     dspDev->device = device;
181 
182     ret = AudioSocRegisterDai(device, DaiData);
183     if (ret != HDF_SUCCESS) {
184         OsalMemFree(dspDev);
185         ADM_LOG_ERR("Register dai device fail ret=%d", ret);
186         return HDF_ERR_IO;
187     }
188     DListInsertHead(&dspDev->list, &dspController);
189     ADM_LOG_INFO("Register [%s] success.", dspDev->devDspName);
190 
191     return HDF_SUCCESS;
192 }
193 
AudioSeekPlatformDevice(struct AudioRuntimeDeivces * rtd,const struct AudioConfigData * configData)194 static int32_t AudioSeekPlatformDevice(struct AudioRuntimeDeivces *rtd, const struct AudioConfigData *configData)
195 {
196     struct PlatformDevice *platform = NULL;
197     if (rtd == NULL || configData == NULL) {
198         ADM_LOG_ERR("Input params check error: rtd=%p, configData=%p.", rtd, configData);
199         return HDF_ERR_INVALID_OBJECT;
200     }
201     if (configData->platformName == NULL) {
202         ADM_LOG_ERR("Input devicesName check error: configData->platformName is NULL.");
203         return HDF_ERR_INVALID_OBJECT;
204     }
205 
206     DLIST_FOR_EACH_ENTRY(platform, &platformController, struct PlatformDevice, list) {
207         if (platform->devPlatformName != NULL &&
208             strcmp(platform->devPlatformName, configData->platformName) == 0) {
209             rtd->platform = platform;
210             break;
211         }
212     }
213 
214     return HDF_SUCCESS;
215 }
216 
AudioSeekCpuDaiDevice(struct AudioRuntimeDeivces * rtd,const struct AudioConfigData * configData)217 static int32_t AudioSeekCpuDaiDevice(struct AudioRuntimeDeivces *rtd, const struct AudioConfigData *configData)
218 {
219     struct DaiDevice *cpuDai = NULL;
220     if (rtd == NULL || configData == NULL) {
221         ADM_LOG_ERR("Input params check error: rtd=%p, configData=%p.", rtd, configData);
222         return HDF_ERR_INVALID_OBJECT;
223     }
224     if (configData->cpuDaiName == NULL) {
225         ADM_LOG_ERR("Input cpuDaiName check error: configData->cpuDaiName is NULL.");
226         return HDF_ERR_INVALID_OBJECT;
227     }
228     if (DListIsEmpty(&daiController)) {
229         ADM_LOG_ERR("daiController is empty.");
230         return HDF_FAILURE;
231     }
232     DLIST_FOR_EACH_ENTRY(cpuDai, &daiController, struct DaiDevice, list) {
233         if (cpuDai == NULL) {
234             return HDF_ERR_INVALID_OBJECT;
235         }
236         if (cpuDai->devDaiName != NULL &&
237             strcmp(cpuDai->devDaiName, configData->cpuDaiName) == 0) {
238             rtd->cpuDai = cpuDai;
239             break;
240         }
241     }
242 
243     return HDF_SUCCESS;
244 }
245 
AudioSeekCodecDevice(struct AudioRuntimeDeivces * rtd,const struct AudioConfigData * configData)246 static int32_t AudioSeekCodecDevice(struct AudioRuntimeDeivces *rtd, const struct AudioConfigData *configData)
247 {
248     struct CodecDevice *codec = NULL;
249     struct DaiDevice *codecDai = NULL;
250     if ((rtd == NULL) || (configData == NULL)) {
251         ADM_LOG_ERR("Input params check error: rtd=%p, configData=%p.", rtd, configData);
252         return HDF_ERR_INVALID_OBJECT;
253     }
254     if (configData->codecName == NULL || configData->codecDaiName == NULL) {
255         ADM_LOG_ERR("Input devicesName check error: configData->codecName=%p, configData->codecDaiName=%p.",
256                     configData->codecName, configData->codecDaiName);
257         return HDF_ERR_INVALID_OBJECT;
258     }
259 
260     DLIST_FOR_EACH_ENTRY(codec, &codecController, struct CodecDevice, list) {
261         if (codec->devCodecName != NULL && strcmp(codec->devCodecName, configData->codecName) == 0) {
262             rtd->codec = codec;
263             DLIST_FOR_EACH_ENTRY(codecDai, &daiController, struct DaiDevice, list) {
264                 if (codecDai == NULL) {
265                     return HDF_ERR_INVALID_OBJECT;
266                 }
267                 if (codecDai->device != NULL && codec->device == codecDai->device &&
268                     codecDai->devDaiName != NULL && strcmp(codecDai->devDaiName, configData->codecDaiName) == 0) {
269                     rtd->codecDai = codecDai;
270                     break;
271                 }
272             }
273             break;
274         }
275     }
276     return HDF_SUCCESS;
277 }
278 
AudioSeekAccessoryDevice(struct AudioRuntimeDeivces * rtd,const struct AudioConfigData * configData)279 static int32_t AudioSeekAccessoryDevice(struct AudioRuntimeDeivces *rtd, const struct AudioConfigData *configData)
280 {
281     struct AccessoryDevice *accessory = NULL;
282     struct DaiDevice *accessoryDai = NULL;
283     if (rtd == NULL || configData == NULL) {
284         ADM_LOG_ERR("Input params check error: rtd=%p, configData=%p.", rtd, configData);
285         return HDF_ERR_INVALID_OBJECT;
286     }
287     if (configData->accessoryName == NULL || configData->accessoryDaiName == NULL) {
288         ADM_LOG_ERR("Input devicesName check error: configData->accessoryName or"
289             "configData->accessoryDaiName is NULL.");
290         return HDF_ERR_INVALID_OBJECT;
291     }
292 
293     DLIST_FOR_EACH_ENTRY(accessory, &accessoryController, struct AccessoryDevice, list) {
294         if (accessory == NULL) {
295             return HDF_ERR_INVALID_OBJECT;
296         }
297         if (accessory->devAccessoryName != NULL &&
298             strcmp(accessory->devAccessoryName, configData->accessoryName) == 0) {
299             rtd->accessory = accessory;
300             DLIST_FOR_EACH_ENTRY(accessoryDai, &daiController, struct DaiDevice, list) {
301                 if (accessoryDai == NULL) {
302                     return HDF_ERR_INVALID_OBJECT;
303                 }
304                 if (accessoryDai->device != NULL &&
305                     accessory->device == accessoryDai->device &&
306                     accessoryDai->devDaiName != NULL &&
307                     strcmp(accessoryDai->devDaiName, configData->accessoryDaiName) == 0) {
308                     rtd->accessoryDai = accessoryDai;
309                     break;
310                 }
311             }
312             break;
313         }
314     }
315 
316     return HDF_SUCCESS;
317 }
318 
AudioSeekDspDevice(struct AudioRuntimeDeivces * rtd,const struct AudioConfigData * configData)319 static int32_t AudioSeekDspDevice(struct AudioRuntimeDeivces *rtd, const struct AudioConfigData *configData)
320 {
321     struct DspDevice *dsp = NULL;
322     struct DaiDevice *dspDai = NULL;
323     if ((rtd == NULL) || (configData == NULL)) {
324         ADM_LOG_ERR("Input params check error: rtd=%p, configData=%p.", rtd, configData);
325         return HDF_ERR_INVALID_OBJECT;
326     }
327     if (configData->dspName == NULL || configData->dspDaiName == NULL) {
328         ADM_LOG_ERR("Input devicesName check error: configData->dspName=%p, configData->dspDaiName=%p.",
329                     configData->dspName, configData->dspDaiName);
330         return HDF_ERR_INVALID_OBJECT;
331     }
332 
333     DLIST_FOR_EACH_ENTRY(dsp, &dspController, struct DspDevice, list) {
334         if (dsp == NULL) {
335             return HDF_ERR_INVALID_OBJECT;
336         }
337         if (dsp->devDspName != NULL && strcmp(dsp->devDspName, configData->dspName) == 0) {
338             rtd->dsp = dsp;
339             DLIST_FOR_EACH_ENTRY(dspDai, &daiController, struct DaiDevice, list) {
340                 if (dspDai == NULL) {
341                     return HDF_ERR_INVALID_OBJECT;
342                 }
343                 if (dspDai->device != NULL && dsp->device == dspDai->device &&
344                     dspDai->devDaiName != NULL && strcmp(dspDai->devDaiName, configData->dspDaiName) == 0) {
345                     rtd->dspDai = dspDai;
346                     break;
347                 }
348             }
349             break;
350         }
351     }
352 
353     return HDF_SUCCESS;
354 }
355 
AudioBindDaiLink(struct AudioCard * audioCard,const struct AudioConfigData * configData)356 int32_t AudioBindDaiLink(struct AudioCard *audioCard, const struct AudioConfigData *configData)
357 {
358     if ((audioCard == NULL) || (configData == NULL)) {
359         ADM_LOG_ERR("Input params check error: audioCard=%p, configData=%p.", audioCard, configData);
360         return HDF_ERR_INVALID_OBJECT;
361     }
362 
363     audioCard->rtd = (struct AudioRuntimeDeivces *)OsalMemCalloc(sizeof(struct AudioRuntimeDeivces));
364     if (audioCard->rtd == NULL) {
365         ADM_LOG_ERR("Malloc audioCard->rtd fail!");
366         return HDF_ERR_MALLOC_FAIL;
367     }
368 
369     audioCard->rtd->complete = AUDIO_DAI_LINK_UNCOMPLETE;
370     if (AudioSeekPlatformDevice(audioCard->rtd, configData) == HDF_SUCCESS) {
371         ADM_LOG_DEBUG("PLATFORM [%s] is registered!", configData->platformName);
372     }
373     if (AudioSeekCpuDaiDevice(audioCard->rtd, configData) == HDF_SUCCESS) {
374         ADM_LOG_DEBUG("CPU DAI [%s] is registered!", configData->cpuDaiName);
375     }
376     if (AudioSeekCodecDevice(audioCard->rtd, configData) == HDF_SUCCESS) {
377         ADM_LOG_DEBUG("CODEC [%s] is registered!", configData->codecName);
378     }
379     if (AudioSeekAccessoryDevice(audioCard->rtd, configData) == HDF_SUCCESS) {
380         ADM_LOG_DEBUG("CODEC [%s] is registered!", configData->accessoryName);
381     }
382     if (AudioSeekDspDevice(audioCard->rtd, configData) == HDF_SUCCESS) {
383         ADM_LOG_DEBUG("CODEC [%s] is registered!", configData->dspName);
384     }
385     audioCard->rtd->complete = AUDIO_DAI_LINK_COMPLETE;
386     ADM_LOG_DEBUG("All devices register complete!");
387 
388     return HDF_SUCCESS;
389 }
390 
AudioUpdateCodecRegBits(struct CodecDevice * codec,uint32_t reg,const uint32_t mask,const uint32_t shift,uint32_t value)391 int32_t AudioUpdateCodecRegBits(struct CodecDevice *codec, uint32_t reg,
392     const uint32_t mask, const uint32_t shift, uint32_t value)
393 {
394     int32_t ret;
395     uint32_t curValue = 0;
396     uint32_t controlMask;
397     if (codec == NULL) {
398         ADM_LOG_ERR("Invalid accessory param.");
399         return HDF_ERR_INVALID_OBJECT;
400     }
401 
402     value = value << shift;
403     controlMask = mask << shift;
404 
405     OsalMutexLock(&codec->mutex);
406     ret = AudioCodecReadReg(codec, reg, &curValue);
407     if (ret != HDF_SUCCESS) {
408         OsalMutexUnlock(&codec->mutex);
409         ADM_LOG_ERR("Read reg fail ret=%d.", ret);
410         return HDF_FAILURE;
411     }
412 
413     curValue = (curValue & ~controlMask) | (value & controlMask);
414     ret = AudioCodecWriteReg(codec, reg, curValue);
415     if (ret != HDF_SUCCESS) {
416         OsalMutexUnlock(&codec->mutex);
417         ADM_LOG_ERR("Write reg fail ret=%d", ret);
418         return HDF_FAILURE;
419     }
420     OsalMutexUnlock(&codec->mutex);
421 
422     ADM_LOG_DEBUG("Success.");
423     return HDF_SUCCESS;
424 }
425 
AudioUpdateAccessoryRegBits(struct AccessoryDevice * accessory,uint32_t reg,const uint32_t mask,const uint32_t shift,uint32_t value)426 int32_t AudioUpdateAccessoryRegBits(struct AccessoryDevice *accessory, uint32_t reg,
427     const uint32_t mask, const uint32_t shift, uint32_t value)
428 {
429     int32_t ret;
430     uint32_t curValue = 0;
431     uint32_t mixerControlMask;
432     if (accessory == NULL) {
433         ADM_LOG_ERR("Invalid accessory param.");
434         return HDF_ERR_INVALID_OBJECT;
435     }
436 
437     value = value << shift;
438     mixerControlMask = mask << shift;
439 
440     OsalMutexLock(&accessory->mutex);
441     ret = AudioAccessoryReadReg(accessory, reg, &curValue);
442     if (ret != HDF_SUCCESS) {
443         OsalMutexUnlock(&accessory->mutex);
444         ADM_LOG_ERR("Read reg fail ret=%d", ret);
445         return HDF_FAILURE;
446     }
447     curValue = (curValue & ~mixerControlMask) | (value & mixerControlMask);
448     ret = AudioAccessoryWriteReg(accessory, reg, curValue);
449     if (ret != HDF_SUCCESS) {
450         OsalMutexUnlock(&accessory->mutex);
451         ADM_LOG_ERR("Write reg fail ret=%d", ret);
452         return HDF_FAILURE;
453     }
454     OsalMutexUnlock(&accessory->mutex);
455 
456     ADM_LOG_DEBUG("Success.");
457     return HDF_SUCCESS;
458 }
459 
AudioUpdateDaiRegBits(const struct DaiDevice * dai,uint32_t reg,const uint32_t mask,const uint32_t shift,uint32_t value)460 int32_t AudioUpdateDaiRegBits(const struct DaiDevice *dai, uint32_t reg,
461     const uint32_t mask, const uint32_t shift, uint32_t value)
462 {
463     int32_t ret;
464     uint32_t curValue = 0;
465     uint32_t mixerControlMask;
466     struct DaiData *data = NULL;
467 
468     if (dai == NULL || dai->devData == NULL) {
469         ADM_LOG_ERR("Invalid accessory param.");
470         return HDF_ERR_INVALID_OBJECT;
471     }
472     data = dai->devData;
473     value = value << shift;
474     mixerControlMask = mask << shift;
475 
476     OsalMutexLock(&data->mutex);
477     ret = AudioDaiReadReg(dai, reg, &curValue);
478     if (ret != HDF_SUCCESS) {
479         OsalMutexUnlock(&data->mutex);
480         ADM_LOG_ERR("Read reg fail ret=%d.", ret);
481         return HDF_FAILURE;
482     }
483 
484     curValue = (curValue & ~mixerControlMask) | (value & mixerControlMask);
485 
486     ADM_LOG_DEBUG("reg: 0x%x curValue: 0x%x.", reg, curValue);
487     ret = AudioDaiWriteReg(dai, reg, curValue);
488     if (ret != HDF_SUCCESS) {
489         OsalMutexUnlock(&data->mutex);
490         ADM_LOG_ERR("Write reg fail ret=%d", ret);
491         return HDF_FAILURE;
492     }
493     OsalMutexUnlock(&data->mutex);
494 
495     ADM_LOG_DEBUG("Success.");
496     return HDF_SUCCESS;
497 }
498 
AudioKcontrolGetCodec(const struct AudioKcontrol * kcontrol)499 struct CodecDevice *AudioKcontrolGetCodec(const struct AudioKcontrol *kcontrol)
500 {
501     struct AudioCard *audioCard = NULL;
502     if (kcontrol == NULL || kcontrol->pri == NULL) {
503         ADM_LOG_ERR("Input param kcontrol is NULL.");
504         return NULL;
505     }
506 
507     audioCard = (struct AudioCard *)((volatile uintptr_t)(kcontrol->pri));
508     if (audioCard == NULL || audioCard->rtd == NULL) {
509         ADM_LOG_ERR("Get codec or rtd fail.");
510         return NULL;
511     }
512 
513     return audioCard->rtd->codec;
514 }
515 
AudioKcontrolGetAccessory(const struct AudioKcontrol * kcontrol)516 struct AccessoryDevice *AudioKcontrolGetAccessory(const struct AudioKcontrol *kcontrol)
517 {
518     struct AudioCard *audioCard = NULL;
519     if (kcontrol == NULL || kcontrol->pri == NULL) {
520         ADM_LOG_ERR("Input param kcontrol is NULL.");
521         return NULL;
522     }
523 
524     audioCard = (struct AudioCard *)((volatile uintptr_t)(kcontrol->pri));
525     if (audioCard == NULL || audioCard->rtd == NULL) {
526         ADM_LOG_ERR("Get accessory or rtd fail.");
527         return NULL;
528     }
529 
530     return audioCard->rtd->accessory;
531 }
532 
AudioKcontrolGetCpuDai(const struct AudioKcontrol * kcontrol)533 struct DaiDevice *AudioKcontrolGetCpuDai(const struct AudioKcontrol *kcontrol)
534 {
535     struct AudioCard *audioCard = NULL;
536     if (kcontrol == NULL || kcontrol->pri == NULL) {
537         ADM_LOG_ERR("Input param kcontrol is NULL.");
538         return NULL;
539     }
540 
541     audioCard = (struct AudioCard *)((volatile uintptr_t)(kcontrol->pri));
542     if (audioCard == NULL || audioCard->rtd == NULL) {
543         ADM_LOG_ERR("Get codec or rtd fail.");
544         return NULL;
545     }
546 
547     return audioCard->rtd->cpuDai;
548 }
549 
AudioAddControl(const struct AudioCard * audioCard,const struct AudioKcontrol * ctrl)550 struct AudioKcontrol *AudioAddControl(const struct AudioCard *audioCard, const struct AudioKcontrol *ctrl)
551 {
552     struct AudioKcontrol *control = NULL;
553 
554     if ((audioCard == NULL) || (ctrl == NULL)) {
555         ADM_LOG_ERR("Input params check error: audioCard=%p, ctrl=%p.", audioCard, ctrl);
556         return NULL;
557     }
558 
559     control = (struct AudioKcontrol *)OsalMemCalloc(sizeof(*control));
560     if (control == NULL) {
561         ADM_LOG_ERR("Malloc control fail!");
562         return NULL;
563     }
564     control->name = ctrl->name;
565     control->iface = ctrl->iface;
566     control->Info = ctrl->Info;
567     control->Get = ctrl->Get;
568     control->Set = ctrl->Set;
569     control->pri = (void *)audioCard;
570     control->privateValue = ctrl->privateValue;
571 
572     return control;
573 }
574 
AudioAddControls(struct AudioCard * audioCard,const struct AudioKcontrol * controls,int32_t controlMaxNum)575 int32_t AudioAddControls(struct AudioCard *audioCard, const struct AudioKcontrol *controls, int32_t controlMaxNum)
576 {
577     struct AudioKcontrol *control = NULL;
578     int32_t i;
579     ADM_LOG_DEBUG("Entry.");
580 
581     if ((audioCard == NULL) || (controls == NULL) || (controlMaxNum <= 0)) {
582         ADM_LOG_ERR("Input params check error: audioCard=%p, controls=%p, controlMaxNum=%d.",
583             audioCard, controls, controlMaxNum);
584         return HDF_FAILURE;
585     }
586 
587     for (i = 0; i < controlMaxNum; i++) {
588         control = AudioAddControl(audioCard, &controls[i]);
589         if (control == NULL) {
590             ADM_LOG_ERR("Add control fail!");
591             return HDF_FAILURE;
592         }
593         DListInsertHead(&control->list, &audioCard->controls);
594     }
595     ADM_LOG_DEBUG("Success.");
596     return HDF_SUCCESS;
597 }
598 
AudioDaiReadReg(const struct DaiDevice * dai,uint32_t reg,uint32_t * val)599 int32_t AudioDaiReadReg(const struct DaiDevice *dai, uint32_t reg, uint32_t *val)
600 {
601     int32_t ret;
602     unsigned long virtualAddress;
603     if (dai == NULL || dai->devData == NULL || dai->devData->Read == NULL || val == NULL) {
604         ADM_LOG_ERR("Input param is NULL.");
605         return HDF_FAILURE;
606     }
607     virtualAddress = dai->devData->regVirtualAddr;
608     ret = dai->devData->Read(virtualAddress, reg, val);
609     if (ret != HDF_SUCCESS) {
610         ADM_LOG_ERR("dai device read fail.");
611         return HDF_FAILURE;
612     }
613     return HDF_SUCCESS;
614 }
615 
AudioDaiWriteReg(const struct DaiDevice * dai,uint32_t reg,uint32_t val)616 int32_t AudioDaiWriteReg(const struct DaiDevice *dai, uint32_t reg, uint32_t val)
617 {
618     int32_t ret;
619     unsigned long virtualAddress;
620     if (dai == NULL || dai->devData == NULL || dai->devData->Write == NULL) {
621         ADM_LOG_ERR("Input param codec is NULL.");
622         return HDF_FAILURE;
623     }
624     virtualAddress = dai->devData->regVirtualAddr;
625     ret = dai->devData->Write(virtualAddress, reg, val);
626     if (ret != HDF_SUCCESS) {
627         ADM_LOG_ERR("dai device write fail.");
628         return HDF_FAILURE;
629     }
630     return HDF_SUCCESS;
631 }
632 
AudioCodecReadReg(const struct CodecDevice * codec,uint32_t reg,uint32_t * val)633 int32_t AudioCodecReadReg(const struct CodecDevice *codec, uint32_t reg, uint32_t *val)
634 {
635     int32_t ret;
636     unsigned long virtualAddress;
637     if (codec == NULL || codec->devData == NULL || codec->devData->Read == NULL || val == NULL) {
638         ADM_LOG_ERR("Input param codec is NULL.");
639         return HDF_FAILURE;
640     }
641     virtualAddress = codec->devData->virtualAddress;
642     ret = codec->devData->Read(virtualAddress, reg, val);
643     if (ret != HDF_SUCCESS) {
644         ADM_LOG_ERR("Codec device read fail.");
645         return HDF_FAILURE;
646     }
647     return HDF_SUCCESS;
648 }
649 
AudioAccessoryReadReg(const struct AccessoryDevice * accessory,uint32_t reg,uint32_t * val)650 int32_t AudioAccessoryReadReg(const struct AccessoryDevice *accessory, uint32_t reg, uint32_t *val)
651 {
652     int32_t ret;
653     if (accessory == NULL || accessory->devData == NULL || accessory->devData->Read == NULL || val == NULL) {
654         ADM_LOG_ERR("Input param accessory is NULL.");
655         return HDF_FAILURE;
656     }
657     ret = accessory->devData->Read(accessory, reg, val);
658     if (ret != HDF_SUCCESS) {
659         ADM_LOG_ERR("Accessory device read fail.");
660         return HDF_FAILURE;
661     }
662     return HDF_SUCCESS;
663 }
664 
AudioCodecWriteReg(const struct CodecDevice * codec,uint32_t reg,uint32_t val)665 int32_t AudioCodecWriteReg(const struct CodecDevice *codec, uint32_t reg, uint32_t val)
666 {
667     int32_t ret;
668     unsigned long virtualAddress;
669     if (codec == NULL || codec->devData == NULL || codec->devData->Write == NULL) {
670         ADM_LOG_ERR("Input param codec is NULL.");
671         return HDF_FAILURE;
672     }
673     virtualAddress = codec->devData->virtualAddress;
674     ret = codec->devData->Write(virtualAddress, reg, val);
675     if (ret != HDF_SUCCESS) {
676         ADM_LOG_ERR("Codec device write fail.");
677         return HDF_FAILURE;
678     }
679     return HDF_SUCCESS;
680 }
681 
AudioAccessoryWriteReg(const struct AccessoryDevice * accessory,uint32_t reg,uint32_t val)682 int32_t AudioAccessoryWriteReg(const struct AccessoryDevice *accessory, uint32_t reg, uint32_t val)
683 {
684     int32_t ret;
685     if (accessory == NULL || accessory->devData == NULL || accessory->devData->Write == NULL) {
686         ADM_LOG_ERR("Input param accessory is NULL.");
687         return HDF_FAILURE;
688     }
689     ret = accessory->devData->Write(accessory, reg, val);
690     if (ret != HDF_SUCCESS) {
691         ADM_LOG_ERR("Accessory device write fail.");
692         return HDF_FAILURE;
693     }
694     return HDF_SUCCESS;
695 }
696 
AudioInfoCtrlOps(const struct AudioKcontrol * kcontrol,struct AudioCtrlElemInfo * elemInfo)697 int32_t AudioInfoCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemInfo *elemInfo)
698 {
699     struct AudioMixerControl *mixerCtrl = NULL;
700 
701     if (kcontrol == NULL || kcontrol->privateValue <= 0 || elemInfo == NULL) {
702         ADM_LOG_ERR("Input param kcontrol is NULL.");
703         return HDF_ERR_INVALID_OBJECT;
704     }
705 
706     elemInfo->count = CHANNEL_MIN_NUM;
707     mixerCtrl = (struct AudioMixerControl *)((volatile uintptr_t)(kcontrol->privateValue));
708     /* stereo */
709     if (mixerCtrl->reg != mixerCtrl->rreg || mixerCtrl->shift != mixerCtrl->rshift) {
710         elemInfo->count = CHANNEL_MAX_NUM;
711     }
712     elemInfo->type = 1; /* volume type */
713     elemInfo->min = mixerCtrl->min;
714     elemInfo->max = mixerCtrl->max;
715 
716     return HDF_SUCCESS;
717 }
718 
AudioGetCtrlOpsRReg(struct AudioCtrlElemValue * elemValue,const struct AudioMixerControl * mixerCtrl,uint32_t rcurValue)719 int32_t AudioGetCtrlOpsRReg(struct AudioCtrlElemValue *elemValue,
720     const struct AudioMixerControl *mixerCtrl, uint32_t rcurValue)
721 {
722     if (elemValue == NULL || mixerCtrl == NULL) {
723         ADM_LOG_ERR("Audio input param is NULL.");
724         return HDF_ERR_INVALID_OBJECT;
725     }
726 
727     if (mixerCtrl->reg != mixerCtrl->rreg || mixerCtrl->shift != mixerCtrl->rshift) {
728         if (mixerCtrl->reg == mixerCtrl->rreg) {
729             rcurValue = (rcurValue >> mixerCtrl->rshift) & mixerCtrl->mask;
730         } else {
731             rcurValue = (rcurValue >> mixerCtrl->shift) & mixerCtrl->mask;
732         }
733         if (rcurValue > mixerCtrl->max || rcurValue < mixerCtrl->min) {
734             ADM_LOG_ERR("Audio invalid rcurValue=%d", rcurValue);
735             return HDF_FAILURE;
736         }
737         if (mixerCtrl->invert) {
738             rcurValue = mixerCtrl->max - rcurValue;
739         }
740         elemValue->value[1] = rcurValue;
741     }
742 
743     return HDF_SUCCESS;
744 }
745 
AudioGetCtrlOpsReg(struct AudioCtrlElemValue * elemValue,const struct AudioMixerControl * mixerCtrl,uint32_t curValue)746 int32_t AudioGetCtrlOpsReg(struct AudioCtrlElemValue *elemValue,
747     const struct AudioMixerControl *mixerCtrl, uint32_t curValue)
748 {
749     if (elemValue == NULL || mixerCtrl == NULL) {
750         ADM_LOG_ERR("Audio input param is NULL.");
751         return HDF_ERR_INVALID_OBJECT;
752     }
753 
754     curValue = (curValue >> mixerCtrl->shift) & mixerCtrl->mask;
755     if (curValue > mixerCtrl->max || curValue < mixerCtrl->min) {
756         ADM_LOG_ERR("Audio invalid curValue=%d", curValue);
757         return HDF_FAILURE;
758     }
759     if (mixerCtrl->invert) {
760         curValue = mixerCtrl->max - curValue;
761     }
762     elemValue->value[0] = curValue;
763 
764     return HDF_SUCCESS;
765 }
766 
AudioCodecGetCtrlOps(const struct AudioKcontrol * kcontrol,struct AudioCtrlElemValue * elemValue)767 int32_t AudioCodecGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue)
768 {
769     uint32_t curValue = 0;
770     uint32_t rcurValue = 0;
771     struct AudioMixerControl *mixerCtrl = NULL;
772     struct CodecDevice *codec = NULL;
773     if (kcontrol == NULL || kcontrol->privateValue <= 0 || elemValue == NULL) {
774         ADM_LOG_ERR("Audio input param is NULL.");
775         return HDF_ERR_INVALID_OBJECT;
776     }
777     mixerCtrl = (struct AudioMixerControl *)((volatile uintptr_t)kcontrol->privateValue);
778     codec = AudioKcontrolGetCodec(kcontrol);
779     if (mixerCtrl == NULL || codec == NULL) {
780         ADM_LOG_ERR("mixerCtrl and codec is NULL.");
781         return HDF_FAILURE;
782     }
783     if (AudioCodecReadReg(codec, mixerCtrl->reg, &curValue) != HDF_SUCCESS ||
784         AudioCodecReadReg(codec, mixerCtrl->rreg, &rcurValue) != HDF_SUCCESS) {
785         ADM_LOG_ERR("Read Reg fail.");
786         return HDF_FAILURE;
787     }
788     if (AudioGetCtrlOpsReg(elemValue, mixerCtrl, curValue) != HDF_SUCCESS ||
789         AudioGetCtrlOpsRReg(elemValue, mixerCtrl, rcurValue) != HDF_SUCCESS) {
790         ADM_LOG_ERR("Audio codec get kcontrol reg and rreg fail.");
791         return HDF_FAILURE;
792     }
793 
794     return HDF_SUCCESS;
795 }
796 
AudioAccessoryGetCtrlOps(const struct AudioKcontrol * kcontrol,struct AudioCtrlElemValue * elemValue)797 int32_t AudioAccessoryGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue)
798 {
799     uint32_t curValue = 0;
800     uint32_t rcurValue = 0;
801     struct AudioMixerControl *mixerCtrl = NULL;
802     struct AccessoryDevice *accessory = NULL;
803     if (kcontrol == NULL || kcontrol->privateValue <= 0 || elemValue == NULL) {
804         ADM_LOG_ERR("Audio input param is NULL.");
805         return HDF_ERR_INVALID_OBJECT;
806     }
807 
808     mixerCtrl = (struct AudioMixerControl *)((volatile uintptr_t)kcontrol->privateValue);
809     accessory = AudioKcontrolGetAccessory(kcontrol);
810     if (mixerCtrl == NULL || accessory == NULL) {
811         ADM_LOG_ERR("mixerCtrl and accessory is NULL.");
812         return HDF_FAILURE;
813     }
814     if (AudioAccessoryReadReg(accessory, mixerCtrl->reg, &curValue) != HDF_SUCCESS ||
815         AudioAccessoryReadReg(accessory, mixerCtrl->rreg, &rcurValue) != HDF_SUCCESS) {
816         ADM_LOG_ERR("Read Reg fail.");
817         return HDF_FAILURE;
818     }
819     if (AudioGetCtrlOpsReg(elemValue, mixerCtrl, curValue) != HDF_SUCCESS ||
820         AudioGetCtrlOpsRReg(elemValue, mixerCtrl, rcurValue) != HDF_SUCCESS) {
821         ADM_LOG_ERR("Audio accessory get kcontrol reg and rreg fail.");
822         return HDF_FAILURE;
823     }
824 
825     return HDF_SUCCESS;
826 }
827 
AudioSetCtrlOpsReg(const struct AudioKcontrol * kcontrol,const struct AudioCtrlElemValue * elemValue,const struct AudioMixerControl * mixerCtrl,uint32_t * value)828 int32_t AudioSetCtrlOpsReg(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue,
829     const struct AudioMixerControl *mixerCtrl, uint32_t *value)
830 {
831     if (kcontrol == NULL || (kcontrol->privateValue <= 0) || elemValue == NULL ||
832         mixerCtrl == NULL || value == NULL) {
833         ADM_LOG_ERR("Audio input param is NULL.");
834         return HDF_ERR_INVALID_OBJECT;
835     }
836 
837     *value = elemValue->value[0];
838     if (*value < mixerCtrl->min || *value > mixerCtrl->max) {
839         ADM_LOG_ERR("Audio invalid value=%d", *value);
840         return HDF_ERR_INVALID_OBJECT;
841     }
842     if (mixerCtrl->invert) {
843         *value = mixerCtrl->max - *value;
844     }
845 
846     return HDF_SUCCESS;
847 }
848 
AudioSetCtrlOpsRReg(const struct AudioCtrlElemValue * elemValue,struct AudioMixerControl * mixerCtrl,uint32_t * rvalue,bool * updateRReg)849 int32_t AudioSetCtrlOpsRReg(const struct AudioCtrlElemValue *elemValue,
850     struct AudioMixerControl *mixerCtrl, uint32_t *rvalue, bool *updateRReg)
851 {
852     uint32_t rshift;
853     if (elemValue == NULL || mixerCtrl == NULL || rvalue == NULL || updateRReg == NULL) {
854         ADM_LOG_ERR("Audio input param is NULL.");
855         return HDF_ERR_INVALID_OBJECT;
856     }
857 
858     if (mixerCtrl->reg != mixerCtrl->rreg || mixerCtrl->shift != mixerCtrl->rshift) {
859         *updateRReg = true;
860         *rvalue = elemValue->value[1];
861         if (*rvalue < mixerCtrl->min || *rvalue > mixerCtrl->max) {
862             ADM_LOG_ERR("Audio invalid fail.");
863             return HDF_FAILURE;
864         }
865         if (mixerCtrl->invert) {
866             *rvalue = mixerCtrl->max - *rvalue;
867         }
868         if (mixerCtrl->reg == mixerCtrl->rreg) {
869             rshift = mixerCtrl->rshift;
870         } else {
871             rshift = mixerCtrl->shift;
872         }
873         mixerCtrl->shift = rshift;
874     }
875 
876     return HDF_SUCCESS;
877 }
878 
AudioCodecSetCtrlOps(const struct AudioKcontrol * kcontrol,const struct AudioCtrlElemValue * elemValue)879 int32_t AudioCodecSetCtrlOps(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue)
880 {
881     uint32_t value;
882     uint32_t rvalue;
883     bool updateRReg = false;
884     struct CodecDevice *codec = NULL;
885     struct AudioMixerControl *mixerCtrl = NULL;
886     if (kcontrol == NULL || (kcontrol->privateValue <= 0) || elemValue == NULL) {
887         ADM_LOG_ERR("Audio input param is NULL.");
888         return HDF_ERR_INVALID_OBJECT;
889     }
890 
891     mixerCtrl = (struct AudioMixerControl *)((volatile uintptr_t)kcontrol->privateValue);
892     if (AudioSetCtrlOpsReg(kcontrol, elemValue, mixerCtrl, &value) != HDF_SUCCESS) {
893         ADM_LOG_ERR("AudioSetCtrlOpsReg is fail.");
894         return HDF_ERR_INVALID_OBJECT;
895     }
896     codec = AudioKcontrolGetCodec(kcontrol);
897     if (codec == NULL) {
898         ADM_LOG_ERR("AudioKcontrolGetCodec is fail.");
899         return HDF_ERR_INVALID_OBJECT;
900     }
901     if (AudioUpdateCodecRegBits(codec, mixerCtrl->reg, mixerCtrl->mask, mixerCtrl->shift, value) != HDF_SUCCESS) {
902         ADM_LOG_ERR("Audio codec stereo update reg bits fail.");
903         return HDF_FAILURE;
904     }
905 
906     if (AudioSetCtrlOpsRReg(elemValue, mixerCtrl, &rvalue, &updateRReg) != HDF_SUCCESS) {
907         ADM_LOG_ERR("AudioSetCtrlOpsRReg is fail.");
908         return HDF_ERR_INVALID_OBJECT;
909     }
910 
911     if (updateRReg) {
912         if (AudioUpdateCodecRegBits(codec, mixerCtrl->rreg, mixerCtrl->mask,
913             mixerCtrl->rshift, rvalue) != HDF_SUCCESS) {
914             ADM_LOG_ERR("Audio codec stereo update reg bits fail.");
915             return HDF_FAILURE;
916         }
917     }
918     return HDF_SUCCESS;
919 }
920 
AudioAccessorySetCtrlOps(const struct AudioKcontrol * kcontrol,const struct AudioCtrlElemValue * elemValue)921 int32_t AudioAccessorySetCtrlOps(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue)
922 {
923     uint32_t value;
924     uint32_t rvalue;
925     bool updateRReg = false;
926     struct AccessoryDevice *accessory = NULL;
927     struct AudioMixerControl *mixerCtrl = NULL;
928     if (kcontrol == NULL || (kcontrol->privateValue <= 0) || elemValue == NULL) {
929         ADM_LOG_ERR("Audio input param is NULL.");
930         return HDF_ERR_INVALID_OBJECT;
931     }
932 
933     mixerCtrl = (struct AudioMixerControl *)((volatile uintptr_t)kcontrol->privateValue);
934     if (AudioSetCtrlOpsReg(kcontrol, elemValue, mixerCtrl, &value) != HDF_SUCCESS) {
935         ADM_LOG_ERR("AudioSetCtrlOpsReg fail.");
936         return HDF_FAILURE;
937     }
938 
939     accessory = AudioKcontrolGetAccessory(kcontrol);
940     if (AudioUpdateAccessoryRegBits(accessory, mixerCtrl->reg, mixerCtrl->mask,
941         mixerCtrl->shift, value) != HDF_SUCCESS) {
942         ADM_LOG_ERR("Audio accessory stereo update reg bits fail.");
943         return HDF_FAILURE;
944     }
945 
946     if (AudioSetCtrlOpsRReg(elemValue, mixerCtrl, &rvalue, &updateRReg) != HDF_SUCCESS) {
947         ADM_LOG_ERR("AudioSetCtrlOpsRReg fail.");
948         return HDF_FAILURE;
949     }
950 
951     if (updateRReg) {
952         if (AudioUpdateAccessoryRegBits(accessory, mixerCtrl->rreg, mixerCtrl->mask,
953             mixerCtrl->rshift, rvalue) != HDF_SUCCESS) {
954             ADM_LOG_ERR("Audio accessory stereo update reg bits fail.");
955             return HDF_FAILURE;
956         }
957     }
958 
959     return HDF_SUCCESS;
960 }
961 
AudioCpuDaiSetCtrlOps(const struct AudioKcontrol * kcontrol,const struct AudioCtrlElemValue * elemValue)962 int32_t AudioCpuDaiSetCtrlOps(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue)
963 {
964     uint32_t value;
965     uint32_t rvalue;
966     bool updateRReg = false;
967     struct DaiDevice *dai = NULL;
968     struct AudioMixerControl *mixerCtrl = NULL;
969     if (kcontrol == NULL || (kcontrol->privateValue <= 0) || elemValue == NULL) {
970         ADM_LOG_ERR("Audio input param is NULL.");
971         return HDF_ERR_INVALID_OBJECT;
972     }
973 
974     mixerCtrl = (struct AudioMixerControl *)((volatile uintptr_t)kcontrol->privateValue);
975     if (AudioSetCtrlOpsReg(kcontrol, elemValue, mixerCtrl, &value) != HDF_SUCCESS) {
976         ADM_LOG_ERR("AudioSetCtrlOpsReg is fail.");
977         return HDF_ERR_INVALID_OBJECT;
978     }
979     dai = AudioKcontrolGetCpuDai(kcontrol);
980     if (dai == NULL) {
981         ADM_LOG_ERR("AudioKcontrolGetCodec is fail.");
982         return HDF_ERR_INVALID_OBJECT;
983     }
984     if (AudioUpdateDaiRegBits(dai, mixerCtrl->reg, mixerCtrl->mask, mixerCtrl->shift, value) != HDF_SUCCESS) {
985         ADM_LOG_ERR("Audio codec stereo update reg bits fail.");
986         return HDF_FAILURE;
987     }
988 
989     if (AudioSetCtrlOpsRReg(elemValue, mixerCtrl, &rvalue, &updateRReg) != HDF_SUCCESS) {
990         ADM_LOG_ERR("AudioSetCtrlOpsRReg is fail.");
991         return HDF_ERR_INVALID_OBJECT;
992     }
993 
994     if (updateRReg) {
995         if (AudioUpdateDaiRegBits(dai, mixerCtrl->rreg, mixerCtrl->mask, mixerCtrl->rshift, rvalue) != HDF_SUCCESS) {
996             ADM_LOG_ERR("Audio codec stereo update reg bits fail.");
997             return HDF_FAILURE;
998         }
999     }
1000     return HDF_SUCCESS;
1001 }
1002 
AudioCpuDaiGetCtrlOps(const struct AudioKcontrol * kcontrol,struct AudioCtrlElemValue * elemValue)1003 int32_t AudioCpuDaiGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue)
1004 {
1005     uint32_t curValue = 0;
1006     uint32_t rcurValue = 0;
1007     struct AudioMixerControl *mixerCtrl = NULL;
1008     struct DaiDevice *dai = NULL;
1009     if (kcontrol == NULL || kcontrol->privateValue <= 0 || elemValue == NULL) {
1010         ADM_LOG_ERR("Audio input param is NULL.");
1011         return HDF_ERR_INVALID_OBJECT;
1012     }
1013     mixerCtrl = (struct AudioMixerControl *)((volatile uintptr_t)kcontrol->privateValue);
1014     dai = AudioKcontrolGetCpuDai(kcontrol);
1015     if (mixerCtrl == NULL || dai == NULL) {
1016         ADM_LOG_ERR("mixerCtrl and codec is NULL.");
1017         return HDF_FAILURE;
1018     }
1019     if (AudioDaiReadReg(dai, mixerCtrl->reg, &curValue) != HDF_SUCCESS ||
1020         AudioDaiReadReg(dai, mixerCtrl->rreg, &rcurValue) != HDF_SUCCESS) {
1021         ADM_LOG_ERR("Read Reg fail.");
1022         return HDF_FAILURE;
1023     }
1024     if (AudioGetCtrlOpsReg(elemValue, mixerCtrl, curValue) != HDF_SUCCESS ||
1025         AudioGetCtrlOpsRReg(elemValue, mixerCtrl, rcurValue) != HDF_SUCCESS) {
1026         ADM_LOG_ERR("Audio codec get kcontrol reg and rreg fail.");
1027         return HDF_FAILURE;
1028     }
1029 
1030     return HDF_SUCCESS;
1031 }
1032 
1033