コード例 #1
0
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;
}
コード例 #2
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;
}
コード例 #3
0
ファイル: twl6040.c プロジェクト: panhenry/MyTest
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);
}
コード例 #4
0
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;
}