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