4 * Driver for rockchip rk3036 codec
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
14 #include <linux/init.h>
15 #include <linux/module.h>
16 #include <linux/interrupt.h>
17 #include <linux/device.h>
18 #include <linux/delay.h>
19 #include <linux/clk.h>
20 #include <linux/version.h>
22 #include <linux/of_gpio.h>
23 #include <linux/clk.h>
25 #include <linux/rockchip/iomap.h>
26 #include <linux/rockchip/grf.h>
27 #include <linux/platform_device.h>
28 #include <linux/pm_runtime.h>
29 #include <linux/regmap.h>
30 #include <linux/slab.h>
32 #include <sound/core.h>
33 #include <sound/pcm.h>
34 #include <sound/pcm_params.h>
35 #include <sound/initval.h>
36 #include <sound/soc.h>
37 #include <sound/soc-dapm.h>
38 #include <sound/dmaengine_pcm.h>
40 #include <linux/spinlock.h>
41 #include <sound/tlv.h>
42 #include <linux/switch.h>
43 #include "rk312x_codec.h"
45 static int debug = -1;
46 module_param(debug, int, S_IRUGO|S_IWUSR);
48 #define dbg_codec(level, fmt, arg...) \
51 printk(fmt , ## arg); \
54 #define DBG(fmt, ...) dbg_codec(0, fmt, ## __VA_ARGS__)
56 #define INVALID_GPIO -1
57 #define CODEC_SET_SPK 1
58 #define CODEC_SET_HP 2
60 #define BIT_HEADSET (1 << 0)
61 #define BIT_HEADSET_NO_MIC (1 << 1)
62 #define GRF_ACODEC_CON 0x013c
63 #define GRF_SOC_STATUS0 0x014c
78 #define CAP_VOL 26 /*0-31 */
79 /*with capacity or not*/
82 struct rk312x_codec_priv {
83 void __iomem *regbase;
84 struct snd_soc_codec *codec;
86 unsigned int stereo_sysclk;
95 int spk_hp_switch_gpio;
98 enum of_gpio_flags spk_io;
101 /* 1 default for mid; */
108 enum of_gpio_flags hp_active_level;
109 enum of_gpio_flags spk_active_level;
110 unsigned int spk_volume;
111 unsigned int hp_volume;
112 unsigned int capture_volume;
114 long int playback_path;
115 long int capture_path;
116 long int voice_call_path;
118 struct switch_dev sdev;
119 struct timer_list timer;
120 struct work_struct work;
122 static struct rk312x_codec_priv *rk312x_priv;
124 #define RK312x_CODEC_ALL 0
125 #define RK312x_CODEC_PLAYBACK 1
126 #define RK312x_CODEC_CAPTURE 2
127 #define RK312x_CODEC_INCALL 3
129 #define RK312x_CODEC_WORK_NULL 0
130 #define RK312x_CODEC_WORK_POWER_DOWN 1
131 #define RK312x_CODEC_WORK_POWER_UP 2
132 static struct workqueue_struct *rk312x_codec_workq;
134 static void rk312x_codec_capture_work(struct work_struct *work);
135 static DECLARE_DELAYED_WORK(capture_delayed_work, rk312x_codec_capture_work);
136 static int rk312x_codec_work_capture_type = RK312x_CODEC_WORK_NULL;
137 /* static bool rk312x_for_mid = 1; */
138 static int rk312x_codec_power_up(int type);
139 static const unsigned int rk312x_reg_defaults[RK312x_PGAR_AGC_CTL5+1] = {
140 [RK312x_RESET] = 0x0003,
141 [RK312x_ADC_INT_CTL1] = 0x0050,
142 [RK312x_ADC_INT_CTL2] = 0x000e,
143 [RK312x_DAC_INT_CTL1] = 0x0050,
144 [RK312x_DAC_INT_CTL2] = 0x000e,
145 [RK312x_DAC_INT_CTL3] = 0x22,
146 [RK312x_ADC_MIC_CTL] = 0x0000,
147 [RK312x_BST_CTL] = 0x000,
148 [RK312x_ALC_MUNIN_CTL] = 0x0044,
149 [RK312x_BSTL_ALCL_CTL] = 0x000c,
150 [RK312x_ALCR_GAIN_CTL] = 0x000C,
151 [RK312x_ADC_ENABLE] = 0x0000,
152 [RK312x_DAC_CTL] = 0x0000,
153 [RK312x_DAC_ENABLE] = 0x0000,
154 [RK312x_HPMIX_CTL] = 0x0000,
155 [RK312x_HPMIX_S_SELECT] = 0x0000,
156 [RK312x_HPOUT_CTL] = 0x0000,
157 [RK312x_HPOUTL_GAIN] = 0x0000,
158 [RK312x_HPOUTR_GAIN] = 0x0000,
159 [RK312x_SELECT_CURRENT] = 0x003e,
160 [RK312x_PGAL_AGC_CTL1] = 0x0000,
161 [RK312x_PGAL_AGC_CTL2] = 0x0046,
162 [RK312x_PGAL_AGC_CTL3] = 0x0041,
163 [RK312x_PGAL_AGC_CTL4] = 0x002c,
164 [RK312x_PGAL_ASR_CTL] = 0x0000,
165 [RK312x_PGAL_AGC_MAX_H] = 0x0026,
166 [RK312x_PGAL_AGC_MAX_L] = 0x0040,
167 [RK312x_PGAL_AGC_MIN_H] = 0x0036,
168 [RK312x_PGAL_AGC_MIN_L] = 0x0020,
169 [RK312x_PGAL_AGC_CTL5] = 0x0038,
170 [RK312x_PGAR_AGC_CTL1] = 0x0000,
171 [RK312x_PGAR_AGC_CTL2] = 0x0046,
172 [RK312x_PGAR_AGC_CTL3] = 0x0041,
173 [RK312x_PGAR_AGC_CTL4] = 0x002c,
174 [RK312x_PGAR_ASR_CTL] = 0x0000,
175 [RK312x_PGAR_AGC_MAX_H] = 0x0026,
176 [RK312x_PGAR_AGC_MAX_L] = 0x0040,
177 [RK312x_PGAR_AGC_MIN_H] = 0x0036,
178 [RK312x_PGAR_AGC_MIN_L] = 0x0020,
179 [RK312x_PGAR_AGC_CTL5] = 0x0038,
182 static struct rk312x_init_bit_typ rk312x_init_bit_list[] = {
183 {RK312x_HPOUT_CTL, RK312x_HPOUTL_EN,
184 RK312x_HPOUTL_WORK, RK312x_HPVREF_EN},
185 {RK312x_HPOUT_CTL, RK312x_HPOUTR_EN,
186 RK312x_HPOUTR_WORK, RK312x_HPVREF_WORK},
187 {RK312x_HPMIX_CTL, RK312x_HPMIXR_EN,
188 RK312x_HPMIXR_WORK2, RK312x_HPMIXR_WORK1},
189 {RK312x_HPMIX_CTL, RK312x_HPMIXL_EN,
190 RK312x_HPMIXL_WORK2, RK312x_HPMIXL_WORK1},
192 #define RK312x_INIT_BIT_LIST_LEN ARRAY_SIZE(rk312x_init_bit_list)
194 static int rk312x_init_bit_register(unsigned int reg, int i)
196 for (; i < RK312x_INIT_BIT_LIST_LEN; i++) {
197 if (rk312x_init_bit_list[i].reg == reg)
205 rk312x_codec_read(struct snd_soc_codec *codec,
208 rk312x_write_reg_cache(struct snd_soc_codec *codec,
213 rk312x_set_init_value(struct snd_soc_codec *codec,
214 unsigned int reg, unsigned int value)
216 unsigned int read_value, power_bit, set_bit2, set_bit1;
220 /* read codec init register */
221 i = rk312x_init_bit_register(reg, 0);
223 /* set codec init bit
224 widget init bit should be setted 0 after widget power up or unmute,
225 and should be setted 1 after widget power down or mute.
228 read_value = rk312x_codec_read(codec, reg);
230 power_bit = rk312x_init_bit_list[i].power_bit;
231 set_bit2 = rk312x_init_bit_list[i].init2_bit;
232 set_bit1 = rk312x_init_bit_list[i].init1_bit;
234 if ((read_value & power_bit) != (value & power_bit)) {
235 if (value & power_bit) {
236 tmp = value | set_bit2 | set_bit1;
237 writel(value, rk312x_priv->regbase+reg);
238 writel(tmp, rk312x_priv->regbase+reg);
241 tmp = value & (~set_bit2) & (~set_bit1);
242 writel(tmp, rk312x_priv->regbase+reg);
243 writel(value, rk312x_priv->regbase+reg);
247 if (read_value != value)
248 writel(value, rk312x_priv->regbase+reg);
251 i = rk312x_init_bit_register(reg, ++i);
253 rk312x_write_reg_cache(codec, reg, value);
262 static int rk312x_volatile_register(struct snd_soc_codec *codec,
273 static int rk312x_codec_register(struct snd_soc_codec *codec, unsigned int reg)
277 case RK312x_ADC_INT_CTL1:
278 case RK312x_ADC_INT_CTL2:
279 case RK312x_DAC_INT_CTL1:
280 case RK312x_DAC_INT_CTL2:
281 case RK312x_DAC_INT_CTL3:
282 case RK312x_ADC_MIC_CTL:
284 case RK312x_ALC_MUNIN_CTL:
285 case RK312x_BSTL_ALCL_CTL:
286 case RK312x_ALCR_GAIN_CTL:
287 case RK312x_ADC_ENABLE:
289 case RK312x_DAC_ENABLE:
290 case RK312x_HPMIX_CTL:
291 case RK312x_HPMIX_S_SELECT:
292 case RK312x_HPOUT_CTL:
293 case RK312x_HPOUTL_GAIN:
294 case RK312x_HPOUTR_GAIN:
295 case RK312x_SELECT_CURRENT:
296 case RK312x_PGAL_AGC_CTL1:
297 case RK312x_PGAL_AGC_CTL2:
298 case RK312x_PGAL_AGC_CTL3:
299 case RK312x_PGAL_AGC_CTL4:
300 case RK312x_PGAL_ASR_CTL:
301 case RK312x_PGAL_AGC_MAX_H:
302 case RK312x_PGAL_AGC_MAX_L:
303 case RK312x_PGAL_AGC_MIN_H:
304 case RK312x_PGAL_AGC_MIN_L:
305 case RK312x_PGAL_AGC_CTL5:
306 case RK312x_PGAR_AGC_CTL1:
307 case RK312x_PGAR_AGC_CTL2:
308 case RK312x_PGAR_AGC_CTL3:
309 case RK312x_PGAR_AGC_CTL4:
310 case RK312x_PGAR_ASR_CTL:
311 case RK312x_PGAR_AGC_MAX_H:
312 case RK312x_PGAR_AGC_MAX_L:
313 case RK312x_PGAR_AGC_MIN_H:
314 case RK312x_PGAR_AGC_MIN_L:
315 case RK312x_PGAR_AGC_CTL5:
323 static inline unsigned int rk312x_read_reg_cache(struct snd_soc_codec *codec,
326 unsigned int *cache = codec->reg_cache;
328 if (rk312x_codec_register(codec, reg))
331 DBG("%s : reg error!\n", __func__);
336 static inline void rk312x_write_reg_cache(struct snd_soc_codec *codec,
340 unsigned int *cache = codec->reg_cache;
342 if (rk312x_codec_register(codec, reg)) {
347 DBG("%s : reg error!\n", __func__);
350 static unsigned int rk312x_codec_read(struct snd_soc_codec *codec,
356 DBG("%s : rk312x is NULL\n", __func__);
360 if (!rk312x_codec_register(codec, reg)) {
361 DBG("%s : reg error!\n", __func__);
365 if (rk312x_volatile_register(codec, reg) == 0)
366 value = rk312x_read_reg_cache(codec, reg);
368 value = readl_relaxed(rk312x_priv->regbase+reg);
370 value = readl_relaxed(rk312x_priv->regbase+reg);
371 dbg_codec(2, "%s : reg = 0x%x, val= 0x%x\n", __func__,
377 static int rk312x_codec_write(struct snd_soc_codec *codec,
378 unsigned int reg, unsigned int value)
383 DBG("%s : rk312x is NULL\n", __func__);
385 } else if (!rk312x_codec_register(codec, reg)) {
386 DBG("%s : reg error!\n", __func__);
389 new_value = rk312x_set_init_value(codec, reg, value);
391 if (new_value == -1) {
392 writel(value, rk312x_priv->regbase+reg);
393 rk312x_write_reg_cache(codec, reg, value);
395 rk312x_codec_read(codec, reg);
399 static int rk312x_codec_ctl_gpio(int gpio, int level)
403 DBG("%s : rk312x is NULL\n", __func__);
407 if ((gpio & CODEC_SET_SPK) && rk312x_priv
408 && rk312x_priv->spk_ctl_gpio != INVALID_GPIO) {
409 gpio_set_value(rk312x_priv->spk_ctl_gpio, level);
410 DBG(KERN_INFO"%s set spk clt %d\n", __func__, level);
411 msleep(rk312x_priv->spk_mute_delay);
414 if ((gpio & CODEC_SET_HP) && rk312x_priv
415 && rk312x_priv->hp_ctl_gpio != INVALID_GPIO) {
416 gpio_set_value(rk312x_priv->hp_ctl_gpio, level);
417 DBG(KERN_INFO"%s set hp clt %d\n", __func__, level);
418 msleep(rk312x_priv->hp_mute_delay);
425 static int switch_to_spk(int enable)
428 DBG(KERN_ERR"%s : rk312x is NULL\n", __func__);
432 if (rk312x_priv->spk_hp_switch_gpio != INVALID_GPIO) {
433 gpio_set_value(rk312x_priv->spk_hp_switch_gpio, rk312x_priv->spk_io);
434 DBG(KERN_INFO"%s switch to spk\n", __func__);
435 msleep(rk312x_priv->spk_mute_delay);
438 if (rk312x_priv->spk_hp_switch_gpio != INVALID_GPIO) {
439 gpio_set_value(rk312x_priv->spk_hp_switch_gpio, !rk312x_priv->spk_io);
440 DBG(KERN_INFO"%s switch to hp\n", __func__);
441 msleep(rk312x_priv->hp_mute_delay);
447 static int rk312x_hw_write(const struct i2c_client *client,
448 const char *buf, int count)
450 unsigned int reg, value;
452 if (!rk312x_priv || !rk312x_priv->codec) {
453 DBG("%s : rk312x_priv or rk312x_priv->codec is NULL\n",
458 reg = (unsigned int)buf[0];
459 value = (buf[1] & 0xff00) | (0x00ff & buf[2]);
460 writel(value, rk312x_priv->regbase+reg);
462 DBG("%s : i2c len error\n", __func__);
468 static int rk312x_reset(struct snd_soc_codec *codec)
470 writel(0x00, rk312x_priv->regbase+RK312x_RESET);
472 writel(0x43, rk312x_priv->regbase+RK312x_RESET);
475 memcpy(codec->reg_cache, rk312x_reg_defaults,
476 sizeof(rk312x_reg_defaults));
481 static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -3900, 150, 0);
482 static const DECLARE_TLV_DB_SCALE(pga_vol_tlv, -1800, 150, 0);
483 static const DECLARE_TLV_DB_SCALE(bst_vol_tlv, 0, 2000, 0);
484 static const DECLARE_TLV_DB_SCALE(pga_agc_max_vol_tlv, -1350, 600, 0);
485 static const DECLARE_TLV_DB_SCALE(pga_agc_min_vol_tlv, -1800, 600, 0);
487 static const char *const rk312x_input_mode[] = {
488 "Differential", "Single-Ended"};
490 static const char *const rk312x_micbias_ratio[] = {
491 "1.0 Vref", "1.1 Vref",
492 "1.2 Vref", "1.3 Vref",
493 "1.4 Vref", "1.5 Vref",
494 "1.6 Vref", "1.7 Vref",};
496 static const char *const rk312x_dis_en_sel[] = {"Disable", "Enable"};
498 static const char *const rk312x_pga_agc_way[] = {"Normal", "Jack"};
500 static const char *const rk312x_agc_backup_way[] = {
501 "Normal", "Jack1", "Jack2", "Jack3"};
503 static const char *const rk312x_pga_agc_hold_time[] = {
504 "0ms", "2ms", "4ms", "8ms",
505 "16ms", "32ms", "64ms",
506 "128ms", "256ms", "512ms", "1s"};
508 static const char *const rk312x_pga_agc_ramp_up_time[] = {
509 "Normal:500us Jack:125us",
510 "Normal:1ms Jack:250us",
511 "Normal:2ms Jack:500us",
512 "Normal:4ms Jack:1ms",
513 "Normal:8ms Jack:2ms",
514 "Normal:16ms Jack:4ms",
515 "Normal:32ms Jack:8ms",
516 "Normal:64ms Jack:16ms",
517 "Normal:128ms Jack:32ms",
518 "Normal:256ms Jack:64ms",
519 "Normal:512ms Jack:128ms"};
521 static const char *const rk312x_pga_agc_ramp_down_time[] = {
522 "Normal:125us Jack:32us",
523 "Normal:250us Jack:64us",
524 "Normal:500us Jack:125us",
525 "Normal:1ms Jack:250us",
526 "Normal:2ms Jack:500us",
527 "Normal:4ms Jack:1ms",
528 "Normal:8ms Jack:2ms",
529 "Normal:16ms Jack:4ms",
530 "Normal:32ms Jack:8ms",
531 "Normal:64ms Jack:16ms",
532 "Normal:128ms Jack:32ms"};
534 static const char *const rk312x_pga_agc_mode[] = {"Normal", "Limiter"};
536 static const char *const rk312x_pga_agc_recovery_mode[] = {
537 "Right Now", "After AGC to Limiter"};
539 static const char *const rk312x_pga_agc_noise_gate_threhold[] = {
540 "-39dB", "-45dB", "-51dB",
541 "-57dB", "-63dB", "-69dB", "-75dB", "-81dB"};
543 static const char *const rk312x_pga_agc_update_gain[] = {
544 "Right Now", "After 1st Zero Cross"};
546 static const char *const rk312x_pga_agc_approximate_sample_rate[] = {
547 "96KHZ", "48KHz", "441KHZ", "32KHz",
548 "24KHz", "16KHz", "12KHz", "8KHz"};
550 static const struct soc_enum rk312x_bst_enum[] = {
551 SOC_ENUM_SINGLE(RK312x_BSTL_ALCL_CTL,
552 RK312x_BSTL_MODE_SFT, 2,
557 static const struct soc_enum rk312x_micbias_enum[] = {
558 SOC_ENUM_SINGLE(RK312x_ADC_MIC_CTL,
559 RK312x_MICBIAS_VOL_SHT, 8,
560 rk312x_micbias_ratio),
563 static const struct soc_enum rk312x_agcl_enum[] = {
564 SOC_ENUM_SINGLE(RK312x_PGAL_AGC_CTL1,
565 RK312x_PGA_AGC_BK_WAY_SFT, 4,
566 rk312x_agc_backup_way),/*0*/
567 SOC_ENUM_SINGLE(RK312x_PGAL_AGC_CTL1,
568 RK312x_PGA_AGC_WAY_SFT, 2,
569 rk312x_pga_agc_way),/*1*/
570 SOC_ENUM_SINGLE(RK312x_PGAL_AGC_CTL1,
571 RK312x_PGA_AGC_HOLD_T_SFT, 11,
572 rk312x_pga_agc_hold_time),/*2*/
573 SOC_ENUM_SINGLE(RK312x_PGAL_AGC_CTL2,
574 RK312x_PGA_AGC_GRU_T_SFT, 11,
575 rk312x_pga_agc_ramp_up_time),/*3*/
576 SOC_ENUM_SINGLE(RK312x_PGAL_AGC_CTL2,
577 RK312x_PGA_AGC_GRD_T_SFT, 11,
578 rk312x_pga_agc_ramp_down_time),/*4*/
579 SOC_ENUM_SINGLE(RK312x_PGAL_AGC_CTL3,
580 RK312x_PGA_AGC_MODE_SFT, 2,
581 rk312x_pga_agc_mode),/*5*/
582 SOC_ENUM_SINGLE(RK312x_PGAL_AGC_CTL3,
583 RK312x_PGA_AGC_ZO_SFT, 2,
584 rk312x_dis_en_sel),/*6*/
585 SOC_ENUM_SINGLE(RK312x_PGAL_AGC_CTL3,
586 RK312x_PGA_AGC_REC_MODE_SFT, 2,
587 rk312x_pga_agc_recovery_mode),/*7*/
588 SOC_ENUM_SINGLE(RK312x_PGAL_AGC_CTL3,
589 RK312x_PGA_AGC_FAST_D_SFT, 2,
590 rk312x_dis_en_sel),/*8*/
591 SOC_ENUM_SINGLE(RK312x_PGAL_AGC_CTL3,
592 RK312x_PGA_AGC_NG_SFT, 2,
593 rk312x_dis_en_sel),/*9*/
594 SOC_ENUM_SINGLE(RK312x_PGAL_AGC_CTL3,
595 RK312x_PGA_AGC_NG_THR_SFT, 8,
596 rk312x_pga_agc_noise_gate_threhold),/*10*/
597 SOC_ENUM_SINGLE(RK312x_PGAL_AGC_CTL4,
598 RK312x_PGA_AGC_ZO_MODE_SFT, 2,
599 rk312x_pga_agc_update_gain),/*11*/
600 SOC_ENUM_SINGLE(RK312x_PGAL_ASR_CTL,
601 RK312x_PGA_SLOW_CLK_SFT, 2,
602 rk312x_dis_en_sel),/*12*/
603 SOC_ENUM_SINGLE(RK312x_PGAL_ASR_CTL,
604 RK312x_PGA_ASR_SFT, 8,
605 rk312x_pga_agc_approximate_sample_rate),/*13*/
606 SOC_ENUM_SINGLE(RK312x_PGAL_AGC_CTL5,
607 RK312x_PGA_AGC_SFT, 2,
608 rk312x_dis_en_sel),/*14*/
611 static const struct soc_enum rk312x_agcr_enum[] = {
612 SOC_ENUM_SINGLE(RK312x_PGAR_AGC_CTL1,
613 RK312x_PGA_AGC_BK_WAY_SFT, 4,
614 rk312x_agc_backup_way),/*0*/
615 SOC_ENUM_SINGLE(RK312x_PGAR_AGC_CTL1,
616 RK312x_PGA_AGC_WAY_SFT, 2,
617 rk312x_pga_agc_way),/*1*/
618 SOC_ENUM_SINGLE(RK312x_PGAR_AGC_CTL1,
619 RK312x_PGA_AGC_HOLD_T_SFT, 11,
620 rk312x_pga_agc_hold_time),/*2*/
621 SOC_ENUM_SINGLE(RK312x_PGAR_AGC_CTL2,
622 RK312x_PGA_AGC_GRU_T_SFT, 11,
623 rk312x_pga_agc_ramp_up_time),/*3*/
624 SOC_ENUM_SINGLE(RK312x_PGAR_AGC_CTL2,
625 RK312x_PGA_AGC_GRD_T_SFT, 11,
626 rk312x_pga_agc_ramp_down_time),/*4*/
627 SOC_ENUM_SINGLE(RK312x_PGAR_AGC_CTL3,
628 RK312x_PGA_AGC_MODE_SFT, 2,
629 rk312x_pga_agc_mode),/*5*/
630 SOC_ENUM_SINGLE(RK312x_PGAR_AGC_CTL3,
631 RK312x_PGA_AGC_ZO_SFT, 2,
632 rk312x_dis_en_sel),/*6*/
633 SOC_ENUM_SINGLE(RK312x_PGAR_AGC_CTL3,
634 RK312x_PGA_AGC_REC_MODE_SFT, 2,
635 rk312x_pga_agc_recovery_mode),/*7*/
636 SOC_ENUM_SINGLE(RK312x_PGAR_AGC_CTL3,
637 RK312x_PGA_AGC_FAST_D_SFT, 2,
638 rk312x_dis_en_sel),/*8*/
639 SOC_ENUM_SINGLE(RK312x_PGAR_AGC_CTL3,
640 RK312x_PGA_AGC_NG_SFT, 2, rk312x_dis_en_sel),/*9*/
641 SOC_ENUM_SINGLE(RK312x_PGAR_AGC_CTL3,
642 RK312x_PGA_AGC_NG_THR_SFT, 8,
643 rk312x_pga_agc_noise_gate_threhold),/*10*/
644 SOC_ENUM_SINGLE(RK312x_PGAR_AGC_CTL4,
645 RK312x_PGA_AGC_ZO_MODE_SFT, 2,
646 rk312x_pga_agc_update_gain),/*11*/
647 SOC_ENUM_SINGLE(RK312x_PGAR_ASR_CTL,
648 RK312x_PGA_SLOW_CLK_SFT, 2,
649 rk312x_dis_en_sel),/*12*/
650 SOC_ENUM_SINGLE(RK312x_PGAR_ASR_CTL,
651 RK312x_PGA_ASR_SFT, 8,
652 rk312x_pga_agc_approximate_sample_rate),/*13*/
653 SOC_ENUM_SINGLE(RK312x_PGAR_AGC_CTL5,
654 RK312x_PGA_AGC_SFT, 2,
655 rk312x_dis_en_sel),/*14*/
658 static const struct snd_kcontrol_new rk312x_snd_controls[] = {
659 /* Add for set voice volume */
660 SOC_DOUBLE_R_TLV("Speaker Playback Volume", RK312x_HPOUTL_GAIN,
661 RK312x_HPOUTR_GAIN, RK312x_HPOUT_GAIN_SFT,
663 SOC_DOUBLE("Speaker Playback Switch", RK312x_HPOUT_CTL,
664 RK312x_HPOUTL_MUTE_SHT, RK312x_HPOUTR_MUTE_SHT, 1, 0),
665 SOC_DOUBLE_R_TLV("Headphone Playback Volume", RK312x_HPOUTL_GAIN,
666 RK312x_HPOUTR_GAIN, RK312x_HPOUT_GAIN_SFT,
668 SOC_DOUBLE("Headphone Playback Switch", RK312x_HPOUT_CTL,
669 RK312x_HPOUTL_MUTE_SHT, RK312x_HPOUTR_MUTE_SHT, 1, 0),
670 SOC_DOUBLE_R_TLV("Earpiece Playback Volume", RK312x_HPOUTL_GAIN,
671 RK312x_HPOUTR_GAIN, RK312x_HPOUT_GAIN_SFT,
673 SOC_DOUBLE("Earpiece Playback Switch", RK312x_HPOUT_CTL,
674 RK312x_HPOUTL_MUTE_SHT, RK312x_HPOUTR_MUTE_SHT, 1, 0),
677 /* Add for set capture mute */
678 SOC_SINGLE_TLV("Main Mic Capture Volume", RK312x_BST_CTL,
679 RK312x_BSTL_GAIN_SHT, 1, 0, bst_vol_tlv),
680 SOC_SINGLE("Main Mic Capture Switch", RK312x_BST_CTL,
681 RK312x_BSTL_MUTE_SHT, 1, 0),
682 SOC_SINGLE_TLV("Headset Mic Capture Volume", RK312x_BST_CTL,
683 RK312x_BSTR_GAIN_SHT, 1, 0, bst_vol_tlv),
684 SOC_SINGLE("Headset Mic Capture Switch", RK312x_BST_CTL,
685 RK312x_BSTR_MUTE_SHT, 1, 0),
687 SOC_SINGLE("ALCL Switch", RK312x_ALC_MUNIN_CTL,
688 RK312x_ALCL_MUTE_SHT, 1, 0),
689 SOC_SINGLE_TLV("ALCL Capture Volume", RK312x_BSTL_ALCL_CTL,
690 RK312x_ALCL_GAIN_SHT, 31, 0, pga_vol_tlv),
691 SOC_SINGLE("ALCR Switch", RK312x_ALC_MUNIN_CTL,
692 RK312x_ALCR_MUTE_SHT, 1, 0),
693 SOC_SINGLE_TLV("ALCR Capture Volume", RK312x_ALCR_GAIN_CTL,
694 RK312x_ALCL_GAIN_SHT, 31, 0, pga_vol_tlv),
696 SOC_ENUM("BST_L Mode", rk312x_bst_enum[0]),
698 SOC_ENUM("Micbias Voltage", rk312x_micbias_enum[0]),
699 SOC_ENUM("PGAL AGC Back Way", rk312x_agcl_enum[0]),
700 SOC_ENUM("PGAL AGC Way", rk312x_agcl_enum[1]),
701 SOC_ENUM("PGAL AGC Hold Time", rk312x_agcl_enum[2]),
702 SOC_ENUM("PGAL AGC Ramp Up Time", rk312x_agcl_enum[3]),
703 SOC_ENUM("PGAL AGC Ramp Down Time", rk312x_agcl_enum[4]),
704 SOC_ENUM("PGAL AGC Mode", rk312x_agcl_enum[5]),
705 SOC_ENUM("PGAL AGC Gain Update Zero Enable", rk312x_agcl_enum[6]),
706 SOC_ENUM("PGAL AGC Gain Recovery LPGA VOL", rk312x_agcl_enum[7]),
707 SOC_ENUM("PGAL AGC Fast Decrement Enable", rk312x_agcl_enum[8]),
708 SOC_ENUM("PGAL AGC Noise Gate Enable", rk312x_agcl_enum[9]),
709 SOC_ENUM("PGAL AGC Noise Gate Threhold", rk312x_agcl_enum[10]),
710 SOC_ENUM("PGAL AGC Upate Gain", rk312x_agcl_enum[11]),
711 SOC_ENUM("PGAL AGC Slow Clock Enable", rk312x_agcl_enum[12]),
712 SOC_ENUM("PGAL AGC Approximate Sample Rate", rk312x_agcl_enum[13]),
713 SOC_ENUM("PGAL AGC Enable", rk312x_agcl_enum[14]),
715 SOC_SINGLE_TLV("PGAL AGC Volume", RK312x_PGAL_AGC_CTL4,
716 RK312x_PGA_AGC_VOL_SFT, 31, 0, pga_vol_tlv),
718 SOC_SINGLE("PGAL AGC Max Level High 8 Bits",
719 RK312x_PGAL_AGC_MAX_H,
721 SOC_SINGLE("PGAL AGC Max Level Low 8 Bits",
722 RK312x_PGAL_AGC_MAX_L,
724 SOC_SINGLE("PGAL AGC Min Level High 8 Bits",
725 RK312x_PGAL_AGC_MIN_H,
727 SOC_SINGLE("PGAL AGC Min Level Low 8 Bits",
728 RK312x_PGAL_AGC_MIN_L,
731 SOC_SINGLE_TLV("PGAL AGC Max Gain",
732 RK312x_PGAL_AGC_CTL5,
733 RK312x_PGA_AGC_MAX_G_SFT, 7, 0,
734 pga_agc_max_vol_tlv),
735 /* AGC enable and 0x0a bit 5 is 1 */
736 SOC_SINGLE_TLV("PGAL AGC Min Gain", RK312x_PGAL_AGC_CTL5,
737 RK312x_PGA_AGC_MIN_G_SFT, 7, 0, pga_agc_min_vol_tlv),
738 /* AGC enable and 0x0a bit 5 is 1 */
740 SOC_ENUM("PGAR AGC Back Way", rk312x_agcr_enum[0]),
741 SOC_ENUM("PGAR AGC Way", rk312x_agcr_enum[1]),
742 SOC_ENUM("PGAR AGC Hold Time", rk312x_agcr_enum[2]),
743 SOC_ENUM("PGAR AGC Ramp Up Time", rk312x_agcr_enum[3]),
744 SOC_ENUM("PGAR AGC Ramp Down Time", rk312x_agcr_enum[4]),
745 SOC_ENUM("PGAR AGC Mode", rk312x_agcr_enum[5]),
746 SOC_ENUM("PGAR AGC Gain Update Zero Enable", rk312x_agcr_enum[6]),
747 SOC_ENUM("PGAR AGC Gain Recovery LPGA VOL", rk312x_agcr_enum[7]),
748 SOC_ENUM("PGAR AGC Fast Decrement Enable", rk312x_agcr_enum[8]),
749 SOC_ENUM("PGAR AGC Noise Gate Enable", rk312x_agcr_enum[9]),
750 SOC_ENUM("PGAR AGC Noise Gate Threhold", rk312x_agcr_enum[10]),
751 SOC_ENUM("PGAR AGC Upate Gain", rk312x_agcr_enum[11]),
752 SOC_ENUM("PGAR AGC Slow Clock Enable", rk312x_agcr_enum[12]),
753 SOC_ENUM("PGAR AGC Approximate Sample Rate", rk312x_agcr_enum[13]),
754 SOC_ENUM("PGAR AGC Enable", rk312x_agcr_enum[14]),
755 /* AGC disable and 0x0a bit 4 is 1 */
756 SOC_SINGLE_TLV("PGAR AGC Volume", RK312x_PGAR_AGC_CTL4,
757 RK312x_PGA_AGC_VOL_SFT, 31, 0, pga_vol_tlv),
759 SOC_SINGLE("PGAR AGC Max Level High 8 Bits", RK312x_PGAR_AGC_MAX_H,
761 SOC_SINGLE("PGAR AGC Max Level Low 8 Bits", RK312x_PGAR_AGC_MAX_L,
763 SOC_SINGLE("PGAR AGC Min Level High 8 Bits", RK312x_PGAR_AGC_MIN_H,
765 SOC_SINGLE("PGAR AGC Min Level Low 8 Bits", RK312x_PGAR_AGC_MIN_L,
767 /* AGC enable and 0x06 bit 4 is 1 */
768 SOC_SINGLE_TLV("PGAR AGC Max Gain", RK312x_PGAR_AGC_CTL5,
769 RK312x_PGA_AGC_MAX_G_SFT, 7, 0, pga_agc_max_vol_tlv),
770 /* AGC enable and 0x06 bit 4 is 1 */
771 SOC_SINGLE_TLV("PGAR AGC Min Gain", RK312x_PGAR_AGC_CTL5,
772 RK312x_PGA_AGC_MIN_G_SFT, 7, 0, pga_agc_min_vol_tlv),
776 /* For tiny alsa playback/capture/voice call path */
777 static const char *const rk312x_playback_path_mode[] = {
778 "OFF", "RCV", "SPK", "HP", "HP_NO_MIC",
779 "BT", "SPK_HP", "RING_SPK", "RING_HP",
780 "RING_HP_NO_MIC", "RING_SPK_HP"};
782 static const char *const rk312x_capture_path_mode[] = {
783 "MIC OFF", "Main Mic", "Hands Free Mic", "BT Sco Mic"};
785 static const char *const rk312x_voice_call_path_mode[] = {
786 "OFF", "RCV", "SPK", "HP", "HP_NO_MIC", "BT"};
789 static const SOC_ENUM_SINGLE_DECL(rk312x_playback_path_type, 0, 0,
790 rk312x_playback_path_mode);
791 static const SOC_ENUM_SINGLE_DECL(rk312x_capture_path_type, 0, 0,
792 rk312x_capture_path_mode);
793 static const SOC_ENUM_SINGLE_DECL(rk312x_voice_call_path_type, 0, 0,
794 rk312x_voice_call_path_mode);
797 /* static int rk312x_codec_power_up(int type); */
798 static int rk312x_codec_power_down(int type);
800 static int rk312x_playback_path_get(struct snd_kcontrol *kcontrol,
801 struct snd_ctl_elem_value *ucontrol)
804 DBG("%s : rk312x_priv is NULL\n", __func__);
808 DBG("%s : playback_path = %ld\n",
809 __func__, ucontrol->value.integer.value[0]);
811 ucontrol->value.integer.value[0] = rk312x_priv->playback_path;
816 static int rk312x_playback_path_put(struct snd_kcontrol *kcontrol,
817 struct snd_ctl_elem_value *ucontrol)
819 /* struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); */
823 DBG("%s : rk312x_priv is NULL\n", __func__);
827 if (rk312x_priv->playback_path ==
828 ucontrol->value.integer.value[0]) {
829 DBG("%s : playback_path is not changed!\n", __func__);
833 pre_path = rk312x_priv->playback_path;
834 rk312x_priv->playback_path = ucontrol->value.integer.value[0];
836 DBG("%s : set playback_path = %ld\n", __func__,
837 rk312x_priv->playback_path);
839 switch (rk312x_priv->playback_path) {
842 rk312x_codec_power_down(RK312x_CODEC_PLAYBACK);
848 if (pre_path == OFF) {
849 rk312x_codec_power_up(RK312x_CODEC_PLAYBACK);
850 snd_soc_write(rk312x_priv->codec, 0xb4, rk312x_priv->spk_volume);
851 snd_soc_write(rk312x_priv->codec, 0xb8, rk312x_priv->spk_volume);
858 if (pre_path == OFF) {
859 rk312x_codec_power_up(RK312x_CODEC_PLAYBACK);
860 snd_soc_write(rk312x_priv->codec, 0xb4, rk312x_priv->hp_volume);
861 snd_soc_write(rk312x_priv->codec, 0xb8, rk312x_priv->hp_volume);
868 if (pre_path == OFF) {
869 rk312x_codec_power_up(RK312x_CODEC_PLAYBACK);
870 snd_soc_write(rk312x_priv->codec, 0xb4, rk312x_priv->spk_volume);
871 snd_soc_write(rk312x_priv->codec, 0xb8, rk312x_priv->spk_volume);
881 static int rk312x_capture_path_get(struct snd_kcontrol *kcontrol,
882 struct snd_ctl_elem_value *ucontrol)
885 DBG("%s : rk312x_priv is NULL\n", __func__);
889 DBG("%s : capture_path = %ld\n", __func__,
890 ucontrol->value.integer.value[0]);
892 ucontrol->value.integer.value[0] = rk312x_priv->capture_path;
897 static int rk312x_capture_path_put(struct snd_kcontrol *kcontrol,
898 struct snd_ctl_elem_value *ucontrol)
900 /* struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); */
904 DBG("%s : rk312x_priv is NULL\n", __func__);
908 if (rk312x_priv->capture_path == ucontrol->value.integer.value[0])
909 DBG("%s : capture_path is not changed!\n", __func__);
911 pre_path = rk312x_priv->capture_path;
912 rk312x_priv->capture_path = ucontrol->value.integer.value[0];
914 DBG("%s : set capture_path = %ld\n", __func__,
915 rk312x_priv->capture_path);
917 switch (rk312x_priv->capture_path) {
919 if (pre_path != MIC_OFF)
920 rk312x_codec_power_down(RK312x_CODEC_CAPTURE);
923 if (pre_path == MIC_OFF) {
924 rk312x_codec_power_up(RK312x_CODEC_CAPTURE);
925 snd_soc_write(rk312x_priv->codec, 0x94, 0x20|rk312x_priv->capture_volume);
926 snd_soc_write(rk312x_priv->codec, 0x98, rk312x_priv->capture_volume);
930 if (pre_path == MIC_OFF) {
931 rk312x_codec_power_up(RK312x_CODEC_CAPTURE);
932 snd_soc_write(rk312x_priv->codec, 0x94, 0x20|rk312x_priv->capture_volume);
933 snd_soc_write(rk312x_priv->codec, 0x98, rk312x_priv->capture_volume);
946 static int rk312x_voice_call_path_get(struct snd_kcontrol *kcontrol,
947 struct snd_ctl_elem_value *ucontrol)
950 DBG("%s : rk312x_priv is NULL\n", __func__);
954 DBG("%s : playback_path = %ld\n", __func__,
955 ucontrol->value.integer.value[0]);
957 ucontrol->value.integer.value[0] = rk312x_priv->voice_call_path;
962 static int rk312x_voice_call_path_put(struct snd_kcontrol *kcontrol,
963 struct snd_ctl_elem_value *ucontrol)
965 /* struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); */
969 DBG("%s : rk312x_priv is NULL\n", __func__);
973 if (rk312x_priv->voice_call_path == ucontrol->value.integer.value[0])
974 DBG("%s : playback_path is not changed!\n", __func__);
976 pre_path = rk312x_priv->voice_call_path;
977 rk312x_priv->voice_call_path = ucontrol->value.integer.value[0];
979 DBG("%s : set playback_path = %ld\n", __func__,
980 rk312x_priv->voice_call_path);
982 /* open playback route for incall route and keytone */
983 if (pre_path == OFF) {
984 if (rk312x_priv->playback_path != OFF) {
985 /* mute output for incall route pop nosie */
988 rk312x_codec_power_up(RK312x_CODEC_PLAYBACK);
989 snd_soc_write(rk312x_priv->codec, 0xb4, rk312x_priv->spk_volume);
990 snd_soc_write(rk312x_priv->codec, 0xb8, rk312x_priv->spk_volume);
994 switch (rk312x_priv->voice_call_path) {
996 if (pre_path != MIC_OFF)
997 rk312x_codec_power_down(RK312x_CODEC_CAPTURE);
1002 /* open incall route */
1003 if (pre_path == OFF || pre_path == RCV || pre_path == BT)
1004 rk312x_codec_power_up(RK312x_CODEC_INCALL);
1009 /* open incall route */
1010 if (pre_path == OFF || pre_path == RCV || pre_path == BT)
1011 rk312x_codec_power_up(RK312x_CODEC_INCALL);
1022 static const struct snd_kcontrol_new rk312x_snd_path_controls[] = {
1023 SOC_ENUM_EXT("Playback Path", rk312x_playback_path_type,
1024 rk312x_playback_path_get, rk312x_playback_path_put),
1025 SOC_ENUM_EXT("Capture MIC Path", rk312x_capture_path_type,
1026 rk312x_capture_path_get, rk312x_capture_path_put),
1027 SOC_ENUM_EXT("Voice Call Path", rk312x_voice_call_path_type,
1028 rk312x_voice_call_path_get, rk312x_voice_call_path_put),
1031 static int rk312x_dacl_event(struct snd_soc_dapm_widget *w,
1032 struct snd_kcontrol *kcontrol,
1035 struct snd_soc_codec *codec = w->codec;
1038 case SND_SOC_DAPM_POST_PMU:
1039 snd_soc_update_bits(codec, RK312x_DAC_ENABLE,
1040 RK312x_DACL_WORK, 0);
1041 snd_soc_update_bits(codec, RK312x_DAC_ENABLE,
1042 RK312x_DACL_EN | RK312x_DACL_CLK_EN,
1043 RK312x_DACL_EN | RK312x_DACL_CLK_EN);
1044 snd_soc_update_bits(codec, RK312x_DAC_ENABLE,
1045 RK312x_DACL_WORK, RK312x_DACL_WORK);
1048 case SND_SOC_DAPM_POST_PMD:
1049 snd_soc_update_bits(codec, RK312x_DAC_ENABLE,
1051 | RK312x_DACL_CLK_EN, 0);
1052 snd_soc_update_bits(codec, RK312x_DAC_ENABLE,
1053 RK312x_DACL_WORK, 0);
1063 static int rk312x_dacr_event(struct snd_soc_dapm_widget *w,
1064 struct snd_kcontrol *kcontrol,
1067 struct snd_soc_codec *codec = w->codec;
1070 case SND_SOC_DAPM_POST_PMU:
1071 snd_soc_update_bits(codec, RK312x_DAC_ENABLE,
1072 RK312x_DACR_WORK, 0);
1073 snd_soc_update_bits(codec, RK312x_DAC_ENABLE,
1075 | RK312x_DACR_CLK_EN,
1077 | RK312x_DACR_CLK_EN);
1078 snd_soc_update_bits(codec, RK312x_DAC_ENABLE,
1083 case SND_SOC_DAPM_POST_PMD:
1084 snd_soc_update_bits(codec, RK312x_DAC_ENABLE,
1086 | RK312x_DACR_CLK_EN, 0);
1087 snd_soc_update_bits(codec, RK312x_DAC_ENABLE,
1088 RK312x_DACR_WORK, 0);
1098 static int rk312x_adcl_event(struct snd_soc_dapm_widget *w,
1099 struct snd_kcontrol *kcontrol, int event)
1101 struct snd_soc_codec *codec = w->codec;
1104 case SND_SOC_DAPM_POST_PMU:
1105 snd_soc_update_bits(codec, RK312x_ADC_ENABLE,
1106 RK312x_ADCL_CLK_EN_SFT
1107 | RK312x_ADCL_AMP_EN_SFT,
1109 | RK312x_ADCL_AMP_EN);
1112 case SND_SOC_DAPM_POST_PMD:
1113 snd_soc_update_bits(codec, RK312x_ADC_ENABLE,
1114 RK312x_ADCL_CLK_EN_SFT
1115 | RK312x_ADCL_AMP_EN_SFT, 0);
1125 static int rk312x_adcr_event(struct snd_soc_dapm_widget *w,
1126 struct snd_kcontrol *kcontrol, int event)
1128 struct snd_soc_codec *codec = w->codec;
1131 case SND_SOC_DAPM_POST_PMU:
1132 snd_soc_update_bits(codec, RK312x_ADC_ENABLE,
1133 RK312x_ADCR_CLK_EN_SFT
1134 | RK312x_ADCR_AMP_EN_SFT,
1136 | RK312x_ADCR_AMP_EN);
1139 case SND_SOC_DAPM_POST_PMD:
1140 snd_soc_update_bits(codec, RK312x_ADC_ENABLE,
1141 RK312x_ADCR_CLK_EN_SFT
1142 | RK312x_ADCR_AMP_EN_SFT, 0);
1153 static const struct snd_kcontrol_new rk312x_hpmixl[] = {
1154 SOC_DAPM_SINGLE("ALCR Switch", RK312x_HPMIX_S_SELECT,
1155 RK312x_HPMIXL_SEL_ALCR_SFT, 1, 0),
1156 SOC_DAPM_SINGLE("ALCL Switch", RK312x_HPMIX_S_SELECT,
1157 RK312x_HPMIXL_SEL_ALCL_SFT, 1, 0),
1158 SOC_DAPM_SINGLE("DACL Switch", RK312x_HPMIX_S_SELECT,
1159 RK312x_HPMIXL_SEL_DACL_SFT, 1, 0),
1162 static const struct snd_kcontrol_new rk312x_hpmixr[] = {
1163 SOC_DAPM_SINGLE("ALCR Switch", RK312x_HPMIX_S_SELECT,
1164 RK312x_HPMIXR_SEL_ALCR_SFT, 1, 0),
1165 SOC_DAPM_SINGLE("ALCL Switch", RK312x_HPMIX_S_SELECT,
1166 RK312x_HPMIXR_SEL_ALCL_SFT, 1, 0),
1167 SOC_DAPM_SINGLE("DACR Switch", RK312x_HPMIX_S_SELECT,
1168 RK312x_HPMIXR_SEL_DACR_SFT, 1, 0),
1171 static int rk312x_hpmixl_event(struct snd_soc_dapm_widget *w,
1172 struct snd_kcontrol *kcontrol, int event)
1174 struct snd_soc_codec *codec = w->codec;
1177 case SND_SOC_DAPM_POST_PMU:
1178 snd_soc_update_bits(codec, RK312x_DAC_CTL,
1179 RK312x_ZO_DET_VOUTR_SFT,
1180 RK312x_ZO_DET_VOUTR_EN);
1181 snd_soc_update_bits(codec, RK312x_DAC_CTL,
1182 RK312x_ZO_DET_VOUTL_SFT,
1183 RK312x_ZO_DET_VOUTL_EN);
1186 case SND_SOC_DAPM_PRE_PMD:
1187 snd_soc_update_bits(codec, RK312x_DAC_CTL,
1188 RK312x_ZO_DET_VOUTR_SFT,
1189 RK312x_ZO_DET_VOUTR_DIS);
1190 snd_soc_update_bits(codec, RK312x_DAC_CTL,
1191 RK312x_ZO_DET_VOUTL_SFT,
1192 RK312x_ZO_DET_VOUTL_DIS);
1202 static int rk312x_hpmixr_event(struct snd_soc_dapm_widget *w,
1203 struct snd_kcontrol *kcontrol, int event)
1205 /* struct snd_soc_codec *codec = w->codec; */
1208 case SND_SOC_DAPM_POST_PMU:
1209 snd_soc_update_bits(codec, RK312x_HPMIX_CTL,
1210 RK312x_HPMIXR_WORK2, RK312x_HPMIXR_WORK2);
1213 case SND_SOC_DAPM_PRE_PMD:
1214 snd_soc_update_bits(codec, RK312x_HPMIX_CTL,
1215 RK312x_HPMIXR_WORK2, 0);
1227 static const char *const hpl_sel[] = {"HPMIXL", "DACL"};
1229 static const struct soc_enum hpl_sel_enum =
1230 SOC_ENUM_SINGLE(RK312x_HPMIX_S_SELECT, RK312x_HPMIXL_BYPASS_SFT,
1231 ARRAY_SIZE(hpl_sel), hpl_sel);
1233 static const struct snd_kcontrol_new hpl_sel_mux =
1234 SOC_DAPM_ENUM("HPL select Mux", hpl_sel_enum);
1236 static const char *const hpr_sel[] = {"HPMIXR", "DACR"};
1238 static const struct soc_enum hpr_sel_enum =
1239 SOC_ENUM_SINGLE(RK312x_HPMIX_S_SELECT, RK312x_HPMIXR_BYPASS_SFT,
1240 ARRAY_SIZE(hpr_sel), hpr_sel);
1242 static const struct snd_kcontrol_new hpr_sel_mux =
1243 SOC_DAPM_ENUM("HPR select Mux", hpr_sel_enum);
1246 static const char *const lnl_sel[] = {"NO", "BSTL", "LINEL", "NOUSE"};
1248 static const struct soc_enum lnl_sel_enum =
1249 SOC_ENUM_SINGLE(RK312x_ALC_MUNIN_CTL, RK312x_MUXINL_F_SHT,
1250 ARRAY_SIZE(lnl_sel), lnl_sel);
1252 static const struct snd_kcontrol_new lnl_sel_mux =
1253 SOC_DAPM_ENUM("MUXIN_L select", lnl_sel_enum);
1256 static const char *const lnr_sel[] = {"NO", "BSTR", "LINER", "NOUSE"};
1258 static const struct soc_enum lnr_sel_enum =
1259 SOC_ENUM_SINGLE(RK312x_ALC_MUNIN_CTL, RK312x_MUXINR_F_SHT,
1260 ARRAY_SIZE(lnr_sel), lnr_sel);
1262 static const struct snd_kcontrol_new lnr_sel_mux =
1263 SOC_DAPM_ENUM("MUXIN_R select", lnr_sel_enum);
1266 static const struct snd_soc_dapm_widget rk312x_dapm_widgets[] = {
1267 /* microphone bias */
1268 SND_SOC_DAPM_MICBIAS("Mic Bias", RK312x_ADC_MIC_CTL,
1269 RK312x_MICBIAS_VOL_ENABLE, 0),
1272 SND_SOC_DAPM_DAC_E("DACL", NULL, SND_SOC_NOPM,
1273 0, 0, rk312x_dacl_event,
1274 SND_SOC_DAPM_POST_PMD
1275 | SND_SOC_DAPM_POST_PMU),
1276 SND_SOC_DAPM_DAC_E("DACR", NULL, SND_SOC_NOPM,
1277 0, 0, rk312x_dacr_event,
1278 SND_SOC_DAPM_POST_PMD
1279 | SND_SOC_DAPM_POST_PMU),
1282 SND_SOC_DAPM_ADC_E("ADCL", NULL, SND_SOC_NOPM,
1283 0, 0, rk312x_adcl_event,
1284 SND_SOC_DAPM_POST_PMD
1285 | SND_SOC_DAPM_POST_PMU),
1286 SND_SOC_DAPM_ADC_E("ADCR", NULL, SND_SOC_NOPM,
1287 0, 0, rk312x_adcr_event,
1288 SND_SOC_DAPM_POST_PMD
1289 | SND_SOC_DAPM_POST_PMU),
1292 SND_SOC_DAPM_PGA("BSTL", RK312x_BST_CTL,
1293 RK312x_BSTL_PWRD_SFT, 0, NULL, 0),
1294 SND_SOC_DAPM_PGA("BSTR", RK312x_BST_CTL,
1295 RK312x_BSTR_PWRD_SFT, 0, NULL, 0),
1296 SND_SOC_DAPM_PGA("ALCL", RK312x_ALC_MUNIN_CTL,
1297 RK312x_ALCL_PWR_SHT , 0, NULL, 0),
1298 SND_SOC_DAPM_PGA("ALCR", RK312x_ALC_MUNIN_CTL,
1299 RK312x_ALCR_PWR_SHT , 0, NULL, 0),
1300 SND_SOC_DAPM_PGA("HPL", RK312x_HPOUT_CTL,
1301 RK312x_HPOUTL_PWR_SHT, 0, NULL, 0),
1302 SND_SOC_DAPM_PGA("HPR", RK312x_HPOUT_CTL,
1303 RK312x_HPOUTR_PWR_SHT, 0, NULL, 0),
1306 SND_SOC_DAPM_MIXER_E("HPMIXL", RK312x_HPMIX_CTL,
1307 RK312x_HPMIXL_SFT, 0,
1309 ARRAY_SIZE(rk312x_hpmixl),
1310 rk312x_hpmixl_event,
1311 SND_SOC_DAPM_PRE_PMD
1312 | SND_SOC_DAPM_POST_PMU),
1313 SND_SOC_DAPM_MIXER_E("HPMIXR", RK312x_HPMIX_CTL,
1314 RK312x_HPMIXR_SFT, 0,
1316 ARRAY_SIZE(rk312x_hpmixr),
1317 rk312x_hpmixr_event,
1318 SND_SOC_DAPM_PRE_PMD
1319 | SND_SOC_DAPM_POST_PMU),
1322 SND_SOC_DAPM_MUX("IN_R Mux", SND_SOC_NOPM, 0, 0,
1324 SND_SOC_DAPM_MUX("IN_L Mux", SND_SOC_NOPM, 0, 0,
1326 SND_SOC_DAPM_MUX("HPL Mux", SND_SOC_NOPM, 0, 0,
1328 SND_SOC_DAPM_MUX("HPR Mux", SND_SOC_NOPM, 0, 0,
1331 /* Audio Interface */
1332 SND_SOC_DAPM_AIF_IN("I2S DAC", "HiFi Playback", 0,
1333 SND_SOC_NOPM, 0, 0),
1334 SND_SOC_DAPM_AIF_OUT("I2S ADC", "HiFi Capture", 0,
1335 SND_SOC_NOPM, 0, 0),
1338 SND_SOC_DAPM_INPUT("LINEL"),
1339 SND_SOC_DAPM_INPUT("LINER"),
1340 SND_SOC_DAPM_INPUT("MICP"),
1341 SND_SOC_DAPM_INPUT("MICN"),
1344 SND_SOC_DAPM_OUTPUT("HPOUTL"),
1345 SND_SOC_DAPM_OUTPUT("HPOUTR"),
1349 static const struct snd_soc_dapm_route rk312x_dapm_routes[] = {
1351 {"BSTR", NULL, "MICP"},
1352 {"BSTL", NULL, "MICP"},
1353 {"BSTL", NULL, "MICN"},
1355 {"IN_R Mux", "LINER", "LINER"},
1356 {"IN_R Mux", "BSTR", "BSTR"},
1357 {"IN_L Mux", "LINEL", "LINEL"},
1358 {"IN_L Mux", "BSTL", "BSTL"},
1360 {"ALCL", NULL, "IN_L Mux"},
1361 {"ALCR", NULL, "IN_R Mux"},
1364 {"ADCR", NULL, "ALCR"},
1365 {"ADCL", NULL, "ALCL"},
1367 {"I2S ADC", NULL, "ADCR"},
1368 {"I2S ADC", NULL, "ADCL"},
1372 {"DACR", NULL, "I2S DAC"},
1373 {"DACL", NULL, "I2S DAC"},
1375 {"HPMIXR", "ALCR Switch", "ALCR"},
1376 {"HPMIXR", "ALCL Switch", "ALCL"},
1377 {"HPMIXR", "DACR Switch", "DACR"},
1379 {"HPMIXL", "ALCR Switch", "ALCR"},
1380 {"HPMIXL", "ALCL Switch", "ALCL"},
1381 {"HPMIXL", "DACL Switch", "DACL"},
1384 {"HPR Mux", "DACR", "DACR"},
1385 {"HPR Mux", "HPMIXR", "HPMIXR"},
1386 {"HPL Mux", "DACL", "DACL"},
1387 {"HPL Mux", "HPMIXL", "HPMIXL"},
1389 {"HPR", NULL, "HPR Mux"},
1390 {"HPL", NULL, "HPL Mux"},
1392 {"HPOUTR", NULL, "HPR"},
1393 {"HPOUTL", NULL, "HPL"},
1396 static int rk312x_set_bias_level(struct snd_soc_codec *codec,
1397 enum snd_soc_bias_level level)
1399 DBG("%s level=%d\n", __func__, level);
1402 case SND_SOC_BIAS_ON:
1405 case SND_SOC_BIAS_PREPARE:
1408 case SND_SOC_BIAS_STANDBY:
1409 if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) {
1410 writel(0x32, rk312x_priv->regbase+RK312x_DAC_INT_CTL3);
1411 snd_soc_update_bits(codec, RK312x_ADC_MIC_CTL,
1412 RK312x_ADC_CURRENT_ENABLE,
1413 RK312x_ADC_CURRENT_ENABLE);
1414 snd_soc_update_bits(codec, RK312x_DAC_CTL,
1418 snd_soc_update_bits(codec, RK312x_ADC_ENABLE,
1419 RK312x_ADCL_REF_VOL_EN_SFT
1420 | RK312x_ADCR_REF_VOL_EN_SFT,
1421 RK312x_ADCL_REF_VOL_EN
1422 | RK312x_ADCR_REF_VOL_EN);
1424 snd_soc_update_bits(codec, RK312x_ADC_MIC_CTL,
1425 RK312x_ADCL_ZERO_DET_EN_SFT
1426 | RK312x_ADCR_ZERO_DET_EN_SFT,
1427 RK312x_ADCL_ZERO_DET_EN
1428 | RK312x_ADCR_ZERO_DET_EN);
1430 snd_soc_update_bits(codec, RK312x_DAC_CTL,
1431 RK312x_REF_VOL_DACL_EN_SFT
1432 | RK312x_REF_VOL_DACR_EN_SFT,
1433 RK312x_REF_VOL_DACL_EN
1434 | RK312x_REF_VOL_DACR_EN);
1436 snd_soc_update_bits(codec, RK312x_DAC_ENABLE,
1437 RK312x_DACL_REF_VOL_EN_SFT
1438 | RK312x_DACR_REF_VOL_EN_SFT,
1439 RK312x_DACL_REF_VOL_EN
1440 | RK312x_DACR_REF_VOL_EN);
1444 case SND_SOC_BIAS_OFF:
1445 snd_soc_update_bits(codec, RK312x_DAC_ENABLE,
1446 RK312x_DACL_REF_VOL_EN_SFT
1447 | RK312x_DACR_REF_VOL_EN_SFT, 0);
1448 snd_soc_update_bits(codec, RK312x_DAC_CTL,
1449 RK312x_REF_VOL_DACL_EN_SFT
1450 | RK312x_REF_VOL_DACR_EN_SFT, 0);
1451 snd_soc_update_bits(codec, RK312x_ADC_MIC_CTL,
1452 RK312x_ADCL_ZERO_DET_EN_SFT
1453 | RK312x_ADCR_ZERO_DET_EN_SFT, 0);
1454 snd_soc_update_bits(codec, RK312x_ADC_ENABLE,
1455 RK312x_ADCL_REF_VOL_EN_SFT
1456 | RK312x_ADCR_REF_VOL_EN_SFT, 0);
1457 snd_soc_update_bits(codec, RK312x_ADC_MIC_CTL,
1458 RK312x_ADC_CURRENT_ENABLE, 0);
1459 snd_soc_update_bits(codec, RK312x_DAC_CTL,
1460 RK312x_CURRENT_EN, 0);
1461 writel(0x22, rk312x_priv->regbase+RK312x_DAC_INT_CTL3);
1464 codec->dapm.bias_level = level;
1469 static int rk312x_set_dai_sysclk(struct snd_soc_dai *codec_dai,
1470 int clk_id, unsigned int freq, int dir)
1472 struct rk312x_codec_priv *rk312x = rk312x_priv;
1475 DBG("%s : rk312x is NULL\n", __func__);
1479 rk312x->stereo_sysclk = freq;
1484 static int rk312x_set_dai_fmt(struct snd_soc_dai *codec_dai,
1487 struct snd_soc_codec *codec = codec_dai->codec;
1488 unsigned int adc_aif1 = 0, adc_aif2 = 0, dac_aif1 = 0, dac_aif2 = 0;
1490 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1491 case SND_SOC_DAIFMT_CBS_CFS:
1492 adc_aif2 |= RK312x_I2S_MODE_SLV;
1494 case SND_SOC_DAIFMT_CBM_CFM:
1495 adc_aif2 |= RK312x_I2S_MODE_MST;
1498 DBG("%s : set master mask failed!\n", __func__);
1502 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1503 case SND_SOC_DAIFMT_DSP_A:
1504 adc_aif1 |= RK312x_ADC_DF_PCM;
1505 dac_aif1 |= RK312x_DAC_DF_PCM;
1507 case SND_SOC_DAIFMT_DSP_B:
1509 case SND_SOC_DAIFMT_I2S:
1510 adc_aif1 |= RK312x_ADC_DF_I2S;
1511 dac_aif1 |= RK312x_DAC_DF_I2S;
1513 case SND_SOC_DAIFMT_RIGHT_J:
1514 adc_aif1 |= RK312x_ADC_DF_RJ;
1515 dac_aif1 |= RK312x_DAC_DF_RJ;
1517 case SND_SOC_DAIFMT_LEFT_J:
1518 adc_aif1 |= RK312x_ADC_DF_LJ;
1519 dac_aif1 |= RK312x_DAC_DF_LJ;
1522 DBG("%s : set format failed!\n", __func__);
1526 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1527 case SND_SOC_DAIFMT_NB_NF:
1528 adc_aif1 |= RK312x_ALRCK_POL_DIS;
1529 adc_aif2 |= RK312x_ABCLK_POL_DIS;
1530 dac_aif1 |= RK312x_DLRCK_POL_DIS;
1531 dac_aif2 |= RK312x_DBCLK_POL_DIS;
1533 case SND_SOC_DAIFMT_IB_IF:
1534 adc_aif1 |= RK312x_ALRCK_POL_EN;
1535 adc_aif2 |= RK312x_ABCLK_POL_EN;
1536 dac_aif1 |= RK312x_DLRCK_POL_EN;
1537 dac_aif2 |= RK312x_DBCLK_POL_EN;
1539 case SND_SOC_DAIFMT_IB_NF:
1540 adc_aif1 |= RK312x_ALRCK_POL_DIS;
1541 adc_aif2 |= RK312x_ABCLK_POL_EN;
1542 dac_aif1 |= RK312x_DLRCK_POL_DIS;
1543 dac_aif2 |= RK312x_DBCLK_POL_EN;
1545 case SND_SOC_DAIFMT_NB_IF:
1546 adc_aif1 |= RK312x_ALRCK_POL_EN;
1547 adc_aif2 |= RK312x_ABCLK_POL_DIS;
1548 dac_aif1 |= RK312x_DLRCK_POL_EN;
1549 dac_aif2 |= RK312x_DBCLK_POL_DIS;
1552 DBG("%s : set dai format failed!\n", __func__);
1556 snd_soc_update_bits(codec, RK312x_ADC_INT_CTL1,
1557 RK312x_ALRCK_POL_MASK
1558 | RK312x_ADC_DF_MASK, adc_aif1);
1559 snd_soc_update_bits(codec, RK312x_ADC_INT_CTL2,
1560 RK312x_ABCLK_POL_MASK
1561 | RK312x_I2S_MODE_MASK, adc_aif2);
1562 snd_soc_update_bits(codec, RK312x_DAC_INT_CTL1,
1563 RK312x_DLRCK_POL_MASK
1564 | RK312x_DAC_DF_MASK, dac_aif1);
1565 snd_soc_update_bits(codec, RK312x_DAC_INT_CTL2,
1566 RK312x_DBCLK_POL_MASK, dac_aif2);
1571 static int rk312x_hw_params(struct snd_pcm_substream *substream,
1572 struct snd_pcm_hw_params *params,
1573 struct snd_soc_dai *dai)
1575 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1576 struct snd_soc_codec *codec = rtd->codec;
1577 struct rk312x_codec_priv *rk312x = rk312x_priv;
1578 unsigned int rate = params_rate(params);
1580 unsigned int adc_aif1 = 0, adc_aif2 = 0, dac_aif1 = 0, dac_aif2 = 0;
1583 DBG("%s : rk312x is NULL\n", __func__);
1587 /* bclk = codec_clk / 4 */
1588 /* lrck = bclk / (wl * 2) */
1589 div = (((rk312x->stereo_sysclk / 4) / rate) / 2);
1591 if ((rk312x->stereo_sysclk % (4 * rate * 2) > 0) ||
1592 (div != 16 && div != 20 && div != 24 && div != 32)) {
1593 DBG("%s : need PLL\n", __func__);
1599 adc_aif2 |= RK312x_ADC_WL_16;
1600 dac_aif2 |= RK312x_DAC_WL_16;
1603 adc_aif2 |= RK312x_ADC_WL_20;
1604 dac_aif2 |= RK312x_DAC_WL_20;
1607 adc_aif2 |= RK312x_ADC_WL_24;
1608 dac_aif2 |= RK312x_DAC_WL_24;
1611 adc_aif2 |= RK312x_ADC_WL_32;
1612 dac_aif2 |= RK312x_DAC_WL_32;
1619 DBG("%s : MCLK = %dHz, sample rate = %dHz, div = %d\n",
1620 __func__, rk312x->stereo_sysclk, rate, div);
1622 switch (params_format(params)) {
1623 case SNDRV_PCM_FORMAT_S16_LE:
1624 adc_aif1 |= RK312x_ADC_VWL_16;
1625 dac_aif1 |= RK312x_DAC_VWL_16;
1627 case SNDRV_PCM_FORMAT_S20_3LE:
1628 adc_aif1 |= RK312x_ADC_VWL_20;
1629 dac_aif1 |= RK312x_DAC_VWL_20;
1631 case SNDRV_PCM_FORMAT_S24_LE:
1632 adc_aif1 |= RK312x_ADC_VWL_24;
1633 dac_aif1 |= RK312x_DAC_VWL_24;
1635 case SNDRV_PCM_FORMAT_S32_LE:
1636 adc_aif1 |= RK312x_ADC_VWL_32;
1637 dac_aif1 |= RK312x_DAC_VWL_32;
1643 switch (params_channels(params)) {
1645 adc_aif1 |= RK312x_ADC_TYPE_MONO;
1649 adc_aif1 |= RK312x_ADC_TYPE_STEREO;
1656 adc_aif1 |= RK312x_ADC_SWAP_DIS;
1657 adc_aif2 |= RK312x_ADC_RST_DIS;
1658 dac_aif1 |= RK312x_DAC_SWAP_DIS;
1659 dac_aif2 |= RK312x_DAC_RST_DIS;
1661 rk312x->rate = rate;
1663 snd_soc_update_bits(codec, RK312x_ADC_INT_CTL1,
1665 | RK312x_ADC_SWAP_MASK
1666 | RK312x_ADC_TYPE_MASK, adc_aif1);
1667 snd_soc_update_bits(codec, RK312x_ADC_INT_CTL2,
1669 | RK312x_ADC_RST_MASK, adc_aif2);
1670 snd_soc_update_bits(codec, RK312x_DAC_INT_CTL1,
1672 | RK312x_DAC_SWAP_MASK, dac_aif1);
1673 snd_soc_update_bits(codec, RK312x_DAC_INT_CTL2,
1675 | RK312x_DAC_RST_MASK, dac_aif2);
1680 static int rk312x_digital_mute(struct snd_soc_dai *dai, int mute)
1684 rk312x_codec_ctl_gpio(CODEC_SET_SPK, !rk312x_priv->spk_active_level);
1685 rk312x_codec_ctl_gpio(CODEC_SET_HP, !rk312x_priv->hp_active_level);
1687 switch (rk312x_priv->playback_path) {
1690 /* rk312x_codec_ctl_gpio(CODEC_SET_SPK, rk312x_priv->spk_active_level); */
1691 /* rk312x_codec_ctl_gpio(CODEC_SET_HP, rk312x_priv->hp_active_level); */
1696 case RING_HP_NO_MIC:
1697 /* rk312x_codec_ctl_gpio(CODEC_SET_HP, rk312x_priv->hp_active_level); */
1698 /* rk312x_codec_ctl_gpio(CODEC_SET_SPK, rk312x_priv->spk_active_level); */
1702 rk312x_codec_ctl_gpio(CODEC_SET_SPK, rk312x_priv->spk_active_level);
1703 rk312x_codec_ctl_gpio(CODEC_SET_HP, rk312x_priv->hp_active_level);
1712 static struct rk312x_reg_val_typ playback_power_up_list[] = {
1722 {0xac, 0x11}, /*DAC*/
1731 #define RK312x_CODEC_PLAYBACK_POWER_UP_LIST_LEN ARRAY_SIZE( \
1732 playback_power_up_list)
1734 static struct rk312x_reg_val_typ playback_power_down_list[] = {
1752 #define RK312x_CODEC_PLAYBACK_POWER_DOWN_LIST_LEN ARRAY_SIZE( \
1753 playback_power_down_list)
1755 static struct rk312x_reg_val_typ capture_power_up_list[] = {
1766 {0x94, 0x20 | CAP_VOL},
1774 #define RK312x_CODEC_CAPTURE_POWER_UP_LIST_LEN ARRAY_SIZE(capture_power_up_list)
1776 static struct rk312x_reg_val_typ capture_power_down_list[] = {
1794 #define RK312x_CODEC_CAPTURE_POWER_DOWN_LIST_LEN ARRAY_SIZE(\
1795 capture_power_down_list)
1797 static int rk312x_codec_power_up(int type)
1799 struct snd_soc_codec *codec = rk312x_priv->codec;
1802 if (!rk312x_priv || !rk312x_priv->codec) {
1803 DBG("%s : rk312x_priv or rk312x_priv->codec is NULL\n",
1807 DBG("%s : power up %s%s\n", __func__,
1808 type == RK312x_CODEC_PLAYBACK ? "playback" : "",
1809 type == RK312x_CODEC_CAPTURE ? "capture" : "");
1811 if (type == RK312x_CODEC_PLAYBACK) {
1812 for (i = 0; i < RK312x_CODEC_PLAYBACK_POWER_UP_LIST_LEN; i++) {
1813 snd_soc_write(codec, playback_power_up_list[i].reg,
1814 playback_power_up_list[i].value);
1816 } else if (type == RK312x_CODEC_CAPTURE) {
1817 for (i = 0; i < RK312x_CODEC_CAPTURE_POWER_UP_LIST_LEN; i++) {
1818 snd_soc_write(codec, capture_power_up_list[i].reg,
1819 capture_power_up_list[i].value);
1821 } else if (type == RK312x_CODEC_INCALL) {
1822 snd_soc_update_bits(codec, RK312x_ALC_MUNIN_CTL,
1823 RK312x_MUXINL_F_MSK | RK312x_MUXINR_F_MSK,
1824 RK312x_MUXINR_F_INR | RK312x_MUXINL_F_INL);
1830 static int rk312x_codec_power_down(int type)
1832 struct snd_soc_codec *codec = rk312x_priv->codec;
1835 if (!rk312x_priv || !rk312x_priv->codec) {
1836 DBG("%s : rk312x_priv or rk312x_priv->codec is NULL\n",
1841 DBG("%s : power down %s%s%s\n", __func__,
1842 type == RK312x_CODEC_PLAYBACK ? "playback" : "",
1843 type == RK312x_CODEC_CAPTURE ? "capture" : "",
1844 type == RK312x_CODEC_ALL ? "all" : "");
1846 if ((type == RK312x_CODEC_CAPTURE) || (type == RK312x_CODEC_INCALL)) {
1847 for (i = 0; i < RK312x_CODEC_CAPTURE_POWER_DOWN_LIST_LEN; i++) {
1848 snd_soc_write(codec, capture_power_down_list[i].reg,
1849 capture_power_down_list[i].value);
1851 } else if (type == RK312x_CODEC_PLAYBACK) {
1853 i < RK312x_CODEC_PLAYBACK_POWER_DOWN_LIST_LEN;
1855 snd_soc_write(codec, playback_power_down_list[i].reg,
1856 playback_power_down_list[i].value);
1859 } else if (type == RK312x_CODEC_ALL) {
1860 rk312x_reset(codec);
1866 static void rk312x_codec_capture_work(struct work_struct *work)
1868 DBG("%s : rk312x_codec_work_capture_type = %d\n", __func__,
1869 rk312x_codec_work_capture_type);
1871 switch (rk312x_codec_work_capture_type) {
1872 case RK312x_CODEC_WORK_POWER_DOWN:
1873 rk312x_codec_power_down(RK312x_CODEC_CAPTURE);
1875 case RK312x_CODEC_WORK_POWER_UP:
1876 rk312x_codec_power_up(RK312x_CODEC_CAPTURE);
1877 snd_soc_write(rk312x_priv->codec, 0x94, 0x20|rk312x_priv->capture_volume);
1878 snd_soc_write(rk312x_priv->codec, 0x98, rk312x_priv->capture_volume);
1884 rk312x_codec_work_capture_type = RK312x_CODEC_WORK_NULL;
1887 static int rk312x_startup(struct snd_pcm_substream *substream,
1888 struct snd_soc_dai *dai)
1890 struct rk312x_codec_priv *rk312x = rk312x_priv;
1891 bool playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
1892 bool is_codec_playback_running = rk312x->playback_active > 0;
1893 bool is_codec_capture_running = rk312x->capture_active > 0;
1895 if (rk312x_priv->rk312x_for_mid) {
1899 DBG("%s : rk312x is NULL\n", __func__);
1903 rk312x->playback_active++;
1905 rk312x->capture_active++;
1908 if (rk312x->playback_active > 0)
1909 if (!is_codec_playback_running) {
1910 rk312x_codec_power_up(RK312x_CODEC_PLAYBACK);
1911 snd_soc_write(rk312x_priv->codec, 0xb4, rk312x_priv->spk_volume);
1912 snd_soc_write(rk312x_priv->codec, 0xb8, rk312x_priv->spk_volume);
1913 rk312x_codec_ctl_gpio(CODEC_SET_SPK, rk312x_priv->spk_active_level);
1916 if (rk312x->capture_active > 0 && !is_codec_capture_running) {
1917 if (rk312x_codec_work_capture_type != RK312x_CODEC_WORK_POWER_UP) {
1918 //cancel_delayed_work_sync(&capture_delayed_work);
1919 if (rk312x_codec_work_capture_type == RK312x_CODEC_WORK_NULL)
1920 rk312x_codec_power_up(RK312x_CODEC_CAPTURE);
1922 rk312x_codec_work_capture_type = RK312x_CODEC_WORK_NULL;
1930 static void rk312x_shutdown(struct snd_pcm_substream *substream,
1931 struct snd_soc_dai *dai)
1933 struct rk312x_codec_priv *rk312x = rk312x_priv;
1934 bool playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
1935 bool is_codec_playback_running = rk312x->playback_active > 0;
1936 bool is_codec_capture_running = rk312x->capture_active > 0;
1938 if (rk312x_priv->rk312x_for_mid) {
1943 DBG("%s : rk312x is NULL\n", __func__);
1947 rk312x->playback_active--;
1949 rk312x->capture_active--;
1952 if (rk312x->playback_active <= 0) {
1953 if (is_codec_playback_running == true)
1954 rk312x_codec_power_down(
1955 RK312x_CODEC_PLAYBACK);
1957 DBG(" Warning:playback closed! return !\n");
1960 if (rk312x->capture_active <= 0) {
1961 if ((rk312x_codec_work_capture_type !=
1962 RK312x_CODEC_WORK_POWER_DOWN) &&
1963 (is_codec_capture_running == true)) {
1964 cancel_delayed_work_sync(&capture_delayed_work);
1966 * If rk312x_codec_work_capture_type is NULL
1967 * means codec already power down,
1968 * so power up codec.
1969 * If rk312x_codec_work_capture_type is
1970 * RK312x_CODEC_WORK_POWER_UP it means
1971 * codec haven't be powered up, so we don't
1972 * need to power down codec.
1973 * If is playback call power down,
1974 * power down immediatly, because audioflinger
1975 * already has delay 3s.
1977 if (rk312x_codec_work_capture_type ==
1978 RK312x_CODEC_WORK_NULL) {
1979 rk312x_codec_work_capture_type =
1980 RK312x_CODEC_WORK_POWER_DOWN;
1981 queue_delayed_work(rk312x_codec_workq,
1982 &capture_delayed_work,
1983 msecs_to_jiffies(3000));
1985 rk312x_codec_work_capture_type =
1986 RK312x_CODEC_WORK_NULL;
1993 #define RK312x_PLAYBACK_RATES (SNDRV_PCM_RATE_8000 |\
1994 SNDRV_PCM_RATE_16000 | \
1995 SNDRV_PCM_RATE_32000 | \
1996 SNDRV_PCM_RATE_44100 | \
1997 SNDRV_PCM_RATE_48000 | \
1998 SNDRV_PCM_RATE_96000 | \
1999 SNDRV_PCM_RATE_192000)
2001 #define RK312x_CAPTURE_RATES (SNDRV_PCM_RATE_8000 |\
2002 SNDRV_PCM_RATE_16000 | \
2003 SNDRV_PCM_RATE_32000 | \
2004 SNDRV_PCM_RATE_44100 | \
2005 SNDRV_PCM_RATE_48000 | \
2006 SNDRV_PCM_RATE_96000)
2008 #define RK312x_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
2009 SNDRV_PCM_FMTBIT_S20_3LE |\
2010 SNDRV_PCM_FMTBIT_S24_LE |\
2011 SNDRV_PCM_FMTBIT_S32_LE)
2013 static struct snd_soc_dai_ops rk312x_dai_ops = {
2014 .hw_params = rk312x_hw_params,
2015 .set_fmt = rk312x_set_dai_fmt,
2016 .set_sysclk = rk312x_set_dai_sysclk,
2017 .digital_mute = rk312x_digital_mute,
2018 .startup = rk312x_startup,
2019 .shutdown = rk312x_shutdown,
2022 static struct snd_soc_dai_driver rk312x_dai[] = {
2024 .name = "rk312x-hifi",
2027 .stream_name = "HiFi Playback",
2030 .rates = RK312x_PLAYBACK_RATES,
2031 .formats = RK312x_FORMATS,
2034 .stream_name = "HiFi Capture",
2037 .rates = RK312x_CAPTURE_RATES,
2038 .formats = RK312x_FORMATS,
2040 .ops = &rk312x_dai_ops,
2043 .name = "rk312x-voice",
2046 .stream_name = "Voice Playback",
2049 .rates = RK312x_PLAYBACK_RATES,
2050 .formats = RK312x_FORMATS,
2053 .stream_name = "Voice Capture",
2056 .rates = RK312x_CAPTURE_RATES,
2057 .formats = RK312x_FORMATS,
2059 .ops = &rk312x_dai_ops,
2064 static int rk312x_suspend(struct snd_soc_codec *codec)
2067 DBG("%s\n", __func__);
2068 if (rk312x_priv->codec_hp_det) {
2069 /* disable hp det interrupt */
2070 val = readl_relaxed(RK_GRF_VIRT + GRF_ACODEC_CON);
2071 writel_relaxed(0x1f0013, RK_GRF_VIRT + GRF_ACODEC_CON);
2072 val = readl_relaxed(RK_GRF_VIRT + GRF_ACODEC_CON);
2073 printk("GRF_ACODEC_CON is 0x%x\n", val);
2074 del_timer(&rk312x_priv->timer);
2076 if (rk312x_priv->rk312x_for_mid) {
2077 cancel_delayed_work_sync(&capture_delayed_work);
2079 if (rk312x_codec_work_capture_type != RK312x_CODEC_WORK_NULL)
2080 rk312x_codec_work_capture_type = RK312x_CODEC_WORK_NULL;
2082 rk312x_codec_power_down(RK312x_CODEC_PLAYBACK);
2083 rk312x_codec_power_down(RK312x_CODEC_ALL);
2084 snd_soc_write(codec, RK312x_SELECT_CURRENT, 0x1e);
2085 snd_soc_write(codec, RK312x_SELECT_CURRENT, 0x3e);
2087 rk312x_set_bias_level(codec, SND_SOC_BIAS_OFF);
2092 static ssize_t gpio_show(struct kobject *kobj, struct kobj_attribute *attr,
2098 static ssize_t gpio_store(struct kobject *kobj, struct kobj_attribute *attr,
2099 const char *buf, size_t n)
2101 const char *buftmp = buf;
2104 struct rk312x_codec_priv *rk312x =
2105 snd_soc_codec_get_drvdata(rk312x_priv->codec);
2107 ret = sscanf(buftmp, "%c ", &cmd);
2112 if (rk312x->spk_ctl_gpio != INVALID_GPIO) {
2113 gpio_set_value(rk312x->spk_ctl_gpio, !rk312x->spk_active_level);
2114 DBG(KERN_INFO"%s : spk gpio disable\n",__func__);
2117 if (rk312x->hp_ctl_gpio != INVALID_GPIO) {
2118 gpio_set_value(rk312x->hp_ctl_gpio, !rk312x->hp_active_level);
2119 DBG(KERN_INFO"%s : disable hp gpio \n",__func__);
2123 if (rk312x->spk_ctl_gpio != INVALID_GPIO) {
2124 gpio_set_value(rk312x->spk_ctl_gpio, rk312x->spk_active_level);
2125 DBG(KERN_INFO"%s : spk gpio enable\n",__func__);
2128 if (rk312x->hp_ctl_gpio != INVALID_GPIO) {
2129 gpio_set_value(rk312x->hp_ctl_gpio, rk312x->hp_active_level);
2130 DBG("%s : enable hp gpio \n",__func__);
2134 DBG(KERN_ERR"--rk312x codec %s-- unknown cmd\n", __func__);
2139 static struct kobject *gpio_kobj;
2140 struct gpio_attribute {
2142 struct attribute attr;
2144 ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,
2146 ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr,
2147 const char *buf, size_t n);
2150 static struct gpio_attribute gpio_attrs[] = {
2151 /* node_name permision show_func store_func */
2152 __ATTR(spk-ctl, S_IRUGO | S_IWUSR, gpio_show, gpio_store),
2155 static int rk312x_resume(struct snd_soc_codec *codec)
2158 if(rk312x_priv->codec_hp_det)
2160 /* enable hp det interrupt */
2161 snd_soc_write(codec, RK312x_DAC_CTL, 0x08);
2162 printk("0xa0 -- 0x%x\n",snd_soc_read(codec, RK312x_DAC_CTL));
2163 val = readl_relaxed(RK_GRF_VIRT + GRF_ACODEC_CON);
2164 writel_relaxed(0x1f001f, RK_GRF_VIRT + GRF_ACODEC_CON);
2165 val = readl_relaxed(RK_GRF_VIRT + GRF_ACODEC_CON);
2166 printk("GRF_ACODEC_CON is 0x%x\n", val);
2167 add_timer(&rk312x_priv->timer);
2169 if (!rk312x_priv->rk312x_for_mid)
2170 rk312x_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
2174 static irqreturn_t codec_hp_det_isr(int irq, void *data)
2176 unsigned int val = 0;
2177 val = readl_relaxed(RK_GRF_VIRT + GRF_ACODEC_CON);
2178 DBG("%s GRF_ACODEC_CON -- 0x%x\n", __func__, val);
2180 DBG("%s hp det rising\n", __func__);
2181 writel_relaxed(val|0x10001, RK_GRF_VIRT + GRF_ACODEC_CON);
2182 } else if (val&0x2) {
2183 DBG("%s hp det falling\n", __func__);
2184 writel_relaxed(val|0x20002, RK_GRF_VIRT + GRF_ACODEC_CON);
2186 del_timer(&rk312x_priv->timer);
2187 add_timer(&rk312x_priv->timer);
2190 static void hp_det_timer_func(unsigned long data)
2192 unsigned int val = 0;
2194 val = readl_relaxed(RK_GRF_VIRT + GRF_SOC_STATUS0);
2195 DBG("%s GRF_SOC_STATUS0 -- 0x%x\n", __func__, val);
2196 if (val & 0x80000000) {
2197 DBG("%s hp det high\n", __func__);
2198 DBG("%s no headset\n", __func__);
2199 switch_set_state(&rk312x_priv->sdev, 0);
2201 DBG("%s hp det low\n", __func__);
2202 DBG("%s headset inserted\n", __func__);
2203 switch_set_state(&rk312x_priv->sdev, BIT_HEADSET_NO_MIC);
2207 static ssize_t h2w_print_name(struct switch_dev *sdev, char *buf)
2209 return sprintf(buf, "Headset\n");
2211 static int rk312x_probe(struct snd_soc_codec *codec)
2213 struct rk312x_codec_priv *rk312x_codec =
2214 snd_soc_codec_get_drvdata(codec);
2219 rk312x_codec->codec = codec;
2220 clk_prepare_enable(rk312x_codec->pclk);
2222 ret = snd_soc_codec_set_cache_io(codec, 8, 8, SND_SOC_I2C);
2225 codec->hw_read = rk312x_codec_read;
2226 codec->hw_write = (hw_write_t)rk312x_hw_write;
2227 codec->read = rk312x_codec_read;
2228 codec->write = rk312x_codec_write;
2230 rk312x_codec->playback_active = 0;
2231 rk312x_codec->capture_active = 0;
2233 rk312x_codec_workq = create_freezable_workqueue("rk312x-codec");
2235 if (rk312x_codec_workq == NULL) {
2236 DBG("%s : rk312x_codec_workq is NULL!\n", __func__);
2241 val = snd_soc_read(codec, RK312x_RESET);
2242 if (val != rk312x_reg_defaults[RK312x_RESET]) {
2243 DBG("%s : codec register 0: %x is not a 0x00000003\n",
2249 rk312x_reset(codec);
2251 if (!rk312x_priv->rk312x_for_mid) {
2252 codec->dapm.bias_level = SND_SOC_BIAS_OFF;
2253 rk312x_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
2257 snd_soc_write(codec, RK312x_SELECT_CURRENT, 0x1e);
2258 snd_soc_write(codec, RK312x_SELECT_CURRENT, 0x3e);
2261 snd_soc_add_codec_controls(codec, rk312x_snd_path_controls,
2262 ARRAY_SIZE(rk312x_snd_path_controls));
2263 if (rk312x_codec->gpio_debug) {
2264 gpio_kobj = kobject_create_and_add("codec-spk-ctl", NULL);
2268 for (i = 0; i < ARRAY_SIZE(gpio_attrs); i++) {
2269 ret = sysfs_create_file(gpio_kobj, &gpio_attrs[i].attr);
2271 DBG(KERN_ERR"create codec-spk-ctl sysfs %d error\n", i);
2276 if(rk312x_codec->codec_hp_det)
2278 /*init codec_hp_det interrupt */
2279 ret =request_irq(96, codec_hp_det_isr, IRQF_TRIGGER_RISING, "codec_hp_det", NULL);
2281 printk(" codec_hp_det request_irq failed %d\n", ret);
2283 init_timer(&rk312x_codec->timer);
2284 rk312x_codec->timer.function = hp_det_timer_func;
2285 rk312x_codec->timer.expires = jiffies + HZ/100;
2286 rk312x_codec->sdev.name = "h2w";
2287 rk312x_codec->sdev.print_name = h2w_print_name;
2288 ret = switch_dev_register(&rk312x_codec->sdev);
2290 printk(KERN_ERR"register switch dev failed\n");
2291 val = readl_relaxed(RK_GRF_VIRT + GRF_ACODEC_CON);
2292 writel_relaxed(0x1f001f, RK_GRF_VIRT + GRF_ACODEC_CON);
2293 val = readl_relaxed(RK_GRF_VIRT + GRF_ACODEC_CON);
2294 printk("GRF_ACODEC_CON 3334is 0x%x\n", val);
2295 snd_soc_write(codec, RK312x_DAC_CTL, 0x08);
2296 printk("0xa0 -- 0x%x\n",snd_soc_read(codec, RK312x_DAC_CTL));
2297 /* codec hp det once */
2298 add_timer(&rk312x_priv->timer);
2304 dbg_codec(2, "%s err ret=%d\n", __func__, ret);
2308 /* power down chip */
2309 static int rk312x_remove(struct snd_soc_codec *codec)
2312 DBG("%s\n", __func__);
2314 DBG("%s : rk312x_priv is NULL\n", __func__);
2318 if (rk312x_priv->spk_ctl_gpio != INVALID_GPIO)
2319 gpio_set_value(rk312x_priv->spk_ctl_gpio, !rk312x_priv->spk_active_level);
2321 if (rk312x_priv->hp_ctl_gpio != INVALID_GPIO)
2322 gpio_set_value(rk312x_priv->hp_ctl_gpio, !rk312x_priv->hp_active_level);
2326 if (rk312x_priv->rk312x_for_mid) {
2327 cancel_delayed_work_sync(&capture_delayed_work);
2329 if (rk312x_codec_work_capture_type != RK312x_CODEC_WORK_NULL)
2330 rk312x_codec_work_capture_type = RK312x_CODEC_WORK_NULL;
2332 snd_soc_write(codec, RK312x_RESET, 0xfc);
2334 snd_soc_write(codec, RK312x_RESET, 0x3);
2337 /* if (rk312x_priv) */
2344 static struct snd_soc_codec_driver soc_codec_dev_rk312x = {
2345 .probe = rk312x_probe,
2346 .remove = rk312x_remove,
2347 .suspend = rk312x_suspend,
2348 .resume = rk312x_resume,
2349 .set_bias_level = rk312x_set_bias_level,
2350 .reg_cache_size = ARRAY_SIZE(rk312x_reg_defaults),
2351 .reg_word_size = sizeof(unsigned int),
2352 .reg_cache_default = rk312x_reg_defaults,
2353 .volatile_register = rk312x_volatile_register,
2354 .readable_register = rk312x_codec_register,
2355 .reg_cache_step = sizeof(unsigned int),
2358 static int rk312x_platform_probe(struct platform_device *pdev)
2360 struct device_node *rk312x_np = pdev->dev.of_node;
2361 struct rk312x_codec_priv *rk312x;
2362 struct resource *res;
2365 rk312x = devm_kzalloc(&pdev->dev, sizeof(*rk312x), GFP_KERNEL);
2367 dbg_codec(2, "%s : rk312x priv kzalloc failed!\n",
2371 rk312x_priv = rk312x;
2372 platform_set_drvdata(pdev, rk312x);
2375 rk312x->spk_hp_switch_gpio = of_get_named_gpio_flags(rk312x_np,
2376 "spk_hp_switch_gpio", 0, &rk312x->spk_io);
2377 rk312x->spk_io = !rk312x->spk_io;
2378 if (!gpio_is_valid(rk312x->spk_hp_switch_gpio)) {
2379 dbg_codec(2, "invalid spk hp switch_gpio : %d\n",
2380 rk312x->spk_hp_switch_gpio);
2381 rk312x->spk_hp_switch_gpio = INVALID_GPIO;
2382 /* ret = -ENOENT; */
2385 DBG("%s : spk_hp_switch_gpio %d spk active_level %d \n", __func__,
2386 rk312x->spk_hp_switch_gpio, rk312x->spk_io);
2388 if(rk312x->spk_hp_switch_gpio != INVALID_GPIO) {
2389 ret = devm_gpio_request(&pdev->dev, rk312x->spk_hp_switch_gpio, "spk_hp_switch");
2391 dbg_codec(2, "rk312x_platform_probe spk_hp_switch_gpio fail\n");
2393 rk312x->spk_hp_switch_gpio = INVALID_GPIO;
2397 rk312x->hp_ctl_gpio = of_get_named_gpio_flags(rk312x_np,
2398 "hp_ctl_io", 0, &rk312x->hp_active_level);
2399 rk312x->hp_active_level = !rk312x->hp_active_level;
2400 if (!gpio_is_valid(rk312x->hp_ctl_gpio)) {
2401 dbg_codec(2, "invalid hp_ctl_gpio: %d\n",
2402 rk312x->hp_ctl_gpio);
2403 rk312x->hp_ctl_gpio = INVALID_GPIO;
2404 /* ret = -ENOENT; */
2407 DBG("%s : hp_ctl_gpio %d active_level %d \n", __func__,
2408 rk312x->hp_ctl_gpio, rk312x->hp_active_level);
2410 if(rk312x->hp_ctl_gpio != INVALID_GPIO) {
2411 ret = devm_gpio_request(&pdev->dev, rk312x->hp_ctl_gpio, "hp_ctl");
2413 dbg_codec(2, "rk312x_platform_probe hp_ctl_gpio fail\n");
2415 rk312x->hp_ctl_gpio = INVALID_GPIO;
2417 gpio_direction_output(rk312x->hp_ctl_gpio, !rk312x->hp_active_level);
2420 rk312x->spk_ctl_gpio = of_get_named_gpio_flags(rk312x_np,
2421 "spk_ctl_io", 0, &rk312x->spk_active_level);
2422 if (!gpio_is_valid(rk312x->spk_ctl_gpio)) {
2423 dbg_codec(2, "invalid spk_ctl_gpio: %d\n",
2424 rk312x->spk_ctl_gpio);
2425 rk312x->spk_ctl_gpio = INVALID_GPIO;
2426 /* ret = -ENOENT; */
2430 rk312x->spk_active_level = !rk312x->spk_active_level;
2431 if (rk312x->spk_ctl_gpio != INVALID_GPIO) {
2432 ret = devm_gpio_request(&pdev->dev, rk312x->spk_ctl_gpio, "spk_ctl");
2434 dbg_codec(2, "rk312x_platform_probe spk_ctl_gpio fail\n");
2436 rk312x->spk_ctl_gpio = INVALID_GPIO;
2438 gpio_direction_output(rk312x->spk_ctl_gpio, !rk312x->spk_active_level);
2440 DBG(KERN_INFO"%s : spk_ctl_gpio %d active_level %d \n", __func__,
2441 rk312x->spk_ctl_gpio, rk312x->spk_active_level);
2443 ret = of_property_read_u32(rk312x_np, "spk-mute-delay",
2444 &rk312x->spk_mute_delay);
2446 DBG(KERN_ERR "%s() Can not read property spk-mute-delay\n",
2448 rk312x->spk_mute_delay = 0;
2451 ret = of_property_read_u32(rk312x_np, "hp-mute-delay",
2452 &rk312x->hp_mute_delay);
2454 DBG(KERN_ERR"%s() Can not read property hp-mute-delay\n",
2456 rk312x->hp_mute_delay = 0;
2458 DBG("spk mute delay %dms --- hp mute delay %dms\n",rk312x->spk_mute_delay,rk312x->hp_mute_delay);
2460 ret = of_property_read_u32(rk312x_np, "rk312x_for_mid",
2461 &rk312x->rk312x_for_mid);
2463 DBG(KERN_ERR"%s() Can not read property rk312x_for_mid, default for mid\n",
2465 rk312x->rk312x_for_mid = 1;
2467 ret = of_property_read_u32(rk312x_np, "is_rk3128",
2468 &rk312x->is_rk3128);
2470 DBG(KERN_ERR"%s() Can not read property is_rk3128, default rk3126\n",
2472 rk312x->is_rk3128 = 0;
2474 ret = of_property_read_u32(rk312x_np, "spk_volume",
2475 &rk312x->spk_volume);
2477 DBG(KERN_ERR"%s() Can not read property spk_volume, default 25\n",
2479 rk312x->spk_volume = 25;
2481 ret = of_property_read_u32(rk312x_np, "hp_volume",
2482 &rk312x->hp_volume);
2484 DBG(KERN_ERR"%s() Can not read property hp_volume, default 25\n",
2486 rk312x->hp_volume = 25;
2488 ret = of_property_read_u32(rk312x_np, "capture_volume",
2489 &rk312x->capture_volume);
2491 DBG(KERN_ERR"%s() Can not read property capture_volume, default 26\n",
2493 rk312x->capture_volume = 26;
2495 ret = of_property_read_u32(rk312x_np, "gpio_debug", &rk312x->gpio_debug);
2497 DBG(KERN_ERR"%s() Can not read property gpio_debug\n", __func__);
2498 rk312x->gpio_debug = 0;
2500 ret = of_property_read_u32(rk312x_np, "codec_hp_det", &rk312x->codec_hp_det);
2503 DBG(KERN_ERR"%s() Can not read property gpio_debug\n", __func__);
2504 rk312x->codec_hp_det = 0;
2507 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2508 rk312x->regbase = devm_ioremap_resource(&pdev->dev, res);
2509 if (IS_ERR(rk312x->regbase))
2510 return PTR_ERR(rk312x->regbase);
2512 rk312x->pclk = devm_clk_get(&pdev->dev, "g_pclk_acodec");
2513 if (IS_ERR(rk312x->pclk)) {
2514 dev_err(&pdev->dev, "Unable to get acodec hclk\n");
2519 return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_rk312x,
2520 rk312x_dai, ARRAY_SIZE(rk312x_dai));
2523 platform_set_drvdata(pdev, NULL);
2528 static int rk312x_platform_remove(struct platform_device *pdev)
2530 DBG("%s\n", __func__);
2532 snd_soc_unregister_codec(&pdev->dev);
2536 void rk312x_platform_shutdown(struct platform_device *pdev)
2538 DBG("%s\n", __func__);
2539 if (!rk312x_priv || !rk312x_priv->codec) {
2540 DBG("%s : rk312x_priv or rk312x_priv->codec is NULL\n",
2545 if (rk312x_priv->spk_ctl_gpio != INVALID_GPIO)
2546 gpio_set_value(rk312x_priv->spk_ctl_gpio, !rk312x_priv->spk_active_level);
2548 if (rk312x_priv->hp_ctl_gpio != INVALID_GPIO)
2549 gpio_set_value(rk312x_priv->hp_ctl_gpio, !rk312x_priv->hp_active_level);
2553 if (rk312x_priv->rk312x_for_mid) {
2554 cancel_delayed_work_sync(&capture_delayed_work);
2555 if (rk312x_codec_work_capture_type !=
2556 RK312x_CODEC_WORK_NULL)
2557 rk312x_codec_work_capture_type =
2558 RK312x_CODEC_WORK_NULL;
2561 writel(0xfc, rk312x_priv->regbase+RK312x_RESET);
2563 writel(0x03, rk312x_priv->regbase+RK312x_RESET);
2565 /* if (rk312x_priv) */
2570 static const struct of_device_id rk3126_codec_of_match[] = {
2571 { .compatible = "rk312x-codec" },
2574 MODULE_DEVICE_TABLE(of, rk3126_codec_of_match);
2577 static struct platform_driver rk312x_codec_driver = {
2579 .name = "rk312x-codec",
2580 .owner = THIS_MODULE,
2581 .of_match_table = of_match_ptr(rk3126_codec_of_match),
2583 .probe = rk312x_platform_probe,
2584 .remove = rk312x_platform_remove,
2585 .shutdown = rk312x_platform_shutdown,
2587 module_platform_driver(rk312x_codec_driver);
2589 /* Module information */
2590 MODULE_AUTHOR("rockchip");
2591 MODULE_DESCRIPTION("ROCKCHIP i2s ASoC Interface");
2592 MODULE_LICENSE("GPL");