aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/rt5645.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/codecs/rt5645.c')
-rw-r--r--sound/soc/codecs/rt5645.c174
1 files changed, 150 insertions, 24 deletions
diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c
index 27141e2df878..3e16a889a806 100644
--- a/sound/soc/codecs/rt5645.c
+++ b/sound/soc/codecs/rt5645.c
@@ -31,6 +31,7 @@
31#include "rt5645.h" 31#include "rt5645.h"
32 32
33#define RT5645_DEVICE_ID 0x6308 33#define RT5645_DEVICE_ID 0x6308
34#define RT5650_DEVICE_ID 0x6419
34 35
35#define RT5645_PR_RANGE_BASE (0xff + 1) 36#define RT5645_PR_RANGE_BASE (0xff + 1)
36#define RT5645_PR_SPACING 0x100 37#define RT5645_PR_SPACING 0x100
@@ -59,6 +60,10 @@ static const struct reg_default init_list[] = {
59}; 60};
60#define RT5645_INIT_REG_LEN ARRAY_SIZE(init_list) 61#define RT5645_INIT_REG_LEN ARRAY_SIZE(init_list)
61 62
63static const struct reg_default rt5650_init_list[] = {
64 {0xf6, 0x0100},
65};
66
62static const struct reg_default rt5645_reg[] = { 67static const struct reg_default rt5645_reg[] = {
63 { 0x00, 0x0000 }, 68 { 0x00, 0x0000 },
64 { 0x01, 0xc8c8 }, 69 { 0x01, 0xc8c8 },
@@ -86,6 +91,7 @@ static const struct reg_default rt5645_reg[] = {
86 { 0x2a, 0x5656 }, 91 { 0x2a, 0x5656 },
87 { 0x2b, 0x5454 }, 92 { 0x2b, 0x5454 },
88 { 0x2c, 0xaaa0 }, 93 { 0x2c, 0xaaa0 },
94 { 0x2d, 0x0000 },
89 { 0x2f, 0x1002 }, 95 { 0x2f, 0x1002 },
90 { 0x31, 0x5000 }, 96 { 0x31, 0x5000 },
91 { 0x32, 0x0000 }, 97 { 0x32, 0x0000 },
@@ -193,6 +199,8 @@ static const struct reg_default rt5645_reg[] = {
193 { 0xdb, 0x0003 }, 199 { 0xdb, 0x0003 },
194 { 0xdc, 0x0049 }, 200 { 0xdc, 0x0049 },
195 { 0xdd, 0x001b }, 201 { 0xdd, 0x001b },
202 { 0xdf, 0x0008 },
203 { 0xe0, 0x4000 },
196 { 0xe6, 0x8000 }, 204 { 0xe6, 0x8000 },
197 { 0xe7, 0x0200 }, 205 { 0xe7, 0x0200 },
198 { 0xec, 0xb300 }, 206 { 0xec, 0xb300 },
@@ -242,6 +250,7 @@ static bool rt5645_volatile_register(struct device *dev, unsigned int reg)
242 case RT5645_IRQ_CTRL3: 250 case RT5645_IRQ_CTRL3:
243 case RT5645_INT_IRQ_ST: 251 case RT5645_INT_IRQ_ST:
244 case RT5645_IL_CMD: 252 case RT5645_IL_CMD:
253 case RT5650_4BTN_IL_CMD1:
245 case RT5645_VENDOR_ID: 254 case RT5645_VENDOR_ID:
246 case RT5645_VENDOR_ID1: 255 case RT5645_VENDOR_ID1:
247 case RT5645_VENDOR_ID2: 256 case RT5645_VENDOR_ID2:
@@ -287,6 +296,7 @@ static bool rt5645_readable_register(struct device *dev, unsigned int reg)
287 case RT5645_STO_DAC_MIXER: 296 case RT5645_STO_DAC_MIXER:
288 case RT5645_MONO_DAC_MIXER: 297 case RT5645_MONO_DAC_MIXER:
289 case RT5645_DIG_MIXER: 298 case RT5645_DIG_MIXER:
299 case RT5650_A_DAC_SOUR:
290 case RT5645_DIG_INF1_DATA: 300 case RT5645_DIG_INF1_DATA:
291 case RT5645_PDM_OUT_CTRL: 301 case RT5645_PDM_OUT_CTRL:
292 case RT5645_REC_L1_MIXER: 302 case RT5645_REC_L1_MIXER:
@@ -378,6 +388,8 @@ static bool rt5645_readable_register(struct device *dev, unsigned int reg)
378 case RT5645_IL_CMD: 388 case RT5645_IL_CMD:
379 case RT5645_IL_CMD2: 389 case RT5645_IL_CMD2:
380 case RT5645_IL_CMD3: 390 case RT5645_IL_CMD3:
391 case RT5650_4BTN_IL_CMD1:
392 case RT5650_4BTN_IL_CMD2:
381 case RT5645_DRC1_HL_CTRL1: 393 case RT5645_DRC1_HL_CTRL1:
382 case RT5645_DRC2_HL_CTRL1: 394 case RT5645_DRC2_HL_CTRL1:
383 case RT5645_ADC_MONO_HP_CTRL1: 395 case RT5645_ADC_MONO_HP_CTRL1:
@@ -527,7 +539,7 @@ static const struct snd_kcontrol_new rt5645_snd_controls[] = {
527static int set_dmic_clk(struct snd_soc_dapm_widget *w, 539static int set_dmic_clk(struct snd_soc_dapm_widget *w,
528 struct snd_kcontrol *kcontrol, int event) 540 struct snd_kcontrol *kcontrol, int event)
529{ 541{
530 struct snd_soc_codec *codec = w->codec; 542 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
531 struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); 543 struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec);
532 int idx = -EINVAL; 544 int idx = -EINVAL;
533 545
@@ -544,9 +556,10 @@ static int set_dmic_clk(struct snd_soc_dapm_widget *w,
544static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source, 556static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source,
545 struct snd_soc_dapm_widget *sink) 557 struct snd_soc_dapm_widget *sink)
546{ 558{
559 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm);
547 unsigned int val; 560 unsigned int val;
548 561
549 val = snd_soc_read(source->codec, RT5645_GLB_CLK); 562 val = snd_soc_read(codec, RT5645_GLB_CLK);
550 val &= RT5645_SCLK_SRC_MASK; 563 val &= RT5645_SCLK_SRC_MASK;
551 if (val == RT5645_SCLK_SRC_PLL1) 564 if (val == RT5645_SCLK_SRC_PLL1)
552 return 1; 565 return 1;
@@ -557,6 +570,7 @@ static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source,
557static int is_using_asrc(struct snd_soc_dapm_widget *source, 570static int is_using_asrc(struct snd_soc_dapm_widget *source,
558 struct snd_soc_dapm_widget *sink) 571 struct snd_soc_dapm_widget *sink)
559{ 572{
573 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm);
560 unsigned int reg, shift, val; 574 unsigned int reg, shift, val;
561 575
562 switch (source->shift) { 576 switch (source->shift) {
@@ -588,7 +602,7 @@ static int is_using_asrc(struct snd_soc_dapm_widget *source,
588 return 0; 602 return 0;
589 } 603 }
590 604
591 val = (snd_soc_read(source->codec, reg) >> shift) & 0xf; 605 val = (snd_soc_read(codec, reg) >> shift) & 0xf;
592 switch (val) { 606 switch (val) {
593 case 1: 607 case 1:
594 case 2: 608 case 2:
@@ -1007,6 +1021,44 @@ static SOC_ENUM_SINGLE_DECL(
1007static const struct snd_kcontrol_new rt5645_if1_adc_in_mux = 1021static const struct snd_kcontrol_new rt5645_if1_adc_in_mux =
1008 SOC_DAPM_ENUM("IF1 ADC IN source", rt5645_if1_adc_in_enum); 1022 SOC_DAPM_ENUM("IF1 ADC IN source", rt5645_if1_adc_in_enum);
1009 1023
1024/* MX-2d [3] [2] */
1025static const char * const rt5650_a_dac1_src[] = {
1026 "DAC1", "Stereo DAC Mixer"
1027};
1028
1029static SOC_ENUM_SINGLE_DECL(
1030 rt5650_a_dac1_l_enum, RT5650_A_DAC_SOUR,
1031 RT5650_A_DAC1_L_IN_SFT, rt5650_a_dac1_src);
1032
1033static const struct snd_kcontrol_new rt5650_a_dac1_l_mux =
1034 SOC_DAPM_ENUM("A DAC1 L source", rt5650_a_dac1_l_enum);
1035
1036static SOC_ENUM_SINGLE_DECL(
1037 rt5650_a_dac1_r_enum, RT5650_A_DAC_SOUR,
1038 RT5650_A_DAC1_R_IN_SFT, rt5650_a_dac1_src);
1039
1040static const struct snd_kcontrol_new rt5650_a_dac1_r_mux =
1041 SOC_DAPM_ENUM("A DAC1 R source", rt5650_a_dac1_r_enum);
1042
1043/* MX-2d [1] [0] */
1044static const char * const rt5650_a_dac2_src[] = {
1045 "Stereo DAC Mixer", "Mono DAC Mixer"
1046};
1047
1048static SOC_ENUM_SINGLE_DECL(
1049 rt5650_a_dac2_l_enum, RT5650_A_DAC_SOUR,
1050 RT5650_A_DAC2_L_IN_SFT, rt5650_a_dac2_src);
1051
1052static const struct snd_kcontrol_new rt5650_a_dac2_l_mux =
1053 SOC_DAPM_ENUM("A DAC2 L source", rt5650_a_dac2_l_enum);
1054
1055static SOC_ENUM_SINGLE_DECL(
1056 rt5650_a_dac2_r_enum, RT5650_A_DAC_SOUR,
1057 RT5650_A_DAC2_R_IN_SFT, rt5650_a_dac2_src);
1058
1059static const struct snd_kcontrol_new rt5650_a_dac2_r_mux =
1060 SOC_DAPM_ENUM("A DAC2 R source", rt5650_a_dac2_r_enum);
1061
1010/* MX-2F [13:12] */ 1062/* MX-2F [13:12] */
1011static const char * const rt5645_if2_adc_in_src[] = { 1063static const char * const rt5645_if2_adc_in_src[] = {
1012 "IF_ADC1", "IF_ADC2", "VAD_ADC" 1064 "IF_ADC1", "IF_ADC2", "VAD_ADC"
@@ -1144,18 +1196,23 @@ static void hp_amp_power(struct snd_soc_codec *codec, int on)
1144static int rt5645_hp_event(struct snd_soc_dapm_widget *w, 1196static int rt5645_hp_event(struct snd_soc_dapm_widget *w,
1145 struct snd_kcontrol *kcontrol, int event) 1197 struct snd_kcontrol *kcontrol, int event)
1146{ 1198{
1147 struct snd_soc_codec *codec = w->codec; 1199 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1148 struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec); 1200 struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec);
1149 1201
1150 switch (event) { 1202 switch (event) {
1151 case SND_SOC_DAPM_POST_PMU: 1203 case SND_SOC_DAPM_POST_PMU:
1152 hp_amp_power(codec, 1); 1204 hp_amp_power(codec, 1);
1153 /* headphone unmute sequence */ 1205 /* headphone unmute sequence */
1154 snd_soc_update_bits(codec, RT5645_DEPOP_M3, RT5645_CP_FQ1_MASK | 1206 if (rt5645->codec_type == CODEC_TYPE_RT5650) {
1155 RT5645_CP_FQ2_MASK | RT5645_CP_FQ3_MASK, 1207 snd_soc_write(codec, RT5645_DEPOP_M3, 0x0737);
1156 (RT5645_CP_FQ_192_KHZ << RT5645_CP_FQ1_SFT) | 1208 } else {
1157 (RT5645_CP_FQ_12_KHZ << RT5645_CP_FQ2_SFT) | 1209 snd_soc_update_bits(codec, RT5645_DEPOP_M3,
1158 (RT5645_CP_FQ_192_KHZ << RT5645_CP_FQ3_SFT)); 1210 RT5645_CP_FQ1_MASK | RT5645_CP_FQ2_MASK |
1211 RT5645_CP_FQ3_MASK,
1212 (RT5645_CP_FQ_192_KHZ << RT5645_CP_FQ1_SFT) |
1213 (RT5645_CP_FQ_12_KHZ << RT5645_CP_FQ2_SFT) |
1214 (RT5645_CP_FQ_192_KHZ << RT5645_CP_FQ3_SFT));
1215 }
1159 regmap_write(rt5645->regmap, 1216 regmap_write(rt5645->regmap,
1160 RT5645_PR_BASE + RT5645_MAMP_INT_REG2, 0xfc00); 1217 RT5645_PR_BASE + RT5645_MAMP_INT_REG2, 0xfc00);
1161 snd_soc_update_bits(codec, RT5645_DEPOP_M1, 1218 snd_soc_update_bits(codec, RT5645_DEPOP_M1,
@@ -1175,12 +1232,16 @@ static int rt5645_hp_event(struct snd_soc_dapm_widget *w,
1175 1232
1176 case SND_SOC_DAPM_PRE_PMD: 1233 case SND_SOC_DAPM_PRE_PMD:
1177 /* headphone mute sequence */ 1234 /* headphone mute sequence */
1178 snd_soc_update_bits(codec, RT5645_DEPOP_M3, 1235 if (rt5645->codec_type == CODEC_TYPE_RT5650) {
1179 RT5645_CP_FQ1_MASK | RT5645_CP_FQ2_MASK | 1236 snd_soc_write(codec, RT5645_DEPOP_M3, 0x0737);
1180 RT5645_CP_FQ3_MASK, 1237 } else {
1181 (RT5645_CP_FQ_96_KHZ << RT5645_CP_FQ1_SFT) | 1238 snd_soc_update_bits(codec, RT5645_DEPOP_M3,
1182 (RT5645_CP_FQ_12_KHZ << RT5645_CP_FQ2_SFT) | 1239 RT5645_CP_FQ1_MASK | RT5645_CP_FQ2_MASK |
1183 (RT5645_CP_FQ_96_KHZ << RT5645_CP_FQ3_SFT)); 1240 RT5645_CP_FQ3_MASK,
1241 (RT5645_CP_FQ_96_KHZ << RT5645_CP_FQ1_SFT) |
1242 (RT5645_CP_FQ_12_KHZ << RT5645_CP_FQ2_SFT) |
1243 (RT5645_CP_FQ_96_KHZ << RT5645_CP_FQ3_SFT));
1244 }
1184 regmap_write(rt5645->regmap, 1245 regmap_write(rt5645->regmap,
1185 RT5645_PR_BASE + RT5645_MAMP_INT_REG2, 0xfc00); 1246 RT5645_PR_BASE + RT5645_MAMP_INT_REG2, 0xfc00);
1186 snd_soc_update_bits(codec, RT5645_DEPOP_M1, 1247 snd_soc_update_bits(codec, RT5645_DEPOP_M1,
@@ -1205,7 +1266,7 @@ static int rt5645_hp_event(struct snd_soc_dapm_widget *w,
1205static int rt5645_spk_event(struct snd_soc_dapm_widget *w, 1266static int rt5645_spk_event(struct snd_soc_dapm_widget *w,
1206 struct snd_kcontrol *kcontrol, int event) 1267 struct snd_kcontrol *kcontrol, int event)
1207{ 1268{
1208 struct snd_soc_codec *codec = w->codec; 1269 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1209 1270
1210 switch (event) { 1271 switch (event) {
1211 case SND_SOC_DAPM_POST_PMU: 1272 case SND_SOC_DAPM_POST_PMU:
@@ -1232,7 +1293,7 @@ static int rt5645_spk_event(struct snd_soc_dapm_widget *w,
1232static int rt5645_lout_event(struct snd_soc_dapm_widget *w, 1293static int rt5645_lout_event(struct snd_soc_dapm_widget *w,
1233 struct snd_kcontrol *kcontrol, int event) 1294 struct snd_kcontrol *kcontrol, int event)
1234{ 1295{
1235 struct snd_soc_codec *codec = w->codec; 1296 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1236 1297
1237 switch (event) { 1298 switch (event) {
1238 case SND_SOC_DAPM_POST_PMU: 1299 case SND_SOC_DAPM_POST_PMU:
@@ -1262,7 +1323,7 @@ static int rt5645_lout_event(struct snd_soc_dapm_widget *w,
1262static int rt5645_bst2_event(struct snd_soc_dapm_widget *w, 1323static int rt5645_bst2_event(struct snd_soc_dapm_widget *w,
1263 struct snd_kcontrol *kcontrol, int event) 1324 struct snd_kcontrol *kcontrol, int event)
1264{ 1325{
1265 struct snd_soc_codec *codec = w->codec; 1326 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1266 1327
1267 switch (event) { 1328 switch (event) {
1268 case SND_SOC_DAPM_POST_PMU: 1329 case SND_SOC_DAPM_POST_PMU:
@@ -1574,6 +1635,17 @@ static const struct snd_soc_dapm_widget rt5645_dapm_widgets[] = {
1574 SND_SOC_DAPM_OUTPUT("SPOR"), 1635 SND_SOC_DAPM_OUTPUT("SPOR"),
1575}; 1636};
1576 1637
1638static const struct snd_soc_dapm_widget rt5650_specific_dapm_widgets[] = {
1639 SND_SOC_DAPM_MUX("A DAC1 L Mux", SND_SOC_NOPM,
1640 0, 0, &rt5650_a_dac1_l_mux),
1641 SND_SOC_DAPM_MUX("A DAC1 R Mux", SND_SOC_NOPM,
1642 0, 0, &rt5650_a_dac1_r_mux),
1643 SND_SOC_DAPM_MUX("A DAC2 L Mux", SND_SOC_NOPM,
1644 0, 0, &rt5650_a_dac2_l_mux),
1645 SND_SOC_DAPM_MUX("A DAC2 R Mux", SND_SOC_NOPM,
1646 0, 0, &rt5650_a_dac2_r_mux),
1647};
1648
1577static const struct snd_soc_dapm_route rt5645_dapm_routes[] = { 1649static const struct snd_soc_dapm_route rt5645_dapm_routes[] = {
1578 { "adc stereo1 filter", NULL, "ADC STO1 ASRC", is_using_asrc }, 1650 { "adc stereo1 filter", NULL, "ADC STO1 ASRC", is_using_asrc },
1579 { "adc stereo2 filter", NULL, "ADC STO2 ASRC", is_using_asrc }, 1651 { "adc stereo2 filter", NULL, "ADC STO2 ASRC", is_using_asrc },
@@ -1779,13 +1851,9 @@ static const struct snd_soc_dapm_route rt5645_dapm_routes[] = {
1779 { "DAC MIXR", "DAC R2 Switch", "DAC R2 Volume" }, 1851 { "DAC MIXR", "DAC R2 Switch", "DAC R2 Volume" },
1780 { "DAC MIXR", "DAC L2 Switch", "DAC L2 Volume" }, 1852 { "DAC MIXR", "DAC L2 Switch", "DAC L2 Volume" },
1781 1853
1782 { "DAC L1", NULL, "Stereo DAC MIXL" },
1783 { "DAC L1", NULL, "PLL1", is_sys_clk_from_pll }, 1854 { "DAC L1", NULL, "PLL1", is_sys_clk_from_pll },
1784 { "DAC R1", NULL, "Stereo DAC MIXR" },
1785 { "DAC R1", NULL, "PLL1", is_sys_clk_from_pll }, 1855 { "DAC R1", NULL, "PLL1", is_sys_clk_from_pll },
1786 { "DAC L2", NULL, "Mono DAC MIXL" },
1787 { "DAC L2", NULL, "PLL1", is_sys_clk_from_pll }, 1856 { "DAC L2", NULL, "PLL1", is_sys_clk_from_pll },
1788 { "DAC R2", NULL, "Mono DAC MIXR" },
1789 { "DAC R2", NULL, "PLL1", is_sys_clk_from_pll }, 1857 { "DAC R2", NULL, "PLL1", is_sys_clk_from_pll },
1790 1858
1791 { "SPK MIXL", "BST1 Switch", "BST1" }, 1859 { "SPK MIXL", "BST1 Switch", "BST1" },
@@ -1874,6 +1942,30 @@ static const struct snd_soc_dapm_route rt5645_dapm_routes[] = {
1874 { "SPOR", NULL, "SPK amp" }, 1942 { "SPOR", NULL, "SPK amp" },
1875}; 1943};
1876 1944
1945static const struct snd_soc_dapm_route rt5650_specific_dapm_routes[] = {
1946 { "A DAC1 L Mux", "DAC1", "DAC1 MIXL"},
1947 { "A DAC1 L Mux", "Stereo DAC Mixer", "Stereo DAC MIXL"},
1948 { "A DAC1 R Mux", "DAC1", "DAC1 MIXR"},
1949 { "A DAC1 R Mux", "Stereo DAC Mixer", "Stereo DAC MIXR"},
1950
1951 { "A DAC2 L Mux", "Stereo DAC Mixer", "Stereo DAC MIXL"},
1952 { "A DAC2 L Mux", "Mono DAC Mixer", "Mono DAC MIXL"},
1953 { "A DAC2 R Mux", "Stereo DAC Mixer", "Stereo DAC MIXR"},
1954 { "A DAC2 R Mux", "Mono DAC Mixer", "Mono DAC MIXR"},
1955
1956 { "DAC L1", NULL, "A DAC1 L Mux" },
1957 { "DAC R1", NULL, "A DAC1 R Mux" },
1958 { "DAC L2", NULL, "A DAC2 L Mux" },
1959 { "DAC R2", NULL, "A DAC2 R Mux" },
1960};
1961
1962static const struct snd_soc_dapm_route rt5645_specific_dapm_routes[] = {
1963 { "DAC L1", NULL, "Stereo DAC MIXL" },
1964 { "DAC R1", NULL, "Stereo DAC MIXR" },
1965 { "DAC L2", NULL, "Mono DAC MIXL" },
1966 { "DAC R2", NULL, "Mono DAC MIXR" },
1967};
1968
1877static int rt5645_hw_params(struct snd_pcm_substream *substream, 1969static int rt5645_hw_params(struct snd_pcm_substream *substream,
1878 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) 1970 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
1879{ 1971{
@@ -2293,6 +2385,22 @@ static int rt5645_probe(struct snd_soc_codec *codec)
2293 2385
2294 rt5645->codec = codec; 2386 rt5645->codec = codec;
2295 2387
2388 switch (rt5645->codec_type) {
2389 case CODEC_TYPE_RT5645:
2390 snd_soc_dapm_add_routes(&codec->dapm,
2391 rt5645_specific_dapm_routes,
2392 ARRAY_SIZE(rt5645_specific_dapm_routes));
2393 break;
2394 case CODEC_TYPE_RT5650:
2395 snd_soc_dapm_new_controls(&codec->dapm,
2396 rt5650_specific_dapm_widgets,
2397 ARRAY_SIZE(rt5650_specific_dapm_widgets));
2398 snd_soc_dapm_add_routes(&codec->dapm,
2399 rt5650_specific_dapm_routes,
2400 ARRAY_SIZE(rt5650_specific_dapm_routes));
2401 break;
2402 }
2403
2296 rt5645_set_bias_level(codec, SND_SOC_BIAS_OFF); 2404 rt5645_set_bias_level(codec, SND_SOC_BIAS_OFF);
2297 2405
2298 snd_soc_update_bits(codec, RT5645_CHARGE_PUMP, 0x0300, 0x0200); 2406 snd_soc_update_bits(codec, RT5645_CHARGE_PUMP, 0x0300, 0x0200);
@@ -2424,6 +2532,7 @@ static const struct regmap_config rt5645_regmap = {
2424 2532
2425static const struct i2c_device_id rt5645_i2c_id[] = { 2533static const struct i2c_device_id rt5645_i2c_id[] = {
2426 { "rt5645", 0 }, 2534 { "rt5645", 0 },
2535 { "rt5650", 0 },
2427 { } 2536 { }
2428}; 2537};
2429MODULE_DEVICE_TABLE(i2c, rt5645_i2c_id); 2538MODULE_DEVICE_TABLE(i2c, rt5645_i2c_id);
@@ -2456,9 +2565,18 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
2456 } 2565 }
2457 2566
2458 regmap_read(rt5645->regmap, RT5645_VENDOR_ID2, &val); 2567 regmap_read(rt5645->regmap, RT5645_VENDOR_ID2, &val);
2459 if (val != RT5645_DEVICE_ID) { 2568
2569 switch (val) {
2570 case RT5645_DEVICE_ID:
2571 rt5645->codec_type = CODEC_TYPE_RT5645;
2572 break;
2573 case RT5650_DEVICE_ID:
2574 rt5645->codec_type = CODEC_TYPE_RT5650;
2575 break;
2576 default:
2460 dev_err(&i2c->dev, 2577 dev_err(&i2c->dev,
2461 "Device with ID register %x is not rt5645\n", val); 2578 "Device with ID register %x is not rt5645 or rt5650\n",
2579 val);
2462 return -ENODEV; 2580 return -ENODEV;
2463 } 2581 }
2464 2582
@@ -2469,6 +2587,14 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
2469 if (ret != 0) 2587 if (ret != 0)
2470 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret); 2588 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret);
2471 2589
2590 if (rt5645->codec_type == CODEC_TYPE_RT5650) {
2591 ret = regmap_register_patch(rt5645->regmap, rt5650_init_list,
2592 ARRAY_SIZE(rt5650_init_list));
2593 if (ret != 0)
2594 dev_warn(&i2c->dev, "Apply rt5650 patch failed: %d\n",
2595 ret);
2596 }
2597
2472 if (rt5645->pdata.in2_diff) 2598 if (rt5645->pdata.in2_diff)
2473 regmap_update_bits(rt5645->regmap, RT5645_IN2_CTRL, 2599 regmap_update_bits(rt5645->regmap, RT5645_IN2_CTRL,
2474 RT5645_IN_DF2, RT5645_IN_DF2); 2600 RT5645_IN_DF2, RT5645_IN_DF2);