int adau17x1_add_widgets(struct snd_soc_component *component) { struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); struct adau *adau = snd_soc_component_get_drvdata(component); int ret; ret = snd_soc_add_component_controls(component, adau17x1_controls, ARRAY_SIZE(adau17x1_controls)); if (ret) return ret; ret = snd_soc_dapm_new_controls(dapm, adau17x1_dapm_widgets, ARRAY_SIZE(adau17x1_dapm_widgets)); if (ret) return ret; if (adau17x1_has_dsp(adau)) { ret = snd_soc_dapm_new_controls(dapm, adau17x1_dsp_dapm_widgets, ARRAY_SIZE(adau17x1_dsp_dapm_widgets)); if (ret) return ret; if (!adau->sigmadsp) return 0; ret = sigmadsp_attach(adau->sigmadsp, component); if (ret) { dev_err(component->dev, "Failed to attach firmware: %d\n", ret); return ret; } } return 0; }
static int adau1701_probe(struct snd_soc_codec *codec) { int i, ret; unsigned int val; struct adau1701 *adau1701 = snd_soc_codec_get_drvdata(codec); ret = sigmadsp_attach(adau1701->sigmadsp, &codec->component); if (ret) return ret; ret = regulator_bulk_enable(ARRAY_SIZE(adau1701->supplies), adau1701->supplies); if (ret < 0) { dev_err(codec->dev, "Failed to enable regulators: %d\n", ret); return ret; } /* * Let the pll_clkdiv variable default to something that won't happen * at runtime. That way, we can postpone the firmware download from * adau1701_reset() to a point in time when we know the correct PLL * mode parameters. */ adau1701->pll_clkdiv = ADAU1707_CLKDIV_UNSET; /* initalize with pre-configured pll mode settings */ ret = adau1701_reset(codec, adau1701->pll_clkdiv, 0); if (ret < 0) goto exit_regulators_disable; /* set up pin config */ val = 0; for (i = 0; i < 6; i++) val |= adau1701->pin_config[i] << (i * 4); regmap_write(adau1701->regmap, ADAU1701_PINCONF_0, val); val = 0; for (i = 0; i < 6; i++) val |= adau1701->pin_config[i + 6] << (i * 4); regmap_write(adau1701->regmap, ADAU1701_PINCONF_1, val); return 0; exit_regulators_disable: regulator_bulk_disable(ARRAY_SIZE(adau1701->supplies), adau1701->supplies); return ret; }