Linux Audio

Check our new training course

Loading...
v6.13.7
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Driver for ADAU1361/ADAU1461/ADAU1761/ADAU1961 codec
   4 *
   5 * Copyright 2011-2013 Analog Devices Inc.
   6 * Author: Lars-Peter Clausen <lars@metafoo.de>
 
 
   7 */
   8
   9#include <linux/module.h>
  10#include <linux/init.h>
  11#include <linux/i2c.h>
  12#include <linux/spi/spi.h>
  13#include <linux/slab.h>
  14#include <sound/core.h>
  15#include <sound/pcm.h>
  16#include <sound/pcm_params.h>
  17#include <sound/soc.h>
  18#include <sound/tlv.h>
  19#include <linux/platform_data/adau17x1.h>
  20
  21#include "adau17x1.h"
  22#include "adau1761.h"
  23
  24#define ADAU1761_DIGMIC_JACKDETECT	0x4008
  25#define ADAU1761_REC_MIXER_LEFT0	0x400a
  26#define ADAU1761_REC_MIXER_LEFT1	0x400b
  27#define ADAU1761_REC_MIXER_RIGHT0	0x400c
  28#define ADAU1761_REC_MIXER_RIGHT1	0x400d
  29#define ADAU1761_LEFT_DIFF_INPUT_VOL	0x400e
  30#define ADAU1761_RIGHT_DIFF_INPUT_VOL	0x400f
  31#define ADAU1761_ALC_CTRL0		0x4011
  32#define ADAU1761_ALC_CTRL1		0x4012
  33#define ADAU1761_ALC_CTRL2		0x4013
  34#define ADAU1761_ALC_CTRL3		0x4014
  35#define ADAU1761_PLAY_LR_MIXER_LEFT	0x4020
  36#define ADAU1761_PLAY_MIXER_LEFT0	0x401c
  37#define ADAU1761_PLAY_MIXER_LEFT1	0x401d
  38#define ADAU1761_PLAY_MIXER_RIGHT0	0x401e
  39#define ADAU1761_PLAY_MIXER_RIGHT1	0x401f
  40#define ADAU1761_PLAY_LR_MIXER_RIGHT	0x4021
  41#define ADAU1761_PLAY_MIXER_MONO	0x4022
  42#define ADAU1761_PLAY_HP_LEFT_VOL	0x4023
  43#define ADAU1761_PLAY_HP_RIGHT_VOL	0x4024
  44#define ADAU1761_PLAY_LINE_LEFT_VOL	0x4025
  45#define ADAU1761_PLAY_LINE_RIGHT_VOL	0x4026
  46#define ADAU1761_PLAY_MONO_OUTPUT_VOL	0x4027
  47#define ADAU1761_POP_CLICK_SUPPRESS	0x4028
  48#define ADAU1761_JACK_DETECT_PIN	0x4031
  49#define ADAU1761_DEJITTER		0x4036
  50#define ADAU1761_CLK_ENABLE0		0x40f9
  51#define ADAU1761_CLK_ENABLE1		0x40fa
  52
  53#define ADAU1761_DIGMIC_JACKDETECT_ACTIVE_LOW	BIT(0)
  54#define ADAU1761_DIGMIC_JACKDETECT_DIGMIC	BIT(5)
  55
  56#define ADAU1761_DIFF_INPUT_VOL_LDEN		BIT(0)
  57
  58#define ADAU1761_PLAY_MONO_OUTPUT_VOL_MODE_HP	BIT(0)
  59#define ADAU1761_PLAY_MONO_OUTPUT_VOL_UNMUTE	BIT(1)
  60
  61#define ADAU1761_PLAY_HP_RIGHT_VOL_MODE_HP	BIT(0)
  62
  63#define ADAU1761_PLAY_LINE_LEFT_VOL_MODE_HP	BIT(0)
  64
  65#define ADAU1761_PLAY_LINE_RIGHT_VOL_MODE_HP	BIT(0)
  66
  67
  68#define ADAU1761_FIRMWARE "adau1761.bin"
  69
  70static const struct reg_default adau1761_reg_defaults[] = {
  71	{ ADAU1761_DEJITTER,			0x03 },
  72	{ ADAU1761_DIGMIC_JACKDETECT,		0x00 },
  73	{ ADAU1761_REC_MIXER_LEFT0,		0x00 },
  74	{ ADAU1761_REC_MIXER_LEFT1,		0x00 },
  75	{ ADAU1761_REC_MIXER_RIGHT0,		0x00 },
  76	{ ADAU1761_REC_MIXER_RIGHT1,		0x00 },
  77	{ ADAU1761_LEFT_DIFF_INPUT_VOL,		0x00 },
  78	{ ADAU1761_ALC_CTRL0,			0x00 },
  79	{ ADAU1761_ALC_CTRL1,			0x00 },
  80	{ ADAU1761_ALC_CTRL2,			0x00 },
  81	{ ADAU1761_ALC_CTRL3,			0x00 },
  82	{ ADAU1761_RIGHT_DIFF_INPUT_VOL,	0x00 },
  83	{ ADAU1761_PLAY_LR_MIXER_LEFT,		0x00 },
  84	{ ADAU1761_PLAY_MIXER_LEFT0,		0x00 },
  85	{ ADAU1761_PLAY_MIXER_LEFT1,		0x00 },
  86	{ ADAU1761_PLAY_MIXER_RIGHT0,		0x00 },
  87	{ ADAU1761_PLAY_MIXER_RIGHT1,		0x00 },
  88	{ ADAU1761_PLAY_LR_MIXER_RIGHT,		0x00 },
  89	{ ADAU1761_PLAY_MIXER_MONO,		0x00 },
  90	{ ADAU1761_PLAY_HP_LEFT_VOL,		0x00 },
  91	{ ADAU1761_PLAY_HP_RIGHT_VOL,		0x00 },
  92	{ ADAU1761_PLAY_LINE_LEFT_VOL,		0x00 },
  93	{ ADAU1761_PLAY_LINE_RIGHT_VOL,		0x00 },
  94	{ ADAU1761_PLAY_MONO_OUTPUT_VOL,	0x00 },
  95	{ ADAU1761_POP_CLICK_SUPPRESS,		0x00 },
  96	{ ADAU1761_JACK_DETECT_PIN,		0x00 },
  97	{ ADAU1761_CLK_ENABLE0,			0x00 },
  98	{ ADAU1761_CLK_ENABLE1,			0x00 },
  99	{ ADAU17X1_CLOCK_CONTROL,		0x00 },
 100	{ ADAU17X1_PLL_CONTROL,			0x00 },
 101	{ ADAU17X1_REC_POWER_MGMT,		0x00 },
 102	{ ADAU17X1_MICBIAS,			0x00 },
 103	{ ADAU17X1_SERIAL_PORT0,		0x00 },
 104	{ ADAU17X1_SERIAL_PORT1,		0x00 },
 105	{ ADAU17X1_CONVERTER0,			0x00 },
 106	{ ADAU17X1_CONVERTER1,			0x00 },
 107	{ ADAU17X1_LEFT_INPUT_DIGITAL_VOL,	0x00 },
 108	{ ADAU17X1_RIGHT_INPUT_DIGITAL_VOL,	0x00 },
 109	{ ADAU17X1_ADC_CONTROL,			0x00 },
 110	{ ADAU17X1_PLAY_POWER_MGMT,		0x00 },
 111	{ ADAU17X1_DAC_CONTROL0,		0x00 },
 112	{ ADAU17X1_DAC_CONTROL1,		0x00 },
 113	{ ADAU17X1_DAC_CONTROL2,		0x00 },
 114	{ ADAU17X1_SERIAL_PORT_PAD,		0xaa },
 115	{ ADAU17X1_CONTROL_PORT_PAD0,		0xaa },
 116	{ ADAU17X1_CONTROL_PORT_PAD1,		0x00 },
 117	{ ADAU17X1_DSP_SAMPLING_RATE,		0x01 },
 118	{ ADAU17X1_SERIAL_INPUT_ROUTE,		0x00 },
 119	{ ADAU17X1_SERIAL_OUTPUT_ROUTE,		0x00 },
 120	{ ADAU17X1_DSP_ENABLE,			0x00 },
 121	{ ADAU17X1_DSP_RUN,			0x00 },
 122	{ ADAU17X1_SERIAL_SAMPLING_RATE,	0x00 },
 123};
 124
 125static const DECLARE_TLV_DB_SCALE(adau1761_sing_in_tlv, -1500, 300, 1);
 126static const DECLARE_TLV_DB_SCALE(adau1761_diff_in_tlv, -1200, 75, 0);
 127static const DECLARE_TLV_DB_SCALE(adau1761_out_tlv, -5700, 100, 0);
 128static const DECLARE_TLV_DB_SCALE(adau1761_sidetone_tlv, -1800, 300, 1);
 129static const DECLARE_TLV_DB_SCALE(adau1761_boost_tlv, -600, 600, 1);
 130static const DECLARE_TLV_DB_SCALE(adau1761_pga_boost_tlv, -2000, 2000, 1);
 131
 132static const DECLARE_TLV_DB_SCALE(adau1761_alc_max_gain_tlv, -1200, 600, 0);
 133static const DECLARE_TLV_DB_SCALE(adau1761_alc_target_tlv, -2850, 150, 0);
 134static const DECLARE_TLV_DB_SCALE(adau1761_alc_ng_threshold_tlv, -7650, 150, 0);
 135
 136static const unsigned int adau1761_bias_select_values[] = {
 137	0, 2, 3,
 138};
 139
 140static const char * const adau1761_bias_select_text[] = {
 141	"Normal operation", "Enhanced performance", "Power saving",
 142};
 143
 144static const char * const adau1761_bias_select_extreme_text[] = {
 145	"Normal operation", "Extreme power saving", "Enhanced performance",
 146	"Power saving",
 147};
 148
 149static SOC_ENUM_SINGLE_DECL(adau1761_adc_bias_enum,
 150		ADAU17X1_REC_POWER_MGMT, 3, adau1761_bias_select_extreme_text);
 151static SOC_ENUM_SINGLE_DECL(adau1761_hp_bias_enum,
 152		ADAU17X1_PLAY_POWER_MGMT, 6, adau1761_bias_select_extreme_text);
 153static SOC_ENUM_SINGLE_DECL(adau1761_dac_bias_enum,
 154		ADAU17X1_PLAY_POWER_MGMT, 4, adau1761_bias_select_extreme_text);
 155static SOC_VALUE_ENUM_SINGLE_DECL(adau1761_playback_bias_enum,
 156		ADAU17X1_PLAY_POWER_MGMT, 2, 0x3, adau1761_bias_select_text,
 157		adau1761_bias_select_values);
 158static SOC_VALUE_ENUM_SINGLE_DECL(adau1761_capture_bias_enum,
 159		ADAU17X1_REC_POWER_MGMT, 1, 0x3, adau1761_bias_select_text,
 160		adau1761_bias_select_values);
 161
 162static const unsigned int adau1761_pga_slew_time_values[] = {
 163	3, 0, 1, 2,
 164};
 165
 166static const char * const adau1761_pga_slew_time_text[] = {
 167	"Off",
 168	"24 ms",
 169	"48 ms",
 170	"96 ms",
 171};
 172
 173static const char * const adau1761_alc_function_text[] = {
 174	"Off",
 175	"Right",
 176	"Left",
 177	"Stereo",
 178	"DSP control",
 179};
 180
 181static const char * const adau1761_alc_hold_time_text[] = {
 182	"2.67 ms",
 183	"5.34 ms",
 184	"10.68 ms",
 185	"21.36 ms",
 186	"42.72 ms",
 187	"85.44 ms",
 188	"170.88 ms",
 189	"341.76 ms",
 190	"683.52 ms",
 191	"1367 ms",
 192	"2734.1 ms",
 193	"5468.2 ms",
 194	"10936 ms",
 195	"21873 ms",
 196	"43745 ms",
 197	"87491 ms",
 198};
 199
 200static const char * const adau1761_alc_attack_time_text[] = {
 201	"6 ms",
 202	"12 ms",
 203	"24 ms",
 204	"48 ms",
 205	"96 ms",
 206	"192 ms",
 207	"384 ms",
 208	"768 ms",
 209	"1540 ms",
 210	"3070 ms",
 211	"6140 ms",
 212	"12290 ms",
 213	"24580 ms",
 214	"49150 ms",
 215	"98300 ms",
 216	"196610 ms",
 217};
 218
 219static const char * const adau1761_alc_decay_time_text[] = {
 220	"24 ms",
 221	"48 ms",
 222	"96 ms",
 223	"192 ms",
 224	"384 ms",
 225	"768 ms",
 226	"15400 ms",
 227	"30700 ms",
 228	"61400 ms",
 229	"12290 ms",
 230	"24580 ms",
 231	"49150 ms",
 232	"98300 ms",
 233	"196610 ms",
 234	"393220 ms",
 235	"786430 ms",
 236};
 237
 238static const char * const adau1761_alc_ng_type_text[] = {
 239	"Hold",
 240	"Mute",
 241	"Fade",
 242	"Fade + Mute",
 243};
 244
 245static SOC_VALUE_ENUM_SINGLE_DECL(adau1761_pga_slew_time_enum,
 246		ADAU1761_ALC_CTRL0, 6, 0x3, adau1761_pga_slew_time_text,
 247		adau1761_pga_slew_time_values);
 248static SOC_ENUM_SINGLE_DECL(adau1761_alc_function_enum,
 249		ADAU1761_ALC_CTRL0, 0, adau1761_alc_function_text);
 250static SOC_ENUM_SINGLE_DECL(adau1761_alc_hold_time_enum,
 251		ADAU1761_ALC_CTRL1, 4, adau1761_alc_hold_time_text);
 252static SOC_ENUM_SINGLE_DECL(adau1761_alc_attack_time_enum,
 253		ADAU1761_ALC_CTRL2, 4, adau1761_alc_attack_time_text);
 254static SOC_ENUM_SINGLE_DECL(adau1761_alc_decay_time_enum,
 255		ADAU1761_ALC_CTRL2, 0, adau1761_alc_decay_time_text);
 256static SOC_ENUM_SINGLE_DECL(adau1761_alc_ng_type_enum,
 257		ADAU1761_ALC_CTRL3, 6, adau1761_alc_ng_type_text);
 258
 259static const struct snd_kcontrol_new adau1761_jack_detect_controls[] = {
 260	SOC_SINGLE("Speaker Auto-mute Switch", ADAU1761_DIGMIC_JACKDETECT,
 261		4, 1, 0),
 262};
 263
 264static const struct snd_kcontrol_new adau1761_differential_mode_controls[] = {
 265	SOC_DOUBLE_R_TLV("Capture Volume", ADAU1761_LEFT_DIFF_INPUT_VOL,
 266		ADAU1761_RIGHT_DIFF_INPUT_VOL, 2, 0x3f, 0,
 267		adau1761_diff_in_tlv),
 268	SOC_DOUBLE_R("Capture Switch", ADAU1761_LEFT_DIFF_INPUT_VOL,
 269		ADAU1761_RIGHT_DIFF_INPUT_VOL, 1, 1, 0),
 270
 271	SOC_DOUBLE_R_TLV("PGA Boost Capture Volume", ADAU1761_REC_MIXER_LEFT1,
 272		ADAU1761_REC_MIXER_RIGHT1, 3, 2, 0, adau1761_pga_boost_tlv),
 273
 274	SOC_ENUM("PGA Capture Slew Time", adau1761_pga_slew_time_enum),
 275
 276	SOC_SINGLE_TLV("ALC Capture Max Gain Volume", ADAU1761_ALC_CTRL0,
 277		3, 7, 0, adau1761_alc_max_gain_tlv),
 278	SOC_ENUM("ALC Capture Function", adau1761_alc_function_enum),
 279	SOC_ENUM("ALC Capture Hold Time", adau1761_alc_hold_time_enum),
 280	SOC_SINGLE_TLV("ALC Capture Target Volume", ADAU1761_ALC_CTRL1,
 281		0, 15, 0, adau1761_alc_target_tlv),
 282	SOC_ENUM("ALC Capture Attack Time", adau1761_alc_decay_time_enum),
 283	SOC_ENUM("ALC Capture Decay Time", adau1761_alc_attack_time_enum),
 284	SOC_ENUM("ALC Capture Noise Gate Type", adau1761_alc_ng_type_enum),
 285	SOC_SINGLE("ALC Capture Noise Gate Switch",
 286		ADAU1761_ALC_CTRL3, 5, 1, 0),
 287	SOC_SINGLE_TLV("ALC Capture Noise Gate Threshold Volume",
 288		ADAU1761_ALC_CTRL3, 0, 31, 0, adau1761_alc_ng_threshold_tlv),
 289};
 290
 291static const struct snd_kcontrol_new adau1761_single_mode_controls[] = {
 292	SOC_SINGLE_TLV("Input 1 Capture Volume", ADAU1761_REC_MIXER_LEFT0,
 293		4, 7, 0, adau1761_sing_in_tlv),
 294	SOC_SINGLE_TLV("Input 2 Capture Volume", ADAU1761_REC_MIXER_LEFT0,
 295		1, 7, 0, adau1761_sing_in_tlv),
 296	SOC_SINGLE_TLV("Input 3 Capture Volume", ADAU1761_REC_MIXER_RIGHT0,
 297		4, 7, 0, adau1761_sing_in_tlv),
 298	SOC_SINGLE_TLV("Input 4 Capture Volume", ADAU1761_REC_MIXER_RIGHT0,
 299		1, 7, 0, adau1761_sing_in_tlv),
 300};
 301
 302static const struct snd_kcontrol_new adau1761_controls[] = {
 303	SOC_DOUBLE_R_TLV("Aux Capture Volume", ADAU1761_REC_MIXER_LEFT1,
 304		ADAU1761_REC_MIXER_RIGHT1, 0, 7, 0, adau1761_sing_in_tlv),
 305
 306	SOC_DOUBLE_R_TLV("Headphone Playback Volume", ADAU1761_PLAY_HP_LEFT_VOL,
 307		ADAU1761_PLAY_HP_RIGHT_VOL, 2, 0x3f, 0, adau1761_out_tlv),
 308	SOC_DOUBLE_R("Headphone Playback Switch", ADAU1761_PLAY_HP_LEFT_VOL,
 309		ADAU1761_PLAY_HP_RIGHT_VOL, 1, 1, 0),
 310	SOC_DOUBLE_R_TLV("Lineout Playback Volume", ADAU1761_PLAY_LINE_LEFT_VOL,
 311		ADAU1761_PLAY_LINE_RIGHT_VOL, 2, 0x3f, 0, adau1761_out_tlv),
 312	SOC_DOUBLE_R("Lineout Playback Switch", ADAU1761_PLAY_LINE_LEFT_VOL,
 313		ADAU1761_PLAY_LINE_RIGHT_VOL, 1, 1, 0),
 314
 315	SOC_ENUM("ADC Bias", adau1761_adc_bias_enum),
 316	SOC_ENUM("DAC Bias", adau1761_dac_bias_enum),
 317	SOC_ENUM("Capture Bias", adau1761_capture_bias_enum),
 318	SOC_ENUM("Playback Bias", adau1761_playback_bias_enum),
 319	SOC_ENUM("Headphone Bias", adau1761_hp_bias_enum),
 320};
 321
 322static const struct snd_kcontrol_new adau1761_mono_controls[] = {
 323	SOC_SINGLE_TLV("Mono Playback Volume", ADAU1761_PLAY_MONO_OUTPUT_VOL,
 324		2, 0x3f, 0, adau1761_out_tlv),
 325	SOC_SINGLE("Mono Playback Switch", ADAU1761_PLAY_MONO_OUTPUT_VOL,
 326		1, 1, 0),
 327};
 328
 329static const struct snd_kcontrol_new adau1761_left_mixer_controls[] = {
 330	SOC_DAPM_SINGLE_AUTODISABLE("Left DAC Switch",
 331		ADAU1761_PLAY_MIXER_LEFT0, 5, 1, 0),
 332	SOC_DAPM_SINGLE_AUTODISABLE("Right DAC Switch",
 333		ADAU1761_PLAY_MIXER_LEFT0, 6, 1, 0),
 334	SOC_DAPM_SINGLE_TLV("Aux Bypass Volume",
 335		ADAU1761_PLAY_MIXER_LEFT0, 1, 8, 0, adau1761_sidetone_tlv),
 336	SOC_DAPM_SINGLE_TLV("Right Bypass Volume",
 337		ADAU1761_PLAY_MIXER_LEFT1, 4, 8, 0, adau1761_sidetone_tlv),
 338	SOC_DAPM_SINGLE_TLV("Left Bypass Volume",
 339		ADAU1761_PLAY_MIXER_LEFT1, 0, 8, 0, adau1761_sidetone_tlv),
 340};
 341
 342static const struct snd_kcontrol_new adau1761_right_mixer_controls[] = {
 343	SOC_DAPM_SINGLE_AUTODISABLE("Left DAC Switch",
 344		ADAU1761_PLAY_MIXER_RIGHT0, 5, 1, 0),
 345	SOC_DAPM_SINGLE_AUTODISABLE("Right DAC Switch",
 346		ADAU1761_PLAY_MIXER_RIGHT0, 6, 1, 0),
 347	SOC_DAPM_SINGLE_TLV("Aux Bypass Volume",
 348		ADAU1761_PLAY_MIXER_RIGHT0, 1, 8, 0, adau1761_sidetone_tlv),
 349	SOC_DAPM_SINGLE_TLV("Right Bypass Volume",
 350		ADAU1761_PLAY_MIXER_RIGHT1, 4, 8, 0, adau1761_sidetone_tlv),
 351	SOC_DAPM_SINGLE_TLV("Left Bypass Volume",
 352		ADAU1761_PLAY_MIXER_RIGHT1, 0, 8, 0, adau1761_sidetone_tlv),
 353};
 354
 355static const struct snd_kcontrol_new adau1761_left_lr_mixer_controls[] = {
 356	SOC_DAPM_SINGLE_TLV("Left Volume",
 357		ADAU1761_PLAY_LR_MIXER_LEFT, 1, 2, 0, adau1761_boost_tlv),
 358	SOC_DAPM_SINGLE_TLV("Right Volume",
 359		ADAU1761_PLAY_LR_MIXER_LEFT, 3, 2, 0, adau1761_boost_tlv),
 360};
 361
 362static const struct snd_kcontrol_new adau1761_right_lr_mixer_controls[] = {
 363	SOC_DAPM_SINGLE_TLV("Left Volume",
 364		ADAU1761_PLAY_LR_MIXER_RIGHT, 1, 2, 0, adau1761_boost_tlv),
 365	SOC_DAPM_SINGLE_TLV("Right Volume",
 366		ADAU1761_PLAY_LR_MIXER_RIGHT, 3, 2, 0, adau1761_boost_tlv),
 367};
 368
 369static const char * const adau1761_input_mux_text[] = {
 370	"ADC", "DMIC",
 371};
 372
 373static SOC_ENUM_SINGLE_DECL(adau1761_input_mux_enum,
 374	ADAU17X1_ADC_CONTROL, 2, adau1761_input_mux_text);
 375
 376static const struct snd_kcontrol_new adau1761_input_mux_control =
 377	SOC_DAPM_ENUM("Input Select", adau1761_input_mux_enum);
 378
 379static int adau1761_dejitter_fixup(struct snd_soc_dapm_widget *w,
 380	struct snd_kcontrol *kcontrol, int event)
 381{
 382	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
 383	struct adau *adau = snd_soc_component_get_drvdata(component);
 384
 385	/* After any power changes have been made the dejitter circuit
 386	 * has to be reinitialized. */
 387	regmap_write(adau->regmap, ADAU1761_DEJITTER, 0);
 388	if (!adau->master)
 389		regmap_write(adau->regmap, ADAU1761_DEJITTER, 3);
 390
 391	return 0;
 392}
 393
 394static const struct snd_soc_dapm_widget adau1x61_dapm_widgets[] = {
 395	SND_SOC_DAPM_MIXER("Left Input Mixer", ADAU1761_REC_MIXER_LEFT0, 0, 0,
 396		NULL, 0),
 397	SND_SOC_DAPM_MIXER("Right Input Mixer", ADAU1761_REC_MIXER_RIGHT0, 0, 0,
 398		NULL, 0),
 399
 400	SOC_MIXER_ARRAY("Left Playback Mixer", ADAU1761_PLAY_MIXER_LEFT0,
 401		0, 0, adau1761_left_mixer_controls),
 402	SOC_MIXER_ARRAY("Right Playback Mixer", ADAU1761_PLAY_MIXER_RIGHT0,
 403		0, 0, adau1761_right_mixer_controls),
 404	SOC_MIXER_ARRAY("Left LR Playback Mixer", ADAU1761_PLAY_LR_MIXER_LEFT,
 405		0, 0, adau1761_left_lr_mixer_controls),
 406	SOC_MIXER_ARRAY("Right LR Playback Mixer", ADAU1761_PLAY_LR_MIXER_RIGHT,
 407		0, 0, adau1761_right_lr_mixer_controls),
 408
 409	SND_SOC_DAPM_SUPPLY("Headphone", ADAU1761_PLAY_HP_LEFT_VOL,
 410		0, 0, NULL, 0),
 411
 412	SND_SOC_DAPM_SUPPLY_S("SYSCLK", 2, SND_SOC_NOPM, 0, 0, NULL, 0),
 413
 414	SND_SOC_DAPM_POST("Dejitter fixup", adau1761_dejitter_fixup),
 415
 416	SND_SOC_DAPM_INPUT("LAUX"),
 417	SND_SOC_DAPM_INPUT("RAUX"),
 418	SND_SOC_DAPM_INPUT("LINP"),
 419	SND_SOC_DAPM_INPUT("LINN"),
 420	SND_SOC_DAPM_INPUT("RINP"),
 421	SND_SOC_DAPM_INPUT("RINN"),
 422
 423	SND_SOC_DAPM_OUTPUT("LOUT"),
 424	SND_SOC_DAPM_OUTPUT("ROUT"),
 425	SND_SOC_DAPM_OUTPUT("LHP"),
 426	SND_SOC_DAPM_OUTPUT("RHP"),
 427};
 428
 429static const struct snd_soc_dapm_widget adau1761_mono_dapm_widgets[] = {
 430	SND_SOC_DAPM_MIXER("Mono Playback Mixer", ADAU1761_PLAY_MIXER_MONO,
 431		0, 0, NULL, 0),
 432
 433	SND_SOC_DAPM_OUTPUT("MONOOUT"),
 434};
 435
 436static const struct snd_soc_dapm_widget adau1761_capless_dapm_widgets[] = {
 437	SND_SOC_DAPM_SUPPLY_S("Headphone VGND", 1, ADAU1761_PLAY_MIXER_MONO,
 438		0, 0, NULL, 0),
 439};
 440
 441static const struct snd_soc_dapm_route adau1x61_dapm_routes[] = {
 442	{ "Left Input Mixer", NULL, "LINP" },
 443	{ "Left Input Mixer", NULL, "LINN" },
 444	{ "Left Input Mixer", NULL, "LAUX" },
 445
 446	{ "Right Input Mixer", NULL, "RINP" },
 447	{ "Right Input Mixer", NULL, "RINN" },
 448	{ "Right Input Mixer", NULL, "RAUX" },
 449
 450	{ "Left Playback Mixer", NULL, "Left Playback Enable"},
 451	{ "Right Playback Mixer", NULL, "Right Playback Enable"},
 452	{ "Left LR Playback Mixer", NULL, "Left Playback Enable"},
 453	{ "Right LR Playback Mixer", NULL, "Right Playback Enable"},
 454
 455	{ "Left Playback Mixer", "Left DAC Switch", "Left DAC" },
 456	{ "Left Playback Mixer", "Right DAC Switch", "Right DAC" },
 457
 458	{ "Right Playback Mixer", "Left DAC Switch", "Left DAC" },
 459	{ "Right Playback Mixer", "Right DAC Switch", "Right DAC" },
 460
 461	{ "Left LR Playback Mixer", "Left Volume", "Left Playback Mixer" },
 462	{ "Left LR Playback Mixer", "Right Volume", "Right Playback Mixer" },
 463
 464	{ "Right LR Playback Mixer", "Left Volume", "Left Playback Mixer" },
 465	{ "Right LR Playback Mixer", "Right Volume", "Right Playback Mixer" },
 466
 467	{ "LHP", NULL, "Left Playback Mixer" },
 468	{ "RHP", NULL, "Right Playback Mixer" },
 469
 470	{ "LHP", NULL, "Headphone" },
 471	{ "RHP", NULL, "Headphone" },
 472
 473	{ "LOUT", NULL, "Left LR Playback Mixer" },
 474	{ "ROUT", NULL, "Right LR Playback Mixer" },
 475
 476	{ "Left Playback Mixer", "Aux Bypass Volume", "LAUX" },
 477	{ "Left Playback Mixer", "Left Bypass Volume", "Left Input Mixer" },
 478	{ "Left Playback Mixer", "Right Bypass Volume", "Right Input Mixer" },
 479	{ "Right Playback Mixer", "Aux Bypass Volume", "RAUX" },
 480	{ "Right Playback Mixer", "Left Bypass Volume", "Left Input Mixer" },
 481	{ "Right Playback Mixer", "Right Bypass Volume", "Right Input Mixer" },
 482};
 483
 484static const struct snd_soc_dapm_route adau1761_mono_dapm_routes[] = {
 485	{ "Mono Playback Mixer", NULL, "Left Playback Mixer" },
 486	{ "Mono Playback Mixer", NULL, "Right Playback Mixer" },
 487
 488	{ "MONOOUT", NULL, "Mono Playback Mixer" },
 489};
 490
 491static const struct snd_soc_dapm_route adau1761_capless_dapm_routes[] = {
 492	{ "Headphone", NULL, "Headphone VGND" },
 493};
 494
 495static const struct snd_soc_dapm_widget adau1761_dmic_widgets[] = {
 496	SND_SOC_DAPM_MUX("Left Decimator Mux", SND_SOC_NOPM, 0, 0,
 497		&adau1761_input_mux_control),
 498	SND_SOC_DAPM_MUX("Right Decimator Mux", SND_SOC_NOPM, 0, 0,
 499		&adau1761_input_mux_control),
 500
 501	SND_SOC_DAPM_INPUT("DMIC"),
 502};
 503
 504static const struct snd_soc_dapm_route adau1761_dmic_routes[] = {
 505	{ "Left Decimator Mux", "ADC", "Left Input Mixer" },
 506	{ "Left Decimator Mux", "DMIC", "DMIC" },
 507	{ "Right Decimator Mux", "ADC", "Right Input Mixer" },
 508	{ "Right Decimator Mux", "DMIC", "DMIC" },
 509
 510	{ "Left Decimator", NULL, "Left Decimator Mux" },
 511	{ "Right Decimator", NULL, "Right Decimator Mux" },
 512};
 513
 514static const struct snd_soc_dapm_route adau1761_no_dmic_routes[] = {
 515	{ "Left Decimator", NULL, "Left Input Mixer" },
 516	{ "Right Decimator", NULL, "Right Input Mixer" },
 517};
 518
 519static const struct snd_soc_dapm_widget adau1761_dapm_widgets[] = {
 520	SND_SOC_DAPM_SUPPLY("Serial Port Clock", ADAU1761_CLK_ENABLE0,
 521		0, 0, NULL, 0),
 522	SND_SOC_DAPM_SUPPLY("Serial Input Routing Clock", ADAU1761_CLK_ENABLE0,
 523		1, 0, NULL, 0),
 524	SND_SOC_DAPM_SUPPLY("Serial Output Routing Clock", ADAU1761_CLK_ENABLE0,
 525		3, 0, NULL, 0),
 526
 527	SND_SOC_DAPM_SUPPLY("Decimator Resync Clock", ADAU1761_CLK_ENABLE0,
 528		4, 0, NULL, 0),
 529	SND_SOC_DAPM_SUPPLY("Interpolator Resync Clock", ADAU1761_CLK_ENABLE0,
 530		2, 0, NULL, 0),
 531
 532	SND_SOC_DAPM_SUPPLY("Slew Clock", ADAU1761_CLK_ENABLE0, 6, 0, NULL, 0),
 533	SND_SOC_DAPM_SUPPLY("ALC Clock", ADAU1761_CLK_ENABLE0, 5, 0, NULL, 0),
 534
 535	SND_SOC_DAPM_SUPPLY_S("Digital Clock 0", 1, ADAU1761_CLK_ENABLE1,
 536		0, 0, NULL, 0),
 537	SND_SOC_DAPM_SUPPLY_S("Digital Clock 1", 1, ADAU1761_CLK_ENABLE1,
 538		1, 0, NULL, 0),
 539};
 540
 541static const struct snd_soc_dapm_route adau1761_dapm_routes[] = {
 542	{ "Left Decimator", NULL, "Digital Clock 0", },
 543	{ "Right Decimator", NULL, "Digital Clock 0", },
 544	{ "Left DAC", NULL, "Digital Clock 0", },
 545	{ "Right DAC", NULL, "Digital Clock 0", },
 546
 547	{ "AIFCLK", NULL, "Digital Clock 1" },
 548
 549	{ "Playback", NULL, "Serial Port Clock" },
 550	{ "Capture", NULL, "Serial Port Clock" },
 551	{ "Playback", NULL, "Serial Input Routing Clock" },
 552	{ "Capture", NULL, "Serial Output Routing Clock" },
 553
 554	{ "Left Decimator", NULL, "Decimator Resync Clock" },
 555	{ "Right Decimator", NULL, "Decimator Resync Clock" },
 556	{ "Left DAC", NULL, "Interpolator Resync Clock" },
 557	{ "Right DAC", NULL, "Interpolator Resync Clock" },
 558
 
 
 559	{ "Slew Clock", NULL, "Digital Clock 0" },
 560	{ "Right Playback Mixer", NULL, "Slew Clock" },
 561	{ "Left Playback Mixer", NULL, "Slew Clock" },
 562
 563	{ "Left Input Mixer", NULL, "ALC Clock" },
 564	{ "Right Input Mixer", NULL, "ALC Clock" },
 565
 566	{ "Digital Clock 0", NULL, "SYSCLK" },
 567	{ "Digital Clock 1", NULL, "SYSCLK" },
 568};
 569
 570static const struct snd_soc_dapm_route adau1761_dapm_dsp_routes[] = {
 571	{ "DSP", NULL, "Digital Clock 0" },
 572};
 573
 574static int adau1761_compatibility_probe(struct device *dev)
 575{
 576	struct adau *adau = dev_get_drvdata(dev);
 577	struct regmap *regmap = adau->regmap;
 578	int val, ret = 0;
 579
 580	/* Only consider compatibility mode when ADAU1361 was specified. */
 581	if (adau->type != ADAU1361)
 582		return 0;
 583
 584	regcache_cache_bypass(regmap, true);
 585
 586	/*
 587	 * This will enable the core clock and bypass the PLL,
 588	 * so that we can access the registers for probing purposes
 589	 * (without having to set up the PLL).
 590	 */
 591	regmap_write(regmap, ADAU17X1_CLOCK_CONTROL,
 592		ADAU17X1_CLOCK_CONTROL_SYSCLK_EN);
 593
 594	/*
 595	 * ADAU17X1_SERIAL_SAMPLING_RATE doesn't exist in non-DSP chips;
 596	 * reading it results in zero at all times, and write is a no-op.
 597	 * Use this register to probe for ADAU1761.
 598	 */
 599	regmap_write(regmap, ADAU17X1_SERIAL_SAMPLING_RATE, 1);
 600	ret = regmap_read(regmap, ADAU17X1_SERIAL_SAMPLING_RATE, &val);
 601	if (ret)
 602		goto exit;
 603	if (val != 1)
 604		goto exit;
 605	regmap_write(regmap, ADAU17X1_SERIAL_SAMPLING_RATE, 0);
 606	ret = regmap_read(regmap, ADAU17X1_SERIAL_SAMPLING_RATE, &val);
 607	if (ret)
 608		goto exit;
 609	if (val != 0)
 610		goto exit;
 611
 612	adau->type = ADAU1761_AS_1361;
 613exit:
 614	/* Disable core clock after probing. */
 615	regmap_write(regmap, ADAU17X1_CLOCK_CONTROL, 0);
 616	regcache_cache_bypass(regmap, false);
 617	return ret;
 618}
 619
 620static int adau1761_set_bias_level(struct snd_soc_component *component,
 621				 enum snd_soc_bias_level level)
 622{
 623	struct adau *adau = snd_soc_component_get_drvdata(component);
 624
 625	switch (level) {
 626	case SND_SOC_BIAS_ON:
 627		break;
 628	case SND_SOC_BIAS_PREPARE:
 629		break;
 630	case SND_SOC_BIAS_STANDBY:
 631		regcache_cache_only(adau->regmap, false);
 632		regmap_update_bits(adau->regmap, ADAU17X1_CLOCK_CONTROL,
 633			ADAU17X1_CLOCK_CONTROL_SYSCLK_EN,
 634			ADAU17X1_CLOCK_CONTROL_SYSCLK_EN);
 635		if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF)
 636			regcache_sync(adau->regmap);
 637		break;
 638	case SND_SOC_BIAS_OFF:
 639		regmap_update_bits(adau->regmap, ADAU17X1_CLOCK_CONTROL,
 640			ADAU17X1_CLOCK_CONTROL_SYSCLK_EN, 0);
 641		regcache_cache_only(adau->regmap, true);
 642		break;
 643
 644	}
 645	return 0;
 646}
 647
 648static enum adau1761_output_mode adau1761_get_lineout_mode(
 649	struct snd_soc_component *component)
 650{
 651	struct adau1761_platform_data *pdata = component->dev->platform_data;
 652
 653	if (pdata)
 654		return pdata->lineout_mode;
 655
 656	return ADAU1761_OUTPUT_MODE_LINE;
 657}
 658
 659static int adau1761_setup_digmic_jackdetect(struct snd_soc_component *component)
 660{
 661	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
 662	struct adau1761_platform_data *pdata = component->dev->platform_data;
 663	struct adau *adau = snd_soc_component_get_drvdata(component);
 664	enum adau1761_digmic_jackdet_pin_mode mode;
 665	unsigned int val = 0;
 666	int ret;
 667
 668	if (pdata)
 669		mode = pdata->digmic_jackdetect_pin_mode;
 670	else
 671		mode = ADAU1761_DIGMIC_JACKDET_PIN_MODE_NONE;
 672
 673	switch (mode) {
 674	case ADAU1761_DIGMIC_JACKDET_PIN_MODE_JACKDETECT:
 675		switch (pdata->jackdetect_debounce_time) {
 676		case ADAU1761_JACKDETECT_DEBOUNCE_5MS:
 677		case ADAU1761_JACKDETECT_DEBOUNCE_10MS:
 678		case ADAU1761_JACKDETECT_DEBOUNCE_20MS:
 679		case ADAU1761_JACKDETECT_DEBOUNCE_40MS:
 680			val |= pdata->jackdetect_debounce_time << 6;
 681			break;
 682		default:
 683			return -EINVAL;
 684		}
 685		if (pdata->jackdetect_active_low)
 686			val |= ADAU1761_DIGMIC_JACKDETECT_ACTIVE_LOW;
 687
 688		ret = snd_soc_add_component_controls(component,
 689			adau1761_jack_detect_controls,
 690			ARRAY_SIZE(adau1761_jack_detect_controls));
 691		if (ret)
 692			return ret;
 693		fallthrough;
 694	case ADAU1761_DIGMIC_JACKDET_PIN_MODE_NONE:
 695		ret = snd_soc_dapm_add_routes(dapm, adau1761_no_dmic_routes,
 696			ARRAY_SIZE(adau1761_no_dmic_routes));
 697		if (ret)
 698			return ret;
 699		break;
 700	case ADAU1761_DIGMIC_JACKDET_PIN_MODE_DIGMIC:
 701		ret = snd_soc_dapm_new_controls(dapm, adau1761_dmic_widgets,
 702			ARRAY_SIZE(adau1761_dmic_widgets));
 703		if (ret)
 704			return ret;
 705
 706		ret = snd_soc_dapm_add_routes(dapm, adau1761_dmic_routes,
 707			ARRAY_SIZE(adau1761_dmic_routes));
 708		if (ret)
 709			return ret;
 710
 711		val |= ADAU1761_DIGMIC_JACKDETECT_DIGMIC;
 712		break;
 713	default:
 714		return -EINVAL;
 715	}
 716
 717	regmap_write(adau->regmap, ADAU1761_DIGMIC_JACKDETECT, val);
 718
 719	return 0;
 720}
 721
 722static int adau1761_setup_headphone_mode(struct snd_soc_component *component)
 723{
 724	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
 725	struct adau *adau = snd_soc_component_get_drvdata(component);
 726	struct adau1761_platform_data *pdata = component->dev->platform_data;
 727	enum adau1761_output_mode mode;
 728	int ret;
 729
 730	if (pdata)
 731		mode = pdata->headphone_mode;
 732	else
 733		mode = ADAU1761_OUTPUT_MODE_HEADPHONE;
 734
 735	switch (mode) {
 736	case ADAU1761_OUTPUT_MODE_LINE:
 737		break;
 738	case ADAU1761_OUTPUT_MODE_HEADPHONE_CAPLESS:
 739		regmap_update_bits(adau->regmap, ADAU1761_PLAY_MONO_OUTPUT_VOL,
 740			ADAU1761_PLAY_MONO_OUTPUT_VOL_MODE_HP |
 741			ADAU1761_PLAY_MONO_OUTPUT_VOL_UNMUTE,
 742			ADAU1761_PLAY_MONO_OUTPUT_VOL_MODE_HP |
 743			ADAU1761_PLAY_MONO_OUTPUT_VOL_UNMUTE);
 744		fallthrough;
 745	case ADAU1761_OUTPUT_MODE_HEADPHONE:
 746		regmap_update_bits(adau->regmap, ADAU1761_PLAY_HP_RIGHT_VOL,
 747			ADAU1761_PLAY_HP_RIGHT_VOL_MODE_HP,
 748			ADAU1761_PLAY_HP_RIGHT_VOL_MODE_HP);
 749		break;
 750	default:
 751		return -EINVAL;
 752	}
 753
 754	if (mode == ADAU1761_OUTPUT_MODE_HEADPHONE_CAPLESS) {
 755		ret = snd_soc_dapm_new_controls(dapm,
 756			adau1761_capless_dapm_widgets,
 757			ARRAY_SIZE(adau1761_capless_dapm_widgets));
 758		if (ret)
 759			return ret;
 760		ret = snd_soc_dapm_add_routes(dapm,
 761			adau1761_capless_dapm_routes,
 762			ARRAY_SIZE(adau1761_capless_dapm_routes));
 763	} else {
 764		ret = snd_soc_add_component_controls(component, adau1761_mono_controls,
 765			ARRAY_SIZE(adau1761_mono_controls));
 766		if (ret)
 767			return ret;
 768		ret = snd_soc_dapm_new_controls(dapm,
 769			adau1761_mono_dapm_widgets,
 770			ARRAY_SIZE(adau1761_mono_dapm_widgets));
 771		if (ret)
 772			return ret;
 773		ret = snd_soc_dapm_add_routes(dapm,
 774			adau1761_mono_dapm_routes,
 775			ARRAY_SIZE(adau1761_mono_dapm_routes));
 776	}
 777
 778	return ret;
 779}
 780
 781static bool adau1761_readable_register(struct device *dev, unsigned int reg)
 782{
 783	switch (reg) {
 784	case ADAU1761_DIGMIC_JACKDETECT:
 785	case ADAU1761_REC_MIXER_LEFT0:
 786	case ADAU1761_REC_MIXER_LEFT1:
 787	case ADAU1761_REC_MIXER_RIGHT0:
 788	case ADAU1761_REC_MIXER_RIGHT1:
 789	case ADAU1761_LEFT_DIFF_INPUT_VOL:
 790	case ADAU1761_RIGHT_DIFF_INPUT_VOL:
 791	case ADAU1761_PLAY_LR_MIXER_LEFT:
 792	case ADAU1761_PLAY_MIXER_LEFT0:
 793	case ADAU1761_PLAY_MIXER_LEFT1:
 794	case ADAU1761_PLAY_MIXER_RIGHT0:
 795	case ADAU1761_PLAY_MIXER_RIGHT1:
 796	case ADAU1761_PLAY_LR_MIXER_RIGHT:
 797	case ADAU1761_PLAY_MIXER_MONO:
 798	case ADAU1761_PLAY_HP_LEFT_VOL:
 799	case ADAU1761_PLAY_HP_RIGHT_VOL:
 800	case ADAU1761_PLAY_LINE_LEFT_VOL:
 801	case ADAU1761_PLAY_LINE_RIGHT_VOL:
 802	case ADAU1761_PLAY_MONO_OUTPUT_VOL:
 803	case ADAU1761_POP_CLICK_SUPPRESS:
 804	case ADAU1761_JACK_DETECT_PIN:
 805	case ADAU1761_DEJITTER:
 806	case ADAU1761_CLK_ENABLE0:
 807	case ADAU1761_CLK_ENABLE1:
 808	case ADAU1761_ALC_CTRL0:
 809	case ADAU1761_ALC_CTRL1:
 810	case ADAU1761_ALC_CTRL2:
 811	case ADAU1761_ALC_CTRL3:
 812		return true;
 813	default:
 814		break;
 815	}
 816
 817	return adau17x1_readable_register(dev, reg);
 818}
 819
 820static int adau1761_component_probe(struct snd_soc_component *component)
 821{
 822	struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
 823	struct adau1761_platform_data *pdata = component->dev->platform_data;
 824	struct adau *adau = snd_soc_component_get_drvdata(component);
 825	int ret;
 826
 827	ret = adau17x1_add_widgets(component);
 828	if (ret < 0)
 829		return ret;
 830
 831	if (pdata && pdata->input_differential) {
 832		regmap_update_bits(adau->regmap, ADAU1761_LEFT_DIFF_INPUT_VOL,
 833			ADAU1761_DIFF_INPUT_VOL_LDEN,
 834			ADAU1761_DIFF_INPUT_VOL_LDEN);
 835		regmap_update_bits(adau->regmap, ADAU1761_RIGHT_DIFF_INPUT_VOL,
 836			ADAU1761_DIFF_INPUT_VOL_LDEN,
 837			ADAU1761_DIFF_INPUT_VOL_LDEN);
 838		ret = snd_soc_add_component_controls(component,
 839			adau1761_differential_mode_controls,
 840			ARRAY_SIZE(adau1761_differential_mode_controls));
 841		if (ret)
 842			return ret;
 843	} else {
 844		ret = snd_soc_add_component_controls(component,
 845			adau1761_single_mode_controls,
 846			ARRAY_SIZE(adau1761_single_mode_controls));
 847		if (ret)
 848			return ret;
 849	}
 850
 851	switch (adau1761_get_lineout_mode(component)) {
 852	case ADAU1761_OUTPUT_MODE_LINE:
 853		break;
 854	case ADAU1761_OUTPUT_MODE_HEADPHONE:
 855		regmap_update_bits(adau->regmap, ADAU1761_PLAY_LINE_LEFT_VOL,
 856			ADAU1761_PLAY_LINE_LEFT_VOL_MODE_HP,
 857			ADAU1761_PLAY_LINE_LEFT_VOL_MODE_HP);
 858		regmap_update_bits(adau->regmap, ADAU1761_PLAY_LINE_RIGHT_VOL,
 859			ADAU1761_PLAY_LINE_RIGHT_VOL_MODE_HP,
 860			ADAU1761_PLAY_LINE_RIGHT_VOL_MODE_HP);
 861		break;
 862	default:
 863		return -EINVAL;
 864	}
 865
 866	ret = adau1761_setup_headphone_mode(component);
 867	if (ret)
 868		return ret;
 869
 870	ret = adau1761_setup_digmic_jackdetect(component);
 871	if (ret)
 872		return ret;
 873
 874	/*
 875	 * If we've got an ADAU1761, or an ADAU1761 operating as an
 876	 * ADAU1361, we need these non-DSP related DAPM widgets and routes.
 877	 */
 878	if (adau->type == ADAU1761 || adau->type == ADAU1761_AS_1361) {
 879		ret = snd_soc_dapm_new_controls(dapm, adau1761_dapm_widgets,
 880			ARRAY_SIZE(adau1761_dapm_widgets));
 881		if (ret)
 882			return ret;
 883
 884		ret = snd_soc_dapm_add_routes(dapm, adau1761_dapm_routes,
 885			ARRAY_SIZE(adau1761_dapm_routes));
 886		if (ret)
 887			return ret;
 888	}
 889	/*
 890	 * These routes are DSP related and only used when we have a
 891	 * bona fide ADAU1761.
 892	 */
 893	if (adau->type == ADAU1761) {
 894		ret = snd_soc_dapm_add_routes(dapm, adau1761_dapm_dsp_routes,
 895			ARRAY_SIZE(adau1761_dapm_dsp_routes));
 896		if (ret)
 897			return ret;
 898	}
 899	/*
 900	 * In the ADAU1761, by default, the AIF is routed to the DSP, whereas
 901	 * for the ADAU1361, the AIF is permanently routed to the ADC and DAC.
 902	 * Thus, if we have an ADAU1761 masquerading as an ADAU1361,
 903	 * we need to explicitly route the AIF to the ADC and DAC.
 904	 * For the ADAU1761, this is normally done by set_tdm_slot, but this
 905	 * function is not necessarily called during stream setup, so set up
 906	 * the compatible AIF routings here from the start.
 907	 */
 908	if  (adau->type == ADAU1761_AS_1361) {
 909		regmap_write(adau->regmap, ADAU17X1_SERIAL_INPUT_ROUTE, 0x01);
 910		regmap_write(adau->regmap, ADAU17X1_SERIAL_OUTPUT_ROUTE, 0x01);
 911	}
 912	ret = adau17x1_add_routes(component);
 913	if (ret < 0)
 914		return ret;
 915
 916	return 0;
 917}
 918
 919static const struct snd_soc_component_driver adau1761_component_driver = {
 920	.probe			= adau1761_component_probe,
 921	.resume			= adau17x1_resume,
 922	.set_bias_level		= adau1761_set_bias_level,
 923	.controls		= adau1761_controls,
 924	.num_controls		= ARRAY_SIZE(adau1761_controls),
 925	.dapm_widgets		= adau1x61_dapm_widgets,
 926	.num_dapm_widgets	= ARRAY_SIZE(adau1x61_dapm_widgets),
 927	.dapm_routes		= adau1x61_dapm_routes,
 928	.num_dapm_routes	= ARRAY_SIZE(adau1x61_dapm_routes),
 929	.suspend_bias_off	= 1,
 930	.idle_bias_on		= 1,
 931	.use_pmdown_time	= 1,
 932	.endianness		= 1,
 933};
 934
 935#define ADAU1761_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | \
 936	SNDRV_PCM_FMTBIT_S32_LE)
 937
 938static struct snd_soc_dai_driver adau1361_dai_driver = {
 939	.name = "adau-hifi",
 940	.playback = {
 941		.stream_name = "Playback",
 942		.channels_min = 2,
 943		.channels_max = 4,
 944		.rates = SNDRV_PCM_RATE_8000_96000,
 945		.formats = ADAU1761_FORMATS,
 946	},
 947	.capture = {
 948		.stream_name = "Capture",
 949		.channels_min = 2,
 950		.channels_max = 4,
 951		.rates = SNDRV_PCM_RATE_8000_96000,
 952		.formats = ADAU1761_FORMATS,
 953	},
 954	.ops = &adau17x1_dai_ops,
 955};
 956
 957static struct snd_soc_dai_driver adau1761_dai_driver = {
 958	.name = "adau-hifi",
 959	.playback = {
 960		.stream_name = "Playback",
 961		.channels_min = 2,
 962		.channels_max = 8,
 963		.rates = SNDRV_PCM_RATE_8000_96000,
 964		.formats = ADAU1761_FORMATS,
 965	},
 966	.capture = {
 967		.stream_name = "Capture",
 968		.channels_min = 2,
 969		.channels_max = 8,
 970		.rates = SNDRV_PCM_RATE_8000_96000,
 971		.formats = ADAU1761_FORMATS,
 972	},
 973	.ops = &adau17x1_dai_ops,
 974};
 975
 976int adau1761_probe(struct device *dev, struct regmap *regmap,
 977	enum adau17x1_type type, void (*switch_mode)(struct device *dev))
 978{
 979	struct snd_soc_dai_driver *dai_drv;
 980	const char *firmware_name;
 981	int ret;
 982
 983	if (type == ADAU1361) {
 984		dai_drv = &adau1361_dai_driver;
 985		firmware_name = NULL;
 986	} else {
 987		dai_drv = &adau1761_dai_driver;
 988		firmware_name = ADAU1761_FIRMWARE;
 989	}
 990
 991	ret = adau17x1_probe(dev, regmap, type, switch_mode, firmware_name);
 992	if (ret)
 993		return ret;
 994
 995	ret = adau1761_compatibility_probe(dev);
 996	if (ret)
 997		return ret;
 998
 999	/* Enable cache only mode as we could miss writes before bias level
1000	 * reaches standby and the core clock is enabled */
1001	regcache_cache_only(regmap, true);
1002
1003	return devm_snd_soc_register_component(dev, &adau1761_component_driver,
1004					       dai_drv, 1);
1005}
1006EXPORT_SYMBOL_GPL(adau1761_probe);
1007
1008const struct regmap_config adau1761_regmap_config = {
1009	.val_bits = 8,
1010	.reg_bits = 16,
1011	.max_register = 0x40fa,
1012	.reg_defaults = adau1761_reg_defaults,
1013	.num_reg_defaults = ARRAY_SIZE(adau1761_reg_defaults),
1014	.readable_reg = adau1761_readable_register,
1015	.volatile_reg = adau17x1_volatile_register,
1016	.precious_reg = adau17x1_precious_register,
1017	.cache_type = REGCACHE_MAPLE,
1018};
1019EXPORT_SYMBOL_GPL(adau1761_regmap_config);
1020
1021MODULE_DESCRIPTION("ASoC ADAU1361/ADAU1461/ADAU1761/ADAU1961 CODEC driver");
1022MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
1023MODULE_LICENSE("GPL");
v4.10.11
 
  1/*
  2 * Driver for ADAU1361/ADAU1461/ADAU1761/ADAU1961 codec
  3 *
  4 * Copyright 2011-2013 Analog Devices Inc.
  5 * Author: Lars-Peter Clausen <lars@metafoo.de>
  6 *
  7 * Licensed under the GPL-2 or later.
  8 */
  9
 10#include <linux/module.h>
 11#include <linux/init.h>
 12#include <linux/i2c.h>
 13#include <linux/spi/spi.h>
 14#include <linux/slab.h>
 15#include <sound/core.h>
 16#include <sound/pcm.h>
 17#include <sound/pcm_params.h>
 18#include <sound/soc.h>
 19#include <sound/tlv.h>
 20#include <linux/platform_data/adau17x1.h>
 21
 22#include "adau17x1.h"
 23#include "adau1761.h"
 24
 25#define ADAU1761_DIGMIC_JACKDETECT	0x4008
 26#define ADAU1761_REC_MIXER_LEFT0	0x400a
 27#define ADAU1761_REC_MIXER_LEFT1	0x400b
 28#define ADAU1761_REC_MIXER_RIGHT0	0x400c
 29#define ADAU1761_REC_MIXER_RIGHT1	0x400d
 30#define ADAU1761_LEFT_DIFF_INPUT_VOL	0x400e
 31#define ADAU1761_RIGHT_DIFF_INPUT_VOL	0x400f
 
 
 
 
 32#define ADAU1761_PLAY_LR_MIXER_LEFT	0x4020
 33#define ADAU1761_PLAY_MIXER_LEFT0	0x401c
 34#define ADAU1761_PLAY_MIXER_LEFT1	0x401d
 35#define ADAU1761_PLAY_MIXER_RIGHT0	0x401e
 36#define ADAU1761_PLAY_MIXER_RIGHT1	0x401f
 37#define ADAU1761_PLAY_LR_MIXER_RIGHT	0x4021
 38#define ADAU1761_PLAY_MIXER_MONO	0x4022
 39#define ADAU1761_PLAY_HP_LEFT_VOL	0x4023
 40#define ADAU1761_PLAY_HP_RIGHT_VOL	0x4024
 41#define ADAU1761_PLAY_LINE_LEFT_VOL	0x4025
 42#define ADAU1761_PLAY_LINE_RIGHT_VOL	0x4026
 43#define ADAU1761_PLAY_MONO_OUTPUT_VOL	0x4027
 44#define ADAU1761_POP_CLICK_SUPPRESS	0x4028
 45#define ADAU1761_JACK_DETECT_PIN	0x4031
 46#define ADAU1761_DEJITTER		0x4036
 47#define ADAU1761_CLK_ENABLE0		0x40f9
 48#define ADAU1761_CLK_ENABLE1		0x40fa
 49
 50#define ADAU1761_DIGMIC_JACKDETECT_ACTIVE_LOW	BIT(0)
 51#define ADAU1761_DIGMIC_JACKDETECT_DIGMIC	BIT(5)
 52
 53#define ADAU1761_DIFF_INPUT_VOL_LDEN		BIT(0)
 54
 55#define ADAU1761_PLAY_MONO_OUTPUT_VOL_MODE_HP	BIT(0)
 56#define ADAU1761_PLAY_MONO_OUTPUT_VOL_UNMUTE	BIT(1)
 57
 58#define ADAU1761_PLAY_HP_RIGHT_VOL_MODE_HP	BIT(0)
 59
 60#define ADAU1761_PLAY_LINE_LEFT_VOL_MODE_HP	BIT(0)
 61
 62#define ADAU1761_PLAY_LINE_RIGHT_VOL_MODE_HP	BIT(0)
 63
 64
 65#define ADAU1761_FIRMWARE "adau1761.bin"
 66
 67static const struct reg_default adau1761_reg_defaults[] = {
 68	{ ADAU1761_DEJITTER,			0x03 },
 69	{ ADAU1761_DIGMIC_JACKDETECT,		0x00 },
 70	{ ADAU1761_REC_MIXER_LEFT0,		0x00 },
 71	{ ADAU1761_REC_MIXER_LEFT1,		0x00 },
 72	{ ADAU1761_REC_MIXER_RIGHT0,		0x00 },
 73	{ ADAU1761_REC_MIXER_RIGHT1,		0x00 },
 74	{ ADAU1761_LEFT_DIFF_INPUT_VOL,		0x00 },
 
 
 
 
 75	{ ADAU1761_RIGHT_DIFF_INPUT_VOL,	0x00 },
 76	{ ADAU1761_PLAY_LR_MIXER_LEFT,		0x00 },
 77	{ ADAU1761_PLAY_MIXER_LEFT0,		0x00 },
 78	{ ADAU1761_PLAY_MIXER_LEFT1,		0x00 },
 79	{ ADAU1761_PLAY_MIXER_RIGHT0,		0x00 },
 80	{ ADAU1761_PLAY_MIXER_RIGHT1,		0x00 },
 81	{ ADAU1761_PLAY_LR_MIXER_RIGHT,		0x00 },
 82	{ ADAU1761_PLAY_MIXER_MONO,		0x00 },
 83	{ ADAU1761_PLAY_HP_LEFT_VOL,		0x00 },
 84	{ ADAU1761_PLAY_HP_RIGHT_VOL,		0x00 },
 85	{ ADAU1761_PLAY_LINE_LEFT_VOL,		0x00 },
 86	{ ADAU1761_PLAY_LINE_RIGHT_VOL,		0x00 },
 87	{ ADAU1761_PLAY_MONO_OUTPUT_VOL,	0x00 },
 88	{ ADAU1761_POP_CLICK_SUPPRESS,		0x00 },
 89	{ ADAU1761_JACK_DETECT_PIN,		0x00 },
 90	{ ADAU1761_CLK_ENABLE0,			0x00 },
 91	{ ADAU1761_CLK_ENABLE1,			0x00 },
 92	{ ADAU17X1_CLOCK_CONTROL,		0x00 },
 93	{ ADAU17X1_PLL_CONTROL,			0x00 },
 94	{ ADAU17X1_REC_POWER_MGMT,		0x00 },
 95	{ ADAU17X1_MICBIAS,			0x00 },
 96	{ ADAU17X1_SERIAL_PORT0,		0x00 },
 97	{ ADAU17X1_SERIAL_PORT1,		0x00 },
 98	{ ADAU17X1_CONVERTER0,			0x00 },
 99	{ ADAU17X1_CONVERTER1,			0x00 },
100	{ ADAU17X1_LEFT_INPUT_DIGITAL_VOL,	0x00 },
101	{ ADAU17X1_RIGHT_INPUT_DIGITAL_VOL,	0x00 },
102	{ ADAU17X1_ADC_CONTROL,			0x00 },
103	{ ADAU17X1_PLAY_POWER_MGMT,		0x00 },
104	{ ADAU17X1_DAC_CONTROL0,		0x00 },
105	{ ADAU17X1_DAC_CONTROL1,		0x00 },
106	{ ADAU17X1_DAC_CONTROL2,		0x00 },
107	{ ADAU17X1_SERIAL_PORT_PAD,		0xaa },
108	{ ADAU17X1_CONTROL_PORT_PAD0,		0xaa },
109	{ ADAU17X1_CONTROL_PORT_PAD1,		0x00 },
110	{ ADAU17X1_DSP_SAMPLING_RATE,		0x01 },
111	{ ADAU17X1_SERIAL_INPUT_ROUTE,		0x00 },
112	{ ADAU17X1_SERIAL_OUTPUT_ROUTE,		0x00 },
113	{ ADAU17X1_DSP_ENABLE,			0x00 },
114	{ ADAU17X1_DSP_RUN,			0x00 },
115	{ ADAU17X1_SERIAL_SAMPLING_RATE,	0x00 },
116};
117
118static const DECLARE_TLV_DB_SCALE(adau1761_sing_in_tlv, -1500, 300, 1);
119static const DECLARE_TLV_DB_SCALE(adau1761_diff_in_tlv, -1200, 75, 0);
120static const DECLARE_TLV_DB_SCALE(adau1761_out_tlv, -5700, 100, 0);
121static const DECLARE_TLV_DB_SCALE(adau1761_sidetone_tlv, -1800, 300, 1);
122static const DECLARE_TLV_DB_SCALE(adau1761_boost_tlv, -600, 600, 1);
123static const DECLARE_TLV_DB_SCALE(adau1761_pga_boost_tlv, -2000, 2000, 1);
124
 
 
 
 
125static const unsigned int adau1761_bias_select_values[] = {
126	0, 2, 3,
127};
128
129static const char * const adau1761_bias_select_text[] = {
130	"Normal operation", "Enhanced performance", "Power saving",
131};
132
133static const char * const adau1761_bias_select_extreme_text[] = {
134	"Normal operation", "Extreme power saving", "Enhanced performance",
135	"Power saving",
136};
137
138static SOC_ENUM_SINGLE_DECL(adau1761_adc_bias_enum,
139		ADAU17X1_REC_POWER_MGMT, 3, adau1761_bias_select_extreme_text);
140static SOC_ENUM_SINGLE_DECL(adau1761_hp_bias_enum,
141		ADAU17X1_PLAY_POWER_MGMT, 6, adau1761_bias_select_extreme_text);
142static SOC_ENUM_SINGLE_DECL(adau1761_dac_bias_enum,
143		ADAU17X1_PLAY_POWER_MGMT, 4, adau1761_bias_select_extreme_text);
144static SOC_VALUE_ENUM_SINGLE_DECL(adau1761_playback_bias_enum,
145		ADAU17X1_PLAY_POWER_MGMT, 2, 0x3, adau1761_bias_select_text,
146		adau1761_bias_select_values);
147static SOC_VALUE_ENUM_SINGLE_DECL(adau1761_capture_bias_enum,
148		ADAU17X1_REC_POWER_MGMT, 1, 0x3, adau1761_bias_select_text,
149		adau1761_bias_select_values);
150
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151static const struct snd_kcontrol_new adau1761_jack_detect_controls[] = {
152	SOC_SINGLE("Speaker Auto-mute Switch", ADAU1761_DIGMIC_JACKDETECT,
153		4, 1, 0),
154};
155
156static const struct snd_kcontrol_new adau1761_differential_mode_controls[] = {
157	SOC_DOUBLE_R_TLV("Capture Volume", ADAU1761_LEFT_DIFF_INPUT_VOL,
158		ADAU1761_RIGHT_DIFF_INPUT_VOL, 2, 0x3f, 0,
159		adau1761_diff_in_tlv),
160	SOC_DOUBLE_R("Capture Switch", ADAU1761_LEFT_DIFF_INPUT_VOL,
161		ADAU1761_RIGHT_DIFF_INPUT_VOL, 1, 1, 0),
162
163	SOC_DOUBLE_R_TLV("PGA Boost Capture Volume", ADAU1761_REC_MIXER_LEFT1,
164		ADAU1761_REC_MIXER_RIGHT1, 3, 2, 0, adau1761_pga_boost_tlv),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
165};
166
167static const struct snd_kcontrol_new adau1761_single_mode_controls[] = {
168	SOC_SINGLE_TLV("Input 1 Capture Volume", ADAU1761_REC_MIXER_LEFT0,
169		4, 7, 0, adau1761_sing_in_tlv),
170	SOC_SINGLE_TLV("Input 2 Capture Volume", ADAU1761_REC_MIXER_LEFT0,
171		1, 7, 0, adau1761_sing_in_tlv),
172	SOC_SINGLE_TLV("Input 3 Capture Volume", ADAU1761_REC_MIXER_RIGHT0,
173		4, 7, 0, adau1761_sing_in_tlv),
174	SOC_SINGLE_TLV("Input 4 Capture Volume", ADAU1761_REC_MIXER_RIGHT0,
175		1, 7, 0, adau1761_sing_in_tlv),
176};
177
178static const struct snd_kcontrol_new adau1761_controls[] = {
179	SOC_DOUBLE_R_TLV("Aux Capture Volume", ADAU1761_REC_MIXER_LEFT1,
180		ADAU1761_REC_MIXER_RIGHT1, 0, 7, 0, adau1761_sing_in_tlv),
181
182	SOC_DOUBLE_R_TLV("Headphone Playback Volume", ADAU1761_PLAY_HP_LEFT_VOL,
183		ADAU1761_PLAY_HP_RIGHT_VOL, 2, 0x3f, 0, adau1761_out_tlv),
184	SOC_DOUBLE_R("Headphone Playback Switch", ADAU1761_PLAY_HP_LEFT_VOL,
185		ADAU1761_PLAY_HP_RIGHT_VOL, 1, 1, 0),
186	SOC_DOUBLE_R_TLV("Lineout Playback Volume", ADAU1761_PLAY_LINE_LEFT_VOL,
187		ADAU1761_PLAY_LINE_RIGHT_VOL, 2, 0x3f, 0, adau1761_out_tlv),
188	SOC_DOUBLE_R("Lineout Playback Switch", ADAU1761_PLAY_LINE_LEFT_VOL,
189		ADAU1761_PLAY_LINE_RIGHT_VOL, 1, 1, 0),
190
191	SOC_ENUM("ADC Bias", adau1761_adc_bias_enum),
192	SOC_ENUM("DAC Bias", adau1761_dac_bias_enum),
193	SOC_ENUM("Capture Bias", adau1761_capture_bias_enum),
194	SOC_ENUM("Playback Bias", adau1761_playback_bias_enum),
195	SOC_ENUM("Headphone Bias", adau1761_hp_bias_enum),
196};
197
198static const struct snd_kcontrol_new adau1761_mono_controls[] = {
199	SOC_SINGLE_TLV("Mono Playback Volume", ADAU1761_PLAY_MONO_OUTPUT_VOL,
200		2, 0x3f, 0, adau1761_out_tlv),
201	SOC_SINGLE("Mono Playback Switch", ADAU1761_PLAY_MONO_OUTPUT_VOL,
202		1, 1, 0),
203};
204
205static const struct snd_kcontrol_new adau1761_left_mixer_controls[] = {
206	SOC_DAPM_SINGLE_AUTODISABLE("Left DAC Switch",
207		ADAU1761_PLAY_MIXER_LEFT0, 5, 1, 0),
208	SOC_DAPM_SINGLE_AUTODISABLE("Right DAC Switch",
209		ADAU1761_PLAY_MIXER_LEFT0, 6, 1, 0),
210	SOC_DAPM_SINGLE_TLV("Aux Bypass Volume",
211		ADAU1761_PLAY_MIXER_LEFT0, 1, 8, 0, adau1761_sidetone_tlv),
212	SOC_DAPM_SINGLE_TLV("Right Bypass Volume",
213		ADAU1761_PLAY_MIXER_LEFT1, 4, 8, 0, adau1761_sidetone_tlv),
214	SOC_DAPM_SINGLE_TLV("Left Bypass Volume",
215		ADAU1761_PLAY_MIXER_LEFT1, 0, 8, 0, adau1761_sidetone_tlv),
216};
217
218static const struct snd_kcontrol_new adau1761_right_mixer_controls[] = {
219	SOC_DAPM_SINGLE_AUTODISABLE("Left DAC Switch",
220		ADAU1761_PLAY_MIXER_RIGHT0, 5, 1, 0),
221	SOC_DAPM_SINGLE_AUTODISABLE("Right DAC Switch",
222		ADAU1761_PLAY_MIXER_RIGHT0, 6, 1, 0),
223	SOC_DAPM_SINGLE_TLV("Aux Bypass Volume",
224		ADAU1761_PLAY_MIXER_RIGHT0, 1, 8, 0, adau1761_sidetone_tlv),
225	SOC_DAPM_SINGLE_TLV("Right Bypass Volume",
226		ADAU1761_PLAY_MIXER_RIGHT1, 4, 8, 0, adau1761_sidetone_tlv),
227	SOC_DAPM_SINGLE_TLV("Left Bypass Volume",
228		ADAU1761_PLAY_MIXER_RIGHT1, 0, 8, 0, adau1761_sidetone_tlv),
229};
230
231static const struct snd_kcontrol_new adau1761_left_lr_mixer_controls[] = {
232	SOC_DAPM_SINGLE_TLV("Left Volume",
233		ADAU1761_PLAY_LR_MIXER_LEFT, 1, 2, 0, adau1761_boost_tlv),
234	SOC_DAPM_SINGLE_TLV("Right Volume",
235		ADAU1761_PLAY_LR_MIXER_LEFT, 3, 2, 0, adau1761_boost_tlv),
236};
237
238static const struct snd_kcontrol_new adau1761_right_lr_mixer_controls[] = {
239	SOC_DAPM_SINGLE_TLV("Left Volume",
240		ADAU1761_PLAY_LR_MIXER_RIGHT, 1, 2, 0, adau1761_boost_tlv),
241	SOC_DAPM_SINGLE_TLV("Right Volume",
242		ADAU1761_PLAY_LR_MIXER_RIGHT, 3, 2, 0, adau1761_boost_tlv),
243};
244
245static const char * const adau1761_input_mux_text[] = {
246	"ADC", "DMIC",
247};
248
249static SOC_ENUM_SINGLE_DECL(adau1761_input_mux_enum,
250	ADAU17X1_ADC_CONTROL, 2, adau1761_input_mux_text);
251
252static const struct snd_kcontrol_new adau1761_input_mux_control =
253	SOC_DAPM_ENUM("Input Select", adau1761_input_mux_enum);
254
255static int adau1761_dejitter_fixup(struct snd_soc_dapm_widget *w,
256	struct snd_kcontrol *kcontrol, int event)
257{
258	struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
259	struct adau *adau = snd_soc_codec_get_drvdata(codec);
260
261	/* After any power changes have been made the dejitter circuit
262	 * has to be reinitialized. */
263	regmap_write(adau->regmap, ADAU1761_DEJITTER, 0);
264	if (!adau->master)
265		regmap_write(adau->regmap, ADAU1761_DEJITTER, 3);
266
267	return 0;
268}
269
270static const struct snd_soc_dapm_widget adau1x61_dapm_widgets[] = {
271	SND_SOC_DAPM_MIXER("Left Input Mixer", ADAU1761_REC_MIXER_LEFT0, 0, 0,
272		NULL, 0),
273	SND_SOC_DAPM_MIXER("Right Input Mixer", ADAU1761_REC_MIXER_RIGHT0, 0, 0,
274		NULL, 0),
275
276	SOC_MIXER_ARRAY("Left Playback Mixer", ADAU1761_PLAY_MIXER_LEFT0,
277		0, 0, adau1761_left_mixer_controls),
278	SOC_MIXER_ARRAY("Right Playback Mixer", ADAU1761_PLAY_MIXER_RIGHT0,
279		0, 0, adau1761_right_mixer_controls),
280	SOC_MIXER_ARRAY("Left LR Playback Mixer", ADAU1761_PLAY_LR_MIXER_LEFT,
281		0, 0, adau1761_left_lr_mixer_controls),
282	SOC_MIXER_ARRAY("Right LR Playback Mixer", ADAU1761_PLAY_LR_MIXER_RIGHT,
283		0, 0, adau1761_right_lr_mixer_controls),
284
285	SND_SOC_DAPM_SUPPLY("Headphone", ADAU1761_PLAY_HP_LEFT_VOL,
286		0, 0, NULL, 0),
287
288	SND_SOC_DAPM_SUPPLY_S("SYSCLK", 2, SND_SOC_NOPM, 0, 0, NULL, 0),
289
290	SND_SOC_DAPM_POST("Dejitter fixup", adau1761_dejitter_fixup),
291
292	SND_SOC_DAPM_INPUT("LAUX"),
293	SND_SOC_DAPM_INPUT("RAUX"),
294	SND_SOC_DAPM_INPUT("LINP"),
295	SND_SOC_DAPM_INPUT("LINN"),
296	SND_SOC_DAPM_INPUT("RINP"),
297	SND_SOC_DAPM_INPUT("RINN"),
298
299	SND_SOC_DAPM_OUTPUT("LOUT"),
300	SND_SOC_DAPM_OUTPUT("ROUT"),
301	SND_SOC_DAPM_OUTPUT("LHP"),
302	SND_SOC_DAPM_OUTPUT("RHP"),
303};
304
305static const struct snd_soc_dapm_widget adau1761_mono_dapm_widgets[] = {
306	SND_SOC_DAPM_MIXER("Mono Playback Mixer", ADAU1761_PLAY_MIXER_MONO,
307		0, 0, NULL, 0),
308
309	SND_SOC_DAPM_OUTPUT("MONOOUT"),
310};
311
312static const struct snd_soc_dapm_widget adau1761_capless_dapm_widgets[] = {
313	SND_SOC_DAPM_SUPPLY_S("Headphone VGND", 1, ADAU1761_PLAY_MIXER_MONO,
314		0, 0, NULL, 0),
315};
316
317static const struct snd_soc_dapm_route adau1x61_dapm_routes[] = {
318	{ "Left Input Mixer", NULL, "LINP" },
319	{ "Left Input Mixer", NULL, "LINN" },
320	{ "Left Input Mixer", NULL, "LAUX" },
321
322	{ "Right Input Mixer", NULL, "RINP" },
323	{ "Right Input Mixer", NULL, "RINN" },
324	{ "Right Input Mixer", NULL, "RAUX" },
325
326	{ "Left Playback Mixer", NULL, "Left Playback Enable"},
327	{ "Right Playback Mixer", NULL, "Right Playback Enable"},
328	{ "Left LR Playback Mixer", NULL, "Left Playback Enable"},
329	{ "Right LR Playback Mixer", NULL, "Right Playback Enable"},
330
331	{ "Left Playback Mixer", "Left DAC Switch", "Left DAC" },
332	{ "Left Playback Mixer", "Right DAC Switch", "Right DAC" },
333
334	{ "Right Playback Mixer", "Left DAC Switch", "Left DAC" },
335	{ "Right Playback Mixer", "Right DAC Switch", "Right DAC" },
336
337	{ "Left LR Playback Mixer", "Left Volume", "Left Playback Mixer" },
338	{ "Left LR Playback Mixer", "Right Volume", "Right Playback Mixer" },
339
340	{ "Right LR Playback Mixer", "Left Volume", "Left Playback Mixer" },
341	{ "Right LR Playback Mixer", "Right Volume", "Right Playback Mixer" },
342
343	{ "LHP", NULL, "Left Playback Mixer" },
344	{ "RHP", NULL, "Right Playback Mixer" },
345
346	{ "LHP", NULL, "Headphone" },
347	{ "RHP", NULL, "Headphone" },
348
349	{ "LOUT", NULL, "Left LR Playback Mixer" },
350	{ "ROUT", NULL, "Right LR Playback Mixer" },
351
352	{ "Left Playback Mixer", "Aux Bypass Volume", "LAUX" },
353	{ "Left Playback Mixer", "Left Bypass Volume", "Left Input Mixer" },
354	{ "Left Playback Mixer", "Right Bypass Volume", "Right Input Mixer" },
355	{ "Right Playback Mixer", "Aux Bypass Volume", "RAUX" },
356	{ "Right Playback Mixer", "Left Bypass Volume", "Left Input Mixer" },
357	{ "Right Playback Mixer", "Right Bypass Volume", "Right Input Mixer" },
358};
359
360static const struct snd_soc_dapm_route adau1761_mono_dapm_routes[] = {
361	{ "Mono Playback Mixer", NULL, "Left Playback Mixer" },
362	{ "Mono Playback Mixer", NULL, "Right Playback Mixer" },
363
364	{ "MONOOUT", NULL, "Mono Playback Mixer" },
365};
366
367static const struct snd_soc_dapm_route adau1761_capless_dapm_routes[] = {
368	{ "Headphone", NULL, "Headphone VGND" },
369};
370
371static const struct snd_soc_dapm_widget adau1761_dmic_widgets[] = {
372	SND_SOC_DAPM_MUX("Left Decimator Mux", SND_SOC_NOPM, 0, 0,
373		&adau1761_input_mux_control),
374	SND_SOC_DAPM_MUX("Right Decimator Mux", SND_SOC_NOPM, 0, 0,
375		&adau1761_input_mux_control),
376
377	SND_SOC_DAPM_INPUT("DMIC"),
378};
379
380static const struct snd_soc_dapm_route adau1761_dmic_routes[] = {
381	{ "Left Decimator Mux", "ADC", "Left Input Mixer" },
382	{ "Left Decimator Mux", "DMIC", "DMIC" },
383	{ "Right Decimator Mux", "ADC", "Right Input Mixer" },
384	{ "Right Decimator Mux", "DMIC", "DMIC" },
385
386	{ "Left Decimator", NULL, "Left Decimator Mux" },
387	{ "Right Decimator", NULL, "Right Decimator Mux" },
388};
389
390static const struct snd_soc_dapm_route adau1761_no_dmic_routes[] = {
391	{ "Left Decimator", NULL, "Left Input Mixer" },
392	{ "Right Decimator", NULL, "Right Input Mixer" },
393};
394
395static const struct snd_soc_dapm_widget adau1761_dapm_widgets[] = {
396	SND_SOC_DAPM_SUPPLY("Serial Port Clock", ADAU1761_CLK_ENABLE0,
397		0, 0, NULL, 0),
398	SND_SOC_DAPM_SUPPLY("Serial Input Routing Clock", ADAU1761_CLK_ENABLE0,
399		1, 0, NULL, 0),
400	SND_SOC_DAPM_SUPPLY("Serial Output Routing Clock", ADAU1761_CLK_ENABLE0,
401		3, 0, NULL, 0),
402
403	SND_SOC_DAPM_SUPPLY("Decimator Resync Clock", ADAU1761_CLK_ENABLE0,
404		4, 0, NULL, 0),
405	SND_SOC_DAPM_SUPPLY("Interpolator Resync Clock", ADAU1761_CLK_ENABLE0,
406		2, 0, NULL, 0),
407
408	SND_SOC_DAPM_SUPPLY("Slew Clock", ADAU1761_CLK_ENABLE0, 6, 0, NULL, 0),
409	SND_SOC_DAPM_SUPPLY("ALC Clock", ADAU1761_CLK_ENABLE0, 5, 0, NULL, 0),
410
411	SND_SOC_DAPM_SUPPLY_S("Digital Clock 0", 1, ADAU1761_CLK_ENABLE1,
412		0, 0, NULL, 0),
413	SND_SOC_DAPM_SUPPLY_S("Digital Clock 1", 1, ADAU1761_CLK_ENABLE1,
414		1, 0, NULL, 0),
415};
416
417static const struct snd_soc_dapm_route adau1761_dapm_routes[] = {
418	{ "Left Decimator", NULL, "Digital Clock 0", },
419	{ "Right Decimator", NULL, "Digital Clock 0", },
420	{ "Left DAC", NULL, "Digital Clock 0", },
421	{ "Right DAC", NULL, "Digital Clock 0", },
422
423	{ "AIFCLK", NULL, "Digital Clock 1" },
424
425	{ "Playback", NULL, "Serial Port Clock" },
426	{ "Capture", NULL, "Serial Port Clock" },
427	{ "Playback", NULL, "Serial Input Routing Clock" },
428	{ "Capture", NULL, "Serial Output Routing Clock" },
429
430	{ "Left Decimator", NULL, "Decimator Resync Clock" },
431	{ "Right Decimator", NULL, "Decimator Resync Clock" },
432	{ "Left DAC", NULL, "Interpolator Resync Clock" },
433	{ "Right DAC", NULL, "Interpolator Resync Clock" },
434
435	{ "DSP", NULL, "Digital Clock 0" },
436
437	{ "Slew Clock", NULL, "Digital Clock 0" },
438	{ "Right Playback Mixer", NULL, "Slew Clock" },
439	{ "Left Playback Mixer", NULL, "Slew Clock" },
440
441	{ "Left Input Mixer", NULL, "ALC Clock" },
442	{ "Right Input Mixer", NULL, "ALC Clock" },
443
444	{ "Digital Clock 0", NULL, "SYSCLK" },
445	{ "Digital Clock 1", NULL, "SYSCLK" },
446};
447
448static int adau1761_set_bias_level(struct snd_soc_codec *codec,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
449				 enum snd_soc_bias_level level)
450{
451	struct adau *adau = snd_soc_codec_get_drvdata(codec);
452
453	switch (level) {
454	case SND_SOC_BIAS_ON:
455		break;
456	case SND_SOC_BIAS_PREPARE:
457		break;
458	case SND_SOC_BIAS_STANDBY:
459		regcache_cache_only(adau->regmap, false);
460		regmap_update_bits(adau->regmap, ADAU17X1_CLOCK_CONTROL,
461			ADAU17X1_CLOCK_CONTROL_SYSCLK_EN,
462			ADAU17X1_CLOCK_CONTROL_SYSCLK_EN);
463		if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF)
464			regcache_sync(adau->regmap);
465		break;
466	case SND_SOC_BIAS_OFF:
467		regmap_update_bits(adau->regmap, ADAU17X1_CLOCK_CONTROL,
468			ADAU17X1_CLOCK_CONTROL_SYSCLK_EN, 0);
469		regcache_cache_only(adau->regmap, true);
470		break;
471
472	}
473	return 0;
474}
475
476static enum adau1761_output_mode adau1761_get_lineout_mode(
477	struct snd_soc_codec *codec)
478{
479	struct adau1761_platform_data *pdata = codec->dev->platform_data;
480
481	if (pdata)
482		return pdata->lineout_mode;
483
484	return ADAU1761_OUTPUT_MODE_LINE;
485}
486
487static int adau1761_setup_digmic_jackdetect(struct snd_soc_codec *codec)
488{
489	struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
490	struct adau1761_platform_data *pdata = codec->dev->platform_data;
491	struct adau *adau = snd_soc_codec_get_drvdata(codec);
492	enum adau1761_digmic_jackdet_pin_mode mode;
493	unsigned int val = 0;
494	int ret;
495
496	if (pdata)
497		mode = pdata->digmic_jackdetect_pin_mode;
498	else
499		mode = ADAU1761_DIGMIC_JACKDET_PIN_MODE_NONE;
500
501	switch (mode) {
502	case ADAU1761_DIGMIC_JACKDET_PIN_MODE_JACKDETECT:
503		switch (pdata->jackdetect_debounce_time) {
504		case ADAU1761_JACKDETECT_DEBOUNCE_5MS:
505		case ADAU1761_JACKDETECT_DEBOUNCE_10MS:
506		case ADAU1761_JACKDETECT_DEBOUNCE_20MS:
507		case ADAU1761_JACKDETECT_DEBOUNCE_40MS:
508			val |= pdata->jackdetect_debounce_time << 6;
509			break;
510		default:
511			return -EINVAL;
512		}
513		if (pdata->jackdetect_active_low)
514			val |= ADAU1761_DIGMIC_JACKDETECT_ACTIVE_LOW;
515
516		ret = snd_soc_add_codec_controls(codec,
517			adau1761_jack_detect_controls,
518			ARRAY_SIZE(adau1761_jack_detect_controls));
519		if (ret)
520			return ret;
521	case ADAU1761_DIGMIC_JACKDET_PIN_MODE_NONE: /* fallthrough */
 
522		ret = snd_soc_dapm_add_routes(dapm, adau1761_no_dmic_routes,
523			ARRAY_SIZE(adau1761_no_dmic_routes));
524		if (ret)
525			return ret;
526		break;
527	case ADAU1761_DIGMIC_JACKDET_PIN_MODE_DIGMIC:
528		ret = snd_soc_dapm_new_controls(dapm, adau1761_dmic_widgets,
529			ARRAY_SIZE(adau1761_dmic_widgets));
530		if (ret)
531			return ret;
532
533		ret = snd_soc_dapm_add_routes(dapm, adau1761_dmic_routes,
534			ARRAY_SIZE(adau1761_dmic_routes));
535		if (ret)
536			return ret;
537
538		val |= ADAU1761_DIGMIC_JACKDETECT_DIGMIC;
539		break;
540	default:
541		return -EINVAL;
542	}
543
544	regmap_write(adau->regmap, ADAU1761_DIGMIC_JACKDETECT, val);
545
546	return 0;
547}
548
549static int adau1761_setup_headphone_mode(struct snd_soc_codec *codec)
550{
551	struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
552	struct adau *adau = snd_soc_codec_get_drvdata(codec);
553	struct adau1761_platform_data *pdata = codec->dev->platform_data;
554	enum adau1761_output_mode mode;
555	int ret;
556
557	if (pdata)
558		mode = pdata->headphone_mode;
559	else
560		mode = ADAU1761_OUTPUT_MODE_HEADPHONE;
561
562	switch (mode) {
563	case ADAU1761_OUTPUT_MODE_LINE:
564		break;
565	case ADAU1761_OUTPUT_MODE_HEADPHONE_CAPLESS:
566		regmap_update_bits(adau->regmap, ADAU1761_PLAY_MONO_OUTPUT_VOL,
567			ADAU1761_PLAY_MONO_OUTPUT_VOL_MODE_HP |
568			ADAU1761_PLAY_MONO_OUTPUT_VOL_UNMUTE,
569			ADAU1761_PLAY_MONO_OUTPUT_VOL_MODE_HP |
570			ADAU1761_PLAY_MONO_OUTPUT_VOL_UNMUTE);
571		/* fallthrough */
572	case ADAU1761_OUTPUT_MODE_HEADPHONE:
573		regmap_update_bits(adau->regmap, ADAU1761_PLAY_HP_RIGHT_VOL,
574			ADAU1761_PLAY_HP_RIGHT_VOL_MODE_HP,
575			ADAU1761_PLAY_HP_RIGHT_VOL_MODE_HP);
576		break;
577	default:
578		return -EINVAL;
579	}
580
581	if (mode == ADAU1761_OUTPUT_MODE_HEADPHONE_CAPLESS) {
582		ret = snd_soc_dapm_new_controls(dapm,
583			adau1761_capless_dapm_widgets,
584			ARRAY_SIZE(adau1761_capless_dapm_widgets));
585		if (ret)
586			return ret;
587		ret = snd_soc_dapm_add_routes(dapm,
588			adau1761_capless_dapm_routes,
589			ARRAY_SIZE(adau1761_capless_dapm_routes));
590	} else {
591		ret = snd_soc_add_codec_controls(codec, adau1761_mono_controls,
592			ARRAY_SIZE(adau1761_mono_controls));
593		if (ret)
594			return ret;
595		ret = snd_soc_dapm_new_controls(dapm,
596			adau1761_mono_dapm_widgets,
597			ARRAY_SIZE(adau1761_mono_dapm_widgets));
598		if (ret)
599			return ret;
600		ret = snd_soc_dapm_add_routes(dapm,
601			adau1761_mono_dapm_routes,
602			ARRAY_SIZE(adau1761_mono_dapm_routes));
603	}
604
605	return ret;
606}
607
608static bool adau1761_readable_register(struct device *dev, unsigned int reg)
609{
610	switch (reg) {
611	case ADAU1761_DIGMIC_JACKDETECT:
612	case ADAU1761_REC_MIXER_LEFT0:
613	case ADAU1761_REC_MIXER_LEFT1:
614	case ADAU1761_REC_MIXER_RIGHT0:
615	case ADAU1761_REC_MIXER_RIGHT1:
616	case ADAU1761_LEFT_DIFF_INPUT_VOL:
617	case ADAU1761_RIGHT_DIFF_INPUT_VOL:
618	case ADAU1761_PLAY_LR_MIXER_LEFT:
619	case ADAU1761_PLAY_MIXER_LEFT0:
620	case ADAU1761_PLAY_MIXER_LEFT1:
621	case ADAU1761_PLAY_MIXER_RIGHT0:
622	case ADAU1761_PLAY_MIXER_RIGHT1:
623	case ADAU1761_PLAY_LR_MIXER_RIGHT:
624	case ADAU1761_PLAY_MIXER_MONO:
625	case ADAU1761_PLAY_HP_LEFT_VOL:
626	case ADAU1761_PLAY_HP_RIGHT_VOL:
627	case ADAU1761_PLAY_LINE_LEFT_VOL:
628	case ADAU1761_PLAY_LINE_RIGHT_VOL:
629	case ADAU1761_PLAY_MONO_OUTPUT_VOL:
630	case ADAU1761_POP_CLICK_SUPPRESS:
631	case ADAU1761_JACK_DETECT_PIN:
632	case ADAU1761_DEJITTER:
633	case ADAU1761_CLK_ENABLE0:
634	case ADAU1761_CLK_ENABLE1:
 
 
 
 
635		return true;
636	default:
637		break;
638	}
639
640	return adau17x1_readable_register(dev, reg);
641}
642
643static int adau1761_codec_probe(struct snd_soc_codec *codec)
644{
645	struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
646	struct adau1761_platform_data *pdata = codec->dev->platform_data;
647	struct adau *adau = snd_soc_codec_get_drvdata(codec);
648	int ret;
649
650	ret = adau17x1_add_widgets(codec);
651	if (ret < 0)
652		return ret;
653
654	if (pdata && pdata->input_differential) {
655		regmap_update_bits(adau->regmap, ADAU1761_LEFT_DIFF_INPUT_VOL,
656			ADAU1761_DIFF_INPUT_VOL_LDEN,
657			ADAU1761_DIFF_INPUT_VOL_LDEN);
658		regmap_update_bits(adau->regmap, ADAU1761_RIGHT_DIFF_INPUT_VOL,
659			ADAU1761_DIFF_INPUT_VOL_LDEN,
660			ADAU1761_DIFF_INPUT_VOL_LDEN);
661		ret = snd_soc_add_codec_controls(codec,
662			adau1761_differential_mode_controls,
663			ARRAY_SIZE(adau1761_differential_mode_controls));
664		if (ret)
665			return ret;
666	} else {
667		ret = snd_soc_add_codec_controls(codec,
668			adau1761_single_mode_controls,
669			ARRAY_SIZE(adau1761_single_mode_controls));
670		if (ret)
671			return ret;
672	}
673
674	switch (adau1761_get_lineout_mode(codec)) {
675	case ADAU1761_OUTPUT_MODE_LINE:
676		break;
677	case ADAU1761_OUTPUT_MODE_HEADPHONE:
678		regmap_update_bits(adau->regmap, ADAU1761_PLAY_LINE_LEFT_VOL,
679			ADAU1761_PLAY_LINE_LEFT_VOL_MODE_HP,
680			ADAU1761_PLAY_LINE_LEFT_VOL_MODE_HP);
681		regmap_update_bits(adau->regmap, ADAU1761_PLAY_LINE_RIGHT_VOL,
682			ADAU1761_PLAY_LINE_RIGHT_VOL_MODE_HP,
683			ADAU1761_PLAY_LINE_RIGHT_VOL_MODE_HP);
684		break;
685	default:
686		return -EINVAL;
687	}
688
689	ret = adau1761_setup_headphone_mode(codec);
690	if (ret)
691		return ret;
692
693	ret = adau1761_setup_digmic_jackdetect(codec);
694	if (ret)
695		return ret;
696
697	if (adau->type == ADAU1761) {
 
 
 
 
698		ret = snd_soc_dapm_new_controls(dapm, adau1761_dapm_widgets,
699			ARRAY_SIZE(adau1761_dapm_widgets));
700		if (ret)
701			return ret;
702
703		ret = snd_soc_dapm_add_routes(dapm, adau1761_dapm_routes,
704			ARRAY_SIZE(adau1761_dapm_routes));
705		if (ret)
706			return ret;
707	}
708
709	ret = adau17x1_add_routes(codec);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
710	if (ret < 0)
711		return ret;
712
713	return 0;
714}
715
716static const struct snd_soc_codec_driver adau1761_codec_driver = {
717	.probe = adau1761_codec_probe,
718	.resume	= adau17x1_resume,
719	.set_bias_level	= adau1761_set_bias_level,
720	.suspend_bias_off = true,
721
722	.component_driver = {
723		.controls		= adau1761_controls,
724		.num_controls		= ARRAY_SIZE(adau1761_controls),
725		.dapm_widgets		= adau1x61_dapm_widgets,
726		.num_dapm_widgets	= ARRAY_SIZE(adau1x61_dapm_widgets),
727		.dapm_routes		= adau1x61_dapm_routes,
728		.num_dapm_routes	= ARRAY_SIZE(adau1x61_dapm_routes),
729	},
730};
731
732#define ADAU1761_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | \
733	SNDRV_PCM_FMTBIT_S32_LE)
734
735static struct snd_soc_dai_driver adau1361_dai_driver = {
736	.name = "adau-hifi",
737	.playback = {
738		.stream_name = "Playback",
739		.channels_min = 2,
740		.channels_max = 4,
741		.rates = SNDRV_PCM_RATE_8000_96000,
742		.formats = ADAU1761_FORMATS,
743	},
744	.capture = {
745		.stream_name = "Capture",
746		.channels_min = 2,
747		.channels_max = 4,
748		.rates = SNDRV_PCM_RATE_8000_96000,
749		.formats = ADAU1761_FORMATS,
750	},
751	.ops = &adau17x1_dai_ops,
752};
753
754static struct snd_soc_dai_driver adau1761_dai_driver = {
755	.name = "adau-hifi",
756	.playback = {
757		.stream_name = "Playback",
758		.channels_min = 2,
759		.channels_max = 8,
760		.rates = SNDRV_PCM_RATE_8000_96000,
761		.formats = ADAU1761_FORMATS,
762	},
763	.capture = {
764		.stream_name = "Capture",
765		.channels_min = 2,
766		.channels_max = 8,
767		.rates = SNDRV_PCM_RATE_8000_96000,
768		.formats = ADAU1761_FORMATS,
769	},
770	.ops = &adau17x1_dai_ops,
771};
772
773int adau1761_probe(struct device *dev, struct regmap *regmap,
774	enum adau17x1_type type, void (*switch_mode)(struct device *dev))
775{
776	struct snd_soc_dai_driver *dai_drv;
777	const char *firmware_name;
778	int ret;
779
780	if (type == ADAU1361) {
781		dai_drv = &adau1361_dai_driver;
782		firmware_name = NULL;
783	} else {
784		dai_drv = &adau1761_dai_driver;
785		firmware_name = ADAU1761_FIRMWARE;
786	}
787
788	ret = adau17x1_probe(dev, regmap, type, switch_mode, firmware_name);
789	if (ret)
790		return ret;
791
 
 
 
 
792	/* Enable cache only mode as we could miss writes before bias level
793	 * reaches standby and the core clock is enabled */
794	regcache_cache_only(regmap, true);
795
796	return snd_soc_register_codec(dev, &adau1761_codec_driver, dai_drv, 1);
 
797}
798EXPORT_SYMBOL_GPL(adau1761_probe);
799
800const struct regmap_config adau1761_regmap_config = {
801	.val_bits = 8,
802	.reg_bits = 16,
803	.max_register = 0x40fa,
804	.reg_defaults = adau1761_reg_defaults,
805	.num_reg_defaults = ARRAY_SIZE(adau1761_reg_defaults),
806	.readable_reg = adau1761_readable_register,
807	.volatile_reg = adau17x1_volatile_register,
808	.precious_reg = adau17x1_precious_register,
809	.cache_type = REGCACHE_RBTREE,
810};
811EXPORT_SYMBOL_GPL(adau1761_regmap_config);
812
813MODULE_DESCRIPTION("ASoC ADAU1361/ADAU1461/ADAU1761/ADAU1961 CODEC driver");
814MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
815MODULE_LICENSE("GPL");