root/sound/soc/codecs/es8316.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. es8316_set_dai_sysclk
  2. es8316_set_dai_fmt
  3. es8316_pcm_startup
  4. es8316_pcm_hw_params
  5. es8316_mute
  6. es8316_enable_micbias_for_mic_gnd_short_detect
  7. es8316_disable_micbias_for_mic_gnd_short_detect
  8. es8316_irq
  9. es8316_enable_jack_detect
  10. es8316_disable_jack_detect
  11. es8316_set_jack
  12. es8316_probe
  13. es8316_remove
  14. es8316_i2c_probe

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * es8316.c -- es8316 ALSA SoC audio driver
   4  * Copyright Everest Semiconductor Co.,Ltd
   5  *
   6  * Authors: David Yang <yangxiaohua@everest-semi.com>,
   7  *          Daniel Drake <drake@endlessm.com>
   8  */
   9 
  10 #include <linux/module.h>
  11 #include <linux/acpi.h>
  12 #include <linux/clk.h>
  13 #include <linux/delay.h>
  14 #include <linux/i2c.h>
  15 #include <linux/mod_devicetable.h>
  16 #include <linux/mutex.h>
  17 #include <linux/regmap.h>
  18 #include <sound/pcm.h>
  19 #include <sound/pcm_params.h>
  20 #include <sound/soc.h>
  21 #include <sound/soc-dapm.h>
  22 #include <sound/tlv.h>
  23 #include <sound/jack.h>
  24 #include "es8316.h"
  25 
  26 /* In slave mode at single speed, the codec is documented as accepting 5
  27  * MCLK/LRCK ratios, but we also add ratio 400, which is commonly used on
  28  * Intel Cherry Trail platforms (19.2MHz MCLK, 48kHz LRCK).
  29  */
  30 #define NR_SUPPORTED_MCLK_LRCK_RATIOS 6
  31 static const unsigned int supported_mclk_lrck_ratios[] = {
  32         256, 384, 400, 512, 768, 1024
  33 };
  34 
  35 struct es8316_priv {
  36         struct mutex lock;
  37         struct clk *mclk;
  38         struct regmap *regmap;
  39         struct snd_soc_component *component;
  40         struct snd_soc_jack *jack;
  41         int irq;
  42         unsigned int sysclk;
  43         unsigned int allowed_rates[NR_SUPPORTED_MCLK_LRCK_RATIOS];
  44         struct snd_pcm_hw_constraint_list sysclk_constraints;
  45         bool jd_inverted;
  46 };
  47 
  48 /*
  49  * ES8316 controls
  50  */
  51 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(dac_vol_tlv, -9600, 50, 1);
  52 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(adc_vol_tlv, -9600, 50, 1);
  53 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(alc_max_gain_tlv, -650, 150, 0);
  54 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(alc_min_gain_tlv, -1200, 150, 0);
  55 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(alc_target_tlv, -1650, 150, 0);
  56 static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(hpmixer_gain_tlv,
  57         0, 4, TLV_DB_SCALE_ITEM(-1200, 150, 0),
  58         8, 11, TLV_DB_SCALE_ITEM(-450, 150, 0),
  59 );
  60 
  61 static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(adc_pga_gain_tlv,
  62         0, 0, TLV_DB_SCALE_ITEM(-350, 0, 0),
  63         1, 1, TLV_DB_SCALE_ITEM(0, 0, 0),
  64         2, 2, TLV_DB_SCALE_ITEM(250, 0, 0),
  65         3, 3, TLV_DB_SCALE_ITEM(450, 0, 0),
  66         4, 4, TLV_DB_SCALE_ITEM(700, 0, 0),
  67         5, 5, TLV_DB_SCALE_ITEM(1000, 0, 0),
  68         6, 6, TLV_DB_SCALE_ITEM(1300, 0, 0),
  69         7, 7, TLV_DB_SCALE_ITEM(1600, 0, 0),
  70         8, 8, TLV_DB_SCALE_ITEM(1800, 0, 0),
  71         9, 9, TLV_DB_SCALE_ITEM(2100, 0, 0),
  72         10, 10, TLV_DB_SCALE_ITEM(2400, 0, 0),
  73 );
  74 
  75 static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(hpout_vol_tlv,
  76         0, 0, TLV_DB_SCALE_ITEM(-4800, 0, 0),
  77         1, 3, TLV_DB_SCALE_ITEM(-2400, 1200, 0),
  78 );
  79 
  80 static const char * const ng_type_txt[] =
  81         { "Constant PGA Gain", "Mute ADC Output" };
  82 static const struct soc_enum ng_type =
  83         SOC_ENUM_SINGLE(ES8316_ADC_ALC_NG, 6, 2, ng_type_txt);
  84 
  85 static const char * const adcpol_txt[] = { "Normal", "Invert" };
  86 static const struct soc_enum adcpol =
  87         SOC_ENUM_SINGLE(ES8316_ADC_MUTE, 1, 2, adcpol_txt);
  88 static const char *const dacpol_txt[] =
  89         { "Normal", "R Invert", "L Invert", "L + R Invert" };
  90 static const struct soc_enum dacpol =
  91         SOC_ENUM_SINGLE(ES8316_DAC_SET1, 0, 4, dacpol_txt);
  92 
  93 static const struct snd_kcontrol_new es8316_snd_controls[] = {
  94         SOC_DOUBLE_TLV("Headphone Playback Volume", ES8316_CPHP_ICAL_VOL,
  95                        4, 0, 3, 1, hpout_vol_tlv),
  96         SOC_DOUBLE_TLV("Headphone Mixer Volume", ES8316_HPMIX_VOL,
  97                        4, 0, 11, 0, hpmixer_gain_tlv),
  98 
  99         SOC_ENUM("Playback Polarity", dacpol),
 100         SOC_DOUBLE_R_TLV("DAC Playback Volume", ES8316_DAC_VOLL,
 101                          ES8316_DAC_VOLR, 0, 0xc0, 1, dac_vol_tlv),
 102         SOC_SINGLE("DAC Soft Ramp Switch", ES8316_DAC_SET1, 4, 1, 1),
 103         SOC_SINGLE("DAC Soft Ramp Rate", ES8316_DAC_SET1, 2, 4, 0),
 104         SOC_SINGLE("DAC Notch Filter Switch", ES8316_DAC_SET2, 6, 1, 0),
 105         SOC_SINGLE("DAC Double Fs Switch", ES8316_DAC_SET2, 7, 1, 0),
 106         SOC_SINGLE("DAC Stereo Enhancement", ES8316_DAC_SET3, 0, 7, 0),
 107         SOC_SINGLE("DAC Mono Mix Switch", ES8316_DAC_SET3, 3, 1, 0),
 108 
 109         SOC_ENUM("Capture Polarity", adcpol),
 110         SOC_SINGLE("Mic Boost Switch", ES8316_ADC_D2SEPGA, 0, 1, 0),
 111         SOC_SINGLE_TLV("ADC Capture Volume", ES8316_ADC_VOLUME,
 112                        0, 0xc0, 1, adc_vol_tlv),
 113         SOC_SINGLE_TLV("ADC PGA Gain Volume", ES8316_ADC_PGAGAIN,
 114                        4, 10, 0, adc_pga_gain_tlv),
 115         SOC_SINGLE("ADC Soft Ramp Switch", ES8316_ADC_MUTE, 4, 1, 0),
 116         SOC_SINGLE("ADC Double Fs Switch", ES8316_ADC_DMIC, 4, 1, 0),
 117 
 118         SOC_SINGLE("ALC Capture Switch", ES8316_ADC_ALC1, 6, 1, 0),
 119         SOC_SINGLE_TLV("ALC Capture Max Volume", ES8316_ADC_ALC1, 0, 28, 0,
 120                        alc_max_gain_tlv),
 121         SOC_SINGLE_TLV("ALC Capture Min Volume", ES8316_ADC_ALC2, 0, 28, 0,
 122                        alc_min_gain_tlv),
 123         SOC_SINGLE_TLV("ALC Capture Target Volume", ES8316_ADC_ALC3, 4, 10, 0,
 124                        alc_target_tlv),
 125         SOC_SINGLE("ALC Capture Hold Time", ES8316_ADC_ALC3, 0, 10, 0),
 126         SOC_SINGLE("ALC Capture Decay Time", ES8316_ADC_ALC4, 4, 10, 0),
 127         SOC_SINGLE("ALC Capture Attack Time", ES8316_ADC_ALC4, 0, 10, 0),
 128         SOC_SINGLE("ALC Capture Noise Gate Switch", ES8316_ADC_ALC_NG,
 129                    5, 1, 0),
 130         SOC_SINGLE("ALC Capture Noise Gate Threshold", ES8316_ADC_ALC_NG,
 131                    0, 31, 0),
 132         SOC_ENUM("ALC Capture Noise Gate Type", ng_type),
 133 };
 134 
 135 /* Analog Input Mux */
 136 static const char * const es8316_analog_in_txt[] = {
 137                 "lin1-rin1",
 138                 "lin2-rin2",
 139                 "lin1-rin1 with 20db Boost",
 140                 "lin2-rin2 with 20db Boost"
 141 };
 142 static const unsigned int es8316_analog_in_values[] = { 0, 1, 2, 3 };
 143 static const struct soc_enum es8316_analog_input_enum =
 144         SOC_VALUE_ENUM_SINGLE(ES8316_ADC_PDN_LINSEL, 4, 3,
 145                               ARRAY_SIZE(es8316_analog_in_txt),
 146                               es8316_analog_in_txt,
 147                               es8316_analog_in_values);
 148 static const struct snd_kcontrol_new es8316_analog_in_mux_controls =
 149         SOC_DAPM_ENUM("Route", es8316_analog_input_enum);
 150 
 151 static const char * const es8316_dmic_txt[] = {
 152                 "dmic disable",
 153                 "dmic data at high level",
 154                 "dmic data at low level",
 155 };
 156 static const unsigned int es8316_dmic_values[] = { 0, 1, 2 };
 157 static const struct soc_enum es8316_dmic_src_enum =
 158         SOC_VALUE_ENUM_SINGLE(ES8316_ADC_DMIC, 0, 3,
 159                               ARRAY_SIZE(es8316_dmic_txt),
 160                               es8316_dmic_txt,
 161                               es8316_dmic_values);
 162 static const struct snd_kcontrol_new es8316_dmic_src_controls =
 163         SOC_DAPM_ENUM("Route", es8316_dmic_src_enum);
 164 
 165 /* hp mixer mux */
 166 static const char * const es8316_hpmux_texts[] = {
 167         "lin1-rin1",
 168         "lin2-rin2",
 169         "lin-rin with Boost",
 170         "lin-rin with Boost and PGA"
 171 };
 172 
 173 static SOC_ENUM_SINGLE_DECL(es8316_left_hpmux_enum, ES8316_HPMIX_SEL,
 174         4, es8316_hpmux_texts);
 175 
 176 static const struct snd_kcontrol_new es8316_left_hpmux_controls =
 177         SOC_DAPM_ENUM("Route", es8316_left_hpmux_enum);
 178 
 179 static SOC_ENUM_SINGLE_DECL(es8316_right_hpmux_enum, ES8316_HPMIX_SEL,
 180         0, es8316_hpmux_texts);
 181 
 182 static const struct snd_kcontrol_new es8316_right_hpmux_controls =
 183         SOC_DAPM_ENUM("Route", es8316_right_hpmux_enum);
 184 
 185 /* headphone Output Mixer */
 186 static const struct snd_kcontrol_new es8316_out_left_mix[] = {
 187         SOC_DAPM_SINGLE("LLIN Switch", ES8316_HPMIX_SWITCH, 6, 1, 0),
 188         SOC_DAPM_SINGLE("Left DAC Switch", ES8316_HPMIX_SWITCH, 7, 1, 0),
 189 };
 190 static const struct snd_kcontrol_new es8316_out_right_mix[] = {
 191         SOC_DAPM_SINGLE("RLIN Switch", ES8316_HPMIX_SWITCH, 2, 1, 0),
 192         SOC_DAPM_SINGLE("Right DAC Switch", ES8316_HPMIX_SWITCH, 3, 1, 0),
 193 };
 194 
 195 /* DAC data source mux */
 196 static const char * const es8316_dacsrc_texts[] = {
 197         "LDATA TO LDAC, RDATA TO RDAC",
 198         "LDATA TO LDAC, LDATA TO RDAC",
 199         "RDATA TO LDAC, RDATA TO RDAC",
 200         "RDATA TO LDAC, LDATA TO RDAC",
 201 };
 202 
 203 static SOC_ENUM_SINGLE_DECL(es8316_dacsrc_mux_enum, ES8316_DAC_SET1,
 204         6, es8316_dacsrc_texts);
 205 
 206 static const struct snd_kcontrol_new es8316_dacsrc_mux_controls =
 207         SOC_DAPM_ENUM("Route", es8316_dacsrc_mux_enum);
 208 
 209 static const struct snd_soc_dapm_widget es8316_dapm_widgets[] = {
 210         SND_SOC_DAPM_SUPPLY("Bias", ES8316_SYS_PDN, 3, 1, NULL, 0),
 211         SND_SOC_DAPM_SUPPLY("Analog power", ES8316_SYS_PDN, 4, 1, NULL, 0),
 212         SND_SOC_DAPM_SUPPLY("Mic Bias", ES8316_SYS_PDN, 5, 1, NULL, 0),
 213 
 214         SND_SOC_DAPM_INPUT("DMIC"),
 215         SND_SOC_DAPM_INPUT("MIC1"),
 216         SND_SOC_DAPM_INPUT("MIC2"),
 217 
 218         /* Input Mux */
 219         SND_SOC_DAPM_MUX("Differential Mux", SND_SOC_NOPM, 0, 0,
 220                          &es8316_analog_in_mux_controls),
 221 
 222         SND_SOC_DAPM_SUPPLY("ADC Vref", ES8316_SYS_PDN, 1, 1, NULL, 0),
 223         SND_SOC_DAPM_SUPPLY("ADC bias", ES8316_SYS_PDN, 2, 1, NULL, 0),
 224         SND_SOC_DAPM_SUPPLY("ADC Clock", ES8316_CLKMGR_CLKSW, 3, 0, NULL, 0),
 225         SND_SOC_DAPM_PGA("Line input PGA", ES8316_ADC_PDN_LINSEL,
 226                          7, 1, NULL, 0),
 227         SND_SOC_DAPM_ADC("Mono ADC", NULL, ES8316_ADC_PDN_LINSEL, 6, 1),
 228         SND_SOC_DAPM_MUX("Digital Mic Mux", SND_SOC_NOPM, 0, 0,
 229                          &es8316_dmic_src_controls),
 230 
 231         /* Digital Interface */
 232         SND_SOC_DAPM_AIF_OUT("I2S OUT", "I2S1 Capture",  1,
 233                              ES8316_SERDATA_ADC, 6, 1),
 234         SND_SOC_DAPM_AIF_IN("I2S IN", "I2S1 Playback", 0,
 235                             SND_SOC_NOPM, 0, 0),
 236 
 237         SND_SOC_DAPM_MUX("DAC Source Mux", SND_SOC_NOPM, 0, 0,
 238                          &es8316_dacsrc_mux_controls),
 239 
 240         SND_SOC_DAPM_SUPPLY("DAC Vref", ES8316_SYS_PDN, 0, 1, NULL, 0),
 241         SND_SOC_DAPM_SUPPLY("DAC Clock", ES8316_CLKMGR_CLKSW, 2, 0, NULL, 0),
 242         SND_SOC_DAPM_DAC("Right DAC", NULL, ES8316_DAC_PDN, 0, 1),
 243         SND_SOC_DAPM_DAC("Left DAC", NULL, ES8316_DAC_PDN, 4, 1),
 244 
 245         /* Headphone Output Side */
 246         SND_SOC_DAPM_MUX("Left Headphone Mux", SND_SOC_NOPM, 0, 0,
 247                          &es8316_left_hpmux_controls),
 248         SND_SOC_DAPM_MUX("Right Headphone Mux", SND_SOC_NOPM, 0, 0,
 249                          &es8316_right_hpmux_controls),
 250         SND_SOC_DAPM_MIXER("Left Headphone Mixer", ES8316_HPMIX_PDN,
 251                            5, 1, &es8316_out_left_mix[0],
 252                            ARRAY_SIZE(es8316_out_left_mix)),
 253         SND_SOC_DAPM_MIXER("Right Headphone Mixer", ES8316_HPMIX_PDN,
 254                            1, 1, &es8316_out_right_mix[0],
 255                            ARRAY_SIZE(es8316_out_right_mix)),
 256         SND_SOC_DAPM_PGA("Left Headphone Mixer Out", ES8316_HPMIX_PDN,
 257                          4, 1, NULL, 0),
 258         SND_SOC_DAPM_PGA("Right Headphone Mixer Out", ES8316_HPMIX_PDN,
 259                          0, 1, NULL, 0),
 260 
 261         SND_SOC_DAPM_OUT_DRV("Left Headphone Charge Pump", ES8316_CPHP_OUTEN,
 262                              6, 0, NULL, 0),
 263         SND_SOC_DAPM_OUT_DRV("Right Headphone Charge Pump", ES8316_CPHP_OUTEN,
 264                              2, 0, NULL, 0),
 265         SND_SOC_DAPM_SUPPLY("Headphone Charge Pump", ES8316_CPHP_PDN2,
 266                             5, 1, NULL, 0),
 267         SND_SOC_DAPM_SUPPLY("Headphone Charge Pump Clock", ES8316_CLKMGR_CLKSW,
 268                             4, 0, NULL, 0),
 269 
 270         SND_SOC_DAPM_OUT_DRV("Left Headphone Driver", ES8316_CPHP_OUTEN,
 271                              5, 0, NULL, 0),
 272         SND_SOC_DAPM_OUT_DRV("Right Headphone Driver", ES8316_CPHP_OUTEN,
 273                              1, 0, NULL, 0),
 274         SND_SOC_DAPM_SUPPLY("Headphone Out", ES8316_CPHP_PDN1, 2, 1, NULL, 0),
 275 
 276         /* pdn_Lical and pdn_Rical bits are documented as Reserved, but must
 277          * be explicitly unset in order to enable HP output
 278          */
 279         SND_SOC_DAPM_SUPPLY("Left Headphone ical", ES8316_CPHP_ICAL_VOL,
 280                             7, 1, NULL, 0),
 281         SND_SOC_DAPM_SUPPLY("Right Headphone ical", ES8316_CPHP_ICAL_VOL,
 282                             3, 1, NULL, 0),
 283 
 284         SND_SOC_DAPM_OUTPUT("HPOL"),
 285         SND_SOC_DAPM_OUTPUT("HPOR"),
 286 };
 287 
 288 static const struct snd_soc_dapm_route es8316_dapm_routes[] = {
 289         /* Recording */
 290         {"MIC1", NULL, "Mic Bias"},
 291         {"MIC2", NULL, "Mic Bias"},
 292         {"MIC1", NULL, "Bias"},
 293         {"MIC2", NULL, "Bias"},
 294         {"MIC1", NULL, "Analog power"},
 295         {"MIC2", NULL, "Analog power"},
 296 
 297         {"Differential Mux", "lin1-rin1", "MIC1"},
 298         {"Differential Mux", "lin2-rin2", "MIC2"},
 299         {"Line input PGA", NULL, "Differential Mux"},
 300 
 301         {"Mono ADC", NULL, "ADC Clock"},
 302         {"Mono ADC", NULL, "ADC Vref"},
 303         {"Mono ADC", NULL, "ADC bias"},
 304         {"Mono ADC", NULL, "Line input PGA"},
 305 
 306         /* It's not clear why, but to avoid recording only silence,
 307          * the DAC clock must be running for the ADC to work.
 308          */
 309         {"Mono ADC", NULL, "DAC Clock"},
 310 
 311         {"Digital Mic Mux", "dmic disable", "Mono ADC"},
 312 
 313         {"I2S OUT", NULL, "Digital Mic Mux"},
 314 
 315         /* Playback */
 316         {"DAC Source Mux", "LDATA TO LDAC, RDATA TO RDAC", "I2S IN"},
 317 
 318         {"Left DAC", NULL, "DAC Clock"},
 319         {"Right DAC", NULL, "DAC Clock"},
 320 
 321         {"Left DAC", NULL, "DAC Vref"},
 322         {"Right DAC", NULL, "DAC Vref"},
 323 
 324         {"Left DAC", NULL, "DAC Source Mux"},
 325         {"Right DAC", NULL, "DAC Source Mux"},
 326 
 327         {"Left Headphone Mux", "lin-rin with Boost and PGA", "Line input PGA"},
 328         {"Right Headphone Mux", "lin-rin with Boost and PGA", "Line input PGA"},
 329 
 330         {"Left Headphone Mixer", "LLIN Switch", "Left Headphone Mux"},
 331         {"Left Headphone Mixer", "Left DAC Switch", "Left DAC"},
 332 
 333         {"Right Headphone Mixer", "RLIN Switch", "Right Headphone Mux"},
 334         {"Right Headphone Mixer", "Right DAC Switch", "Right DAC"},
 335 
 336         {"Left Headphone Mixer Out", NULL, "Left Headphone Mixer"},
 337         {"Right Headphone Mixer Out", NULL, "Right Headphone Mixer"},
 338 
 339         {"Left Headphone Charge Pump", NULL, "Left Headphone Mixer Out"},
 340         {"Right Headphone Charge Pump", NULL, "Right Headphone Mixer Out"},
 341 
 342         {"Left Headphone Charge Pump", NULL, "Headphone Charge Pump"},
 343         {"Right Headphone Charge Pump", NULL, "Headphone Charge Pump"},
 344 
 345         {"Left Headphone Charge Pump", NULL, "Headphone Charge Pump Clock"},
 346         {"Right Headphone Charge Pump", NULL, "Headphone Charge Pump Clock"},
 347 
 348         {"Left Headphone Driver", NULL, "Left Headphone Charge Pump"},
 349         {"Right Headphone Driver", NULL, "Right Headphone Charge Pump"},
 350 
 351         {"HPOL", NULL, "Left Headphone Driver"},
 352         {"HPOR", NULL, "Right Headphone Driver"},
 353 
 354         {"HPOL", NULL, "Left Headphone ical"},
 355         {"HPOR", NULL, "Right Headphone ical"},
 356 
 357         {"Headphone Out", NULL, "Bias"},
 358         {"Headphone Out", NULL, "Analog power"},
 359         {"HPOL", NULL, "Headphone Out"},
 360         {"HPOR", NULL, "Headphone Out"},
 361 };
 362 
 363 static int es8316_set_dai_sysclk(struct snd_soc_dai *codec_dai,
 364                                  int clk_id, unsigned int freq, int dir)
 365 {
 366         struct snd_soc_component *component = codec_dai->component;
 367         struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
 368         int i, ret;
 369         int count = 0;
 370 
 371         es8316->sysclk = freq;
 372 
 373         if (freq == 0) {
 374                 es8316->sysclk_constraints.list = NULL;
 375                 es8316->sysclk_constraints.count = 0;
 376 
 377                 return 0;
 378         }
 379 
 380         ret = clk_set_rate(es8316->mclk, freq);
 381         if (ret)
 382                 return ret;
 383 
 384         /* Limit supported sample rates to ones that can be autodetected
 385          * by the codec running in slave mode.
 386          */
 387         for (i = 0; i < NR_SUPPORTED_MCLK_LRCK_RATIOS; i++) {
 388                 const unsigned int ratio = supported_mclk_lrck_ratios[i];
 389 
 390                 if (freq % ratio == 0)
 391                         es8316->allowed_rates[count++] = freq / ratio;
 392         }
 393 
 394         es8316->sysclk_constraints.list = es8316->allowed_rates;
 395         es8316->sysclk_constraints.count = count;
 396 
 397         return 0;
 398 }
 399 
 400 static int es8316_set_dai_fmt(struct snd_soc_dai *codec_dai,
 401                               unsigned int fmt)
 402 {
 403         struct snd_soc_component *component = codec_dai->component;
 404         u8 serdata1 = 0;
 405         u8 serdata2 = 0;
 406         u8 clksw;
 407         u8 mask;
 408 
 409         if ((fmt & SND_SOC_DAIFMT_MASTER_MASK) != SND_SOC_DAIFMT_CBS_CFS) {
 410                 dev_err(component->dev, "Codec driver only supports slave mode\n");
 411                 return -EINVAL;
 412         }
 413 
 414         if ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) != SND_SOC_DAIFMT_I2S) {
 415                 dev_err(component->dev, "Codec driver only supports I2S format\n");
 416                 return -EINVAL;
 417         }
 418 
 419         /* Clock inversion */
 420         switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
 421         case SND_SOC_DAIFMT_NB_NF:
 422                 break;
 423         case SND_SOC_DAIFMT_IB_IF:
 424                 serdata1 |= ES8316_SERDATA1_BCLK_INV;
 425                 serdata2 |= ES8316_SERDATA2_ADCLRP;
 426                 break;
 427         case SND_SOC_DAIFMT_IB_NF:
 428                 serdata1 |= ES8316_SERDATA1_BCLK_INV;
 429                 break;
 430         case SND_SOC_DAIFMT_NB_IF:
 431                 serdata2 |= ES8316_SERDATA2_ADCLRP;
 432                 break;
 433         default:
 434                 return -EINVAL;
 435         }
 436 
 437         mask = ES8316_SERDATA1_MASTER | ES8316_SERDATA1_BCLK_INV;
 438         snd_soc_component_update_bits(component, ES8316_SERDATA1, mask, serdata1);
 439 
 440         mask = ES8316_SERDATA2_FMT_MASK | ES8316_SERDATA2_ADCLRP;
 441         snd_soc_component_update_bits(component, ES8316_SERDATA_ADC, mask, serdata2);
 442         snd_soc_component_update_bits(component, ES8316_SERDATA_DAC, mask, serdata2);
 443 
 444         /* Enable BCLK and MCLK inputs in slave mode */
 445         clksw = ES8316_CLKMGR_CLKSW_MCLK_ON | ES8316_CLKMGR_CLKSW_BCLK_ON;
 446         snd_soc_component_update_bits(component, ES8316_CLKMGR_CLKSW, clksw, clksw);
 447 
 448         return 0;
 449 }
 450 
 451 static int es8316_pcm_startup(struct snd_pcm_substream *substream,
 452                               struct snd_soc_dai *dai)
 453 {
 454         struct snd_soc_component *component = dai->component;
 455         struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
 456 
 457         if (es8316->sysclk_constraints.list)
 458                 snd_pcm_hw_constraint_list(substream->runtime, 0,
 459                                            SNDRV_PCM_HW_PARAM_RATE,
 460                                            &es8316->sysclk_constraints);
 461 
 462         return 0;
 463 }
 464 
 465 static int es8316_pcm_hw_params(struct snd_pcm_substream *substream,
 466                                 struct snd_pcm_hw_params *params,
 467                                 struct snd_soc_dai *dai)
 468 {
 469         struct snd_soc_component *component = dai->component;
 470         struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
 471         u8 wordlen = 0;
 472         int i;
 473 
 474         /* Validate supported sample rates that are autodetected from MCLK */
 475         for (i = 0; i < NR_SUPPORTED_MCLK_LRCK_RATIOS; i++) {
 476                 const unsigned int ratio = supported_mclk_lrck_ratios[i];
 477 
 478                 if (es8316->sysclk % ratio != 0)
 479                         continue;
 480                 if (es8316->sysclk / ratio == params_rate(params))
 481                         break;
 482         }
 483         if (i == NR_SUPPORTED_MCLK_LRCK_RATIOS)
 484                 return -EINVAL;
 485 
 486         switch (params_format(params)) {
 487         case SNDRV_PCM_FORMAT_S16_LE:
 488                 wordlen = ES8316_SERDATA2_LEN_16;
 489                 break;
 490         case SNDRV_PCM_FORMAT_S20_3LE:
 491                 wordlen = ES8316_SERDATA2_LEN_20;
 492                 break;
 493         case SNDRV_PCM_FORMAT_S24_LE:
 494                 wordlen = ES8316_SERDATA2_LEN_24;
 495                 break;
 496         case SNDRV_PCM_FORMAT_S32_LE:
 497                 wordlen = ES8316_SERDATA2_LEN_32;
 498                 break;
 499         default:
 500                 return -EINVAL;
 501         }
 502 
 503         snd_soc_component_update_bits(component, ES8316_SERDATA_DAC,
 504                             ES8316_SERDATA2_LEN_MASK, wordlen);
 505         snd_soc_component_update_bits(component, ES8316_SERDATA_ADC,
 506                             ES8316_SERDATA2_LEN_MASK, wordlen);
 507         return 0;
 508 }
 509 
 510 static int es8316_mute(struct snd_soc_dai *dai, int mute)
 511 {
 512         snd_soc_component_update_bits(dai->component, ES8316_DAC_SET1, 0x20,
 513                             mute ? 0x20 : 0);
 514         return 0;
 515 }
 516 
 517 #define ES8316_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
 518                         SNDRV_PCM_FMTBIT_S24_LE)
 519 
 520 static const struct snd_soc_dai_ops es8316_ops = {
 521         .startup = es8316_pcm_startup,
 522         .hw_params = es8316_pcm_hw_params,
 523         .set_fmt = es8316_set_dai_fmt,
 524         .set_sysclk = es8316_set_dai_sysclk,
 525         .digital_mute = es8316_mute,
 526 };
 527 
 528 static struct snd_soc_dai_driver es8316_dai = {
 529         .name = "ES8316 HiFi",
 530         .playback = {
 531                 .stream_name = "Playback",
 532                 .channels_min = 1,
 533                 .channels_max = 2,
 534                 .rates = SNDRV_PCM_RATE_8000_48000,
 535                 .formats = ES8316_FORMATS,
 536         },
 537         .capture = {
 538                 .stream_name = "Capture",
 539                 .channels_min = 1,
 540                 .channels_max = 2,
 541                 .rates = SNDRV_PCM_RATE_8000_48000,
 542                 .formats = ES8316_FORMATS,
 543         },
 544         .ops = &es8316_ops,
 545         .symmetric_rates = 1,
 546 };
 547 
 548 static void es8316_enable_micbias_for_mic_gnd_short_detect(
 549         struct snd_soc_component *component)
 550 {
 551         struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
 552 
 553         snd_soc_dapm_mutex_lock(dapm);
 554         snd_soc_dapm_force_enable_pin_unlocked(dapm, "Bias");
 555         snd_soc_dapm_force_enable_pin_unlocked(dapm, "Analog power");
 556         snd_soc_dapm_force_enable_pin_unlocked(dapm, "Mic Bias");
 557         snd_soc_dapm_sync_unlocked(dapm);
 558         snd_soc_dapm_mutex_unlock(dapm);
 559 
 560         msleep(20);
 561 }
 562 
 563 static void es8316_disable_micbias_for_mic_gnd_short_detect(
 564         struct snd_soc_component *component)
 565 {
 566         struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
 567 
 568         snd_soc_dapm_mutex_lock(dapm);
 569         snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Bias");
 570         snd_soc_dapm_disable_pin_unlocked(dapm, "Analog power");
 571         snd_soc_dapm_disable_pin_unlocked(dapm, "Bias");
 572         snd_soc_dapm_sync_unlocked(dapm);
 573         snd_soc_dapm_mutex_unlock(dapm);
 574 }
 575 
 576 static irqreturn_t es8316_irq(int irq, void *data)
 577 {
 578         struct es8316_priv *es8316 = data;
 579         struct snd_soc_component *comp = es8316->component;
 580         unsigned int flags;
 581 
 582         mutex_lock(&es8316->lock);
 583 
 584         regmap_read(es8316->regmap, ES8316_GPIO_FLAG, &flags);
 585         if (flags == 0x00)
 586                 goto out; /* Powered-down / reset */
 587 
 588         /* Catch spurious IRQ before set_jack is called */
 589         if (!es8316->jack)
 590                 goto out;
 591 
 592         if (es8316->jd_inverted)
 593                 flags ^= ES8316_GPIO_FLAG_HP_NOT_INSERTED;
 594 
 595         dev_dbg(comp->dev, "gpio flags %#04x\n", flags);
 596         if (flags & ES8316_GPIO_FLAG_HP_NOT_INSERTED) {
 597                 /* Jack removed, or spurious IRQ? */
 598                 if (es8316->jack->status & SND_JACK_MICROPHONE)
 599                         es8316_disable_micbias_for_mic_gnd_short_detect(comp);
 600 
 601                 if (es8316->jack->status & SND_JACK_HEADPHONE) {
 602                         snd_soc_jack_report(es8316->jack, 0,
 603                                             SND_JACK_HEADSET | SND_JACK_BTN_0);
 604                         dev_dbg(comp->dev, "jack unplugged\n");
 605                 }
 606         } else if (!(es8316->jack->status & SND_JACK_HEADPHONE)) {
 607                 /* Jack inserted, determine type */
 608                 es8316_enable_micbias_for_mic_gnd_short_detect(comp);
 609                 regmap_read(es8316->regmap, ES8316_GPIO_FLAG, &flags);
 610                 if (es8316->jd_inverted)
 611                         flags ^= ES8316_GPIO_FLAG_HP_NOT_INSERTED;
 612                 dev_dbg(comp->dev, "gpio flags %#04x\n", flags);
 613                 if (flags & ES8316_GPIO_FLAG_HP_NOT_INSERTED) {
 614                         /* Jack unplugged underneath us */
 615                         es8316_disable_micbias_for_mic_gnd_short_detect(comp);
 616                 } else if (flags & ES8316_GPIO_FLAG_GM_NOT_SHORTED) {
 617                         /* Open, headset */
 618                         snd_soc_jack_report(es8316->jack,
 619                                             SND_JACK_HEADSET,
 620                                             SND_JACK_HEADSET);
 621                         /* Keep mic-gnd-short detection on for button press */
 622                 } else {
 623                         /* Shorted, headphones */
 624                         snd_soc_jack_report(es8316->jack,
 625                                             SND_JACK_HEADPHONE,
 626                                             SND_JACK_HEADSET);
 627                         /* No longer need mic-gnd-short detection */
 628                         es8316_disable_micbias_for_mic_gnd_short_detect(comp);
 629                 }
 630         } else if (es8316->jack->status & SND_JACK_MICROPHONE) {
 631                 /* Interrupt while jack inserted, report button state */
 632                 if (flags & ES8316_GPIO_FLAG_GM_NOT_SHORTED) {
 633                         /* Open, button release */
 634                         snd_soc_jack_report(es8316->jack, 0, SND_JACK_BTN_0);
 635                 } else {
 636                         /* Short, button press */
 637                         snd_soc_jack_report(es8316->jack,
 638                                             SND_JACK_BTN_0,
 639                                             SND_JACK_BTN_0);
 640                 }
 641         }
 642 
 643 out:
 644         mutex_unlock(&es8316->lock);
 645         return IRQ_HANDLED;
 646 }
 647 
 648 static void es8316_enable_jack_detect(struct snd_soc_component *component,
 649                                       struct snd_soc_jack *jack)
 650 {
 651         struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
 652 
 653         /*
 654          * Init es8316->jd_inverted here and not in the probe, as we cannot
 655          * guarantee that the bytchr-es8316 driver, which might set this
 656          * property, will probe before us.
 657          */
 658         es8316->jd_inverted = device_property_read_bool(component->dev,
 659                                                         "everest,jack-detect-inverted");
 660 
 661         mutex_lock(&es8316->lock);
 662 
 663         es8316->jack = jack;
 664 
 665         if (es8316->jack->status & SND_JACK_MICROPHONE)
 666                 es8316_enable_micbias_for_mic_gnd_short_detect(component);
 667 
 668         snd_soc_component_update_bits(component, ES8316_GPIO_DEBOUNCE,
 669                                       ES8316_GPIO_ENABLE_INTERRUPT,
 670                                       ES8316_GPIO_ENABLE_INTERRUPT);
 671 
 672         mutex_unlock(&es8316->lock);
 673 
 674         /* Enable irq and sync initial jack state */
 675         enable_irq(es8316->irq);
 676         es8316_irq(es8316->irq, es8316);
 677 }
 678 
 679 static void es8316_disable_jack_detect(struct snd_soc_component *component)
 680 {
 681         struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
 682 
 683         disable_irq(es8316->irq);
 684 
 685         mutex_lock(&es8316->lock);
 686 
 687         snd_soc_component_update_bits(component, ES8316_GPIO_DEBOUNCE,
 688                                       ES8316_GPIO_ENABLE_INTERRUPT, 0);
 689 
 690         if (es8316->jack->status & SND_JACK_MICROPHONE) {
 691                 es8316_disable_micbias_for_mic_gnd_short_detect(component);
 692                 snd_soc_jack_report(es8316->jack, 0, SND_JACK_BTN_0);
 693         }
 694 
 695         es8316->jack = NULL;
 696 
 697         mutex_unlock(&es8316->lock);
 698 }
 699 
 700 static int es8316_set_jack(struct snd_soc_component *component,
 701                            struct snd_soc_jack *jack, void *data)
 702 {
 703         if (jack)
 704                 es8316_enable_jack_detect(component, jack);
 705         else
 706                 es8316_disable_jack_detect(component);
 707 
 708         return 0;
 709 }
 710 
 711 static int es8316_probe(struct snd_soc_component *component)
 712 {
 713         struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
 714         int ret;
 715 
 716         es8316->component = component;
 717 
 718         es8316->mclk = devm_clk_get_optional(component->dev, "mclk");
 719         if (IS_ERR(es8316->mclk)) {
 720                 dev_err(component->dev, "unable to get mclk\n");
 721                 return PTR_ERR(es8316->mclk);
 722         }
 723         if (!es8316->mclk)
 724                 dev_warn(component->dev, "assuming static mclk\n");
 725 
 726         ret = clk_prepare_enable(es8316->mclk);
 727         if (ret) {
 728                 dev_err(component->dev, "unable to enable mclk\n");
 729                 return ret;
 730         }
 731 
 732         /* Reset codec and enable current state machine */
 733         snd_soc_component_write(component, ES8316_RESET, 0x3f);
 734         usleep_range(5000, 5500);
 735         snd_soc_component_write(component, ES8316_RESET, ES8316_RESET_CSM_ON);
 736         msleep(30);
 737 
 738         /*
 739          * Documentation is unclear, but this value from the vendor driver is
 740          * needed otherwise audio output is silent.
 741          */
 742         snd_soc_component_write(component, ES8316_SYS_VMIDSEL, 0xff);
 743 
 744         /*
 745          * Documentation for this register is unclear and incomplete,
 746          * but here is a vendor-provided value that improves volume
 747          * and quality for Intel CHT platforms.
 748          */
 749         snd_soc_component_write(component, ES8316_CLKMGR_ADCOSR, 0x32);
 750 
 751         return 0;
 752 }
 753 
 754 static void es8316_remove(struct snd_soc_component *component)
 755 {
 756         struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
 757 
 758         clk_disable_unprepare(es8316->mclk);
 759 }
 760 
 761 static const struct snd_soc_component_driver soc_component_dev_es8316 = {
 762         .probe                  = es8316_probe,
 763         .remove                 = es8316_remove,
 764         .set_jack               = es8316_set_jack,
 765         .controls               = es8316_snd_controls,
 766         .num_controls           = ARRAY_SIZE(es8316_snd_controls),
 767         .dapm_widgets           = es8316_dapm_widgets,
 768         .num_dapm_widgets       = ARRAY_SIZE(es8316_dapm_widgets),
 769         .dapm_routes            = es8316_dapm_routes,
 770         .num_dapm_routes        = ARRAY_SIZE(es8316_dapm_routes),
 771         .use_pmdown_time        = 1,
 772         .endianness             = 1,
 773         .non_legacy_dai_naming  = 1,
 774 };
 775 
 776 static const struct regmap_range es8316_volatile_ranges[] = {
 777         regmap_reg_range(ES8316_GPIO_FLAG, ES8316_GPIO_FLAG),
 778 };
 779 
 780 static const struct regmap_access_table es8316_volatile_table = {
 781         .yes_ranges     = es8316_volatile_ranges,
 782         .n_yes_ranges   = ARRAY_SIZE(es8316_volatile_ranges),
 783 };
 784 
 785 static const struct regmap_config es8316_regmap = {
 786         .reg_bits = 8,
 787         .val_bits = 8,
 788         .max_register = 0x53,
 789         .volatile_table = &es8316_volatile_table,
 790         .cache_type = REGCACHE_RBTREE,
 791 };
 792 
 793 static int es8316_i2c_probe(struct i2c_client *i2c_client,
 794                             const struct i2c_device_id *id)
 795 {
 796         struct device *dev = &i2c_client->dev;
 797         struct es8316_priv *es8316;
 798         int ret;
 799 
 800         es8316 = devm_kzalloc(&i2c_client->dev, sizeof(struct es8316_priv),
 801                               GFP_KERNEL);
 802         if (es8316 == NULL)
 803                 return -ENOMEM;
 804 
 805         i2c_set_clientdata(i2c_client, es8316);
 806 
 807         es8316->regmap = devm_regmap_init_i2c(i2c_client, &es8316_regmap);
 808         if (IS_ERR(es8316->regmap))
 809                 return PTR_ERR(es8316->regmap);
 810 
 811         es8316->irq = i2c_client->irq;
 812         mutex_init(&es8316->lock);
 813 
 814         ret = devm_request_threaded_irq(dev, es8316->irq, NULL, es8316_irq,
 815                                         IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
 816                                         "es8316", es8316);
 817         if (ret == 0) {
 818                 /* Gets re-enabled by es8316_set_jack() */
 819                 disable_irq(es8316->irq);
 820         } else {
 821                 dev_warn(dev, "Failed to get IRQ %d: %d\n", es8316->irq, ret);
 822                 es8316->irq = -ENXIO;
 823         }
 824 
 825         return devm_snd_soc_register_component(&i2c_client->dev,
 826                                       &soc_component_dev_es8316,
 827                                       &es8316_dai, 1);
 828 }
 829 
 830 static const struct i2c_device_id es8316_i2c_id[] = {
 831         {"es8316", 0 },
 832         {}
 833 };
 834 MODULE_DEVICE_TABLE(i2c, es8316_i2c_id);
 835 
 836 static const struct of_device_id es8316_of_match[] = {
 837         { .compatible = "everest,es8316", },
 838         {},
 839 };
 840 MODULE_DEVICE_TABLE(of, es8316_of_match);
 841 
 842 static const struct acpi_device_id es8316_acpi_match[] = {
 843         {"ESSX8316", 0},
 844         {},
 845 };
 846 MODULE_DEVICE_TABLE(acpi, es8316_acpi_match);
 847 
 848 static struct i2c_driver es8316_i2c_driver = {
 849         .driver = {
 850                 .name                   = "es8316",
 851                 .acpi_match_table       = ACPI_PTR(es8316_acpi_match),
 852                 .of_match_table         = of_match_ptr(es8316_of_match),
 853         },
 854         .probe          = es8316_i2c_probe,
 855         .id_table       = es8316_i2c_id,
 856 };
 857 module_i2c_driver(es8316_i2c_driver);
 858 
 859 MODULE_DESCRIPTION("Everest Semi ES8316 ALSA SoC Codec Driver");
 860 MODULE_AUTHOR("David Yang <yangxiaohua@everest-semi.com>");
 861 MODULE_LICENSE("GPL v2");

/* [<][>][^][v][top][bottom][index][help] */