rt5645.c (7ff6319e7da5c09f0ce86d122d46040807262325) rt5645.c (ca8457bb02d8ecddf7f49ab874127dd4df782b16)
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

--- 212 unchanged lines hidden (view full) ---

221 { 0xfa, 0x2060 },
222 { 0xfb, 0x4040 },
223 { 0xfc, 0x0000 },
224 { 0xfd, 0x0002 },
225 { 0xfe, 0x10ec },
226 { 0xff, 0x6308 },
227};
228
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

--- 212 unchanged lines hidden (view full) ---

221 { 0xfa, 0x2060 },
222 { 0xfb, 0x4040 },
223 { 0xfc, 0x0000 },
224 { 0xfd, 0x0002 },
225 { 0xfe, 0x10ec },
226 { 0xff, 0x6308 },
227};
228
229static const struct reg_default rt5650_reg[] = {
230 { 0x00, 0x0000 },
231 { 0x01, 0xc8c8 },
232 { 0x02, 0xc8c8 },
233 { 0x03, 0xc8c8 },
234 { 0x0a, 0x0002 },
235 { 0x0b, 0x2827 },
236 { 0x0c, 0xe000 },
237 { 0x0d, 0x0000 },
238 { 0x0e, 0x0000 },
239 { 0x0f, 0x0808 },
240 { 0x14, 0x3333 },
241 { 0x16, 0x4b00 },
242 { 0x18, 0x018b },
243 { 0x19, 0xafaf },
244 { 0x1a, 0xafaf },
245 { 0x1b, 0x0001 },
246 { 0x1c, 0x2f2f },
247 { 0x1d, 0x2f2f },
248 { 0x1e, 0x0000 },
249 { 0x20, 0x0000 },
250 { 0x27, 0x7060 },
251 { 0x28, 0x7070 },
252 { 0x29, 0x8080 },
253 { 0x2a, 0x5656 },
254 { 0x2b, 0x5454 },
255 { 0x2c, 0xaaa0 },
256 { 0x2d, 0x0000 },
257 { 0x2f, 0x1002 },
258 { 0x31, 0x5000 },
259 { 0x32, 0x0000 },
260 { 0x33, 0x0000 },
261 { 0x34, 0x0000 },
262 { 0x35, 0x0000 },
263 { 0x3b, 0x0000 },
264 { 0x3c, 0x007f },
265 { 0x3d, 0x0000 },
266 { 0x3e, 0x007f },
267 { 0x3f, 0x0000 },
268 { 0x40, 0x001f },
269 { 0x41, 0x0000 },
270 { 0x42, 0x001f },
271 { 0x45, 0x6000 },
272 { 0x46, 0x003e },
273 { 0x47, 0x003e },
274 { 0x48, 0xf807 },
275 { 0x4a, 0x0004 },
276 { 0x4d, 0x0000 },
277 { 0x4e, 0x0000 },
278 { 0x4f, 0x01ff },
279 { 0x50, 0x0000 },
280 { 0x51, 0x0000 },
281 { 0x52, 0x01ff },
282 { 0x53, 0xf000 },
283 { 0x56, 0x0111 },
284 { 0x57, 0x0064 },
285 { 0x58, 0xef0e },
286 { 0x59, 0xf0f0 },
287 { 0x5a, 0xef0e },
288 { 0x5b, 0xf0f0 },
289 { 0x5c, 0xef0e },
290 { 0x5d, 0xf0f0 },
291 { 0x5e, 0xf000 },
292 { 0x5f, 0x0000 },
293 { 0x61, 0x0300 },
294 { 0x62, 0x0000 },
295 { 0x63, 0x00c2 },
296 { 0x64, 0x0000 },
297 { 0x65, 0x0000 },
298 { 0x66, 0x0000 },
299 { 0x6a, 0x0000 },
300 { 0x6c, 0x0aaa },
301 { 0x70, 0x8000 },
302 { 0x71, 0x8000 },
303 { 0x72, 0x8000 },
304 { 0x73, 0x7770 },
305 { 0x74, 0x3e00 },
306 { 0x75, 0x2409 },
307 { 0x76, 0x000a },
308 { 0x77, 0x0c00 },
309 { 0x78, 0x0000 },
310 { 0x79, 0x0123 },
311 { 0x7a, 0x0123 },
312 { 0x80, 0x0000 },
313 { 0x81, 0x0000 },
314 { 0x82, 0x0000 },
315 { 0x83, 0x0000 },
316 { 0x84, 0x0000 },
317 { 0x85, 0x0000 },
318 { 0x8a, 0x0000 },
319 { 0x8e, 0x0004 },
320 { 0x8f, 0x1100 },
321 { 0x90, 0x0646 },
322 { 0x91, 0x0c06 },
323 { 0x93, 0x0000 },
324 { 0x94, 0x0200 },
325 { 0x95, 0x0000 },
326 { 0x9a, 0x2184 },
327 { 0x9b, 0x010a },
328 { 0x9c, 0x0aea },
329 { 0x9d, 0x000c },
330 { 0x9e, 0x0400 },
331 { 0xa0, 0xa0a8 },
332 { 0xa1, 0x0059 },
333 { 0xa2, 0x0001 },
334 { 0xae, 0x6000 },
335 { 0xaf, 0x0000 },
336 { 0xb0, 0x6000 },
337 { 0xb1, 0x0000 },
338 { 0xb2, 0x0000 },
339 { 0xb3, 0x001f },
340 { 0xb4, 0x020c },
341 { 0xb5, 0x1f00 },
342 { 0xb6, 0x0000 },
343 { 0xbb, 0x0000 },
344 { 0xbc, 0x0000 },
345 { 0xbd, 0x0000 },
346 { 0xbe, 0x0000 },
347 { 0xbf, 0x3100 },
348 { 0xc0, 0x0000 },
349 { 0xc1, 0x0000 },
350 { 0xc2, 0x0000 },
351 { 0xc3, 0x2000 },
352 { 0xcd, 0x0000 },
353 { 0xce, 0x0000 },
354 { 0xcf, 0x1813 },
355 { 0xd0, 0x0690 },
356 { 0xd1, 0x1c17 },
357 { 0xd3, 0xb320 },
358 { 0xd4, 0x0000 },
359 { 0xd6, 0x0400 },
360 { 0xd9, 0x0809 },
361 { 0xda, 0x0000 },
362 { 0xdb, 0x0003 },
363 { 0xdc, 0x0049 },
364 { 0xdd, 0x001b },
365 { 0xdf, 0x0008 },
366 { 0xe0, 0x4000 },
367 { 0xe6, 0x8000 },
368 { 0xe7, 0x0200 },
369 { 0xec, 0xb300 },
370 { 0xed, 0x0000 },
371 { 0xf0, 0x001f },
372 { 0xf1, 0x020c },
373 { 0xf2, 0x1f00 },
374 { 0xf3, 0x0000 },
375 { 0xf4, 0x4000 },
376 { 0xf8, 0x0000 },
377 { 0xf9, 0x0000 },
378 { 0xfa, 0x2060 },
379 { 0xfb, 0x4040 },
380 { 0xfc, 0x0000 },
381 { 0xfd, 0x0002 },
382 { 0xfe, 0x10ec },
383 { 0xff, 0x6308 },
384};
385
386struct rt5645_eq_param_s {
387 unsigned short reg;
388 unsigned short val;
389};
390
391static const char *const rt5645_supply_names[] = {
392 "avdd",
393 "cpvdd",
394};
395
396struct rt5645_priv {
397 struct snd_soc_codec *codec;
398 struct rt5645_platform_data pdata;
399 struct regmap *regmap;
400 struct i2c_client *i2c;
401 struct gpio_desc *gpiod_hp_det;
402 struct snd_soc_jack *hp_jack;
403 struct snd_soc_jack *mic_jack;
404 struct snd_soc_jack *btn_jack;
229struct rt5645_eq_param_s {
230 unsigned short reg;
231 unsigned short val;
232};
233
234static const char *const rt5645_supply_names[] = {
235 "avdd",
236 "cpvdd",
237};
238
239struct rt5645_priv {
240 struct snd_soc_codec *codec;
241 struct rt5645_platform_data pdata;
242 struct regmap *regmap;
243 struct i2c_client *i2c;
244 struct gpio_desc *gpiod_hp_det;
245 struct snd_soc_jack *hp_jack;
246 struct snd_soc_jack *mic_jack;
247 struct snd_soc_jack *btn_jack;
405 struct delayed_work jack_detect_work, rcclock_work;
248 struct delayed_work jack_detect_work;
406 struct regulator_bulk_data supplies[ARRAY_SIZE(rt5645_supply_names)];
407 struct rt5645_eq_param_s *eq_param;
249 struct regulator_bulk_data supplies[ARRAY_SIZE(rt5645_supply_names)];
250 struct rt5645_eq_param_s *eq_param;
408 struct timer_list btn_check_timer;
409
410 int codec_type;
411 int sysclk;
412 int sysclk_src;
413 int lrck[RT5645_AIFS];
414 int bclk[RT5645_AIFS];
415 int master[RT5645_AIFS];
416

--- 301 unchanged lines hidden (view full) ---

718
719#define RT5645_HWEQ(xname) \
720{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
721 .info = rt5645_hweq_info, \
722 .get = rt5645_hweq_get, \
723 .put = rt5645_hweq_put \
724}
725
251
252 int codec_type;
253 int sysclk;
254 int sysclk_src;
255 int lrck[RT5645_AIFS];
256 int bclk[RT5645_AIFS];
257 int master[RT5645_AIFS];
258

--- 301 unchanged lines hidden (view full) ---

560
561#define RT5645_HWEQ(xname) \
562{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
563 .info = rt5645_hweq_info, \
564 .get = rt5645_hweq_get, \
565 .put = rt5645_hweq_put \
566}
567
726static int rt5645_spk_put_volsw(struct snd_kcontrol *kcontrol,
727 struct snd_ctl_elem_value *ucontrol)
728{
729 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
730 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
731 int ret;
732
733 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS,
734 RT5645_PWR_CLK25M_MASK, RT5645_PWR_CLK25M_PU);
735
736 ret = snd_soc_put_volsw(kcontrol, ucontrol);
737
738 mod_delayed_work(system_power_efficient_wq, &rt5645->rcclock_work,
739 msecs_to_jiffies(200));
740
741 return ret;
742}
743
744static const struct snd_kcontrol_new rt5645_snd_controls[] = {
745 /* Speaker Output Volume */
746 SOC_DOUBLE("Speaker Channel Switch", RT5645_SPK_VOL,
747 RT5645_VOL_L_SFT, RT5645_VOL_R_SFT, 1, 1),
568static const struct snd_kcontrol_new rt5645_snd_controls[] = {
569 /* Speaker Output Volume */
570 SOC_DOUBLE("Speaker Channel Switch", RT5645_SPK_VOL,
571 RT5645_VOL_L_SFT, RT5645_VOL_R_SFT, 1, 1),
748 SOC_DOUBLE_EXT_TLV("Speaker Playback Volume", RT5645_SPK_VOL,
749 RT5645_L_VOL_SFT, RT5645_R_VOL_SFT, 39, 1, snd_soc_get_volsw,
750 rt5645_spk_put_volsw, out_vol_tlv),
572 SOC_DOUBLE_TLV("Speaker Playback Volume", RT5645_SPK_VOL,
573 RT5645_L_VOL_SFT, RT5645_R_VOL_SFT, 39, 1, out_vol_tlv),
751
752 /* ClassD modulator Speaker Gain Ratio */
753 SOC_SINGLE_TLV("Speaker ClassD Playback Volume", RT5645_SPO_CLSD_RATIO,
754 RT5645_SPK_G_CLSD_SFT, 7, 0, spk_clsd_tlv),
755
756 /* Headphone Output Volume */
757 SOC_DOUBLE("Headphone Channel Switch", RT5645_HP_VOL,
758 RT5645_VOL_L_SFT, RT5645_VOL_R_SFT, 1, 1),

--- 911 unchanged lines hidden (view full) ---

1670 snd_soc_update_bits(codec, RT5645_DEPOP_M1,
1671 RT5645_HP_CO_MASK, RT5645_HP_CO_EN);
1672 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1673 0x3e, 0x7400);
1674 snd_soc_write(codec, RT5645_DEPOP_M3, 0x0737);
1675 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1676 RT5645_MAMP_INT_REG2, 0xfc00);
1677 snd_soc_write(codec, RT5645_DEPOP_M2, 0x1140);
574
575 /* ClassD modulator Speaker Gain Ratio */
576 SOC_SINGLE_TLV("Speaker ClassD Playback Volume", RT5645_SPO_CLSD_RATIO,
577 RT5645_SPK_G_CLSD_SFT, 7, 0, spk_clsd_tlv),
578
579 /* Headphone Output Volume */
580 SOC_DOUBLE("Headphone Channel Switch", RT5645_HP_VOL,
581 RT5645_VOL_L_SFT, RT5645_VOL_R_SFT, 1, 1),

--- 911 unchanged lines hidden (view full) ---

1493 snd_soc_update_bits(codec, RT5645_DEPOP_M1,
1494 RT5645_HP_CO_MASK, RT5645_HP_CO_EN);
1495 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1496 0x3e, 0x7400);
1497 snd_soc_write(codec, RT5645_DEPOP_M3, 0x0737);
1498 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1499 RT5645_MAMP_INT_REG2, 0xfc00);
1500 snd_soc_write(codec, RT5645_DEPOP_M2, 0x1140);
1678 msleep(70);
1501 msleep(40);
1679 rt5645->hp_on = true;
1680 } else {
1681 /* depop parameters */
1682 snd_soc_update_bits(codec, RT5645_DEPOP_M2,
1683 RT5645_DEPOP_MASK, RT5645_DEPOP_MAN);
1684 snd_soc_write(codec, RT5645_DEPOP_M1, 0x000d);
1685 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1686 RT5645_HP_DCC_INT1, 0x9f01);

