1 /*
2 * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 */
14
15 #include <linux/device.h>
16 #include <linux/module.h>
17 #include <linux/of.h>
18 #include <linux/platform_device.h>
19 #include <linux/mfd/rk808.h>
20 #include "rk817_codec.h"
21 #include "audio_driver_log.h"
22
23 #define HDF_LOG_TAG "rk809_codec_linux_driver"
24
25 struct platform_device *rk817_pdev;
GetCodecPlatformDevice(void)26 struct platform_device *GetCodecPlatformDevice(void)
27 {
28 return rk817_pdev;
29 }
30
31 static const struct of_device_id rk817_codec_dt_ids[] = {
32 { .compatible = "rockchip,rk817-codec" },
33 };
34 MODULE_DEVICE_TABLE(of, rk817_codec_dt_ids);
35
rk817_platform_probe(struct platform_device * pdev)36 static int rk817_platform_probe(struct platform_device *pdev)
37 {
38 rk817_pdev = pdev;
39 dev_info(&pdev->dev, "got rk817-codec platform_device");
40 return 0;
41 }
42
rk817_platform_remove(struct platform_device * pdev)43 static int rk817_platform_remove(struct platform_device *pdev)
44 {
45 panic("%s not support now", __func__);
46 }
47
48 static struct platform_driver rk817_codec_driver = {
49 .driver = {
50 .name = "rk817-codec",
51 .of_match_table = rk817_codec_dt_ids,
52 },
53 .probe = rk817_platform_probe,
54 .remove = rk817_platform_remove,
55 };
56
57 module_platform_driver(rk817_codec_driver);
58
59 static const struct reg_default rk817_reg_defaults[] = {
60 { RK817_CODEC_DTOP_VUCTL, 0x003 },
61 { RK817_CODEC_DTOP_VUCTIME, 0x00 },
62 { RK817_CODEC_DTOP_LPT_SRST, 0x00 },
63 { RK817_CODEC_DTOP_DIGEN_CLKE, 0x00 },
64 { RK817_CODEC_AREF_RTCFG0, 0x00 },
65 { RK817_CODEC_AREF_RTCFG1, 0x06 },
66 { RK817_CODEC_AADC_CFG0, 0xc8 },
67 { RK817_CODEC_AADC_CFG1, 0x00 },
68 { RK817_CODEC_DADC_SR_ACL0, 0x00 },
69 { RK817_CODEC_DADC_ALC1, 0x00 },
70 { RK817_CODEC_DADC_ALC2, 0x00 },
71 { RK817_CODEC_DADC_NG, 0x00 },
72 { RK817_CODEC_DADC_HPF, 0x00 },
73 { RK817_CODEC_DADC_RVOLL, 0xff },
74 { RK817_CODEC_DADC_RVOLR, 0xff },
75 { RK817_CODEC_AMIC_CFG0, 0x70 },
76 { RK817_CODEC_AMIC_CFG1, 0x00 },
77 { RK817_CODEC_DMIC_PGA_GAIN, 0x66 },
78 { RK817_CODEC_DMIC_LMT1, 0x00 },
79 { RK817_CODEC_DMIC_LMT2, 0x00 },
80 { RK817_CODEC_DMIC_NG1, 0x00 },
81 { RK817_CODEC_DMIC_NG2, 0x00 },
82 { RK817_CODEC_ADAC_CFG0, 0x00 },
83 { RK817_CODEC_ADAC_CFG1, 0x07 },
84 { RK817_CODEC_DDAC_POPD_DACST, 0x82 },
85 { RK817_CODEC_DDAC_VOLL, 0x00 },
86 { RK817_CODEC_DDAC_VOLR, 0x00 },
87 { RK817_CODEC_DDAC_SR_LMT0, 0x00 },
88 { RK817_CODEC_DDAC_LMT1, 0x00 },
89 { RK817_CODEC_DDAC_LMT2, 0x00 },
90 { RK817_CODEC_DDAC_MUTE_MIXCTL, 0xa0 },
91 { RK817_CODEC_DDAC_RVOLL, 0xff },
92 { RK817_CODEC_DDAC_RVOLR, 0xff },
93 { RK817_CODEC_AHP_ANTI0, 0x00 },
94 { RK817_CODEC_AHP_ANTI1, 0x00 },
95 { RK817_CODEC_AHP_CFG0, 0xe0 },
96 { RK817_CODEC_AHP_CFG1, 0x1f },
97 { RK817_CODEC_AHP_CP, 0x09 },
98 { RK817_CODEC_ACLASSD_CFG1, 0x69 },
99 { RK817_CODEC_ACLASSD_CFG2, 0x44 },
100 { RK817_CODEC_APLL_CFG0, 0x04 },
101 { RK817_CODEC_APLL_CFG1, 0x00 },
102 { RK817_CODEC_APLL_CFG2, 0x30 },
103 { RK817_CODEC_APLL_CFG3, 0x19 },
104 { RK817_CODEC_APLL_CFG4, 0x65 },
105 { RK817_CODEC_APLL_CFG5, 0x01 },
106 { RK817_CODEC_DI2S_CKM, 0x01 },
107 { RK817_CODEC_DI2S_RSD, 0x00 },
108 { RK817_CODEC_DI2S_RXCR1, 0x00 },
109 { RK817_CODEC_DI2S_RXCR2, 0x17 },
110 { RK817_CODEC_DI2S_RXCMD_TSD, 0x00 },
111 { RK817_CODEC_DI2S_TXCR1, 0x00 },
112 { RK817_CODEC_DI2S_TXCR2, 0x17 },
113 { RK817_CODEC_DI2S_TXCR3_TXCMD, 0x00 },
114 };
115
rk817_volatile_register(struct device * dev,unsigned int reg)116 static bool rk817_volatile_register(struct device *dev, unsigned int reg)
117 {
118 switch (reg) {
119 case RK817_CODEC_DTOP_LPT_SRST:
120 return true;
121 default:
122 return false;
123 }
124 }
125
rk817_codec_register(struct device * dev,unsigned int reg)126 static bool rk817_codec_register(struct device *dev, unsigned int reg)
127 {
128 switch (reg) {
129 case RK817_CODEC_DTOP_VUCTL:
130 case RK817_CODEC_DTOP_VUCTIME:
131 case RK817_CODEC_DTOP_LPT_SRST:
132 case RK817_CODEC_DTOP_DIGEN_CLKE:
133 case RK817_CODEC_AREF_RTCFG0:
134 case RK817_CODEC_AREF_RTCFG1:
135 case RK817_CODEC_AADC_CFG0:
136 case RK817_CODEC_AADC_CFG1:
137 case RK817_CODEC_DADC_VOLL:
138 case RK817_CODEC_DADC_VOLR:
139 case RK817_CODEC_DADC_SR_ACL0:
140 case RK817_CODEC_DADC_ALC1:
141 case RK817_CODEC_DADC_ALC2:
142 case RK817_CODEC_DADC_NG:
143 case RK817_CODEC_DADC_HPF:
144 case RK817_CODEC_DADC_RVOLL:
145 case RK817_CODEC_DADC_RVOLR:
146 case RK817_CODEC_AMIC_CFG0:
147 case RK817_CODEC_AMIC_CFG1:
148 case RK817_CODEC_DMIC_PGA_GAIN:
149 case RK817_CODEC_DMIC_LMT1:
150 case RK817_CODEC_DMIC_LMT2:
151 case RK817_CODEC_DMIC_NG1:
152 case RK817_CODEC_DMIC_NG2:
153 case RK817_CODEC_ADAC_CFG0:
154 case RK817_CODEC_ADAC_CFG1:
155 case RK817_CODEC_DDAC_POPD_DACST:
156 case RK817_CODEC_DDAC_VOLL:
157 case RK817_CODEC_DDAC_VOLR:
158 case RK817_CODEC_DDAC_SR_LMT0:
159 case RK817_CODEC_DDAC_LMT1:
160 case RK817_CODEC_DDAC_LMT2:
161 case RK817_CODEC_DDAC_MUTE_MIXCTL:
162 case RK817_CODEC_DDAC_RVOLL:
163 case RK817_CODEC_DDAC_RVOLR:
164 case RK817_CODEC_AHP_ANTI0:
165 case RK817_CODEC_AHP_ANTI1:
166 case RK817_CODEC_AHP_CFG0:
167 case RK817_CODEC_AHP_CFG1:
168 case RK817_CODEC_AHP_CP:
169 case RK817_CODEC_ACLASSD_CFG1:
170 case RK817_CODEC_ACLASSD_CFG2:
171 case RK817_CODEC_APLL_CFG0:
172 case RK817_CODEC_APLL_CFG1:
173 case RK817_CODEC_APLL_CFG2:
174 case RK817_CODEC_APLL_CFG3:
175 case RK817_CODEC_APLL_CFG4:
176 case RK817_CODEC_APLL_CFG5:
177 case RK817_CODEC_DI2S_CKM:
178 case RK817_CODEC_DI2S_RSD:
179 case RK817_CODEC_DI2S_RXCR1:
180 case RK817_CODEC_DI2S_RXCR2:
181 case RK817_CODEC_DI2S_RXCMD_TSD:
182 case RK817_CODEC_DI2S_TXCR1:
183 case RK817_CODEC_DI2S_TXCR2:
184 case RK817_CODEC_DI2S_TXCR3_TXCMD:
185 return true;
186 default:
187 return false;
188 }
189 }
190
191 static const struct regmap_config rk817_codec_regmap_config = {
192 .name = "rk817-codec",
193 .reg_bits = 8,
194 .val_bits = 8,
195 .reg_stride = 1,
196 .max_register = 0x4f,
197 .cache_type = REGCACHE_FLAT,
198 .volatile_reg = rk817_volatile_register,
199 .writeable_reg = rk817_codec_register,
200 .readable_reg = rk817_codec_register,
201 .reg_defaults = rk817_reg_defaults,
202 .num_reg_defaults = ARRAY_SIZE(rk817_reg_defaults),
203 };
204
getCodecRegmap(void)205 struct regmap_config getCodecRegmap(void)
206 {
207 return rk817_codec_regmap_config;
208 }
209