示例#1
0
static int aic31xx_dapm_power_event(struct snd_soc_dapm_widget *w,
				    struct snd_kcontrol *kcontrol, int event)
{
	struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
	struct aic31xx_priv *aic31xx = snd_soc_codec_get_drvdata(codec);
	unsigned int reg = AIC31XX_DACFLAG1;
	unsigned int mask;

	switch (WIDGET_BIT(w->reg, w->shift)) {
	case WIDGET_BIT(AIC31XX_DACSETUP, 7):
		mask = AIC31XX_LDACPWRSTATUS_MASK;
		break;
	case WIDGET_BIT(AIC31XX_DACSETUP, 6):
		mask = AIC31XX_RDACPWRSTATUS_MASK;
		break;
	case WIDGET_BIT(AIC31XX_HPDRIVER, 7):
		mask = AIC31XX_HPLDRVPWRSTATUS_MASK;
		break;
	case WIDGET_BIT(AIC31XX_HPDRIVER, 6):
		mask = AIC31XX_HPRDRVPWRSTATUS_MASK;
		break;
	case WIDGET_BIT(AIC31XX_SPKAMP, 7):
		mask = AIC31XX_SPLDRVPWRSTATUS_MASK;
		break;
	case WIDGET_BIT(AIC31XX_SPKAMP, 6):
		mask = AIC31XX_SPRDRVPWRSTATUS_MASK;
		break;
	case WIDGET_BIT(AIC31XX_ADCSETUP, 7):
		mask = AIC31XX_ADCPWRSTATUS_MASK;
		reg = AIC31XX_ADCFLAG;
		break;
	default:
		dev_err(codec->dev, "Unknown widget '%s' calling %s\n",
			w->name, __func__);
		return -EINVAL;
	}

	switch (event) {
	case SND_SOC_DAPM_POST_PMU:
		return aic31xx_wait_bits(aic31xx, reg, mask, mask, 5000, 100);
	case SND_SOC_DAPM_POST_PMD:
		return aic31xx_wait_bits(aic31xx, reg, mask, 0, 5000, 100);
	default:
		dev_dbg(codec->dev,
			"Unhandled dapm widget event %d from %s\n",
			event, w->name);
	}
	return 0;
}
static int aic31xx_power_up_event(struct snd_soc_dapm_widget *w,
				  struct snd_kcontrol *kcontrol, int event)
{
	struct aic31xx_priv *aic31xx = snd_soc_codec_get_drvdata(w->codec);
	unsigned int reg = AIC31XX_DACFLAG1;
	unsigned int mask;

	if (!strcmp(w->name, "DAC Left")) {
		mask = AIC31XX_LDACPWRSTATUS_MASK;
	} else if (!strcmp(w->name, "DAC Right")) {
		mask = AIC31XX_RDACPWRSTATUS_MASK;
	} else if (!strcmp(w->name, "HPL Driver")) {
		mask = AIC31XX_HPLDRVPWRSTATUS_MASK;
	} else if (!strcmp(w->name, "HPR Driver")) {
		mask = AIC31XX_HPRDRVPWRSTATUS_MASK;
	} else if (!strcmp(w->name, "SPL ClassD") ||
		   !strcmp(w->name, "SPK ClassD")) {
		mask = AIC31XX_SPLDRVPWRSTATUS_MASK;
	} else if (!strcmp(w->name, "SPR ClassD")) {
		mask = AIC31XX_SPRDRVPWRSTATUS_MASK;
	} else if (!strcmp(w->name, "ADC")) {
		mask = AIC31XX_ADCPWRSTATUS_MASK;
		reg = AIC31XX_ADCFLAG;
	} else {
		dev_err(w->codec->dev, "Unknown widget '%s' calling %s/n",
			w->name, __func__);
		return -1;
	}

	if (event == SND_SOC_DAPM_POST_PMU)
		return aic31xx_wait_bits(aic31xx, reg, mask, mask, 5000, 100);
	else if (event == SND_SOC_DAPM_POST_PMD)
		return aic31xx_wait_bits(aic31xx, reg, mask, 0, 5000, 100);

	dev_dbg(w->codec->dev, "Unhandled dapm widget event %d from %s\n",
		event, w->name);
	return 0;
}