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