--- 131 unchanged lines hidden (view full) ---

1818 switch (event) {
1819 case SND_SOC_DAPM_POST_PMU:
1820 rt5645_enable_hweq(codec);
1821 snd_soc_update_bits(codec, RT5645_PWR_DIG1,
1822 RT5645_PWR_CLS_D | RT5645_PWR_CLS_D_R |
1823 RT5645_PWR_CLS_D_L,
1824 RT5645_PWR_CLS_D | RT5645_PWR_CLS_D_R |
1825 RT5645_PWR_CLS_D_L);
1502 rt5645->hp_on = true;
1503 } else {
1504 /* depop parameters */
1505 snd_soc_update_bits(codec, RT5645_DEPOP_M2,
1506 RT5645_DEPOP_MASK, RT5645_DEPOP_MAN);
1507 snd_soc_write(codec, RT5645_DEPOP_M1, 0x000d);
1508 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1509 RT5645_HP_DCC_INT1, 0x9f01);

--- 131 unchanged lines hidden (view full) ---

1641 switch (event) {
1642 case SND_SOC_DAPM_POST_PMU:
1643 rt5645_enable_hweq(codec);
1644 snd_soc_update_bits(codec, RT5645_PWR_DIG1,
1645 RT5645_PWR_CLS_D | RT5645_PWR_CLS_D_R |
1646 RT5645_PWR_CLS_D_L,
1647 RT5645_PWR_CLS_D | RT5645_PWR_CLS_D_R |
1648 RT5645_PWR_CLS_D_L);
1649 snd_soc_update_bits(codec, RT5645_GEN_CTRL3,
1650 RT5645_DET_CLK_MASK, RT5645_DET_CLK_MODE1);
1826 break;
1827
1828 case SND_SOC_DAPM_PRE_PMD:
1651 break;
1652
1653 case SND_SOC_DAPM_PRE_PMD:
1654 snd_soc_update_bits(codec, RT5645_GEN_CTRL3,
1655 RT5645_DET_CLK_MASK, RT5645_DET_CLK_DIS);
1829 snd_soc_write(codec, RT5645_EQ_CTRL2, 0);
1830 snd_soc_update_bits(codec, RT5645_PWR_DIG1,
1831 RT5645_PWR_CLS_D | RT5645_PWR_CLS_D_R |
1832 RT5645_PWR_CLS_D_L, 0);
1833 break;
1834
1835 default:
1836 return 0;

--- 1289 unchanged lines hidden (view full) ---

3126 }
3127 } else {
3128 snd_soc_dapm_disable_pin(dapm, "Mic Det Power");
3129 snd_soc_dapm_sync(dapm);
3130 rt5645->jack_type = SND_JACK_HEADPHONE;
3131 }
3132 if (rt5645->pdata.jd_invert)
3133 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
1656 snd_soc_write(codec, RT5645_EQ_CTRL2, 0);
1657 snd_soc_update_bits(codec, RT5645_PWR_DIG1,
1658 RT5645_PWR_CLS_D | RT5645_PWR_CLS_D_R |
1659 RT5645_PWR_CLS_D_L, 0);
1660 break;
1661
1662 default:
1663 return 0;

