delete old driver of rt5621
author陈金泉 <chenjq@rock-chips.com>
Tue, 22 Nov 2011 11:39:01 +0000 (19:39 +0800)
committer陈金泉 <chenjq@rock-chips.com>
Tue, 22 Nov 2011 11:39:01 +0000 (19:39 +0800)
sound/soc/codecs/alc5621.c [deleted file]
sound/soc/codecs/alc5621.h [deleted file]
sound/soc/rk29/rk29_rt5621.c [deleted file]

diff --git a/sound/soc/codecs/alc5621.c b/sound/soc/codecs/alc5621.c
deleted file mode 100644 (file)
index ab04ab7..0000000
+++ /dev/null
@@ -1,1932 +0,0 @@
-#include <linux/module.h>\r
-#include <linux/moduleparam.h>\r
-#include <linux/version.h>\r
-#include <linux/kernel.h>\r
-#include <linux/init.h>\r
-#include <linux/delay.h>\r
-#include <linux/pm.h>\r
-#include <linux/i2c.h>\r
-#include <linux/platform_device.h>\r
-\r
-#include <sound/core.h>\r
-#include <sound/pcm.h>\r
-#include <sound/pcm_params.h>\r
-#include <sound/soc.h>\r
-#include <sound/soc-dapm.h>\r
-#include <sound/initval.h>\r
-#include <asm/div64.h>\r
-#include "alc5621.h"\r
-\r
-#if REALTEK_HWDEP\r
-\r
-#include <linux/ioctl.h>\r
-#include <linux/types.h>\r
-\r
-#endif\r
-\r
-#define AUDIO_NAME "rt5621"\r
-#define RT5621_VERSION "alsa 1.0.21 0.05"\r
-\r
-#ifdef RT5621_DEBUG\r
-#define dbg(format, arg...) \\r
-       printk(KERN_DEBUG AUDIO_NAME ": " format "\n" , ## arg)\r
-#else\r
-#define dbg(format, arg...) do {} while (0)\r
-#endif\r
-#define err(format, arg...) \\r
-       printk(KERN_ERR AUDIO_NAME ": " format "\n" , ## arg)\r
-#define info(format, arg...) \\r
-       printk(KERN_INFO AUDIO_NAME ": " format "\n" , ## arg)\r
-#define warn(format, arg...) \\r
-       printk(KERN_WARNING AUDIO_NAME ": " format "\n" , ## arg)\r
-       \r
-static int caps_charge = 500;\r
-module_param(caps_charge, int, 0);\r
-MODULE_PARM_DESC(caps_charge, "RT5621 cap charge time (msecs)");\r
-\r
-/* codec private data */\r
-struct rt5621_priv {\r
-       unsigned int sysclk;\r
-};\r
-\r
-static struct snd_soc_device *rt5621_socdev;\r
-\r
-struct rt5621_reg{\r
-\r
-       u8 reg_index;\r
-       u16 reg_value;\r
-};\r
-\r
-static struct rt5621_reg init_data[] = {\r
-       {RT5621_AUDIO_INTERFACE,        0x8000},    //set I2S codec to slave mode\r
-       {RT5621_STEREO_DAC_VOL,         0x0808},    //default stereo DAC volume to 0db\r
-       {RT5621_OUTPUT_MIXER_CTRL,      0x0740},    //default output mixer control      \r
-       {RT5621_ADC_REC_MIXER,          0x3f3f},    //set record source is Mic1 by default\r
-       {RT5621_MIC_CTRL,               0x0500},    //set Mic1,Mic2 boost 20db  \r
-       {RT5621_SPK_OUT_VOL,            0x8080},    //default speaker volume to 0db \r
-       {RT5621_HP_OUT_VOL,             0x8888},    //default HP volume to -12db        \r
-       {RT5621_ADD_CTRL_REG,           0x5f00},    //Class AB/D speaker ratio is 1VDD\r
-       {RT5621_STEREO_AD_DA_CLK_CTRL,  0x066d},    //set Dac filter to 256fs\r
-       {RT5621_HID_CTRL_INDEX,         0x46},      //Class D setting\r
-       {RT5621_HID_CTRL_DATA,          0xFFFF},    //power on Class D Internal register\r
-};\r
-\r
-#define RT5621_INIT_REG_NUM ARRAY_SIZE(init_data)\r
-\r
-/*\r
- * rt5621 register cache\r
- * We can't read the RT5621 register space when we\r
- * are using 2 wire for device control, so we cache them instead.\r
- */\r
-static const u16 rt5621_reg[0x80/2];\r
-\r
-\r
-/* virtual HP mixers regs */\r
-#define HPL_MIXER      0x80\r
-#define HPR_MIXER      0x82\r
-/*reg84*/\r
-/*bit0,1:for hp pga power control\r
- *bit2,3:for aux pga power control\r
- */\r
-#define MISC_FUNC_REG 0x84\r
-static u16 reg80=0,reg82=0, reg84 = 0;\r
-\r
-\r
-/*\r
- * read rt5621 register cache\r
- */\r
-static inline unsigned int rt5621_read_reg_cache(struct snd_soc_codec *codec,\r
-       unsigned int reg)\r
-{\r
-       u16 *cache = codec->reg_cache;\r
-       if (reg < 1 || reg > (ARRAY_SIZE(rt5621_reg) + 1))\r
-               return -1;\r
-       return cache[reg/2];\r
-}\r
-\r
-\r
-/*\r
- * write rt5621 register cache\r
- */\r
-\r
-static inline void rt5621_write_reg_cache(struct snd_soc_codec *codec,\r
-       unsigned int reg, unsigned int value)\r
-{\r
-       u16 *cache = codec->reg_cache;\r
-       if (reg < 0 || reg > 0x7e)\r
-               return;\r
-       cache[reg/2] = value;\r
-}\r
-\r
-\r
-\r
-static int rt5621_write(struct snd_soc_codec *codec, unsigned int reg,\r
-       unsigned int value)\r
-{\r
-       u8 data[3];\r
-\r
-       if(reg>0x7E)\r
-       {\r
-               if(reg==HPL_MIXER)\r
-                       reg80=value;\r
-               else if(reg==HPR_MIXER)\r
-                       reg82=value;\r
-               else if (reg == MISC_FUNC_REG)\r
-                       reg84 = value;\r
-               else\r
-                       return -EIO;\r
-       \r
-               return 0;       \r
-       }       \r
-\r
-\r
-       printk("rt5621 write reg=%x,value=%x\n",reg,value);\r
-       data[0] = reg;\r
-       data[1] = (0xFF00 & value) >> 8;\r
-       data[2] = 0x00FF & value;\r
-\r
-       if (codec->hw_write(codec->control_data, data, 3) == 3)\r
-       {\r
-               rt5621_write_reg_cache (codec, reg, value);             \r
-               printk(KERN_INFO "rt5621 write reg=%x,value=%x\n",reg,value);\r
-               return 0;\r
-       }\r
-       else\r
-       {\r
-               printk(KERN_ERR "rt5621 write faile\n");\r
-               return -EIO;\r
-       }\r
-}\r
-\r
-\r
-static unsigned int rt5621_read(struct snd_soc_codec *codec, unsigned int reg)\r
-{\r
-       u8 data[2]={0};\r
-       unsigned int value=0x0;\r
-\r
-       if(reg>0x7E)\r
-       {\r
-               if(reg==HPL_MIXER)\r
-                return reg80;\r
-               else if(reg==HPR_MIXER)\r
-                return reg82;\r
-               else if (reg == MISC_FUNC_REG)\r
-                       return reg84;\r
-               else\r
-                return -EIO;\r
-                \r
-                return -EIO;   \r
-       }\r
-\r
-\r
-       data[0] = reg;\r
-//flove031811_S\r
-#if 0\r
-      i2c_master_recv(codec->control_data, data, 2);\r
-      \r
-       value = (data[0]<<8) | data[1];         \r
-       printk("rt5621_read reg%x=%x\n",reg,value);\r
-#elif 1\r
-\r
-       i2c_master_reg8_recv(codec->control_data,reg,data, 2,100 * 1000);\r
-\r
-             value = (data[0]<<8) | data[1];         \r
-       printk("rt5621_read reg%x=%x\n",reg,value);\r
-          return value;\r
-\r
-#else  \r
-       if(codec->hw_write(codec->control_data, data, 1) ==1)\r
-       {\r
-               i2c_master_recv(codec->control_data, data, 2);\r
-\r
-               value = (data[0]<<8) | data[1];         \r
-               printk(KERN_DEBUG "rt5621 read reg%x=%x\n",reg,value);\r
-               \r
-               return value;\r
-       }\r
-       else\r
-       {\r
-               printk(KERN_ERR "rt5621 read faile\n");\r
-               return -EIO;                    \r
-       }               \r
-#endif\r
-//flove031811_E        \r
-}\r
-\r
-#define rt5621_write_mask(c, reg, value, mask) snd_soc_update_bits(c, reg, mask, value)\r
-\r
-\r
-#define rt5621_reset(c) rt5621_write(c, 0x0, 0)\r
-\r
-static unsigned int rt5621_read_index(struct snd_soc_codec *codec, unsigned int index)\r
-{\r
-       unsigned int value;\r
-\r
-       rt5621_write(codec, 0x6a, index);\r
-       mdelay(1);\r
-       value = rt5621_read(codec, 0x6c);\r
-       return value;\r
-}\r
-\r
-static int rt5621_init_reg(struct snd_soc_codec *codec)\r
-{\r
-       int i;\r
-\r
-       for (i = 0; i < RT5621_INIT_REG_NUM; i++)\r
-       {\r
-               rt5621_write(codec, init_data[i].reg_index, init_data[i].reg_value);\r
-       }\r
-\r
-       return 0;\r
-}\r
-\r
-\r
-#if !USE_DAPM_CONTROL\r
-//*****************************************************************************\r
-//\r
-//function:Change audio codec power status\r
-//\r
-//*****************************************************************************\r
-static int rt5621_ChangeCodecPowerStatus(struct snd_soc_codec *codec,int power_state)\r
-{\r
-       unsigned short int PowerDownState=0;\r
-\r
-       switch(power_state)\r
-       {\r
-               case POWER_STATE_D0:                    //FULL ON-----power on all power\r
-                       \r
-                       rt5621_write(codec,RT5621_PWR_MANAG_ADD1,~PowerDownState);\r
-                       rt5621_write(codec,RT5621_PWR_MANAG_ADD2,~PowerDownState);\r
-                       rt5621_write(codec,RT5621_PWR_MANAG_ADD3,~PowerDownState);\r
-\r
-               break;  \r
-\r
-               case POWER_STATE_D1:            //LOW ON-----\r
-\r
-\r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD2 ,PWR_VREF |PWR_DAC_REF_CIR |PWR_L_DAC_CLK |PWR_R_DAC_CLK |PWR_L_HP_MIXER |PWR_R_HP_MIXER|\r
-                                                                                                        PWR_L_ADC_CLK_GAIN |PWR_R_ADC_CLK_GAIN |PWR_L_ADC_REC_MIXER |PWR_R_ADC_REC_MIXER|PWR_CLASS_AB\r
-                                                                                                       ,PWR_VREF |PWR_DAC_REF_CIR |PWR_L_DAC_CLK |PWR_R_DAC_CLK |PWR_L_HP_MIXER |PWR_R_HP_MIXER|\r
-                                                                                                        PWR_L_ADC_CLK_GAIN |PWR_R_ADC_CLK_GAIN |PWR_L_ADC_REC_MIXER |PWR_R_ADC_REC_MIXER|PWR_CLASS_AB);\r
-\r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD3 ,PWR_MAIN_BIAS|PWR_HP_R_OUT_VOL|PWR_HP_L_OUT_VOL|PWR_SPK_OUT|\r
-                                                                                                        PWR_MIC1_FUN_CTRL|PWR_MIC1_BOOST_MIXER\r
-                                                                                                       ,PWR_MAIN_BIAS|PWR_HP_R_OUT_VOL|PWR_HP_L_OUT_VOL|PWR_SPK_OUT|\r
-                                                                                                        PWR_MIC1_FUN_CTRL|PWR_MIC1_BOOST_MIXER);                       \r
-\r
-\r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD1 ,PWR_MAIN_I2S_EN|PWR_HP_OUT_ENH_AMP|PWR_HP_OUT_AMP|PWR_MIC1_BIAS_EN\r
-                                                                                                       ,PWR_MAIN_I2S_EN|PWR_HP_OUT_ENH_AMP|PWR_HP_OUT_AMP|PWR_MIC1_BIAS_EN);\r
-                                               \r
-               break;\r
-\r
-               case POWER_STATE_D1_PLAYBACK:   //Low on of Playback\r
-\r
-\r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD2,PWR_VREF|PWR_DAC_REF_CIR|PWR_L_DAC_CLK|PWR_R_DAC_CLK|PWR_L_HP_MIXER|PWR_R_HP_MIXER|PWR_CLASS_AB|PWR_CLASS_D\r
-                                                                                                                ,PWR_VREF|PWR_DAC_REF_CIR|PWR_L_DAC_CLK|PWR_R_DAC_CLK|PWR_L_HP_MIXER|PWR_R_HP_MIXER|PWR_CLASS_AB|PWR_CLASS_D);\r
-\r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD3,PWR_MAIN_BIAS|PWR_HP_R_OUT_VOL|PWR_HP_L_OUT_VOL|PWR_SPK_OUT \r
-                                                                                                                ,PWR_MAIN_BIAS|PWR_HP_R_OUT_VOL|PWR_HP_L_OUT_VOL|PWR_SPK_OUT);         \r
-\r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD1,PWR_MAIN_I2S_EN|PWR_HP_OUT_ENH_AMP|PWR_HP_OUT_AMP\r
-                                                                                                                ,PWR_MAIN_I2S_EN|PWR_HP_OUT_ENH_AMP|PWR_HP_OUT_AMP);\r
-                                                                       \r
-\r
-               break;\r
-\r
-               case POWER_STATE_D1_RECORD:     //Low on of Record\r
-\r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD1 ,PWR_MAIN_I2S_EN|PWR_MIC1_BIAS_EN\r
-                                                                                                                 ,PWR_MAIN_I2S_EN|PWR_MIC1_BIAS_EN);                                                                                      \r
-                                                                                       \r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD2 ,PWR_VREF|PWR_L_ADC_CLK_GAIN|PWR_R_ADC_CLK_GAIN|PWR_L_ADC_REC_MIXER|PWR_R_ADC_REC_MIXER\r
-                                                                                                             ,PWR_VREF|PWR_L_ADC_CLK_GAIN|PWR_R_ADC_CLK_GAIN|PWR_L_ADC_REC_MIXER|PWR_R_ADC_REC_MIXER);\r
-\r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD3 ,PWR_MAIN_BIAS|PWR_MIC2_BOOST_MIXER|PWR_MIC1_BOOST_MIXER\r
-                                                                                                             ,PWR_MAIN_BIAS|PWR_MIC2_BOOST_MIXER|PWR_MIC1_BOOST_MIXER);                \r
-       \r
-               break;\r
-\r
-               case POWER_STATE_D2:            //STANDBY----\r
-\r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD1 ,0,PWR_MAIN_I2S_EN|PWR_HP_OUT_ENH_AMP|PWR_HP_OUT_AMP|PWR_MIC1_BIAS_EN);                                                                                      \r
-\r
-\r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD3 ,0,PWR_HP_R_OUT_VOL|PWR_HP_L_OUT_VOL|PWR_SPK_OUT|PWR_MIC1_FUN_CTRL|PWR_MIC1_BOOST_MIXER);\r
-\r
-                                                                                                               \r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD2 ,0,PWR_DAC_REF_CIR |PWR_L_DAC_CLK |PWR_R_DAC_CLK |PWR_L_HP_MIXER |PWR_R_HP_MIXER|\r
-                                                                                                                        PWR_L_ADC_CLK_GAIN |PWR_R_ADC_CLK_GAIN |PWR_L_ADC_REC_MIXER |PWR_R_ADC_REC_MIXER|PWR_CLASS_AB|PWR_CLASS_D);\r
-\r
-               \r
-               break;\r
-\r
-               case POWER_STATE_D2_PLAYBACK:   //STANDBY of playback\r
-\r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD3 ,0,/*PWR_HP_R_OUT_VOL|PWR_HP_L_OUT_VOL|*/PWR_SPK_OUT);\r
-\r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD1 ,0,PWR_HP_OUT_ENH_AMP|PWR_HP_OUT_AMP);                                                                                       \r
-                                                                       \r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD2 ,0,PWR_DAC_REF_CIR|PWR_L_DAC_CLK|PWR_R_DAC_CLK|PWR_L_HP_MIXER|PWR_R_HP_MIXER|PWR_CLASS_AB|PWR_CLASS_D);\r
-\r
-               break;\r
-\r
-               case POWER_STATE_D2_RECORD:             //STANDBY of record\r
-\r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD1 ,0,PWR_MIC1_BIAS_EN);                                                                                        \r
-                                                                                       \r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD2 ,0,PWR_L_ADC_CLK_GAIN|PWR_R_ADC_CLK_GAIN|PWR_L_ADC_REC_MIXER|PWR_R_ADC_REC_MIXER);\r
-\r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD3 ,0,PWR_MIC2_BOOST_MIXER|PWR_MIC1_BOOST_MIXER);            \r
-\r
-               break;          \r
-\r
-               case POWER_STATE_D3:            //SLEEP\r
-               case POWER_STATE_D4:            //OFF----power off all power\r
-                       rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD1 ,0,PWR_HP_OUT_ENH_AMP|PWR_HP_OUT_AMP);            \r
-                       rt5621_write(codec,RT5621_PWR_MANAG_ADD3,0);\r
-                       rt5621_write(codec,RT5621_PWR_MANAG_ADD1,0);\r
-                       rt5621_write(codec,RT5621_PWR_MANAG_ADD2,0);\r
-                                               \r
-               break;  \r
-\r
-               default:\r
-\r
-               break;\r
-       }\r
-\r
-       return 0;\r
-}\r
-\r
-\r
-//*****************************************************************************\r
-//\r
-//function AudioOutEnable:Mute/Unmute audio out channel\r
-//                                                     WavOutPath:output channel\r
-//                                                     Mute :Mute/Unmute output channel                                                                                        \r
-//\r
-//*****************************************************************************\r
-static int rt5621_AudioOutEnable(struct snd_soc_codec *codec,unsigned short int WavOutPath,int Mute)\r
-{\r
-       int RetVal=0;   \r
-\r
-       if(Mute)\r
-       {\r
-               switch(WavOutPath)\r
-               {\r
-                       case RT_WAVOUT_ALL_ON:\r
-\r
-                               RetVal=rt5621_write_mask(codec,RT5621_SPK_OUT_VOL,RT_L_MUTE|RT_R_MUTE,RT_L_MUTE|RT_R_MUTE);     //Mute Speaker right/left channel\r
-                               RetVal=rt5621_write_mask(codec,RT5621_HP_OUT_VOL,RT_L_MUTE|RT_R_MUTE,RT_L_MUTE|RT_R_MUTE);      //Mute headphone right/left channel\r
-                               RetVal=rt5621_write_mask(codec,RT5621_MONO_AUX_OUT_VOL,RT_L_MUTE|RT_R_MUTE,RT_L_MUTE|RT_R_MUTE);        //Mute Aux/Mono right/left channel\r
-                               RetVal=rt5621_write_mask(codec,RT5621_STEREO_DAC_VOL,RT_M_HP_MIXER|RT_M_SPK_MIXER|RT_M_MONO_MIXER\r
-                                                                                                                         ,RT_M_HP_MIXER|RT_M_SPK_MIXER|RT_M_MONO_MIXER);       //Mute DAC to HP,Speaker,Mono Mixer\r
-               \r
-                       break;\r
-               \r
-                       case RT_WAVOUT_HP:\r
-\r
-                               RetVal=rt5621_write_mask(codec,RT5621_HP_OUT_VOL,RT_L_MUTE|RT_R_MUTE,RT_L_MUTE|RT_R_MUTE);      //Mute headphone right/left channel\r
-                       \r
-                       break;\r
-\r
-                       case RT_WAVOUT_SPK:\r
-                               \r
-                               RetVal=rt5621_write_mask(codec,RT5621_SPK_OUT_VOL,RT_L_MUTE|RT_R_MUTE,RT_L_MUTE|RT_R_MUTE);     //Mute Speaker right/left channel                       \r
-\r
-                       break;\r
-                       \r
-                       case RT_WAVOUT_AUXOUT:\r
-\r
-                               RetVal=rt5621_write_mask(codec,RT5621_MONO_AUX_OUT_VOL,RT_L_MUTE|RT_R_MUTE,RT_L_MUTE|RT_R_MUTE);        //Mute AuxOut right/left channel\r
-\r
-                       break;\r
-\r
-                       case RT_WAVOUT_MONO:\r
-\r
-                               RetVal=rt5621_write_mask(codec,RT5621_MONO_AUX_OUT_VOL,RT_L_MUTE,RT_L_MUTE);    //Mute MonoOut channel          \r
-\r
-                       break;\r
-\r
-                       case RT_WAVOUT_DAC:\r
-\r
-                               RetVal=rt5621_write_mask(codec,RT5621_STEREO_DAC_VOL,RT_M_HP_MIXER|RT_M_SPK_MIXER|RT_M_MONO_MIXER\r
-                                                                                                                         ,RT_M_HP_MIXER|RT_M_SPK_MIXER|RT_M_MONO_MIXER);       //Mute DAC to HP,Speaker,Mono Mixer                             \r
-                       break;\r
-\r
-                       default:\r
-\r
-                               return 0;\r
-\r
-               }\r
-       }\r
-       else\r
-       {\r
-               switch(WavOutPath)\r
-               {\r
-\r
-                       case RT_WAVOUT_ALL_ON:\r
-\r
-                               RetVal=rt5621_write_mask(codec,RT5621_SPK_OUT_VOL               ,0,RT_L_MUTE|RT_R_MUTE);        //Mute Speaker right/left channel\r
-                               RetVal=rt5621_write_mask(codec,RT5621_HP_OUT_VOL                ,0,RT_L_MUTE|RT_R_MUTE);        //Mute headphone right/left channel\r
-                               RetVal=rt5621_write_mask(codec,RT5621_MONO_AUX_OUT_VOL  ,0,RT_L_MUTE|RT_R_MUTE);        //Mute Aux/Mono right/left channel\r
-                               RetVal=rt5621_write_mask(codec,RT5621_STEREO_DAC_VOL    ,0,RT_M_HP_MIXER|RT_M_SPK_MIXER|RT_M_MONO_MIXER);       //Mute DAC to HP,Speaker,Mono Mixer\r
-               \r
-                       break;\r
-               \r
-                       case RT_WAVOUT_HP:\r
-\r
-                               RetVal=rt5621_write_mask(codec,RT5621_HP_OUT_VOL,0,RT_L_MUTE|RT_R_MUTE);        //UnMute headphone right/left channel   \r
-                                       \r
-                       break;\r
-\r
-                       case RT_WAVOUT_SPK:\r
-                               \r
-                               RetVal=rt5621_write_mask(codec,RT5621_SPK_OUT_VOL,0,RT_L_MUTE|RT_R_MUTE);       //unMute Speaker right/left channel                     \r
-\r
-                       break;\r
-                       \r
-                       case RT_WAVOUT_AUXOUT:\r
-\r
-                               RetVal=rt5621_write_mask(codec,RT5621_MONO_AUX_OUT_VOL,0,RT_L_MUTE|RT_R_MUTE);//unMute AuxOut right/left channel\r
-\r
-                       break;\r
-\r
-                       case RT_WAVOUT_MONO:\r
-\r
-                               RetVal=rt5621_write_mask(codec,RT5621_MONO_AUX_OUT_VOL,0,RT_L_MUTE);    //unMute MonoOut channel                \r
-\r
-                       break;\r
-\r
-                       case RT_WAVOUT_DAC:\r
-\r
-                               RetVal=rt5621_write_mask(codec,RT5621_STEREO_DAC_VOL,0,RT_M_HP_MIXER|RT_M_SPK_MIXER|RT_M_MONO_MIXER);   //unMute DAC to HP,Speaker,Mono Mixer\r
-\r
-                       default:\r
-                               return 0;\r
-               }\r
-\r
-       }\r
-       \r
-       return RetVal;\r
-}\r
-\r
-\r
-//*****************************************************************************\r
-//\r
-//function:Enable/Disable ADC input source control\r
-//\r
-//*****************************************************************************\r
-static int Enable_ADC_Input_Source(struct snd_soc_codec *codec,unsigned short int ADC_Input_Sour,int Enable)\r
-{\r
-       int bRetVal=0;\r
-       \r
-       if(Enable)\r
-       {\r
-               //Enable ADC source \r
-               bRetVal=rt5621_write_mask(codec,RT5621_ADC_REC_MIXER,0,ADC_Input_Sour);\r
-       }\r
-       else\r
-       {\r
-               //Disable ADC source            \r
-               bRetVal=rt5621_write_mask(codec,RT5621_ADC_REC_MIXER,ADC_Input_Sour,ADC_Input_Sour);\r
-       }\r
-\r
-       return bRetVal;\r
-}\r
-#endif\r
-\r
-\r
-//static const char *rt5621_spkl_pga[] = {"Vmid","HPL mixer","SPK mixer","Mono Mixer"};\r
-static const char *rt5621_spkn_source_sel[] = {"RN", "RP", "LN"};\r
-static const char *rt5621_spk_pga[] = {"Vmid","HP mixer","SPK mixer","Mono Mixer"};\r
-static const char *rt5621_hpl_pga[]  = {"Vmid","HPL mixer"};\r
-static const char *rt5621_hpr_pga[]  = {"Vmid","HPR mixer"};\r
-static const char *rt5621_mono_pga[] = {"Vmid","HP mixer","SPK mixer","Mono Mixer"};\r
-static const char *rt5621_amp_type_sel[] = {"Class AB","Class D"};\r
-static const char *rt5621_mic_boost_sel[] = {"Bypass","20db","30db","40db"};\r
-\r
-static const struct soc_enum rt5621_enum[] = {\r
-SOC_ENUM_SINGLE(RT5621_OUTPUT_MIXER_CTRL, 14, 3, rt5621_spkn_source_sel), /* spkn source from hp mixer */      \r
-SOC_ENUM_SINGLE(RT5621_OUTPUT_MIXER_CTRL, 10, 4, rt5621_spk_pga), /* spk input sel 1 */        \r
-SOC_ENUM_SINGLE(RT5621_OUTPUT_MIXER_CTRL, 9, 2, rt5621_hpl_pga), /* hp left input sel 2 */     \r
-SOC_ENUM_SINGLE(RT5621_OUTPUT_MIXER_CTRL, 8, 2, rt5621_hpr_pga), /* hp right input sel 3 */    \r
-SOC_ENUM_SINGLE(RT5621_OUTPUT_MIXER_CTRL, 6, 4, rt5621_mono_pga), /* mono input sel 4 */\r
-SOC_ENUM_SINGLE(RT5621_MIC_CTRL                        , 10,4, rt5621_mic_boost_sel), /*Mic1 boost sel 5 */\r
-SOC_ENUM_SINGLE(RT5621_MIC_CTRL                        , 8,4,rt5621_mic_boost_sel), /*Mic2 boost sel 6 */\r
-SOC_ENUM_SINGLE(RT5621_OUTPUT_MIXER_CTRL,13,2,rt5621_amp_type_sel), /*Speaker AMP sel 7 */\r
-};\r
-\r
-static int rt5621_amp_sel_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)\r
-{\r
-       struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);\r
-       struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;\r
-       unsigned short val;\r
-       unsigned short mask, bitmask;\r
-\r
-       for (bitmask = 1; bitmask < e->max; bitmask <<= 1)\r
-               ;\r
-       if (ucontrol->value.enumerated.item[0] > e->max - 1)\r
-               return -EINVAL;\r
-       val = ucontrol->value.enumerated.item[0] << e->shift_l;\r
-       mask = (bitmask - 1) << e->shift_l;\r
-       if (e->shift_l != e->shift_r) {\r
-               if (ucontrol->value.enumerated.item[1] > e->max - 1)\r
-                       return -EINVAL;\r
-               val |= ucontrol->value.enumerated.item[1] << e->shift_r;\r
-               mask |= (bitmask - 1) << e->shift_r;\r
-       }\r
-\r
-        snd_soc_update_bits(codec, e->reg, mask, val);\r
-        val &= (0x1 << 13);\r
-        if (val == 0)\r
-        {\r
-                snd_soc_update_bits(codec, 0x3c, 0x0000, 0x4000);       /*power off classd*/\r
-                snd_soc_update_bits(codec, 0x3c, 0x8000, 0x8000);       /*power on classab*/\r
-        }\r
-        else\r
-       {\r
-                snd_soc_update_bits(codec, 0x3c, 0x0000, 0x8000);       /*power off classab*/\r
-                snd_soc_update_bits(codec, 0x3c, 0x4000, 0x4000);       /*power on classd*/\r
-        }\r
-       return 0;\r
-}\r
-\r
-\r
-\r
-static const struct snd_kcontrol_new rt5621_snd_controls[] = {\r
-SOC_DOUBLE("Speaker Playback Volume",  RT5621_SPK_OUT_VOL, 8, 0, 31, 1),       \r
-SOC_DOUBLE("Speaker Playback Switch",  RT5621_SPK_OUT_VOL, 15, 7, 1, 1),\r
-SOC_DOUBLE("Headphone Playback Volume", RT5621_HP_OUT_VOL, 8, 0, 31, 1),\r
-SOC_DOUBLE("Headphone Playback Switch", RT5621_HP_OUT_VOL,15, 7, 1, 1),\r
-SOC_DOUBLE("AUX Playback Volume",              RT5621_MONO_AUX_OUT_VOL, 8, 0, 31, 1),\r
-SOC_DOUBLE("AUX Playback Switch",              RT5621_MONO_AUX_OUT_VOL, 15, 7, 1, 1),\r
-SOC_DOUBLE("PCM Playback Volume",              RT5621_STEREO_DAC_VOL, 8, 0, 31, 1),\r
-SOC_DOUBLE("Line In Volume",                   RT5621_LINE_IN_VOL, 8, 0, 31, 1),\r
-SOC_SINGLE("Mic 1 Volume",                             RT5621_MIC_VOL, 8, 31, 1),\r
-SOC_SINGLE("Mic 2 Volume",                             RT5621_MIC_VOL, 0, 31, 1),\r
-SOC_ENUM("Mic 1 Boost",                                rt5621_enum[5]),\r
-SOC_ENUM("Mic 2 Boost",                                rt5621_enum[6]),\r
-SOC_ENUM_EXT("Speaker Amp Type",                       rt5621_enum[7], snd_soc_get_enum_double, rt5621_amp_sel_put),\r
-SOC_DOUBLE("AUX In Volume",                    RT5621_AUXIN_VOL, 8, 0, 31, 1),\r
-SOC_DOUBLE("Capture Volume",                   RT5621_ADC_REC_GAIN, 7, 0, 31, 0),\r
-};\r
-\r
-\r
-\r
-/* add non dapm controls */\r
-static int rt5621_add_controls(struct snd_soc_codec *codec)\r
-{\r
-       int err, i;\r
-\r
-       for (i = 0; i < ARRAY_SIZE(rt5621_snd_controls); i++) {\r
-               err = snd_ctl_add(codec->card,\r
-                               snd_soc_cnew(&rt5621_snd_controls[i],codec, NULL));\r
-               if (err < 0)\r
-                       return err;\r
-       }\r
-       return 0;\r
-}\r
-\r
-void hp_depop_mode2(struct snd_soc_codec *codec)\r
-{\r
-       rt5621_write_mask(codec, 0x3e, 0x8000, 0x8000);\r
-       rt5621_write_mask(codec, 0x04, 0x8080, 0x8080);\r
-       rt5621_write_mask(codec, 0x3a, 0x0100, 0x0100);\r
-       rt5621_write_mask(codec, 0x3c, 0x2000, 0x2000);\r
-       rt5621_write_mask(codec, 0x3e, 0x0600, 0x0600);\r
-       rt5621_write_mask(codec, 0x5e, 0x0200, 0x0200);\r
-       schedule_timeout_uninterruptible(msecs_to_jiffies(300));\r
-}\r
-\r
-void aux_depop_mode2(struct snd_soc_codec *codec)\r
-{\r
-       rt5621_write_mask(codec, 0x3e, 0x8000, 0x8000);\r
-       rt5621_write_mask(codec, 0x06, 0x8080, 0x8080);\r
-       rt5621_write_mask(codec, 0x3a, 0x0100, 0x0100);\r
-       rt5621_write_mask(codec, 0x3c, 0x2000, 0x2000);\r
-       rt5621_write_mask(codec, 0x3e, 0x6000, 0x6000);\r
-       rt5621_write_mask(codec, 0x5e, 0x0020, 0x0200);\r
-       schedule_timeout_uninterruptible(msecs_to_jiffies(300));\r
-       rt5621_write_mask(codec, 0x3a, 0x0002, 0x0002);\r
-       rt5621_write_mask(codec, 0x3a, 0x0001, 0x0001); \r
-}\r
-#if USE_DAPM_CONTROL\r
-\r
-/*\r
- * _DAPM_ Controls\r
- */\r
-\r
-/* We have to create a fake left and right HP mixers because\r
- * the codec only has a single control that is shared by both channels.\r
- * This makes it impossible to determine the audio path using the current\r
- * register map, thus we add a new (virtual) register to help determine the\r
- * audio route within the device.\r
- */\r
- static int mixer_event (struct snd_soc_dapm_widget *w, \r
-       struct snd_kcontrol *kcontrol, int event)\r
-{\r
-\r
-       u16 l, r, lineIn,mic1,mic2, aux, pcm;\r
-\r
-       l = rt5621_read(w->codec, HPL_MIXER);\r
-       r = rt5621_read(w->codec, HPR_MIXER);\r
-       lineIn = rt5621_read(w->codec, RT5621_LINE_IN_VOL);\r
-       mic2 = rt5621_read(w->codec, RT5621_MIC_ROUTING_CTRL);\r
-       aux = rt5621_read(w->codec,RT5621_AUXIN_VOL);\r
-       pcm = rt5621_read(w->codec, RT5621_STEREO_DAC_VOL);\r
-\r
-\r
-       if (event & SND_SOC_DAPM_PRE_REG)\r
-               return 0;\r
-\r
-       if (l & 0x1 || r & 0x1)\r
-               rt5621_write(w->codec, RT5621_STEREO_DAC_VOL, pcm & 0x7fff);\r
-       else\r
-               rt5621_write(w->codec, RT5621_STEREO_DAC_VOL, pcm | 0x8000);\r
-\r
-       if (l & 0x2 || r & 0x2)\r
-               rt5621_write(w->codec, RT5621_MIC_ROUTING_CTRL, mic2 & 0xff7f);\r
-       else\r
-               rt5621_write(w->codec, RT5621_MIC_ROUTING_CTRL, mic2 | 0x0080);\r
-\r
-       mic1 = rt5621_read(w->codec, RT5621_MIC_ROUTING_CTRL);\r
-       if (l & 0x4 || r & 0x4)\r
-               rt5621_write(w->codec, RT5621_MIC_ROUTING_CTRL, mic1 & 0x7fff);\r
-       else\r
-               rt5621_write(w->codec, RT5621_MIC_ROUTING_CTRL, mic1 | 0x8000);\r
-\r
-       if (l & 0x8 || r & 0x8)\r
-               rt5621_write(w->codec, RT5621_AUXIN_VOL, aux & 0x7fff);\r
-       else\r
-               rt5621_write(w->codec, RT5621_AUXIN_VOL, aux | 0x8000);\r
-\r
-       if (l & 0x10 || r & 0x10)\r
-               rt5621_write(w->codec, RT5621_LINE_IN_VOL, lineIn & 0x7fff);\r
-       else\r
-               rt5621_write(w->codec, RT5621_LINE_IN_VOL, lineIn | 0x8000);\r
-\r
-       return 0;\r
-}\r
-\r
-\r
-static int hp_event(struct snd_soc_dapm_widget *w, \r
-       struct snd_kcontrol *kcontrol, int event)\r
-{\r
-       struct snd_soc_codec *codec = w->codec;\r
-       unsigned int reg = rt5621_read(codec, MISC_FUNC_REG);\r
-       \r
-       if (((reg & 0x03) != 0x00) && ((reg & 0x03) != 0x03))\r
-               return 0;\r
-       \r
-       switch (event)\r
-       {\r
-               case SND_SOC_DAPM_POST_PMU:\r
-                       hp_depop_mode2(codec);\r
-                       rt5621_write_mask(codec, 0x04, 0x0000, 0x8080);\r
-                       rt5621_write_mask(codec, 0x3a, 0x0020, 0x0020);\r
-                       break;\r
-               case SND_SOC_DAPM_POST_PMD:\r
-                       rt5621_write_mask(codec, 0x04, 0x8080, 0x8080);\r
-                       rt5621_write_mask(codec, 0x3a, 0x0000, 0x0010);\r
-                       rt5621_write_mask(codec, 0x3a, 0x0000, 0x0020);\r
-                       rt5621_write_mask(codec, 0x3e, 0x0000, 0x0600);\r
-                       break;  \r
-       }\r
-       return 0;\r
-}\r
-\r
-static int aux_event(struct snd_soc_dapm_widget *w, \r
-       struct snd_kcontrol *kcontrol, int event)\r
-{\r
-       struct snd_soc_codec *codec = w->codec;\r
-       unsigned int reg = rt5621_read(codec, MISC_FUNC_REG);\r
-       \r
-       if (((reg & 0x0c) != 0x00) && ((reg & 0x0c) != 0x0c))\r
-               return 0;\r
-       \r
-       switch (event)\r
-       {\r
-               case SND_SOC_DAPM_POST_PMU:\r
-                       aux_depop_mode2(codec);\r
-                       rt5621_write_mask(codec, 0x06, 0x0000, 0x8080);\r
-                       break;\r
-               case SND_SOC_DAPM_POST_PMD:\r
-                       rt5621_write_mask(codec, 0x06, 0x8080, 0x8080);\r
-                       rt5621_write_mask(codec, 0x3a, 0x0000, 0x0001);\r
-                       rt5621_write_mask(codec, 0x3a, 0x0000, 0x0002);\r
-                       rt5621_write_mask(codec, 0x3e, 0x0000, 0x6000);         \r
-                       break;\r
-       }\r
-       return 0;\r
-}\r
-\r
-/* Left Headphone Mixers */\r
-static const struct snd_kcontrol_new rt5621_hpl_mixer_controls[] = {\r
-SOC_DAPM_SINGLE("LineIn Playback Switch", HPL_MIXER, 4, 1, 0),\r
-SOC_DAPM_SINGLE("AUXIN Playback Switch", HPL_MIXER, 3, 1, 0),\r
-SOC_DAPM_SINGLE("Mic1 Playback Switch", HPL_MIXER, 2, 1, 0),\r
-SOC_DAPM_SINGLE("Mic2 Playback Switch", HPL_MIXER, 1, 1, 0),\r
-SOC_DAPM_SINGLE("PCM Playback Switch", HPL_MIXER, 0, 1, 0),\r
-SOC_DAPM_SINGLE("RecordL Playback Switch", RT5621_ADC_REC_GAIN, 15, 1,1),\r
-};\r
-\r
-/* Right Headphone Mixers */\r
-static const struct snd_kcontrol_new rt5621_hpr_mixer_controls[] = {\r
-SOC_DAPM_SINGLE("LineIn Playback Switch", HPR_MIXER, 4, 1, 0),\r
-SOC_DAPM_SINGLE("AUXIN Playback Switch", HPR_MIXER, 3, 1, 0),\r
-SOC_DAPM_SINGLE("Mic1 Playback Switch", HPR_MIXER, 2, 1, 0),\r
-SOC_DAPM_SINGLE("Mic2 Playback Switch", HPR_MIXER, 1, 1, 0),\r
-SOC_DAPM_SINGLE("PCM Playback Switch", HPR_MIXER, 0, 1, 0),\r
-SOC_DAPM_SINGLE("RecordR Playback Switch", RT5621_ADC_REC_GAIN, 14, 1,1),\r
-};\r
-\r
-//Left Record Mixer\r
-static const struct snd_kcontrol_new rt5621_captureL_mixer_controls[] = {\r
-SOC_DAPM_SINGLE("Mic1 Capture Switch", RT5621_ADC_REC_MIXER, 14, 1, 1),\r
-SOC_DAPM_SINGLE("Mic2 Capture Switch", RT5621_ADC_REC_MIXER, 13, 1, 1),\r
-SOC_DAPM_SINGLE("LineInL Capture Switch",RT5621_ADC_REC_MIXER,12, 1, 1),\r
-SOC_DAPM_SINGLE("AUXIN Capture Switch", RT5621_ADC_REC_MIXER, 11, 1, 1),\r
-SOC_DAPM_SINGLE("HPMixerL Capture Switch", RT5621_ADC_REC_MIXER,10, 1, 1),\r
-SOC_DAPM_SINGLE("SPKMixer Capture Switch",RT5621_ADC_REC_MIXER,9, 1, 1),\r
-SOC_DAPM_SINGLE("MonoMixer Capture Switch",RT5621_ADC_REC_MIXER,8, 1, 1),\r
-};\r
-\r
-\r
-//Right Record Mixer\r
-static const struct snd_kcontrol_new rt5621_captureR_mixer_controls[] = {\r
-SOC_DAPM_SINGLE("Mic1 Capture Switch", RT5621_ADC_REC_MIXER, 6, 1, 1),\r
-SOC_DAPM_SINGLE("Mic2 Capture Switch", RT5621_ADC_REC_MIXER, 5, 1, 1),\r
-SOC_DAPM_SINGLE("LineInR Capture Switch",RT5621_ADC_REC_MIXER,4, 1, 1),\r
-SOC_DAPM_SINGLE("AUXIN Capture Switch", RT5621_ADC_REC_MIXER, 3, 1, 1),\r
-SOC_DAPM_SINGLE("HPMixerR Capture Switch", RT5621_ADC_REC_MIXER,2, 1, 1),\r
-SOC_DAPM_SINGLE("SPKMixer Capture Switch",RT5621_ADC_REC_MIXER,1, 1, 1),\r
-SOC_DAPM_SINGLE("MonoMixer Capture Switch",RT5621_ADC_REC_MIXER,0, 1, 1),\r
-};\r
-\r
-/* Speaker Mixer */\r
-static const struct snd_kcontrol_new rt5621_speaker_mixer_controls[] = {\r
-SOC_DAPM_SINGLE("LineIn Playback Switch", RT5621_LINE_IN_VOL, 14, 1, 1),\r
-SOC_DAPM_SINGLE("AUXIN Playback Switch", RT5621_AUXIN_VOL, 14, 1, 1),\r
-SOC_DAPM_SINGLE("Mic1 Playback Switch", RT5621_MIC_ROUTING_CTRL, 14, 1, 1),\r
-SOC_DAPM_SINGLE("Mic2 Playback Switch", RT5621_MIC_ROUTING_CTRL, 6, 1, 1),\r
-SOC_DAPM_SINGLE("PCM Playback Switch", RT5621_STEREO_DAC_VOL, 14, 1, 1),\r
-};\r
-\r
-\r
-/* Mono Mixer */\r
-static const struct snd_kcontrol_new rt5621_mono_mixer_controls[] = {\r
-SOC_DAPM_SINGLE("LineIn Playback Switch", RT5621_LINE_IN_VOL, 13, 1, 1),\r
-SOC_DAPM_SINGLE("Mic1 Playback Switch", RT5621_MIC_ROUTING_CTRL, 13, 1, 1),\r
-SOC_DAPM_SINGLE("Mic2 Playback Switch", RT5621_MIC_ROUTING_CTRL, 5, 1, 1),\r
-SOC_DAPM_SINGLE("AUXIN Playback Switch", RT5621_AUXIN_VOL, 13, 1, 1),\r
-SOC_DAPM_SINGLE("PCM Playback Switch", RT5621_STEREO_DAC_VOL, 13, 1, 1),\r
-SOC_DAPM_SINGLE("RecordL Playback Switch", RT5621_ADC_REC_GAIN, 13, 1,1),\r
-SOC_DAPM_SINGLE("RecordR Playback Switch", RT5621_ADC_REC_GAIN, 12, 1,1),\r
-};\r
-\r
-/* mono output mux */\r
-static const struct snd_kcontrol_new rt5621_mono_mux_controls =\r
-SOC_DAPM_ENUM("Route", rt5621_enum[4]);\r
-\r
-/* speaker left output mux */\r
-static const struct snd_kcontrol_new rt5621_hp_spk_mux_controls =\r
-SOC_DAPM_ENUM("Route", rt5621_enum[1]);\r
-\r
-\r
-/* headphone left output mux */\r
-static const struct snd_kcontrol_new rt5621_hpl_out_mux_controls =\r
-SOC_DAPM_ENUM("Route", rt5621_enum[2]);\r
-\r
-/* headphone right output mux */\r
-static const struct snd_kcontrol_new rt5621_hpr_out_mux_controls =\r
-SOC_DAPM_ENUM("Route", rt5621_enum[3]);\r
-\r
-static const struct snd_soc_dapm_widget rt5621_dapm_widgets[] = {\r
-SND_SOC_DAPM_MUX("Mono Out Mux", SND_SOC_NOPM, 0, 0,\r
-       &rt5621_mono_mux_controls),\r
-SND_SOC_DAPM_MUX("Speaker Out Mux", SND_SOC_NOPM, 0, 0,\r
-       &rt5621_hp_spk_mux_controls),\r
-SND_SOC_DAPM_MUX("Left Headphone Out Mux", SND_SOC_NOPM, 0, 0,\r
-       &rt5621_hpl_out_mux_controls),\r
-SND_SOC_DAPM_MUX("Right Headphone Out Mux", SND_SOC_NOPM, 0, 0,\r
-       &rt5621_hpr_out_mux_controls),\r
-       \r
-SND_SOC_DAPM_MIXER_E("Left HP Mixer",RT5621_PWR_MANAG_ADD2, 5, 0,\r
-       &rt5621_hpl_mixer_controls[0], ARRAY_SIZE(rt5621_hpl_mixer_controls),\r
-       mixer_event, SND_SOC_DAPM_POST_REG),    \r
-SND_SOC_DAPM_MIXER_E("Right HP Mixer",RT5621_PWR_MANAG_ADD2, 4, 0,\r
-       &rt5621_hpr_mixer_controls[0], ARRAY_SIZE(rt5621_hpr_mixer_controls),\r
-       mixer_event, SND_SOC_DAPM_POST_REG),    \r
-SND_SOC_DAPM_MIXER("Mono Mixer", RT5621_PWR_MANAG_ADD2, 2, 0,\r
-       &rt5621_mono_mixer_controls[0], ARRAY_SIZE(rt5621_mono_mixer_controls)),\r
-       \r
-SND_SOC_DAPM_MIXER("Speaker Mixer", RT5621_PWR_MANAG_ADD2,3,0,\r
-       &rt5621_speaker_mixer_controls[0], ARRAY_SIZE(rt5621_speaker_mixer_controls)),  \r
-       \r
-SND_SOC_DAPM_MIXER("Left Record Mixer", RT5621_PWR_MANAG_ADD2,1,0,\r
-       &rt5621_captureL_mixer_controls[0],     ARRAY_SIZE(rt5621_captureL_mixer_controls)),    \r
-SND_SOC_DAPM_MIXER("Right Record Mixer", RT5621_PWR_MANAG_ADD2,0,0,\r
-       &rt5621_captureR_mixer_controls[0],     ARRAY_SIZE(rt5621_captureR_mixer_controls)),    \r
-       \r
-SND_SOC_DAPM_DAC("Left DAC", "Left HiFi Playback", RT5621_PWR_MANAG_ADD2,9, 0),\r
-SND_SOC_DAPM_DAC("Right DAC", "Right HiFi Playback", RT5621_PWR_MANAG_ADD2, 8, 0),\r
-\r
-SND_SOC_DAPM_MIXER("IIS Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),\r
-SND_SOC_DAPM_MIXER("HP Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),\r
-\r
-SND_SOC_DAPM_MIXER("Line Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),\r
-SND_SOC_DAPM_MIXER("AUXIN Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),\r
-\r
-SND_SOC_DAPM_ADC("Left ADC", "Left HiFi Capture", RT5621_PWR_MANAG_ADD2, 7, 0),\r
-SND_SOC_DAPM_ADC("Right ADC", "Right HiFi Capture", RT5621_PWR_MANAG_ADD2, 6, 0),\r
-\r
-SND_SOC_DAPM_PGA_E("Left Headphone", MISC_FUNC_REG, 0, 0, NULL, 0, \r
-       hp_event, SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_POST_PMU),\r
-SND_SOC_DAPM_PGA_E("Right Headphone", MISC_FUNC_REG, 1, 0, NULL, 0, \r
-       hp_event, SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_POST_PMU),\r
-\r
-SND_SOC_DAPM_PGA("Speaker PGA", RT5621_PWR_MANAG_ADD3, 12, 0, NULL, 0),\r
-\r
-SND_SOC_DAPM_PGA_E("AUXL Out", MISC_FUNC_REG, 2, 0, NULL, 0,\r
-       aux_event, SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_POST_PMU),\r
-SND_SOC_DAPM_PGA_E("AUXR Out", MISC_FUNC_REG, 3, 0, NULL, 0,\r
-       aux_event, SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_POST_PMU),\r
-\r
-SND_SOC_DAPM_PGA("Left Line In", RT5621_PWR_MANAG_ADD3, 7, 0, NULL, 0),\r
-SND_SOC_DAPM_PGA("Right Line In", RT5621_PWR_MANAG_ADD3, 6, 0, NULL, 0),\r
-SND_SOC_DAPM_PGA("Left AUX In", RT5621_PWR_MANAG_ADD3, 5, 0, NULL, 0),\r
-SND_SOC_DAPM_PGA("Right AUX In", RT5621_PWR_MANAG_ADD3, 4, 0, NULL, 0),\r
-\r
-SND_SOC_DAPM_PGA("Mic 1 PGA", RT5621_PWR_MANAG_ADD3, 3, 0, NULL, 0),\r
-SND_SOC_DAPM_PGA("Mic 2 PGA", RT5621_PWR_MANAG_ADD3, 2, 0, NULL, 0),\r
-SND_SOC_DAPM_PGA("Mic 1 Pre Amp", RT5621_PWR_MANAG_ADD3, 1, 0, NULL, 0),\r
-SND_SOC_DAPM_PGA("Mic 2 Pre Amp", RT5621_PWR_MANAG_ADD3, 0, 0, NULL, 0),\r
-\r
-SND_SOC_DAPM_MICBIAS("Mic Bias1", RT5621_PWR_MANAG_ADD1, 11, 0),\r
-\r
-SND_SOC_DAPM_OUTPUT("AUXL"),\r
-SND_SOC_DAPM_OUTPUT("AUXR"),\r
-SND_SOC_DAPM_OUTPUT("HPL"),\r
-SND_SOC_DAPM_OUTPUT("HPR"),\r
-SND_SOC_DAPM_OUTPUT("SPK"),\r
-\r
-SND_SOC_DAPM_INPUT("LINEL"),\r
-SND_SOC_DAPM_INPUT("LINER"),\r
-SND_SOC_DAPM_INPUT("AUXINL"),\r
-SND_SOC_DAPM_INPUT("AUXINR"),\r
-SND_SOC_DAPM_INPUT("MIC1"),\r
-SND_SOC_DAPM_INPUT("MIC2"),\r
-SND_SOC_DAPM_VMID("VMID"),\r
-};\r
-\r
-static const struct snd_soc_dapm_route audio_map[] = {\r
-       /* left HP mixer */\r
-       {"Left HP Mixer"        ,       "LineIn Playback Switch"                ,       "Left Line In"},\r
-       {"Left HP Mixer"        ,       "AUXIN Playback Switch"         ,       "Left AUX In"},\r
-       {"Left HP Mixer"        ,       "Mic1 Playback Switch"                  ,       "Mic 1 PGA"},\r
-       {"Left HP Mixer"        ,       "Mic2 Playback Switch"                  ,       "Mic 2 PGA"},\r
-       {"Left HP Mixer"        ,       "PCM Playback Switch"                   ,       "Left DAC"},\r
-       {"Left HP Mixer"        ,       "RecordL Playback Switch"               ,       "Left Record Mixer"},\r
-       \r
-       /* right HP mixer */\r
-       {"Right HP Mixer"       ,       "LineIn Playback Switch"                ,       "Right Line In"},\r
-       {"Right HP Mixer"       ,       "AUXIN Playback Switch"         ,       "Right AUX In"},\r
-       {"Right HP Mixer"       ,       "Mic1 Playback Switch"                  ,       "Mic 1 PGA"},\r
-       {"Right HP Mixer"       ,       "Mic2 Playback Switch"                  ,       "Mic 2 PGA"},\r
-       {"Right HP Mixer"       ,       "PCM Playback Switch"                   ,       "Right DAC"},\r
-       {"Right HP Mixer"       ,       "RecordR Playback Switch"               ,       "Right Record Mixer"},\r
-       \r
-       /* virtual mixer - mixes left & right channels for spk and mono */\r
-       {"IIS Mixer"            ,       NULL                                            ,       "Left DAC"},\r
-       {"IIS Mixer"            ,       NULL                                            ,       "Right DAC"},\r
-       {"Line Mixer"           ,       NULL                                            ,       "Right Line In"},\r
-       {"Line Mixer"           ,       NULL                                            ,       "Left Line In"},\r
-       {"AUXIN Mixer"  ,       NULL                                            ,       "Left AUX In"},\r
-       {"AUXIN Mixer"  ,       NULL                                            ,       "Right AUX In"},\r
-       {"HP Mixer"             ,       NULL                                            ,       "Left HP Mixer"},\r
-       {"HP Mixer"             ,       NULL                                            ,       "Right HP Mixer"},\r
-       \r
-       /* speaker mixer */\r
-       {"Speaker Mixer"        ,       "LineIn Playback Switch"                ,       "Line Mixer"},\r
-       {"Speaker Mixer"        ,       "AUXIN Playback Switch"         ,       "AUXIN Mixer"},\r
-       {"Speaker Mixer"        ,       "Mic1 Playback Switch"                  ,       "Mic 1 PGA"},\r
-       {"Speaker Mixer"        ,       "Mic2 Playback Switch"                  ,       "Mic 2 PGA"},\r
-       {"Speaker Mixer"        ,       "PCM Playback Switch"                   ,       "IIS Mixer"},\r
-\r
-\r
-       /* mono mixer */\r
-       {"Mono Mixer"           ,       "LineIn Playback Switch"                ,       "Line Mixer"},\r
-       {"Mono Mixer"           ,       "Mic1 Playback Switch"                  ,       "Mic 1 PGA"},\r
-       {"Mono Mixer"           ,       "Mic2 Playback Switch"                  ,       "Mic 2 PGA"},\r
-       {"Mono Mixer"           ,       "PCM Playback Switch"                   ,       "IIS Mixer"},\r
-       {"Mono Mixer"           ,       "AUXIN Playback Switch"         ,       "AUXIN Mixer"},\r
-       {"Mono Mixer"           ,       "RecordL Playback Switch"               ,       "Left Record Mixer"},\r
-       {"Mono Mixer"           ,       "RecordR Playback Switch"               ,       "Right Record Mixer"},\r
-       \r
-       /*Left record mixer */\r
-       {"Left Record Mixer"    ,       "Mic1 Capture Switch"           ,       "Mic 1 Pre Amp"},\r
-       {"Left Record Mixer"    ,       "Mic2 Capture Switch"           ,       "Mic 2 Pre Amp"},\r
-       {"Left Record Mixer"    ,       "LineInL Capture Switch"        ,       "LINEL"},\r
-       {"Left Record Mixer"    ,       "AUXIN Capture Switch"          ,       "AUXINL"},\r
-       {"Left Record Mixer"    ,       "HPMixerL Capture Switch"       ,       "Left HP Mixer"},\r
-       {"Left Record Mixer"    ,       "SPKMixer Capture Switch"       ,       "Speaker Mixer"},\r
-       {"Left Record Mixer"    ,       "MonoMixer Capture Switch"      ,       "Mono Mixer"},\r
-       \r
-       /*Right record mixer */\r
-       {"Right Record Mixer"   ,       "Mic1 Capture Switch"           ,       "Mic 1 Pre Amp"},\r
-       {"Right Record Mixer"   ,        "Mic2 Capture Switch"          ,       "Mic 2 Pre Amp"},\r
-       {"Right Record Mixer"   ,       "LineInR Capture Switch"        ,       "LINER"},\r
-       {"Right Record Mixer"   ,       "AUXIN Capture Switch"          ,       "AUXINR"},\r
-       {"Right Record Mixer"   ,       "HPMixerR Capture Switch"       ,       "Right HP Mixer"},\r
-       {"Right Record Mixer"   ,       "SPKMixer Capture Switch"       ,       "Speaker Mixer"},\r
-       {"Right Record Mixer"   ,        "MonoMixer Capture Switch"     ,       "Mono Mixer"},  \r
-\r
-       /* headphone left mux */\r
-       {"Left Headphone Out Mux"       ,        "HPL mixer"                    ,        "Left HP Mixer"},\r
-\r
-       /* headphone right mux */\r
-       {"Right Headphone Out Mux", "HPR mixer", "Right HP Mixer"},\r
-\r
-       /* speaker mux */\r
-       {"Speaker Out Mux", "HP mixer", "HP Mixer"},\r
-       {"Speaker Out Mux", "SPK mixer", "Speaker Mixer"},\r
-       {"Speaker Out Mux", "Mono Mixer", "Mono Mixer"},\r
-\r
-       /* mono mux */\r
-       {"Mono Out Mux", "HP mixer", "HP Mixer"},\r
-       {"Mono Out Mux", "SPK mixer", "Speaker Mixer"},\r
-       {"Mono Out Mux", "Mono Mixer", "Mono Mixer"},\r
-       \r
-       /* output pga */\r
-       {"HPL", NULL, "Left Headphone"},\r
-       {"Left Headphone", NULL, "Left Headphone Out Mux"},\r
-\r
-       {"HPR", NULL, "Right Headphone"},\r
-       {"Right Headphone", NULL, "Right Headphone Out Mux"},\r
-\r
-       {"SPK", NULL, "Speaker PGA"},\r
-       {"Speaker PGA", NULL, "Speaker Out Mux"},\r
-\r
-       {"AUXL", NULL, "AUXL Out"},\r
-       {"AUXL Out", NULL, "Mono Out Mux"},\r
-\r
-       {"AUXR", NULL, "AUXR Out"},\r
-       {"AUXR Out", NULL, "Mono Out Mux"},\r
-\r
-       /* input pga */\r
-       {"Left Line In", NULL, "LINEL"},\r
-       {"Right Line In", NULL, "LINER"},\r
-       \r
-       {"Left AUX In", NULL, "AUXINL"},\r
-       {"Right AUX In", NULL, "AUXINR"},\r
-       \r
-       {"Mic 1 Pre Amp", NULL, "MIC1"},\r
-       {"Mic 2 Pre Amp", NULL, "MIC2"},        \r
-       {"Mic 1 PGA", NULL, "Mic 1 Pre Amp"},\r
-       {"Mic 2 PGA", NULL, "Mic 2 Pre Amp"},\r
-\r
-       /* left ADC */\r
-       {"Left ADC", NULL, "Left Record Mixer"},\r
-\r
-       /* right ADC */\r
-       {"Right ADC", NULL, "Right Record Mixer"},\r
-       \r
-};\r
-\r
-static int rt5621_add_widgets(struct snd_soc_codec *codec)\r
-{\r
-       snd_soc_dapm_new_controls(codec, rt5621_dapm_widgets,\r
-                               ARRAY_SIZE(rt5621_dapm_widgets));\r
-       snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));\r
-       snd_soc_dapm_new_widgets(codec);\r
-\r
-       return 0;\r
-}\r
-\r
-#else\r
-\r
-static int rt5621_pcm_hw_prepare(struct snd_pcm_substream *substream,\r
-               struct snd_soc_dai *codec_dai)\r
-{\r
-\r
-       struct snd_soc_codec *codec = codec_dai->codec;\r
-       int stream = substream->stream;\r
-\r
-       switch (stream)\r
-       {\r
-               case SNDRV_PCM_STREAM_PLAYBACK:\r
-\r
-                       rt5621_ChangeCodecPowerStatus(codec,POWER_STATE_D1_PLAYBACK);   //power on dac to hp and speaker out\r
-                                               \r
-                       rt5621_AudioOutEnable(codec,RT_WAVOUT_SPK,0);   //unmute speaker out\r
-                       \r
-                       rt5621_AudioOutEnable(codec,RT_WAVOUT_HP,0);    //unmute hp out\r
-\r
-                       break;\r
-               case SNDRV_PCM_STREAM_CAPTURE:\r
-\r
-                       rt5621_ChangeCodecPowerStatus(codec,POWER_STATE_D1_RECORD);     //power on input to adc\r
-\r
-                       Enable_ADC_Input_Source(codec,RT_WAVIN_L_MIC1|RT_WAVIN_R_MIC1,1);       //enable record source from mic1\r
-\r
-                       break;                  \r
-       }\r
-       \r
-       return 0;\r
-}\r
-\r
-#endif\r
-/* PLL divisors */\r
-struct _pll_div {\r
-       u32 pll_in;\r
-       u32 pll_out;\r
-       u16 regvalue;\r
-};\r
-\r
-static const struct _pll_div codec_pll_div[] = {\r
-       \r
-       {  2048000,  8192000,   0x0ea0},                \r
-       {  3686400,  8192000,   0x4e27},        \r
-       { 12000000,  8192000,   0x456b},   \r
-       { 13000000,  8192000,   0x495f},\r
-       { 13100000,      8192000,       0x0320},        \r
-       {  2048000,  11289600,  0xf637},\r
-       {  3686400,  11289600,  0x2f22},        \r
-       { 12000000,  11289600,  0x3e2f},   \r
-       { 13000000,  11289600,  0x4d5b},\r
-       { 13100000,      11289600,      0x363b},        \r
-       {  2048000,  16384000,  0x1ea0},\r
-       {  3686400,  16384000,  0x9e27},        \r
-       { 12000000,  16384000,  0x452b},   \r
-       { 13000000,  16384000,  0x542f},\r
-       { 13100000,      16384000,      0x03a0},        \r
-       {  2048000,  16934400,  0xe625},\r
-       {  3686400,  16934400,  0x9126},        \r
-       { 12000000,  16934400,  0x4d2c},   \r
-       { 13000000,  16934400,  0x742f},\r
-       { 13100000,      16934400,      0x3c27},                        \r
-       {  2048000,  22579200,  0x2aa0},\r
-       {  3686400,  22579200,  0x2f20},        \r
-       { 12000000,  22579200,  0x7e2f},   \r
-       { 13000000,  22579200,  0x742f},\r
-       { 13100000,      22579200,      0x3c27},                \r
-       {  2048000,  24576000,  0x2ea0},\r
-       {  3686400,  24576000,  0xee27},        \r
-       { 12000000,  24576000,  0x2915},   \r
-       { 13000000,  24576000,  0x772e},\r
-       { 13100000,      24576000,      0x0d20},        \r
-};\r
-\r
-static const struct _pll_div codec_bclk_pll_div[] = {\r
-\r
-       {  1536000,      24576000,      0x3ea0},        \r
-       {  3072000,      24576000,      0x1ea0},\r
-       {  512000,       24576000,  0x8e90},\r
-       {  256000,   24576000,  0xbe80},\r
-               {  2822400,      11289600,      0x1ee0},        //flove040711\r
-       {  3072000,      12288000,      0x1ee0},        //flove040711   \r
-};\r
-\r
-\r
-static int rt5621_set_dai_pll(struct snd_soc_dai *codec_dai,\r
-               int pll_id, unsigned int freq_in, unsigned int freq_out)\r
-{\r
-       int i;\r
-       int ret = -EINVAL;\r
-       struct snd_soc_codec *codec = codec_dai->codec;\r
-\r
-       if (pll_id < RT5621_PLL_FR_MCLK || pll_id > RT5621_PLL_FR_BCLK)\r
-               return -EINVAL;\r
-\r
-       //rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD2, 0x0000,0x1000);        //disable PLL power     \r
-       \r
-       if (!freq_in || !freq_out) {\r
-\r
-               return 0;\r
-       }               \r
-\r
-       if (RT5621_PLL_FR_MCLK == pll_id) {\r
-       for (i = 0; i < ARRAY_SIZE(codec_pll_div); i++) {\r
-                       \r
-               if (codec_pll_div[i].pll_in == freq_in && codec_pll_div[i].pll_out == freq_out)\r
-                       {\r
-                               rt5621_write_mask(codec, RT5621_GLOBAL_CLK_CTRL_REG, 0x0000, 0x4000);                           \r
-                               rt5621_write(codec,RT5621_PLL_CTRL,codec_pll_div[i].regvalue);//set PLL parameter       \r
-                               rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD2, 0x1000,0x1000);  //enable PLL power      \r
-                               ret = 0;\r
-                       }\r
-       }\r
-       }\r
-       else if (RT5621_PLL_FR_BCLK == pll_id)\r
-       {\r
-               for (i = 0; i < ARRAY_SIZE(codec_bclk_pll_div); i++)\r
-               {\r
-                       if ((freq_in == codec_bclk_pll_div[i].pll_in) && (freq_out == codec_bclk_pll_div[i].pll_out))\r
-                       {\r
-                               rt5621_write_mask(codec, RT5621_GLOBAL_CLK_CTRL_REG, 0x4000, 0x4000);\r
-                               rt5621_write(codec,RT5621_PLL_CTRL,codec_bclk_pll_div[i].regvalue);//set PLL parameter \r
-                               rt5621_write_mask(codec,RT5621_PWR_MANAG_ADD2, 0x1000,0x1000);  //enable PLL power      \r
-                               ret = 0;\r
-                       }\r
-               }\r
-       }\r
-\r
-       rt5621_write_mask(codec,RT5621_GLOBAL_CLK_CTRL_REG,0x8000,0x8000);//Codec sys-clock from PLL    \r
-       return ret;\r
-}\r
-\r
-\r
-struct _coeff_div {\r
-       u32 mclk;\r
-       u32 rate;\r
-       u16 fs;\r
-       u16 regvalue;\r
-};\r
-\r
-/* codec hifi mclk (after PLL) clock divider coefficients */\r
-static const struct _coeff_div coeff_div[] = {\r
-       /* 8k */\r
-       { 8192000,  8000, 256*4, 0x2a2d},\r
-       {12288000,  8000, 384*4, 0x2c2f},\r
-\r
-       /* 11.025k */\r
-       {11289600, 11025, 256*4, 0x2a2d},\r
-       {16934400, 11025, 384*4, 0x2c2f},\r
-\r
-       /* 16k */\r
-       {12288000, 16000, 384*2, 0x1c2f},\r
-       {16384000, 16000, 256*4, 0x2a2d},\r
-       {24576000, 16000, 384*4, 0x2c2f},\r
-\r
-       /* 22.05k */    \r
-       {11289600, 22050, 256*2, 0x1a2d},\r
-       {16934400, 22050, 384*2, 0x1c2f},\r
-\r
-       /* 32k */\r
-       {12288000, 32000, 384  , 0x0c2f},\r
-       {16384000, 32000, 256*2, 0x1a2d},\r
-       {24576000, 32000, 384*2, 0x1c2f},\r
-\r
-       /* 44.1k */\r
-       {11289600, 44100, 256*1, 0x0a2d},\r
-       {22579200, 44100, 256*2, 0x1a2d},\r
-       {45158400, 44100, 256*4, 0x2a2d},       \r
-\r
-       /* 48k */\r
-       {12288000, 48000, 256*1, 0x0a2d},\r
-       {24576000, 48000, 256*2, 0x1a2d},\r
-       {49152000, 48000, 256*4, 0x2a2d},\r
-\r
-};\r
-\r
-\r
-\r
-static int get_coeff(int mclk, int rate)\r
-{\r
-       int i;\r
-       \r
-       printk("get_coeff mclk=%d,rate=%d\n",mclk,rate);\r
-\r
-       for (i = 0; i < ARRAY_SIZE(coeff_div); i++) {\r
-               if (coeff_div[i].rate == rate && coeff_div[i].mclk == mclk)\r
-                       return i;\r
-       }\r
-       return -EINVAL;\r
-}\r
-\r
-\r
-\r
-\r
-/*\r
- * Clock after PLL and dividers\r
- */\r
- /*in this driver, you have to set sysclk to be 24576000,\r
- * but you don't need to give a clk to be 24576000, our \r
- * internal pll will generate this clock! so it won't make\r
- * you any difficult.\r
- */\r
-static int rt5621_set_dai_sysclk(struct snd_soc_dai *codec_dai,\r
-               int clk_id, unsigned int freq, int dir)\r
-{\r
-       struct snd_soc_codec *codec = codec_dai->codec;\r
-       struct rt5621_priv *rt5621 = codec->private_data;\r
-\r
-       switch (freq) {\r
-       case 24576000:\r
-               rt5621->sysclk = freq;\r
-               return 0;\r
-       }\r
-       return 0;\r
-}\r
-\r
-\r
-static int rt5621_set_dai_fmt(struct snd_soc_dai *codec_dai,\r
-               unsigned int fmt)\r
-{\r
-       struct snd_soc_codec *codec = codec_dai->codec;\r
-       u16 iface = 0;\r
-\r
-       /* set master/slave audio interface */\r
-       switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {\r
-       case SND_SOC_DAIFMT_CBM_CFM:\r
-               iface = 0x0000;\r
-               break;\r
-       case SND_SOC_DAIFMT_CBS_CFS:\r
-               iface = 0x8000;\r
-               break;\r
-       default:\r
-               return -EINVAL;\r
-       }\r
-\r
-       /* interface format */\r
-       switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {\r
-       case SND_SOC_DAIFMT_I2S:\r
-               iface |= 0x0000;\r
-               break;\r
-       case SND_SOC_DAIFMT_RIGHT_J:\r
-               iface |= 0x0001;\r
-               break;\r
-       case SND_SOC_DAIFMT_LEFT_J:\r
-               iface |= 0x0002;\r
-               break;\r
-       case SND_SOC_DAIFMT_DSP_A:\r
-               iface |= 0x0003;\r
-               break;\r
-       case SND_SOC_DAIFMT_DSP_B:\r
-               iface |= 0x4003;\r
-               break;\r
-       default:\r
-               return -EINVAL;\r
-       }\r
-\r
-       /* clock inversion */\r
-       switch (fmt & SND_SOC_DAIFMT_INV_MASK) {\r
-       case SND_SOC_DAIFMT_NB_NF:\r
-               iface |= 0x0000;\r
-               break;\r
-       case SND_SOC_DAIFMT_IB_NF:\r
-               iface |= 0x0100;\r
-               break;\r
-       default:\r
-               return -EINVAL;\r
-       }\r
-\r
-       rt5621_write(codec,RT5621_AUDIO_INTERFACE,iface);\r
-       return 0;\r
-}\r
-\r
-\r
-static int rt5621_pcm_hw_params(struct snd_pcm_substream *substream,\r
-       struct snd_pcm_hw_params *params,\r
-       struct snd_soc_dai *codec_dai)\r
-{\r
-       struct snd_soc_pcm_runtime *rtd = substream->private_data;\r
-       struct snd_soc_device *socdev = rtd->socdev;\r
-       struct snd_soc_codec *codec = socdev ->card->codec;\r
-       struct rt5621_priv *rt5621 = codec->private_data;\r
-       u16 iface=rt5621_read(codec,RT5621_AUDIO_INTERFACE)&0xfff3;\r
-       int coeff = get_coeff(rt5621->sysclk, params_rate(params));\r
-\r
-       printk("rt5621_pcm_hw_params\n");\r
-       if (coeff < 0)\r
-               coeff = get_coeff(24576000, params_rate(params));         /*if not set sysclk, default to be 24.576MHz*/\r
-\r
-       /* bit size */\r
-       switch (params_format(params)) {\r
-       case SNDRV_PCM_FORMAT_S16_LE:\r
-               iface |= 0x0000;\r
-               break;\r
-       case SNDRV_PCM_FORMAT_S20_3LE:\r
-               iface |= 0x0004;\r
-               break;\r
-       case SNDRV_PCM_FORMAT_S24_LE:\r
-               iface |= 0x0008;\r
-               break;\r
-       case SNDRV_PCM_FORMAT_S32_LE:\r
-               iface |= 0x000c;\r
-               break;\r
-       }\r
-\r
-       /* set iface & srate */\r
-       rt5621_write(codec, RT5621_AUDIO_INTERFACE, iface);\r
-\r
-       if (coeff >= 0)\r
-               rt5621_write(codec, RT5621_STEREO_AD_DA_CLK_CTRL, coeff_div[coeff].regvalue);\r
-//     else\r
-//     {\r
-//             printk(KERN_ERR "cant find matched sysclk and rate config\n");\r
-//             return -EINVAL;\r
-               \r
-//     }\r
-       return 0;\r
-}\r
-\r
-#if !USE_DAPM_CONTROL\r
-static int rt5621_set_bias_level(struct snd_soc_codec *codec, \r
-                       enum snd_soc_bias_level level)\r
-{\r
-       switch (level) {\r
-               case SND_SOC_BIAS_ON:\r
-                       break;\r
-               case SND_SOC_BIAS_PREPARE:\r
-                       break;\r
-               case SND_SOC_BIAS_STANDBY:\r
-                       break;\r
-               case SND_SOC_BIAS_OFF:\r
-\r
-                       rt5621_write_mask(codec, 0x02, 0x8080, 0x8080);\r
-                       rt5621_write_mask(codec, 0x04, 0x8080, 0x8080);\r
-                       rt5621_write(codec, 0x3e, 0x0000);\r
-                       rt5621_write(codec, 0x3c, 0x0000);\r
-                       rt5621_write(codec, 0x3a, 0x0000);\r
-                       break;          \r
-       }\r
-       codec->bias_level = level;\r
-       return 0;\r
-}\r
-#else\r
-static int rt5621_set_bias_level(struct snd_soc_codec *codec, \r
-                       enum snd_soc_bias_level level)\r
-{\r
-       switch (level) {\r
-               case SND_SOC_BIAS_ON:\r
-                       break;\r
-               case SND_SOC_BIAS_PREPARE:\r
-                       break;\r
-               case SND_SOC_BIAS_STANDBY:\r
-\r
-                       break;\r
-               case SND_SOC_BIAS_OFF:\r
-\r
-                       rt5621_write_mask(codec, 0x02, 0x8080, 0x8080);\r
-                       rt5621_write_mask(codec, 0x04, 0x8080, 0x8080);\r
-                       rt5621_write(codec, 0x3e, 0x0000);\r
-                       rt5621_write(codec, 0x3c, 0x0000);\r
-                       rt5621_write(codec, 0x3a, 0x0000);\r
-                       break;          \r
-       }\r
-       codec->bias_level = level;\r
-       return 0;\r
-}\r
-#endif\r
-\r
-\r
-\r
-\r
-\r
-#if !USE_DAPM_CONTROL\r
-\r
-static void rt5621_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *codec_dai)\r
-{\r
-       struct snd_soc_pcm_runtime *rtd = substream->private_data;\r
-       struct snd_soc_device *socdev = rtd->socdev;\r
-       struct snd_soc_codec *codec = socdev->card->codec;\r
-       int stream = substream->stream;\r
-       \r
-       switch (stream)\r
-       {\r
-               case SNDRV_PCM_STREAM_PLAYBACK:\r
-\r
-                       rt5621_AudioOutEnable(codec,RT_WAVOUT_SPK,1);   //mute speaker out\r
-                       \r
-                       rt5621_AudioOutEnable(codec,RT_WAVOUT_HP,1);    //mute hp out\r
-\r
-                       rt5621_ChangeCodecPowerStatus(codec,POWER_STATE_D2_PLAYBACK);   //power off dac to hp and speaker out\r
-                                               \r
-\r
-\r
-                       break;\r
-               case SNDRV_PCM_STREAM_CAPTURE:\r
-\r
-                       Enable_ADC_Input_Source(codec,RT_WAVIN_L_MIC1|RT_WAVIN_R_MIC1,0);       //disable record        source from mic1\r
-\r
-                       rt5621_ChangeCodecPowerStatus(codec,POWER_STATE_D2_RECORD);\r
-                       \r
-\r
-                       break;                  \r
-       }       \r
-}\r
-\r
-#endif\r
-\r
-\r
-#define RT5621_HIFI_RATES SNDRV_PCM_RATE_8000_48000\r
-\r
-#define RT5621_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\\r
-       SNDRV_PCM_FMTBIT_S24_LE)\r
-\r
-struct snd_soc_dai_ops rt5621_hifi_ops = {\r
-       .hw_params = rt5621_pcm_hw_params,      \r
-       .set_fmt = rt5621_set_dai_fmt,\r
-       .set_sysclk = rt5621_set_dai_sysclk,\r
-       .set_pll = rt5621_set_dai_pll,\r
-#if !USE_DAPM_CONTROL\r
-       .prepare = rt5621_pcm_hw_prepare,\r
-       .shutdown = rt5621_shutdown,\r
-#endif\r
-       \r
-};\r
-\r
-struct snd_soc_dai rt5621_dai = { \r
-       \r
-               .name = "RT5621",\r
-               .playback = {\r
-                       .stream_name = "HiFi Playback",\r
-                       .channels_min = 1,\r
-                       .channels_max = 2,\r
-                       .rates = RT5621_HIFI_RATES,\r
-                       .formats = RT5621_FORMATS,},\r
-               .capture = {\r
-                       .stream_name = "HiFi Capture",\r
-                       .channels_min = 1,\r
-                       .channels_max = 2,\r
-                       .rates = RT5621_HIFI_RATES,\r
-                       .formats = RT5621_FORMATS,},\r
-\r
-               .ops = &rt5621_hifi_ops,\r
-};\r
-\r
-\r
-EXPORT_SYMBOL_GPL(rt5621_dai);\r
-\r
-static ssize_t rt5621_index_reg_show(struct device *dev, \r
-       struct device_attribute *attr, char *buf)\r
-{\r
-       struct snd_soc_device *socdev = dev_get_drvdata(dev);\r
-       struct snd_soc_codec *codec = socdev ->card->codec;\r
-       int count = 0;\r
-       int value;\r
-       int i; \r
-       \r
-       count += sprintf(buf, "%s index register\n", codec->name);\r
-\r
-       for (i = 0; i < 0x60; i++) {\r
-               count += sprintf(buf + count, "index-%2x    ", i);\r
-               if (count >= PAGE_SIZE - 1)\r
-                       break;\r
-               value = rt5621_read_index(codec, i);\r
-               count += snprintf(buf + count, PAGE_SIZE - count, "0x%4x", value);\r
-\r
-               if (count >= PAGE_SIZE - 1)\r
-                       break;\r
-\r
-               count += snprintf(buf + count, PAGE_SIZE - count, "\n");\r
-               if (count >= PAGE_SIZE - 1)\r
-                       break;\r
-       }\r
-\r
-       if (count >= PAGE_SIZE)\r
-                       count = PAGE_SIZE - 1;\r
-               \r
-       return count;\r
-       \r
-}\r
-\r
-static DEVICE_ATTR(index_reg, 0444, rt5621_index_reg_show, NULL);\r
-\r
-#if defined(CONFIG_SND_HWDEP)\r
-#if REALTEK_HWDEP\r
-\r
-#define RT_CE_CODEC_HWDEP_NAME "rt56xx hwdep "\r
-\r
-static int rt56xx_hwdep_open(struct snd_hwdep *hw, struct file *file)\r
-{\r
-       printk("enter %s\n", __func__);\r
-       return 0;\r
-}\r
-\r
-static int rt56xx_hwdep_release(struct snd_hwdep *hw, struct file *file)\r
-{\r
-       printk("enter %s\n", __func__);\r
-       return 0;\r
-}\r
-\r
-\r
-static int rt56xx_hwdep_ioctl_common(struct snd_hwdep *hw, struct file *file, unsigned int cmd, unsigned long arg)\r
-{\r
-       struct rt56xx_cmd rt56xx;\r
-       struct rt56xx_cmd __user *_rt56xx = arg;\r
-       struct rt56xx_reg_state *buf;\r
-       struct rt56xx_reg_state *p;\r
-       struct snd_soc_codec *codec = hw->private_data;\r
-\r
-       if (copy_from_user(&rt56xx, _rt56xx, sizeof(rt56xx)))\r
-               return -EFAULT;\r
-       buf = kmalloc(sizeof(*buf) * rt56xx.number, GFP_KERNEL);\r
-       if (buf == NULL)\r
-               return -ENOMEM;\r
-       if (copy_from_user(buf, rt56xx.buf, sizeof(*buf) * rt56xx.number)) {\r
-               goto err;\r
-       }\r
-       switch (cmd) {\r
-               case RT_READ_CODEC_REG_IOCTL:\r
-                       for (p = buf; p < buf + rt56xx.number; p++)\r
-                       {\r
-                               p->reg_value = codec->read(codec, p->reg_index);\r
-                       }\r
-                       if (copy_to_user(rt56xx.buf, buf, sizeof(*buf) * rt56xx.number))\r
-                               goto err;\r
-                               \r
-                       break;\r
-               case RT_WRITE_CODEC_REG_IOCTL:\r
-                       for (p = buf; p < buf + rt56xx.number; p++)\r
-                               codec->write(codec, p->reg_index, p->reg_value);\r
-                       break;\r
-       }\r
-\r
-       kfree(buf);\r
-       return 0;\r
-\r
-err:\r
-       kfree(buf);\r
-       return -EFAULT;\r
-       \r
-}\r
-\r
-static int rt56xx_codec_dump_reg(struct snd_hwdep *hw, struct file *file, unsigned long arg)\r
-{\r
-       struct rt56xx_cmd rt56xx;\r
-       struct rt56xx_cmd __user *_rt56xx = arg;\r
-       struct rt56xx_reg_state *buf;\r
-       struct snd_soc_codec *codec = hw->private_data;\r
-       int number = codec->reg_cache_size;\r
-       int i;\r
-\r
-       printk(KERN_DEBUG "enter %s, number = %d\n", __func__, number); \r
-       if (copy_from_user(&rt56xx, _rt56xx, sizeof(rt56xx)))\r
-               return -EFAULT;\r
-       \r
-       buf = kmalloc(sizeof(*buf) * number, GFP_KERNEL);\r
-       if (buf == NULL)\r
-               return -ENOMEM;\r
-\r
-       for (i = 0; i < number; i++)\r
-       {\r
-               buf[i].reg_index = i << 1;\r
-               buf[i].reg_value = codec->read(codec, buf[i].reg_index);\r
-       }\r
-       if (copy_to_user(rt56xx.buf, buf, sizeof(*buf) * i))\r
-               goto err;\r
-       rt56xx.number = number;\r
-       if (copy_to_user(_rt56xx, &rt56xx, sizeof(rt56xx)))\r
-               goto err;\r
-       kfree(buf);\r
-       return 0;\r
-err:\r
-       kfree(buf);\r
-       return -EFAULT;\r
-       \r
-}\r
-\r
-static int rt56xx_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigned int cmd, unsigned long arg)\r
-{\r
-       if (cmd == RT_READ_ALL_CODEC_REG_IOCTL)\r
-       {\r
-               return rt56xx_codec_dump_reg(hw, file, arg);\r
-       }\r
-       else\r
-       {\r
-               return rt56xx_hwdep_ioctl_common(hw, file, cmd, arg);\r
-       }\r
-}\r
-\r
-static int realtek_ce_init_hwdep(struct snd_soc_codec *codec)\r
-{\r
-       struct snd_hwdep *hw;\r
-       struct snd_card *card = codec->card;\r
-       int err;\r
-\r
-       if ((err = snd_hwdep_new(card, RT_CE_CODEC_HWDEP_NAME, 0, &hw)) < 0)\r
-               return err;\r
-       \r
-       strcpy(hw->name, RT_CE_CODEC_HWDEP_NAME);\r
-       hw->private_data = codec;\r
-       hw->ops.open = rt56xx_hwdep_open;\r
-       hw->ops.release = rt56xx_hwdep_release;\r
-       hw->ops.ioctl = rt56xx_hwdep_ioctl;\r
-       return 0;\r
-}\r
-\r
-#endif\r
-#endif\r
-\r
-static void rt5621_work(struct work_struct *work)\r
-{\r
-       struct snd_soc_codec *codec =\r
-               container_of(work, struct snd_soc_codec, delayed_work.work);\r
-       \r
-       rt5621_set_bias_level(codec, codec->bias_level);\r
-}\r
-\r
-\r
-static int rt5621_suspend(struct platform_device *pdev, pm_message_t state)\r
-{\r
-       struct snd_soc_device *socdev = platform_get_drvdata(pdev);\r
-       struct snd_soc_codec *codec = socdev ->card->codec;\r
-\r
-       /* we only need to suspend if we are a valid card */\r
-       if(!codec->card)\r
-               return 0;\r
-               \r
-       rt5621_set_bias_level(codec, SND_SOC_BIAS_STANDBY);\r
-       return 0;\r
-}\r
-\r
-static int rt5621_resume(struct platform_device *pdev)\r
-{\r
-       struct snd_soc_device *socdev = platform_get_drvdata(pdev);\r
-       struct snd_soc_codec *codec = socdev ->card->codec;\r
-       int i;\r
-       u8 data[3];\r
-       u16 *cache = codec->reg_cache;\r
-\r
-       /* we only need to resume if we are a valid card */\r
-       if(!codec->card)\r
-               return 0;\r
-\r
-       /* Sync reg_cache with the hardware */  \r
-\r
-       for (i = 0; i < ARRAY_SIZE(rt5621_reg); i++) {\r
-               if (i == RT5621_RESET)\r
-                       continue;\r
-               data[0] =i << 1;        \r
-               data[1] = (0xFF00 & cache[i]) >> 8;\r
-               data[2] = 0x00FF & cache[i];    \r
-               codec->hw_write(codec->control_data, data, 3);\r
-       }       \r
-\r
-       rt5621_set_bias_level(codec, SND_SOC_BIAS_STANDBY);\r
-       \r
-       /* charge rt5621 caps */\r
-       \r
-       if (codec->suspend_bias_level == SND_SOC_BIAS_ON) {\r
-               rt5621_set_bias_level(codec, SND_SOC_BIAS_PREPARE);\r
-               codec->bias_level = SND_SOC_BIAS_ON;\r
-               schedule_delayed_work(&codec->delayed_work,\r
-                                       msecs_to_jiffies(caps_charge));\r
-       }\r
-       return 0;\r
-}\r
-\r
-\r
-/*\r
- * initialise the RT5621 driver\r
- * register the mixer and dsp interfaces with the kernel\r
- */\r
-static int rt5621_init(struct snd_soc_device *socdev)\r
-{\r
-       struct snd_soc_codec *codec = socdev ->card->codec;\r
-       int  ret = 0;\r
-\r
-       printk(KERN_INFO "alsa version is 1.0.21, codec driver version is 0.04\n");\r
-       codec->name = "RT5621";\r
-       codec->owner = THIS_MODULE;\r
-       codec->read = rt5621_read;\r
-       codec->write = rt5621_write;\r
-       codec->set_bias_level = rt5621_set_bias_level;\r
-       codec->dai = &rt5621_dai;\r
-       codec->num_dai = 1;\r
-       codec->reg_cache_step = 2;\r
-       codec->reg_cache_size = ARRAY_SIZE(rt5621_reg) * 2;\r
-       codec->reg_cache = kmemdup(rt5621_reg, sizeof(rt5621_reg), GFP_KERNEL);\r
-\r
-       if (codec->reg_cache == NULL)\r
-               return -ENOMEM;\r
-               \r
-       /* register pcms */\r
-       ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);\r
-       if (ret < 0) {\r
-               printk(KERN_ERR "rt5621: failed to create pcms\n");\r
-               goto pcm_err;\r
-       }\r
-\r
-\r
-       rt5621_reset(codec);\r
-       rt5621_write(codec, RT5621_PWR_MANAG_ADD3, 0x8000);//enable Main bias\r
-       rt5621_write(codec, RT5621_PWR_MANAG_ADD2, 0x2000);//enable Vref\r
-\r
-       hp_depop_mode2(codec);\r
-\r
-       rt5621_init_reg(codec);\r
-       rt5621_set_bias_level(codec, SND_SOC_BIAS_PREPARE);\r
-       codec->bias_level = SND_SOC_BIAS_STANDBY;\r
-       schedule_delayed_work(&codec->delayed_work,\r
-               msecs_to_jiffies(caps_charge));\r
-       \r
-       rt5621_add_controls(codec);\r
-\r
-       #if USE_DAPM_CONTROL\r
-\r
-               rt5621_add_widgets(codec);      \r
-\r
-       #endif\r
-\r
-       #if defined(CONFIG_SND_HWDEP)\r
-       #if REALTEK_HWDEP\r
-\r
-               realtek_ce_init_hwdep(codec);\r
-\r
-       #endif\r
-       #endif\r
-\r
-       ret = snd_soc_init_card(socdev);\r
-\r
-       if (ret < 0) {\r
-               printk(KERN_ERR "rt5621: failed to register card\n");\r
-                       goto card_err;\r
-       }\r
-       return ret;\r
-\r
-card_err:\r
-       snd_soc_free_pcms(socdev);\r
-       snd_soc_dapm_free(socdev);\r
-pcm_err:\r
-       kfree(codec->reg_cache);\r
-       return ret;\r
-}\r
-\r
-static int rt5621_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id)\r
-{\r
-       struct snd_soc_device *socdev = rt5621_socdev;\r
-       struct snd_soc_codec *codec = socdev ->card->codec;\r
-       int ret;\r
-\r
-       i2c_set_clientdata(i2c, codec);\r
-       codec->control_data = i2c;\r
-\r
-       ret = rt5621_init(socdev);\r
-       if (ret < 0)\r
-               pr_err("failed to initialise rt5621\n");\r
-\r
-       return ret;\r
-}\r
-\r
-\r
-static int rt5621_i2c_remove(struct i2c_client *client)\r
-{\r
-       struct snd_soc_codec *codec = i2c_get_clientdata(client);\r
-       kfree(codec->reg_cache);\r
-       return 0;\r
-}\r
-\r
-static const struct i2c_device_id rt5621_i2c_id[] = {\r
-               {"ALC5621", 0},\r
-               {}\r
-};\r
-MODULE_DEVICE_TABLE(i2c, rt5621_i2c_id);\r
-static struct i2c_driver rt5621_i2c_driver = {\r
-       .driver = {\r
-               .name = "RT5621 I2C Codec",\r
-               .owner = THIS_MODULE,\r
-       },\r
-       .probe =    rt5621_i2c_probe,\r
-       .remove =   rt5621_i2c_remove,\r
-       .id_table = rt5621_i2c_id,\r
-};\r
-\r
-static int rt5621_add_i2c_device(struct platform_device *pdev,\r
-                                const struct rt5621_setup_data *setup)\r
-{\r
-#if 0\r
-       struct i2c_board_info info;\r
-       struct i2c_adapter *adapter;\r
-       struct i2c_client *client;\r
-#endif\r
-       int ret;\r
-       ret = i2c_add_driver(&rt5621_i2c_driver);\r
-       if (ret != 0) {\r
-               dev_err(&pdev->dev, "can't add i2c driver\n");\r
-               return ret;\r
-       }\r
-#if 0\r
-       memset(&info, 0, sizeof(struct i2c_board_info));\r
-       info.addr = setup->i2c_address;\r
-       strlcpy(info.type, "rt5621", I2C_NAME_SIZE);\r
-\r
-       adapter = i2c_get_adapter(setup->i2c_bus);\r
-       if (!adapter) {\r
-               dev_err(&pdev->dev, "can't get i2c adapter %d\n",\r
-                       setup->i2c_bus);\r
-               goto err_driver;\r
-       }\r
-\r
-       client = i2c_new_device(adapter, &info);\r
-       i2c_put_adapter(adapter);\r
-       if (!client) {\r
-               dev_err(&pdev->dev, "can't add i2c device at 0x%x\n",\r
-                       (unsigned int)info.addr);\r
-               goto err_driver;\r
-       }\r
-#endif\r
-       return 0;\r
-\r
-#if 0\r
-err_driver:\r
-       i2c_del_driver(&rt5621_i2c_driver);\r
-       return -ENODEV;\r
-#endif\r
-}\r
-\r
-\r
-static int rt5621_probe(struct platform_device *pdev)\r
-{\r
-       struct snd_soc_device *socdev = platform_get_drvdata(pdev);\r
-       struct rt5621_setup_data *setup = socdev->codec_data;\r
-       struct snd_soc_codec *codec;\r
-       struct rt5621_priv *rt5621;\r
-       int ret;\r
-\r
-       pr_info("RT5621 Audio Codec %s\n", RT5621_VERSION);\r
-\r
-       codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);\r
-       if (codec == NULL)\r
-               return -ENOMEM;\r
-\r
-       rt5621 = kzalloc(sizeof(struct rt5621_priv), GFP_KERNEL);\r
-       if (rt5621 == NULL) {\r
-               kfree(codec);\r
-               return -ENOMEM;\r
-       }\r
-       codec->private_data = rt5621;\r
-       socdev ->card->codec = codec;\r
-       mutex_init(&codec->mutex);\r
-       INIT_LIST_HEAD(&codec->dapm_widgets);\r
-       INIT_LIST_HEAD(&codec->dapm_paths);\r
-       rt5621_socdev = socdev;\r
-       INIT_DELAYED_WORK(&codec->delayed_work, rt5621_work);\r
-       ret = device_create_file(&pdev->dev, &dev_attr_index_reg);\r
-       if (ret < 0)\r
-               printk(KERN_WARNING "asoc: failed to add index_reg sysfs files\n");\r
-\r
-       ret = -ENODEV;\r
-//     if (setup->i2c_address) {\r
-               codec->hw_write = (hw_write_t)i2c_master_send;\r
-               ret = rt5621_add_i2c_device(pdev, setup);\r
-//     }\r
-       if (ret != 0) {\r
-               kfree(codec->private_data);\r
-               kfree(codec);\r
-       }\r
-       return ret;\r
-}\r
-\r
-static int run_delayed_work(struct delayed_work *dwork)\r
-{\r
-       int ret;\r
-\r
-       /* cancel any work waiting to be queued. */\r
-       ret = cancel_delayed_work(dwork);\r
-\r
-       /* if there was any work waiting then we run it now and\r
-        * wait for it's completion */\r
-       if (ret) {\r
-               schedule_delayed_work(dwork, 0);\r
-               flush_scheduled_work();\r
-       }\r
-       return ret;\r
-}\r
-\r
-static int rt5621_remove(struct platform_device *pdev)\r
-{\r
-       struct snd_soc_device *socdev = platform_get_drvdata(pdev);\r
-       struct snd_soc_codec *codec = socdev ->card->codec;\r
-\r
-       if (codec->control_data)\r
-               rt5621_set_bias_level(codec, SND_SOC_BIAS_OFF);\r
-       run_delayed_work(&codec->delayed_work);\r
-       snd_soc_free_pcms(socdev);\r
-       snd_soc_dapm_free(socdev);\r
-       device_remove_file(&pdev->dev, &dev_attr_index_reg);\r
-       i2c_unregister_device(codec->control_data);\r
-       i2c_del_driver(&rt5621_i2c_driver);\r
-       kfree(codec->private_data);\r
-       kfree(codec);\r
-\r
-       return 0;\r
-}\r
-\r
-struct snd_soc_codec_device soc_codec_dev_rt5621 = {\r
-       .probe =        rt5621_probe,\r
-       .remove =       rt5621_remove,\r
-       .suspend =      rt5621_suspend,\r
-       .resume =       rt5621_resume,\r
-};\r
-\r
-EXPORT_SYMBOL_GPL(soc_codec_dev_rt5621);\r
-\r
-static int __init rt5621_modinit(void)\r
-{\r
-       return snd_soc_register_dai(&rt5621_dai);\r
-}\r
-\r
-static void __exit rt5621_exit(void)\r
-{\r
-       snd_soc_unregister_dai(&rt5621_dai);\r
-}\r
-\r
-module_init(rt5621_modinit);\r
-module_exit(rt5621_exit);\r
-MODULE_LICENSE("GPL");\r
-\r
diff --git a/sound/soc/codecs/alc5621.h b/sound/soc/codecs/alc5621.h
deleted file mode 100644 (file)
index bdcebbd..0000000
+++ /dev/null
@@ -1,516 +0,0 @@
-#ifndef _RT5621_H\r
-#define _RT5621_H\r
-\r
-\r
-#define RT5621_RESET                                           0X00                    //RESET CODEC TO DEFAULT\r
-#define RT5621_SPK_OUT_VOL                                     0X02                    //SPEAKER OUT VOLUME\r
-#define RT5621_HP_OUT_VOL                                      0X04                    //HEADPHONE OUTPUT VOLUME\r
-#define RT5621_MONO_AUX_OUT_VOL                                0X06                    //MONO OUTPUT/AUXOUT VOLUME\r
-#define RT5621_AUXIN_VOL                                       0X08                    //AUXIN VOLUME\r
-#define RT5621_LINE_IN_VOL                                     0X0A                    //LINE IN VOLUME\r
-#define RT5621_STEREO_DAC_VOL                          0X0C                    //STEREO DAC VOLUME\r
-#define RT5621_MIC_VOL                                         0X0E                    //MICROPHONE VOLUME\r
-#define RT5621_MIC_ROUTING_CTRL                                0X10                    //MIC ROUTING CONTROL\r
-#define RT5621_ADC_REC_GAIN                                    0X12                    //ADC RECORD GAIN\r
-#define RT5621_ADC_REC_MIXER                           0X14                    //ADC RECORD MIXER CONTROL\r
-#define RT5621_SOFT_VOL_CTRL_TIME                      0X16                    //SOFT VOLUME CONTROL TIME\r
-#define RT5621_OUTPUT_MIXER_CTRL                       0X1C                    //OUTPUT MIXER CONTROL\r
-#define RT5621_MIC_CTRL                                                0X22                    //MICROPHONE CONTROL\r
-#define        RT5621_AUDIO_INTERFACE                          0X34                    //AUDIO INTERFACE\r
-#define RT5621_STEREO_AD_DA_CLK_CTRL           0X36                    //STEREO AD/DA CLOCK CONTROL\r
-#define        RT5621_COMPANDING_CTRL                          0X38                    //COMPANDING CONTROL\r
-#define        RT5621_PWR_MANAG_ADD1                           0X3A                    //POWER MANAGMENT ADDITION 1\r
-#define RT5621_PWR_MANAG_ADD2                          0X3C                    //POWER MANAGMENT ADDITION 2\r
-#define RT5621_PWR_MANAG_ADD3                          0X3E                    //POWER MANAGMENT ADDITION 3\r
-#define RT5621_ADD_CTRL_REG                                    0X40                    //ADDITIONAL CONTROL REGISTER\r
-#define        RT5621_GLOBAL_CLK_CTRL_REG                      0X42                    //GLOBAL CLOCK CONTROL REGISTER\r
-#define RT5621_PLL_CTRL                                                0X44                    //PLL CONTROL\r
-#define RT5621_GPIO_OUTPUT_PIN_CTRL                    0X4A                    //GPIO OUTPUT PIN CONTROL\r
-#define RT5621_GPIO_PIN_CONFIG                         0X4C                    //GPIO PIN CONFIGURATION\r
-#define RT5621_GPIO_PIN_POLARITY                       0X4E                    //GPIO PIN POLARITY/TYPE        \r
-#define RT5621_GPIO_PIN_STICKY                         0X50                    //GPIO PIN STICKY       \r
-#define RT5621_GPIO_PIN_WAKEUP                         0X52                    //GPIO PIN WAKE UP\r
-#define RT5621_GPIO_PIN_STATUS                         0X54                    //GPIO PIN STATUS\r
-#define RT5621_GPIO_PIN_SHARING                                0X56                    //GPIO PIN SHARING\r
-#define        RT5621_OVER_TEMP_CURR_STATUS            0X58                    //OVER TEMPERATURE AND CURRENT STATUS\r
-#define RT5621_JACK_DET_CTRL                           0X5A                    //JACK DETECT CONTROL REGISTER\r
-#define RT5621_MISC_CTRL                                       0X5E                    //MISC CONTROL\r
-#define        RT5621_PSEDUEO_SPATIAL_CTRL                     0X60                    //PSEDUEO STEREO & SPATIAL EFFECT BLOCK CONTROL\r
-#define RT5621_EQ_CTRL                                         0X62                    //EQ CONTROL\r
-#define RT5621_EQ_MODE_ENABLE                          0X66                    //EQ MODE CHANGE ENABLE\r
-#define RT5621_AVC_CTRL                                                0X68                    //AVC CONTROL\r
-#define RT5621_HID_CTRL_INDEX                          0X6A                    //HIDDEN CONTROL INDEX PORT\r
-#define RT5621_HID_CTRL_DATA                           0X6C                    //HIDDEN CONTROL DATA PORT\r
-#define RT5621_VENDOR_ID1                              0x7C                    //VENDOR ID1\r
-#define RT5621_VENDOR_ID2                              0x7E                    //VENDOR ID2\r
-\r
-\r
-//global definition\r
-#define RT_L_MUTE                                              (0x1<<15)               //MUTE LEFT CONTROL BIT\r
-#define RT_L_ZC                                                        (0x1<<14)               //LEFT ZERO CROSS CONTROL BIT\r
-#define RT_L_SM                                                        (0x1<<13)               //LEFT SOFTMUTE CONTROL BIT\r
-#define RT_R_MUTE                                              (0x1<<7)                //MUTE RIGHT CONTROL BIT\r
-#define RT_R_ZC                                                        (0x1<<6)                //RIGHT ZERO CROSS CONTROL BIT\r
-#define RT_R_SM                                                        (0x1<<5)                //RIGHT SOFTMUTE CONTROL BIT\r
-#define RT_M_HP_MIXER                                  (0x1<<15)               //Mute source to HP Mixer\r
-#define RT_M_SPK_MIXER                                 (0x1<<14)               //Mute source to Speaker Mixer\r
-#define RT_M_MONO_MIXER                                        (0x1<<13)               //Mute source to Mono Mixer\r
-#define SPK_CLASS_AB                                           0\r
-#define SPK_CLASS_D                                                    1\r
-\r
-//Mic Routing Control(0x10)\r
-#define M_MIC1_TO_HP_MIXER                             (0x1<<15)               //Mute MIC1 to HP mixer\r
-#define M_MIC1_TO_SPK_MIXER                            (0x1<<14)               //Mute MiC1 to SPK mixer\r
-#define M_MIC1_TO_MONO_MIXER                   (0x1<<13)               //Mute MIC1 to MONO mixer\r
-#define MIC1_DIFF_INPUT_CTRL                   (0x1<<12)               //MIC1 different input control\r
-#define M_MIC2_TO_HP_MIXER                             (0x1<<7)                //Mute MIC2 to HP mixer\r
-#define M_MIC2_TO_SPK_MIXER                            (0x1<<6)                //Mute MiC2 to SPK mixer\r
-#define M_MIC2_TO_MONO_MIXER                   (0x1<<5)                //Mute MIC2 to MONO mixer\r
-#define MIC2_DIFF_INPUT_CTRL                   (0x1<<4)                //MIC2 different input control\r
-\r
-//ADC Record Gain(0x12)\r
-#define M_ADC_L_TO_HP_MIXER                            (0x1<<15)               //Mute left of ADC to HP Mixer\r
-#define M_ADC_R_TO_HP_MIXER                            (0x1<<14)               //Mute right of ADC to HP Mixer\r
-#define M_ADC_L_TO_MONO_MIXER                  (0x1<<13)               //Mute left of ADC to MONO Mixer\r
-#define M_ADC_R_TO_MONO_MIXER                  (0x1<<12)               //Mute right of ADC to MONO Mixer\r
-#define ADC_L_GAIN_MASK                                        (0x1f<<7)               //ADC Record Gain Left channel Mask\r
-#define ADC_L_ZC_DET                                   (0x1<<6)                //ADC Zero-Cross Detector Control\r
-#define ADC_R_ZC_DET                                   (0x1<<5)                //ADC Zero-Cross Detector Control\r
-#define ADC_R_GAIN_MASK                                        (0x1f<<0)               //ADC Record Gain Right channel Mask\r
-\r
-//ADC Input Mixer Control(0x14)\r
-#define M_MIC1_TO_ADC_L_MIXER                          (0x1<<14)               //Mute mic1 to left channel of ADC mixer\r
-#define M_MIC2_TO_ADC_L_MIXER                          (0x1<<13)               //Mute mic2 to left channel of ADC mixer\r
-#define M_LINEIN_L_TO_ADC_L_MIXER                      (0x1<<12)               //Mute line In left channel to left channel of ADC mixer\r
-#define M_AUXIN_L_TO_ADC_L_MIXER                       (0x1<<11)               //Mute aux In left channel to left channel of ADC mixer\r
-#define M_HPMIXER_L_TO_ADC_L_MIXER                     (0x1<<10)               //Mute HP mixer left channel to left channel of ADC mixer\r
-#define M_SPKMIXER_L_TO_ADC_L_MIXER                    (0x1<<9)                //Mute SPK mixer left channel to left channel of ADC mixer\r
-#define M_MONOMIXER_L_TO_ADC_L_MIXER           (0x1<<8)                //Mute MONO mixer left channel to left channel of ADC mixer\r
-#define M_MIC1_TO_ADC_R_MIXER                          (0x1<<6)                //Mute mic1 to right channel of ADC mixer\r
-#define M_MIC2_TO_ADC_R_MIXER                          (0x1<<5)                //Mute mic2 to right channel of ADC mixer\r
-#define M_LINEIN_R_TO_ADC_R_MIXER                      (0x1<<4)                //Mute lineIn right channel to right channel of ADC mixer\r
-#define M_AUXIN_R_TO_ADC_R_MIXER                       (0x1<<3)                //Mute aux In right channel to right channel of ADC mixer\r
-#define M_HPMIXER_R_TO_ADC_R_MIXER                     (0x1<<2)                //Mute HP mixer right channel to right channel of ADC mixer\r
-#define M_SPKMIXER_R_TO_ADC_R_MIXER                    (0x1<<1)                //Mute SPK mixer right channel to right channel of ADC mixer\r
-#define M_MONOMIXER_R_TO_ADC_R_MIXER           (0x1<<0)                //Mute MONO mixer right channel to right channel of ADC mixer\r
-\r
-//Output Mixer Control(0x1C)\r
-#define        SPKOUT_N_SOUR_MASK                                      (0x3<<14)       \r
-#define        SPKOUT_N_SOUR_LN                                        (0x2<<14)\r
-#define        SPKOUT_N_SOUR_RP                                        (0x1<<14)\r
-#define        SPKOUT_N_SOUR_RN                                        (0x0<<14)\r
-#define SPK_OUTPUT_CLASS_AB                                    (0x0<<13)\r
-#define SPK_OUTPUT_CLASS_D                                     (0x1<<13)\r
-#define SPK_CLASS_AB_S_AMP                                     (0x0<<12)\r
-#define SPK_CALSS_AB_W_AMP                                     (0x1<<12)\r
-#define SPKOUT_INPUT_SEL_MASK                          (0x3<<10)\r
-#define SPKOUT_INPUT_SEL_MONOMIXER                     (0x3<<10)\r
-#define SPKOUT_INPUT_SEL_SPKMIXER                      (0x2<<10)\r
-#define SPKOUT_INPUT_SEL_HPMIXER                       (0x1<<10)\r
-#define SPKOUT_INPUT_SEL_VMID                          (0x0<<10)\r
-#define HPL_INPUT_SEL_HPLMIXER                         (0x1<<9)\r
-#define HPR_INPUT_SEL_HPRMIXER                         (0x1<<8)        \r
-#define MONO_AUX_INPUT_SEL_MASK                                (0x3<<6)\r
-#define MONO_AUX_INPUT_SEL_MONO                                (0x3<<6)\r
-#define MONO_AUX_INPUT_SEL_SPK                         (0x2<<6)\r
-#define MONO_AUX_INPUT_SEL_HP                          (0x1<<6)\r
-#define MONO_AUX_INPUT_SEL_VMID                                (0x0<<6)\r
-\r
-//Micphone Control define(0x22)\r
-#define MIC1           1\r
-#define MIC2           2\r
-#define MIC_BIAS_90_PRECNET_AVDD       1\r
-#define        MIC_BIAS_75_PRECNET_AVDD        2\r
-\r
-#define MIC1_BOOST_CTRL_MASK           (0x3<<10)\r
-#define MIC1_BOOST_CTRL_BYPASS         (0x0<<10)\r
-#define MIC1_BOOST_CTRL_20DB           (0x1<<10)\r
-#define MIC1_BOOST_CTRL_30DB           (0x2<<10)\r
-#define MIC1_BOOST_CTRL_40DB           (0x3<<10)\r
-\r
-#define MIC2_BOOST_CTRL_MASK           (0x3<<8)\r
-#define MIC2_BOOST_CTRL_BYPASS         (0x0<<8)\r
-#define MIC2_BOOST_CTRL_20DB           (0x1<<8)\r
-#define MIC2_BOOST_CTRL_30DB           (0x2<<8)\r
-#define MIC2_BOOST_CTRL_40DB           (0x3<<8)\r
-\r
-#define MICBIAS_VOLT_CTRL_MASK         (0x1<<5)\r
-#define MICBIAS_VOLT_CTRL_90P          (0x0<<5)\r
-#define MICBIAS_VOLT_CTRL_75P          (0x1<<5)\r
-\r
-#define MICBIAS_SHORT_CURR_DET_MASK            (0x3)\r
-#define MICBIAS_SHORT_CURR_DET_600UA   (0x0)\r
-#define MICBIAS_SHORT_CURR_DET_1200UA  (0x1)\r
-#define MICBIAS_SHORT_CURR_DET_1800UA  (0x2)\r
-\r
-//Audio Interface(0x34)                        \r
-#define SDP_MASTER_MODE                                (0x0<<15)               //Main I2S interface select Master mode\r
-#define SDP_SLAVE_MODE                         (0x1<<15)               //Main I2S interface select Slave mode\r
-#define I2S_PCM_MODE                           (0x1<<14)               //PCM           0:mode A                                ,1:mode B                                                                                                       \r
-#define MAIN_I2S_BCLK_POL_CTRL         (0x1<<7)                //0:Normal 1:Invert\r
-#define ADC_DATA_L_R_SWAP                      (0x1<<5)                //0:ADC data appear at left phase of LRCK\r
-                                                                                                       //1:ADC data appear at right phase of LRCK\r
-#define DAC_DATA_L_R_SWAP                      (0x1<<4)                //0:DAC data appear at left phase of LRCK\r
-                                                                                                       //1:DAC data appear at right phase of LRCK      \r
-//Data Length Slection\r
-#define I2S_DL_MASK                            (0x3<<2)                //main i2s Data Length mask     \r
-#define I2S_DL_16                              (0x0<<2)                //16 bits\r
-#define I2S_DL_20                              (0x1<<2)                //20 bits\r
-#define        I2S_DL_24                               (0x2<<2)                //24 bits\r
-#define I2S_DL_32                              (0x3<<2)                //32 bits\r
-                                                                                                       \r
-//PCM Data Format Selection\r
-#define I2S_DF_MASK                            (0x3)                   //main i2s Data Format mask\r
-#define I2S_DF_I2S                             (0x0)                   //I2S FORMAT \r
-#define I2S_DF_RIGHT                   (0x1)                   //RIGHT JUSTIFIED format\r
-#define        I2S_DF_LEFT                             (0x2)                   //LEFT JUSTIFIED  format\r
-#define I2S_DF_PCM                             (0x3)                   //PCM format\r
-\r
-//Stereo AD/DA Clock Control(0x36h)\r
-#define I2S_PRE_DIV_MASK               (0x7<<12)                       \r
-#define I2S_PRE_DIV_1                  (0x0<<12)                       //DIV 1\r
-#define I2S_PRE_DIV_2                  (0x1<<12)                       //DIV 2\r
-#define I2S_PRE_DIV_4                  (0x2<<12)                       //DIV 4\r
-#define I2S_PRE_DIV_8                  (0x3<<12)                       //DIV 8\r
-#define I2S_PRE_DIV_16                 (0x4<<12)                       //DIV 16\r
-#define I2S_PRE_DIV_32                 (0x5<<12)                       //DIV 32\r
-\r
-#define I2S_SCLK_DIV_MASK              (0x7<<9)                        \r
-#define I2S_SCLK_DIV_1                 (0x0<<9)                        //DIV 1\r
-#define I2S_SCLK_DIV_2                 (0x1<<9)                        //DIV 2\r
-#define I2S_SCLK_DIV_3                 (0x2<<9)                        //DIV 3\r
-#define I2S_SCLK_DIV_4                 (0x3<<9)                        //DIV 4\r
-#define I2S_SCLK_DIV_6                 (0x4<<9)                        //DIV 6\r
-#define I2S_SCLK_DIV_8                 (0x5<<9)                        //DIV 8\r
-#define I2S_SCLK_DIV_12                        (0x6<<9)                        //DIV 12\r
-#define I2S_SCLK_DIV_16                        (0x7<<9)                        //DIV 16\r
-\r
-#define I2S_WCLK_DIV_PRE_MASK          (0xF<<5)                        \r
-#define I2S_WCLK_PRE_DIV_1                     (0x0<<5)                        //DIV 1\r
-#define I2S_WCLK_PRE_DIV_2                     (0x1<<5)                        //DIV 2\r
-#define I2S_WCLK_PRE_DIV_3                     (0x2<<5)                        //DIV 3\r
-#define I2S_WCLK_PRE_DIV_4                     (0x3<<5)                        //DIV 4\r
-#define I2S_WCLK_PRE_DIV_5                     (0x4<<5)                        //DIV 5\r
-#define I2S_WCLK_PRE_DIV_6                     (0x5<<5)                        //DIV 6\r
-#define I2S_WCLK_PRE_DIV_7                     (0x6<<5)                        //DIV 7\r
-#define I2S_WCLK_PRE_DIV_8                     (0x7<<5)                        //DIV 8\r
-//........................\r
-\r
-#define I2S_WCLK_DIV_MASK              (0x7<<2)                        \r
-#define I2S_WCLK_DIV_2                 (0x0<<2)                        //DIV 2\r
-#define I2S_WCLK_DIV_4                 (0x1<<2)                        //DIV 4\r
-#define I2S_WCLK_DIV_8                 (0x2<<2)                        //DIV 8\r
-#define I2S_WCLK_DIV_16                        (0x3<<2)                        //DIV 16\r
-#define I2S_WCLK_DIV_32                        (0x4<<2)                        //DIV 32\r
-\r
-#define ADDA_FILTER_CLK_SEL_256FS      (0<<1)                  //256FS\r
-#define ADDA_FILTER_CLK_SEL_384FS      (1<<1)                  //384FS\r
-\r
-#define ADDA_OSR_SEL_64FS      (0)                                             //64FS\r
-#define ADDA_OSR_SEL_128FS     (1)                                             //128FS\r
-\r
-//Power managment addition 1 (0x3A),0:Disable,1:Enable\r
-#define PWR_MAIN_I2S_EN                                (0x1<<15)\r
-#define PWR_ZC_DET_PD_EN                       (0x1<<14)       \r
-#define PWR_MIC1_BIAS_EN                       (0x1<<11)\r
-#define PWR_SHORT_CURR_DET_EN          (0x1<<10)\r
-#define PWR_SOFTGEN_EN                         (0x1<<8)\r
-#define        PWR_DEPOP_BUF_HP                        (0x1<<6)\r
-#define        PWR_HP_OUT_AMP                          (0x1<<5)\r
-#define        PWR_HP_OUT_ENH_AMP                      (0x1<<4)\r
-#define PWR_DEPOP_BUF_AUX                      (0x1<<2)\r
-#define PWR_AUX_OUT_AMP                                (0x1<<1)\r
-#define PWR_AUX_OUT_ENH_AMP                    (0x1)\r
-\r
-\r
-//Power managment addition 2(0x3C),0:Disable,1:Enable\r
-#define PWR_CLASS_AB                           (0x1<<15)\r
-#define PWR_CLASS_D                                    (0x1<<14)\r
-#define PWR_VREF                                       (0x1<<13)\r
-#define PWR_PLL                                                (0x1<<12)\r
-#define PWR_DAC_REF_CIR                                (0x1<<10)\r
-#define PWR_L_DAC_CLK                          (0x1<<9)\r
-#define PWR_R_DAC_CLK                          (0x1<<8)\r
-#define PWR_L_ADC_CLK_GAIN                     (0x1<<7)\r
-#define PWR_R_ADC_CLK_GAIN                     (0x1<<6)\r
-#define PWR_L_HP_MIXER                         (0x1<<5)\r
-#define PWR_R_HP_MIXER                         (0x1<<4)\r
-#define PWR_SPK_MIXER                          (0x1<<3)\r
-#define PWR_MONO_MIXER                         (0x1<<2)\r
-#define PWR_L_ADC_REC_MIXER                    (0x1<<1)\r
-#define PWR_R_ADC_REC_MIXER                    (0x1)\r
-\r
-//Power managment addition 3(0x3E),0:Disable,1:Enable\r
-#define PWR_MAIN_BIAS                          (0x1<<15)\r
-#define PWR_AUXOUT_L_VOL_AMP           (0x1<<14)\r
-#define PWR_AUXOUT_R_VOL_AMP           (0x1<<13)\r
-#define PWR_SPK_OUT                                    (0x1<<12)\r
-#define PWR_HP_L_OUT_VOL                       (0x1<<10)\r
-#define PWR_HP_R_OUT_VOL                       (0x1<<9)\r
-#define PWR_LINEIN_L_VOL                       (0x1<<7)\r
-#define PWR_LINEIN_R_VOL                       (0x1<<6)\r
-#define PWR_AUXIN_L_VOL                                (0x1<<5)\r
-#define PWR_AUXIN_R_VOL                                (0x1<<4)\r
-#define PWR_MIC1_FUN_CTRL                      (0x1<<3)\r
-#define PWR_MIC2_FUN_CTRL                      (0x1<<2)\r
-#define PWR_MIC1_BOOST_MIXER           (0x1<<1)\r
-#define PWR_MIC2_BOOST_MIXER           (0x1)\r
-\r
-\r
-//Additional Control Register(0x40)\r
-#define AUXOUT_SEL_DIFF                                        (0x1<<15)       //Differential Mode\r
-#define AUXOUT_SEL_SE                                  (0x1<<15)       //Single-End Mode\r
-\r
-#define SPK_AB_AMP_CTRL_MASK                   (0x7<<12)\r
-#define SPK_AB_AMP_CTRL_RATIO_225              (0x0<<12)               //2.25 Vdd\r
-#define SPK_AB_AMP_CTRL_RATIO_200              (0x1<<12)               //2.00 Vdd\r
-#define SPK_AB_AMP_CTRL_RATIO_175              (0x2<<12)               //1.75 Vdd\r
-#define SPK_AB_AMP_CTRL_RATIO_150              (0x3<<12)               //1.50 Vdd\r
-#define SPK_AB_AMP_CTRL_RATIO_125              (0x4<<12)               //1.25 Vdd      \r
-#define SPK_AB_AMP_CTRL_RATIO_100              (0x5<<12)               //1.00 Vdd\r
-\r
-#define SPK_D_AMP_CTRL_MASK                            (0x3<<10)\r
-#define SPK_D_AMP_CTRL_RATIO_175               (0x0<<10)               //1.75 Vdd\r
-#define SPK_D_AMP_CTRL_RATIO_150               (0x1<<10)               //1.50 Vdd      \r
-#define SPK_D_AMP_CTRL_RATIO_125               (0x2<<10)               //1.25 Vdd\r
-#define SPK_D_AMP_CTRL_RATIO_100               (0x3<<10)               //1.00 Vdd\r
-\r
-#define STEREO_DAC_HI_PASS_FILTER_EN   (0x1<<9)                //Stereo DAC high pass filter enable\r
-#define STEREO_ADC_HI_PASS_FILTER_EN   (0x1<<8)                //Stereo ADC high pass filter enable\r
-\r
-#define DIG_VOL_BOOST_MASK                             (0x3<<4)                //Digital volume Boost mask\r
-#define DIG_VOL_BOOST_0DB                              (0x0<<4)                //Digital volume Boost 0DB\r
-#define DIG_VOL_BOOST_6DB                              (0x1<<4)                //Digital volume Boost 6DB\r
-#define DIG_VOL_BOOST_12DB                             (0x2<<4)                //Digital volume Boost 12DB\r
-#define DIG_VOL_BOOST_18DB                             (0x3<<4)                //Digital volume Boost 18DB\r
-\r
-\r
-//Global Clock Control Register(0x42)\r
-#define SYSCLK_SOUR_SEL_MASK                   (0x1<<15)\r
-#define SYSCLK_SOUR_SEL_MCLK                   (0x0<<15)               //system Clock source from MCLK\r
-#define SYSCLK_SOUR_SEL_PLL                            (0x1<<15)               //system Clock source from PLL\r
-#define PLLCLK_SOUR_SEL_MCLK                   (0x0<<14)               //PLL clock source from MCLK\r
-#define PLLCLK_SOUR_SEL_BITCLK                 (0x1<<14)               //PLL clock source from BITCLK\r
-\r
-#define PLLCLK_DIV_RATIO_MASK                  (0x3<<1)                \r
-#define PLLCLK_DIV_RATIO_DIV1                  (0x0<<1)                //DIV 1\r
-#define PLLCLK_DIV_RATIO_DIV2                  (0x1<<1)                //DIV 2\r
-#define PLLCLK_DIV_RATIO_DIV4                  (0x2<<1)                //DIV 4\r
-#define PLLCLK_DIV_RATIO_DIV8                  (0x3<<1)                //DIV 8\r
-\r
-#define PLLCLK_PRE_DIV1                                        (0x0)                   //DIV 1\r
-#define PLLCLK_PRE_DIV2                                        (0x1)                   //DIV 2\r
-\r
-//PLL Control(0x44)\r
-\r
-#define PLL_CTRL_M_VAL(m)              ((m)&0xf)\r
-#define PLL_CTRL_K_VAL(k)              (((k)&0x7)<<4)\r
-#define PLL_CTRL_N_VAL(n)              (((n)&0xff)<<8)\r
-\r
-//GPIO Pin Configuration(0x4C)\r
-#define GPIO_PIN_MASK                          (0x1<<1)\r
-#define GPIO_PIN_SET_INPUT                     (0x1<<1)\r
-#define GPIO_PIN_SET_OUTPUT                    (0x0<<1)\r
-\r
-//Pin Sharing(0x56)\r
-#define LINEIN_L_PIN_SHARING           (0x1<<15)\r
-#define LINEIN_L_PIN_AS_LINEIN_L       (0x0<<15)\r
-#define LINEIN_L_PIN_AS_JD1                    (0x1<<15)\r
-\r
-#define LINEIN_R_PIN_SHARING           (0x1<<14)\r
-#define LINEIN_R_PIN_AS_LINEIN_R       (0x0<<14)\r
-#define LINEIN_R_PIN_AS_JD2                    (0x1<<14)\r
-\r
-#define GPIO_PIN_SHARING                       (0x3)\r
-#define GPIO_PIN_AS_GPIO                       (0x0)\r
-#define GPIO_PIN_AS_IRQOUT                     (0x1)\r
-#define GPIO_PIN_AS_PLLOUT                     (0x3)\r
-\r
-//Jack Detect Control Register(0x5A)\r
-#define JACK_DETECT_MASK                       (0x3<<14)\r
-#define JACK_DETECT_USE_JD2                    (0x3<<14)\r
-#define JACK_DETECT_USE_JD1                    (0x2<<14)\r
-#define JACK_DETECT_USE_GPIO           (0x1<<14)\r
-#define JACK_DETECT_OFF                                (0x0<<14)\r
-\r
-#define        SPK_EN_IN_HI                            (0x1<<11)\r
-#define AUX_R_EN_IN_HI                         (0x1<<10)\r
-#define AUX_L_EN_IN_HI                         (0x1<<9)\r
-#define HP_EN_IN_HI                                    (0x1<<8)\r
-#define        SPK_EN_IN_LO                            (0x1<<7)\r
-#define AUX_R_EN_IN_LO                         (0x1<<6)\r
-#define AUX_L_EN_IN_LO                         (0x1<<5)\r
-#define HP_EN_IN_LO                                    (0x1<<4)\r
-\r
-////MISC CONTROL(0x5E)\r
-#define DISABLE_FAST_VREG                      (0x1<<15)\r
-#define SPK_CLASS_AB_OC_PD                     (0x1<<13)\r
-#define SPK_CLASS_AB_OC_DET                    (0x1<<12)\r
-#define HP_DEPOP_MODE3_EN                      (0x1<<10)\r
-#define HP_DEPOP_MODE2_EN                      (0x1<<9)\r
-#define HP_DEPOP_MODE1_EN                      (0x1<<8)\r
-#define AUXOUT_DEPOP_MODE3_EN          (0x1<<6)\r
-#define AUXOUT_DEPOP_MODE2_EN          (0x1<<5)\r
-#define AUXOUT_DEPOP_MODE1_EN          (0x1<<4)\r
-#define M_DAC_L_INPUT                          (0x1<<3)\r
-#define M_DAC_R_INPUT                          (0x1<<2)\r
-#define IRQOUT_INV_CTRL                                (0x1<<0)\r
-\r
-//Psedueo Stereo & Spatial Effect Block Control(0x60)\r
-#define SPATIAL_CTRL_EN                                (0x1<<15)\r
-#define ALL_PASS_FILTER_EN                     (0x1<<14)\r
-#define PSEUDO_STEREO_EN                       (0x1<<13)\r
-#define STEREO_EXPENSION_EN                    (0x1<<12)\r
-\r
-#define GAIN_3D_PARA_L_MASK                    (0x7<<9)\r
-#define GAIN_3D_PARA_L_1_00                    (0x0<<9)\r
-#define GAIN_3D_PARA_L_1_25                    (0x1<<9)\r
-#define GAIN_3D_PARA_L_1_50                    (0x2<<9)\r
-#define GAIN_3D_PARA_L_1_75                    (0x3<<9)\r
-#define GAIN_3D_PARA_L_2_00                    (0x4<<9)\r
-\r
-#define GAIN_3D_PARA_R_MASK                    (0x7<<6)\r
-#define GAIN_3D_PARA_R_1_00                    (0x0<<6)\r
-#define GAIN_3D_PARA_R_1_25                    (0x1<<6)\r
-#define GAIN_3D_PARA_R_1_50                    (0x2<<6)\r
-#define GAIN_3D_PARA_R_1_75                    (0x3<<6)\r
-#define GAIN_3D_PARA_R_2_00                    (0x4<<6)\r
-\r
-#define RATIO_3D_L_MASK                                (0x3<<4)\r
-#define RATIO_3D_L_0_0                         (0x0<<4)\r
-#define RATIO_3D_L_0_66                                (0x1<<4)\r
-#define RATIO_3D_L_1_0                         (0x2<<4)\r
-\r
-#define RATIO_3D_R_MASK                                (0x3<<2)\r
-#define RATIO_3D_R_0_0                         (0x0<<2)\r
-#define RATIO_3D_R_0_66                                (0x1<<2)\r
-#define RATIO_3D_R_1_0                         (0x2<<2)\r
-\r
-#define APF_MASK                                       (0x3)\r
-#define APF_FOR_48K                                    (0x3)\r
-#define APF_FOR_44_1K                          (0x2)\r
-#define APF_FOR_32K                                    (0x1)\r
-\r
-//EQ CONTROL(0x62)\r
-\r
-#define EN_HW_EQ_BLK                   (0x1<<15)               //HW EQ block control\r
-#define EN_HW_EQ_HPF_MODE              (0x1<<14)               //High Frequency shelving filter mode\r
-#define EN_HW_EQ_SOUR                  (0x1<<11)               //0:DAC PATH,1:ADC PATH\r
-#define EN_HW_EQ_HPF                   (0x1<<4)                //EQ High Pass Filter Control\r
-#define EN_HW_EQ_BP3                   (0x1<<3)                //EQ Band-3 Control\r
-#define EN_HW_EQ_BP2                   (0x1<<2)                //EQ Band-2 Control\r
-#define EN_HW_EQ_BP1                   (0x1<<1)                //EQ Band-1 Control\r
-#define EN_HW_EQ_LPF                   (0x1<<0)                //EQ Low Pass Filter Control\r
-\r
-//EQ Mode Change Enable(0x66)\r
-#define EQ_HPF_CHANGE_EN               (0x1<<4)                //EQ High Pass Filter Mode Change Enable\r
-#define EQ_BP3_CHANGE_EN               (0x1<<3)                //EQ Band-3 Pass Filter Mode Change Enable\r
-#define EQ_BP2_CHANGE_EN               (0x1<<2)                //EQ Band-2 Pass Filter Mode Change Enable\r
-#define EQ_BP1_CHANGE_EN               (0x1<<1)                //EQ Band-1 Pass Filter Mode Change Enable\r
-#define EQ_LPF_CHANGE_EN               (0x1<<0)                //EQ Low Pass Filter Mode Change Enable\r
-\r
-\r
-//AVC Control(0x68)\r
-#define AVC_ENABLE                             (0x1<<15)\r
-#define AVC_TARTGET_SEL_MASK   (0x1<<14)\r
-#define        AVC_TARTGET_SEL_R               (0x1<<14)\r
-#define        AVC_TARTGET_SEL_L               (0x0<<14)\r
-\r
-\r
-struct rt5621_setup_data {\r
-       unsigned short i2c_address;\r
-       unsigned short i2c_bus;\r
-};\r
-\r
-\r
-\r
-#define RT5621_PLL_FR_MCLK                     0\r
-#define RT5621_PLL_FR_BCLK                     1\r
-\r
-\r
-#define USE_DAPM_CONTROL 0\r
-#define REALTEK_HWDEP 0\r
-\r
-//WaveOut channel for realtek codec\r
-enum \r
-{\r
-       RT_WAVOUT_SPK                           =(0x1<<0),\r
-       RT_WAVOUT_SPK_R                         =(0x1<<1),\r
-       RT_WAVOUT_SPK_L                         =(0x1<<2),\r
-       RT_WAVOUT_HP                            =(0x1<<3),\r
-       RT_WAVOUT_HP_R                          =(0x1<<4),\r
-       RT_WAVOUT_HP_L                          =(0x1<<5),      \r
-       RT_WAVOUT_MONO                          =(0x1<<6),\r
-       RT_WAVOUT_AUXOUT                        =(0x1<<7),\r
-       RT_WAVOUT_AUXOUT_R                      =(0x1<<8),\r
-       RT_WAVOUT_AUXOUT_L                      =(0x1<<9),\r
-       RT_WAVOUT_LINEOUT                       =(0x1<<10),\r
-       RT_WAVOUT_LINEOUT_R                     =(0x1<<11),\r
-       RT_WAVOUT_LINEOUT_L                     =(0x1<<12),     \r
-       RT_WAVOUT_DAC                           =(0x1<<13),             \r
-       RT_WAVOUT_ALL_ON                        =(0x1<<14),\r
-};\r
-\r
-//WaveIn channel for realtek codec\r
-enum\r
-{\r
-       RT_WAVIN_R_MONO_MIXER           =(0x1<<0),\r
-       RT_WAVIN_R_SPK_MIXER            =(0x1<<1),\r
-       RT_WAVIN_R_HP_MIXER                     =(0x1<<2),\r
-       RT_WAVIN_R_PHONE                        =(0x1<<3),\r
-       RT_WAVIN_R_AUXIN                        =(0x1<<3),      \r
-       RT_WAVIN_R_LINE_IN                      =(0x1<<4),\r
-       RT_WAVIN_R_MIC2                         =(0x1<<5),\r
-       RT_WAVIN_R_MIC1                         =(0x1<<6),\r
-\r
-       RT_WAVIN_L_MONO_MIXER           =(0x1<<8),\r
-       RT_WAVIN_L_SPK_MIXER            =(0x1<<9),\r
-       RT_WAVIN_L_HP_MIXER                     =(0x1<<10),\r
-       RT_WAVIN_L_PHONE                        =(0x1<<11),\r
-       RT_WAVIN_L_AUXIN                        =(0x1<<11),\r
-       RT_WAVIN_L_LINE_IN                      =(0x1<<12),\r
-       RT_WAVIN_L_MIC2                         =(0x1<<13),\r
-       RT_WAVIN_L_MIC1                         =(0x1<<14),\r
-};\r
-\r
-enum \r
-{\r
-       POWER_STATE_D0=0,\r
-       POWER_STATE_D1,\r
-       POWER_STATE_D1_PLAYBACK,\r
-       POWER_STATE_D1_RECORD,\r
-       POWER_STATE_D2,\r
-       POWER_STATE_D2_PLAYBACK,\r
-       POWER_STATE_D2_RECORD,\r
-       POWER_STATE_D3,\r
-       POWER_STATE_D4\r
-\r
-}; \r
-\r
-#if REALTEK_HWDEP\r
-\r
-struct rt56xx_reg_state\r
-{\r
-       unsigned int reg_index;\r
-       unsigned int reg_value;\r
-};\r
-\r
-struct rt56xx_cmd\r
-{\r
-       size_t number;\r
-       struct rt56xx_reg_state __user *buf;            \r
-};\r
-\r
-enum \r
-{\r
-       RT_READ_CODEC_REG_IOCTL = _IOR('R', 0x01, struct rt56xx_cmd),\r
-       RT_READ_ALL_CODEC_REG_IOCTL = _IOR('R', 0x02, struct rt56xx_cmd),\r
-       RT_WRITE_CODEC_REG_IOCTL = _IOW('R', 0x03, struct rt56xx_cmd),\r
-};\r
-\r
-#endif\r
-\r
-extern struct snd_soc_dai rt5621_dai;  \r
-extern struct snd_soc_codec_device soc_codec_dev_rt5621;\r
-\r
-#endif\r
diff --git a/sound/soc/rk29/rk29_rt5621.c b/sound/soc/rk29/rk29_rt5621.c
deleted file mode 100644 (file)
index 92c221e..0000000
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * rk29_rt5621.c  --  SoC audio for rockchip
- *
- * Driver for rockchip rt5621 audio
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *
- */
-
-#include <linux/module.h>
-#include <linux/device.h>
-#include <sound/core.h>
-#include <sound/pcm.h>
-#include <sound/soc.h>
-#include <sound/soc-dapm.h>
-#include <asm/io.h>
-#include <mach/hardware.h>
-#include <mach/rk29_iomap.h>
-#include "../codecs/rt5621.h"
-#include "rk29_pcm.h"
-#include "rk29_i2s.h"
-
-#if 0
-#define        DBG(x...)       printk(KERN_INFO x)
-#else
-#define        DBG(x...)
-#endif
-
-static int rk29_hw_params(struct snd_pcm_substream *substream,
-       struct snd_pcm_hw_params *params)
-{
-       struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_dai *codec_dai = rtd->codec_dai;
-       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
-       unsigned int pll_out = 0; 
-       unsigned int lrclk = 0;
-       int ret;
-         
-       DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);    
-
-       /*by Vincent Hsiung for EQ Vol Change*/
-       #define HW_PARAMS_FLAG_EQVOL_ON 0x21
-       #define HW_PARAMS_FLAG_EQVOL_OFF 0x22
-       if ((params->flags == HW_PARAMS_FLAG_EQVOL_ON)||(params->flags == HW_PARAMS_FLAG_EQVOL_OFF))
-       {
-               ret = codec_dai->driver->ops->hw_params(substream, params, codec_dai); //by Vincent
-               DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
-       } else {
-               /* set codec DAI configuration */
-#if defined (CONFIG_SND_RK29_CODEC_SOC_SLAVE) 
-               ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
-                       SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS); 
-#endif
-#if defined (CONFIG_SND_RK29_CODEC_SOC_MASTER) 
-               ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
-                       SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM ); 
-#endif
-               if (ret < 0)
-                       return ret; 
-               /* set cpu DAI configuration */
-#if defined (CONFIG_SND_RK29_CODEC_SOC_SLAVE) 
-               ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
-                       SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM);
-#endif
-#if defined (CONFIG_SND_RK29_CODEC_SOC_MASTER) 
-               ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
-                       SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS); 
-#endif
-               if (ret < 0)
-                       return ret;
-       }
-
-       switch(params_rate(params)) {
-       case 8000:
-       case 16000:
-       case 24000:
-       case 32000:
-       case 48000:
-               pll_out = 12288000;
-               break;
-       case 11025:
-       case 22050:
-       case 44100:
-               pll_out = 11289600;
-               break;
-       default:
-               DBG("Enter:%s, %d, Error rate=%d\n",__FUNCTION__,__LINE__,params_rate(params));
-               return -EINVAL;
-               break;
-       }
-       DBG("Enter:%s, %d, rate=%d\n",__FUNCTION__,__LINE__,params_rate(params));
-
-#if defined (CONFIG_SND_RK29_CODEC_SOC_SLAVE)
-#if 0  //use pll from blck
-       /*Set the pll of rt5621,the Pll source from BITCLK on CPU is master mode*/
-       //bitclk is 64fs           
-       ret=snd_soc_dai_set_pll(codec_dai,RT5621_PLL_FR_BCLK,params_rate(params)*64,pll_out);
-       if (ret < 0) { 
-               DBG("rk29_hw_params_rt5621:failed to set the pll for codec side\n"); 
-               return ret;
-       }
-#endif     
-       /*Set the system clk for codec*/
-       ret=snd_soc_dai_set_sysclk(codec_dai, 0,pll_out,SND_SOC_CLOCK_IN);
-       if (ret < 0) {
-               DBG("rk29_hw_params_rt5621:failed to set the sysclk for codec side\n"); 
-               return ret;
-       }           
-#endif
-  
-
-  #if defined (CONFIG_SND_RK29_CODEC_SOC_MASTER) 
-
-       if((24576000%params_rate(params))==0)   //for 8k,16k,32k,48k
-       {
-               snd_soc_dai_set_pll(codec_dai,RT5621_PLL_FR_MCLK,pll_out, 24576000);
-               snd_soc_dai_set_sysclk(codec_dai,0, 24576000, SND_SOC_CLOCK_IN);                        
-       }
-       else if((22579200%params_rate(params))==0)      //for 11k,22k,44k
-       {
-               snd_soc_dai_set_pll(codec_dai,RT5621_PLL_FR_MCLK,pll_out, 22579200);
-               snd_soc_dai_set_sysclk(codec_dai,0, 22579200, SND_SOC_CLOCK_IN);                        
-       }
-      
-#endif
-
-
-#if defined (CONFIG_SND_RK29_CODEC_SOC_SLAVE)
-       snd_soc_dai_set_sysclk(cpu_dai, 0, pll_out, 0);
-       snd_soc_dai_set_clkdiv(cpu_dai, ROCKCHIP_DIV_BCLK, (pll_out/4)/params_rate(params)-1);
-       snd_soc_dai_set_clkdiv(cpu_dai, ROCKCHIP_DIV_MCLK, 3);
-#endif
-
-       DBG("Enter:%s, %d, LRCK=%d\n",__FUNCTION__,__LINE__,(pll_out/4)/params_rate(params));
-        
-       return 0;
-}
-
-static const struct snd_soc_dapm_widget rt5621_dapm_widgets[] = {
-       
-       SND_SOC_DAPM_MIC("Mic Jack", NULL),
-       SND_SOC_DAPM_SPK("Ext Spk", NULL),
-       SND_SOC_DAPM_HP("Headphone Jack", NULL),
-
-};
-
-static const struct snd_soc_dapm_route audio_map[]={
-
-       /* Mic Jack --> MIC_IN*/
-       {"Mic Bias1", NULL, "Mic Jack"},
-       {"MIC1", NULL, "Mic Bias1"},
-       /* HP_OUT --> Headphone Jack */
-       {"Headphone Jack", NULL, "HPOL"},
-       {"Headphone Jack", NULL, "HPOR"},
-       /* LINE_OUT --> Ext Speaker */
-       {"Ext Spk", NULL, "SPOL"},
-       {"Ext Spk", NULL, "SPOR"},
-
-} ;
-
-/*
- * Logic for a rt5621 as connected on a rockchip board.
- */
-static int rk29_wm8988_init(struct snd_soc_pcm_runtime *rtd)
-{
-        return 0;
-}
-
-static struct snd_soc_ops rk29_ops = {
-         .hw_params = rk29_hw_params,
-};
-
-static struct snd_soc_dai_link rk29_dai = {
-       .name = "RT5621",
-       .stream_name = "RT5621 PCM",
-       .codec_name = "RT5621.0-001a",
-       .platform_name = "rockchip-audio",
-       .cpu_dai_name = "rk29_i2s.0",
-       .codec_dai_name = "RT5621 HiFi",
-       .init = rk29_wm8988_init,
-       .ops = &rk29_ops,
-};
-
-static struct snd_soc_card snd_soc_card_rk29 = {
-       .name = "RK29_RT5621",
-       .dai_link = &rk29_dai,
-       .num_links = 1,
-};
-
-static struct platform_device *rk29_snd_device;
-
-static int __init audio_card_init(void)
-{
-    int ret =0;        
-       
-    //rk29_speaker = rk29_speaker_init(RK29_PIN6_PB6, GPIO_HIGH, 2, (200*1000*1000));
-
-    DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
-       rk29_snd_device = platform_device_alloc("soc-audio", -1);
-       if (!rk29_snd_device) {
-                 DBG("platform device allocation failed\n");
-                 ret = -ENOMEM;
-                 return ret;
-       }
-       platform_set_drvdata(rk29_snd_device, &snd_soc_card_rk29);
-       ret = platform_device_add(rk29_snd_device);
-       if (ret) {
-           DBG("platform device add failed\n");
-           platform_device_put(rk29_snd_device);
-               return ret;
-       }
-       return ret;
-}
-
-static void __exit audio_card_exit(void)
-{
-       platform_device_unregister(rk29_snd_device);
-}
-
-module_init(audio_card_init);
-module_exit(audio_card_exit);
-/* Module information */
-MODULE_AUTHOR("rockchip");
-MODULE_DESCRIPTION("ROCKCHIP i2s ASoC Interface");
-MODULE_LICENSE("GPL");