1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 248e27874SAdam Thomson /* 348e27874SAdam Thomson * da732x.c --- Dialog DA732X ALSA SoC Audio Driver 448e27874SAdam Thomson * 548e27874SAdam Thomson * Copyright (C) 2012 Dialog Semiconductor GmbH 648e27874SAdam Thomson * 748e27874SAdam Thomson * Author: Michal Hajduk <Michal.Hajduk@diasemi.com> 848e27874SAdam Thomson */ 948e27874SAdam Thomson 1048e27874SAdam Thomson #include <linux/module.h> 1148e27874SAdam Thomson #include <linux/moduleparam.h> 1248e27874SAdam Thomson #include <linux/init.h> 1348e27874SAdam Thomson #include <linux/delay.h> 1448e27874SAdam Thomson #include <linux/pm.h> 1548e27874SAdam Thomson #include <linux/i2c.h> 1648e27874SAdam Thomson #include <linux/regmap.h> 1748e27874SAdam Thomson #include <linux/platform_device.h> 1848e27874SAdam Thomson #include <linux/slab.h> 1948e27874SAdam Thomson #include <linux/sysfs.h> 2048e27874SAdam Thomson #include <sound/core.h> 2148e27874SAdam Thomson #include <sound/pcm.h> 2248e27874SAdam Thomson #include <sound/pcm_params.h> 2348e27874SAdam Thomson #include <sound/soc.h> 2448e27874SAdam Thomson #include <sound/soc-dapm.h> 2548e27874SAdam Thomson #include <sound/initval.h> 2648e27874SAdam Thomson #include <sound/tlv.h> 2748e27874SAdam Thomson #include <asm/div64.h> 2848e27874SAdam Thomson 2948e27874SAdam Thomson #include "da732x.h" 3048e27874SAdam Thomson #include "da732x_reg.h" 3148e27874SAdam Thomson 3248e27874SAdam Thomson 3348e27874SAdam Thomson struct da732x_priv { 3448e27874SAdam Thomson struct regmap *regmap; 3548e27874SAdam Thomson 3648e27874SAdam Thomson unsigned int sysclk; 3748e27874SAdam Thomson bool pll_en; 3848e27874SAdam Thomson }; 3948e27874SAdam Thomson 4048e27874SAdam Thomson /* 4148e27874SAdam Thomson * da732x register cache - default settings 4248e27874SAdam Thomson */ 43c418a84aSAxel Lin static const struct reg_default da732x_reg_cache[] = { 4448e27874SAdam Thomson { DA732X_REG_REF1 , 0x02 }, 4548e27874SAdam Thomson { DA732X_REG_BIAS_EN , 0x80 }, 4648e27874SAdam Thomson { DA732X_REG_BIAS1 , 0x00 }, 4748e27874SAdam Thomson { DA732X_REG_BIAS2 , 0x00 }, 4848e27874SAdam Thomson { DA732X_REG_BIAS3 , 0x00 }, 4948e27874SAdam Thomson { DA732X_REG_BIAS4 , 0x00 }, 5048e27874SAdam Thomson { DA732X_REG_MICBIAS2 , 0x00 }, 5148e27874SAdam Thomson { DA732X_REG_MICBIAS1 , 0x00 }, 5248e27874SAdam Thomson { DA732X_REG_MICDET , 0x00 }, 5348e27874SAdam Thomson { DA732X_REG_MIC1_PRE , 0x01 }, 5448e27874SAdam Thomson { DA732X_REG_MIC1 , 0x40 }, 5548e27874SAdam Thomson { DA732X_REG_MIC2_PRE , 0x01 }, 5648e27874SAdam Thomson { DA732X_REG_MIC2 , 0x40 }, 5748e27874SAdam Thomson { DA732X_REG_AUX1L , 0x75 }, 5848e27874SAdam Thomson { DA732X_REG_AUX1R , 0x75 }, 5948e27874SAdam Thomson { DA732X_REG_MIC3_PRE , 0x01 }, 6048e27874SAdam Thomson { DA732X_REG_MIC3 , 0x40 }, 6148e27874SAdam Thomson { DA732X_REG_INP_PINBIAS , 0x00 }, 6248e27874SAdam Thomson { DA732X_REG_INP_ZC_EN , 0x00 }, 6348e27874SAdam Thomson { DA732X_REG_INP_MUX , 0x50 }, 6448e27874SAdam Thomson { DA732X_REG_HP_DET , 0x00 }, 6548e27874SAdam Thomson { DA732X_REG_HPL_DAC_OFFSET , 0x00 }, 6648e27874SAdam Thomson { DA732X_REG_HPL_DAC_OFF_CNTL , 0x00 }, 6748e27874SAdam Thomson { DA732X_REG_HPL_OUT_OFFSET , 0x00 }, 6848e27874SAdam Thomson { DA732X_REG_HPL , 0x40 }, 6948e27874SAdam Thomson { DA732X_REG_HPL_VOL , 0x0F }, 7048e27874SAdam Thomson { DA732X_REG_HPR_DAC_OFFSET , 0x00 }, 7148e27874SAdam Thomson { DA732X_REG_HPR_DAC_OFF_CNTL , 0x00 }, 7248e27874SAdam Thomson { DA732X_REG_HPR_OUT_OFFSET , 0x00 }, 7348e27874SAdam Thomson { DA732X_REG_HPR , 0x40 }, 7448e27874SAdam Thomson { DA732X_REG_HPR_VOL , 0x0F }, 7548e27874SAdam Thomson { DA732X_REG_LIN2 , 0x4F }, 7648e27874SAdam Thomson { DA732X_REG_LIN3 , 0x4F }, 7748e27874SAdam Thomson { DA732X_REG_LIN4 , 0x4F }, 7848e27874SAdam Thomson { DA732X_REG_OUT_ZC_EN , 0x00 }, 7948e27874SAdam Thomson { DA732X_REG_HP_LIN1_GNDSEL , 0x00 }, 8048e27874SAdam Thomson { DA732X_REG_CP_HP1 , 0x0C }, 8148e27874SAdam Thomson { DA732X_REG_CP_HP2 , 0x03 }, 8248e27874SAdam Thomson { DA732X_REG_CP_CTRL1 , 0x00 }, 8348e27874SAdam Thomson { DA732X_REG_CP_CTRL2 , 0x99 }, 8448e27874SAdam Thomson { DA732X_REG_CP_CTRL3 , 0x25 }, 8548e27874SAdam Thomson { DA732X_REG_CP_LEVEL_MASK , 0x3F }, 8648e27874SAdam Thomson { DA732X_REG_CP_DET , 0x00 }, 8748e27874SAdam Thomson { DA732X_REG_CP_STATUS , 0x00 }, 8848e27874SAdam Thomson { DA732X_REG_CP_THRESH1 , 0x00 }, 8948e27874SAdam Thomson { DA732X_REG_CP_THRESH2 , 0x00 }, 9048e27874SAdam Thomson { DA732X_REG_CP_THRESH3 , 0x00 }, 9148e27874SAdam Thomson { DA732X_REG_CP_THRESH4 , 0x00 }, 9248e27874SAdam Thomson { DA732X_REG_CP_THRESH5 , 0x00 }, 9348e27874SAdam Thomson { DA732X_REG_CP_THRESH6 , 0x00 }, 9448e27874SAdam Thomson { DA732X_REG_CP_THRESH7 , 0x00 }, 9548e27874SAdam Thomson { DA732X_REG_CP_THRESH8 , 0x00 }, 9648e27874SAdam Thomson { DA732X_REG_PLL_DIV_LO , 0x00 }, 9748e27874SAdam Thomson { DA732X_REG_PLL_DIV_MID , 0x00 }, 9848e27874SAdam Thomson { DA732X_REG_PLL_DIV_HI , 0x00 }, 9948e27874SAdam Thomson { DA732X_REG_PLL_CTRL , 0x02 }, 10048e27874SAdam Thomson { DA732X_REG_CLK_CTRL , 0xaa }, 10148e27874SAdam Thomson { DA732X_REG_CLK_DSP , 0x07 }, 10248e27874SAdam Thomson { DA732X_REG_CLK_EN1 , 0x00 }, 10348e27874SAdam Thomson { DA732X_REG_CLK_EN2 , 0x00 }, 10448e27874SAdam Thomson { DA732X_REG_CLK_EN3 , 0x00 }, 10548e27874SAdam Thomson { DA732X_REG_CLK_EN4 , 0x00 }, 10648e27874SAdam Thomson { DA732X_REG_CLK_EN5 , 0x00 }, 10748e27874SAdam Thomson { DA732X_REG_AIF_MCLK , 0x00 }, 10848e27874SAdam Thomson { DA732X_REG_AIFA1 , 0x02 }, 10948e27874SAdam Thomson { DA732X_REG_AIFA2 , 0x00 }, 11048e27874SAdam Thomson { DA732X_REG_AIFA3 , 0x08 }, 11148e27874SAdam Thomson { DA732X_REG_AIFB1 , 0x02 }, 11248e27874SAdam Thomson { DA732X_REG_AIFB2 , 0x00 }, 11348e27874SAdam Thomson { DA732X_REG_AIFB3 , 0x08 }, 11448e27874SAdam Thomson { DA732X_REG_PC_CTRL , 0xC0 }, 11548e27874SAdam Thomson { DA732X_REG_DATA_ROUTE , 0x00 }, 11648e27874SAdam Thomson { DA732X_REG_DSP_CTRL , 0x00 }, 11748e27874SAdam Thomson { DA732X_REG_CIF_CTRL2 , 0x00 }, 11848e27874SAdam Thomson { DA732X_REG_HANDSHAKE , 0x00 }, 11948e27874SAdam Thomson { DA732X_REG_SPARE1_OUT , 0x00 }, 12048e27874SAdam Thomson { DA732X_REG_SPARE2_OUT , 0x00 }, 12148e27874SAdam Thomson { DA732X_REG_SPARE1_IN , 0x00 }, 12248e27874SAdam Thomson { DA732X_REG_ADC1_PD , 0x00 }, 12348e27874SAdam Thomson { DA732X_REG_ADC1_HPF , 0x00 }, 12448e27874SAdam Thomson { DA732X_REG_ADC1_SEL , 0x00 }, 12548e27874SAdam Thomson { DA732X_REG_ADC1_EQ12 , 0x00 }, 12648e27874SAdam Thomson { DA732X_REG_ADC1_EQ34 , 0x00 }, 12748e27874SAdam Thomson { DA732X_REG_ADC1_EQ5 , 0x00 }, 12848e27874SAdam Thomson { DA732X_REG_ADC2_PD , 0x00 }, 12948e27874SAdam Thomson { DA732X_REG_ADC2_HPF , 0x00 }, 13048e27874SAdam Thomson { DA732X_REG_ADC2_SEL , 0x00 }, 13148e27874SAdam Thomson { DA732X_REG_ADC2_EQ12 , 0x00 }, 13248e27874SAdam Thomson { DA732X_REG_ADC2_EQ34 , 0x00 }, 13348e27874SAdam Thomson { DA732X_REG_ADC2_EQ5 , 0x00 }, 13448e27874SAdam Thomson { DA732X_REG_DAC1_HPF , 0x00 }, 13548e27874SAdam Thomson { DA732X_REG_DAC1_L_VOL , 0x00 }, 13648e27874SAdam Thomson { DA732X_REG_DAC1_R_VOL , 0x00 }, 13748e27874SAdam Thomson { DA732X_REG_DAC1_SEL , 0x00 }, 13848e27874SAdam Thomson { DA732X_REG_DAC1_SOFTMUTE , 0x00 }, 13948e27874SAdam Thomson { DA732X_REG_DAC1_EQ12 , 0x00 }, 14048e27874SAdam Thomson { DA732X_REG_DAC1_EQ34 , 0x00 }, 14148e27874SAdam Thomson { DA732X_REG_DAC1_EQ5 , 0x00 }, 14248e27874SAdam Thomson { DA732X_REG_DAC2_HPF , 0x00 }, 14348e27874SAdam Thomson { DA732X_REG_DAC2_L_VOL , 0x00 }, 14448e27874SAdam Thomson { DA732X_REG_DAC2_R_VOL , 0x00 }, 14548e27874SAdam Thomson { DA732X_REG_DAC2_SEL , 0x00 }, 14648e27874SAdam Thomson { DA732X_REG_DAC2_SOFTMUTE , 0x00 }, 14748e27874SAdam Thomson { DA732X_REG_DAC2_EQ12 , 0x00 }, 14848e27874SAdam Thomson { DA732X_REG_DAC2_EQ34 , 0x00 }, 14948e27874SAdam Thomson { DA732X_REG_DAC2_EQ5 , 0x00 }, 15048e27874SAdam Thomson { DA732X_REG_DAC3_HPF , 0x00 }, 15148e27874SAdam Thomson { DA732X_REG_DAC3_VOL , 0x00 }, 15248e27874SAdam Thomson { DA732X_REG_DAC3_SEL , 0x00 }, 15348e27874SAdam Thomson { DA732X_REG_DAC3_SOFTMUTE , 0x00 }, 15448e27874SAdam Thomson { DA732X_REG_DAC3_EQ12 , 0x00 }, 15548e27874SAdam Thomson { DA732X_REG_DAC3_EQ34 , 0x00 }, 15648e27874SAdam Thomson { DA732X_REG_DAC3_EQ5 , 0x00 }, 15748e27874SAdam Thomson { DA732X_REG_BIQ_BYP , 0x00 }, 15848e27874SAdam Thomson { DA732X_REG_DMA_CMD , 0x00 }, 15948e27874SAdam Thomson { DA732X_REG_DMA_ADDR0 , 0x00 }, 16048e27874SAdam Thomson { DA732X_REG_DMA_ADDR1 , 0x00 }, 16148e27874SAdam Thomson { DA732X_REG_DMA_DATA0 , 0x00 }, 16248e27874SAdam Thomson { DA732X_REG_DMA_DATA1 , 0x00 }, 16348e27874SAdam Thomson { DA732X_REG_DMA_DATA2 , 0x00 }, 16448e27874SAdam Thomson { DA732X_REG_DMA_DATA3 , 0x00 }, 16548e27874SAdam Thomson { DA732X_REG_UNLOCK , 0x00 }, 16648e27874SAdam Thomson }; 16748e27874SAdam Thomson 168192ce2fbSKuninori Morimoto static inline int da732x_get_input_div(struct snd_soc_component *component, int sysclk) 16948e27874SAdam Thomson { 17048e27874SAdam Thomson int val; 17148e27874SAdam Thomson int ret; 17248e27874SAdam Thomson 17348e27874SAdam Thomson if (sysclk < DA732X_MCLK_10MHZ) { 17448e27874SAdam Thomson val = DA732X_MCLK_RET_0_10MHZ; 17548e27874SAdam Thomson ret = DA732X_MCLK_VAL_0_10MHZ; 17648e27874SAdam Thomson } else if ((sysclk >= DA732X_MCLK_10MHZ) && 17748e27874SAdam Thomson (sysclk < DA732X_MCLK_20MHZ)) { 17848e27874SAdam Thomson val = DA732X_MCLK_RET_10_20MHZ; 17948e27874SAdam Thomson ret = DA732X_MCLK_VAL_10_20MHZ; 18048e27874SAdam Thomson } else if ((sysclk >= DA732X_MCLK_20MHZ) && 18148e27874SAdam Thomson (sysclk < DA732X_MCLK_40MHZ)) { 18248e27874SAdam Thomson val = DA732X_MCLK_RET_20_40MHZ; 18348e27874SAdam Thomson ret = DA732X_MCLK_VAL_20_40MHZ; 18448e27874SAdam Thomson } else if ((sysclk >= DA732X_MCLK_40MHZ) && 18548e27874SAdam Thomson (sysclk <= DA732X_MCLK_54MHZ)) { 18648e27874SAdam Thomson val = DA732X_MCLK_RET_40_54MHZ; 18748e27874SAdam Thomson ret = DA732X_MCLK_VAL_40_54MHZ; 18848e27874SAdam Thomson } else { 18948e27874SAdam Thomson return -EINVAL; 19048e27874SAdam Thomson } 19148e27874SAdam Thomson 192192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_PLL_CTRL, val); 19348e27874SAdam Thomson 19448e27874SAdam Thomson return ret; 19548e27874SAdam Thomson } 19648e27874SAdam Thomson 197192ce2fbSKuninori Morimoto static void da732x_set_charge_pump(struct snd_soc_component *component, int state) 19848e27874SAdam Thomson { 19948e27874SAdam Thomson switch (state) { 20048e27874SAdam Thomson case DA732X_ENABLE_CP: 201192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_CLK_EN2, DA732X_CP_CLK_EN); 202192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_CP_HP2, DA732X_HP_CP_EN | 20348e27874SAdam Thomson DA732X_HP_CP_REG | DA732X_HP_CP_PULSESKIP); 204192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_CP_CTRL1, DA732X_CP_EN | 20548e27874SAdam Thomson DA732X_CP_CTRL_CPVDD1); 206192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_CP_CTRL2, 20748e27874SAdam Thomson DA732X_CP_MANAGE_MAGNITUDE | DA732X_CP_BOOST); 208192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_CP_CTRL3, DA732X_CP_1MHZ); 20948e27874SAdam Thomson break; 21048e27874SAdam Thomson case DA732X_DISABLE_CP: 211192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_CLK_EN2, DA732X_CP_CLK_DIS); 212192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_CP_HP2, DA732X_HP_CP_DIS); 213192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_CP_CTRL1, DA723X_CP_DIS); 21448e27874SAdam Thomson break; 21548e27874SAdam Thomson default: 216cd9241e4SMasanari Iida pr_err("Wrong charge pump state\n"); 21748e27874SAdam Thomson break; 21848e27874SAdam Thomson } 21948e27874SAdam Thomson } 22048e27874SAdam Thomson 22148e27874SAdam Thomson static const DECLARE_TLV_DB_SCALE(mic_boost_tlv, DA732X_MIC_PRE_VOL_DB_MIN, 22248e27874SAdam Thomson DA732X_MIC_PRE_VOL_DB_INC, 0); 22348e27874SAdam Thomson 22448e27874SAdam Thomson static const DECLARE_TLV_DB_SCALE(mic_pga_tlv, DA732X_MIC_VOL_DB_MIN, 22548e27874SAdam Thomson DA732X_MIC_VOL_DB_INC, 0); 22648e27874SAdam Thomson 22748e27874SAdam Thomson static const DECLARE_TLV_DB_SCALE(aux_pga_tlv, DA732X_AUX_VOL_DB_MIN, 22848e27874SAdam Thomson DA732X_AUX_VOL_DB_INC, 0); 22948e27874SAdam Thomson 23048e27874SAdam Thomson static const DECLARE_TLV_DB_SCALE(hp_pga_tlv, DA732X_HP_VOL_DB_MIN, 23148e27874SAdam Thomson DA732X_AUX_VOL_DB_INC, 0); 23248e27874SAdam Thomson 23348e27874SAdam Thomson static const DECLARE_TLV_DB_SCALE(lin2_pga_tlv, DA732X_LIN2_VOL_DB_MIN, 23448e27874SAdam Thomson DA732X_LIN2_VOL_DB_INC, 0); 23548e27874SAdam Thomson 23648e27874SAdam Thomson static const DECLARE_TLV_DB_SCALE(lin3_pga_tlv, DA732X_LIN3_VOL_DB_MIN, 23748e27874SAdam Thomson DA732X_LIN3_VOL_DB_INC, 0); 23848e27874SAdam Thomson 23948e27874SAdam Thomson static const DECLARE_TLV_DB_SCALE(lin4_pga_tlv, DA732X_LIN4_VOL_DB_MIN, 24048e27874SAdam Thomson DA732X_LIN4_VOL_DB_INC, 0); 24148e27874SAdam Thomson 24248e27874SAdam Thomson static const DECLARE_TLV_DB_SCALE(adc_pga_tlv, DA732X_ADC_VOL_DB_MIN, 24348e27874SAdam Thomson DA732X_ADC_VOL_DB_INC, 0); 24448e27874SAdam Thomson 24548e27874SAdam Thomson static const DECLARE_TLV_DB_SCALE(dac_pga_tlv, DA732X_DAC_VOL_DB_MIN, 24648e27874SAdam Thomson DA732X_DAC_VOL_DB_INC, 0); 24748e27874SAdam Thomson 24848e27874SAdam Thomson static const DECLARE_TLV_DB_SCALE(eq_band_pga_tlv, DA732X_EQ_BAND_VOL_DB_MIN, 24948e27874SAdam Thomson DA732X_EQ_BAND_VOL_DB_INC, 0); 25048e27874SAdam Thomson 25148e27874SAdam Thomson static const DECLARE_TLV_DB_SCALE(eq_overall_tlv, DA732X_EQ_OVERALL_VOL_DB_MIN, 25248e27874SAdam Thomson DA732X_EQ_OVERALL_VOL_DB_INC, 0); 25348e27874SAdam Thomson 25448e27874SAdam Thomson /* High Pass Filter */ 25548e27874SAdam Thomson static const char *da732x_hpf_mode[] = { 25648e27874SAdam Thomson "Disable", "Music", "Voice", 25748e27874SAdam Thomson }; 25848e27874SAdam Thomson 25948e27874SAdam Thomson static const char *da732x_hpf_music[] = { 26048e27874SAdam Thomson "1.8Hz", "3.75Hz", "7.5Hz", "15Hz", 26148e27874SAdam Thomson }; 26248e27874SAdam Thomson 26348e27874SAdam Thomson static const char *da732x_hpf_voice[] = { 26448e27874SAdam Thomson "2.5Hz", "25Hz", "50Hz", "100Hz", 26548e27874SAdam Thomson "150Hz", "200Hz", "300Hz", "400Hz" 26648e27874SAdam Thomson }; 26748e27874SAdam Thomson 2687e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_dac1_hpf_mode_enum, 2697e509108STakashi Iwai DA732X_REG_DAC1_HPF, DA732X_HPF_MODE_SHIFT, 2707e509108STakashi Iwai da732x_hpf_mode); 27148e27874SAdam Thomson 2727e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_dac2_hpf_mode_enum, 2737e509108STakashi Iwai DA732X_REG_DAC2_HPF, DA732X_HPF_MODE_SHIFT, 2747e509108STakashi Iwai da732x_hpf_mode); 27548e27874SAdam Thomson 2767e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_dac3_hpf_mode_enum, 2777e509108STakashi Iwai DA732X_REG_DAC3_HPF, DA732X_HPF_MODE_SHIFT, 2787e509108STakashi Iwai da732x_hpf_mode); 27948e27874SAdam Thomson 2807e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_adc1_hpf_mode_enum, 2817e509108STakashi Iwai DA732X_REG_ADC1_HPF, DA732X_HPF_MODE_SHIFT, 2827e509108STakashi Iwai da732x_hpf_mode); 28348e27874SAdam Thomson 2847e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_adc2_hpf_mode_enum, 2857e509108STakashi Iwai DA732X_REG_ADC2_HPF, DA732X_HPF_MODE_SHIFT, 2867e509108STakashi Iwai da732x_hpf_mode); 28748e27874SAdam Thomson 2887e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_dac1_hp_filter_enum, 2897e509108STakashi Iwai DA732X_REG_DAC1_HPF, DA732X_HPF_MUSIC_SHIFT, 2907e509108STakashi Iwai da732x_hpf_music); 29148e27874SAdam Thomson 2927e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_dac2_hp_filter_enum, 2937e509108STakashi Iwai DA732X_REG_DAC2_HPF, DA732X_HPF_MUSIC_SHIFT, 2947e509108STakashi Iwai da732x_hpf_music); 29548e27874SAdam Thomson 2967e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_dac3_hp_filter_enum, 2977e509108STakashi Iwai DA732X_REG_DAC3_HPF, DA732X_HPF_MUSIC_SHIFT, 2987e509108STakashi Iwai da732x_hpf_music); 29948e27874SAdam Thomson 3007e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_adc1_hp_filter_enum, 3017e509108STakashi Iwai DA732X_REG_ADC1_HPF, DA732X_HPF_MUSIC_SHIFT, 3027e509108STakashi Iwai da732x_hpf_music); 30348e27874SAdam Thomson 3047e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_adc2_hp_filter_enum, 3057e509108STakashi Iwai DA732X_REG_ADC2_HPF, DA732X_HPF_MUSIC_SHIFT, 3067e509108STakashi Iwai da732x_hpf_music); 30748e27874SAdam Thomson 3087e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_dac1_voice_filter_enum, 3097e509108STakashi Iwai DA732X_REG_DAC1_HPF, DA732X_HPF_VOICE_SHIFT, 3107e509108STakashi Iwai da732x_hpf_voice); 31148e27874SAdam Thomson 3127e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_dac2_voice_filter_enum, 3137e509108STakashi Iwai DA732X_REG_DAC2_HPF, DA732X_HPF_VOICE_SHIFT, 3147e509108STakashi Iwai da732x_hpf_voice); 31548e27874SAdam Thomson 3167e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_dac3_voice_filter_enum, 3177e509108STakashi Iwai DA732X_REG_DAC3_HPF, DA732X_HPF_VOICE_SHIFT, 3187e509108STakashi Iwai da732x_hpf_voice); 31948e27874SAdam Thomson 3207e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_adc1_voice_filter_enum, 3217e509108STakashi Iwai DA732X_REG_ADC1_HPF, DA732X_HPF_VOICE_SHIFT, 3227e509108STakashi Iwai da732x_hpf_voice); 32348e27874SAdam Thomson 3247e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_adc2_voice_filter_enum, 3257e509108STakashi Iwai DA732X_REG_ADC2_HPF, DA732X_HPF_VOICE_SHIFT, 3267e509108STakashi Iwai da732x_hpf_voice); 32748e27874SAdam Thomson 32848e27874SAdam Thomson static int da732x_hpf_set(struct snd_kcontrol *kcontrol, 32948e27874SAdam Thomson struct snd_ctl_elem_value *ucontrol) 33048e27874SAdam Thomson { 331192ce2fbSKuninori Morimoto struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 33248e27874SAdam Thomson struct soc_enum *enum_ctrl = (struct soc_enum *)kcontrol->private_value; 33348e27874SAdam Thomson unsigned int reg = enum_ctrl->reg; 334fe9aba13STakashi Iwai unsigned int sel = ucontrol->value.enumerated.item[0]; 33548e27874SAdam Thomson unsigned int bits; 33648e27874SAdam Thomson 33748e27874SAdam Thomson switch (sel) { 33848e27874SAdam Thomson case DA732X_HPF_DISABLED: 33948e27874SAdam Thomson bits = DA732X_HPF_DIS; 34048e27874SAdam Thomson break; 34148e27874SAdam Thomson case DA732X_HPF_VOICE: 34248e27874SAdam Thomson bits = DA732X_HPF_VOICE_EN; 34348e27874SAdam Thomson break; 34448e27874SAdam Thomson case DA732X_HPF_MUSIC: 34548e27874SAdam Thomson bits = DA732X_HPF_MUSIC_EN; 34648e27874SAdam Thomson break; 34748e27874SAdam Thomson default: 34848e27874SAdam Thomson return -EINVAL; 34948e27874SAdam Thomson } 35048e27874SAdam Thomson 351192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, reg, DA732X_HPF_MASK, bits); 35248e27874SAdam Thomson 35348e27874SAdam Thomson return 0; 35448e27874SAdam Thomson } 35548e27874SAdam Thomson 35648e27874SAdam Thomson static int da732x_hpf_get(struct snd_kcontrol *kcontrol, 35748e27874SAdam Thomson struct snd_ctl_elem_value *ucontrol) 35848e27874SAdam Thomson { 359192ce2fbSKuninori Morimoto struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 36048e27874SAdam Thomson struct soc_enum *enum_ctrl = (struct soc_enum *)kcontrol->private_value; 36148e27874SAdam Thomson unsigned int reg = enum_ctrl->reg; 36248e27874SAdam Thomson int val; 36348e27874SAdam Thomson 364*2925b582SKuninori Morimoto val = snd_soc_component_read(component, reg) & DA732X_HPF_MASK; 36548e27874SAdam Thomson 36648e27874SAdam Thomson switch (val) { 36748e27874SAdam Thomson case DA732X_HPF_VOICE_EN: 368fe9aba13STakashi Iwai ucontrol->value.enumerated.item[0] = DA732X_HPF_VOICE; 36948e27874SAdam Thomson break; 37048e27874SAdam Thomson case DA732X_HPF_MUSIC_EN: 371fe9aba13STakashi Iwai ucontrol->value.enumerated.item[0] = DA732X_HPF_MUSIC; 37248e27874SAdam Thomson break; 37348e27874SAdam Thomson default: 374fe9aba13STakashi Iwai ucontrol->value.enumerated.item[0] = DA732X_HPF_DISABLED; 37548e27874SAdam Thomson break; 37648e27874SAdam Thomson } 37748e27874SAdam Thomson 37848e27874SAdam Thomson return 0; 37948e27874SAdam Thomson } 38048e27874SAdam Thomson 38148e27874SAdam Thomson static const struct snd_kcontrol_new da732x_snd_controls[] = { 38248e27874SAdam Thomson /* Input PGAs */ 38348e27874SAdam Thomson SOC_SINGLE_RANGE_TLV("MIC1 Boost Volume", DA732X_REG_MIC1_PRE, 38448e27874SAdam Thomson DA732X_MICBOOST_SHIFT, DA732X_MICBOOST_MIN, 38548e27874SAdam Thomson DA732X_MICBOOST_MAX, 0, mic_boost_tlv), 38648e27874SAdam Thomson SOC_SINGLE_RANGE_TLV("MIC2 Boost Volume", DA732X_REG_MIC2_PRE, 38748e27874SAdam Thomson DA732X_MICBOOST_SHIFT, DA732X_MICBOOST_MIN, 38848e27874SAdam Thomson DA732X_MICBOOST_MAX, 0, mic_boost_tlv), 38948e27874SAdam Thomson SOC_SINGLE_RANGE_TLV("MIC3 Boost Volume", DA732X_REG_MIC3_PRE, 39048e27874SAdam Thomson DA732X_MICBOOST_SHIFT, DA732X_MICBOOST_MIN, 39148e27874SAdam Thomson DA732X_MICBOOST_MAX, 0, mic_boost_tlv), 39248e27874SAdam Thomson 39348e27874SAdam Thomson /* MICs */ 39448e27874SAdam Thomson SOC_SINGLE("MIC1 Switch", DA732X_REG_MIC1, DA732X_MIC_MUTE_SHIFT, 39548e27874SAdam Thomson DA732X_SWITCH_MAX, DA732X_INVERT), 39648e27874SAdam Thomson SOC_SINGLE_RANGE_TLV("MIC1 Volume", DA732X_REG_MIC1, 39748e27874SAdam Thomson DA732X_MIC_VOL_SHIFT, DA732X_MIC_VOL_VAL_MIN, 39848e27874SAdam Thomson DA732X_MIC_VOL_VAL_MAX, 0, mic_pga_tlv), 39948e27874SAdam Thomson SOC_SINGLE("MIC2 Switch", DA732X_REG_MIC2, DA732X_MIC_MUTE_SHIFT, 40048e27874SAdam Thomson DA732X_SWITCH_MAX, DA732X_INVERT), 40148e27874SAdam Thomson SOC_SINGLE_RANGE_TLV("MIC2 Volume", DA732X_REG_MIC2, 40248e27874SAdam Thomson DA732X_MIC_VOL_SHIFT, DA732X_MIC_VOL_VAL_MIN, 40348e27874SAdam Thomson DA732X_MIC_VOL_VAL_MAX, 0, mic_pga_tlv), 40448e27874SAdam Thomson SOC_SINGLE("MIC3 Switch", DA732X_REG_MIC3, DA732X_MIC_MUTE_SHIFT, 40548e27874SAdam Thomson DA732X_SWITCH_MAX, DA732X_INVERT), 40648e27874SAdam Thomson SOC_SINGLE_RANGE_TLV("MIC3 Volume", DA732X_REG_MIC3, 40748e27874SAdam Thomson DA732X_MIC_VOL_SHIFT, DA732X_MIC_VOL_VAL_MIN, 40848e27874SAdam Thomson DA732X_MIC_VOL_VAL_MAX, 0, mic_pga_tlv), 40948e27874SAdam Thomson 41048e27874SAdam Thomson /* AUXs */ 41148e27874SAdam Thomson SOC_SINGLE("AUX1L Switch", DA732X_REG_AUX1L, DA732X_AUX_MUTE_SHIFT, 41248e27874SAdam Thomson DA732X_SWITCH_MAX, DA732X_INVERT), 41348e27874SAdam Thomson SOC_SINGLE_TLV("AUX1L Volume", DA732X_REG_AUX1L, 41448e27874SAdam Thomson DA732X_AUX_VOL_SHIFT, DA732X_AUX_VOL_VAL_MAX, 41548e27874SAdam Thomson DA732X_NO_INVERT, aux_pga_tlv), 41648e27874SAdam Thomson SOC_SINGLE("AUX1R Switch", DA732X_REG_AUX1R, DA732X_AUX_MUTE_SHIFT, 41748e27874SAdam Thomson DA732X_SWITCH_MAX, DA732X_INVERT), 41848e27874SAdam Thomson SOC_SINGLE_TLV("AUX1R Volume", DA732X_REG_AUX1R, 41948e27874SAdam Thomson DA732X_AUX_VOL_SHIFT, DA732X_AUX_VOL_VAL_MAX, 42048e27874SAdam Thomson DA732X_NO_INVERT, aux_pga_tlv), 42148e27874SAdam Thomson 42248e27874SAdam Thomson /* ADCs */ 42348e27874SAdam Thomson SOC_DOUBLE_TLV("ADC1 Volume", DA732X_REG_ADC1_SEL, 42448e27874SAdam Thomson DA732X_ADCL_VOL_SHIFT, DA732X_ADCR_VOL_SHIFT, 42548e27874SAdam Thomson DA732X_ADC_VOL_VAL_MAX, DA732X_INVERT, adc_pga_tlv), 42648e27874SAdam Thomson 42748e27874SAdam Thomson SOC_DOUBLE_TLV("ADC2 Volume", DA732X_REG_ADC2_SEL, 42848e27874SAdam Thomson DA732X_ADCL_VOL_SHIFT, DA732X_ADCR_VOL_SHIFT, 42948e27874SAdam Thomson DA732X_ADC_VOL_VAL_MAX, DA732X_INVERT, adc_pga_tlv), 43048e27874SAdam Thomson 43148e27874SAdam Thomson /* DACs */ 43248e27874SAdam Thomson SOC_DOUBLE("Digital Playback DAC12 Switch", DA732X_REG_DAC1_SEL, 43348e27874SAdam Thomson DA732X_DACL_MUTE_SHIFT, DA732X_DACR_MUTE_SHIFT, 43448e27874SAdam Thomson DA732X_SWITCH_MAX, DA732X_INVERT), 43548e27874SAdam Thomson SOC_DOUBLE_R_TLV("Digital Playback DAC12 Volume", DA732X_REG_DAC1_L_VOL, 43648e27874SAdam Thomson DA732X_REG_DAC1_R_VOL, DA732X_DAC_VOL_SHIFT, 43748e27874SAdam Thomson DA732X_DAC_VOL_VAL_MAX, DA732X_INVERT, dac_pga_tlv), 43848e27874SAdam Thomson SOC_SINGLE("Digital Playback DAC3 Switch", DA732X_REG_DAC2_SEL, 43948e27874SAdam Thomson DA732X_DACL_MUTE_SHIFT, DA732X_SWITCH_MAX, DA732X_INVERT), 44048e27874SAdam Thomson SOC_SINGLE_TLV("Digital Playback DAC3 Volume", DA732X_REG_DAC2_L_VOL, 44148e27874SAdam Thomson DA732X_DAC_VOL_SHIFT, DA732X_DAC_VOL_VAL_MAX, 44248e27874SAdam Thomson DA732X_INVERT, dac_pga_tlv), 44348e27874SAdam Thomson SOC_SINGLE("Digital Playback DAC4 Switch", DA732X_REG_DAC2_SEL, 44448e27874SAdam Thomson DA732X_DACR_MUTE_SHIFT, DA732X_SWITCH_MAX, DA732X_INVERT), 44548e27874SAdam Thomson SOC_SINGLE_TLV("Digital Playback DAC4 Volume", DA732X_REG_DAC2_R_VOL, 44648e27874SAdam Thomson DA732X_DAC_VOL_SHIFT, DA732X_DAC_VOL_VAL_MAX, 44748e27874SAdam Thomson DA732X_INVERT, dac_pga_tlv), 44848e27874SAdam Thomson SOC_SINGLE("Digital Playback DAC5 Switch", DA732X_REG_DAC3_SEL, 44948e27874SAdam Thomson DA732X_DACL_MUTE_SHIFT, DA732X_SWITCH_MAX, DA732X_INVERT), 45048e27874SAdam Thomson SOC_SINGLE_TLV("Digital Playback DAC5 Volume", DA732X_REG_DAC3_VOL, 45148e27874SAdam Thomson DA732X_DAC_VOL_SHIFT, DA732X_DAC_VOL_VAL_MAX, 45248e27874SAdam Thomson DA732X_INVERT, dac_pga_tlv), 45348e27874SAdam Thomson 45448e27874SAdam Thomson /* High Pass Filters */ 45548e27874SAdam Thomson SOC_ENUM_EXT("DAC1 High Pass Filter Mode", 45648e27874SAdam Thomson da732x_dac1_hpf_mode_enum, da732x_hpf_get, da732x_hpf_set), 45748e27874SAdam Thomson SOC_ENUM("DAC1 High Pass Filter", da732x_dac1_hp_filter_enum), 45848e27874SAdam Thomson SOC_ENUM("DAC1 Voice Filter", da732x_dac1_voice_filter_enum), 45948e27874SAdam Thomson 46048e27874SAdam Thomson SOC_ENUM_EXT("DAC2 High Pass Filter Mode", 46148e27874SAdam Thomson da732x_dac2_hpf_mode_enum, da732x_hpf_get, da732x_hpf_set), 46248e27874SAdam Thomson SOC_ENUM("DAC2 High Pass Filter", da732x_dac2_hp_filter_enum), 46348e27874SAdam Thomson SOC_ENUM("DAC2 Voice Filter", da732x_dac2_voice_filter_enum), 46448e27874SAdam Thomson 46548e27874SAdam Thomson SOC_ENUM_EXT("DAC3 High Pass Filter Mode", 46648e27874SAdam Thomson da732x_dac3_hpf_mode_enum, da732x_hpf_get, da732x_hpf_set), 46748e27874SAdam Thomson SOC_ENUM("DAC3 High Pass Filter", da732x_dac3_hp_filter_enum), 46848e27874SAdam Thomson SOC_ENUM("DAC3 Filter Mode", da732x_dac3_voice_filter_enum), 46948e27874SAdam Thomson 47048e27874SAdam Thomson SOC_ENUM_EXT("ADC1 High Pass Filter Mode", 47148e27874SAdam Thomson da732x_adc1_hpf_mode_enum, da732x_hpf_get, da732x_hpf_set), 47248e27874SAdam Thomson SOC_ENUM("ADC1 High Pass Filter", da732x_adc1_hp_filter_enum), 47348e27874SAdam Thomson SOC_ENUM("ADC1 Voice Filter", da732x_adc1_voice_filter_enum), 47448e27874SAdam Thomson 47548e27874SAdam Thomson SOC_ENUM_EXT("ADC2 High Pass Filter Mode", 47648e27874SAdam Thomson da732x_adc2_hpf_mode_enum, da732x_hpf_get, da732x_hpf_set), 47748e27874SAdam Thomson SOC_ENUM("ADC2 High Pass Filter", da732x_adc2_hp_filter_enum), 47848e27874SAdam Thomson SOC_ENUM("ADC2 Voice Filter", da732x_adc2_voice_filter_enum), 47948e27874SAdam Thomson 48048e27874SAdam Thomson /* Equalizers */ 48148e27874SAdam Thomson SOC_SINGLE("ADC1 EQ Switch", DA732X_REG_ADC1_EQ5, 48248e27874SAdam Thomson DA732X_EQ_EN_SHIFT, DA732X_EQ_EN_MAX, DA732X_NO_INVERT), 48348e27874SAdam Thomson SOC_SINGLE_TLV("ADC1 EQ Band 1 Volume", DA732X_REG_ADC1_EQ12, 48448e27874SAdam Thomson DA732X_EQ_BAND1_SHIFT, DA732X_EQ_VOL_VAL_MAX, 48548e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 48648e27874SAdam Thomson SOC_SINGLE_TLV("ADC1 EQ Band 2 Volume", DA732X_REG_ADC1_EQ12, 48748e27874SAdam Thomson DA732X_EQ_BAND2_SHIFT, DA732X_EQ_VOL_VAL_MAX, 48848e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 48948e27874SAdam Thomson SOC_SINGLE_TLV("ADC1 EQ Band 3 Volume", DA732X_REG_ADC1_EQ34, 49048e27874SAdam Thomson DA732X_EQ_BAND3_SHIFT, DA732X_EQ_VOL_VAL_MAX, 49148e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 49248e27874SAdam Thomson SOC_SINGLE_TLV("ADC1 EQ Band 4 Volume", DA732X_REG_ADC1_EQ34, 49348e27874SAdam Thomson DA732X_EQ_BAND4_SHIFT, DA732X_EQ_VOL_VAL_MAX, 49448e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 49548e27874SAdam Thomson SOC_SINGLE_TLV("ADC1 EQ Band 5 Volume", DA732X_REG_ADC1_EQ5, 49648e27874SAdam Thomson DA732X_EQ_BAND5_SHIFT, DA732X_EQ_VOL_VAL_MAX, 49748e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 49848e27874SAdam Thomson SOC_SINGLE_TLV("ADC1 EQ Overall Volume", DA732X_REG_ADC1_EQ5, 49948e27874SAdam Thomson DA732X_EQ_OVERALL_SHIFT, DA732X_EQ_OVERALL_VOL_VAL_MAX, 50048e27874SAdam Thomson DA732X_INVERT, eq_overall_tlv), 50148e27874SAdam Thomson 50248e27874SAdam Thomson SOC_SINGLE("ADC2 EQ Switch", DA732X_REG_ADC2_EQ5, 50348e27874SAdam Thomson DA732X_EQ_EN_SHIFT, DA732X_EQ_EN_MAX, DA732X_NO_INVERT), 50448e27874SAdam Thomson SOC_SINGLE_TLV("ADC2 EQ Band 1 Volume", DA732X_REG_ADC2_EQ12, 50548e27874SAdam Thomson DA732X_EQ_BAND1_SHIFT, DA732X_EQ_VOL_VAL_MAX, 50648e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 50748e27874SAdam Thomson SOC_SINGLE_TLV("ADC2 EQ Band 2 Volume", DA732X_REG_ADC2_EQ12, 50848e27874SAdam Thomson DA732X_EQ_BAND2_SHIFT, DA732X_EQ_VOL_VAL_MAX, 50948e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 51048e27874SAdam Thomson SOC_SINGLE_TLV("ADC2 EQ Band 3 Volume", DA732X_REG_ADC2_EQ34, 51148e27874SAdam Thomson DA732X_EQ_BAND3_SHIFT, DA732X_EQ_VOL_VAL_MAX, 51248e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 51348e27874SAdam Thomson SOC_SINGLE_TLV("ACD2 EQ Band 4 Volume", DA732X_REG_ADC2_EQ34, 51448e27874SAdam Thomson DA732X_EQ_BAND4_SHIFT, DA732X_EQ_VOL_VAL_MAX, 51548e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 51648e27874SAdam Thomson SOC_SINGLE_TLV("ACD2 EQ Band 5 Volume", DA732X_REG_ADC2_EQ5, 51748e27874SAdam Thomson DA732X_EQ_BAND5_SHIFT, DA732X_EQ_VOL_VAL_MAX, 51848e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 51948e27874SAdam Thomson SOC_SINGLE_TLV("ADC2 EQ Overall Volume", DA732X_REG_ADC1_EQ5, 52048e27874SAdam Thomson DA732X_EQ_OVERALL_SHIFT, DA732X_EQ_OVERALL_VOL_VAL_MAX, 52148e27874SAdam Thomson DA732X_INVERT, eq_overall_tlv), 52248e27874SAdam Thomson 52348e27874SAdam Thomson SOC_SINGLE("DAC1 EQ Switch", DA732X_REG_DAC1_EQ5, 52448e27874SAdam Thomson DA732X_EQ_EN_SHIFT, DA732X_EQ_EN_MAX, DA732X_NO_INVERT), 52548e27874SAdam Thomson SOC_SINGLE_TLV("DAC1 EQ Band 1 Volume", DA732X_REG_DAC1_EQ12, 52648e27874SAdam Thomson DA732X_EQ_BAND1_SHIFT, DA732X_EQ_VOL_VAL_MAX, 52748e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 52848e27874SAdam Thomson SOC_SINGLE_TLV("DAC1 EQ Band 2 Volume", DA732X_REG_DAC1_EQ12, 52948e27874SAdam Thomson DA732X_EQ_BAND2_SHIFT, DA732X_EQ_VOL_VAL_MAX, 53048e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 53148e27874SAdam Thomson SOC_SINGLE_TLV("DAC1 EQ Band 3 Volume", DA732X_REG_DAC1_EQ34, 53248e27874SAdam Thomson DA732X_EQ_BAND3_SHIFT, DA732X_EQ_VOL_VAL_MAX, 53348e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 53448e27874SAdam Thomson SOC_SINGLE_TLV("DAC1 EQ Band 4 Volume", DA732X_REG_DAC1_EQ34, 53548e27874SAdam Thomson DA732X_EQ_BAND4_SHIFT, DA732X_EQ_VOL_VAL_MAX, 53648e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 53748e27874SAdam Thomson SOC_SINGLE_TLV("DAC1 EQ Band 5 Volume", DA732X_REG_DAC1_EQ5, 53848e27874SAdam Thomson DA732X_EQ_BAND5_SHIFT, DA732X_EQ_VOL_VAL_MAX, 53948e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 54048e27874SAdam Thomson 54148e27874SAdam Thomson SOC_SINGLE("DAC2 EQ Switch", DA732X_REG_DAC2_EQ5, 54248e27874SAdam Thomson DA732X_EQ_EN_SHIFT, DA732X_EQ_EN_MAX, DA732X_NO_INVERT), 54348e27874SAdam Thomson SOC_SINGLE_TLV("DAC2 EQ Band 1 Volume", DA732X_REG_DAC2_EQ12, 54448e27874SAdam Thomson DA732X_EQ_BAND1_SHIFT, DA732X_EQ_VOL_VAL_MAX, 54548e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 54648e27874SAdam Thomson SOC_SINGLE_TLV("DAC2 EQ Band 2 Volume", DA732X_REG_DAC2_EQ12, 54748e27874SAdam Thomson DA732X_EQ_BAND2_SHIFT, DA732X_EQ_VOL_VAL_MAX, 54848e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 54948e27874SAdam Thomson SOC_SINGLE_TLV("DAC2 EQ Band 3 Volume", DA732X_REG_DAC2_EQ34, 55048e27874SAdam Thomson DA732X_EQ_BAND3_SHIFT, DA732X_EQ_VOL_VAL_MAX, 55148e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 55248e27874SAdam Thomson SOC_SINGLE_TLV("DAC2 EQ Band 4 Volume", DA732X_REG_DAC2_EQ34, 55348e27874SAdam Thomson DA732X_EQ_BAND4_SHIFT, DA732X_EQ_VOL_VAL_MAX, 55448e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 55548e27874SAdam Thomson SOC_SINGLE_TLV("DAC2 EQ Band 5 Volume", DA732X_REG_DAC2_EQ5, 55648e27874SAdam Thomson DA732X_EQ_BAND5_SHIFT, DA732X_EQ_VOL_VAL_MAX, 55748e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 55848e27874SAdam Thomson 55948e27874SAdam Thomson SOC_SINGLE("DAC3 EQ Switch", DA732X_REG_DAC3_EQ5, 56048e27874SAdam Thomson DA732X_EQ_EN_SHIFT, DA732X_EQ_EN_MAX, DA732X_NO_INVERT), 56148e27874SAdam Thomson SOC_SINGLE_TLV("DAC3 EQ Band 1 Volume", DA732X_REG_DAC3_EQ12, 56248e27874SAdam Thomson DA732X_EQ_BAND1_SHIFT, DA732X_EQ_VOL_VAL_MAX, 56348e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 56448e27874SAdam Thomson SOC_SINGLE_TLV("DAC3 EQ Band 2 Volume", DA732X_REG_DAC3_EQ12, 56548e27874SAdam Thomson DA732X_EQ_BAND2_SHIFT, DA732X_EQ_VOL_VAL_MAX, 56648e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 56748e27874SAdam Thomson SOC_SINGLE_TLV("DAC3 EQ Band 3 Volume", DA732X_REG_DAC3_EQ34, 56848e27874SAdam Thomson DA732X_EQ_BAND3_SHIFT, DA732X_EQ_VOL_VAL_MAX, 56948e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 57048e27874SAdam Thomson SOC_SINGLE_TLV("DAC3 EQ Band 4 Volume", DA732X_REG_DAC3_EQ34, 57148e27874SAdam Thomson DA732X_EQ_BAND4_SHIFT, DA732X_EQ_VOL_VAL_MAX, 57248e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 57348e27874SAdam Thomson SOC_SINGLE_TLV("DAC3 EQ Band 5 Volume", DA732X_REG_DAC3_EQ5, 57448e27874SAdam Thomson DA732X_EQ_BAND5_SHIFT, DA732X_EQ_VOL_VAL_MAX, 57548e27874SAdam Thomson DA732X_INVERT, eq_band_pga_tlv), 57648e27874SAdam Thomson 57748e27874SAdam Thomson /* Lineout 2 Reciever*/ 57848e27874SAdam Thomson SOC_SINGLE("Lineout 2 Switch", DA732X_REG_LIN2, DA732X_LOUT_MUTE_SHIFT, 57948e27874SAdam Thomson DA732X_SWITCH_MAX, DA732X_INVERT), 58048e27874SAdam Thomson SOC_SINGLE_TLV("Lineout 2 Volume", DA732X_REG_LIN2, 58148e27874SAdam Thomson DA732X_LOUT_VOL_SHIFT, DA732X_LOUT_VOL_VAL_MAX, 58248e27874SAdam Thomson DA732X_NO_INVERT, lin2_pga_tlv), 58348e27874SAdam Thomson 58448e27874SAdam Thomson /* Lineout 3 SPEAKER*/ 58548e27874SAdam Thomson SOC_SINGLE("Lineout 3 Switch", DA732X_REG_LIN3, DA732X_LOUT_MUTE_SHIFT, 58648e27874SAdam Thomson DA732X_SWITCH_MAX, DA732X_INVERT), 58748e27874SAdam Thomson SOC_SINGLE_TLV("Lineout 3 Volume", DA732X_REG_LIN3, 58848e27874SAdam Thomson DA732X_LOUT_VOL_SHIFT, DA732X_LOUT_VOL_VAL_MAX, 58948e27874SAdam Thomson DA732X_NO_INVERT, lin3_pga_tlv), 59048e27874SAdam Thomson 59148e27874SAdam Thomson /* Lineout 4 */ 59248e27874SAdam Thomson SOC_SINGLE("Lineout 4 Switch", DA732X_REG_LIN4, DA732X_LOUT_MUTE_SHIFT, 59348e27874SAdam Thomson DA732X_SWITCH_MAX, DA732X_INVERT), 59448e27874SAdam Thomson SOC_SINGLE_TLV("Lineout 4 Volume", DA732X_REG_LIN4, 59548e27874SAdam Thomson DA732X_LOUT_VOL_SHIFT, DA732X_LOUT_VOL_VAL_MAX, 59648e27874SAdam Thomson DA732X_NO_INVERT, lin4_pga_tlv), 59748e27874SAdam Thomson 59848e27874SAdam Thomson /* Headphones */ 59948e27874SAdam Thomson SOC_DOUBLE_R("Headphone Switch", DA732X_REG_HPR, DA732X_REG_HPL, 60048e27874SAdam Thomson DA732X_HP_MUTE_SHIFT, DA732X_SWITCH_MAX, DA732X_INVERT), 60148e27874SAdam Thomson SOC_DOUBLE_R_TLV("Headphone Volume", DA732X_REG_HPL_VOL, 60248e27874SAdam Thomson DA732X_REG_HPR_VOL, DA732X_HP_VOL_SHIFT, 60348e27874SAdam Thomson DA732X_HP_VOL_VAL_MAX, DA732X_NO_INVERT, hp_pga_tlv), 60448e27874SAdam Thomson }; 60548e27874SAdam Thomson 60648e27874SAdam Thomson static int da732x_adc_event(struct snd_soc_dapm_widget *w, 60748e27874SAdam Thomson struct snd_kcontrol *kcontrol, int event) 60848e27874SAdam Thomson { 609192ce2fbSKuninori Morimoto struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 61048e27874SAdam Thomson 61148e27874SAdam Thomson switch (event) { 61248e27874SAdam Thomson case SND_SOC_DAPM_POST_PMU: 61348e27874SAdam Thomson switch (w->reg) { 61448e27874SAdam Thomson case DA732X_REG_ADC1_PD: 615192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, DA732X_REG_CLK_EN3, 61648e27874SAdam Thomson DA732X_ADCA_BB_CLK_EN, 61748e27874SAdam Thomson DA732X_ADCA_BB_CLK_EN); 61848e27874SAdam Thomson break; 61948e27874SAdam Thomson case DA732X_REG_ADC2_PD: 620192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, DA732X_REG_CLK_EN3, 62148e27874SAdam Thomson DA732X_ADCC_BB_CLK_EN, 62248e27874SAdam Thomson DA732X_ADCC_BB_CLK_EN); 62348e27874SAdam Thomson break; 62448e27874SAdam Thomson default: 62548e27874SAdam Thomson return -EINVAL; 62648e27874SAdam Thomson } 62748e27874SAdam Thomson 628192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, w->reg, DA732X_ADC_RST_MASK, 62948e27874SAdam Thomson DA732X_ADC_SET_ACT); 630192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, w->reg, DA732X_ADC_PD_MASK, 63148e27874SAdam Thomson DA732X_ADC_ON); 63248e27874SAdam Thomson break; 63348e27874SAdam Thomson case SND_SOC_DAPM_POST_PMD: 634192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, w->reg, DA732X_ADC_PD_MASK, 63548e27874SAdam Thomson DA732X_ADC_OFF); 636192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, w->reg, DA732X_ADC_RST_MASK, 63748e27874SAdam Thomson DA732X_ADC_SET_RST); 63848e27874SAdam Thomson 63948e27874SAdam Thomson switch (w->reg) { 64048e27874SAdam Thomson case DA732X_REG_ADC1_PD: 641192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, DA732X_REG_CLK_EN3, 64248e27874SAdam Thomson DA732X_ADCA_BB_CLK_EN, 0); 64348e27874SAdam Thomson break; 64448e27874SAdam Thomson case DA732X_REG_ADC2_PD: 645192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, DA732X_REG_CLK_EN3, 64648e27874SAdam Thomson DA732X_ADCC_BB_CLK_EN, 0); 64748e27874SAdam Thomson break; 64848e27874SAdam Thomson default: 64948e27874SAdam Thomson return -EINVAL; 65048e27874SAdam Thomson } 65148e27874SAdam Thomson 65248e27874SAdam Thomson break; 65348e27874SAdam Thomson default: 65448e27874SAdam Thomson return -EINVAL; 65548e27874SAdam Thomson } 65648e27874SAdam Thomson 65748e27874SAdam Thomson return 0; 65848e27874SAdam Thomson } 65948e27874SAdam Thomson 66048e27874SAdam Thomson static int da732x_out_pga_event(struct snd_soc_dapm_widget *w, 66148e27874SAdam Thomson struct snd_kcontrol *kcontrol, int event) 66248e27874SAdam Thomson { 663192ce2fbSKuninori Morimoto struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 66448e27874SAdam Thomson 66548e27874SAdam Thomson switch (event) { 66648e27874SAdam Thomson case SND_SOC_DAPM_POST_PMU: 667192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, w->reg, 66848e27874SAdam Thomson (1 << w->shift) | DA732X_OUT_HIZ_EN, 66948e27874SAdam Thomson (1 << w->shift) | DA732X_OUT_HIZ_EN); 67048e27874SAdam Thomson break; 67148e27874SAdam Thomson case SND_SOC_DAPM_POST_PMD: 672192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, w->reg, 67348e27874SAdam Thomson (1 << w->shift) | DA732X_OUT_HIZ_EN, 67448e27874SAdam Thomson (1 << w->shift) | DA732X_OUT_HIZ_DIS); 67548e27874SAdam Thomson break; 67648e27874SAdam Thomson default: 67748e27874SAdam Thomson return -EINVAL; 67848e27874SAdam Thomson } 67948e27874SAdam Thomson 68048e27874SAdam Thomson return 0; 68148e27874SAdam Thomson } 68248e27874SAdam Thomson 68348e27874SAdam Thomson static const char *adcl_text[] = { 68448e27874SAdam Thomson "AUX1L", "MIC1" 68548e27874SAdam Thomson }; 68648e27874SAdam Thomson 68748e27874SAdam Thomson static const char *adcr_text[] = { 68848e27874SAdam Thomson "AUX1R", "MIC2", "MIC3" 68948e27874SAdam Thomson }; 69048e27874SAdam Thomson 69148e27874SAdam Thomson static const char *enable_text[] = { 69248e27874SAdam Thomson "Disabled", 69348e27874SAdam Thomson "Enabled" 69448e27874SAdam Thomson }; 69548e27874SAdam Thomson 69648e27874SAdam Thomson /* ADC1LMUX */ 6977e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(adc1l_enum, 6987e509108STakashi Iwai DA732X_REG_INP_MUX, DA732X_ADC1L_MUX_SEL_SHIFT, 6997e509108STakashi Iwai adcl_text); 70048e27874SAdam Thomson static const struct snd_kcontrol_new adc1l_mux = 70148e27874SAdam Thomson SOC_DAPM_ENUM("ADC Route", adc1l_enum); 70248e27874SAdam Thomson 70348e27874SAdam Thomson /* ADC1RMUX */ 7047e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(adc1r_enum, 7057e509108STakashi Iwai DA732X_REG_INP_MUX, DA732X_ADC1R_MUX_SEL_SHIFT, 7067e509108STakashi Iwai adcr_text); 70748e27874SAdam Thomson static const struct snd_kcontrol_new adc1r_mux = 70848e27874SAdam Thomson SOC_DAPM_ENUM("ADC Route", adc1r_enum); 70948e27874SAdam Thomson 71048e27874SAdam Thomson /* ADC2LMUX */ 7117e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(adc2l_enum, 7127e509108STakashi Iwai DA732X_REG_INP_MUX, DA732X_ADC2L_MUX_SEL_SHIFT, 7137e509108STakashi Iwai adcl_text); 71448e27874SAdam Thomson static const struct snd_kcontrol_new adc2l_mux = 71548e27874SAdam Thomson SOC_DAPM_ENUM("ADC Route", adc2l_enum); 71648e27874SAdam Thomson 71748e27874SAdam Thomson /* ADC2RMUX */ 7187e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(adc2r_enum, 7197e509108STakashi Iwai DA732X_REG_INP_MUX, DA732X_ADC2R_MUX_SEL_SHIFT, 7207e509108STakashi Iwai adcr_text); 72148e27874SAdam Thomson 72248e27874SAdam Thomson static const struct snd_kcontrol_new adc2r_mux = 72348e27874SAdam Thomson SOC_DAPM_ENUM("ADC Route", adc2r_enum); 72448e27874SAdam Thomson 7257e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_hp_left_output, 7267e509108STakashi Iwai DA732X_REG_HPL, DA732X_HP_OUT_DAC_EN_SHIFT, 7277e509108STakashi Iwai enable_text); 72848e27874SAdam Thomson 72948e27874SAdam Thomson static const struct snd_kcontrol_new hpl_mux = 73048e27874SAdam Thomson SOC_DAPM_ENUM("HPL Switch", da732x_hp_left_output); 73148e27874SAdam Thomson 7327e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_hp_right_output, 7337e509108STakashi Iwai DA732X_REG_HPR, DA732X_HP_OUT_DAC_EN_SHIFT, 7347e509108STakashi Iwai enable_text); 73548e27874SAdam Thomson 73648e27874SAdam Thomson static const struct snd_kcontrol_new hpr_mux = 73748e27874SAdam Thomson SOC_DAPM_ENUM("HPR Switch", da732x_hp_right_output); 73848e27874SAdam Thomson 7397e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_speaker_output, 7407e509108STakashi Iwai DA732X_REG_LIN3, DA732X_LOUT_DAC_EN_SHIFT, 7417e509108STakashi Iwai enable_text); 74248e27874SAdam Thomson 74348e27874SAdam Thomson static const struct snd_kcontrol_new spk_mux = 74448e27874SAdam Thomson SOC_DAPM_ENUM("SPK Switch", da732x_speaker_output); 74548e27874SAdam Thomson 7467e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_lout4_output, 7477e509108STakashi Iwai DA732X_REG_LIN4, DA732X_LOUT_DAC_EN_SHIFT, 7487e509108STakashi Iwai enable_text); 74948e27874SAdam Thomson 75048e27874SAdam Thomson static const struct snd_kcontrol_new lout4_mux = 75148e27874SAdam Thomson SOC_DAPM_ENUM("LOUT4 Switch", da732x_lout4_output); 75248e27874SAdam Thomson 7537e509108STakashi Iwai static SOC_ENUM_SINGLE_DECL(da732x_lout2_output, 7547e509108STakashi Iwai DA732X_REG_LIN2, DA732X_LOUT_DAC_EN_SHIFT, 7557e509108STakashi Iwai enable_text); 75648e27874SAdam Thomson 75748e27874SAdam Thomson static const struct snd_kcontrol_new lout2_mux = 75848e27874SAdam Thomson SOC_DAPM_ENUM("LOUT2 Switch", da732x_lout2_output); 75948e27874SAdam Thomson 76048e27874SAdam Thomson static const struct snd_soc_dapm_widget da732x_dapm_widgets[] = { 76148e27874SAdam Thomson /* Supplies */ 76248e27874SAdam Thomson SND_SOC_DAPM_SUPPLY("ADC1 Supply", DA732X_REG_ADC1_PD, 0, 76348e27874SAdam Thomson DA732X_NO_INVERT, da732x_adc_event, 76448e27874SAdam Thomson SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 76548e27874SAdam Thomson SND_SOC_DAPM_SUPPLY("ADC2 Supply", DA732X_REG_ADC2_PD, 0, 76648e27874SAdam Thomson DA732X_NO_INVERT, da732x_adc_event, 76748e27874SAdam Thomson SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 76848e27874SAdam Thomson SND_SOC_DAPM_SUPPLY("DAC1 CLK", DA732X_REG_CLK_EN4, 76948e27874SAdam Thomson DA732X_DACA_BB_CLK_SHIFT, DA732X_NO_INVERT, 77048e27874SAdam Thomson NULL, 0), 77148e27874SAdam Thomson SND_SOC_DAPM_SUPPLY("DAC2 CLK", DA732X_REG_CLK_EN4, 77248e27874SAdam Thomson DA732X_DACC_BB_CLK_SHIFT, DA732X_NO_INVERT, 77348e27874SAdam Thomson NULL, 0), 77448e27874SAdam Thomson SND_SOC_DAPM_SUPPLY("DAC3 CLK", DA732X_REG_CLK_EN5, 77548e27874SAdam Thomson DA732X_DACE_BB_CLK_SHIFT, DA732X_NO_INVERT, 77648e27874SAdam Thomson NULL, 0), 77748e27874SAdam Thomson 77848e27874SAdam Thomson /* Micbias */ 77948e27874SAdam Thomson SND_SOC_DAPM_SUPPLY("MICBIAS1", DA732X_REG_MICBIAS1, 78048e27874SAdam Thomson DA732X_MICBIAS_EN_SHIFT, 78148e27874SAdam Thomson DA732X_NO_INVERT, NULL, 0), 78248e27874SAdam Thomson SND_SOC_DAPM_SUPPLY("MICBIAS2", DA732X_REG_MICBIAS2, 78348e27874SAdam Thomson DA732X_MICBIAS_EN_SHIFT, 78448e27874SAdam Thomson DA732X_NO_INVERT, NULL, 0), 78548e27874SAdam Thomson 78648e27874SAdam Thomson /* Inputs */ 78748e27874SAdam Thomson SND_SOC_DAPM_INPUT("MIC1"), 78848e27874SAdam Thomson SND_SOC_DAPM_INPUT("MIC2"), 78948e27874SAdam Thomson SND_SOC_DAPM_INPUT("MIC3"), 79048e27874SAdam Thomson SND_SOC_DAPM_INPUT("AUX1L"), 79148e27874SAdam Thomson SND_SOC_DAPM_INPUT("AUX1R"), 79248e27874SAdam Thomson 79348e27874SAdam Thomson /* Outputs */ 79448e27874SAdam Thomson SND_SOC_DAPM_OUTPUT("HPL"), 79548e27874SAdam Thomson SND_SOC_DAPM_OUTPUT("HPR"), 79648e27874SAdam Thomson SND_SOC_DAPM_OUTPUT("LOUTL"), 79748e27874SAdam Thomson SND_SOC_DAPM_OUTPUT("LOUTR"), 79848e27874SAdam Thomson SND_SOC_DAPM_OUTPUT("ClassD"), 79948e27874SAdam Thomson 80048e27874SAdam Thomson /* ADCs */ 80148e27874SAdam Thomson SND_SOC_DAPM_ADC("ADC1L", NULL, DA732X_REG_ADC1_SEL, 80248e27874SAdam Thomson DA732X_ADCL_EN_SHIFT, DA732X_NO_INVERT), 80348e27874SAdam Thomson SND_SOC_DAPM_ADC("ADC1R", NULL, DA732X_REG_ADC1_SEL, 80448e27874SAdam Thomson DA732X_ADCR_EN_SHIFT, DA732X_NO_INVERT), 80548e27874SAdam Thomson SND_SOC_DAPM_ADC("ADC2L", NULL, DA732X_REG_ADC2_SEL, 80648e27874SAdam Thomson DA732X_ADCL_EN_SHIFT, DA732X_NO_INVERT), 80748e27874SAdam Thomson SND_SOC_DAPM_ADC("ADC2R", NULL, DA732X_REG_ADC2_SEL, 80848e27874SAdam Thomson DA732X_ADCR_EN_SHIFT, DA732X_NO_INVERT), 80948e27874SAdam Thomson 81048e27874SAdam Thomson /* DACs */ 81148e27874SAdam Thomson SND_SOC_DAPM_DAC("DAC1L", NULL, DA732X_REG_DAC1_SEL, 81248e27874SAdam Thomson DA732X_DACL_EN_SHIFT, DA732X_NO_INVERT), 81348e27874SAdam Thomson SND_SOC_DAPM_DAC("DAC1R", NULL, DA732X_REG_DAC1_SEL, 81448e27874SAdam Thomson DA732X_DACR_EN_SHIFT, DA732X_NO_INVERT), 81548e27874SAdam Thomson SND_SOC_DAPM_DAC("DAC2L", NULL, DA732X_REG_DAC2_SEL, 81648e27874SAdam Thomson DA732X_DACL_EN_SHIFT, DA732X_NO_INVERT), 81748e27874SAdam Thomson SND_SOC_DAPM_DAC("DAC2R", NULL, DA732X_REG_DAC2_SEL, 81848e27874SAdam Thomson DA732X_DACR_EN_SHIFT, DA732X_NO_INVERT), 81948e27874SAdam Thomson SND_SOC_DAPM_DAC("DAC3", NULL, DA732X_REG_DAC3_SEL, 82048e27874SAdam Thomson DA732X_DACL_EN_SHIFT, DA732X_NO_INVERT), 82148e27874SAdam Thomson 82248e27874SAdam Thomson /* Input Pgas */ 82348e27874SAdam Thomson SND_SOC_DAPM_PGA("MIC1 PGA", DA732X_REG_MIC1, DA732X_MIC_EN_SHIFT, 82448e27874SAdam Thomson 0, NULL, 0), 82548e27874SAdam Thomson SND_SOC_DAPM_PGA("MIC2 PGA", DA732X_REG_MIC2, DA732X_MIC_EN_SHIFT, 82648e27874SAdam Thomson 0, NULL, 0), 82748e27874SAdam Thomson SND_SOC_DAPM_PGA("MIC3 PGA", DA732X_REG_MIC3, DA732X_MIC_EN_SHIFT, 82848e27874SAdam Thomson 0, NULL, 0), 82948e27874SAdam Thomson SND_SOC_DAPM_PGA("AUX1L PGA", DA732X_REG_AUX1L, DA732X_AUX_EN_SHIFT, 83048e27874SAdam Thomson 0, NULL, 0), 83148e27874SAdam Thomson SND_SOC_DAPM_PGA("AUX1R PGA", DA732X_REG_AUX1R, DA732X_AUX_EN_SHIFT, 83248e27874SAdam Thomson 0, NULL, 0), 83348e27874SAdam Thomson 83448e27874SAdam Thomson SND_SOC_DAPM_PGA_E("HP Left", DA732X_REG_HPL, DA732X_HP_OUT_EN_SHIFT, 83548e27874SAdam Thomson 0, NULL, 0, da732x_out_pga_event, 83648e27874SAdam Thomson SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), 83748e27874SAdam Thomson SND_SOC_DAPM_PGA_E("HP Right", DA732X_REG_HPR, DA732X_HP_OUT_EN_SHIFT, 83848e27874SAdam Thomson 0, NULL, 0, da732x_out_pga_event, 83948e27874SAdam Thomson SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), 84048e27874SAdam Thomson SND_SOC_DAPM_PGA_E("LIN2", DA732X_REG_LIN2, DA732X_LIN_OUT_EN_SHIFT, 84148e27874SAdam Thomson 0, NULL, 0, da732x_out_pga_event, 84248e27874SAdam Thomson SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), 84348e27874SAdam Thomson SND_SOC_DAPM_PGA_E("LIN3", DA732X_REG_LIN3, DA732X_LIN_OUT_EN_SHIFT, 84448e27874SAdam Thomson 0, NULL, 0, da732x_out_pga_event, 84548e27874SAdam Thomson SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), 84648e27874SAdam Thomson SND_SOC_DAPM_PGA_E("LIN4", DA732X_REG_LIN4, DA732X_LIN_OUT_EN_SHIFT, 84748e27874SAdam Thomson 0, NULL, 0, da732x_out_pga_event, 84848e27874SAdam Thomson SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), 84948e27874SAdam Thomson 85048e27874SAdam Thomson /* MUXs */ 85148e27874SAdam Thomson SND_SOC_DAPM_MUX("ADC1 Left MUX", SND_SOC_NOPM, 0, 0, &adc1l_mux), 85248e27874SAdam Thomson SND_SOC_DAPM_MUX("ADC1 Right MUX", SND_SOC_NOPM, 0, 0, &adc1r_mux), 85348e27874SAdam Thomson SND_SOC_DAPM_MUX("ADC2 Left MUX", SND_SOC_NOPM, 0, 0, &adc2l_mux), 85448e27874SAdam Thomson SND_SOC_DAPM_MUX("ADC2 Right MUX", SND_SOC_NOPM, 0, 0, &adc2r_mux), 85548e27874SAdam Thomson 85648e27874SAdam Thomson SND_SOC_DAPM_MUX("HP Left MUX", SND_SOC_NOPM, 0, 0, &hpl_mux), 85748e27874SAdam Thomson SND_SOC_DAPM_MUX("HP Right MUX", SND_SOC_NOPM, 0, 0, &hpr_mux), 85848e27874SAdam Thomson SND_SOC_DAPM_MUX("Speaker MUX", SND_SOC_NOPM, 0, 0, &spk_mux), 85948e27874SAdam Thomson SND_SOC_DAPM_MUX("LOUT2 MUX", SND_SOC_NOPM, 0, 0, &lout2_mux), 86048e27874SAdam Thomson SND_SOC_DAPM_MUX("LOUT4 MUX", SND_SOC_NOPM, 0, 0, &lout4_mux), 86148e27874SAdam Thomson 86248e27874SAdam Thomson /* AIF interfaces */ 86348e27874SAdam Thomson SND_SOC_DAPM_AIF_OUT("AIFA Output", "AIFA Capture", 0, DA732X_REG_AIFA3, 86448e27874SAdam Thomson DA732X_AIF_EN_SHIFT, 0), 86548e27874SAdam Thomson SND_SOC_DAPM_AIF_IN("AIFA Input", "AIFA Playback", 0, DA732X_REG_AIFA3, 86648e27874SAdam Thomson DA732X_AIF_EN_SHIFT, 0), 86748e27874SAdam Thomson 86848e27874SAdam Thomson SND_SOC_DAPM_AIF_OUT("AIFB Output", "AIFB Capture", 0, DA732X_REG_AIFB3, 86948e27874SAdam Thomson DA732X_AIF_EN_SHIFT, 0), 87048e27874SAdam Thomson SND_SOC_DAPM_AIF_IN("AIFB Input", "AIFB Playback", 0, DA732X_REG_AIFB3, 87148e27874SAdam Thomson DA732X_AIF_EN_SHIFT, 0), 87248e27874SAdam Thomson }; 87348e27874SAdam Thomson 87448e27874SAdam Thomson static const struct snd_soc_dapm_route da732x_dapm_routes[] = { 87548e27874SAdam Thomson /* Inputs */ 8768e6a75c1SLars-Peter Clausen {"AUX1L PGA", NULL, "AUX1L"}, 8778e6a75c1SLars-Peter Clausen {"AUX1R PGA", NULL, "AUX1R"}, 87848e27874SAdam Thomson {"MIC1 PGA", NULL, "MIC1"}, 8798e6a75c1SLars-Peter Clausen {"MIC2 PGA", NULL, "MIC2"}, 8808e6a75c1SLars-Peter Clausen {"MIC3 PGA", NULL, "MIC3"}, 88148e27874SAdam Thomson 88248e27874SAdam Thomson /* Capture Path */ 88348e27874SAdam Thomson {"ADC1 Left MUX", "MIC1", "MIC1 PGA"}, 88448e27874SAdam Thomson {"ADC1 Left MUX", "AUX1L", "AUX1L PGA"}, 88548e27874SAdam Thomson 88648e27874SAdam Thomson {"ADC1 Right MUX", "AUX1R", "AUX1R PGA"}, 88748e27874SAdam Thomson {"ADC1 Right MUX", "MIC2", "MIC2 PGA"}, 88848e27874SAdam Thomson {"ADC1 Right MUX", "MIC3", "MIC3 PGA"}, 88948e27874SAdam Thomson 89048e27874SAdam Thomson {"ADC2 Left MUX", "AUX1L", "AUX1L PGA"}, 89148e27874SAdam Thomson {"ADC2 Left MUX", "MIC1", "MIC1 PGA"}, 89248e27874SAdam Thomson 89348e27874SAdam Thomson {"ADC2 Right MUX", "AUX1R", "AUX1R PGA"}, 89448e27874SAdam Thomson {"ADC2 Right MUX", "MIC2", "MIC2 PGA"}, 89548e27874SAdam Thomson {"ADC2 Right MUX", "MIC3", "MIC3 PGA"}, 89648e27874SAdam Thomson 89748e27874SAdam Thomson {"ADC1L", NULL, "ADC1 Supply"}, 89848e27874SAdam Thomson {"ADC1R", NULL, "ADC1 Supply"}, 89948e27874SAdam Thomson {"ADC2L", NULL, "ADC2 Supply"}, 90048e27874SAdam Thomson {"ADC2R", NULL, "ADC2 Supply"}, 90148e27874SAdam Thomson 90248e27874SAdam Thomson {"ADC1L", NULL, "ADC1 Left MUX"}, 90348e27874SAdam Thomson {"ADC1R", NULL, "ADC1 Right MUX"}, 90448e27874SAdam Thomson {"ADC2L", NULL, "ADC2 Left MUX"}, 90548e27874SAdam Thomson {"ADC2R", NULL, "ADC2 Right MUX"}, 90648e27874SAdam Thomson 90748e27874SAdam Thomson {"AIFA Output", NULL, "ADC1L"}, 90848e27874SAdam Thomson {"AIFA Output", NULL, "ADC1R"}, 90948e27874SAdam Thomson {"AIFB Output", NULL, "ADC2L"}, 91048e27874SAdam Thomson {"AIFB Output", NULL, "ADC2R"}, 91148e27874SAdam Thomson 91248e27874SAdam Thomson {"HP Left MUX", "Enabled", "AIFA Input"}, 91348e27874SAdam Thomson {"HP Right MUX", "Enabled", "AIFA Input"}, 91448e27874SAdam Thomson {"Speaker MUX", "Enabled", "AIFB Input"}, 91548e27874SAdam Thomson {"LOUT2 MUX", "Enabled", "AIFB Input"}, 91648e27874SAdam Thomson {"LOUT4 MUX", "Enabled", "AIFB Input"}, 91748e27874SAdam Thomson 91848e27874SAdam Thomson {"DAC1L", NULL, "DAC1 CLK"}, 91948e27874SAdam Thomson {"DAC1R", NULL, "DAC1 CLK"}, 92048e27874SAdam Thomson {"DAC2L", NULL, "DAC2 CLK"}, 92148e27874SAdam Thomson {"DAC2R", NULL, "DAC2 CLK"}, 92248e27874SAdam Thomson {"DAC3", NULL, "DAC3 CLK"}, 92348e27874SAdam Thomson 92448e27874SAdam Thomson {"DAC1L", NULL, "HP Left MUX"}, 92548e27874SAdam Thomson {"DAC1R", NULL, "HP Right MUX"}, 92648e27874SAdam Thomson {"DAC2L", NULL, "Speaker MUX"}, 92748e27874SAdam Thomson {"DAC2R", NULL, "LOUT4 MUX"}, 92848e27874SAdam Thomson {"DAC3", NULL, "LOUT2 MUX"}, 92948e27874SAdam Thomson 93048e27874SAdam Thomson /* Output Pgas */ 93148e27874SAdam Thomson {"HP Left", NULL, "DAC1L"}, 93248e27874SAdam Thomson {"HP Right", NULL, "DAC1R"}, 93348e27874SAdam Thomson {"LIN3", NULL, "DAC2L"}, 93448e27874SAdam Thomson {"LIN4", NULL, "DAC2R"}, 93548e27874SAdam Thomson {"LIN2", NULL, "DAC3"}, 93648e27874SAdam Thomson 93748e27874SAdam Thomson /* Outputs */ 93848e27874SAdam Thomson {"ClassD", NULL, "LIN3"}, 93948e27874SAdam Thomson {"LOUTL", NULL, "LIN2"}, 94048e27874SAdam Thomson {"LOUTR", NULL, "LIN4"}, 94148e27874SAdam Thomson {"HPL", NULL, "HP Left"}, 94248e27874SAdam Thomson {"HPR", NULL, "HP Right"}, 94348e27874SAdam Thomson }; 94448e27874SAdam Thomson 94548e27874SAdam Thomson static int da732x_hw_params(struct snd_pcm_substream *substream, 94648e27874SAdam Thomson struct snd_pcm_hw_params *params, 94748e27874SAdam Thomson struct snd_soc_dai *dai) 94848e27874SAdam Thomson { 949192ce2fbSKuninori Morimoto struct snd_soc_component *component = dai->component; 95048e27874SAdam Thomson u32 aif = 0; 95148e27874SAdam Thomson u32 reg_aif; 95248e27874SAdam Thomson u32 fs; 95348e27874SAdam Thomson 95448e27874SAdam Thomson reg_aif = dai->driver->base; 95548e27874SAdam Thomson 956abf82ae6SMark Brown switch (params_width(params)) { 957abf82ae6SMark Brown case 16: 95848e27874SAdam Thomson aif |= DA732X_AIF_WORD_16; 95948e27874SAdam Thomson break; 960abf82ae6SMark Brown case 20: 96148e27874SAdam Thomson aif |= DA732X_AIF_WORD_20; 96248e27874SAdam Thomson break; 963abf82ae6SMark Brown case 24: 96448e27874SAdam Thomson aif |= DA732X_AIF_WORD_24; 96548e27874SAdam Thomson break; 966abf82ae6SMark Brown case 32: 96748e27874SAdam Thomson aif |= DA732X_AIF_WORD_32; 96848e27874SAdam Thomson break; 96948e27874SAdam Thomson default: 97048e27874SAdam Thomson return -EINVAL; 97148e27874SAdam Thomson } 97248e27874SAdam Thomson 97348e27874SAdam Thomson switch (params_rate(params)) { 97448e27874SAdam Thomson case 8000: 97548e27874SAdam Thomson fs = DA732X_SR_8KHZ; 97648e27874SAdam Thomson break; 97748e27874SAdam Thomson case 11025: 97848e27874SAdam Thomson fs = DA732X_SR_11_025KHZ; 97948e27874SAdam Thomson break; 98048e27874SAdam Thomson case 12000: 98148e27874SAdam Thomson fs = DA732X_SR_12KHZ; 98248e27874SAdam Thomson break; 98348e27874SAdam Thomson case 16000: 98448e27874SAdam Thomson fs = DA732X_SR_16KHZ; 98548e27874SAdam Thomson break; 98648e27874SAdam Thomson case 22050: 98748e27874SAdam Thomson fs = DA732X_SR_22_05KHZ; 98848e27874SAdam Thomson break; 98948e27874SAdam Thomson case 24000: 99048e27874SAdam Thomson fs = DA732X_SR_24KHZ; 99148e27874SAdam Thomson break; 99248e27874SAdam Thomson case 32000: 99348e27874SAdam Thomson fs = DA732X_SR_32KHZ; 99448e27874SAdam Thomson break; 99548e27874SAdam Thomson case 44100: 99648e27874SAdam Thomson fs = DA732X_SR_44_1KHZ; 99748e27874SAdam Thomson break; 99848e27874SAdam Thomson case 48000: 99948e27874SAdam Thomson fs = DA732X_SR_48KHZ; 100048e27874SAdam Thomson break; 100148e27874SAdam Thomson case 88100: 100248e27874SAdam Thomson fs = DA732X_SR_88_1KHZ; 100348e27874SAdam Thomson break; 100448e27874SAdam Thomson case 96000: 100548e27874SAdam Thomson fs = DA732X_SR_96KHZ; 100648e27874SAdam Thomson break; 100748e27874SAdam Thomson default: 100848e27874SAdam Thomson return -EINVAL; 100948e27874SAdam Thomson } 101048e27874SAdam Thomson 1011192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, reg_aif, DA732X_AIF_WORD_MASK, aif); 1012192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, DA732X_REG_CLK_CTRL, DA732X_SR1_MASK, fs); 101348e27874SAdam Thomson 101448e27874SAdam Thomson return 0; 101548e27874SAdam Thomson } 101648e27874SAdam Thomson 101748e27874SAdam Thomson static int da732x_set_dai_fmt(struct snd_soc_dai *dai, u32 fmt) 101848e27874SAdam Thomson { 1019192ce2fbSKuninori Morimoto struct snd_soc_component *component = dai->component; 102048e27874SAdam Thomson u32 aif_mclk, pc_count; 102148e27874SAdam Thomson u32 reg_aif1, aif1; 102248e27874SAdam Thomson u32 reg_aif3, aif3; 102348e27874SAdam Thomson 102448e27874SAdam Thomson switch (dai->id) { 102548e27874SAdam Thomson case DA732X_DAI_ID1: 102648e27874SAdam Thomson reg_aif1 = DA732X_REG_AIFA1; 102748e27874SAdam Thomson reg_aif3 = DA732X_REG_AIFA3; 102848e27874SAdam Thomson pc_count = DA732X_PC_PULSE_AIFA | DA732X_PC_RESYNC_NOT_AUT | 102948e27874SAdam Thomson DA732X_PC_SAME; 103048e27874SAdam Thomson break; 103148e27874SAdam Thomson case DA732X_DAI_ID2: 103248e27874SAdam Thomson reg_aif1 = DA732X_REG_AIFB1; 103348e27874SAdam Thomson reg_aif3 = DA732X_REG_AIFB3; 103448e27874SAdam Thomson pc_count = DA732X_PC_PULSE_AIFB | DA732X_PC_RESYNC_NOT_AUT | 103548e27874SAdam Thomson DA732X_PC_SAME; 103648e27874SAdam Thomson break; 103748e27874SAdam Thomson default: 103848e27874SAdam Thomson return -EINVAL; 103948e27874SAdam Thomson } 104048e27874SAdam Thomson 104148e27874SAdam Thomson switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 104248e27874SAdam Thomson case SND_SOC_DAIFMT_CBS_CFS: 104348e27874SAdam Thomson aif1 = DA732X_AIF_SLAVE; 104448e27874SAdam Thomson aif_mclk = DA732X_AIFM_FRAME_64 | DA732X_AIFM_SRC_SEL_AIFA; 104548e27874SAdam Thomson break; 104648e27874SAdam Thomson case SND_SOC_DAIFMT_CBM_CFM: 104748e27874SAdam Thomson aif1 = DA732X_AIF_CLK_FROM_SRC; 104848e27874SAdam Thomson aif_mclk = DA732X_CLK_GENERATION_AIF_A; 104948e27874SAdam Thomson break; 105048e27874SAdam Thomson default: 105148e27874SAdam Thomson return -EINVAL; 105248e27874SAdam Thomson } 105348e27874SAdam Thomson 105448e27874SAdam Thomson switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 105548e27874SAdam Thomson case SND_SOC_DAIFMT_I2S: 105648e27874SAdam Thomson aif3 = DA732X_AIF_I2S_MODE; 105748e27874SAdam Thomson break; 105848e27874SAdam Thomson case SND_SOC_DAIFMT_RIGHT_J: 105948e27874SAdam Thomson aif3 = DA732X_AIF_RIGHT_J_MODE; 106048e27874SAdam Thomson break; 106148e27874SAdam Thomson case SND_SOC_DAIFMT_LEFT_J: 106248e27874SAdam Thomson aif3 = DA732X_AIF_LEFT_J_MODE; 106348e27874SAdam Thomson break; 106448e27874SAdam Thomson case SND_SOC_DAIFMT_DSP_B: 106548e27874SAdam Thomson aif3 = DA732X_AIF_DSP_MODE; 106648e27874SAdam Thomson break; 106748e27874SAdam Thomson default: 106848e27874SAdam Thomson return -EINVAL; 106948e27874SAdam Thomson } 107048e27874SAdam Thomson 107148e27874SAdam Thomson /* Clock inversion */ 107248e27874SAdam Thomson switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 107348e27874SAdam Thomson case SND_SOC_DAIFMT_DSP_B: 107448e27874SAdam Thomson switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 107548e27874SAdam Thomson case SND_SOC_DAIFMT_NB_NF: 107648e27874SAdam Thomson break; 107748e27874SAdam Thomson case SND_SOC_DAIFMT_IB_NF: 107848e27874SAdam Thomson aif3 |= DA732X_AIF_BCLK_INV; 107948e27874SAdam Thomson break; 108048e27874SAdam Thomson default: 108148e27874SAdam Thomson return -EINVAL; 108248e27874SAdam Thomson } 108348e27874SAdam Thomson break; 108448e27874SAdam Thomson case SND_SOC_DAIFMT_I2S: 108548e27874SAdam Thomson case SND_SOC_DAIFMT_RIGHT_J: 108648e27874SAdam Thomson case SND_SOC_DAIFMT_LEFT_J: 108748e27874SAdam Thomson switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 108848e27874SAdam Thomson case SND_SOC_DAIFMT_NB_NF: 108948e27874SAdam Thomson break; 109048e27874SAdam Thomson case SND_SOC_DAIFMT_IB_IF: 109148e27874SAdam Thomson aif3 |= DA732X_AIF_BCLK_INV | DA732X_AIF_WCLK_INV; 109248e27874SAdam Thomson break; 109348e27874SAdam Thomson case SND_SOC_DAIFMT_IB_NF: 109448e27874SAdam Thomson aif3 |= DA732X_AIF_BCLK_INV; 109548e27874SAdam Thomson break; 109648e27874SAdam Thomson case SND_SOC_DAIFMT_NB_IF: 109748e27874SAdam Thomson aif3 |= DA732X_AIF_WCLK_INV; 109848e27874SAdam Thomson break; 109948e27874SAdam Thomson default: 110048e27874SAdam Thomson return -EINVAL; 110148e27874SAdam Thomson } 110248e27874SAdam Thomson break; 110348e27874SAdam Thomson default: 110448e27874SAdam Thomson return -EINVAL; 110548e27874SAdam Thomson } 110648e27874SAdam Thomson 1107192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_AIF_MCLK, aif_mclk); 1108192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, reg_aif1, DA732X_AIF1_CLK_MASK, aif1); 1109192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, reg_aif3, DA732X_AIF_BCLK_INV | 111048e27874SAdam Thomson DA732X_AIF_WCLK_INV | DA732X_AIF_MODE_MASK, aif3); 1111192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_PC_CTRL, pc_count); 111248e27874SAdam Thomson 111348e27874SAdam Thomson return 0; 111448e27874SAdam Thomson } 111548e27874SAdam Thomson 111648e27874SAdam Thomson 111748e27874SAdam Thomson 1118192ce2fbSKuninori Morimoto static int da732x_set_dai_pll(struct snd_soc_component *component, int pll_id, 111948e27874SAdam Thomson int source, unsigned int freq_in, 112048e27874SAdam Thomson unsigned int freq_out) 112148e27874SAdam Thomson { 1122192ce2fbSKuninori Morimoto struct da732x_priv *da732x = snd_soc_component_get_drvdata(component); 112348e27874SAdam Thomson int fref, indiv; 112448e27874SAdam Thomson u8 div_lo, div_mid, div_hi; 112548e27874SAdam Thomson u64 frac_div; 112648e27874SAdam Thomson 112748e27874SAdam Thomson /* Disable PLL */ 112848e27874SAdam Thomson if (freq_out == 0) { 1129192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, DA732X_REG_PLL_CTRL, 113048e27874SAdam Thomson DA732X_PLL_EN, 0); 113148e27874SAdam Thomson da732x->pll_en = false; 113248e27874SAdam Thomson return 0; 113348e27874SAdam Thomson } 113448e27874SAdam Thomson 113548e27874SAdam Thomson if (da732x->pll_en) 113648e27874SAdam Thomson return -EBUSY; 113748e27874SAdam Thomson 113848e27874SAdam Thomson if (source == DA732X_SRCCLK_MCLK) { 113948e27874SAdam Thomson /* Validate Sysclk rate */ 114048e27874SAdam Thomson switch (da732x->sysclk) { 114148e27874SAdam Thomson case 11290000: 114248e27874SAdam Thomson case 12288000: 114348e27874SAdam Thomson case 22580000: 114448e27874SAdam Thomson case 24576000: 114548e27874SAdam Thomson case 45160000: 114648e27874SAdam Thomson case 49152000: 1147192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_PLL_CTRL, 114848e27874SAdam Thomson DA732X_PLL_BYPASS); 114948e27874SAdam Thomson return 0; 115048e27874SAdam Thomson default: 1151192ce2fbSKuninori Morimoto dev_err(component->dev, 115248e27874SAdam Thomson "Cannot use PLL Bypass, invalid SYSCLK rate\n"); 115348e27874SAdam Thomson return -EINVAL; 115448e27874SAdam Thomson } 115548e27874SAdam Thomson } 115648e27874SAdam Thomson 1157192ce2fbSKuninori Morimoto indiv = da732x_get_input_div(component, da732x->sysclk); 115848e27874SAdam Thomson if (indiv < 0) 115948e27874SAdam Thomson return indiv; 116048e27874SAdam Thomson 116148e27874SAdam Thomson fref = (da732x->sysclk / indiv); 116248e27874SAdam Thomson div_hi = freq_out / fref; 116348e27874SAdam Thomson frac_div = (u64)(freq_out % fref) * 8192ULL; 116448e27874SAdam Thomson do_div(frac_div, fref); 116548e27874SAdam Thomson div_mid = (frac_div >> DA732X_1BYTE_SHIFT) & DA732X_U8_MASK; 116648e27874SAdam Thomson div_lo = (frac_div) & DA732X_U8_MASK; 116748e27874SAdam Thomson 1168192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_PLL_DIV_LO, div_lo); 1169192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_PLL_DIV_MID, div_mid); 1170192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_PLL_DIV_HI, div_hi); 117148e27874SAdam Thomson 1172192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, DA732X_REG_PLL_CTRL, DA732X_PLL_EN, 117348e27874SAdam Thomson DA732X_PLL_EN); 117448e27874SAdam Thomson 117548e27874SAdam Thomson da732x->pll_en = true; 117648e27874SAdam Thomson 117748e27874SAdam Thomson return 0; 117848e27874SAdam Thomson } 117948e27874SAdam Thomson 118048e27874SAdam Thomson static int da732x_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, 118148e27874SAdam Thomson unsigned int freq, int dir) 118248e27874SAdam Thomson { 1183192ce2fbSKuninori Morimoto struct snd_soc_component *component = dai->component; 1184192ce2fbSKuninori Morimoto struct da732x_priv *da732x = snd_soc_component_get_drvdata(component); 118548e27874SAdam Thomson 118648e27874SAdam Thomson da732x->sysclk = freq; 118748e27874SAdam Thomson 118848e27874SAdam Thomson return 0; 118948e27874SAdam Thomson } 119048e27874SAdam Thomson 119148e27874SAdam Thomson #define DA732X_RATES SNDRV_PCM_RATE_8000_96000 119248e27874SAdam Thomson 119348e27874SAdam Thomson #define DA732X_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \ 119448e27874SAdam Thomson SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) 119548e27874SAdam Thomson 1196a01da00cSAxel Lin static const struct snd_soc_dai_ops da732x_dai_ops = { 119748e27874SAdam Thomson .hw_params = da732x_hw_params, 119848e27874SAdam Thomson .set_fmt = da732x_set_dai_fmt, 119948e27874SAdam Thomson .set_sysclk = da732x_set_dai_sysclk, 120048e27874SAdam Thomson }; 120148e27874SAdam Thomson 120248e27874SAdam Thomson static struct snd_soc_dai_driver da732x_dai[] = { 120348e27874SAdam Thomson { 120448e27874SAdam Thomson .name = "DA732X_AIFA", 120548e27874SAdam Thomson .id = DA732X_DAI_ID1, 120648e27874SAdam Thomson .base = DA732X_REG_AIFA1, 120748e27874SAdam Thomson .playback = { 120848e27874SAdam Thomson .stream_name = "AIFA Playback", 120948e27874SAdam Thomson .channels_min = 1, 121048e27874SAdam Thomson .channels_max = 2, 121148e27874SAdam Thomson .rates = DA732X_RATES, 121248e27874SAdam Thomson .formats = DA732X_FORMATS, 121348e27874SAdam Thomson }, 121448e27874SAdam Thomson .capture = { 121548e27874SAdam Thomson .stream_name = "AIFA Capture", 121648e27874SAdam Thomson .channels_min = 1, 121748e27874SAdam Thomson .channels_max = 2, 121848e27874SAdam Thomson .rates = DA732X_RATES, 121948e27874SAdam Thomson .formats = DA732X_FORMATS, 122048e27874SAdam Thomson }, 1221a01da00cSAxel Lin .ops = &da732x_dai_ops, 122248e27874SAdam Thomson }, 122348e27874SAdam Thomson { 122448e27874SAdam Thomson .name = "DA732X_AIFB", 122548e27874SAdam Thomson .id = DA732X_DAI_ID2, 122648e27874SAdam Thomson .base = DA732X_REG_AIFB1, 122748e27874SAdam Thomson .playback = { 122848e27874SAdam Thomson .stream_name = "AIFB Playback", 122948e27874SAdam Thomson .channels_min = 1, 123048e27874SAdam Thomson .channels_max = 2, 123148e27874SAdam Thomson .rates = DA732X_RATES, 123248e27874SAdam Thomson .formats = DA732X_FORMATS, 123348e27874SAdam Thomson }, 123448e27874SAdam Thomson .capture = { 123548e27874SAdam Thomson .stream_name = "AIFB Capture", 123648e27874SAdam Thomson .channels_min = 1, 123748e27874SAdam Thomson .channels_max = 2, 123848e27874SAdam Thomson .rates = DA732X_RATES, 123948e27874SAdam Thomson .formats = DA732X_FORMATS, 124048e27874SAdam Thomson }, 1241a01da00cSAxel Lin .ops = &da732x_dai_ops, 124248e27874SAdam Thomson }, 124348e27874SAdam Thomson }; 124448e27874SAdam Thomson 124575306820SMark Brown static bool da732x_volatile(struct device *dev, unsigned int reg) 124675306820SMark Brown { 124775306820SMark Brown switch (reg) { 124875306820SMark Brown case DA732X_REG_HPL_DAC_OFF_CNTL: 124975306820SMark Brown case DA732X_REG_HPR_DAC_OFF_CNTL: 125075306820SMark Brown return true; 125175306820SMark Brown default: 125275306820SMark Brown return false; 125375306820SMark Brown } 125475306820SMark Brown } 125575306820SMark Brown 125648e27874SAdam Thomson static const struct regmap_config da732x_regmap = { 125748e27874SAdam Thomson .reg_bits = 8, 125848e27874SAdam Thomson .val_bits = 8, 125948e27874SAdam Thomson 126048e27874SAdam Thomson .max_register = DA732X_MAX_REG, 126175306820SMark Brown .volatile_reg = da732x_volatile, 126248e27874SAdam Thomson .reg_defaults = da732x_reg_cache, 126348e27874SAdam Thomson .num_reg_defaults = ARRAY_SIZE(da732x_reg_cache), 126448e27874SAdam Thomson .cache_type = REGCACHE_RBTREE, 126548e27874SAdam Thomson }; 126648e27874SAdam Thomson 126748e27874SAdam Thomson 1268192ce2fbSKuninori Morimoto static void da732x_dac_offset_adjust(struct snd_soc_component *component) 126948e27874SAdam Thomson { 127048e27874SAdam Thomson u8 offset[DA732X_HP_DACS]; 127148e27874SAdam Thomson u8 sign[DA732X_HP_DACS]; 127248e27874SAdam Thomson u8 step = DA732X_DAC_OFFSET_STEP; 127348e27874SAdam Thomson 127448e27874SAdam Thomson /* Initialize DAC offset calibration circuits and registers */ 1275192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPL_DAC_OFFSET, 127648e27874SAdam Thomson DA732X_HP_DAC_OFFSET_TRIM_VAL); 1277192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPR_DAC_OFFSET, 127848e27874SAdam Thomson DA732X_HP_DAC_OFFSET_TRIM_VAL); 1279192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPL_DAC_OFF_CNTL, 128048e27874SAdam Thomson DA732X_HP_DAC_OFF_CALIBRATION | 128148e27874SAdam Thomson DA732X_HP_DAC_OFF_SCALE_STEPS); 1282192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPR_DAC_OFF_CNTL, 128348e27874SAdam Thomson DA732X_HP_DAC_OFF_CALIBRATION | 128448e27874SAdam Thomson DA732X_HP_DAC_OFF_SCALE_STEPS); 128548e27874SAdam Thomson 128648e27874SAdam Thomson /* Wait for voltage stabilization */ 128748e27874SAdam Thomson msleep(DA732X_WAIT_FOR_STABILIZATION); 128848e27874SAdam Thomson 128948e27874SAdam Thomson /* Check DAC offset sign */ 1290*2925b582SKuninori Morimoto sign[DA732X_HPL_DAC] = (snd_soc_component_read(component, DA732X_REG_HPL_DAC_OFF_CNTL) & 129148e27874SAdam Thomson DA732X_HP_DAC_OFF_CNTL_COMPO); 1292*2925b582SKuninori Morimoto sign[DA732X_HPR_DAC] = (snd_soc_component_read(component, DA732X_REG_HPR_DAC_OFF_CNTL) & 129348e27874SAdam Thomson DA732X_HP_DAC_OFF_CNTL_COMPO); 129448e27874SAdam Thomson 129548e27874SAdam Thomson /* Binary search DAC offset values (both channels at once) */ 129648e27874SAdam Thomson offset[DA732X_HPL_DAC] = sign[DA732X_HPL_DAC] << DA732X_HP_DAC_COMPO_SHIFT; 129748e27874SAdam Thomson offset[DA732X_HPR_DAC] = sign[DA732X_HPR_DAC] << DA732X_HP_DAC_COMPO_SHIFT; 129848e27874SAdam Thomson 129948e27874SAdam Thomson do { 130048e27874SAdam Thomson offset[DA732X_HPL_DAC] |= step; 130148e27874SAdam Thomson offset[DA732X_HPR_DAC] |= step; 1302192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPL_DAC_OFFSET, 130348e27874SAdam Thomson ~offset[DA732X_HPL_DAC] & DA732X_HP_DAC_OFF_MASK); 1304192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPR_DAC_OFFSET, 130548e27874SAdam Thomson ~offset[DA732X_HPR_DAC] & DA732X_HP_DAC_OFF_MASK); 130648e27874SAdam Thomson 130748e27874SAdam Thomson msleep(DA732X_WAIT_FOR_STABILIZATION); 130848e27874SAdam Thomson 1309*2925b582SKuninori Morimoto if ((snd_soc_component_read(component, DA732X_REG_HPL_DAC_OFF_CNTL) & 131048e27874SAdam Thomson DA732X_HP_DAC_OFF_CNTL_COMPO) ^ sign[DA732X_HPL_DAC]) 131148e27874SAdam Thomson offset[DA732X_HPL_DAC] &= ~step; 1312*2925b582SKuninori Morimoto if ((snd_soc_component_read(component, DA732X_REG_HPR_DAC_OFF_CNTL) & 131348e27874SAdam Thomson DA732X_HP_DAC_OFF_CNTL_COMPO) ^ sign[DA732X_HPR_DAC]) 131448e27874SAdam Thomson offset[DA732X_HPR_DAC] &= ~step; 131548e27874SAdam Thomson 131648e27874SAdam Thomson step >>= 1; 131748e27874SAdam Thomson } while (step); 131848e27874SAdam Thomson 131948e27874SAdam Thomson /* Write final DAC offsets to registers */ 1320192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPL_DAC_OFFSET, 132148e27874SAdam Thomson ~offset[DA732X_HPL_DAC] & DA732X_HP_DAC_OFF_MASK); 1322192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPR_DAC_OFFSET, 132348e27874SAdam Thomson ~offset[DA732X_HPR_DAC] & DA732X_HP_DAC_OFF_MASK); 132448e27874SAdam Thomson 132548e27874SAdam Thomson /* End DAC calibration mode */ 1326192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPL_DAC_OFF_CNTL, 132748e27874SAdam Thomson DA732X_HP_DAC_OFF_SCALE_STEPS); 1328192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPR_DAC_OFF_CNTL, 132948e27874SAdam Thomson DA732X_HP_DAC_OFF_SCALE_STEPS); 133048e27874SAdam Thomson } 133148e27874SAdam Thomson 1332192ce2fbSKuninori Morimoto static void da732x_output_offset_adjust(struct snd_soc_component *component) 133348e27874SAdam Thomson { 133448e27874SAdam Thomson u8 offset[DA732X_HP_AMPS]; 133548e27874SAdam Thomson u8 sign[DA732X_HP_AMPS]; 133648e27874SAdam Thomson u8 step = DA732X_OUTPUT_OFFSET_STEP; 133748e27874SAdam Thomson 133848e27874SAdam Thomson offset[DA732X_HPL_AMP] = DA732X_HP_OUT_TRIM_VAL; 133948e27874SAdam Thomson offset[DA732X_HPR_AMP] = DA732X_HP_OUT_TRIM_VAL; 134048e27874SAdam Thomson 134148e27874SAdam Thomson /* Initialize output offset calibration circuits and registers */ 1342192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPL_OUT_OFFSET, DA732X_HP_OUT_TRIM_VAL); 1343192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPR_OUT_OFFSET, DA732X_HP_OUT_TRIM_VAL); 1344192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPL, 134548e27874SAdam Thomson DA732X_HP_OUT_COMP | DA732X_HP_OUT_EN); 1346192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPR, 134748e27874SAdam Thomson DA732X_HP_OUT_COMP | DA732X_HP_OUT_EN); 134848e27874SAdam Thomson 134948e27874SAdam Thomson /* Wait for voltage stabilization */ 135048e27874SAdam Thomson msleep(DA732X_WAIT_FOR_STABILIZATION); 135148e27874SAdam Thomson 135248e27874SAdam Thomson /* Check output offset sign */ 1353*2925b582SKuninori Morimoto sign[DA732X_HPL_AMP] = snd_soc_component_read(component, DA732X_REG_HPL) & 135448e27874SAdam Thomson DA732X_HP_OUT_COMPO; 1355*2925b582SKuninori Morimoto sign[DA732X_HPR_AMP] = snd_soc_component_read(component, DA732X_REG_HPR) & 135648e27874SAdam Thomson DA732X_HP_OUT_COMPO; 135748e27874SAdam Thomson 1358192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPL, DA732X_HP_OUT_COMP | 135948e27874SAdam Thomson (sign[DA732X_HPL_AMP] >> DA732X_HP_OUT_COMPO_SHIFT) | 136048e27874SAdam Thomson DA732X_HP_OUT_EN); 1361192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPR, DA732X_HP_OUT_COMP | 136248e27874SAdam Thomson (sign[DA732X_HPR_AMP] >> DA732X_HP_OUT_COMPO_SHIFT) | 136348e27874SAdam Thomson DA732X_HP_OUT_EN); 136448e27874SAdam Thomson 136548e27874SAdam Thomson /* Binary search output offset values (both channels at once) */ 136648e27874SAdam Thomson do { 136748e27874SAdam Thomson offset[DA732X_HPL_AMP] |= step; 136848e27874SAdam Thomson offset[DA732X_HPR_AMP] |= step; 1369192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPL_OUT_OFFSET, 137048e27874SAdam Thomson offset[DA732X_HPL_AMP]); 1371192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPR_OUT_OFFSET, 137248e27874SAdam Thomson offset[DA732X_HPR_AMP]); 137348e27874SAdam Thomson 137448e27874SAdam Thomson msleep(DA732X_WAIT_FOR_STABILIZATION); 137548e27874SAdam Thomson 1376*2925b582SKuninori Morimoto if ((snd_soc_component_read(component, DA732X_REG_HPL) & 137748e27874SAdam Thomson DA732X_HP_OUT_COMPO) ^ sign[DA732X_HPL_AMP]) 137848e27874SAdam Thomson offset[DA732X_HPL_AMP] &= ~step; 1379*2925b582SKuninori Morimoto if ((snd_soc_component_read(component, DA732X_REG_HPR) & 138048e27874SAdam Thomson DA732X_HP_OUT_COMPO) ^ sign[DA732X_HPR_AMP]) 138148e27874SAdam Thomson offset[DA732X_HPR_AMP] &= ~step; 138248e27874SAdam Thomson 138348e27874SAdam Thomson step >>= 1; 138448e27874SAdam Thomson } while (step); 138548e27874SAdam Thomson 138648e27874SAdam Thomson /* Write final DAC offsets to registers */ 1387192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPL_OUT_OFFSET, offset[DA732X_HPL_AMP]); 1388192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPR_OUT_OFFSET, offset[DA732X_HPR_AMP]); 138948e27874SAdam Thomson } 139048e27874SAdam Thomson 1391192ce2fbSKuninori Morimoto static void da732x_hp_dc_offset_cancellation(struct snd_soc_component *component) 139248e27874SAdam Thomson { 139348e27874SAdam Thomson /* Make sure that we have Soft Mute enabled */ 1394192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_DAC1_SOFTMUTE, DA732X_SOFTMUTE_EN | 139548e27874SAdam Thomson DA732X_GAIN_RAMPED | DA732X_16_SAMPLES); 1396192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_DAC1_SEL, DA732X_DACL_EN | 139748e27874SAdam Thomson DA732X_DACR_EN | DA732X_DACL_SDM | DA732X_DACR_SDM | 139848e27874SAdam Thomson DA732X_DACL_MUTE | DA732X_DACR_MUTE); 1399192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPL, DA732X_HP_OUT_DAC_EN | 140048e27874SAdam Thomson DA732X_HP_OUT_MUTE | DA732X_HP_OUT_EN); 1401192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPR, DA732X_HP_OUT_EN | 140248e27874SAdam Thomson DA732X_HP_OUT_MUTE | DA732X_HP_OUT_DAC_EN); 140348e27874SAdam Thomson 1404192ce2fbSKuninori Morimoto da732x_dac_offset_adjust(component); 1405192ce2fbSKuninori Morimoto da732x_output_offset_adjust(component); 140648e27874SAdam Thomson 1407192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_DAC1_SEL, DA732X_DACS_DIS); 1408192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPL, DA732X_HP_DIS); 1409192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HPR, DA732X_HP_DIS); 141048e27874SAdam Thomson } 141148e27874SAdam Thomson 1412192ce2fbSKuninori Morimoto static int da732x_set_bias_level(struct snd_soc_component *component, 141348e27874SAdam Thomson enum snd_soc_bias_level level) 141448e27874SAdam Thomson { 1415192ce2fbSKuninori Morimoto struct da732x_priv *da732x = snd_soc_component_get_drvdata(component); 141648e27874SAdam Thomson 141748e27874SAdam Thomson switch (level) { 141848e27874SAdam Thomson case SND_SOC_BIAS_ON: 1419192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, DA732X_REG_BIAS_EN, 142048e27874SAdam Thomson DA732X_BIAS_BOOST_MASK, 142148e27874SAdam Thomson DA732X_BIAS_BOOST_100PC); 142248e27874SAdam Thomson break; 142348e27874SAdam Thomson case SND_SOC_BIAS_PREPARE: 142448e27874SAdam Thomson break; 142548e27874SAdam Thomson case SND_SOC_BIAS_STANDBY: 1426192ce2fbSKuninori Morimoto if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { 142748e27874SAdam Thomson /* Init Codec */ 1428192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_REF1, 142948e27874SAdam Thomson DA732X_VMID_FASTCHG); 1430192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_BIAS_EN, 143148e27874SAdam Thomson DA732X_BIAS_EN); 143248e27874SAdam Thomson 143348e27874SAdam Thomson mdelay(DA732X_STARTUP_DELAY); 143448e27874SAdam Thomson 143548e27874SAdam Thomson /* Disable Fast Charge and enable DAC ref voltage */ 1436192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_REF1, 143748e27874SAdam Thomson DA732X_REFBUFX2_EN); 143848e27874SAdam Thomson 143948e27874SAdam Thomson /* Enable bypass DSP routing */ 1440192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_DATA_ROUTE, 144148e27874SAdam Thomson DA732X_BYPASS_DSP); 144248e27874SAdam Thomson 144348e27874SAdam Thomson /* Enable Digital subsystem */ 1444192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_DSP_CTRL, 144548e27874SAdam Thomson DA732X_DIGITAL_EN); 144648e27874SAdam Thomson 1447192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_SPARE1_OUT, 144848e27874SAdam Thomson DA732X_HP_DRIVER_EN | 144948e27874SAdam Thomson DA732X_HP_GATE_LOW | 145048e27874SAdam Thomson DA732X_HP_LOOP_GAIN_CTRL); 1451192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_HP_LIN1_GNDSEL, 145248e27874SAdam Thomson DA732X_HP_OUT_GNDSEL); 145348e27874SAdam Thomson 1454192ce2fbSKuninori Morimoto da732x_set_charge_pump(component, DA732X_ENABLE_CP); 145548e27874SAdam Thomson 1456192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_CLK_EN1, 145748e27874SAdam Thomson DA732X_SYS3_CLK_EN | DA732X_PC_CLK_EN); 145848e27874SAdam Thomson 145948e27874SAdam Thomson /* Enable Zero Crossing */ 1460192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_INP_ZC_EN, 146148e27874SAdam Thomson DA732X_MIC1_PRE_ZC_EN | 146248e27874SAdam Thomson DA732X_MIC1_ZC_EN | 146348e27874SAdam Thomson DA732X_MIC2_PRE_ZC_EN | 146448e27874SAdam Thomson DA732X_MIC2_ZC_EN | 146548e27874SAdam Thomson DA732X_AUXL_ZC_EN | 146648e27874SAdam Thomson DA732X_AUXR_ZC_EN | 146748e27874SAdam Thomson DA732X_MIC3_PRE_ZC_EN | 146848e27874SAdam Thomson DA732X_MIC3_ZC_EN); 1469192ce2fbSKuninori Morimoto snd_soc_component_write(component, DA732X_REG_OUT_ZC_EN, 147048e27874SAdam Thomson DA732X_HPL_ZC_EN | DA732X_HPR_ZC_EN | 147148e27874SAdam Thomson DA732X_LIN2_ZC_EN | DA732X_LIN3_ZC_EN | 147248e27874SAdam Thomson DA732X_LIN4_ZC_EN); 147348e27874SAdam Thomson 1474192ce2fbSKuninori Morimoto da732x_hp_dc_offset_cancellation(component); 147548e27874SAdam Thomson 147630812ccaSLars-Peter Clausen regcache_cache_only(da732x->regmap, false); 147730812ccaSLars-Peter Clausen regcache_sync(da732x->regmap); 147848e27874SAdam Thomson } else { 1479192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, DA732X_REG_BIAS_EN, 148048e27874SAdam Thomson DA732X_BIAS_BOOST_MASK, 148148e27874SAdam Thomson DA732X_BIAS_BOOST_50PC); 1482192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, DA732X_REG_PLL_CTRL, 148348e27874SAdam Thomson DA732X_PLL_EN, 0); 148448e27874SAdam Thomson da732x->pll_en = false; 148548e27874SAdam Thomson } 148648e27874SAdam Thomson break; 148748e27874SAdam Thomson case SND_SOC_BIAS_OFF: 148830812ccaSLars-Peter Clausen regcache_cache_only(da732x->regmap, true); 1489192ce2fbSKuninori Morimoto da732x_set_charge_pump(component, DA732X_DISABLE_CP); 1490192ce2fbSKuninori Morimoto snd_soc_component_update_bits(component, DA732X_REG_BIAS_EN, DA732X_BIAS_EN, 149148e27874SAdam Thomson DA732X_BIAS_DIS); 149248e27874SAdam Thomson da732x->pll_en = false; 149348e27874SAdam Thomson break; 149448e27874SAdam Thomson } 149548e27874SAdam Thomson 149648e27874SAdam Thomson return 0; 149748e27874SAdam Thomson } 149848e27874SAdam Thomson 1499192ce2fbSKuninori Morimoto static const struct snd_soc_component_driver soc_component_dev_da732x = { 150048e27874SAdam Thomson .set_bias_level = da732x_set_bias_level, 150148e27874SAdam Thomson .controls = da732x_snd_controls, 150248e27874SAdam Thomson .num_controls = ARRAY_SIZE(da732x_snd_controls), 150348e27874SAdam Thomson .dapm_widgets = da732x_dapm_widgets, 150448e27874SAdam Thomson .num_dapm_widgets = ARRAY_SIZE(da732x_dapm_widgets), 150548e27874SAdam Thomson .dapm_routes = da732x_dapm_routes, 150648e27874SAdam Thomson .num_dapm_routes = ARRAY_SIZE(da732x_dapm_routes), 150748e27874SAdam Thomson .set_pll = da732x_set_dai_pll, 1508192ce2fbSKuninori Morimoto .idle_bias_on = 1, 1509192ce2fbSKuninori Morimoto .use_pmdown_time = 1, 1510192ce2fbSKuninori Morimoto .endianness = 1, 1511192ce2fbSKuninori Morimoto .non_legacy_dai_naming = 1, 151248e27874SAdam Thomson }; 151348e27874SAdam Thomson 15147a79e94eSBill Pemberton static int da732x_i2c_probe(struct i2c_client *i2c, 151548e27874SAdam Thomson const struct i2c_device_id *id) 151648e27874SAdam Thomson { 151748e27874SAdam Thomson struct da732x_priv *da732x; 151848e27874SAdam Thomson unsigned int reg; 151948e27874SAdam Thomson int ret; 152048e27874SAdam Thomson 152148e27874SAdam Thomson da732x = devm_kzalloc(&i2c->dev, sizeof(struct da732x_priv), 152248e27874SAdam Thomson GFP_KERNEL); 152348e27874SAdam Thomson if (!da732x) 152448e27874SAdam Thomson return -ENOMEM; 152548e27874SAdam Thomson 152648e27874SAdam Thomson i2c_set_clientdata(i2c, da732x); 152748e27874SAdam Thomson 152848e27874SAdam Thomson da732x->regmap = devm_regmap_init_i2c(i2c, &da732x_regmap); 152948e27874SAdam Thomson if (IS_ERR(da732x->regmap)) { 153048e27874SAdam Thomson ret = PTR_ERR(da732x->regmap); 153148e27874SAdam Thomson dev_err(&i2c->dev, "Failed to initialize regmap\n"); 153248e27874SAdam Thomson goto err; 153348e27874SAdam Thomson } 153448e27874SAdam Thomson 153548e27874SAdam Thomson ret = regmap_read(da732x->regmap, DA732X_REG_ID, ®); 153648e27874SAdam Thomson if (ret < 0) { 153748e27874SAdam Thomson dev_err(&i2c->dev, "Failed to read ID register: %d\n", ret); 153848e27874SAdam Thomson goto err; 153948e27874SAdam Thomson } 154048e27874SAdam Thomson 154148e27874SAdam Thomson dev_info(&i2c->dev, "Revision: %d.%d\n", 154205b00067SAxel Lin (reg & DA732X_ID_MAJOR_MASK) >> 4, 154305b00067SAxel Lin (reg & DA732X_ID_MINOR_MASK)); 154448e27874SAdam Thomson 1545192ce2fbSKuninori Morimoto ret = devm_snd_soc_register_component(&i2c->dev, 1546192ce2fbSKuninori Morimoto &soc_component_dev_da732x, 154748e27874SAdam Thomson da732x_dai, ARRAY_SIZE(da732x_dai)); 154848e27874SAdam Thomson if (ret != 0) 1549192ce2fbSKuninori Morimoto dev_err(&i2c->dev, "Failed to register component.\n"); 155048e27874SAdam Thomson 155148e27874SAdam Thomson err: 155248e27874SAdam Thomson return ret; 155348e27874SAdam Thomson } 155448e27874SAdam Thomson 15557a79e94eSBill Pemberton static int da732x_i2c_remove(struct i2c_client *client) 155648e27874SAdam Thomson { 155748e27874SAdam Thomson return 0; 155848e27874SAdam Thomson } 155948e27874SAdam Thomson 156048e27874SAdam Thomson static const struct i2c_device_id da732x_i2c_id[] = { 156148e27874SAdam Thomson { "da7320", 0}, 156248e27874SAdam Thomson { } 156348e27874SAdam Thomson }; 156448e27874SAdam Thomson MODULE_DEVICE_TABLE(i2c, da732x_i2c_id); 156548e27874SAdam Thomson 156648e27874SAdam Thomson static struct i2c_driver da732x_i2c_driver = { 156748e27874SAdam Thomson .driver = { 156848e27874SAdam Thomson .name = "da7320", 156948e27874SAdam Thomson }, 157048e27874SAdam Thomson .probe = da732x_i2c_probe, 15717a79e94eSBill Pemberton .remove = da732x_i2c_remove, 157248e27874SAdam Thomson .id_table = da732x_i2c_id, 157348e27874SAdam Thomson }; 157448e27874SAdam Thomson 157548e27874SAdam Thomson module_i2c_driver(da732x_i2c_driver); 157648e27874SAdam Thomson 157748e27874SAdam Thomson 157848e27874SAdam Thomson MODULE_DESCRIPTION("ASoC DA732X driver"); 157948e27874SAdam Thomson MODULE_AUTHOR("Michal Hajduk <michal.hajduk@diasemi.com>"); 158048e27874SAdam Thomson MODULE_LICENSE("GPL"); 1581