static int cq93vc_probe(struct snd_soc_codec *codec) { struct davinci_vc *davinci_vc = codec->dev->platform_data; davinci_vc->cq93vc.codec = codec; codec->control_data = davinci_vc; /* Set controls */ snd_soc_add_codec_controls(codec, cq93vc_snd_controls, ARRAY_SIZE(cq93vc_snd_controls)); /* Off, with power on */ cq93vc_set_bias_level(codec, SND_SOC_BIAS_STANDBY); /* Turn on Automatic Level Control (VC_REG06) */ cq93vc_write(codec, DAVINCI_VC_REG06, 1); /* Turn on microphone Gain (VC_REG05) */ cq93vc_write(codec, DAVINCI_VC_REG05, 0x1f); /* Recording Mode Control (VC_REG04) */ cq93vc_write(codec, DAVINCI_VC_REG04, 0x0); return 0; }
static int cq93vc_mute(struct snd_soc_dai *dai, int mute) { struct snd_soc_codec *codec = dai->codec; u8 reg = cq93vc_read(codec, DAVINCI_VC_REG09) & ~DAVINCI_VC_REG09_MUTE; if (mute) cq93vc_write(codec, DAVINCI_VC_REG09, reg | DAVINCI_VC_REG09_MUTE); else cq93vc_write(codec, DAVINCI_VC_REG09, reg); return 0; }
static int cq93vc_set_bias_level(struct snd_soc_codec *codec, enum snd_soc_bias_level level) { switch (level) { case SND_SOC_BIAS_ON: cq93vc_write(codec, DAVINCI_VC_REG12, DAVINCI_VC_REG12_POWER_ALL_ON); break; case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: cq93vc_write(codec, DAVINCI_VC_REG12, DAVINCI_VC_REG12_POWER_ALL_OFF); break; case SND_SOC_BIAS_OFF: /* force all power off */ cq93vc_write(codec, DAVINCI_VC_REG12, DAVINCI_VC_REG12_POWER_ALL_OFF); break; } codec->bias_level = level; return 0; }