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