linux/sound/soc/intel/boards/bytcr_rt5651.c
<<
>>
Prefs
   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
  34enum {
  35        BYT_RT5651_DMIC_MAP,
  36        BYT_RT5651_IN1_MAP,
  37        BYT_RT5651_IN2_MAP,
  38        BYT_RT5651_IN1_IN2_MAP,
  39};
  40
  41enum {
  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
  48enum {
  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
  54enum {
  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
  83struct 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
  90static const struct acpi_gpio_mapping *byt_rt5651_gpios;
  91
  92/* Default: jack-detect on JD1_1, internal mic on in2, headsetmic on in3 */
  93static unsigned long byt_rt5651_quirk = BYT_RT5651_DEFAULT_QUIRKS |
  94                                        BYT_RT5651_IN2_MAP;
  95
  96static int quirk_override = -1;
  97module_param_named(quirk, quirk_override, int, 0444);
  98MODULE_PARM_DESC(quirk, "Board-specific quirk override");
  99
 100static 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
 139static 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
 171static 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
 221static 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
 235static 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
 249static 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
 267static 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
 273static 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
 279static 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
 285static 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
 292static 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
 300static 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
 308static 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
 318static 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
 328static 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
 336static 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
 347static 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
 364static const struct acpi_gpio_params pov_p1006w_hp_detect = { 1, 0, false };
 365static const struct acpi_gpio_params pov_p1006w_ext_amp_en = { 2, 0, true };
 366
 367static 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
 373static 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
 380static 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
 386static 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 */
 517static 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
 540static 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
 659static 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
 667static 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
 716static const unsigned int rates_48000[] = {
 717        48000,
 718};
 719
 720static const struct snd_pcm_hw_constraint_list constraints_48000 = {
 721        .count = ARRAY_SIZE(rates_48000),
 722        .list  = rates_48000,
 723};
 724
 725static 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
 732static const struct snd_soc_ops byt_rt5651_aif1_ops = {
 733        .startup = byt_rt5651_aif1_startup,
 734};
 735
 736static const struct snd_soc_ops byt_rt5651_be_ssp2_ops = {
 737        .hw_params = byt_rt5651_aif1_hw_params,
 738};
 739
 740SND_SOC_DAILINK_DEF(dummy,
 741        DAILINK_COMP_ARRAY(COMP_DUMMY()));
 742
 743SND_SOC_DAILINK_DEF(media,
 744        DAILINK_COMP_ARRAY(COMP_CPU("media-cpu-dai")));
 745
 746SND_SOC_DAILINK_DEF(deepbuffer,
 747        DAILINK_COMP_ARRAY(COMP_CPU("deepbuffer-cpu-dai")));
 748
 749SND_SOC_DAILINK_DEF(ssp2_port,
 750        DAILINK_COMP_ARRAY(COMP_CPU("ssp2-port")));
 751SND_SOC_DAILINK_DEF(ssp2_codec,
 752        DAILINK_COMP_ARRAY(COMP_CODEC("i2c-10EC5651:00", "rt5651-aif1")));
 753
 754SND_SOC_DAILINK_DEF(platform,
 755        DAILINK_COMP_ARRAY(COMP_PLATFORM("sst-mfld-platform")));
 756
 757static 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 */
 797static char byt_rt5651_codec_name[SND_ACPI_I2C_ID_LEN];
 798static char byt_rt5651_codec_aif_name[12]; /*  = "rt5651-aif[1|2]" */
 799static char byt_rt5651_cpu_dai_name[10]; /*  = "ssp[0|2]-port" */
 800static char byt_rt5651_long_name[50]; /* = "bytcr-rt5651-*-spk-*-mic[-swapped-hp]" */
 801
 802static 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
 820static 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
 840static 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
 854static const struct acpi_gpio_params ext_amp_enable_gpios = { 0, 0, false };
 855
 856static 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
 866struct 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
 871static 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
1114static struct platform_driver snd_byt_rt5651_mc_driver = {
1115        .driver = {
1116                .name = "bytcr_rt5651",
1117        },
1118        .probe = snd_byt_rt5651_mc_probe,
1119};
1120
1121module_platform_driver(snd_byt_rt5651_mc_driver);
1122
1123MODULE_DESCRIPTION("ASoC Intel(R) Baytrail CR Machine driver for RT5651");
1124MODULE_AUTHOR("Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>");
1125MODULE_LICENSE("GPL v2");
1126MODULE_ALIAS("platform:bytcr_rt5651");
1127