static int pm805_set_bias_level(struct snd_soc_codec *codec, enum snd_soc_bias_level level) { #if 0 switch (level) { case SND_SOC_BIAS_ON: break; case SND_SOC_BIAS_PREPARE: break; case SND_SOC_BIAS_STANDBY: if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) /* Enable Audio PLL & Audio section */ snd_soc_update_bits_locked(codec, PM805_CODEC_MAIN_POWERUP, PM805_STBY_B, PM805_STBY_B); break; case SND_SOC_BIAS_OFF: if (codec->dapm.bias_level != SND_SOC_BIAS_OFF) snd_soc_update_bits_locked(codec, PM805_CODEC_MAIN_POWERUP, PM805_STBY_B, 0); break; } #endif codec->dapm.bias_level = level; return 0; }
static int pm805_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct snd_soc_codec *codec = dai->codec; unsigned char inf, addr; /* bit size */ switch (params_format(params)) { case SNDRV_PCM_FORMAT_S8: inf = PM805_WLEN_8_BIT; break; case SNDRV_PCM_FORMAT_S16_LE: inf = PM805_WLEN_16_BIT; break; case SNDRV_PCM_FORMAT_S20_3LE: inf = PM805_WLEN_20_BIT; break; case SNDRV_PCM_FORMAT_S24_LE: inf = PM805_WLEN_24_BIT; break; default: return -EINVAL; } addr = PM805_CODEC_SAI1_SETTING_1 + (dai->id - 1) * 0x5; snd_soc_update_bits_locked(codec, addr, PM805_WLEN_24_BIT, inf); /* sample rate */ switch (params_rate(params)) { case 8000: inf = PM805_FSYN_RATE_8000; break; case 11025: inf = PM805_FSYN_RATE_11025; break; case 16000: inf = PM805_FSYN_RATE_16000; break; case 22050: inf = PM805_FSYN_RATE_22050; break; case 32000: inf = PM805_FSYN_RATE_32000; break; case 44100: inf = PM805_FSYN_RATE_44100; break; case 48000: inf = PM805_FSYN_RATE_48000; break; default: return -EINVAL; } addr = PM805_CODEC_SAI1_SETTING_2 + (dai->id - 1) * 0x5; snd_soc_update_bits_locked(codec, addr, PM805_FSYN_RATE_128000, inf); return 0; }
static int snd_soc_put_volsw_twl6040_hs(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); unsigned int reg = mc->reg; unsigned int shift = mc->shift; unsigned int rshift = mc->rshift; int max = mc->max; unsigned int mask = (1 << fls(max)) - 1; unsigned int invert = mc->invert; unsigned int val, val2, val_mask; struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec); val = (ucontrol->value.integer.value[0] & mask); if (invert) val = max - val; val_mask = mask << shift; val = val << shift; if (shift != rshift) { val2 = (ucontrol->value.integer.value[1] & mask); if (invert) val2 = max - val2; val_mask |= mask << rshift; val |= val2 << rshift; } priv->hs_gain = val; return snd_soc_update_bits_locked(codec, reg, val_mask, val); }
static int pm805_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) { struct snd_soc_codec *codec = codec_dai->codec; unsigned char inf = 0, mask = 0, addr; addr = PM805_CODEC_SAI1_SETTING_1 + (codec_dai->id - 1) * 0x5; /* set master/slave audio interface */ switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBM_CFM: inf |= PM805_SAI_MASTER; break; case SND_SOC_DAIFMT_CBS_CFS: inf &= ~PM805_SAI_MASTER; break; default: return -EINVAL; } switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_I2S: inf |= PM805_SAI_I2S_MODE; break; default: inf &= ~PM805_SAI_I2S_MODE; break; } mask |= PM805_SAI_MASTER | PM805_SAI_I2S_MODE; snd_soc_update_bits_locked(codec, addr, mask, inf); return 0; }