.remove = ad1836_remove, .suspend = ad1836_suspend, .resume = ad1836_resume, .controls = ad183x_controls, .num_controls = ARRAY_SIZE(ad183x_controls), .dapm_widgets = ad183x_dapm_widgets, .num_dapm_widgets = ARRAY_SIZE(ad183x_dapm_widgets), .dapm_routes = ad183x_dapm_routes, .num_dapm_routes = ARRAY_SIZE(ad183x_dapm_routes), }; static const struct reg_default ad1836_reg_defaults[] = { { AD1836_DAC_CTRL1, 0x0000 }, { AD1836_DAC_CTRL2, 0x0000 }, { AD1836_DAC_L_VOL(0), 0x0000 }, { AD1836_DAC_R_VOL(0), 0x0000 }, { AD1836_DAC_L_VOL(1), 0x0000 }, { AD1836_DAC_R_VOL(1), 0x0000 }, { AD1836_DAC_L_VOL(2), 0x0000 }, { AD1836_DAC_R_VOL(2), 0x0000 }, { AD1836_DAC_L_VOL(3), 0x0000 }, { AD1836_DAC_R_VOL(3), 0x0000 }, { AD1836_ADC_CTRL1, 0x0000 }, { AD1836_ADC_CTRL2, 0x0000 }, { AD1836_ADC_CTRL3, 0x0000 }, }; static const struct regmap_config ad1836_regmap_config = { .val_bits = 12, .reg_bits = 4,
static int ad1836_probe(struct snd_soc_codec *codec) { struct ad1836_priv *ad1836 = snd_soc_codec_get_drvdata(codec); struct snd_soc_dapm_context *dapm = &codec->dapm; int num_dacs, num_adcs; int ret = 0; int i; num_dacs = ad183x_dais[ad1836->type].playback.channels_max / 2; num_adcs = ad183x_dais[ad1836->type].capture.channels_max / 2; ret = snd_soc_codec_set_cache_io(codec, 4, 12, SND_SOC_SPI); if (ret < 0) { dev_err(codec->dev, "failed to set cache I/O: %d\n", ret); return ret; } /* default setting for ad1836 */ /* de-emphasis: 48kHz, power-on dac */ snd_soc_write(codec, AD1836_DAC_CTRL1, 0x300); /* unmute dac channels */ snd_soc_write(codec, AD1836_DAC_CTRL2, 0x0); /* high-pass filter enable, power-on adc */ snd_soc_write(codec, AD1836_ADC_CTRL1, 0x100); /* unmute adc channles, adc aux mode */ snd_soc_write(codec, AD1836_ADC_CTRL2, 0x180); /* volume */ for (i = 1; i <= num_dacs; ++i) { snd_soc_write(codec, AD1836_DAC_L_VOL(i), 0x3FF); snd_soc_write(codec, AD1836_DAC_R_VOL(i), 0x3FF); } if (ad1836->type == AD1836) { /* left/right diff:PGA/MUX */ snd_soc_write(codec, AD1836_ADC_CTRL3, 0x3A); ret = snd_soc_add_controls(codec, ad1836_controls, ARRAY_SIZE(ad1836_controls)); if (ret) return ret; } else { snd_soc_write(codec, AD1836_ADC_CTRL3, 0x00); } ret = snd_soc_add_controls(codec, ad183x_dac_controls, num_dacs * 2); if (ret) return ret; ret = snd_soc_add_controls(codec, ad183x_adc_controls, num_adcs); if (ret) return ret; ret = snd_soc_dapm_new_controls(dapm, ad183x_dac_dapm_widgets, num_dacs); if (ret) return ret; ret = snd_soc_dapm_new_controls(dapm, ad183x_adc_dapm_widgets, num_adcs); if (ret) return ret; ret = snd_soc_dapm_add_routes(dapm, ad183x_dac_routes, num_dacs); if (ret) return ret; ret = snd_soc_dapm_add_routes(dapm, ad183x_adc_routes, num_adcs); if (ret) return ret; return ret; }
static int ad1836_probe(struct snd_soc_codec *codec) { struct ad1836_priv *ad1836 = snd_soc_codec_get_drvdata(codec); struct snd_soc_dapm_context *dapm = &codec->dapm; int num_dacs, num_adcs; int ret = 0; int i; num_dacs = ad183x_dais[ad1836->type].playback.channels_max / 2; num_adcs = ad183x_dais[ad1836->type].capture.channels_max / 2; ret = snd_soc_codec_set_cache_io(codec, 4, 12, SND_SOC_SPI); if (ret < 0) { dev_err(codec->dev, "failed to set cache I/O: %d\n", ret); return ret; } /* */ /* */ snd_soc_write(codec, AD1836_DAC_CTRL1, 0x300); /* */ snd_soc_write(codec, AD1836_DAC_CTRL2, 0x0); /* */ snd_soc_write(codec, AD1836_ADC_CTRL1, 0x100); /* */ snd_soc_write(codec, AD1836_ADC_CTRL2, 0x180); /* */ for (i = 1; i <= num_dacs; ++i) { snd_soc_write(codec, AD1836_DAC_L_VOL(i), 0x3FF); snd_soc_write(codec, AD1836_DAC_R_VOL(i), 0x3FF); } if (ad1836->type == AD1836) { /* */ snd_soc_write(codec, AD1836_ADC_CTRL3, 0x3A); ret = snd_soc_add_codec_controls(codec, ad1836_controls, ARRAY_SIZE(ad1836_controls)); if (ret) return ret; } else { snd_soc_write(codec, AD1836_ADC_CTRL3, 0x00); } ret = snd_soc_add_codec_controls(codec, ad183x_dac_controls, num_dacs * 2); if (ret) return ret; ret = snd_soc_add_codec_controls(codec, ad183x_adc_controls, num_adcs); if (ret) return ret; ret = snd_soc_dapm_new_controls(dapm, ad183x_dac_dapm_widgets, num_dacs); if (ret) return ret; ret = snd_soc_dapm_new_controls(dapm, ad183x_adc_dapm_widgets, num_adcs); if (ret) return ret; ret = snd_soc_dapm_add_routes(dapm, ad183x_dac_routes, num_dacs); if (ret) return ret; ret = snd_soc_dapm_add_routes(dapm, ad183x_adc_routes, num_adcs); if (ret) return ret; return ret; }