#include <sound/initval.h>
#include <mach/gpio.h>
#include <mach/iomux.h>
-
+#include <linux/workqueue.h>
#include "rk610_codec.h"
+#ifdef CONFIG_ARCH_RK30
+#define RK610_SPK_CTRL_PIN RK30_PIN4_PC6
+#else
#define RK610_SPK_CTRL_PIN RK29_PIN6_PB6
-
+#endif
+//1:set pll from rk610
+#define RK610_CTL_PLL 0
/*
* Debug
*/
#if 0
-#define DBG(x...) printk(KERN_ERR x)
+#define DBG(x...) printk(KERN_INFO x)
#else
#define DBG(x...)
#endif
-#define err(format, arg...) \
- printk(KERN_ERR AUDIO_NAME ": " format "\n" , ## arg)
-#define info(format, arg...) \
- printk(KERN_INFO AUDIO_NAME ": " format "\n" , ## arg)
-
-#define OUT_CAPLESS (0) //ÊÇ·ñΪÎÞµçÈÝÊä³ö£¬1:ÎÞµçÈÝÊä³ö£¬0:ÓеçÈÝÊä³ö
+#define OUT_CAPLESS (1) //ÊÇ·ñΪÎÞµçÈÝÊä³ö£¬1:ÎÞµçÈÝÊä³ö£¬0:ÓеçÈÝÊä³ö
static u32 gVolReg = 0x00; ///0x0f; //ÓÃÓڼǼÒôÁ¿¼Ä´æÆ÷
//static u32 gCodecVol = 0x0f;
static struct snd_soc_codec *rk610_codec_codec;
/* codec private data */
struct rk610_codec_priv {
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
enum snd_soc_control_type control_type;
-#endif
unsigned int sysclk;
struct snd_soc_codec codec;
struct snd_pcm_hw_constraint_list *sysclk_constraints;
u16 reg_cache[RK610_CODEC_NUM_REG];
-};
-extern int rk610_control_init_codec(void);
-extern int rk610_codec_pll_set(unsigned int rate);
+ struct delayed_work rk610_delayed_work;
+ unsigned int spk_ctrl_io;
+};
/*
* read rk610 register cache
}
static unsigned int rk610_codec_read(struct snd_soc_codec *codec, unsigned int r)
-{
+{
struct i2c_msg xfer[1];
u8 reg = r;
int ret;
return reg;
}
+
/*
* write rk610 register cache
*/
rk610_codec_write_reg_cache (codec, reg, value);
i2c = (struct i2c_client *)codec->control_data;
i2c->addr = (i2c->addr & 0x60)|reg;
-
+
if (codec->hw_write(codec->control_data, data, 1) == 1){
// DBG("================%s %d Run OK================\n",__FUNCTION__,__LINE__);
return 0;
for (i=0; i<=0x1f; i++){
data = rk610_codec_read(codec, i);
- DBG("reg[0x%x]=0x%x\n",i,data);
+ printk("reg[0x%x]=0x%x\n",i,data);
}
}
-static const struct snd_kcontrol_new rk610_codec_snd_controls[] = {
-SOC_DOUBLE_R("Capture Volume", ACCELCODEC_R0C, ACCELCODEC_R0D, 0, 15, 0),
-SOC_DOUBLE_R("Capture Switch", ACCELCODEC_R0C, ACCELCODEC_R0D, 7, 1, 1),
-SOC_DOUBLE_R("PCM Volume", ACCELCODEC_R0D, ACCELCODEC_R0E, 0, 7, 0),
-//SOC_SINGLE("Left ADC Capture Volume", ACCELCODEC_R17, 0, 63, 0),
-//SOC_SINGLE("Right ADC Capture Volume", ACCELCODEC_R18, 0, 63, 0),
-};
-
-/* Left Mixer */
-static const struct snd_kcontrol_new rk610_codec_left_mixer_controls[] = {
-SOC_DAPM_SINGLE("Left Playback Switch", ACCELCODEC_R15, 6, 1, 0),
-SOC_DAPM_SINGLE("Left Bypass Switch", ACCELCODEC_R15, 2, 1, 0),
-};
-
-/* Right Mixer */
-static const struct snd_kcontrol_new rk610_codec_right_mixer_controls[] = {
-SOC_DAPM_SINGLE("Right Playback Switch", ACCELCODEC_R15, 7, 1, 0),
-SOC_DAPM_SINGLE("Right Bypass Switch", ACCELCODEC_R15, 3, 1, 0),
-};
-
-static const struct snd_soc_dapm_widget rk610_codec_dapm_widgets[] = {
- SND_SOC_DAPM_MIXER("Left Mixer", SND_SOC_NOPM, 0, 0,
- &rk610_codec_left_mixer_controls[0],
- ARRAY_SIZE(rk610_codec_left_mixer_controls)),
- SND_SOC_DAPM_MIXER("Right Mixer", SND_SOC_NOPM, 0, 0,
- &rk610_codec_right_mixer_controls[0],
- ARRAY_SIZE(rk610_codec_right_mixer_controls)),
-
- //SND_SOC_DAPM_PGA("Right Out 1", ACCELCODEC_R1E, 0, 0, NULL, 0),
- //SND_SOC_DAPM_PGA("Left Out 1", ACCELCODEC_R1E, 1, 0, NULL, 0),
- //SND_SOC_DAPM_DAC("Right DAC", "Right Playback", ACCELCODEC_R1F, 1, 0),
- //SND_SOC_DAPM_DAC("Left DAC", "Left Playback", ACCELCODEC_R1F, 2, 0),
-
- SND_SOC_DAPM_ADC("ADC", "Capture", ACCELCODEC_R1D, 6, 1),
- SND_SOC_DAPM_ADC("ADC BUFF", "Capture BUFF", ACCELCODEC_R1D, 2, 0),
-
-
- SND_SOC_DAPM_OUTPUT("LOUT1"),
- SND_SOC_DAPM_OUTPUT("ROUT1"),
-
- SND_SOC_DAPM_INPUT("LINPUT1"),
- SND_SOC_DAPM_INPUT("RINPUT1"),
-};
+static void spk_ctrl_fun(int status)
+{
+ struct rk610_codec_priv *rk610_codec =snd_soc_codec_get_drvdata(rk610_codec_codec);
-static const struct snd_soc_dapm_route audio_map[] = {
- /* left mixer */
- {"Left Mixer", "Left Playback Switch", "Left DAC"},
- {"Left Mixer", "Left Bypass Switch", "Left Line Mux"},
- {"Right Mixer", "Right Playback Switch", "Right DAC"},
- {"Right Mixer", "Right Bypass Switch", "Right Line Mux"},
-
- /* left out 1 */
- {"Left Out 1", NULL, "Left Mixer"},
- {"LOUT1", NULL, "Left Out 1"},
-
-
- /* right out 1 */
- {"Right Out 1", NULL, "Right Mixer"},
- {"ROUT1", NULL, "Right Out 1"},
-
- /* Left Line Mux */
- {"Left Line Mux", "Line 1", "LINPUT1"},
- {"Left Line Mux", "PGA", "Left PGA Mux"},
- {"Left Line Mux", "Differential", "Differential Mux"},
-
- /* Right Line Mux */
- {"Right Line Mux", "Line 1", "RINPUT1"},
- {"Right Line Mux", "PGA", "Right PGA Mux"},
- {"Right Line Mux", "Differential", "Differential Mux"},
-
- /* Left PGA Mux */
- {"Left PGA Mux", "Line 1", "LINPUT1"},
- {"Left PGA Mux", "Line 2", "LINPUT2"},
- {"Left PGA Mux", "Line 3", "LINPUT3"},
- {"Left PGA Mux", "Differential", "Differential Mux"},
-
- /* Right PGA Mux */
- {"Right PGA Mux", "Line 1", "RINPUT1"},
- {"Right PGA Mux", "Differential", "Differential Mux"},
-
- /* Differential Mux */
- {"Differential Mux", "Line 1", "LINPUT1"},
- {"Differential Mux", "Line 1", "RINPUT1"},
-
- /* Left ADC Mux */
- {"Left ADC Mux", "Stereo", "Left PGA Mux"},
- {"Left ADC Mux", "Mono (Left)", "Left PGA Mux"},
- {"Left ADC Mux", "Digital Mono", "Left PGA Mux"},
-
- /* Right ADC Mux */
- {"Right ADC Mux", "Stereo", "Right PGA Mux"},
- {"Right ADC Mux", "Mono (Right)", "Right PGA Mux"},
- {"Right ADC Mux", "Digital Mono", "Right PGA Mux"},
-
- /* ADC */
- {"Left ADC", NULL, "Left ADC Mux"},
- {"Right ADC", NULL, "Right ADC Mux"},
-
- /* terminator */
-// {NULL, NULL, NULL},
-};
+ if(rk610_codec->spk_ctrl_io)
+ {
+ DBG("--------%s----------status = %d\n",__FUNCTION__,status);
+ gpio_set_value(rk610_codec->spk_ctrl_io, status);
+ }
+}
struct _coeff_div {
u32 mclk;
{16934400, 8000, 2112, 0x17, 0x0,ASC_BCLKDIV_16},
{8192000, 8000, 1024, 0x0, 0x0,ASC_BCLKDIV_16},
{12000000, 8000, 1500, 0x6, 0x1,ASC_BCLKDIV_16},
-
+
/* 11.025k */
{11289600, 11025, 1024, 0x18, 0x0,ASC_BCLKDIV_16},
{16934400, 11025, 1536, 0x19, 0x0,ASC_BCLKDIV_16},
{12000000, 11025, 1088, 0x19, 0x1,ASC_BCLKDIV_16},
-
+
/* 12k */
{12288000, 12000, 1024, 0x8, 0x0,ASC_BCLKDIV_16},
{18432000, 12000, 1536, 0x9, 0x0,ASC_BCLKDIV_16},
{12000000, 12000, 1000, 0x8, 0x1,ASC_BCLKDIV_16},
-
+
/* 16k */
{12288000, 16000, 768, 0xa, 0x0,ASC_BCLKDIV_8},
{18432000, 16000, 1152, 0xb, 0x0,ASC_BCLKDIV_8},
{12000000, 16000, 750, 0xa, 0x1,ASC_BCLKDIV_8},
-
+
/* 22.05k */
{11289600, 22050, 512, 0x1a, 0x0,ASC_BCLKDIV_8},
{16934400, 22050, 768, 0x1b, 0x0,ASC_BCLKDIV_8},
{12000000, 22050, 544, 0x1b, 0x1,ASC_BCLKDIV_8},
-
+
/* 24k */
{12288000, 24000, 512, 0x1c, 0x0,ASC_BCLKDIV_8},
{18432000, 24000, 768, 0x1d, 0x0,ASC_BCLKDIV_8},
{12000000, 24000, 500, 0x1c, 0x1,ASC_BCLKDIV_8},
-
+
/* 32k */
{12288000, 32000, 384, 0xc, 0x0,ASC_BCLKDIV_8},
{18432000, 32000, 576, 0xd, 0x0,ASC_BCLKDIV_8},
{12000000, 32000, 375, 0xa, 0x1,ASC_BCLKDIV_8},
-
+
/* 44.1k */
{11289600, 44100, 256, 0x10, 0x0,ASC_BCLKDIV_4},
{16934400, 44100, 384, 0x11, 0x0,ASC_BCLKDIV_8},
{12000000, 44100, 272, 0x11, 0x1,ASC_BCLKDIV_8},
-
+
/* 48k */
{12288000, 48000, 256, 0x0, 0x0,ASC_BCLKDIV_4},
{18432000, 48000, 384, 0x1, 0x0,ASC_BCLKDIV_4},
{12000000, 48000, 250, 0x0, 0x1,ASC_BCLKDIV_4},
-
+
/* 88.2k */
{11289600, 88200, 128, 0x1e, 0x0,ASC_BCLKDIV_4},
{16934400, 88200, 192, 0x1f, 0x0,ASC_BCLKDIV_4},
{12000000, 88200, 136, 0x1f, 0x1,ASC_BCLKDIV_4},
-
+
/* 96k */
{12288000, 96000, 128, 0xe, 0x0,ASC_BCLKDIV_4},
{18432000, 96000, 192, 0xf, 0x0,ASC_BCLKDIV_4},
int clk_id, unsigned int freq, int dir)
{
struct snd_soc_codec *codec = codec_dai->codec;
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
+
struct rk610_codec_priv *rk610_codec =snd_soc_codec_get_drvdata(codec);
-#else
- struct rk610_codec_priv *rk610_codec = codec->private_data;
-#endif
+
DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
-
-// if(rk610_codec_pll_set(freq))
-// return -EINVAL;
-
+
+#ifdef RK610_CTL_PLL
+ if(rk610_codec_pll_set(freq))
+ return -EINVAL;
+#endif
switch (freq) {
case 11289600:
case 18432000:
struct snd_soc_codec *codec = codec_dai->codec;
u16 iface = 0;
+ spk_ctrl_fun(GPIO_LOW);
+ rk610_codec_write(codec,ACCELCODEC_R1D, 0x2a); //setup Vmid and Vref, other module power down
+ rk610_codec_write(codec,ACCELCODEC_R1E, 0x40); ///|ASC_PDASDML_ENABLE);
+
/* set master/slave audio interface */
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
case SND_SOC_DAIFMT_CBM_CFM:
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
struct snd_soc_codec *codec = rtd->codec;
struct rk610_codec_priv *rk610_codec =snd_soc_codec_get_drvdata(codec);
-#else
- struct snd_soc_device *socdev = rtd->socdev;
- struct snd_soc_codec *codec = socdev->card->codec;
- struct rk610_codec_priv *rk610_codec = codec->private_data;
-#endif
+
u16 iface = rk610_codec_read_reg_cache(codec, ACCELCODEC_R09) & 0x1f3;
u16 srate = rk610_codec_read_reg_cache(codec, ACCELCODEC_R00) & 0x180;
int coeff;
-
- /*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)
- {
- u16 r17 = rk610_codec_read_reg_cache(codec, ACCELCODEC_R17);
- u16 r18 = rk610_codec_read_reg_cache(codec, ACCELCODEC_R18);
-
- r17 &= (~0x3f); //6db
- r18 &= (~0x3f); //6db
-
- rk610_codec_write(codec, ACCELCODEC_R17, r17);
- rk610_codec_write(codec, ACCELCODEC_R18, r18);
-
- return 0;
- }
- else if (params->flags == HW_PARAMS_FLAG_EQVOL_OFF)
- {
- u16 r17 = rk610_codec_read_reg_cache(codec, ACCELCODEC_R17);
- u16 r18 = rk610_codec_read_reg_cache(codec, ACCELCODEC_R18);
-
- r17 &= (~0x3f);
- r17 |= 0x0f; //0db
-
- r18 &= (~0x3f);
- r18 |= 0x0f; //0db
-
- rk610_codec_write(codec, ACCELCODEC_R17, r17);
- rk610_codec_write(codec, ACCELCODEC_R18, r18);
- return 0;
- }
-
+
coeff = get_coeff(rk610_codec->sysclk, params_rate(params));
- DBG("Enter::%s----%d rk610_codec->sysclk=%d coeff = %d\n",__FUNCTION__,__LINE__,rk610_codec->sysclk, coeff);
+ DBG("Enter::%s----%d rk610_codec->sysclk=%d coeff = %d\n",__FUNCTION__,__LINE__,rk610_codec->sysclk, coeff);
/* bit size */
switch (params_format(params)) {
case SNDRV_PCM_FORMAT_S16_LE:
break;
}
DBG("Enter::%s----%d iface=%x srate =%x rate=%d\n",__FUNCTION__,__LINE__,iface,srate,params_rate(params));
-
-// rk610_codec_write(codec,ACCELCODEC_R0C, 0x17);
+
+// rk610_codec_write(codec,ACCELCODEC_R0C, 0x17);
rk610_codec_write(codec,ACCELCODEC_R04, ASC_INT_MUTE_L|ASC_INT_MUTE_R|ASC_SIDETONE_L_OFF|ASC_SIDETONE_R_OFF); //soft mute
//±ØÐëÏȽ«clkºÍEN_INT¶¼disableµô£¬·ñÔòÇл»bclk·ÖƵֵ¿ÉÄܵ¼ÖÂcodecÄÚ²¿Ê±Ðò»ìÂÒµô£¬
//±íÏÖ³öÀ´µÄÏÖÏóÊÇ£¬ÒÔºóµÄÒôÀÖ¶¼±ä³ÉÁËÔëÒô£¬¶øÇÒ¾ÍËã°ÑÊäÈëcodecµÄI2S_DATAOUT¶Ï¿ªÒ²Ò»Ñù³öÔëÒô
rk610_codec_write(codec,ACCELCODEC_R0B, ASC_DEC_DISABLE|ASC_INT_DISABLE); //0x00
-
+
/* set iface & srate */
#ifdef CONFIG_SND_RK29_CODEC_SOC_MASTER
iface |= ASC_INVERT_BCLK;//·×ªBCLK master״̬ËͳöµÄÉÙÁË°ë¸öʱÖÓ£¬µ¼ÖÂδµ½×î´óÒôÁ¿µÄʱºòÆÆÒô¡¢
return 0;
}
-void PhaseOut(struct snd_soc_codec *codec,u32 nStep, u32 us)
-{
- DBG("%s[%d]\n",__FUNCTION__,__LINE__);
- rk610_codec_write(codec,ACCELCODEC_R17, gVolReg|ASC_OUTPUT_ACTIVE|ASC_CROSSZERO_EN); //AOL
- rk610_codec_write(codec,ACCELCODEC_R18, gVolReg|ASC_OUTPUT_ACTIVE|ASC_CROSSZERO_EN); //AOR
- udelay(us);
-}
-
-void PhaseIn(struct snd_soc_codec *codec,u32 nStep, u32 us)
-{
- DBG("%s[%d]\n",__FUNCTION__,__LINE__);
- rk610_codec_write(codec,ACCELCODEC_R17, gVolReg|ASC_OUTPUT_ACTIVE|ASC_CROSSZERO_EN); //AOL gVolReg|ASC_OUTPUT_ACTIVE|ASC_CROSSZERO_EN); //AOL
- rk610_codec_write(codec,ACCELCODEC_R18, gVolReg|ASC_OUTPUT_ACTIVE|ASC_CROSSZERO_EN); //gVolReg|ASC_OUTPUT_ACTIVE|ASC_CROSSZERO_EN); //AOR
- udelay(us);
-}
-
static int rk610_codec_mute(struct snd_soc_dai *dai, int mute)
{
struct snd_soc_codec *codec = dai->codec;
-
+// struct rk610_codec_priv *rk610_codec =snd_soc_codec_get_drvdata(codec);
DBG("Enter::%s----%d--mute=%d\n",__FUNCTION__,__LINE__,mute);
if (mute)
{
- PhaseOut(codec,1, 5000);
+ rk610_codec_write(codec,ACCELCODEC_R17, gVolReg|ASC_OUTPUT_ACTIVE|ASC_CROSSZERO_EN); //AOL
+ rk610_codec_write(codec,ACCELCODEC_R18, gVolReg|ASC_OUTPUT_ACTIVE|ASC_CROSSZERO_EN); //AOR
rk610_codec_write(codec,ACCELCODEC_R19, 0xFF); //AOM
- rk610_codec_write(codec,ACCELCODEC_R04, ASC_INT_MUTE_L|ASC_INT_MUTE_R|ASC_SIDETONE_L_OFF|ASC_SIDETONE_R_OFF); //soft mute
+ rk610_codec_write(codec,ACCELCODEC_R04, ASC_INT_MUTE_L|ASC_INT_MUTE_R|ASC_SIDETONE_L_OFF|ASC_SIDETONE_R_OFF); //soft mute
//add for standby
- if(!dai->capture_active)
- {
- rk610_codec_write(codec, ACCELCODEC_R1D, 0xFE);
- rk610_codec_write(codec, ACCELCODEC_R1E, 0xFF);
- rk610_codec_write(codec, ACCELCODEC_R1F, 0xFF);
- }
+ // if(!dai->capture_active)
+ // {
+ // rk610_codec_write(codec, ACCELCODEC_R1D, 0xFE);
+ // rk610_codec_write(codec, ACCELCODEC_R1E, 0xFF);
+ // rk610_codec_write(codec, ACCELCODEC_R1F, 0xFF);
+ // }
}
else
- {
- rk610_codec_write(codec,ACCELCODEC_R1D, 0x2a); //setup Vmid and Vref, other module power down
- rk610_codec_write(codec,ACCELCODEC_R1E, 0x40); ///|ASC_PDASDML_ENABLE);
-
- #if OUT_CAPLESS
+ {
+ // rk610_codec_write(codec,ACCELCODEC_R1D, 0x2a); //setup Vmid and Vref, other module power down
+ // rk610_codec_write(codec,ACCELCODEC_R1E, 0x40); ///|ASC_PDASDML_ENABLE);
+ rk610_codec_write(codec,ACCELCODEC_R17, gVolReg|ASC_OUTPUT_ACTIVE|ASC_CROSSZERO_EN); //AOL gVolReg|ASC_OUTPUT_ACTIVE|ASC_CROSSZERO_EN); //AOL
+ rk610_codec_write(codec,ACCELCODEC_R18, gVolReg|ASC_OUTPUT_ACTIVE|ASC_CROSSZERO_EN); //gVolReg|ASC_OUTPUT_ACTIVE|ASC_CROSSZERO_EN); //AOR
+ rk610_codec_write(codec,ACCELCODEC_R04, ASC_INT_ACTIVE_L|ASC_INT_ACTIVE_R|ASC_SIDETONE_L_OFF|ASC_SIDETONE_R_OFF);
+ rk610_codec_write(codec,ACCELCODEC_R19, 0x7F); //AOM
+ msleep(300);
+ #if OUT_CAPLESS
rk610_codec_write(codec,ACCELCODEC_R1F, 0x09|ASC_PDMIXM_ENABLE);
#else
rk610_codec_write(codec,ACCELCODEC_R1F, 0x09|ASC_PDMIXM_ENABLE|ASC_PDPAM_ENABLE);
#endif
-
- PhaseIn(codec,1, 5000);
- //if(gCodecVol != 0)
- //{
- rk610_codec_write(codec,ACCELCODEC_R04, ASC_INT_ACTIVE_L|ASC_INT_ACTIVE_R|ASC_SIDETONE_L_OFF|ASC_SIDETONE_R_OFF);
- //}
- rk610_codec_write(codec,ACCELCODEC_R19, 0x7F); //AOM
-#if 0
- /*disable speaker */
- gpio_set_value(RK29_PIN6_PB6, GPIO_LOW);
-#endif
- rk610_codec_reg_read();
+ // schedule_delayed_work(&rk610_codec->rk610_delayed_work, 0);
+ // rk610_codec_reg_read();
+ spk_ctrl_fun(GPIO_HIGH);
}
-
+
return 0;
}
case SND_SOC_BIAS_STANDBY:
printk("rk610 standby\n");
+ spk_ctrl_fun(GPIO_LOW);
rk610_codec_write(codec, ACCELCODEC_R1D, 0xFE);
rk610_codec_write(codec, ACCELCODEC_R1E, 0xFF);
- rk610_codec_write(codec, ACCELCODEC_R1F, 0xFF);
+ rk610_codec_write(codec, ACCELCODEC_R1F, 0xFF);
break;
case SND_SOC_BIAS_OFF:
- printk("rk610 power off\n");
+ printk("rk610 power off\n");
+ spk_ctrl_fun(GPIO_LOW);
rk610_codec_write(codec, ACCELCODEC_R1D, 0xFF);
rk610_codec_write(codec, ACCELCODEC_R1E, 0xFF);
rk610_codec_write(codec, ACCELCODEC_R1F, 0xFF);
break;
}
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
+
codec->dapm.bias_level = level;
-#else
- codec->bias_level = level;
-#endif
+
return 0;
}
-#define RK610_CODEC_RATES SNDRV_PCM_RATE_8000_96000
+static void rk610_delayedwork_fun(struct work_struct *work)
+{
+ struct snd_soc_codec *codec = rk610_codec_codec;
+ DBG("--------%s----------\n",__FUNCTION__);
-#define RK610_CODEC_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
- SNDRV_PCM_FMTBIT_S24_LE)
+ #if OUT_CAPLESS
+ rk610_codec_write(codec,ACCELCODEC_R1F, 0x09|ASC_PDMIXM_ENABLE);
+ #else
+ rk610_codec_write(codec,ACCELCODEC_R1F, 0x09|ASC_PDMIXM_ENABLE|ASC_PDPAM_ENABLE);
+ #endif
+ spk_ctrl_fun(GPIO_HIGH);
+}
static struct snd_soc_dai_ops rk610_codec_ops = {
.hw_params = rk610_codec_pcm_hw_params,
.digital_mute = rk610_codec_mute,
};
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
-static struct snd_soc_dai_driver rk610_codec_dai =
-#else
-struct snd_soc_dai rk610_codec_dai =
-#endif
-{
- .name = "rk610_codec_xx",
+#define RK610_CODEC_RATES SNDRV_PCM_RATE_8000_96000
+#define RK610_CODEC_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
+ SNDRV_PCM_FMTBIT_S24_LE)
+
+static struct snd_soc_dai_driver rk610_codec_dai = {
+ .name = "rk610_codec",
.playback = {
.stream_name = "Playback",
.channels_min = 1,
.ops = &rk610_codec_ops,
.symmetric_rates = 1,
};
-EXPORT_SYMBOL_GPL(rk610_codec_dai);
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
static int rk610_codec_suspend(struct snd_soc_codec *codec, pm_message_t state)
-#else
-static int rk610_codec_suspend(struct platform_device *pdev, pm_message_t state)
-#endif
{
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 37))
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-#endif
DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
rk610_codec_set_bias_level(codec, SND_SOC_BIAS_OFF);
- rk610_codec_reg_read();
-
+// rk610_codec_reg_read();
return 0;
}
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
static int rk610_codec_resume(struct snd_soc_codec *codec)
-#else
-static int rk610_codec_resume(struct platform_device *pdev)
-#endif
{
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 37))
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec = socdev->card->codec;
-#endif
int i;
u8 data[2];
struct i2c_client *i2c;
u16 *cache = codec->reg_cache;
-
+
DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
/* Sync reg_cache with the hardware */
+/*
for (i = 0; i < RK610_CODEC_NUM_REG; i++) {
data[0] = cache[i] & 0x00ff;
i2c = (struct i2c_client *)codec->control_data;
i2c->addr = (i2c->addr & 0x60)|i;
codec->hw_write(codec->control_data, data, 1);
}
-
+*/
rk610_codec_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
return 0;
}
-#if 1
#define USE_MIC_IN
-#define USE_LPF 1
+#define USE_LPF
void rk610_codec_reg_set(void)
{
struct snd_soc_codec *codec = rk610_codec_codec;
unsigned int digital_gain;
-
- rk610_codec_write(codec,ACCELCODEC_R1D, 0xFF);
- rk610_codec_write(codec,ACCELCODEC_R1E, 0xFF);
- rk610_codec_write(codec,ACCELCODEC_R1F, 0xFF);
-#if USE_LPF
+ rk610_codec_write(codec,ACCELCODEC_R1D, 0x30);
+ rk610_codec_write(codec,ACCELCODEC_R1E, 0x40);
+
+#ifdef USE_LPF
// Route R-LPF->R-Mixer, L-LPF->L-Mixer
rk610_codec_write(codec,ACCELCODEC_R15, 0xC1);
#else
//2soft mute
rk610_codec_write(codec,ACCELCODEC_R04, ASC_INT_MUTE_L|ASC_INT_MUTE_R|ASC_SIDETONE_L_OFF|ASC_SIDETONE_R_OFF); //soft mute
-
+
//2set default SR and clk
rk610_codec_write(codec,ACCELCODEC_R0A, ASC_NORMAL_MODE|(0x10 << 1)|ASC_CLKNODIV|ASC_CLK_DISABLE);
gR0AReg = ASC_NORMAL_MODE|(0x10 << 1)|ASC_CLKNODIV|ASC_CLK_DISABLE;
rk610_codec_write(codec,ACCELCODEC_R06, digital_gain & 0xFF);
rk610_codec_write(codec,ACCELCODEC_R07, (digital_gain >> 8) & 0xFF);
rk610_codec_write(codec,ACCELCODEC_R08, digital_gain & 0xFF);
-// rk610_codec_write(codec,ACCELCODEC_R05, 0x0e);
-// rk610_codec_write(codec,ACCELCODEC_R06, 0x42);
-// rk610_codec_write(codec,ACCELCODEC_R07, 0x0e);
-// rk610_codec_write(codec,ACCELCODEC_R08, 0x42);
-
+
rk610_codec_write(codec,ACCELCODEC_R0B, ASC_DEC_ENABLE|ASC_INT_ENABLE);
gR0BReg = ASC_DEC_ENABLE|ASC_INT_ENABLE; //ASC_DEC_DISABLE|ASC_INT_ENABLE;
-
- rk610_codec_write(codec,ACCELCODEC_R1D, 0x30);
- rk610_codec_write(codec,ACCELCODEC_R1E, 0x40);
- #if OUT_CAPLESS
- rk610_codec_write(codec,ACCELCODEC_R1F, 0x09|ASC_PDMIXM_ENABLE);
- #else
- rk610_codec_write(codec,ACCELCODEC_R1F, 0x09|ASC_PDMIXM_ENABLE|ASC_PDPAM_ENABLE);
- #endif
-}
-#else
-void rk610_codec_reg_set(void)
-{
- struct snd_soc_codec *codec = rk610_codec_codec;
- int reg;
- int i;
- unsigned int data;
- rk610_codec_write(codec,ACCELCODEC_R1D, 0x00);
- rk610_codec_write(codec,ACCELCODEC_R17, 0xFF); //AOL
- rk610_codec_write(codec,ACCELCODEC_R18, 0xFF); //AOR
- rk610_codec_write(codec,ACCELCODEC_R19, 0xFF); //AOM
-
- rk610_codec_write(codec,ACCELCODEC_R1F, 0xDF);
- mdelay(10);
- rk610_codec_write(codec,ACCELCODEC_R1F, 0x5F);
- rk610_codec_write(codec,ACCELCODEC_R19, 0x7F); //AOM
- rk610_codec_write(codec,ACCELCODEC_R15, 0xC1);//rk610_codec_write(codec,ACCELCODEC_R15, 0xCD);//by Vincent Hsiung
- rk610_codec_write(codec,ACCELCODEC_R1A, 0x1C);
- mdelay(100);
- rk610_codec_write(codec,ACCELCODEC_R1F, 0x09);
- rk610_codec_write(codec,ACCELCODEC_R1E, 0x00);
- mdelay(10);
- rk610_codec_write(codec,ACCELCODEC_R1A, 0x14);
- rk610_codec_write(codec,ACCELCODEC_R1D, 0xFE);
- rk610_codec_write(codec,ACCELCODEC_R17, 0xBF); //AOL
- rk610_codec_write(codec,ACCELCODEC_R18, 0xBF); //AOR
- rk610_codec_write(codec,ACCELCODEC_R19, 0x7F); //AOM
- rk610_codec_write(codec,ACCELCODEC_R1F, 0xDF);
- //2soft mute
- rk610_codec_write(codec,ACCELCODEC_R04, ASC_INT_MUTE_L|ASC_INT_MUTE_R|ASC_SIDETONE_L_OFF|ASC_SIDETONE_R_OFF); //soft mute
-
- //2set default SR and clk
- rk610_codec_write(codec,ACCELCODEC_R0A, ASC_USB_MODE|FREQ48kHz|ASC_CLKNODIV|ASC_CLK_DISABLE);
- gR0AReg = ASC_USB_MODE|FREQ48kHz|ASC_CLKNODIV|ASC_CLK_DISABLE;
- //2Config audio interface
- rk610_codec_write(codec,ACCELCODEC_R09, ASC_I2S_MODE|ASC_16BIT_MODE|ASC_NORMAL_LRCLK|ASC_LRSWAP_DISABLE|ASC_MASTER_MODE|ASC_NORMAL_BCLK);
- rk610_codec_write(codec,ACCELCODEC_R00, ASC_HPF_ENABLE|ASC_DSM_MODE_DISABLE|ASC_SCRAMBLE_ENABLE|ASC_DITHER_ENABLE|ASC_BCLKDIV_8); //BCLK div 8
- //2volume,input,outpu
- rk610_codec_write(codec,ACCELCODEC_R05, 0x0e);
- rk610_codec_write(codec,ACCELCODEC_R06, 0x42);
- rk610_codec_write(codec,ACCELCODEC_R07, 0x0e);
- rk610_codec_write(codec,ACCELCODEC_R08, 0x42);
-
- rk610_codec_write(codec,ACCELCODEC_R0C, 0x10|ASC_INPUT_VOL_0DB|ASC_INPUT_MUTE); //LIL
- rk610_codec_write(codec,ACCELCODEC_R0D, 0x10|ASC_INPUT_VOL_0DB); //LIR
- rk610_codec_write(codec,ACCELCODEC_R0E, 0x10|ASC_INPUT_VOL_0DB); //MIC
- rk610_codec_write(codec,ACCELCODEC_R12, 0x4c|ASC_MIC_INPUT|ASC_MIC_BOOST_20DB); //mic input and boost 20dB
- rk610_codec_write(codec,ACCELCODEC_R13, ASC_LPGAMX_DISABLE|ASC_ALMX_DISABLE|((LINE_2_MIXER_GAIN & 0x7) << 4)|0x0);
- rk610_codec_write(codec,ACCELCODEC_R14, ASC_RPGAMX_DISABLE|ASC_ARMX_DISABLE|((LINE_2_MIXER_GAIN & 0x7) << 4)|0x0);
- gR1314Reg = ASC_RPGAMX_DISABLE|ASC_ARMX_DISABLE|((LINE_2_MIXER_GAIN & 0x7) << 4)|0x0;
-
- //2other
- rk610_codec_write(codec,ACCELCODEC_R0B, ASC_DEC_DISABLE|ASC_INT_DISABLE); //0x00
- gR0BReg = ASC_DEC_DISABLE|ASC_INT_DISABLE;
- rk610_codec_write(codec,ACCELCODEC_R15, \
- 0x01|ASC_RLPFMX_DISABLE|ASC_LLPFMX_DISABLE|ASC_LDAMX_DISABLE|ASC_RDAMX_DISABLE|ASC_LSCF_ACTIVE|ASC_RSCF_ACTIVE); //0x3c
- rk610_codec_write(codec,ACCELCODEC_R1B, 0x32);
- rk610_codec_write(codec,ACCELCODEC_R1C, ASC_DEM_ENABLE); ///0x00); //use default value
-
- ///dac mode
- rk610_codec_write(codec,ACCELCODEC_R17, 0xBF); //AOL ÒôÁ¿×îµÍ
- rk610_codec_write(codec,ACCELCODEC_R18, 0xBF); //AOR
-
- //2power down useless module
- rk610_codec_write(codec,ACCELCODEC_R1D, 0x2a|ASC_PDSDL_ENABLE|ASC_PDBSTL_ENABLE|ASC_PDPGAL_ENABLE); //setup Vmid and Vref, other module power down
- rk610_codec_write(codec,ACCELCODEC_R1E, 0x40|ASC_PDASDML_ENABLE);
- #if OUT_CAPLESS
- rk610_codec_write(codec,ACCELCODEC_R1F, 0x09|ASC_PDMICB_ENABLE|ASC_PDMIXM_ENABLE);
- #else
- rk610_codec_write(codec,ACCELCODEC_R1F, 0x09|ASC_PDMICB_ENABLE|ASC_PDMIXM_ENABLE|ASC_PDPAM_ENABLE);
- #endif
-
- //2other
- rk610_codec_write(codec,ACCELCODEC_R0B, ASC_DEC_DISABLE|ASC_INT_DISABLE);
- gR0BReg = ASC_DEC_ENABLE|ASC_INT_ENABLE; //ASC_DEC_DISABLE|ASC_INT_ENABLE;
- rk610_codec_write(codec,ACCELCODEC_R15, 0xC1);//rk610_codec_write(codec,ACCELCODEC_R15, 0xCD);//by Vincent Hsiung
- rk610_codec_write(codec,ACCELCODEC_R0C, 0x10|ASC_INPUT_VOL_0DB); //LIL
- rk610_codec_write(codec,ACCELCODEC_R0D, 0x10|ASC_INPUT_VOL_0DB); //LIR
- rk610_codec_write(codec,ACCELCODEC_R0E, 0x10|ASC_INPUT_VOL_0DB); //MIC
-// rk610_codec_write(codec,ACCELCODEC_R12, 0x4c|ASC_MIC_INPUT|ASC_MIC_BOOST_20DB); //mic input and boost 20dB
- rk610_codec_write(codec,ACCELCODEC_R12, 0x4c); //line input and boost 20dB
- rk610_codec_write(codec,ACCELCODEC_R13, 0x00);
- rk610_codec_write(codec,ACCELCODEC_R14, 0x00);
- gR1314Reg = 0x00;
- rk610_codec_write(codec,ACCELCODEC_R1C, ASC_DEM_ENABLE); //0x00); //use default value
+// #if OUT_CAPLESS
+// rk610_codec_write(codec,ACCELCODEC_R1F, 0x09|ASC_PDMIXM_ENABLE);
+// #else
+// rk610_codec_write(codec,ACCELCODEC_R1F, 0x09|ASC_PDMIXM_ENABLE|ASC_PDPAM_ENABLE);
+// #endif
}
-#endif
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
static int rk610_codec_probe(struct snd_soc_codec *codec)
{
struct rk610_codec_priv *rk610_codec = snd_soc_codec_get_drvdata(codec);
- struct snd_soc_dapm_context *dapm = &codec->dapm;
int ret;
-
+
rk610_codec_codec = codec;
- printk(KERN_ERR "[%s] start\n", __FUNCTION__);
+ DBG("[%s] start\n", __FUNCTION__);
ret = snd_soc_codec_set_cache_io(codec, 8, 16, rk610_codec->control_type);
if (ret != 0) {
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
codec->write = rk610_codec_write;
codec->read = rk610_codec_read;
codec->hw_write = (hw_write_t)i2c_master_send;
-#else
-static int rk610_codec_probe(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct snd_soc_codec *codec;
- int ret = 0;
-#endif
+
if (rk610_codec_codec == NULL) {
- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
dev_err(codec->dev, "Codec device not registered\n");
- #else
- dev_err(&pdev->dev, "Codec device not registered\n");
- #endif
return -ENODEV;
}
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 37))
- socdev->card->codec = rk610_codec_codec;
- codec = rk610_codec_codec;
- /* register pcms */
- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
- if (ret < 0) {
- dev_err(codec->dev, "failed to create pcms: %d\n", ret);
- goto pcm_err;
- }
-#endif
-
- snd_soc_add_controls(codec, rk610_codec_snd_controls,
- ARRAY_SIZE(rk610_codec_snd_controls));
-
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 37))
- snd_soc_dapm_new_controls(codec, rk610_codec_dapm_widgets,
- ARRAY_SIZE(rk610_codec_dapm_widgets));
- snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
- snd_soc_dapm_new_widgets(codec);
-
- ret = snd_soc_init_card(socdev);
- if (ret < 0) {
- dev_err(codec->dev, "failed to register card: %d\n", ret);
- goto card_err;
- }
-#else
- snd_soc_dapm_new_controls(dapm, rk610_codec_dapm_widgets,
- ARRAY_SIZE(rk610_codec_dapm_widgets));
- snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map));
+ INIT_DELAYED_WORK(&rk610_codec->rk610_delayed_work, rk610_delayedwork_fun);
-#endif
-
-#if defined(RK610_SPK_CTRL_PIN)
- ret = gpio_request(RK610_SPK_CTRL_PIN, "rk610 spk_ctrl");
- if (ret){
- printk("rk610_control request gpio fail\n");
- //goto err1;
+#ifdef RK610_SPK_CTRL_PIN
+ rk610_codec->spk_ctrl_io = RK610_SPK_CTRL_PIN;
+ ret = gpio_request(rk610_codec->spk_ctrl_io, "rk610 spk_ctrl");
+ if (ret){
+ printk("rk610_control request gpio fail!\n");
+ return ret;
}
- gpio_set_value(RK610_SPK_CTRL_PIN, GPIO_HIGH);
- gpio_direction_output(RK610_SPK_CTRL_PIN, GPIO_HIGH);
+ gpio_direction_output(rk610_codec->spk_ctrl_io, GPIO_LOW);
+ gpio_set_value(rk610_codec->spk_ctrl_io, GPIO_LOW);
+#else
+ rk610_codec->spk_ctrl_io = 0;
#endif
rk610_control_init_codec();
-
rk610_codec_reg_set();
- rk610_codec_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-
- return ret;
-
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 37))
-card_err:
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
-pcm_err:
+// rk610_codec_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
+ schedule_delayed_work(&rk610_codec->rk610_delayed_work, msecs_to_jiffies(1000));
+
+ codec->dapm.bias_level = SND_SOC_BIAS_PREPARE;
return ret;
-#endif
}
/* power down chip */
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
static int rk610_codec_remove(struct snd_soc_codec *codec)
{
rk610_codec_set_bias_level(codec, SND_SOC_BIAS_OFF);
return 0;
}
-#else
-static int rk610_codec_remove(struct platform_device *pdev)
-{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- printk("rk610_codec_remove\n");
- snd_soc_free_pcms(socdev);
- snd_soc_dapm_free(socdev);
- return 0;
-}
-#endif
static struct snd_soc_codec_driver soc_codec_dev_rk610_codec = {
.probe = rk610_codec_probe,
.reg_cache_size = ARRAY_SIZE(rk610_codec_reg),
.reg_word_size = sizeof(u16),
.reg_cache_default = rk610_codec_reg,
- .dapm_widgets = rk610_codec_dapm_widgets,
- .num_dapm_widgets = ARRAY_SIZE(rk610_codec_dapm_widgets),
- .dapm_routes = audio_map,
- .num_dapm_routes = ARRAY_SIZE(audio_map),
+// .dapm_widgets = rk610_codec_dapm_widgets,
+// .num_dapm_widgets = ARRAY_SIZE(rk610_codec_dapm_widgets),
+// .dapm_routes = audio_map,
+// .num_dapm_routes = ARRAY_SIZE(audio_map),
};
-EXPORT_SYMBOL_GPL(soc_codec_dev_rk610_codec);
-
-
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
static int rk610_codec_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct rk610_codec_priv *rk610_codec;
int ret;
- printk("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ %s start $$$$$$$$$$$$$$$$$$$$$$$$$$$\n", __FUNCTION__);
+ DBG("%s start\n", __FUNCTION__);
rk610_codec = kzalloc(sizeof(struct rk610_codec_priv), GFP_KERNEL);
if (rk610_codec == NULL)
return -ENOMEM;
-
+
i2c_set_clientdata(i2c, rk610_codec);
rk610_codec->control_type = SND_SOC_I2C;
-
+
ret = snd_soc_register_codec(&i2c->dev,
&soc_codec_dev_rk610_codec, &rk610_codec_dai, 1);
if (ret < 0) {
- printk("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ %s: snd_soc_register_codec error!!!!\n", __FUNCTION__);
dev_err(&i2c->dev, "Failed to register codec: %d\n", ret);
kfree(rk610_codec);
}
return ret;
}
-
static int rk610_codec_i2c_remove(struct i2c_client *client)
{
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
snd_soc_unregister_codec(&client->dev);
kfree(i2c_get_clientdata(client));
-#else
- struct rk610_codec_priv *rk610_codec = i2c_get_clientdata(client);
- rk610_codec_unregister(rk610_codec);
-#endif
- return 0;
-}
-
-#ifdef CONFIG_PM
-static int rk610_codec_i2c_suspend(struct i2c_client *client, pm_message_t msg)
-{
- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
- return 0;
- #else
- return snd_soc_suspend_device(&client->dev);
- #endif
-}
-
-static int rk610_codec_i2c_resume(struct i2c_client *client)
-{
- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
return 0;
- #else
- return snd_soc_resume_device(&client->dev);
- #endif
}
-#else
-#define rk610_codec_i2c_suspend NULL
-#define rk610_codec_i2c_resume NULL
-#endif
static const struct i2c_device_id rk610_codec_i2c_id[] = {
{ "rk610_i2c_codec", 0 },
},
.probe = rk610_codec_i2c_probe,
.remove = rk610_codec_i2c_remove,
- //.suspend = rk610_codec_i2c_suspend,
- //.resume = rk610_codec_i2c_resume,
.id_table = rk610_codec_i2c_id,
};
#endif
static int __init rk610_codec_modinit(void)
{
int ret;
-// DBG("[%s] start\n", __FUNCTION__);
+ DBG("[%s] start\n", __FUNCTION__);
ret = i2c_add_driver(&rk610_codec_i2c_driver);
if (ret != 0)
pr_err("rk610 codec: Unable to register I2C driver: %d\n", ret);
MODULE_DESCRIPTION("ASoC RK610 CODEC driver");
MODULE_AUTHOR("rk@rock-chips.com");
MODULE_LICENSE("GPL");
+
#include <sound/soc-dapm.h>
#include <asm/io.h>
#include <mach/hardware.h>
-#include <mach/rk29_iomap.h>
#include "../codecs/rk610_codec.h"
#include "rk29_pcm.h"
#include "rk29_i2s.h"
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
struct snd_soc_dai *codec_dai = rtd->codec_dai;
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
-#else
- struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
- struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
-#endif
int ret;
unsigned int pll_out = 0;
int div_bclk,div_mclk;
#define HW_PARAMS_FLAG_EQVOL_OFF 0x22
if ((params->flags == HW_PARAMS_FLAG_EQVOL_ON)||(params->flags == HW_PARAMS_FLAG_EQVOL_OFF))
{
- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
ret = codec_dai->driver->ops->hw_params(substream, params, codec_dai); //by Vincent
- #else
- ret = codec_dai->ops->hw_params(substream, params, codec_dai); //by Vincent
- #endif
- DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
}
else
{
/* set codec DAI configuration */
DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
#if defined (CONFIG_SND_RK29_CODEC_SOC_SLAVE)
- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
- ret = codec_dai->driver->ops->set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
- SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS);
- #else
- ret = codec_dai->ops->set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
+ ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS);
- #endif
- #endif
- #if defined (CONFIG_SND_RK29_CODEC_SOC_MASTER)
- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
- ret = codec_dai->driver->ops->set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
- SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM );
- #else
- ret = codec_dai->ops->set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
+ #elif 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
- #endif
if (ret < 0)
- return ret;
+ return ret;
/* set cpu DAI configuration */
DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
#if defined (CONFIG_SND_RK29_CODEC_SOC_SLAVE)
- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
- ret = cpu_dai->driver->ops->set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
+ ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM);
- #else
- ret = cpu_dai->ops->set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
- SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM);
- #endif
- #endif
- #if defined (CONFIG_SND_RK29_CODEC_SOC_MASTER)
- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
- ret = cpu_dai->driver->ops->set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
+ #elif 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);
- #else
- ret = cpu_dai->ops->set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
- SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS);
- #endif
#endif
if (ret < 0)
- return ret;
+ return ret;
}
switch(params_rate(params)) {
div_bclk = 63;
div_mclk = pll_out/(params_rate(params)*64) - 1;
- DBG("func is%s,pll_out=%ld,div_mclk=%ld div_bclk=%ld\n",
+ DBG("func is%s,pll_out=%d,div_mclk=%d div_bclk\n",
__FUNCTION__,pll_out,div_mclk, div_bclk);
snd_soc_dai_set_sysclk(cpu_dai, 0, pll_out, 0);
snd_soc_dai_set_clkdiv(cpu_dai, ROCKCHIP_DIV_BCLK,div_bclk);
return 0;
}
-static const struct snd_soc_dapm_widget rk29_dapm_widgets[] = {
- SND_SOC_DAPM_LINE("Audio Out", NULL),
- SND_SOC_DAPM_LINE("Line in", NULL),
- SND_SOC_DAPM_MIC("Micn", NULL),
- SND_SOC_DAPM_MIC("Micp", NULL),
-};
-
-static const struct snd_soc_dapm_route audio_map[]= {
-
- {"Audio Out", NULL, "LOUT1"},
- {"Audio Out", NULL, "ROUT1"},
- {"Line in", NULL, "RINPUT1"},
- {"Line in", NULL, "LINPUT1"},
-// {"Micn", NULL, "RINPUT2"},
-// {"Micp", NULL, "LINPUT2"},
-};
-
-/*
- * Logic for a RK610 codec as connected on a rockchip board.
- */
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
-static int rk29_RK610_codec_init(struct snd_soc_pcm_runtime *rtd) {
- struct snd_soc_codec *codec = rtd->codec;
- struct snd_soc_dapm_context *dapm = &codec->dapm;
-
- DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
- /* Add specific widgets */
- snd_soc_dapm_new_controls(dapm, rk29_dapm_widgets,
- ARRAY_SIZE(rk29_dapm_widgets));
-
- /* Set up specific audio path audio_mapnects */
- snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map));
- snd_soc_dapm_sync(dapm);
- DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
-
- return 0;
-}
-#else
-static int rk29_RK610_codec_init(struct snd_soc_codec *codec) {
-// struct snd_soc_dai *codec_dai = &codec->dai[0];
- int ret;
-
- DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
-
-// ret = snd_soc_dai_set_sysclk(codec_dai, 0,
-// 11289600, SND_SOC_CLOCK_IN);
-// if (ret < 0) {
-// printk(KERN_ERR "Failed to set WM8988 SYSCLK: %d\n", ret);
-// return ret;
-// }
-
- /* Add specific widgets */
- snd_soc_dapm_new_controls(codec, rk29_dapm_widgets,
- ARRAY_SIZE(rk29_dapm_widgets));
-
- /* Set up specific audio path audio_mapnects */
- snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
-
- snd_soc_dapm_sync(codec);
-
- return 0;
-}
-#endif
static struct snd_soc_ops rk29_ops = {
.hw_params = rk29_hw_params,
};
static struct snd_soc_dai_link rk29_dai = {
- .name = "RK610",
+ .name = "RK610_CODEC",
.stream_name = "RK610 CODEC PCM",
- .codec_name = "RK610_CODEC.1-0060",
+ .codec_name = "RK610_CODEC.0-0060",
.platform_name = "rockchip-audio",
#if defined(CONFIG_SND_RK29_SOC_I2S_8CH)
.cpu_dai_name = "rk29_i2s.0",
#elif defined(CONFIG_SND_RK29_SOC_I2S_2CH)
.cpu_dai_name = "rk29_i2s.1",
+#else
+ .cpu_dai_name = "rk29_i2s.2",
#endif
- .codec_dai_name = "rk610_codec_xx",
- .init = rk29_RK610_codec_init,
+ .codec_dai_name = "rk610_codec",
.ops = &rk29_ops,
};
static struct snd_soc_card snd_soc_card_rk29 = {
.num_links = 1,
};
+
static struct platform_device *rk29_snd_device;
static int __init audio_card_init(void)
{
int ret =0;
DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
- printk(KERN_ERR "[%s] start\n", __FUNCTION__);
rk29_snd_device = platform_device_alloc("soc-audio", -1);
if (!rk29_snd_device) {
printk("[%s] platform device allocation failed\n", __FUNCTION__);
ret = -ENOMEM;
return ret;
}
- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
platform_set_drvdata(rk29_snd_device, &snd_soc_card_rk29);
- #else
- platform_set_drvdata(rk29_snd_device, &rk29_snd_devdata);
- rk29_snd_devdata.dev = &rk29_snd_device->dev;
- #endif
+
ret = platform_device_add(rk29_snd_device);
- DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
if (ret) {
DBG("platform device add failed\n");
platform_device_put(rk29_snd_device);