/** * \brief Initial the codec for audio play. */ static void init_dac(void) { uint32_t ul_value; /* First, disable programmable clock */ pmc_disable_pck(PMC_PCK_0); /* Then, configure PMC Programmable Clock */ pmc_switch_pck_to_mainck(PMC_PCK_0, PMC_MCKR_PRES_CLK_1); /* Finally, enable programmable clock */ pmc_enable_pck(PMC_PCK_0); /* init control interface */ init_twi_wm8731(); /* reset the WM8731 */ wm8731_reset(); /* Select the WM8731 DAC */ wm8731_dac_select(1); /* Set the WM8731 to usb mode and 48K DAC */ wm8731_set_sampling_control(1,0,0); /* Set the WM8731 audio interface to I2S mode */ ul_value = WM8731_REG_DIGITAL_AUDIO_INTERFACE_FORMAT_I2S; wm8731_set_digital_audio_data_bit_length(ul_value); /* Set the WM8731 audio data bit length to 16bit */ ul_value = WM8731_REG_DIGITAL_AUDIO_INTERFACE_FORMAT_IWL_16_BIT; wm8731_set_digital_audio_data_bit_length(ul_value); /* Disable the WM8731 DAC soft mute */ wm8731_set_dac_soft_mute(0); /* Power up the WM8731 DAC */ wm8731_power_mode_dac(); /* Active the WM8731 */ wm8731_set_active(1); }
static int wm8731_probe(struct snd_soc_codec *codec) { struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(codec); int ret = 0, i; codec->control_data = wm8731->regmap; ret = snd_soc_codec_set_cache_io(codec, 7, 9, SND_SOC_REGMAP); if (ret < 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); return ret; } for (i = 0; i < ARRAY_SIZE(wm8731->supplies); i++) wm8731->supplies[i].supply = wm8731_supply_names[i]; ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8731->supplies), wm8731->supplies); if (ret != 0) { dev_err(codec->dev, "Failed to request supplies: %d\n", ret); return ret; } ret = regulator_bulk_enable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); if (ret != 0) { dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); goto err_regulator_get; } ret = wm8731_reset(codec); if (ret < 0) { dev_err(codec->dev, "Failed to issue reset: %d\n", ret); goto err_regulator_enable; } wm8731_set_bias_level(codec, SND_SOC_BIAS_STANDBY); /* Latch the update bits */ snd_soc_update_bits(codec, WM8731_LOUT1V, 0x100, 0); snd_soc_update_bits(codec, WM8731_ROUT1V, 0x100, 0); snd_soc_update_bits(codec, WM8731_LINVOL, 0x100, 0); snd_soc_update_bits(codec, WM8731_RINVOL, 0x100, 0); /* Disable bypass path by default */ snd_soc_update_bits(codec, WM8731_APANA, 0x8, 0); /* Regulators will have been enabled by bias management */ regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); return 0; err_regulator_enable: regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); err_regulator_get: regulator_bulk_free(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); return ret; }