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 "tfa9879_accessory_impl.h"
10 #include "audio_accessory_if.h"
11 #include "audio_core.h"
12 #include "audio_sapm.h"
13 #include "hdf_log.h"
14
15 #define HDF_LOG_TAG "accessory"
16
17 struct AccessoryData g_accessoryData = {
18 .Init = AccessoryDeviceInit,
19 .Read = AccessoryDeviceReadReg,
20 .Write = AccessoryDeviceWriteReg,
21 .AiaoRead = AccessoryAiaoDeviceReadReg,
22 .AiaoWrite = AccessoryAiaoDeviceWriteReg,
23 };
24
25 struct AudioDaiOps g_accessoryDaiDeviceOps = {
26 .Startup = AccessoryDaiStartup,
27 .HwParams = AccessoryDaiHwParams,
28 };
29
30 struct DaiData g_accessoryDaiData = {
31 .drvDaiName = "accessory_dai",
32 .DaiInit = AccessoryDaiDeviceInit,
33 .ops = &g_accessoryDaiDeviceOps,
34 };
35
36 /* HdfDriverEntry */
GetServiceName(const struct HdfDeviceObject * device)37 static int32_t GetServiceName(const struct HdfDeviceObject *device)
38 {
39 const struct DeviceResourceNode *node = NULL;
40 struct DeviceResourceIface *drsOps = NULL;
41 int32_t ret;
42 if (device == NULL) {
43 AUDIO_DRIVER_LOG_ERR("input HdfDeviceObject object is nullptr.");
44 return HDF_FAILURE;
45 }
46 node = device->property;
47 if (node == NULL) {
48 AUDIO_DRIVER_LOG_ERR("get drs node is nullptr.");
49 return HDF_FAILURE;
50 }
51 drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
52 if (drsOps == NULL || drsOps->GetString == NULL) {
53 AUDIO_DRIVER_LOG_ERR("drsOps or drsOps getString is null!");
54 return HDF_FAILURE;
55 }
56 ret = drsOps->GetString(node, "serviceName", &g_accessoryData.drvAccessoryName, 0);
57 if (ret != HDF_SUCCESS) {
58 AUDIO_DRIVER_LOG_ERR("read serviceName fail!");
59 return ret;
60 }
61 return HDF_SUCCESS;
62 }
63
64 /* HdfDriverEntry implementations */
AccessoryDriverInit(struct HdfDeviceObject * device)65 static int32_t AccessoryDriverInit(struct HdfDeviceObject *device)
66 {
67 int32_t ret;
68 AUDIO_DRIVER_LOG_DEBUG("entry.\n");
69 if (device == NULL) {
70 AUDIO_DRIVER_LOG_ERR("device is NULL.");
71 return HDF_ERR_INVALID_OBJECT;
72 }
73 ret = GetServiceName(device);
74 if (ret != HDF_SUCCESS) {
75 AUDIO_DRIVER_LOG_ERR("get service name fail.");
76 return ret;
77 }
78 ret = AudioRegisterAccessory(device, &g_accessoryData, &g_accessoryDaiData);
79 if (ret != HDF_SUCCESS) {
80 AUDIO_DRIVER_LOG_ERR("register dai fail.");
81 return ret;
82 }
83 AUDIO_DRIVER_LOG_INFO("success!");
84 return HDF_SUCCESS;
85 }
86
87 /* HdfDriverEntry implementations */
AccessoryDriverBind(struct HdfDeviceObject * device)88 static int32_t AccessoryDriverBind(struct HdfDeviceObject *device)
89 {
90 (void)device;
91 AUDIO_DRIVER_LOG_INFO("success!");
92 return HDF_SUCCESS;
93 }
94
95 /* HdfDriverEntry definitions */
96 struct HdfDriverEntry g_accessoryDriverEntry = {
97 .moduleVersion = 1,
98 .moduleName = "CODEC_TFA9879",
99 .Bind = AccessoryDriverBind,
100 .Init = AccessoryDriverInit,
101 .Release = NULL,
102 };
103 HDF_INIT(g_accessoryDriverEntry);
104