root/sound/soc/intel/boards/bytcr_rt5651.c

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

DEFINITIONS

This source file includes following definitions.
  1. log_quirks
  2. byt_rt5651_prepare_and_enable_pll1
  3. platform_clock_control
  4. rt5651_ext_amp_power_event
  5. byt_rt5651_aif1_hw_params
  6. byt_rt5651_pov_p1006w_quirk_cb
  7. byt_rt5651_quirk_cb
  8. byt_rt5651_add_codec_device_props
  9. byt_rt5651_init
  10. byt_rt5651_codec_fixup
  11. byt_rt5651_aif1_startup
  12. byt_rt5651_suspend
  13. byt_rt5651_resume
  14. snd_byt_rt5651_mc_probe

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  *  bytcr_rt5651.c - ASoc Machine driver for Intel Byt CR platform
   4  *  (derived from bytcr_rt5640.c)
   5  *
   6  *  Copyright (C) 2015 Intel Corp
   7  *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   8  *
   9  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  10  */
  11 
  12 #include <linux/init.h>
  13 #include <linux/i2c.h>
  14 #include <linux/module.h>
  15 #include <linux/platform_device.h>
  16 #include <linux/property.h>
  17 #include <linux/acpi.h>
  18 #include <linux/clk.h>
  19 #include <linux/device.h>
  20 #include <linux/dmi.h>
  21 #include <linux/input.h>
  22 #include <linux/gpio/consumer.h>
  23 #include <linux/gpio/machine.h>
  24 #include <linux/slab.h>
  25 #include <sound/pcm.h>
  26 #include <sound/pcm_params.h>
  27 #include <sound/soc.h>
  28 #include <sound/jack.h>
  29 #include <sound/soc-acpi.h>
  30 #include "../../codecs/rt5651.h"
  31 #include "../atom/sst-atom-controls.h"
  32 #include "../common/soc-intel-quirks.h"
  33 
  34 enum {
  35         BYT_RT5651_DMIC_MAP,
  36         BYT_RT5651_IN1_MAP,
  37         BYT_RT5651_IN2_MAP,
  38         BYT_RT5651_IN1_IN2_MAP,
  39 };
  40 
  41 enum {
  42         BYT_RT5651_JD_NULL      = (RT5651_JD_NULL << 4),
  43         BYT_RT5651_JD1_1        = (RT5651_JD1_1 << 4),
  44         BYT_RT5651_JD1_2        = (RT5651_JD1_2 << 4),
  45         BYT_RT5651_JD2          = (RT5651_JD2 << 4),
  46 };
  47 
  48 enum {
  49         BYT_RT5651_OVCD_TH_600UA  = (6 << 8),
  50         BYT_RT5651_OVCD_TH_1500UA = (15 << 8),
  51         BYT_RT5651_OVCD_TH_2000UA = (20 << 8),
  52 };
  53 
  54 enum {
  55         BYT_RT5651_OVCD_SF_0P5  = (RT5651_OVCD_SF_0P5 << 13),
  56         BYT_RT5651_OVCD_SF_0P75 = (RT5651_OVCD_SF_0P75 << 13),
  57         BYT_RT5651_OVCD_SF_1P0  = (RT5651_OVCD_SF_1P0 << 13),
  58         BYT_RT5651_OVCD_SF_1P5  = (RT5651_OVCD_SF_1P5 << 13),
  59 };
  60 
  61 #define BYT_RT5651_MAP(quirk)           ((quirk) & GENMASK(3, 0))
  62 #define BYT_RT5651_JDSRC(quirk)         (((quirk) & GENMASK(7, 4)) >> 4)
  63 #define BYT_RT5651_OVCD_TH(quirk)       (((quirk) & GENMASK(12, 8)) >> 8)
  64 #define BYT_RT5651_OVCD_SF(quirk)       (((quirk) & GENMASK(14, 13)) >> 13)
  65 #define BYT_RT5651_DMIC_EN              BIT(16)
  66 #define BYT_RT5651_MCLK_EN              BIT(17)
  67 #define BYT_RT5651_MCLK_25MHZ           BIT(18)
  68 #define BYT_RT5651_SSP2_AIF2            BIT(19) /* default is using AIF1  */
  69 #define BYT_RT5651_SSP0_AIF1            BIT(20)
  70 #define BYT_RT5651_SSP0_AIF2            BIT(21)
  71 #define BYT_RT5651_HP_LR_SWAPPED        BIT(22)
  72 #define BYT_RT5651_MONO_SPEAKER         BIT(23)
  73 #define BYT_RT5651_JD_NOT_INV           BIT(24)
  74 
  75 #define BYT_RT5651_DEFAULT_QUIRKS       (BYT_RT5651_MCLK_EN | \
  76                                          BYT_RT5651_JD1_1   | \
  77                                          BYT_RT5651_OVCD_TH_2000UA | \
  78                                          BYT_RT5651_OVCD_SF_0P75)
  79 
  80 /* jack-detect-source + inv + dmic-en + ovcd-th + -sf + terminating entry */
  81 #define MAX_NO_PROPS 6
  82 
  83 struct byt_rt5651_private {
  84         struct clk *mclk;
  85         struct gpio_desc *ext_amp_gpio;
  86         struct gpio_desc *hp_detect;
  87         struct snd_soc_jack jack;
  88 };
  89 
  90 static const struct acpi_gpio_mapping *byt_rt5651_gpios;
  91 
  92 /* Default: jack-detect on JD1_1, internal mic on in2, headsetmic on in3 */
  93 static unsigned long byt_rt5651_quirk = BYT_RT5651_DEFAULT_QUIRKS |
  94                                         BYT_RT5651_IN2_MAP;
  95 
  96 static int quirk_override = -1;
  97 module_param_named(quirk, quirk_override, int, 0444);
  98 MODULE_PARM_DESC(quirk, "Board-specific quirk override");
  99 
 100 static void log_quirks(struct device *dev)
 101 {
 102         if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_DMIC_MAP)
 103                 dev_info(dev, "quirk DMIC_MAP enabled");
 104         if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_IN1_MAP)
 105                 dev_info(dev, "quirk IN1_MAP enabled");
 106         if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_IN2_MAP)
 107                 dev_info(dev, "quirk IN2_MAP enabled");
 108         if (BYT_RT5651_MAP(byt_rt5651_quirk) == BYT_RT5651_IN1_IN2_MAP)
 109                 dev_info(dev, "quirk IN1_IN2_MAP enabled");
 110         if (BYT_RT5651_JDSRC(byt_rt5651_quirk)) {
 111                 dev_info(dev, "quirk realtek,jack-detect-source %ld\n",
 112                          BYT_RT5651_JDSRC(byt_rt5651_quirk));
 113                 dev_info(dev, "quirk realtek,over-current-threshold-microamp %ld\n",
 114                          BYT_RT5651_OVCD_TH(byt_rt5651_quirk) * 100);
 115                 dev_info(dev, "quirk realtek,over-current-scale-factor %ld\n",
 116                          BYT_RT5651_OVCD_SF(byt_rt5651_quirk));
 117         }
 118         if (byt_rt5651_quirk & BYT_RT5651_DMIC_EN)
 119                 dev_info(dev, "quirk DMIC enabled");
 120         if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN)
 121                 dev_info(dev, "quirk MCLK_EN enabled");
 122         if (byt_rt5651_quirk & BYT_RT5651_MCLK_25MHZ)
 123                 dev_info(dev, "quirk MCLK_25MHZ enabled");
 124         if (byt_rt5651_quirk & BYT_RT5651_SSP2_AIF2)
 125                 dev_info(dev, "quirk SSP2_AIF2 enabled\n");
 126         if (byt_rt5651_quirk & BYT_RT5651_SSP0_AIF1)
 127                 dev_info(dev, "quirk SSP0_AIF1 enabled\n");
 128         if (byt_rt5651_quirk & BYT_RT5651_SSP0_AIF2)
 129                 dev_info(dev, "quirk SSP0_AIF2 enabled\n");
 130         if (byt_rt5651_quirk & BYT_RT5651_MONO_SPEAKER)
 131                 dev_info(dev, "quirk MONO_SPEAKER enabled\n");
 132         if (byt_rt5651_quirk & BYT_RT5651_JD_NOT_INV)
 133                 dev_info(dev, "quirk JD_NOT_INV enabled\n");
 134 }
 135 
 136 #define BYT_CODEC_DAI1  "rt5651-aif1"
 137 #define BYT_CODEC_DAI2  "rt5651-aif2"
 138 
 139 static int byt_rt5651_prepare_and_enable_pll1(struct snd_soc_dai *codec_dai,
 140                                               int rate, int bclk_ratio)
 141 {
 142         int clk_id, clk_freq, ret;
 143 
 144         /* Configure the PLL before selecting it */
 145         if (!(byt_rt5651_quirk & BYT_RT5651_MCLK_EN)) {
 146                 clk_id = RT5651_PLL1_S_BCLK1,
 147                 clk_freq = rate * bclk_ratio;
 148         } else {
 149                 clk_id = RT5651_PLL1_S_MCLK;
 150                 if (byt_rt5651_quirk & BYT_RT5651_MCLK_25MHZ)
 151                         clk_freq = 25000000;
 152                 else
 153                         clk_freq = 19200000;
 154         }
 155         ret = snd_soc_dai_set_pll(codec_dai, 0, clk_id, clk_freq, rate * 512);
 156         if (ret < 0) {
 157                 dev_err(codec_dai->component->dev, "can't set pll: %d\n", ret);
 158                 return ret;
 159         }
 160 
 161         ret = snd_soc_dai_set_sysclk(codec_dai, RT5651_SCLK_S_PLL1,
 162                                      rate * 512, SND_SOC_CLOCK_IN);
 163         if (ret < 0) {
 164                 dev_err(codec_dai->component->dev, "can't set clock %d\n", ret);
 165                 return ret;
 166         }
 167 
 168         return 0;
 169 }
 170 
 171 static int platform_clock_control(struct snd_soc_dapm_widget *w,
 172                                   struct snd_kcontrol *k, int  event)
 173 {
 174         struct snd_soc_dapm_context *dapm = w->dapm;
 175         struct snd_soc_card *card = dapm->card;
 176         struct snd_soc_dai *codec_dai;
 177         struct byt_rt5651_private *priv = snd_soc_card_get_drvdata(card);
 178         int ret;
 179 
 180         codec_dai = snd_soc_card_get_codec_dai(card, BYT_CODEC_DAI1);
 181         if (!codec_dai)
 182                 codec_dai = snd_soc_card_get_codec_dai(card, BYT_CODEC_DAI2);
 183         if (!codec_dai) {
 184                 dev_err(card->dev,
 185                         "Codec dai not found; Unable to set platform clock\n");
 186                 return -EIO;
 187         }
 188 
 189         if (SND_SOC_DAPM_EVENT_ON(event)) {
 190                 if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN) {
 191                         ret = clk_prepare_enable(priv->mclk);
 192                         if (ret < 0) {
 193                                 dev_err(card->dev,
 194                                         "could not configure MCLK state");
 195                                 return ret;
 196                         }
 197                 }
 198                 ret = byt_rt5651_prepare_and_enable_pll1(codec_dai, 48000, 50);
 199         } else {
 200                 /*
 201                  * Set codec clock source to internal clock before
 202                  * turning off the platform clock. Codec needs clock
 203                  * for Jack detection and button press
 204                  */
 205                 ret = snd_soc_dai_set_sysclk(codec_dai, RT5651_SCLK_S_RCCLK,
 206                                              48000 * 512,
 207                                              SND_SOC_CLOCK_IN);
 208                 if (!ret)
 209                         if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN)
 210                                 clk_disable_unprepare(priv->mclk);
 211         }
 212 
 213         if (ret < 0) {
 214                 dev_err(card->dev, "can't set codec sysclk: %d\n", ret);
 215                 return ret;
 216         }
 217 
 218         return 0;
 219 }
 220 
 221 static int rt5651_ext_amp_power_event(struct snd_soc_dapm_widget *w,
 222         struct snd_kcontrol *kcontrol, int event)
 223 {
 224         struct snd_soc_card *card = w->dapm->card;
 225         struct byt_rt5651_private *priv = snd_soc_card_get_drvdata(card);
 226 
 227         if (SND_SOC_DAPM_EVENT_ON(event))
 228                 gpiod_set_value_cansleep(priv->ext_amp_gpio, 1);
 229         else
 230                 gpiod_set_value_cansleep(priv->ext_amp_gpio, 0);
 231 
 232         return 0;
 233 }
 234 
 235 static const struct snd_soc_dapm_widget byt_rt5651_widgets[] = {
 236         SND_SOC_DAPM_HP("Headphone", NULL),
 237         SND_SOC_DAPM_MIC("Headset Mic", NULL),
 238         SND_SOC_DAPM_MIC("Internal Mic", NULL),
 239         SND_SOC_DAPM_SPK("Speaker", NULL),
 240         SND_SOC_DAPM_LINE("Line In", NULL),
 241         SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0,
 242                             platform_clock_control, SND_SOC_DAPM_PRE_PMU |
 243                             SND_SOC_DAPM_POST_PMD),
 244         SND_SOC_DAPM_SUPPLY("Ext Amp Power", SND_SOC_NOPM, 0, 0,
 245                             rt5651_ext_amp_power_event,
 246                             SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
 247 };
 248 
 249 static const struct snd_soc_dapm_route byt_rt5651_audio_map[] = {
 250         {"Headphone", NULL, "Platform Clock"},
 251         {"Headset Mic", NULL, "Platform Clock"},
 252         {"Internal Mic", NULL, "Platform Clock"},
 253         {"Speaker", NULL, "Platform Clock"},
 254         {"Speaker", NULL, "Ext Amp Power"},
 255         {"Line In", NULL, "Platform Clock"},
 256 
 257         {"Headset Mic", NULL, "micbias1"}, /* lowercase for rt5651 */
 258         {"Headphone", NULL, "HPOL"},
 259         {"Headphone", NULL, "HPOR"},
 260         {"Speaker", NULL, "LOUTL"},
 261         {"Speaker", NULL, "LOUTR"},
 262         {"IN2P", NULL, "Line In"},
 263         {"IN2N", NULL, "Line In"},
 264 
 265 };
 266 
 267 static const struct snd_soc_dapm_route byt_rt5651_intmic_dmic_map[] = {
 268         {"DMIC L1", NULL, "Internal Mic"},
 269         {"DMIC R1", NULL, "Internal Mic"},
 270         {"IN2P", NULL, "Headset Mic"},
 271 };
 272 
 273 static const struct snd_soc_dapm_route byt_rt5651_intmic_in1_map[] = {
 274         {"Internal Mic", NULL, "micbias1"},
 275         {"IN1P", NULL, "Internal Mic"},
 276         {"IN3P", NULL, "Headset Mic"},
 277 };
 278 
 279 static const struct snd_soc_dapm_route byt_rt5651_intmic_in2_map[] = {
 280         {"Internal Mic", NULL, "micbias1"},
 281         {"IN2P", NULL, "Internal Mic"},
 282         {"IN3P", NULL, "Headset Mic"},
 283 };
 284 
 285 static const struct snd_soc_dapm_route byt_rt5651_intmic_in1_in2_map[] = {
 286         {"Internal Mic", NULL, "micbias1"},
 287         {"IN1P", NULL, "Internal Mic"},
 288         {"IN2P", NULL, "Internal Mic"},
 289         {"IN3P", NULL, "Headset Mic"},
 290 };
 291 
 292 static const struct snd_soc_dapm_route byt_rt5651_ssp0_aif1_map[] = {
 293         {"ssp0 Tx", NULL, "modem_out"},
 294         {"modem_in", NULL, "ssp0 Rx"},
 295 
 296         {"AIF1 Playback", NULL, "ssp0 Tx"},
 297         {"ssp0 Rx", NULL, "AIF1 Capture"},
 298 };
 299 
 300 static const struct snd_soc_dapm_route byt_rt5651_ssp0_aif2_map[] = {
 301         {"ssp0 Tx", NULL, "modem_out"},
 302         {"modem_in", NULL, "ssp0 Rx"},
 303 
 304         {"AIF2 Playback", NULL, "ssp0 Tx"},
 305         {"ssp0 Rx", NULL, "AIF2 Capture"},
 306 };
 307 
 308 static const struct snd_soc_dapm_route byt_rt5651_ssp2_aif1_map[] = {
 309         {"ssp2 Tx", NULL, "codec_out0"},
 310         {"ssp2 Tx", NULL, "codec_out1"},
 311         {"codec_in0", NULL, "ssp2 Rx"},
 312         {"codec_in1", NULL, "ssp2 Rx"},
 313 
 314         {"AIF1 Playback", NULL, "ssp2 Tx"},
 315         {"ssp2 Rx", NULL, "AIF1 Capture"},
 316 };
 317 
 318 static const struct snd_soc_dapm_route byt_rt5651_ssp2_aif2_map[] = {
 319         {"ssp2 Tx", NULL, "codec_out0"},
 320         {"ssp2 Tx", NULL, "codec_out1"},
 321         {"codec_in0", NULL, "ssp2 Rx"},
 322         {"codec_in1", NULL, "ssp2 Rx"},
 323 
 324         {"AIF2 Playback", NULL, "ssp2 Tx"},
 325         {"ssp2 Rx", NULL, "AIF2 Capture"},
 326 };
 327 
 328 static const struct snd_kcontrol_new byt_rt5651_controls[] = {
 329         SOC_DAPM_PIN_SWITCH("Headphone"),
 330         SOC_DAPM_PIN_SWITCH("Headset Mic"),
 331         SOC_DAPM_PIN_SWITCH("Internal Mic"),
 332         SOC_DAPM_PIN_SWITCH("Speaker"),
 333         SOC_DAPM_PIN_SWITCH("Line In"),
 334 };
 335 
 336 static struct snd_soc_jack_pin bytcr_jack_pins[] = {
 337         {
 338                 .pin    = "Headphone",
 339                 .mask   = SND_JACK_HEADPHONE,
 340         },
 341         {
 342                 .pin    = "Headset Mic",
 343                 .mask   = SND_JACK_MICROPHONE,
 344         },
 345 };
 346 
 347 static int byt_rt5651_aif1_hw_params(struct snd_pcm_substream *substream,
 348                                         struct snd_pcm_hw_params *params)
 349 {
 350         struct snd_soc_pcm_runtime *rtd = substream->private_data;
 351         struct snd_soc_dai *codec_dai = rtd->codec_dai;
 352         snd_pcm_format_t format = params_format(params);
 353         int rate = params_rate(params);
 354         int bclk_ratio;
 355 
 356         if (format == SNDRV_PCM_FORMAT_S16_LE)
 357                 bclk_ratio = 32;
 358         else
 359                 bclk_ratio = 50;
 360 
 361         return byt_rt5651_prepare_and_enable_pll1(codec_dai, rate, bclk_ratio);
 362 }
 363 
 364 static const struct acpi_gpio_params pov_p1006w_hp_detect = { 1, 0, false };
 365 static const struct acpi_gpio_params pov_p1006w_ext_amp_en = { 2, 0, true };
 366 
 367 static const struct acpi_gpio_mapping byt_rt5651_pov_p1006w_gpios[] = {
 368         { "hp-detect-gpios", &pov_p1006w_hp_detect, 1, },
 369         { "ext-amp-enable-gpios", &pov_p1006w_ext_amp_en, 1, },
 370         { },
 371 };
 372 
 373 static int byt_rt5651_pov_p1006w_quirk_cb(const struct dmi_system_id *id)
 374 {
 375         byt_rt5651_quirk = (unsigned long)id->driver_data;
 376         byt_rt5651_gpios = byt_rt5651_pov_p1006w_gpios;
 377         return 1;
 378 }
 379 
 380 static int byt_rt5651_quirk_cb(const struct dmi_system_id *id)
 381 {
 382         byt_rt5651_quirk = (unsigned long)id->driver_data;
 383         return 1;
 384 }
 385 
 386 static const struct dmi_system_id byt_rt5651_quirk_table[] = {
 387         {
 388                 /* Chuwi Hi8 Pro (CWI513) */
 389                 .callback = byt_rt5651_quirk_cb,
 390                 .matches = {
 391                         DMI_MATCH(DMI_SYS_VENDOR, "Hampoo"),
 392                         DMI_MATCH(DMI_PRODUCT_NAME, "X1D3_C806N"),
 393                 },
 394                 .driver_data = (void *)(BYT_RT5651_DEFAULT_QUIRKS |
 395                                         BYT_RT5651_IN2_MAP |
 396                                         BYT_RT5651_HP_LR_SWAPPED |
 397                                         BYT_RT5651_MONO_SPEAKER),
 398         },
 399         {
 400                 /* Chuwi Vi8 Plus (CWI519) */
 401                 .callback = byt_rt5651_quirk_cb,
 402                 .matches = {
 403                         DMI_MATCH(DMI_SYS_VENDOR, "Hampoo"),
 404                         DMI_MATCH(DMI_PRODUCT_NAME, "D2D3_Vi8A1"),
 405                 },
 406                 .driver_data = (void *)(BYT_RT5651_DEFAULT_QUIRKS |
 407                                         BYT_RT5651_IN2_MAP |
 408                                         BYT_RT5651_HP_LR_SWAPPED |
 409                                         BYT_RT5651_MONO_SPEAKER),
 410         },
 411         {
 412                 /* Complet Electro Serv MY8307 */
 413                 .callback = byt_rt5651_quirk_cb,
 414                 .matches = {
 415                         DMI_MATCH(DMI_SYS_VENDOR, "Complet Electro Serv"),
 416                         DMI_MATCH(DMI_PRODUCT_NAME, "MY8307"),
 417                 },
 418                 .driver_data = (void *)(BYT_RT5651_DEFAULT_QUIRKS |
 419                                         BYT_RT5651_IN2_MAP |
 420                                         BYT_RT5651_MONO_SPEAKER |
 421                                         BYT_RT5651_JD_NOT_INV),
 422         },
 423         {
 424                 /* I.T.Works TW701, Ployer Momo7w and Trekstor ST70416-6
 425                  * (these all use the same mainboard) */
 426                 .callback = byt_rt5651_quirk_cb,
 427                 .matches = {
 428                         DMI_MATCH(DMI_BIOS_VENDOR, "INSYDE Corp."),
 429                         /* Partial match for all of itWORKS.G.WI71C.JGBMRBA,
 430                          * TREK.G.WI71C.JGBMRBA0x and MOMO.G.WI71C.MABMRBA02 */
 431                         DMI_MATCH(DMI_BIOS_VERSION, ".G.WI71C."),
 432                 },
 433                 .driver_data = (void *)(BYT_RT5651_DEFAULT_QUIRKS |
 434                                         BYT_RT5651_IN2_MAP |
 435                                         BYT_RT5651_SSP0_AIF1 |
 436                                         BYT_RT5651_MONO_SPEAKER),
 437         },
 438         {
 439                 /* KIANO SlimNote 14.2 */
 440                 .callback = byt_rt5651_quirk_cb,
 441                 .matches = {
 442                         DMI_MATCH(DMI_SYS_VENDOR, "KIANO"),
 443                         DMI_MATCH(DMI_PRODUCT_NAME, "KIANO SlimNote 14.2"),
 444                 },
 445                 .driver_data = (void *)(BYT_RT5651_DEFAULT_QUIRKS |
 446                                         BYT_RT5651_IN1_IN2_MAP),
 447         },
 448         {
 449                 /* Minnowboard Max B3 */
 450                 .callback = byt_rt5651_quirk_cb,
 451                 .matches = {
 452                         DMI_MATCH(DMI_SYS_VENDOR, "Circuitco"),
 453                         DMI_MATCH(DMI_PRODUCT_NAME, "Minnowboard Max B3 PLATFORM"),
 454                 },
 455                 .driver_data = (void *)(BYT_RT5651_IN1_MAP),
 456         },
 457         {
 458                 /* Minnowboard Turbot */
 459                 .callback = byt_rt5651_quirk_cb,
 460                 .matches = {
 461                         DMI_MATCH(DMI_SYS_VENDOR, "ADI"),
 462                         DMI_MATCH(DMI_PRODUCT_NAME, "Minnowboard Turbot"),
 463                 },
 464                 .driver_data = (void *)(BYT_RT5651_MCLK_EN |
 465                                         BYT_RT5651_IN1_MAP),
 466         },
 467         {
 468                 /* Point of View mobii wintab p1006w (v1.0) */
 469                 .callback = byt_rt5651_pov_p1006w_quirk_cb,
 470                 .matches = {
 471                         DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Insyde"),
 472                         DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "BayTrail"),
 473                         /* Note 105b is Foxcon's USB/PCI vendor id */
 474                         DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "105B"),
 475                         DMI_EXACT_MATCH(DMI_BOARD_NAME, "0E57"),
 476                 },
 477                 .driver_data = (void *)(BYT_RT5651_DMIC_MAP |
 478                                         BYT_RT5651_OVCD_TH_2000UA |
 479                                         BYT_RT5651_OVCD_SF_0P75 |
 480                                         BYT_RT5651_DMIC_EN |
 481                                         BYT_RT5651_MCLK_EN |
 482                                         BYT_RT5651_SSP0_AIF1),
 483         },
 484         {
 485                 /* VIOS LTH17 */
 486                 .callback = byt_rt5651_quirk_cb,
 487                 .matches = {
 488                         DMI_MATCH(DMI_SYS_VENDOR, "VIOS"),
 489                         DMI_MATCH(DMI_PRODUCT_NAME, "LTH17"),
 490                 },
 491                 .driver_data = (void *)(BYT_RT5651_IN1_IN2_MAP |
 492                                         BYT_RT5651_JD1_1 |
 493                                         BYT_RT5651_OVCD_TH_2000UA |
 494                                         BYT_RT5651_OVCD_SF_1P0 |
 495                                         BYT_RT5651_MCLK_EN),
 496         },
 497         {
 498                 /* Yours Y8W81 (and others using the same mainboard) */
 499                 .callback = byt_rt5651_quirk_cb,
 500                 .matches = {
 501                         DMI_MATCH(DMI_BIOS_VENDOR, "INSYDE Corp."),
 502                         /* Partial match for all devs with a W86C mainboard */
 503                         DMI_MATCH(DMI_BIOS_VERSION, ".F.W86C."),
 504                 },
 505                 .driver_data = (void *)(BYT_RT5651_DEFAULT_QUIRKS |
 506                                         BYT_RT5651_IN2_MAP |
 507                                         BYT_RT5651_SSP0_AIF1 |
 508                                         BYT_RT5651_MONO_SPEAKER),
 509         },
 510         {}
 511 };
 512 
 513 /*
 514  * Note this MUST be called before snd_soc_register_card(), so that the props
 515  * are in place before the codec component driver's probe function parses them.
 516  */
 517 static int byt_rt5651_add_codec_device_props(struct device *i2c_dev)
 518 {
 519         struct property_entry props[MAX_NO_PROPS] = {};
 520         int cnt = 0;
 521 
 522         props[cnt++] = PROPERTY_ENTRY_U32("realtek,jack-detect-source",
 523                                 BYT_RT5651_JDSRC(byt_rt5651_quirk));
 524 
 525         props[cnt++] = PROPERTY_ENTRY_U32("realtek,over-current-threshold-microamp",
 526                                 BYT_RT5651_OVCD_TH(byt_rt5651_quirk) * 100);
 527 
 528         props[cnt++] = PROPERTY_ENTRY_U32("realtek,over-current-scale-factor",
 529                                 BYT_RT5651_OVCD_SF(byt_rt5651_quirk));
 530 
 531         if (byt_rt5651_quirk & BYT_RT5651_DMIC_EN)
 532                 props[cnt++] = PROPERTY_ENTRY_BOOL("realtek,dmic-en");
 533 
 534         if (byt_rt5651_quirk & BYT_RT5651_JD_NOT_INV)
 535                 props[cnt++] = PROPERTY_ENTRY_BOOL("realtek,jack-detect-not-inverted");
 536 
 537         return device_add_properties(i2c_dev, props);
 538 }
 539 
 540 static int byt_rt5651_init(struct snd_soc_pcm_runtime *runtime)
 541 {
 542         struct snd_soc_card *card = runtime->card;
 543         struct snd_soc_component *codec = runtime->codec_dai->component;
 544         struct byt_rt5651_private *priv = snd_soc_card_get_drvdata(card);
 545         const struct snd_soc_dapm_route *custom_map;
 546         int num_routes;
 547         int report;
 548         int ret;
 549 
 550         card->dapm.idle_bias_off = true;
 551 
 552         /* Start with RC clk for jack-detect (we disable MCLK below) */
 553         if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN)
 554                 snd_soc_component_update_bits(codec, RT5651_GLB_CLK,
 555                         RT5651_SCLK_SRC_MASK, RT5651_SCLK_SRC_RCCLK);
 556 
 557         switch (BYT_RT5651_MAP(byt_rt5651_quirk)) {
 558         case BYT_RT5651_IN1_MAP:
 559                 custom_map = byt_rt5651_intmic_in1_map;
 560                 num_routes = ARRAY_SIZE(byt_rt5651_intmic_in1_map);
 561                 break;
 562         case BYT_RT5651_IN2_MAP:
 563                 custom_map = byt_rt5651_intmic_in2_map;
 564                 num_routes = ARRAY_SIZE(byt_rt5651_intmic_in2_map);
 565                 break;
 566         case BYT_RT5651_IN1_IN2_MAP:
 567                 custom_map = byt_rt5651_intmic_in1_in2_map;
 568                 num_routes = ARRAY_SIZE(byt_rt5651_intmic_in1_in2_map);
 569                 break;
 570         default:
 571                 custom_map = byt_rt5651_intmic_dmic_map;
 572                 num_routes = ARRAY_SIZE(byt_rt5651_intmic_dmic_map);
 573         }
 574         ret = snd_soc_dapm_add_routes(&card->dapm, custom_map, num_routes);
 575         if (ret)
 576                 return ret;
 577 
 578         if (byt_rt5651_quirk & BYT_RT5651_SSP2_AIF2) {
 579                 ret = snd_soc_dapm_add_routes(&card->dapm,
 580                                         byt_rt5651_ssp2_aif2_map,
 581                                         ARRAY_SIZE(byt_rt5651_ssp2_aif2_map));
 582         } else if (byt_rt5651_quirk & BYT_RT5651_SSP0_AIF1) {
 583                 ret = snd_soc_dapm_add_routes(&card->dapm,
 584                                         byt_rt5651_ssp0_aif1_map,
 585                                         ARRAY_SIZE(byt_rt5651_ssp0_aif1_map));
 586         } else if (byt_rt5651_quirk & BYT_RT5651_SSP0_AIF2) {
 587                 ret = snd_soc_dapm_add_routes(&card->dapm,
 588                                         byt_rt5651_ssp0_aif2_map,
 589                                         ARRAY_SIZE(byt_rt5651_ssp0_aif2_map));
 590         } else {
 591                 ret = snd_soc_dapm_add_routes(&card->dapm,
 592                                         byt_rt5651_ssp2_aif1_map,
 593                                         ARRAY_SIZE(byt_rt5651_ssp2_aif1_map));
 594         }
 595         if (ret)
 596                 return ret;
 597 
 598         ret = snd_soc_add_card_controls(card, byt_rt5651_controls,
 599                                         ARRAY_SIZE(byt_rt5651_controls));
 600         if (ret) {
 601                 dev_err(card->dev, "unable to add card controls\n");
 602                 return ret;
 603         }
 604         snd_soc_dapm_ignore_suspend(&card->dapm, "Headphone");
 605         snd_soc_dapm_ignore_suspend(&card->dapm, "Speaker");
 606 
 607         if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN) {
 608                 /*
 609                  * The firmware might enable the clock at
 610                  * boot (this information may or may not
 611                  * be reflected in the enable clock register).
 612                  * To change the rate we must disable the clock
 613                  * first to cover these cases. Due to common
 614                  * clock framework restrictions that do not allow
 615                  * to disable a clock that has not been enabled,
 616                  * we need to enable the clock first.
 617                  */
 618                 ret = clk_prepare_enable(priv->mclk);
 619                 if (!ret)
 620                         clk_disable_unprepare(priv->mclk);
 621 
 622                 if (byt_rt5651_quirk & BYT_RT5651_MCLK_25MHZ)
 623                         ret = clk_set_rate(priv->mclk, 25000000);
 624                 else
 625                         ret = clk_set_rate(priv->mclk, 19200000);
 626 
 627                 if (ret)
 628                         dev_err(card->dev, "unable to set MCLK rate\n");
 629         }
 630 
 631         report = 0;
 632         if (BYT_RT5651_JDSRC(byt_rt5651_quirk))
 633                 report = SND_JACK_HEADSET | SND_JACK_BTN_0;
 634         else if (priv->hp_detect)
 635                 report = SND_JACK_HEADSET;
 636 
 637         if (report) {
 638                 ret = snd_soc_card_jack_new(runtime->card, "Headset",
 639                                     report, &priv->jack, bytcr_jack_pins,
 640                                     ARRAY_SIZE(bytcr_jack_pins));
 641                 if (ret) {
 642                         dev_err(runtime->dev, "jack creation failed %d\n", ret);
 643                         return ret;
 644                 }
 645 
 646                 if (report & SND_JACK_BTN_0)
 647                         snd_jack_set_key(priv->jack.jack, SND_JACK_BTN_0,
 648                                          KEY_PLAYPAUSE);
 649 
 650                 ret = snd_soc_component_set_jack(codec, &priv->jack,
 651                                                  priv->hp_detect);
 652                 if (ret)
 653                         return ret;
 654         }
 655 
 656         return 0;
 657 }
 658 
 659 static const struct snd_soc_pcm_stream byt_rt5651_dai_params = {
 660         .formats = SNDRV_PCM_FMTBIT_S24_LE,
 661         .rate_min = 48000,
 662         .rate_max = 48000,
 663         .channels_min = 2,
 664         .channels_max = 2,
 665 };
 666 
 667 static int byt_rt5651_codec_fixup(struct snd_soc_pcm_runtime *rtd,
 668                             struct snd_pcm_hw_params *params)
 669 {
 670         struct snd_interval *rate = hw_param_interval(params,
 671                         SNDRV_PCM_HW_PARAM_RATE);
 672         struct snd_interval *channels = hw_param_interval(params,
 673                                                 SNDRV_PCM_HW_PARAM_CHANNELS);
 674         int ret, bits;
 675 
 676         /* The DSP will covert the FE rate to 48k, stereo */
 677         rate->min = rate->max = 48000;
 678         channels->min = channels->max = 2;
 679 
 680         if ((byt_rt5651_quirk & BYT_RT5651_SSP0_AIF1) ||
 681             (byt_rt5651_quirk & BYT_RT5651_SSP0_AIF2)) {
 682                 /* set SSP0 to 16-bit */
 683                 params_set_format(params, SNDRV_PCM_FORMAT_S16_LE);
 684                 bits = 16;
 685         } else {
 686                 /* set SSP2 to 24-bit */
 687                 params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
 688                 bits = 24;
 689         }
 690 
 691         /*
 692          * Default mode for SSP configuration is TDM 4 slot, override config
 693          * with explicit setting to I2S 2ch. The word length is set with
 694          * dai_set_tdm_slot() since there is no other API exposed
 695          */
 696         ret = snd_soc_dai_set_fmt(rtd->cpu_dai,
 697                                   SND_SOC_DAIFMT_I2S     |
 698                                   SND_SOC_DAIFMT_NB_NF   |
 699                                   SND_SOC_DAIFMT_CBS_CFS
 700                                   );
 701 
 702         if (ret < 0) {
 703                 dev_err(rtd->dev, "can't set format to I2S, err %d\n", ret);
 704                 return ret;
 705         }
 706 
 707         ret = snd_soc_dai_set_tdm_slot(rtd->cpu_dai, 0x3, 0x3, 2, bits);
 708         if (ret < 0) {
 709                 dev_err(rtd->dev, "can't set I2S config, err %d\n", ret);
 710                 return ret;
 711         }
 712 
 713         return 0;
 714 }
 715 
 716 static const unsigned int rates_48000[] = {
 717         48000,
 718 };
 719 
 720 static const struct snd_pcm_hw_constraint_list constraints_48000 = {
 721         .count = ARRAY_SIZE(rates_48000),
 722         .list  = rates_48000,
 723 };
 724 
 725 static int byt_rt5651_aif1_startup(struct snd_pcm_substream *substream)
 726 {
 727         return snd_pcm_hw_constraint_list(substream->runtime, 0,
 728                         SNDRV_PCM_HW_PARAM_RATE,
 729                         &constraints_48000);
 730 }
 731 
 732 static const struct snd_soc_ops byt_rt5651_aif1_ops = {
 733         .startup = byt_rt5651_aif1_startup,
 734 };
 735 
 736 static const struct snd_soc_ops byt_rt5651_be_ssp2_ops = {
 737         .hw_params = byt_rt5651_aif1_hw_params,
 738 };
 739 
 740 SND_SOC_DAILINK_DEF(dummy,
 741         DAILINK_COMP_ARRAY(COMP_DUMMY()));
 742 
 743 SND_SOC_DAILINK_DEF(media,
 744         DAILINK_COMP_ARRAY(COMP_CPU("media-cpu-dai")));
 745 
 746 SND_SOC_DAILINK_DEF(deepbuffer,
 747         DAILINK_COMP_ARRAY(COMP_CPU("deepbuffer-cpu-dai")));
 748 
 749 SND_SOC_DAILINK_DEF(ssp2_port,
 750         DAILINK_COMP_ARRAY(COMP_CPU("ssp2-port")));
 751 SND_SOC_DAILINK_DEF(ssp2_codec,
 752         DAILINK_COMP_ARRAY(COMP_CODEC("i2c-10EC5651:00", "rt5651-aif1")));
 753 
 754 SND_SOC_DAILINK_DEF(platform,
 755         DAILINK_COMP_ARRAY(COMP_PLATFORM("sst-mfld-platform")));
 756 
 757 static struct snd_soc_dai_link byt_rt5651_dais[] = {
 758         [MERR_DPCM_AUDIO] = {
 759                 .name = "Audio Port",
 760                 .stream_name = "Audio",
 761                 .nonatomic = true,
 762                 .dynamic = 1,
 763                 .dpcm_playback = 1,
 764                 .dpcm_capture = 1,
 765                 .ops = &byt_rt5651_aif1_ops,
 766                 SND_SOC_DAILINK_REG(media, dummy, platform),
 767         },
 768         [MERR_DPCM_DEEP_BUFFER] = {
 769                 .name = "Deep-Buffer Audio Port",
 770                 .stream_name = "Deep-Buffer Audio",
 771                 .nonatomic = true,
 772                 .dynamic = 1,
 773                 .dpcm_playback = 1,
 774                 .ops = &byt_rt5651_aif1_ops,
 775                 SND_SOC_DAILINK_REG(deepbuffer, dummy, platform),
 776         },
 777         /* CODEC<->CODEC link */
 778         /* back ends */
 779         {
 780                 .name = "SSP2-Codec",
 781                 .id = 0,
 782                 .no_pcm = 1,
 783                 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
 784                                                 | SND_SOC_DAIFMT_CBS_CFS,
 785                 .be_hw_params_fixup = byt_rt5651_codec_fixup,
 786                 .ignore_suspend = 1,
 787                 .nonatomic = true,
 788                 .dpcm_playback = 1,
 789                 .dpcm_capture = 1,
 790                 .init = byt_rt5651_init,
 791                 .ops = &byt_rt5651_be_ssp2_ops,
 792                 SND_SOC_DAILINK_REG(ssp2_port, ssp2_codec, platform),
 793         },
 794 };
 795 
 796 /* SoC card */
 797 static char byt_rt5651_codec_name[SND_ACPI_I2C_ID_LEN];
 798 static char byt_rt5651_codec_aif_name[12]; /*  = "rt5651-aif[1|2]" */
 799 static char byt_rt5651_cpu_dai_name[10]; /*  = "ssp[0|2]-port" */
 800 static char byt_rt5651_long_name[50]; /* = "bytcr-rt5651-*-spk-*-mic[-swapped-hp]" */
 801 
 802 static int byt_rt5651_suspend(struct snd_soc_card *card)
 803 {
 804         struct snd_soc_component *component;
 805 
 806         if (!BYT_RT5651_JDSRC(byt_rt5651_quirk))
 807                 return 0;
 808 
 809         for_each_card_components(card, component) {
 810                 if (!strcmp(component->name, byt_rt5651_codec_name)) {
 811                         dev_dbg(component->dev, "disabling jack detect before suspend\n");
 812                         snd_soc_component_set_jack(component, NULL, NULL);
 813                         break;
 814                 }
 815         }
 816 
 817         return 0;
 818 }
 819 
 820 static int byt_rt5651_resume(struct snd_soc_card *card)
 821 {
 822         struct byt_rt5651_private *priv = snd_soc_card_get_drvdata(card);
 823         struct snd_soc_component *component;
 824 
 825         if (!BYT_RT5651_JDSRC(byt_rt5651_quirk))
 826                 return 0;
 827 
 828         for_each_card_components(card, component) {
 829                 if (!strcmp(component->name, byt_rt5651_codec_name)) {
 830                         dev_dbg(component->dev, "re-enabling jack detect after resume\n");
 831                         snd_soc_component_set_jack(component, &priv->jack,
 832                                                    priv->hp_detect);
 833                         break;
 834                 }
 835         }
 836 
 837         return 0;
 838 }
 839 
 840 static struct snd_soc_card byt_rt5651_card = {
 841         .name = "bytcr-rt5651",
 842         .owner = THIS_MODULE,
 843         .dai_link = byt_rt5651_dais,
 844         .num_links = ARRAY_SIZE(byt_rt5651_dais),
 845         .dapm_widgets = byt_rt5651_widgets,
 846         .num_dapm_widgets = ARRAY_SIZE(byt_rt5651_widgets),
 847         .dapm_routes = byt_rt5651_audio_map,
 848         .num_dapm_routes = ARRAY_SIZE(byt_rt5651_audio_map),
 849         .fully_routed = true,
 850         .suspend_pre = byt_rt5651_suspend,
 851         .resume_post = byt_rt5651_resume,
 852 };
 853 
 854 static const struct acpi_gpio_params ext_amp_enable_gpios = { 0, 0, false };
 855 
 856 static const struct acpi_gpio_mapping cht_rt5651_gpios[] = {
 857         /*
 858          * Some boards have I2cSerialBusV2, GpioIo, GpioInt as ACPI resources,
 859          * other boards may  have I2cSerialBusV2, GpioInt, GpioIo instead.
 860          * We want the GpioIo one for the ext-amp-enable-gpio.
 861          */
 862         { "ext-amp-enable-gpios", &ext_amp_enable_gpios, 1, ACPI_GPIO_QUIRK_ONLY_GPIOIO },
 863         { },
 864 };
 865 
 866 struct acpi_chan_package {   /* ACPICA seems to require 64 bit integers */
 867         u64 aif_value;       /* 1: AIF1, 2: AIF2 */
 868         u64 mclock_value;    /* usually 25MHz (0x17d7940), ignored */
 869 };
 870 
 871 static int snd_byt_rt5651_mc_probe(struct platform_device *pdev)
 872 {
 873         static const char * const mic_name[] = { "dmic", "in1", "in2", "in12" };
 874         struct byt_rt5651_private *priv;
 875         struct snd_soc_acpi_mach *mach;
 876         const char *platform_name;
 877         struct acpi_device *adev;
 878         struct device *codec_dev;
 879         const char *hp_swapped;
 880         bool is_bytcr = false;
 881         int ret_val = 0;
 882         int dai_index = 0;
 883         int i;
 884 
 885         priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
 886         if (!priv)
 887                 return -ENOMEM;
 888 
 889         /* register the soc card */
 890         byt_rt5651_card.dev = &pdev->dev;
 891 
 892         mach = byt_rt5651_card.dev->platform_data;
 893         snd_soc_card_set_drvdata(&byt_rt5651_card, priv);
 894 
 895         /* fix index of codec dai */
 896         for (i = 0; i < ARRAY_SIZE(byt_rt5651_dais); i++) {
 897                 if (!strcmp(byt_rt5651_dais[i].codecs->name,
 898                             "i2c-10EC5651:00")) {
 899                         dai_index = i;
 900                         break;
 901                 }
 902         }
 903 
 904         /* fixup codec name based on HID */
 905         adev = acpi_dev_get_first_match_dev(mach->id, NULL, -1);
 906         if (adev) {
 907                 snprintf(byt_rt5651_codec_name, sizeof(byt_rt5651_codec_name),
 908                          "i2c-%s", acpi_dev_name(adev));
 909                 put_device(&adev->dev);
 910                 byt_rt5651_dais[dai_index].codecs->name = byt_rt5651_codec_name;
 911         } else {
 912                 dev_err(&pdev->dev, "Error cannot find '%s' dev\n", mach->id);
 913                 return -ENODEV;
 914         }
 915 
 916         codec_dev = bus_find_device_by_name(&i2c_bus_type, NULL,
 917                                             byt_rt5651_codec_name);
 918         if (!codec_dev)
 919                 return -EPROBE_DEFER;
 920 
 921         /*
 922          * swap SSP0 if bytcr is detected
 923          * (will be overridden if DMI quirk is detected)
 924          */
 925         if (soc_intel_is_byt()) {
 926                 if (mach->mach_params.acpi_ipc_irq_index == 0)
 927                         is_bytcr = true;
 928         }
 929 
 930         if (is_bytcr) {
 931                 /*
 932                  * Baytrail CR platforms may have CHAN package in BIOS, try
 933                  * to find relevant routing quirk based as done on Windows
 934                  * platforms. We have to read the information directly from the
 935                  * BIOS, at this stage the card is not created and the links
 936                  * with the codec driver/pdata are non-existent
 937                  */
 938 
 939                 struct acpi_chan_package chan_package;
 940 
 941                 /* format specified: 2 64-bit integers */
 942                 struct acpi_buffer format = {sizeof("NN"), "NN"};
 943                 struct acpi_buffer state = {0, NULL};
 944                 struct snd_soc_acpi_package_context pkg_ctx;
 945                 bool pkg_found = false;
 946 
 947                 state.length = sizeof(chan_package);
 948                 state.pointer = &chan_package;
 949 
 950                 pkg_ctx.name = "CHAN";
 951                 pkg_ctx.length = 2;
 952                 pkg_ctx.format = &format;
 953                 pkg_ctx.state = &state;
 954                 pkg_ctx.data_valid = false;
 955 
 956                 pkg_found = snd_soc_acpi_find_package_from_hid(mach->id,
 957                                                                &pkg_ctx);
 958                 if (pkg_found) {
 959                         if (chan_package.aif_value == 1) {
 960                                 dev_info(&pdev->dev, "BIOS Routing: AIF1 connected\n");
 961                                 byt_rt5651_quirk |= BYT_RT5651_SSP0_AIF1;
 962                         } else  if (chan_package.aif_value == 2) {
 963                                 dev_info(&pdev->dev, "BIOS Routing: AIF2 connected\n");
 964                                 byt_rt5651_quirk |= BYT_RT5651_SSP0_AIF2;
 965                         } else {
 966                                 dev_info(&pdev->dev, "BIOS Routing isn't valid, ignored\n");
 967                                 pkg_found = false;
 968                         }
 969                 }
 970 
 971                 if (!pkg_found) {
 972                         /* no BIOS indications, assume SSP0-AIF2 connection */
 973                         byt_rt5651_quirk |= BYT_RT5651_SSP0_AIF2;
 974                 }
 975         }
 976 
 977         /* check quirks before creating card */
 978         dmi_check_system(byt_rt5651_quirk_table);
 979 
 980         if (quirk_override != -1) {
 981                 dev_info(&pdev->dev, "Overriding quirk 0x%x => 0x%x\n",
 982                          (unsigned int)byt_rt5651_quirk, quirk_override);
 983                 byt_rt5651_quirk = quirk_override;
 984         }
 985 
 986         /* Must be called before register_card, also see declaration comment. */
 987         ret_val = byt_rt5651_add_codec_device_props(codec_dev);
 988         if (ret_val) {
 989                 put_device(codec_dev);
 990                 return ret_val;
 991         }
 992 
 993         /* Cherry Trail devices use an external amplifier enable gpio */
 994         if (soc_intel_is_cht() && !byt_rt5651_gpios)
 995                 byt_rt5651_gpios = cht_rt5651_gpios;
 996 
 997         if (byt_rt5651_gpios) {
 998                 devm_acpi_dev_add_driver_gpios(codec_dev, byt_rt5651_gpios);
 999                 priv->ext_amp_gpio = devm_fwnode_get_index_gpiod_from_child(
1000                                                 &pdev->dev, "ext-amp-enable", 0,
1001                                                 codec_dev->fwnode,
1002                                                 GPIOD_OUT_LOW, "speaker-amp");
1003                 if (IS_ERR(priv->ext_amp_gpio)) {
1004                         ret_val = PTR_ERR(priv->ext_amp_gpio);
1005                         switch (ret_val) {
1006                         case -ENOENT:
1007                                 priv->ext_amp_gpio = NULL;
1008                                 break;
1009                         default:
1010                                 dev_err(&pdev->dev, "Failed to get ext-amp-enable GPIO: %d\n",
1011                                         ret_val);
1012                                 /* fall through */
1013                         case -EPROBE_DEFER:
1014                                 put_device(codec_dev);
1015                                 return ret_val;
1016                         }
1017                 }
1018                 priv->hp_detect = devm_fwnode_get_index_gpiod_from_child(
1019                                                 &pdev->dev, "hp-detect", 0,
1020                                                 codec_dev->fwnode,
1021                                                 GPIOD_IN, "hp-detect");
1022                 if (IS_ERR(priv->hp_detect)) {
1023                         ret_val = PTR_ERR(priv->hp_detect);
1024                         switch (ret_val) {
1025                         case -ENOENT:
1026                                 priv->hp_detect = NULL;
1027                                 break;
1028                         default:
1029                                 dev_err(&pdev->dev, "Failed to get hp-detect GPIO: %d\n",
1030                                         ret_val);
1031                                 /* fall through */
1032                         case -EPROBE_DEFER:
1033                                 put_device(codec_dev);
1034                                 return ret_val;
1035                         }
1036                 }
1037         }
1038 
1039         put_device(codec_dev);
1040 
1041         log_quirks(&pdev->dev);
1042 
1043         if ((byt_rt5651_quirk & BYT_RT5651_SSP2_AIF2) ||
1044             (byt_rt5651_quirk & BYT_RT5651_SSP0_AIF2)) {
1045                 /* fixup codec aif name */
1046                 snprintf(byt_rt5651_codec_aif_name,
1047                         sizeof(byt_rt5651_codec_aif_name),
1048                         "%s", "rt5651-aif2");
1049 
1050                 byt_rt5651_dais[dai_index].codecs->dai_name =
1051                         byt_rt5651_codec_aif_name;
1052         }
1053 
1054         if ((byt_rt5651_quirk & BYT_RT5651_SSP0_AIF1) ||
1055             (byt_rt5651_quirk & BYT_RT5651_SSP0_AIF2)) {
1056                 /* fixup cpu dai name name */
1057                 snprintf(byt_rt5651_cpu_dai_name,
1058                         sizeof(byt_rt5651_cpu_dai_name),
1059                         "%s", "ssp0-port");
1060 
1061                 byt_rt5651_dais[dai_index].cpus->dai_name =
1062                         byt_rt5651_cpu_dai_name;
1063         }
1064 
1065         if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN) {
1066                 priv->mclk = devm_clk_get(&pdev->dev, "pmc_plt_clk_3");
1067                 if (IS_ERR(priv->mclk)) {
1068                         ret_val = PTR_ERR(priv->mclk);
1069                         dev_err(&pdev->dev,
1070                                 "Failed to get MCLK from pmc_plt_clk_3: %d\n",
1071                                 ret_val);
1072                         /*
1073                          * Fall back to bit clock usage for -ENOENT (clock not
1074                          * available likely due to missing dependencies), bail
1075                          * for all other errors, including -EPROBE_DEFER
1076                          */
1077                         if (ret_val != -ENOENT)
1078                                 return ret_val;
1079                         byt_rt5651_quirk &= ~BYT_RT5651_MCLK_EN;
1080                 }
1081         }
1082 
1083         if (byt_rt5651_quirk & BYT_RT5651_HP_LR_SWAPPED)
1084                 hp_swapped = "-hp-swapped";
1085         else
1086                 hp_swapped = "";
1087 
1088         snprintf(byt_rt5651_long_name, sizeof(byt_rt5651_long_name),
1089                  "bytcr-rt5651-%s-spk-%s-mic%s",
1090                  (byt_rt5651_quirk & BYT_RT5651_MONO_SPEAKER) ?
1091                         "mono" : "stereo",
1092                  mic_name[BYT_RT5651_MAP(byt_rt5651_quirk)], hp_swapped);
1093         byt_rt5651_card.long_name = byt_rt5651_long_name;
1094 
1095         /* override plaform name, if required */
1096         platform_name = mach->mach_params.platform;
1097 
1098         ret_val = snd_soc_fixup_dai_links_platform_name(&byt_rt5651_card,
1099                                                         platform_name);
1100         if (ret_val)
1101                 return ret_val;
1102 
1103         ret_val = devm_snd_soc_register_card(&pdev->dev, &byt_rt5651_card);
1104 
1105         if (ret_val) {
1106                 dev_err(&pdev->dev, "devm_snd_soc_register_card failed %d\n",
1107                         ret_val);
1108                 return ret_val;
1109         }
1110         platform_set_drvdata(pdev, &byt_rt5651_card);
1111         return ret_val;
1112 }
1113 
1114 static struct platform_driver snd_byt_rt5651_mc_driver = {
1115         .driver = {
1116                 .name = "bytcr_rt5651",
1117         },
1118         .probe = snd_byt_rt5651_mc_probe,
1119 };
1120 
1121 module_platform_driver(snd_byt_rt5651_mc_driver);
1122 
1123 MODULE_DESCRIPTION("ASoC Intel(R) Baytrail CR Machine driver for RT5651");
1124 MODULE_AUTHOR("Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>");
1125 MODULE_LICENSE("GPL v2");
1126 MODULE_ALIAS("platform:bytcr_rt5651");

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