162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * This driver supports the analog controls for the internal codec
462306a36Sopenharmony_ci * found in Allwinner's A64 SoC.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 2016 Chen-Yu Tsai <wens@csie.org>
762306a36Sopenharmony_ci * Copyright (C) 2017 Marcus Cooper <codekipper@gmail.com>
862306a36Sopenharmony_ci * Copyright (C) 2018 Vasily Khoruzhick <anarsoul@gmail.com>
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci * Based on sun8i-codec-analog.c
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci */
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <linux/io.h>
1562306a36Sopenharmony_ci#include <linux/kernel.h>
1662306a36Sopenharmony_ci#include <linux/module.h>
1762306a36Sopenharmony_ci#include <linux/of.h>
1862306a36Sopenharmony_ci#include <linux/of_device.h>
1962306a36Sopenharmony_ci#include <linux/platform_device.h>
2062306a36Sopenharmony_ci#include <linux/regmap.h>
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#include <sound/soc.h>
2362306a36Sopenharmony_ci#include <sound/soc-dapm.h>
2462306a36Sopenharmony_ci#include <sound/tlv.h>
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#include "sun8i-adda-pr-regmap.h"
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci/* Codec analog control register offsets and bit fields */
2962306a36Sopenharmony_ci#define SUN50I_ADDA_HP_CTRL		0x00
3062306a36Sopenharmony_ci#define SUN50I_ADDA_HP_CTRL_PA_CLK_GATE		7
3162306a36Sopenharmony_ci#define SUN50I_ADDA_HP_CTRL_HPPA_EN		6
3262306a36Sopenharmony_ci#define SUN50I_ADDA_HP_CTRL_HPVOL		0
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#define SUN50I_ADDA_OL_MIX_CTRL		0x01
3562306a36Sopenharmony_ci#define SUN50I_ADDA_OL_MIX_CTRL_MIC1		6
3662306a36Sopenharmony_ci#define SUN50I_ADDA_OL_MIX_CTRL_MIC2		5
3762306a36Sopenharmony_ci#define SUN50I_ADDA_OL_MIX_CTRL_PHONE		4
3862306a36Sopenharmony_ci#define SUN50I_ADDA_OL_MIX_CTRL_PHONEN		3
3962306a36Sopenharmony_ci#define SUN50I_ADDA_OL_MIX_CTRL_LINEINL		2
4062306a36Sopenharmony_ci#define SUN50I_ADDA_OL_MIX_CTRL_DACL		1
4162306a36Sopenharmony_ci#define SUN50I_ADDA_OL_MIX_CTRL_DACR		0
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#define SUN50I_ADDA_OR_MIX_CTRL		0x02
4462306a36Sopenharmony_ci#define SUN50I_ADDA_OR_MIX_CTRL_MIC1		6
4562306a36Sopenharmony_ci#define SUN50I_ADDA_OR_MIX_CTRL_MIC2		5
4662306a36Sopenharmony_ci#define SUN50I_ADDA_OR_MIX_CTRL_PHONE		4
4762306a36Sopenharmony_ci#define SUN50I_ADDA_OR_MIX_CTRL_PHONEP		3
4862306a36Sopenharmony_ci#define SUN50I_ADDA_OR_MIX_CTRL_LINEINR		2
4962306a36Sopenharmony_ci#define SUN50I_ADDA_OR_MIX_CTRL_DACR		1
5062306a36Sopenharmony_ci#define SUN50I_ADDA_OR_MIX_CTRL_DACL		0
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#define SUN50I_ADDA_EARPIECE_CTRL0	0x03
5362306a36Sopenharmony_ci#define SUN50I_ADDA_EARPIECE_CTRL0_EAR_RAMP_TIME	4
5462306a36Sopenharmony_ci#define SUN50I_ADDA_EARPIECE_CTRL0_ESPSR		0
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#define SUN50I_ADDA_EARPIECE_CTRL1	0x04
5762306a36Sopenharmony_ci#define SUN50I_ADDA_EARPIECE_CTRL1_ESPPA_EN	7
5862306a36Sopenharmony_ci#define SUN50I_ADDA_EARPIECE_CTRL1_ESPPA_MUTE	6
5962306a36Sopenharmony_ci#define SUN50I_ADDA_EARPIECE_CTRL1_ESP_VOL	0
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#define SUN50I_ADDA_LINEOUT_CTRL0	0x05
6262306a36Sopenharmony_ci#define SUN50I_ADDA_LINEOUT_CTRL0_LEN		7
6362306a36Sopenharmony_ci#define SUN50I_ADDA_LINEOUT_CTRL0_REN		6
6462306a36Sopenharmony_ci#define SUN50I_ADDA_LINEOUT_CTRL0_LSRC_SEL	5
6562306a36Sopenharmony_ci#define SUN50I_ADDA_LINEOUT_CTRL0_RSRC_SEL	4
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#define SUN50I_ADDA_LINEOUT_CTRL1	0x06
6862306a36Sopenharmony_ci#define SUN50I_ADDA_LINEOUT_CTRL1_VOL		0
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci#define SUN50I_ADDA_MIC1_CTRL		0x07
7162306a36Sopenharmony_ci#define SUN50I_ADDA_MIC1_CTRL_MIC1G		4
7262306a36Sopenharmony_ci#define SUN50I_ADDA_MIC1_CTRL_MIC1AMPEN		3
7362306a36Sopenharmony_ci#define SUN50I_ADDA_MIC1_CTRL_MIC1BOOST		0
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci#define SUN50I_ADDA_MIC2_CTRL		0x08
7662306a36Sopenharmony_ci#define SUN50I_ADDA_MIC2_CTRL_MIC2G		4
7762306a36Sopenharmony_ci#define SUN50I_ADDA_MIC2_CTRL_MIC2AMPEN		3
7862306a36Sopenharmony_ci#define SUN50I_ADDA_MIC2_CTRL_MIC2BOOST		0
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci#define SUN50I_ADDA_LINEIN_CTRL		0x09
8162306a36Sopenharmony_ci#define SUN50I_ADDA_LINEIN_CTRL_LINEING		0
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci#define SUN50I_ADDA_MIX_DAC_CTRL	0x0a
8462306a36Sopenharmony_ci#define SUN50I_ADDA_MIX_DAC_CTRL_DACAREN	7
8562306a36Sopenharmony_ci#define SUN50I_ADDA_MIX_DAC_CTRL_DACALEN	6
8662306a36Sopenharmony_ci#define SUN50I_ADDA_MIX_DAC_CTRL_RMIXEN		5
8762306a36Sopenharmony_ci#define SUN50I_ADDA_MIX_DAC_CTRL_LMIXEN		4
8862306a36Sopenharmony_ci#define SUN50I_ADDA_MIX_DAC_CTRL_RHPPAMUTE	3
8962306a36Sopenharmony_ci#define SUN50I_ADDA_MIX_DAC_CTRL_LHPPAMUTE	2
9062306a36Sopenharmony_ci#define SUN50I_ADDA_MIX_DAC_CTRL_RHPIS		1
9162306a36Sopenharmony_ci#define SUN50I_ADDA_MIX_DAC_CTRL_LHPIS		0
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci#define SUN50I_ADDA_L_ADCMIX_SRC	0x0b
9462306a36Sopenharmony_ci#define SUN50I_ADDA_L_ADCMIX_SRC_MIC1		6
9562306a36Sopenharmony_ci#define SUN50I_ADDA_L_ADCMIX_SRC_MIC2		5
9662306a36Sopenharmony_ci#define SUN50I_ADDA_L_ADCMIX_SRC_PHONE		4
9762306a36Sopenharmony_ci#define SUN50I_ADDA_L_ADCMIX_SRC_PHONEN		3
9862306a36Sopenharmony_ci#define SUN50I_ADDA_L_ADCMIX_SRC_LINEINL	2
9962306a36Sopenharmony_ci#define SUN50I_ADDA_L_ADCMIX_SRC_OMIXRL		1
10062306a36Sopenharmony_ci#define SUN50I_ADDA_L_ADCMIX_SRC_OMIXRR		0
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci#define SUN50I_ADDA_R_ADCMIX_SRC	0x0c
10362306a36Sopenharmony_ci#define SUN50I_ADDA_R_ADCMIX_SRC_MIC1		6
10462306a36Sopenharmony_ci#define SUN50I_ADDA_R_ADCMIX_SRC_MIC2		5
10562306a36Sopenharmony_ci#define SUN50I_ADDA_R_ADCMIX_SRC_PHONE		4
10662306a36Sopenharmony_ci#define SUN50I_ADDA_R_ADCMIX_SRC_PHONEP		3
10762306a36Sopenharmony_ci#define SUN50I_ADDA_R_ADCMIX_SRC_LINEINR	2
10862306a36Sopenharmony_ci#define SUN50I_ADDA_R_ADCMIX_SRC_OMIXR		1
10962306a36Sopenharmony_ci#define SUN50I_ADDA_R_ADCMIX_SRC_OMIXL		0
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci#define SUN50I_ADDA_ADC_CTRL		0x0d
11262306a36Sopenharmony_ci#define SUN50I_ADDA_ADC_CTRL_ADCREN		7
11362306a36Sopenharmony_ci#define SUN50I_ADDA_ADC_CTRL_ADCLEN		6
11462306a36Sopenharmony_ci#define SUN50I_ADDA_ADC_CTRL_ADCG		0
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci#define SUN50I_ADDA_HS_MBIAS_CTRL	0x0e
11762306a36Sopenharmony_ci#define SUN50I_ADDA_HS_MBIAS_CTRL_MMICBIASEN	7
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci#define SUN50I_ADDA_JACK_MIC_CTRL	0x1d
12062306a36Sopenharmony_ci#define SUN50I_ADDA_JACK_MIC_CTRL_INNERRESEN	6
12162306a36Sopenharmony_ci#define SUN50I_ADDA_JACK_MIC_CTRL_HMICBIASEN	5
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci/* mixer controls */
12462306a36Sopenharmony_cistatic const struct snd_kcontrol_new sun50i_a64_codec_mixer_controls[] = {
12562306a36Sopenharmony_ci	SOC_DAPM_DOUBLE_R("Mic1 Playback Switch",
12662306a36Sopenharmony_ci			  SUN50I_ADDA_OL_MIX_CTRL,
12762306a36Sopenharmony_ci			  SUN50I_ADDA_OR_MIX_CTRL,
12862306a36Sopenharmony_ci			  SUN50I_ADDA_OL_MIX_CTRL_MIC1, 1, 0),
12962306a36Sopenharmony_ci	SOC_DAPM_DOUBLE_R("Mic2 Playback Switch",
13062306a36Sopenharmony_ci			  SUN50I_ADDA_OL_MIX_CTRL,
13162306a36Sopenharmony_ci			  SUN50I_ADDA_OR_MIX_CTRL,
13262306a36Sopenharmony_ci			  SUN50I_ADDA_OL_MIX_CTRL_MIC2, 1, 0),
13362306a36Sopenharmony_ci	SOC_DAPM_DOUBLE_R("Line In Playback Switch",
13462306a36Sopenharmony_ci			  SUN50I_ADDA_OL_MIX_CTRL,
13562306a36Sopenharmony_ci			  SUN50I_ADDA_OR_MIX_CTRL,
13662306a36Sopenharmony_ci			  SUN50I_ADDA_OL_MIX_CTRL_LINEINL, 1, 0),
13762306a36Sopenharmony_ci	SOC_DAPM_DOUBLE_R("DAC Playback Switch",
13862306a36Sopenharmony_ci			  SUN50I_ADDA_OL_MIX_CTRL,
13962306a36Sopenharmony_ci			  SUN50I_ADDA_OR_MIX_CTRL,
14062306a36Sopenharmony_ci			  SUN50I_ADDA_OL_MIX_CTRL_DACL, 1, 0),
14162306a36Sopenharmony_ci	SOC_DAPM_DOUBLE_R("DAC Reversed Playback Switch",
14262306a36Sopenharmony_ci			  SUN50I_ADDA_OL_MIX_CTRL,
14362306a36Sopenharmony_ci			  SUN50I_ADDA_OR_MIX_CTRL,
14462306a36Sopenharmony_ci			  SUN50I_ADDA_OL_MIX_CTRL_DACR, 1, 0),
14562306a36Sopenharmony_ci};
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci/* ADC mixer controls */
14862306a36Sopenharmony_cistatic const struct snd_kcontrol_new sun50i_codec_adc_mixer_controls[] = {
14962306a36Sopenharmony_ci	SOC_DAPM_DOUBLE_R("Mic1 Capture Switch",
15062306a36Sopenharmony_ci			  SUN50I_ADDA_L_ADCMIX_SRC,
15162306a36Sopenharmony_ci			  SUN50I_ADDA_R_ADCMIX_SRC,
15262306a36Sopenharmony_ci			  SUN50I_ADDA_L_ADCMIX_SRC_MIC1, 1, 0),
15362306a36Sopenharmony_ci	SOC_DAPM_DOUBLE_R("Mic2 Capture Switch",
15462306a36Sopenharmony_ci			  SUN50I_ADDA_L_ADCMIX_SRC,
15562306a36Sopenharmony_ci			  SUN50I_ADDA_R_ADCMIX_SRC,
15662306a36Sopenharmony_ci			  SUN50I_ADDA_L_ADCMIX_SRC_MIC2, 1, 0),
15762306a36Sopenharmony_ci	SOC_DAPM_DOUBLE_R("Line In Capture Switch",
15862306a36Sopenharmony_ci			  SUN50I_ADDA_L_ADCMIX_SRC,
15962306a36Sopenharmony_ci			  SUN50I_ADDA_R_ADCMIX_SRC,
16062306a36Sopenharmony_ci			  SUN50I_ADDA_L_ADCMIX_SRC_LINEINL, 1, 0),
16162306a36Sopenharmony_ci	SOC_DAPM_DOUBLE_R("Mixer Capture Switch",
16262306a36Sopenharmony_ci			  SUN50I_ADDA_L_ADCMIX_SRC,
16362306a36Sopenharmony_ci			  SUN50I_ADDA_R_ADCMIX_SRC,
16462306a36Sopenharmony_ci			  SUN50I_ADDA_L_ADCMIX_SRC_OMIXRL, 1, 0),
16562306a36Sopenharmony_ci	SOC_DAPM_DOUBLE_R("Mixer Reversed Capture Switch",
16662306a36Sopenharmony_ci			  SUN50I_ADDA_L_ADCMIX_SRC,
16762306a36Sopenharmony_ci			  SUN50I_ADDA_R_ADCMIX_SRC,
16862306a36Sopenharmony_ci			  SUN50I_ADDA_L_ADCMIX_SRC_OMIXRR, 1, 0),
16962306a36Sopenharmony_ci};
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(sun50i_codec_out_mixer_pregain_scale,
17262306a36Sopenharmony_ci				  -450, 150, 0);
17362306a36Sopenharmony_cistatic const DECLARE_TLV_DB_RANGE(sun50i_codec_mic_gain_scale,
17462306a36Sopenharmony_ci	0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
17562306a36Sopenharmony_ci	1, 7, TLV_DB_SCALE_ITEM(2400, 300, 0),
17662306a36Sopenharmony_ci);
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(sun50i_codec_hp_vol_scale, -6300, 100, 1);
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_cistatic const DECLARE_TLV_DB_RANGE(sun50i_codec_lineout_vol_scale,
18162306a36Sopenharmony_ci	0, 1, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1),
18262306a36Sopenharmony_ci	2, 31, TLV_DB_SCALE_ITEM(-4350, 150, 0),
18362306a36Sopenharmony_ci);
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_cistatic const DECLARE_TLV_DB_RANGE(sun50i_codec_earpiece_vol_scale,
18662306a36Sopenharmony_ci	0, 1, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1),
18762306a36Sopenharmony_ci	2, 31, TLV_DB_SCALE_ITEM(-4350, 150, 0),
18862306a36Sopenharmony_ci);
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci/* volume / mute controls */
19162306a36Sopenharmony_cistatic const struct snd_kcontrol_new sun50i_a64_codec_controls[] = {
19262306a36Sopenharmony_ci	SOC_SINGLE_TLV("Headphone Playback Volume",
19362306a36Sopenharmony_ci		       SUN50I_ADDA_HP_CTRL,
19462306a36Sopenharmony_ci		       SUN50I_ADDA_HP_CTRL_HPVOL, 0x3f, 0,
19562306a36Sopenharmony_ci		       sun50i_codec_hp_vol_scale),
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci	/* Mixer pre-gain */
19862306a36Sopenharmony_ci	SOC_SINGLE_TLV("Mic1 Playback Volume", SUN50I_ADDA_MIC1_CTRL,
19962306a36Sopenharmony_ci		       SUN50I_ADDA_MIC1_CTRL_MIC1G,
20062306a36Sopenharmony_ci		       0x7, 0, sun50i_codec_out_mixer_pregain_scale),
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci	/* Microphone Amp boost gain */
20362306a36Sopenharmony_ci	SOC_SINGLE_TLV("Mic1 Boost Volume", SUN50I_ADDA_MIC1_CTRL,
20462306a36Sopenharmony_ci		       SUN50I_ADDA_MIC1_CTRL_MIC1BOOST, 0x7, 0,
20562306a36Sopenharmony_ci		       sun50i_codec_mic_gain_scale),
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ci	/* Mixer pre-gain */
20862306a36Sopenharmony_ci	SOC_SINGLE_TLV("Mic2 Playback Volume",
20962306a36Sopenharmony_ci		       SUN50I_ADDA_MIC2_CTRL, SUN50I_ADDA_MIC2_CTRL_MIC2G,
21062306a36Sopenharmony_ci		       0x7, 0, sun50i_codec_out_mixer_pregain_scale),
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci	/* Microphone Amp boost gain */
21362306a36Sopenharmony_ci	SOC_SINGLE_TLV("Mic2 Boost Volume", SUN50I_ADDA_MIC2_CTRL,
21462306a36Sopenharmony_ci		       SUN50I_ADDA_MIC2_CTRL_MIC2BOOST, 0x7, 0,
21562306a36Sopenharmony_ci		       sun50i_codec_mic_gain_scale),
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci	/* ADC */
21862306a36Sopenharmony_ci	SOC_SINGLE_TLV("ADC Gain Capture Volume", SUN50I_ADDA_ADC_CTRL,
21962306a36Sopenharmony_ci		       SUN50I_ADDA_ADC_CTRL_ADCG, 0x7, 0,
22062306a36Sopenharmony_ci		       sun50i_codec_out_mixer_pregain_scale),
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci	/* Mixer pre-gain */
22362306a36Sopenharmony_ci	SOC_SINGLE_TLV("Line In Playback Volume", SUN50I_ADDA_LINEIN_CTRL,
22462306a36Sopenharmony_ci		       SUN50I_ADDA_LINEIN_CTRL_LINEING,
22562306a36Sopenharmony_ci		       0x7, 0, sun50i_codec_out_mixer_pregain_scale),
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_ci	SOC_SINGLE_TLV("Line Out Playback Volume",
22862306a36Sopenharmony_ci		       SUN50I_ADDA_LINEOUT_CTRL1,
22962306a36Sopenharmony_ci		       SUN50I_ADDA_LINEOUT_CTRL1_VOL, 0x1f, 0,
23062306a36Sopenharmony_ci		       sun50i_codec_lineout_vol_scale),
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci	SOC_SINGLE_TLV("Earpiece Playback Volume",
23362306a36Sopenharmony_ci		       SUN50I_ADDA_EARPIECE_CTRL1,
23462306a36Sopenharmony_ci		       SUN50I_ADDA_EARPIECE_CTRL1_ESP_VOL, 0x1f, 0,
23562306a36Sopenharmony_ci		       sun50i_codec_earpiece_vol_scale),
23662306a36Sopenharmony_ci};
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_cistatic const char * const sun50i_codec_hp_src_enum_text[] = {
23962306a36Sopenharmony_ci	"DAC", "Mixer",
24062306a36Sopenharmony_ci};
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_cistatic SOC_ENUM_DOUBLE_DECL(sun50i_codec_hp_src_enum,
24362306a36Sopenharmony_ci			    SUN50I_ADDA_MIX_DAC_CTRL,
24462306a36Sopenharmony_ci			    SUN50I_ADDA_MIX_DAC_CTRL_LHPIS,
24562306a36Sopenharmony_ci			    SUN50I_ADDA_MIX_DAC_CTRL_RHPIS,
24662306a36Sopenharmony_ci			    sun50i_codec_hp_src_enum_text);
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_cistatic const struct snd_kcontrol_new sun50i_codec_hp_src[] = {
24962306a36Sopenharmony_ci	SOC_DAPM_ENUM("Headphone Source Playback Route",
25062306a36Sopenharmony_ci		      sun50i_codec_hp_src_enum),
25162306a36Sopenharmony_ci};
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_cistatic const struct snd_kcontrol_new sun50i_codec_hp_switch =
25462306a36Sopenharmony_ci	SOC_DAPM_DOUBLE("Headphone Playback Switch",
25562306a36Sopenharmony_ci			SUN50I_ADDA_MIX_DAC_CTRL,
25662306a36Sopenharmony_ci			SUN50I_ADDA_MIX_DAC_CTRL_LHPPAMUTE,
25762306a36Sopenharmony_ci			SUN50I_ADDA_MIX_DAC_CTRL_RHPPAMUTE, 1, 0);
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_cistatic const char * const sun50i_codec_lineout_src_enum_text[] = {
26062306a36Sopenharmony_ci	"Stereo", "Mono Differential",
26162306a36Sopenharmony_ci};
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_cistatic SOC_ENUM_DOUBLE_DECL(sun50i_codec_lineout_src_enum,
26462306a36Sopenharmony_ci			    SUN50I_ADDA_LINEOUT_CTRL0,
26562306a36Sopenharmony_ci			    SUN50I_ADDA_LINEOUT_CTRL0_LSRC_SEL,
26662306a36Sopenharmony_ci			    SUN50I_ADDA_LINEOUT_CTRL0_RSRC_SEL,
26762306a36Sopenharmony_ci			    sun50i_codec_lineout_src_enum_text);
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_cistatic const struct snd_kcontrol_new sun50i_codec_lineout_src[] = {
27062306a36Sopenharmony_ci	SOC_DAPM_ENUM("Line Out Source Playback Route",
27162306a36Sopenharmony_ci		      sun50i_codec_lineout_src_enum),
27262306a36Sopenharmony_ci};
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_cistatic const struct snd_kcontrol_new sun50i_codec_lineout_switch =
27562306a36Sopenharmony_ci	SOC_DAPM_DOUBLE("Line Out Playback Switch",
27662306a36Sopenharmony_ci			SUN50I_ADDA_LINEOUT_CTRL0,
27762306a36Sopenharmony_ci			SUN50I_ADDA_LINEOUT_CTRL0_LEN,
27862306a36Sopenharmony_ci			SUN50I_ADDA_LINEOUT_CTRL0_REN, 1, 0);
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_cistatic const char * const sun50i_codec_earpiece_src_enum_text[] = {
28162306a36Sopenharmony_ci	"DACR", "DACL", "Right Mixer", "Left Mixer",
28262306a36Sopenharmony_ci};
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(sun50i_codec_earpiece_src_enum,
28562306a36Sopenharmony_ci			    SUN50I_ADDA_EARPIECE_CTRL0,
28662306a36Sopenharmony_ci			    SUN50I_ADDA_EARPIECE_CTRL0_ESPSR,
28762306a36Sopenharmony_ci			    sun50i_codec_earpiece_src_enum_text);
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_cistatic const struct snd_kcontrol_new sun50i_codec_earpiece_src[] = {
29062306a36Sopenharmony_ci	SOC_DAPM_ENUM("Earpiece Source Playback Route",
29162306a36Sopenharmony_ci		      sun50i_codec_earpiece_src_enum),
29262306a36Sopenharmony_ci};
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_cistatic const struct snd_kcontrol_new sun50i_codec_earpiece_switch[] = {
29562306a36Sopenharmony_ci	SOC_DAPM_SINGLE("Earpiece Playback Switch",
29662306a36Sopenharmony_ci			SUN50I_ADDA_EARPIECE_CTRL1,
29762306a36Sopenharmony_ci			SUN50I_ADDA_EARPIECE_CTRL1_ESPPA_MUTE, 1, 0),
29862306a36Sopenharmony_ci};
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget sun50i_a64_codec_widgets[] = {
30162306a36Sopenharmony_ci	/* DAC */
30262306a36Sopenharmony_ci	SND_SOC_DAPM_DAC("Left DAC", NULL, SUN50I_ADDA_MIX_DAC_CTRL,
30362306a36Sopenharmony_ci			 SUN50I_ADDA_MIX_DAC_CTRL_DACALEN, 0),
30462306a36Sopenharmony_ci	SND_SOC_DAPM_DAC("Right DAC", NULL, SUN50I_ADDA_MIX_DAC_CTRL,
30562306a36Sopenharmony_ci			 SUN50I_ADDA_MIX_DAC_CTRL_DACAREN, 0),
30662306a36Sopenharmony_ci	/* ADC */
30762306a36Sopenharmony_ci	SND_SOC_DAPM_ADC("Left ADC", NULL, SUN50I_ADDA_ADC_CTRL,
30862306a36Sopenharmony_ci			 SUN50I_ADDA_ADC_CTRL_ADCLEN, 0),
30962306a36Sopenharmony_ci	SND_SOC_DAPM_ADC("Right ADC", NULL, SUN50I_ADDA_ADC_CTRL,
31062306a36Sopenharmony_ci			 SUN50I_ADDA_ADC_CTRL_ADCREN, 0),
31162306a36Sopenharmony_ci	/*
31262306a36Sopenharmony_ci	 * Due to this component and the codec belonging to separate DAPM
31362306a36Sopenharmony_ci	 * contexts, we need to manually link the above widgets to their
31462306a36Sopenharmony_ci	 * stream widgets at the card level.
31562306a36Sopenharmony_ci	 */
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci	SND_SOC_DAPM_REGULATOR_SUPPLY("cpvdd", 0, 0),
31862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Left Headphone Source",
31962306a36Sopenharmony_ci			 SND_SOC_NOPM, 0, 0, sun50i_codec_hp_src),
32062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Right Headphone Source",
32162306a36Sopenharmony_ci			 SND_SOC_NOPM, 0, 0, sun50i_codec_hp_src),
32262306a36Sopenharmony_ci	SND_SOC_DAPM_SWITCH("Left Headphone Switch",
32362306a36Sopenharmony_ci			    SND_SOC_NOPM, 0, 0, &sun50i_codec_hp_switch),
32462306a36Sopenharmony_ci	SND_SOC_DAPM_SWITCH("Right Headphone Switch",
32562306a36Sopenharmony_ci			    SND_SOC_NOPM, 0, 0, &sun50i_codec_hp_switch),
32662306a36Sopenharmony_ci	SND_SOC_DAPM_OUT_DRV("Left Headphone Amp",
32762306a36Sopenharmony_ci			     SND_SOC_NOPM, 0, 0, NULL, 0),
32862306a36Sopenharmony_ci	SND_SOC_DAPM_OUT_DRV("Right Headphone Amp",
32962306a36Sopenharmony_ci			     SND_SOC_NOPM, 0, 0, NULL, 0),
33062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("Headphone Amp", SUN50I_ADDA_HP_CTRL,
33162306a36Sopenharmony_ci			     SUN50I_ADDA_HP_CTRL_HPPA_EN, 0, NULL, 0),
33262306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("HP"),
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Left Line Out Source",
33562306a36Sopenharmony_ci			 SND_SOC_NOPM, 0, 0, sun50i_codec_lineout_src),
33662306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Right Line Out Source",
33762306a36Sopenharmony_ci			 SND_SOC_NOPM, 0, 0, sun50i_codec_lineout_src),
33862306a36Sopenharmony_ci	SND_SOC_DAPM_SWITCH("Left Line Out Switch",
33962306a36Sopenharmony_ci			    SND_SOC_NOPM, 0, 0, &sun50i_codec_lineout_switch),
34062306a36Sopenharmony_ci	SND_SOC_DAPM_SWITCH("Right Line Out Switch",
34162306a36Sopenharmony_ci			    SND_SOC_NOPM, 0, 0, &sun50i_codec_lineout_switch),
34262306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("LINEOUT"),
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("Earpiece Source Playback Route",
34562306a36Sopenharmony_ci			 SND_SOC_NOPM, 0, 0, sun50i_codec_earpiece_src),
34662306a36Sopenharmony_ci	SOC_MIXER_NAMED_CTL_ARRAY("Earpiece Switch",
34762306a36Sopenharmony_ci				  SND_SOC_NOPM, 0, 0,
34862306a36Sopenharmony_ci				  sun50i_codec_earpiece_switch),
34962306a36Sopenharmony_ci	SND_SOC_DAPM_OUT_DRV("Earpiece Amp", SUN50I_ADDA_EARPIECE_CTRL1,
35062306a36Sopenharmony_ci			     SUN50I_ADDA_EARPIECE_CTRL1_ESPPA_EN, 0, NULL, 0),
35162306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("EARPIECE"),
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_ci	/* Microphone inputs */
35462306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("MIC1"),
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_ci	/* Microphone Bias */
35762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("MBIAS", SUN50I_ADDA_HS_MBIAS_CTRL,
35862306a36Sopenharmony_ci			    SUN50I_ADDA_HS_MBIAS_CTRL_MMICBIASEN,
35962306a36Sopenharmony_ci			    0, NULL, 0),
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci	/* Mic input path */
36262306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Mic1 Amplifier", SUN50I_ADDA_MIC1_CTRL,
36362306a36Sopenharmony_ci			 SUN50I_ADDA_MIC1_CTRL_MIC1AMPEN, 0, NULL, 0),
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_ci	/* Microphone input */
36662306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("MIC2"),
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_ci	/* Microphone Bias */
36962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("HBIAS", SUN50I_ADDA_JACK_MIC_CTRL,
37062306a36Sopenharmony_ci			    SUN50I_ADDA_JACK_MIC_CTRL_HMICBIASEN,
37162306a36Sopenharmony_ci			    0, NULL, 0),
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci	/* Mic input path */
37462306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("Mic2 Amplifier", SUN50I_ADDA_MIC2_CTRL,
37562306a36Sopenharmony_ci			 SUN50I_ADDA_MIC2_CTRL_MIC2AMPEN, 0, NULL, 0),
37662306a36Sopenharmony_ci
37762306a36Sopenharmony_ci	/* Line input */
37862306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("LINEIN"),
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci	/* Mixers */
38162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Left Mixer", SUN50I_ADDA_MIX_DAC_CTRL,
38262306a36Sopenharmony_ci			   SUN50I_ADDA_MIX_DAC_CTRL_LMIXEN, 0,
38362306a36Sopenharmony_ci			   sun50i_a64_codec_mixer_controls,
38462306a36Sopenharmony_ci			   ARRAY_SIZE(sun50i_a64_codec_mixer_controls)),
38562306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Right Mixer", SUN50I_ADDA_MIX_DAC_CTRL,
38662306a36Sopenharmony_ci			   SUN50I_ADDA_MIX_DAC_CTRL_RMIXEN, 0,
38762306a36Sopenharmony_ci			   sun50i_a64_codec_mixer_controls,
38862306a36Sopenharmony_ci			   ARRAY_SIZE(sun50i_a64_codec_mixer_controls)),
38962306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Left ADC Mixer", SND_SOC_NOPM, 0, 0,
39062306a36Sopenharmony_ci			   sun50i_codec_adc_mixer_controls,
39162306a36Sopenharmony_ci			   ARRAY_SIZE(sun50i_codec_adc_mixer_controls)),
39262306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER("Right ADC Mixer", SND_SOC_NOPM, 0, 0,
39362306a36Sopenharmony_ci			   sun50i_codec_adc_mixer_controls,
39462306a36Sopenharmony_ci			   ARRAY_SIZE(sun50i_codec_adc_mixer_controls)),
39562306a36Sopenharmony_ci};
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_cistatic const struct snd_soc_dapm_route sun50i_a64_codec_routes[] = {
39862306a36Sopenharmony_ci	/* Left Mixer Routes */
39962306a36Sopenharmony_ci	{ "Left Mixer", "Mic1 Playback Switch", "Mic1 Amplifier" },
40062306a36Sopenharmony_ci	{ "Left Mixer", "Mic2 Playback Switch", "Mic2 Amplifier" },
40162306a36Sopenharmony_ci	{ "Left Mixer", "Line In Playback Switch", "LINEIN" },
40262306a36Sopenharmony_ci	{ "Left Mixer", "DAC Playback Switch", "Left DAC" },
40362306a36Sopenharmony_ci	{ "Left Mixer", "DAC Reversed Playback Switch", "Right DAC" },
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_ci	/* Right Mixer Routes */
40662306a36Sopenharmony_ci	{ "Right Mixer", "Mic1 Playback Switch", "Mic1 Amplifier" },
40762306a36Sopenharmony_ci	{ "Right Mixer", "Mic2 Playback Switch", "Mic2 Amplifier" },
40862306a36Sopenharmony_ci	{ "Right Mixer", "Line In Playback Switch", "LINEIN" },
40962306a36Sopenharmony_ci	{ "Right Mixer", "DAC Playback Switch", "Right DAC" },
41062306a36Sopenharmony_ci	{ "Right Mixer", "DAC Reversed Playback Switch", "Left DAC" },
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_ci	/* Left ADC Mixer Routes */
41362306a36Sopenharmony_ci	{ "Left ADC Mixer", "Mic1 Capture Switch", "Mic1 Amplifier" },
41462306a36Sopenharmony_ci	{ "Left ADC Mixer", "Mic2 Capture Switch", "Mic2 Amplifier" },
41562306a36Sopenharmony_ci	{ "Left ADC Mixer", "Line In Capture Switch", "LINEIN" },
41662306a36Sopenharmony_ci	{ "Left ADC Mixer", "Mixer Capture Switch", "Left Mixer" },
41762306a36Sopenharmony_ci	{ "Left ADC Mixer", "Mixer Reversed Capture Switch", "Right Mixer" },
41862306a36Sopenharmony_ci
41962306a36Sopenharmony_ci	/* Right ADC Mixer Routes */
42062306a36Sopenharmony_ci	{ "Right ADC Mixer", "Mic1 Capture Switch", "Mic1 Amplifier" },
42162306a36Sopenharmony_ci	{ "Right ADC Mixer", "Mic2 Capture Switch", "Mic2 Amplifier" },
42262306a36Sopenharmony_ci	{ "Right ADC Mixer", "Line In Capture Switch", "LINEIN" },
42362306a36Sopenharmony_ci	{ "Right ADC Mixer", "Mixer Capture Switch", "Right Mixer" },
42462306a36Sopenharmony_ci	{ "Right ADC Mixer", "Mixer Reversed Capture Switch", "Left Mixer" },
42562306a36Sopenharmony_ci
42662306a36Sopenharmony_ci	/* ADC Routes */
42762306a36Sopenharmony_ci	{ "Left ADC", NULL, "Left ADC Mixer" },
42862306a36Sopenharmony_ci	{ "Right ADC", NULL, "Right ADC Mixer" },
42962306a36Sopenharmony_ci
43062306a36Sopenharmony_ci	/* Headphone Routes */
43162306a36Sopenharmony_ci	{ "Left Headphone Source", "DAC", "Left DAC" },
43262306a36Sopenharmony_ci	{ "Left Headphone Source", "Mixer", "Left Mixer" },
43362306a36Sopenharmony_ci	{ "Left Headphone Switch", "Headphone Playback Switch", "Left Headphone Source" },
43462306a36Sopenharmony_ci	{ "Left Headphone Amp", NULL, "Left Headphone Switch" },
43562306a36Sopenharmony_ci	{ "Left Headphone Amp", NULL, "Headphone Amp" },
43662306a36Sopenharmony_ci	{ "HP", NULL, "Left Headphone Amp" },
43762306a36Sopenharmony_ci
43862306a36Sopenharmony_ci	{ "Right Headphone Source", "DAC", "Right DAC" },
43962306a36Sopenharmony_ci	{ "Right Headphone Source", "Mixer", "Right Mixer" },
44062306a36Sopenharmony_ci	{ "Right Headphone Switch", "Headphone Playback Switch", "Right Headphone Source" },
44162306a36Sopenharmony_ci	{ "Right Headphone Amp", NULL, "Right Headphone Switch" },
44262306a36Sopenharmony_ci	{ "Right Headphone Amp", NULL, "Headphone Amp" },
44362306a36Sopenharmony_ci	{ "HP", NULL, "Right Headphone Amp" },
44462306a36Sopenharmony_ci
44562306a36Sopenharmony_ci	{ "Headphone Amp", NULL, "cpvdd" },
44662306a36Sopenharmony_ci
44762306a36Sopenharmony_ci	/* Microphone Routes */
44862306a36Sopenharmony_ci	{ "Mic1 Amplifier", NULL, "MIC1"},
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_ci	/* Microphone Routes */
45162306a36Sopenharmony_ci	{ "Mic2 Amplifier", NULL, "MIC2"},
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_ci	/* Line-out Routes */
45462306a36Sopenharmony_ci	{ "Left Line Out Source", "Stereo", "Left Mixer" },
45562306a36Sopenharmony_ci	{ "Left Line Out Source", "Mono Differential", "Left Mixer" },
45662306a36Sopenharmony_ci	{ "Left Line Out Source", "Mono Differential", "Right Mixer" },
45762306a36Sopenharmony_ci	{ "Left Line Out Switch", "Line Out Playback Switch", "Left Line Out Source" },
45862306a36Sopenharmony_ci	{ "LINEOUT", NULL, "Left Line Out Switch" },
45962306a36Sopenharmony_ci
46062306a36Sopenharmony_ci	{ "Right Line Out Switch", "Line Out Playback Switch", "Right Mixer" },
46162306a36Sopenharmony_ci	{ "Right Line Out Source", "Stereo", "Right Line Out Switch" },
46262306a36Sopenharmony_ci	{ "Right Line Out Source", "Mono Differential", "Left Line Out Switch" },
46362306a36Sopenharmony_ci	{ "LINEOUT", NULL, "Right Line Out Source" },
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_ci	/* Earpiece Routes */
46662306a36Sopenharmony_ci	{ "Earpiece Source Playback Route", "DACL", "Left DAC" },
46762306a36Sopenharmony_ci	{ "Earpiece Source Playback Route", "DACR", "Right DAC" },
46862306a36Sopenharmony_ci	{ "Earpiece Source Playback Route", "Left Mixer", "Left Mixer" },
46962306a36Sopenharmony_ci	{ "Earpiece Source Playback Route", "Right Mixer", "Right Mixer" },
47062306a36Sopenharmony_ci	{ "Earpiece Switch", "Earpiece Playback Switch", "Earpiece Source Playback Route" },
47162306a36Sopenharmony_ci	{ "Earpiece Amp", NULL, "Earpiece Switch" },
47262306a36Sopenharmony_ci	{ "EARPIECE", NULL, "Earpiece Amp" },
47362306a36Sopenharmony_ci};
47462306a36Sopenharmony_ci
47562306a36Sopenharmony_cistatic int sun50i_a64_codec_suspend(struct snd_soc_component *component)
47662306a36Sopenharmony_ci{
47762306a36Sopenharmony_ci	return regmap_update_bits(component->regmap, SUN50I_ADDA_HP_CTRL,
47862306a36Sopenharmony_ci				  BIT(SUN50I_ADDA_HP_CTRL_PA_CLK_GATE),
47962306a36Sopenharmony_ci				  BIT(SUN50I_ADDA_HP_CTRL_PA_CLK_GATE));
48062306a36Sopenharmony_ci}
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_cistatic int sun50i_a64_codec_resume(struct snd_soc_component *component)
48362306a36Sopenharmony_ci{
48462306a36Sopenharmony_ci	return regmap_update_bits(component->regmap, SUN50I_ADDA_HP_CTRL,
48562306a36Sopenharmony_ci				  BIT(SUN50I_ADDA_HP_CTRL_PA_CLK_GATE), 0);
48662306a36Sopenharmony_ci}
48762306a36Sopenharmony_ci
48862306a36Sopenharmony_cistatic const struct snd_soc_component_driver sun50i_codec_analog_cmpnt_drv = {
48962306a36Sopenharmony_ci	.controls		= sun50i_a64_codec_controls,
49062306a36Sopenharmony_ci	.num_controls		= ARRAY_SIZE(sun50i_a64_codec_controls),
49162306a36Sopenharmony_ci	.dapm_widgets		= sun50i_a64_codec_widgets,
49262306a36Sopenharmony_ci	.num_dapm_widgets	= ARRAY_SIZE(sun50i_a64_codec_widgets),
49362306a36Sopenharmony_ci	.dapm_routes		= sun50i_a64_codec_routes,
49462306a36Sopenharmony_ci	.num_dapm_routes	= ARRAY_SIZE(sun50i_a64_codec_routes),
49562306a36Sopenharmony_ci	.suspend		= sun50i_a64_codec_suspend,
49662306a36Sopenharmony_ci	.resume			= sun50i_a64_codec_resume,
49762306a36Sopenharmony_ci};
49862306a36Sopenharmony_ci
49962306a36Sopenharmony_cistatic const struct of_device_id sun50i_codec_analog_of_match[] = {
50062306a36Sopenharmony_ci	{
50162306a36Sopenharmony_ci		.compatible = "allwinner,sun50i-a64-codec-analog",
50262306a36Sopenharmony_ci	},
50362306a36Sopenharmony_ci	{}
50462306a36Sopenharmony_ci};
50562306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, sun50i_codec_analog_of_match);
50662306a36Sopenharmony_ci
50762306a36Sopenharmony_cistatic int sun50i_codec_analog_probe(struct platform_device *pdev)
50862306a36Sopenharmony_ci{
50962306a36Sopenharmony_ci	struct regmap *regmap;
51062306a36Sopenharmony_ci	void __iomem *base;
51162306a36Sopenharmony_ci	bool enable;
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci	base = devm_platform_ioremap_resource(pdev, 0);
51462306a36Sopenharmony_ci	if (IS_ERR(base)) {
51562306a36Sopenharmony_ci		dev_err(&pdev->dev, "Failed to map the registers\n");
51662306a36Sopenharmony_ci		return PTR_ERR(base);
51762306a36Sopenharmony_ci	}
51862306a36Sopenharmony_ci
51962306a36Sopenharmony_ci	regmap = sun8i_adda_pr_regmap_init(&pdev->dev, base);
52062306a36Sopenharmony_ci	if (IS_ERR(regmap)) {
52162306a36Sopenharmony_ci		dev_err(&pdev->dev, "Failed to create regmap\n");
52262306a36Sopenharmony_ci		return PTR_ERR(regmap);
52362306a36Sopenharmony_ci	}
52462306a36Sopenharmony_ci
52562306a36Sopenharmony_ci	enable = device_property_read_bool(&pdev->dev,
52662306a36Sopenharmony_ci					   "allwinner,internal-bias-resistor");
52762306a36Sopenharmony_ci	regmap_update_bits(regmap, SUN50I_ADDA_JACK_MIC_CTRL,
52862306a36Sopenharmony_ci			   BIT(SUN50I_ADDA_JACK_MIC_CTRL_INNERRESEN),
52962306a36Sopenharmony_ci			   enable << SUN50I_ADDA_JACK_MIC_CTRL_INNERRESEN);
53062306a36Sopenharmony_ci
53162306a36Sopenharmony_ci	return devm_snd_soc_register_component(&pdev->dev,
53262306a36Sopenharmony_ci					       &sun50i_codec_analog_cmpnt_drv,
53362306a36Sopenharmony_ci					       NULL, 0);
53462306a36Sopenharmony_ci}
53562306a36Sopenharmony_ci
53662306a36Sopenharmony_cistatic struct platform_driver sun50i_codec_analog_driver = {
53762306a36Sopenharmony_ci	.driver = {
53862306a36Sopenharmony_ci		.name = "sun50i-codec-analog",
53962306a36Sopenharmony_ci		.of_match_table = sun50i_codec_analog_of_match,
54062306a36Sopenharmony_ci	},
54162306a36Sopenharmony_ci	.probe = sun50i_codec_analog_probe,
54262306a36Sopenharmony_ci};
54362306a36Sopenharmony_cimodule_platform_driver(sun50i_codec_analog_driver);
54462306a36Sopenharmony_ci
54562306a36Sopenharmony_ciMODULE_DESCRIPTION("Allwinner internal codec analog controls driver for A64");
54662306a36Sopenharmony_ciMODULE_AUTHOR("Vasily Khoruzhick <anarsoul@gmail.com>");
54762306a36Sopenharmony_ciMODULE_LICENSE("GPL");
54862306a36Sopenharmony_ciMODULE_ALIAS("platform:sun50i-codec-analog");
549