--- 1289 unchanged lines hidden (view full) ---

2953 }
2954 } else {
2955 snd_soc_dapm_disable_pin(dapm, "Mic Det Power");
2956 snd_soc_dapm_sync(dapm);
2957 rt5645->jack_type = SND_JACK_HEADPHONE;
2958 }
2959 if (rt5645->pdata.jd_invert)
2960 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
3134 RT5645_JD_1_1_MASK, RT5645_JD_1_1_NOR);
2961 RT5645_JD_1_1_MASK, RT5645_JD_1_1_INV);
3135 } else { /* jack out */
3136 rt5645->jack_type = 0;
3137
3138 regmap_update_bits(rt5645->regmap, RT5645_HP_VOL,
3139 RT5645_L_MUTE | RT5645_R_MUTE,
3140 RT5645_L_MUTE | RT5645_R_MUTE);
3141 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2,
3142 RT5645_CBJ_MN_JD, RT5645_CBJ_MN_JD);

--- 4 unchanged lines hidden (view full) ---

3147 rt5645_enable_push_button_irq(codec, false);
3148
3149 if (rt5645->pdata.jd_mode == 0)
3150 snd_soc_dapm_disable_pin(dapm, "LDO2");
3151 snd_soc_dapm_disable_pin(dapm, "Mic Det Power");
3152 snd_soc_dapm_sync(dapm);
3153 if (rt5645->pdata.jd_invert)
3154 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
2962 } else { /* jack out */
2963 rt5645->jack_type = 0;
2964
2965 regmap_update_bits(rt5645->regmap, RT5645_HP_VOL,
2966 RT5645_L_MUTE | RT5645_R_MUTE,
2967 RT5645_L_MUTE | RT5645_R_MUTE);
2968 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2,
2969 RT5645_CBJ_MN_JD, RT5645_CBJ_MN_JD);

