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 ---