static inline void uda134x_reset(struct snd_soc_codec *codec) { u8 reset_reg = uda134x_read_reg_cache(codec, UDA134X_STATUS0); uda134x_write(codec, UDA134X_STATUS0, reset_reg | (1<<6)); msleep(1); uda134x_write(codec, UDA134X_STATUS0, reset_reg & ~(1<<6)); }
static int uda134x_set_bias_level(struct snd_soc_codec *codec, enum snd_soc_bias_level level) { u8 reg; struct uda134x_platform_data *pd = codec->control_data; int i; u8 *cache = codec->reg_cache; pr_debug("%s bias level %d\n", __func__, level); switch (level) { case SND_SOC_BIAS_ON: reg = uda134x_read_reg_cache(codec, UDA134X_STATUS1); uda134x_write(codec, UDA134X_STATUS1, reg | 0x03); break; case SND_SOC_BIAS_PREPARE: if (pd->power) { pd->power(1); for (i = 0; i < ARRAY_SIZE(uda134x_reg); i++) codec->write(codec, i, *cache++); } break; case SND_SOC_BIAS_STANDBY: reg = uda134x_read_reg_cache(codec, UDA134X_STATUS1); uda134x_write(codec, UDA134X_STATUS1, reg & ~(0x03)); break; case SND_SOC_BIAS_OFF: if (pd->power) pd->power(0); break; } codec->bias_level = level; return 0; }
static int uda134x_mute(struct snd_soc_dai *dai, int mute) { struct snd_soc_codec *codec = dai->codec; u8 mute_reg = uda134x_read_reg_cache(codec, UDA134X_DATA010); pr_debug("%s mute: %d\n", __func__, mute); if (mute) mute_reg |= (1<<2); else mute_reg &= ~(1<<2); uda134x_write(codec, UDA134X_DATA010, mute_reg); return 0; }
static int uda134x_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_codec *codec = rtd->codec; struct uda134x_priv *uda134x = snd_soc_codec_get_drvdata(codec); u8 hw_params; if (substream == uda134x->slave_substream) { pr_debug("%s ignoring hw_params for slave substream\n", __func__); return 0; } hw_params = uda134x_read_reg_cache(codec, UDA134X_STATUS0); hw_params &= STATUS0_SYSCLK_MASK; hw_params &= STATUS0_DAIFMT_MASK; pr_debug("%s sysclk: %d, rate:%d\n", __func__, uda134x->sysclk, params_rate(params)); /* set SYSCLK / fs ratio */ switch (uda134x->sysclk / params_rate(params)) { case 512: break; case 384: hw_params |= (1<<4); break; case 256: hw_params |= (1<<5); break; default: printk(KERN_ERR "%s unsupported fs\n", __func__); return -EINVAL; } pr_debug("%s dai_fmt: %d, params_format:%d\n", __func__, uda134x->dai_fmt, params_format(params)); /* set DAI format and word length */ switch (uda134x->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_I2S: break; case SND_SOC_DAIFMT_RIGHT_J: switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE: hw_params |= (1<<1); break; case SNDRV_PCM_FORMAT_S18_3LE: hw_params |= (1<<2); break; case SNDRV_PCM_FORMAT_S20_3LE: hw_params |= ((1<<2) | (1<<1)); break; default: printk(KERN_ERR "%s unsupported format (right)\n", __func__); return -EINVAL; } break; case SND_SOC_DAIFMT_LEFT_J: hw_params |= (1<<3); break; default: printk(KERN_ERR "%s unsupported format\n", __func__); return -EINVAL; } uda134x_write(codec, UDA134X_STATUS0, hw_params); return 0; }
static int uda134x_set_bias_level(struct snd_soc_codec *codec, enum snd_soc_bias_level level) { u8 reg; struct uda134x_platform_data *pd = codec->control_data; int i; u8 *cache = codec->reg_cache; pr_debug("%s bias level %d\n", __func__, level); switch (level) { case SND_SOC_BIAS_ON: /* ADC, DAC on */ switch (pd->model) { case UDA134X_UDA1340: case UDA134X_UDA1344: case UDA134X_UDA1345: reg = uda134x_read_reg_cache(codec, UDA134X_DATA011); uda134x_write(codec, UDA134X_DATA011, reg | 0x03); break; case UDA134X_UDA1341: reg = uda134x_read_reg_cache(codec, UDA134X_STATUS1); uda134x_write(codec, UDA134X_STATUS1, reg | 0x03); break; default: printk(KERN_ERR "UDA134X SoC codec: " "unsupported model %d\n", pd->model); return -EINVAL; } break; case SND_SOC_BIAS_PREPARE: /* power on */ if (pd->power) { pd->power(1); /* Sync reg_cache with the hardware */ for (i = 0; i < ARRAY_SIZE(uda134x_reg); i++) codec->driver->write(codec, i, *cache++); } break; case SND_SOC_BIAS_STANDBY: /* ADC, DAC power off */ switch (pd->model) { case UDA134X_UDA1340: case UDA134X_UDA1344: case UDA134X_UDA1345: reg = uda134x_read_reg_cache(codec, UDA134X_DATA011); uda134x_write(codec, UDA134X_DATA011, reg & ~(0x03)); break; case UDA134X_UDA1341: reg = uda134x_read_reg_cache(codec, UDA134X_STATUS1); uda134x_write(codec, UDA134X_STATUS1, reg & ~(0x03)); break; default: printk(KERN_ERR "UDA134X SoC codec: " "unsupported model %d\n", pd->model); return -EINVAL; } break; case SND_SOC_BIAS_OFF: /* power off */ if (pd->power) pd->power(0); break; } codec->bias_level = level; return 0; }