--- 4 unchanged lines hidden (view full) ---

2974 rt5645_enable_push_button_irq(codec, false);
2975
2976 if (rt5645->pdata.jd_mode == 0)
2977 snd_soc_dapm_disable_pin(dapm, "LDO2");
2978 snd_soc_dapm_disable_pin(dapm, "Mic Det Power");
2979 snd_soc_dapm_sync(dapm);
2980 if (rt5645->pdata.jd_invert)
2981 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
3155 RT5645_JD_1_1_MASK, RT5645_JD_1_1_INV);
2982 RT5645_JD_1_1_MASK, RT5645_JD_1_1_NOR);
3156 }
3157
3158 return rt5645->jack_type;
3159}
3160
3161static int rt5645_button_detect(struct snd_soc_codec *codec)
3162{
3163 int btn_type, val;

--- 107 unchanged lines hidden (view full) ---

3271 dev_err(rt5645->codec->dev,
3272 "Unexpected button code 0x%04x\n",
3273 btn_type);
3274 break;
3275 }
3276 }
3277 if (btn_type == 0)/* button release */
3278 report = rt5645->jack_type;
2983 }
2984
2985 return rt5645->jack_type;
2986}
2987
2988static int rt5645_button_detect(struct snd_soc_codec *codec)
2989{
2990 int btn_type, val;

--- 107 unchanged lines hidden (view full) ---

3098 dev_err(rt5645->codec->dev,
3099 "Unexpected button code 0x%04x\n",
3100 btn_type);
3101 break;
3102 }
3103 }
3104 if (btn_type == 0)/* button release */
3105 report = rt5645->jack_type;
3279 else {
3280 if (rt5645->pdata.jd_invert) {
3281 mod_timer(&rt5645->btn_check_timer,
3282 msecs_to_jiffies(100));
3283 }
3284 }
3285
3286 break;
3287 /* jack out */
3288 case 0x70: /* 2 port */
3289 case 0x10: /* 2 port */
3290 case 0x20: /* 1 port */
3291 report = 0;
3292 snd_soc_update_bits(rt5645->codec,

--- 7 unchanged lines hidden (view full) ---

3300 snd_soc_jack_report(rt5645->hp_jack, report, SND_JACK_HEADPHONE);
3301 snd_soc_jack_report(rt5645->mic_jack, report, SND_JACK_MICROPHONE);
3302 if (rt5645->en_button_func)
3303 snd_soc_jack_report(rt5645->btn_jack,
3304 report, SND_JACK_BTN_0 | SND_JACK_BTN_1 |
3305 SND_JACK_BTN_2 | SND_JACK_BTN_3);
3306}
3307
3106
3107 break;
3108 /* jack out */
3109 case 0x70: /* 2 port */
3110 case 0x10: /* 2 port */
3111 case 0x20: /* 1 port */
3112 report = 0;
3113 snd_soc_update_bits(rt5645->codec,

--- 7 unchanged lines hidden (view full) ---

3121 snd_soc_jack_report(rt5645->hp_jack, report, SND_JACK_HEADPHONE);
3122 snd_soc_jack_report(rt5645->mic_jack, report, SND_JACK_MICROPHONE);
3123 if (rt5645->en_button_func)
3124 snd_soc_jack_report(rt5645->btn_jack,
3125 report, SND_JACK_BTN_0 | SND_JACK_BTN_1 |
3126 SND_JACK_BTN_2 | SND_JACK_BTN_3);
3127}
3128
3308static void rt5645_rcclock_work(struct work_struct *work)
3309{
3310 struct rt5645_priv *rt5645 =
3311 container_of(work, struct rt5645_priv, rcclock_work.work);
3312
3313 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS,
3314 RT5645_PWR_CLK25M_MASK, RT5645_PWR_CLK25M_PD);
3315}
3316
3317static irqreturn_t rt5645_irq(int irq, void *data)
3318{
3319 struct rt5645_priv *rt5645 = data;
3320
3321 queue_delayed_work(system_power_efficient_wq,
3322 &rt5645->jack_detect_work, msecs_to_jiffies(250));
3323
3324 return IRQ_HANDLED;
3325}
3326
3129static irqreturn_t rt5645_irq(int irq, void *data)
3130{
3131 struct rt5645_priv *rt5645 = data;
3132
3133 queue_delayed_work(system_power_efficient_wq,
3134 &rt5645->jack_detect_work, msecs_to_jiffies(250));
3135
3136 return IRQ_HANDLED;
3137}
3138
3327static void rt5645_btn_check_callback(unsigned long data)
3328{
3329 struct rt5645_priv *rt5645 = (struct rt5645_priv *)data;
3330
3331 queue_delayed_work(system_power_efficient_wq,
3332 &rt5645->jack_detect_work, msecs_to_jiffies(5));
3333}
3334
3335static int rt5645_probe(struct snd_soc_codec *codec)
3336{
3337 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
3338 struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec);
3339
3340 rt5645->codec = codec;
3341
3342 switch (rt5645->codec_type) {

--- 140 unchanged lines hidden (view full) ---

3483
3484 .cache_type = REGCACHE_RBTREE,
3485 .reg_defaults = rt5645_reg,
3486 .num_reg_defaults = ARRAY_SIZE(rt5645_reg),
3487 .ranges = rt5645_ranges,
3488 .num_ranges = ARRAY_SIZE(rt5645_ranges),
3489};
3490
3139static int rt5645_probe(struct snd_soc_codec *codec)
3140{
3141 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
3142 struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec);
3143
3144 rt5645->codec = codec;
3145
3146 switch (rt5645->codec_type) {

--- 140 unchanged lines hidden (view full) ---

3287
3288 .cache_type = REGCACHE_RBTREE,
3289 .reg_defaults = rt5645_reg,
3290 .num_reg_defaults = ARRAY_SIZE(rt5645_reg),
3291 .ranges = rt5645_ranges,
3292 .num_ranges = ARRAY_SIZE(rt5645_ranges),
3293};
3294
3491static const struct regmap_config rt5650_regmap = {
3492 .reg_bits = 8,
3493 .val_bits = 16,
3494 .use_single_rw = true,
3495 .max_register = RT5645_VENDOR_ID2 + 1 + (ARRAY_SIZE(rt5645_ranges) *
3496 RT5645_PR_SPACING),
3497 .volatile_reg = rt5645_volatile_register,
3498 .readable_reg = rt5645_readable_register,
3499
3500 .cache_type = REGCACHE_RBTREE,
3501 .reg_defaults = rt5650_reg,
3502 .num_reg_defaults = ARRAY_SIZE(rt5650_reg),
3503 .ranges = rt5645_ranges,
3504 .num_ranges = ARRAY_SIZE(rt5645_ranges),
3505};
3506
3507static const struct regmap_config temp_regmap = {
3508 .name="nocache",
3509 .reg_bits = 8,
3510 .val_bits = 16,
3511 .use_single_rw = true,
3512 .max_register = RT5645_VENDOR_ID2 + 1,
3513 .cache_type = REGCACHE_NONE,
3514};
3515
3516static const struct i2c_device_id rt5645_i2c_id[] = {
3517 { "rt5645", 0 },
3518 { "rt5650", 0 },
3519 { }
3520};
3521MODULE_DEVICE_TABLE(i2c, rt5645_i2c_id);
3522
3523#ifdef CONFIG_ACPI
3524static struct acpi_device_id rt5645_acpi_match[] = {
3525 { "10EC5645", 0 },
3526 { "10EC5650", 0 },
3527 {},
3528};
3529MODULE_DEVICE_TABLE(acpi, rt5645_acpi_match);
3530#endif
3531
3295static const struct i2c_device_id rt5645_i2c_id[] = {
3296 { "rt5645", 0 },
3297 { "rt5650", 0 },
3298 { }
3299};
3300MODULE_DEVICE_TABLE(i2c, rt5645_i2c_id);
3301
3302#ifdef CONFIG_ACPI
3303static struct acpi_device_id rt5645_acpi_match[] = {
3304 { "10EC5645", 0 },
3305 { "10EC5650", 0 },
3306 {},
3307};
3308MODULE_DEVICE_TABLE(acpi, rt5645_acpi_match);
3309#endif
3310
3532static struct rt5645_platform_data general_platform_data = {
3311static struct rt5645_platform_data *rt5645_pdata;
3312
3313static struct rt5645_platform_data strago_platform_data = {
3533 .dmic1_data_pin = RT5645_DMIC1_DISABLE,
3534 .dmic2_data_pin = RT5645_DMIC_DATA_IN2P,
3535 .jd_mode = 3,
3536};
3537
3314 .dmic1_data_pin = RT5645_DMIC1_DISABLE,
3315 .dmic2_data_pin = RT5645_DMIC_DATA_IN2P,
3316 .jd_mode = 3,
3317};
3318
3319static int strago_quirk_cb(const struct dmi_system_id *id)
3320{
3321 rt5645_pdata = &strago_platform_data;
3322
3323 return 1;
3324}
3325
3538static const struct dmi_system_id dmi_platform_intel_braswell[] = {
3539 {
3540 .ident = "Intel Strago",
3326static const struct dmi_system_id dmi_platform_intel_braswell[] = {
3327 {
3328 .ident = "Intel Strago",
3329 .callback = strago_quirk_cb,
3541 .matches = {
3542 DMI_MATCH(DMI_PRODUCT_NAME, "Strago"),
3543 },
3544 },
3545 {
3330 .matches = {
3331 DMI_MATCH(DMI_PRODUCT_NAME, "Strago"),
3332 },
3333 },
3334 {
3546 .ident = "Google Chrome",
3335 .ident = "Google Celes",
3336 .callback = strago_quirk_cb,
3547 .matches = {
3337 .matches = {
3548 DMI_MATCH(DMI_SYS_VENDOR, "GOOGLE"),
3338 DMI_MATCH(DMI_PRODUCT_NAME, "Celes"),
3549 },
3550 },
3339 },
3340 },
3341 {
3342 .ident = "Google Ultima",
3343 .callback = strago_quirk_cb,
3344 .matches = {
3345 DMI_MATCH(DMI_PRODUCT_NAME, "Ultima"),
3346 },
3347 },
3348 {
3349 .ident = "Google Reks",
3350 .callback = strago_quirk_cb,
3351 .matches = {
3352 DMI_MATCH(DMI_PRODUCT_NAME, "Reks"),
3353 },
3354 },
3551 { }
3552};
3553
3554static struct rt5645_platform_data buddy_platform_data = {
3555 .dmic1_data_pin = RT5645_DMIC_DATA_GPIO5,
3556 .dmic2_data_pin = RT5645_DMIC_DATA_IN2P,
3557 .jd_mode = 3,
3558 .jd_invert = true,
3559};
3560
3355 { }
3356};
3357
3358static struct rt5645_platform_data buddy_platform_data = {
3359 .dmic1_data_pin = RT5645_DMIC_DATA_GPIO5,
3360 .dmic2_data_pin = RT5645_DMIC_DATA_IN2P,
3361 .jd_mode = 3,
3362 .jd_invert = true,
3363};
3364
3365static int buddy_quirk_cb(const struct dmi_system_id *id)
3366{
3367 rt5645_pdata = &buddy_platform_data;
3368
3369 return 1;
3370}
3371
3561static struct dmi_system_id dmi_platform_intel_broadwell[] = {
3562 {
3563 .ident = "Chrome Buddy",
3372static struct dmi_system_id dmi_platform_intel_broadwell[] = {
3373 {
3374 .ident = "Chrome Buddy",
3375 .callback = buddy_quirk_cb,
3564 .matches = {
3565 DMI_MATCH(DMI_PRODUCT_NAME, "Buddy"),
3566 },
3567 },
3568 { }
3569};
3570
3376 .matches = {
3377 DMI_MATCH(DMI_PRODUCT_NAME, "Buddy"),
3378 },
3379 },
3380 { }
3381};
3382
3571static bool rt5645_check_dp(struct device *dev)
3572{
3573 if (device_property_present(dev, "realtek,in2-differential") ||
3574 device_property_present(dev, "realtek,dmic1-data-pin") ||
3575 device_property_present(dev, "realtek,dmic2-data-pin") ||
3576 device_property_present(dev, "realtek,jd-mode"))
3577 return true;
3578
3383
3579 return false;
3580}
3581
3582static int rt5645_parse_dt(struct rt5645_priv *rt5645, struct device *dev)
3583{
3584 rt5645->pdata.in2_diff = device_property_read_bool(dev,
3585 "realtek,in2-differential");
3586 device_property_read_u32(dev,
3587 "realtek,dmic1-data-pin", &rt5645->pdata.dmic1_data_pin);
3588 device_property_read_u32(dev,
3589 "realtek,dmic2-data-pin", &rt5645->pdata.dmic2_data_pin);

--- 5 unchanged lines hidden (view full) ---

3595
3596static int rt5645_i2c_probe(struct i2c_client *i2c,
3597 const struct i2c_device_id *id)
3598{
3599 struct rt5645_platform_data *pdata = dev_get_platdata(&i2c->dev);
3600 struct rt5645_priv *rt5645;
3601 int ret, i;
3602 unsigned int val;
3384static int rt5645_parse_dt(struct rt5645_priv *rt5645, struct device *dev)
3385{
3386 rt5645->pdata.in2_diff = device_property_read_bool(dev,
3387 "realtek,in2-differential");
3388 device_property_read_u32(dev,
3389 "realtek,dmic1-data-pin", &rt5645->pdata.dmic1_data_pin);
3390 device_property_read_u32(dev,
3391 "realtek,dmic2-data-pin", &rt5645->pdata.dmic2_data_pin);

--- 5 unchanged lines hidden (view full) ---

3397
3398static int rt5645_i2c_probe(struct i2c_client *i2c,
3399 const struct i2c_device_id *id)
3400{
3401 struct rt5645_platform_data *pdata = dev_get_platdata(&i2c->dev);
3402 struct rt5645_priv *rt5645;
3403 int ret, i;
3404 unsigned int val;
3603 struct regmap *regmap;
3604
3605 rt5645 = devm_kzalloc(&i2c->dev, sizeof(struct rt5645_priv),
3606 GFP_KERNEL);
3607 if (rt5645 == NULL)
3608 return -ENOMEM;
3609
3610 rt5645->i2c = i2c;
3611 i2c_set_clientdata(i2c, rt5645);
3612
3613 if (pdata)
3614 rt5645->pdata = *pdata;
3405
3406 rt5645 = devm_kzalloc(&i2c->dev, sizeof(struct rt5645_priv),
3407 GFP_KERNEL);
3408 if (rt5645 == NULL)
3409 return -ENOMEM;
3410
3411 rt5645->i2c = i2c;
3412 i2c_set_clientdata(i2c, rt5645);
3413
3414 if (pdata)
3415 rt5645->pdata = *pdata;
3615 else if (dmi_check_system(dmi_platform_intel_broadwell))
3616 rt5645->pdata = buddy_platform_data;
3617 else if (rt5645_check_dp(&i2c->dev))
3416 else if (dmi_check_system(dmi_platform_intel_braswell) ||
3417 dmi_check_system(dmi_platform_intel_broadwell))
3418 rt5645->pdata = *rt5645_pdata;
3419 else
3618 rt5645_parse_dt(rt5645, &i2c->dev);
3420 rt5645_parse_dt(rt5645, &i2c->dev);
3619 else if (dmi_check_system(dmi_platform_intel_braswell))
3620 rt5645->pdata = general_platform_data;
3621
3622 rt5645->gpiod_hp_det = devm_gpiod_get_optional(&i2c->dev, "hp-detect",
3623 GPIOD_IN);
3624
3625 if (IS_ERR(rt5645->gpiod_hp_det)) {
3626 dev_err(&i2c->dev, "failed to initialize gpiod\n");
3627 return PTR_ERR(rt5645->gpiod_hp_det);
3628 }
3629
3421
3422 rt5645->gpiod_hp_det = devm_gpiod_get_optional(&i2c->dev, "hp-detect",
3423 GPIOD_IN);
3424
3425 if (IS_ERR(rt5645->gpiod_hp_det)) {
3426 dev_err(&i2c->dev, "failed to initialize gpiod\n");
3427 return PTR_ERR(rt5645->gpiod_hp_det);
3428 }
3429
3430 rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5645_regmap);
3431 if (IS_ERR(rt5645->regmap)) {
3432 ret = PTR_ERR(rt5645->regmap);
3433 dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
3434 ret);
3435 return ret;
3436 }
3437
3630 for (i = 0; i < ARRAY_SIZE(rt5645->supplies); i++)
3631 rt5645->supplies[i].supply = rt5645_supply_names[i];
3632
3633 ret = devm_regulator_bulk_get(&i2c->dev,
3634 ARRAY_SIZE(rt5645->supplies),
3635 rt5645->supplies);
3636 if (ret) {
3637 dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret);
3638 return ret;
3639 }
3640
3641 ret = regulator_bulk_enable(ARRAY_SIZE(rt5645->supplies),
3642 rt5645->supplies);
3643 if (ret) {
3644 dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret);
3645 return ret;
3646 }
3647
3438 for (i = 0; i < ARRAY_SIZE(rt5645->supplies); i++)
3439 rt5645->supplies[i].supply = rt5645_supply_names[i];
3440
3441 ret = devm_regulator_bulk_get(&i2c->dev,
3442 ARRAY_SIZE(rt5645->supplies),
3443 rt5645->supplies);
3444 if (ret) {
3445 dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret);
3446 return ret;
3447 }
3448
3449 ret = regulator_bulk_enable(ARRAY_SIZE(rt5645->supplies),
3450 rt5645->supplies);
3451 if (ret) {
3452 dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret);
3453 return ret;
3454 }
3455
3648 regmap = devm_regmap_init_i2c(i2c, &temp_regmap);
3649 if (IS_ERR(regmap)) {
3650 ret = PTR_ERR(regmap);
3651 dev_err(&i2c->dev, "Failed to allocate temp register map: %d\n",
3652 ret);
3653 return ret;
3654 }
3655 regmap_read(regmap, RT5645_VENDOR_ID2, &val);
3456 regmap_read(rt5645->regmap, RT5645_VENDOR_ID2, &val);
3656
3657 switch (val) {
3658 case RT5645_DEVICE_ID:
3457
3458 switch (val) {
3459 case RT5645_DEVICE_ID:
3659 rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5645_regmap);
3660 rt5645->codec_type = CODEC_TYPE_RT5645;
3661 break;
3662 case RT5650_DEVICE_ID:
3460 rt5645->codec_type = CODEC_TYPE_RT5645;
3461 break;
3462 case RT5650_DEVICE_ID:
3663 rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5650_regmap);
3664 rt5645->codec_type = CODEC_TYPE_RT5650;
3665 break;
3666 default:
3667 dev_err(&i2c->dev,
3668 "Device with ID register %#x is not rt5645 or rt5650\n",
3669 val);
3670 ret = -ENODEV;
3671 goto err_enable;
3672 }
3673
3463 rt5645->codec_type = CODEC_TYPE_RT5650;
3464 break;
3465 default:
3466 dev_err(&i2c->dev,
3467 "Device with ID register %#x is not rt5645 or rt5650\n",
3468 val);
3469 ret = -ENODEV;
3470 goto err_enable;
3471 }
3472
3674 if (IS_ERR(rt5645->regmap)) {
3675 ret = PTR_ERR(rt5645->regmap);
3676 dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
3677 ret);
3678 return ret;
3679 }
3680
3681 regmap_write(rt5645->regmap, RT5645_RESET, 0);
3682
3683 ret = regmap_register_patch(rt5645->regmap, init_list,
3684 ARRAY_SIZE(init_list));
3685 if (ret != 0)
3686 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret);
3687
3688 if (rt5645->codec_type == CODEC_TYPE_RT5650) {

--- 104 unchanged lines hidden (view full) ---

3793 RT5645_JD1_MODE_MASK,
3794 RT5645_JD1_MODE_2);
3795 break;
3796 default:
3797 break;
3798 }
3799 }
3800
3473 regmap_write(rt5645->regmap, RT5645_RESET, 0);
3474
3475 ret = regmap_register_patch(rt5645->regmap, init_list,
3476 ARRAY_SIZE(init_list));
3477 if (ret != 0)
3478 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret);
3479
3480 if (rt5645->codec_type == CODEC_TYPE_RT5650) {

--- 104 unchanged lines hidden (view full) ---

3585 RT5645_JD1_MODE_MASK,
3586 RT5645_JD1_MODE_2);
3587 break;
3588 default:
3589 break;
3590 }
3591 }
3592
3801 if (rt5645->pdata.jd_invert) {
3802 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
3803 RT5645_JD_1_1_MASK, RT5645_JD_1_1_INV);
3804 setup_timer(&rt5645->btn_check_timer,
3805 rt5645_btn_check_callback, (unsigned long)rt5645);
3806 }
3807
3808 INIT_DELAYED_WORK(&rt5645->jack_detect_work, rt5645_jack_detect_work);
3593 INIT_DELAYED_WORK(&rt5645->jack_detect_work, rt5645_jack_detect_work);
3809 INIT_DELAYED_WORK(&rt5645->rcclock_work, rt5645_rcclock_work);
3810
3811 if (rt5645->i2c->irq) {
3812 ret = request_threaded_irq(rt5645->i2c->irq, NULL, rt5645_irq,
3813 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING
3814 | IRQF_ONESHOT, "rt5645", rt5645);
3815 if (ret) {
3816 dev_err(&i2c->dev, "Failed to reguest IRQ: %d\n", ret);
3817 goto err_enable;

--- 18 unchanged lines hidden (view full) ---

3836static int rt5645_i2c_remove(struct i2c_client *i2c)
3837{
3838 struct rt5645_priv *rt5645 = i2c_get_clientdata(i2c);
3839
3840 if (i2c->irq)
3841 free_irq(i2c->irq, rt5645);
3842
3843 cancel_delayed_work_sync(&rt5645->jack_detect_work);
3594
3595 if (rt5645->i2c->irq) {
3596 ret = request_threaded_irq(rt5645->i2c->irq, NULL, rt5645_irq,
3597 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING
3598 | IRQF_ONESHOT, "rt5645", rt5645);
3599 if (ret) {
3600 dev_err(&i2c->dev, "Failed to reguest IRQ: %d\n", ret);
3601 goto err_enable;

--- 18 unchanged lines hidden (view full) ---

3620static int rt5645_i2c_remove(struct i2c_client *i2c)
3621{
3622 struct rt5645_priv *rt5645 = i2c_get_clientdata(i2c);
3623
3624 if (i2c->irq)
3625 free_irq(i2c->irq, rt5645);
3626
3627 cancel_delayed_work_sync(&rt5645->jack_detect_work);
3844 cancel_delayed_work_sync(&rt5645->rcclock_work);
3845
3846 snd_soc_unregister_codec(&i2c->dev);
3847 regulator_bulk_disable(ARRAY_SIZE(rt5645->supplies), rt5645->supplies);
3848
3849 return 0;
3850}
3851
3852static void rt5645_i2c_shutdown(struct i2c_client *i2c)

--- 28 unchanged lines hidden ---
3628
3629 snd_soc_unregister_codec(&i2c->dev);
3630 regulator_bulk_disable(ARRAY_SIZE(rt5645->supplies), rt5645->supplies);
3631
3632 return 0;
3633}
3634
3635static void rt5645_i2c_shutdown(struct i2c_client *i2c)

--- 28 unchanged lines hidden ---