rt5645.c (5c0e869357454c2aab3d02d002ffc1f0a0ab2782) | rt5645.c (e29fd55d8d23ea7afcadd15a87700583e7da5035) |
---|---|
1/* 2 * rt5645.c -- RT5645 ALSA SoC audio codec driver 3 * 4 * Copyright 2013 Realtek Semiconductor Corp. 5 * Author: Bard Liao <bardliao@realtek.com> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as --- 455 unchanged lines hidden (view full) --- 464 1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0), 465 2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0), 466 3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0), 467 6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0), 468 7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0), 469 8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0) 470); 471 | 1/* 2 * rt5645.c -- RT5645 ALSA SoC audio codec driver 3 * 4 * Copyright 2013 Realtek Semiconductor Corp. 5 * Author: Bard Liao <bardliao@realtek.com> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as --- 455 unchanged lines hidden (view full) --- 464 1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0), 465 2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0), 466 3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0), 467 6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0), 468 7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0), 469 8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0) 470); 471 |
472/* {-6, -4.5, -3, -1.5, 0, 0.82, 1.58, 2.28} dB */ 473static const DECLARE_TLV_DB_RANGE(spk_clsd_tlv, 474 0, 4, TLV_DB_SCALE_ITEM(-600, 150, 0), 475 5, 5, TLV_DB_SCALE_ITEM(82, 0, 0), 476 6, 6, TLV_DB_SCALE_ITEM(158, 0, 0), 477 7, 7, TLV_DB_SCALE_ITEM(228, 0, 0) 478); 479 |
|
472static const struct snd_kcontrol_new rt5645_snd_controls[] = { 473 /* Speaker Output Volume */ 474 SOC_DOUBLE("Speaker Channel Switch", RT5645_SPK_VOL, 475 RT5645_VOL_L_SFT, RT5645_VOL_R_SFT, 1, 1), 476 SOC_DOUBLE_TLV("Speaker Playback Volume", RT5645_SPK_VOL, 477 RT5645_L_VOL_SFT, RT5645_R_VOL_SFT, 39, 1, out_vol_tlv), 478 | 480static const struct snd_kcontrol_new rt5645_snd_controls[] = { 481 /* Speaker Output Volume */ 482 SOC_DOUBLE("Speaker Channel Switch", RT5645_SPK_VOL, 483 RT5645_VOL_L_SFT, RT5645_VOL_R_SFT, 1, 1), 484 SOC_DOUBLE_TLV("Speaker Playback Volume", RT5645_SPK_VOL, 485 RT5645_L_VOL_SFT, RT5645_R_VOL_SFT, 39, 1, out_vol_tlv), 486 |
487 /* ClassD modulator Speaker Gain Ratio */ 488 SOC_SINGLE_TLV("Speaker ClassD Playback Volume", RT5645_SPO_CLSD_RATIO, 489 RT5645_SPK_G_CLSD_SFT, 7, 0, spk_clsd_tlv), 490 |
|
479 /* Headphone Output Volume */ 480 SOC_DOUBLE("Headphone Channel Switch", RT5645_HP_VOL, 481 RT5645_VOL_L_SFT, RT5645_VOL_R_SFT, 1, 1), 482 SOC_DOUBLE_TLV("Headphone Playback Volume", RT5645_HP_VOL, 483 RT5645_L_VOL_SFT, RT5645_R_VOL_SFT, 39, 1, out_vol_tlv), 484 485 /* OUTPUT Control */ 486 SOC_DOUBLE("OUT Playback Switch", RT5645_LOUT1, --- 240 unchanged lines hidden (view full) --- 727 RT5645_M_MONO_ADC_R1_SFT, 1, 1), 728 SOC_DAPM_SINGLE("ADC2 Switch", RT5645_MONO_ADC_MIXER, 729 RT5645_M_MONO_ADC_R2_SFT, 1, 1), 730}; 731 732static const struct snd_kcontrol_new rt5645_dac_l_mix[] = { 733 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5645_AD_DA_MIXER, 734 RT5645_M_ADCMIX_L_SFT, 1, 1), | 491 /* Headphone Output Volume */ 492 SOC_DOUBLE("Headphone Channel Switch", RT5645_HP_VOL, 493 RT5645_VOL_L_SFT, RT5645_VOL_R_SFT, 1, 1), 494 SOC_DOUBLE_TLV("Headphone Playback Volume", RT5645_HP_VOL, 495 RT5645_L_VOL_SFT, RT5645_R_VOL_SFT, 39, 1, out_vol_tlv), 496 497 /* OUTPUT Control */ 498 SOC_DOUBLE("OUT Playback Switch", RT5645_LOUT1, --- 240 unchanged lines hidden (view full) --- 739 RT5645_M_MONO_ADC_R1_SFT, 1, 1), 740 SOC_DAPM_SINGLE("ADC2 Switch", RT5645_MONO_ADC_MIXER, 741 RT5645_M_MONO_ADC_R2_SFT, 1, 1), 742}; 743 744static const struct snd_kcontrol_new rt5645_dac_l_mix[] = { 745 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5645_AD_DA_MIXER, 746 RT5645_M_ADCMIX_L_SFT, 1, 1), |
735 SOC_DAPM_SINGLE_AUTODISABLE("DAC1 Switch", RT5645_AD_DA_MIXER, | 747 SOC_DAPM_SINGLE("DAC1 Switch", RT5645_AD_DA_MIXER, |
736 RT5645_M_DAC1_L_SFT, 1, 1), 737}; 738 739static const struct snd_kcontrol_new rt5645_dac_r_mix[] = { 740 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5645_AD_DA_MIXER, 741 RT5645_M_ADCMIX_R_SFT, 1, 1), | 748 RT5645_M_DAC1_L_SFT, 1, 1), 749}; 750 751static const struct snd_kcontrol_new rt5645_dac_r_mix[] = { 752 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5645_AD_DA_MIXER, 753 RT5645_M_ADCMIX_R_SFT, 1, 1), |
742 SOC_DAPM_SINGLE_AUTODISABLE("DAC1 Switch", RT5645_AD_DA_MIXER, | 754 SOC_DAPM_SINGLE("DAC1 Switch", RT5645_AD_DA_MIXER, |
743 RT5645_M_DAC1_R_SFT, 1, 1), 744}; 745 746static const struct snd_kcontrol_new rt5645_sto_dac_l_mix[] = { 747 SOC_DAPM_SINGLE("DAC L1 Switch", RT5645_STO_DAC_MIXER, 748 RT5645_M_DAC_L1_SFT, 1, 1), 749 SOC_DAPM_SINGLE("DAC L2 Switch", RT5645_STO_DAC_MIXER, 750 RT5645_M_DAC_L2_SFT, 1, 1), --- 625 unchanged lines hidden (view full) --- 1376 snd_soc_update_bits(codec, RT5645_DEPOP_M1, 1377 RT5645_HP_CO_MASK, RT5645_HP_CO_EN); 1378 regmap_write(rt5645->regmap, RT5645_PR_BASE + 1379 0x3e, 0x7400); 1380 snd_soc_write(codec, RT5645_DEPOP_M3, 0x0737); 1381 regmap_write(rt5645->regmap, RT5645_PR_BASE + 1382 RT5645_MAMP_INT_REG2, 0xfc00); 1383 snd_soc_write(codec, RT5645_DEPOP_M2, 0x1140); | 755 RT5645_M_DAC1_R_SFT, 1, 1), 756}; 757 758static const struct snd_kcontrol_new rt5645_sto_dac_l_mix[] = { 759 SOC_DAPM_SINGLE("DAC L1 Switch", RT5645_STO_DAC_MIXER, 760 RT5645_M_DAC_L1_SFT, 1, 1), 761 SOC_DAPM_SINGLE("DAC L2 Switch", RT5645_STO_DAC_MIXER, 762 RT5645_M_DAC_L2_SFT, 1, 1), --- 625 unchanged lines hidden (view full) --- 1388 snd_soc_update_bits(codec, RT5645_DEPOP_M1, 1389 RT5645_HP_CO_MASK, RT5645_HP_CO_EN); 1390 regmap_write(rt5645->regmap, RT5645_PR_BASE + 1391 0x3e, 0x7400); 1392 snd_soc_write(codec, RT5645_DEPOP_M3, 0x0737); 1393 regmap_write(rt5645->regmap, RT5645_PR_BASE + 1394 RT5645_MAMP_INT_REG2, 0xfc00); 1395 snd_soc_write(codec, RT5645_DEPOP_M2, 0x1140); |
1384 msleep(40); | 1396 mdelay(5); |
1385 rt5645->hp_on = true; 1386 } else { 1387 /* depop parameters */ 1388 snd_soc_update_bits(codec, RT5645_DEPOP_M2, 1389 RT5645_DEPOP_MASK, RT5645_DEPOP_MAN); 1390 snd_soc_write(codec, RT5645_DEPOP_M1, 0x000d); 1391 regmap_write(rt5645->regmap, RT5645_PR_BASE + 1392 RT5645_HP_DCC_INT1, 0x9f01); --- 1431 unchanged lines hidden (view full) --- 2824 if (rt5645->en_button_func) { 2825 rt5645_enable_push_button_irq(codec, true); 2826 } 2827 } else { 2828 snd_soc_dapm_disable_pin(dapm, "Mic Det Power"); 2829 snd_soc_dapm_sync(dapm); 2830 rt5645->jack_type = SND_JACK_HEADPHONE; 2831 } | 1397 rt5645->hp_on = true; 1398 } else { 1399 /* depop parameters */ 1400 snd_soc_update_bits(codec, RT5645_DEPOP_M2, 1401 RT5645_DEPOP_MASK, RT5645_DEPOP_MAN); 1402 snd_soc_write(codec, RT5645_DEPOP_M1, 0x000d); 1403 regmap_write(rt5645->regmap, RT5645_PR_BASE + 1404 RT5645_HP_DCC_INT1, 0x9f01); --- 1431 unchanged lines hidden (view full) --- 2836 if (rt5645->en_button_func) { 2837 rt5645_enable_push_button_irq(codec, true); 2838 } 2839 } else { 2840 snd_soc_dapm_disable_pin(dapm, "Mic Det Power"); 2841 snd_soc_dapm_sync(dapm); 2842 rt5645->jack_type = SND_JACK_HEADPHONE; 2843 } |
2844 if (rt5645->pdata.jd_invert) 2845 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, 2846 RT5645_JD_1_1_MASK, RT5645_JD_1_1_INV); |
|
2832 } else { /* jack out */ 2833 rt5645->jack_type = 0; 2834 | 2847 } else { /* jack out */ 2848 rt5645->jack_type = 0; 2849 |
2835 regmap_update_bits(rt5645->regmap, RT5645_HP_VOL, 2836 RT5645_L_MUTE | RT5645_R_MUTE, 2837 RT5645_L_MUTE | RT5645_R_MUTE); | |
2838 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, 2839 RT5645_CBJ_MN_JD, RT5645_CBJ_MN_JD); 2840 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1, 2841 RT5645_CBJ_BST1_EN, 0); 2842 2843 if (rt5645->en_button_func) 2844 rt5645_enable_push_button_irq(codec, false); 2845 2846 if (rt5645->pdata.jd_mode == 0) 2847 snd_soc_dapm_disable_pin(dapm, "LDO2"); 2848 snd_soc_dapm_disable_pin(dapm, "Mic Det Power"); 2849 snd_soc_dapm_sync(dapm); | 2850 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, 2851 RT5645_CBJ_MN_JD, RT5645_CBJ_MN_JD); 2852 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1, 2853 RT5645_CBJ_BST1_EN, 0); 2854 2855 if (rt5645->en_button_func) 2856 rt5645_enable_push_button_irq(codec, false); 2857 2858 if (rt5645->pdata.jd_mode == 0) 2859 snd_soc_dapm_disable_pin(dapm, "LDO2"); 2860 snd_soc_dapm_disable_pin(dapm, "Mic Det Power"); 2861 snd_soc_dapm_sync(dapm); |
2862 if (rt5645->pdata.jd_invert) 2863 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2, 2864 RT5645_JD_1_1_MASK, RT5645_JD_1_1_NOR); |
|
2850 } 2851 2852 return rt5645->jack_type; 2853} 2854 2855static int rt5645_button_detect(struct snd_soc_codec *codec) 2856{ 2857 int btn_type, val; --- 349 unchanged lines hidden (view full) --- 3207 .callback = strago_quirk_cb, 3208 .matches = { 3209 DMI_MATCH(DMI_PRODUCT_NAME, "Ultima"), 3210 }, 3211 }, 3212 { } 3213}; 3214 | 2865 } 2866 2867 return rt5645->jack_type; 2868} 2869 2870static int rt5645_button_detect(struct snd_soc_codec *codec) 2871{ 2872 int btn_type, val; --- 349 unchanged lines hidden (view full) --- 3222 .callback = strago_quirk_cb, 3223 .matches = { 3224 DMI_MATCH(DMI_PRODUCT_NAME, "Ultima"), 3225 }, 3226 }, 3227 { } 3228}; 3229 |
3230static struct rt5645_platform_data buddy_platform_data = { 3231 .dmic1_data_pin = RT5645_DMIC_DATA_GPIO5, 3232 .dmic2_data_pin = RT5645_DMIC_DATA_IN2P, 3233 .jd_mode = 3, 3234 .jd_invert = true, 3235}; 3236 3237static int buddy_quirk_cb(const struct dmi_system_id *id) 3238{ 3239 rt5645_pdata = &buddy_platform_data; 3240 3241 return 1; 3242} 3243 3244static struct dmi_system_id dmi_platform_intel_broadwell[] __initdata = { 3245 { 3246 .ident = "Chrome Buddy", 3247 .callback = buddy_quirk_cb, 3248 .matches = { 3249 DMI_MATCH(DMI_PRODUCT_NAME, "Buddy"), 3250 }, 3251 }, 3252 { } 3253}; 3254 3255 |
|
3215static int rt5645_parse_dt(struct rt5645_priv *rt5645, struct device *dev) 3216{ 3217 rt5645->pdata.in2_diff = device_property_read_bool(dev, 3218 "realtek,in2-differential"); 3219 device_property_read_u32(dev, 3220 "realtek,dmic1-data-pin", &rt5645->pdata.dmic1_data_pin); 3221 device_property_read_u32(dev, 3222 "realtek,dmic2-data-pin", &rt5645->pdata.dmic2_data_pin); --- 16 unchanged lines hidden (view full) --- 3239 if (rt5645 == NULL) 3240 return -ENOMEM; 3241 3242 rt5645->i2c = i2c; 3243 i2c_set_clientdata(i2c, rt5645); 3244 3245 if (pdata) 3246 rt5645->pdata = *pdata; | 3256static int rt5645_parse_dt(struct rt5645_priv *rt5645, struct device *dev) 3257{ 3258 rt5645->pdata.in2_diff = device_property_read_bool(dev, 3259 "realtek,in2-differential"); 3260 device_property_read_u32(dev, 3261 "realtek,dmic1-data-pin", &rt5645->pdata.dmic1_data_pin); 3262 device_property_read_u32(dev, 3263 "realtek,dmic2-data-pin", &rt5645->pdata.dmic2_data_pin); --- 16 unchanged lines hidden (view full) --- 3280 if (rt5645 == NULL) 3281 return -ENOMEM; 3282 3283 rt5645->i2c = i2c; 3284 i2c_set_clientdata(i2c, rt5645); 3285 3286 if (pdata) 3287 rt5645->pdata = *pdata; |
3247 else if (dmi_check_system(dmi_platform_intel_braswell)) | 3288 else if (dmi_check_system(dmi_platform_intel_braswell) || 3289 dmi_check_system(dmi_platform_intel_broadwell)) |
3248 rt5645->pdata = *rt5645_pdata; 3249 else 3250 rt5645_parse_dt(rt5645, &i2c->dev); 3251 3252 rt5645->gpiod_hp_det = devm_gpiod_get_optional(&i2c->dev, "hp-detect", 3253 GPIOD_IN); 3254 3255 if (IS_ERR(rt5645->gpiod_hp_det)) { --- 236 unchanged lines hidden --- | 3290 rt5645->pdata = *rt5645_pdata; 3291 else 3292 rt5645_parse_dt(rt5645, &i2c->dev); 3293 3294 rt5645->gpiod_hp_det = devm_gpiod_get_optional(&i2c->dev, "hp-detect", 3295 GPIOD_IN); 3296 3297 if (IS_ERR(rt5645->gpiod_hp_det)) { --- 236 unchanged lines hidden --- |