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

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

DEFINITIONS

This source file includes following definitions.
  1. kabylake_5660_event_lineout
  2. kabylake_ssp0_fixup
  3. kabylake_rt5660_codec_init
  4. kabylake_hdmi_init
  5. kabylake_hdmi1_init
  6. kabylake_hdmi2_init
  7. kabylake_hdmi3_init
  8. kabylake_rt5660_hw_params
  9. kbl_fe_startup
  10. kabylake_card_late_probe
  11. kabylake_audio_probe

   1 // SPDX-License-Identifier: GPL-2.0
   2 // Copyright(c) 2018-19 Canonical Corporation.
   3 
   4 /*
   5  * Intel Kabylake I2S Machine Driver with RT5660 Codec
   6  *
   7  * Modified from:
   8  *   Intel Kabylake I2S Machine driver supporting MAXIM98357a and
   9  *   DA7219 codecs
  10  * Also referred to:
  11  *   Intel Broadwell I2S Machine driver supporting RT5677 codec
  12  */
  13 
  14 #include <linux/module.h>
  15 #include <linux/platform_device.h>
  16 #include <linux/gpio/consumer.h>
  17 #include <linux/acpi.h>
  18 #include <sound/core.h>
  19 #include <sound/jack.h>
  20 #include <sound/pcm.h>
  21 #include <sound/pcm_params.h>
  22 #include <sound/soc.h>
  23 
  24 #include "../../codecs/hdac_hdmi.h"
  25 #include "../../codecs/rt5660.h"
  26 
  27 #define KBL_RT5660_CODEC_DAI "rt5660-aif1"
  28 #define DUAL_CHANNEL 2
  29 
  30 static struct snd_soc_card *kabylake_audio_card;
  31 static struct snd_soc_jack skylake_hdmi[3];
  32 static struct snd_soc_jack lineout_jack;
  33 static struct snd_soc_jack mic_jack;
  34 
  35 struct kbl_hdmi_pcm {
  36         struct list_head head;
  37         struct snd_soc_dai *codec_dai;
  38         int device;
  39 };
  40 
  41 struct kbl_codec_private {
  42         struct gpio_desc *gpio_lo_mute;
  43         struct list_head hdmi_pcm_list;
  44 };
  45 
  46 enum {
  47         KBL_DPCM_AUDIO_PB = 0,
  48         KBL_DPCM_AUDIO_CP,
  49         KBL_DPCM_AUDIO_HDMI1_PB,
  50         KBL_DPCM_AUDIO_HDMI2_PB,
  51         KBL_DPCM_AUDIO_HDMI3_PB,
  52 };
  53 
  54 #define GPIO_LINEOUT_MUTE_INDEX 0
  55 #define GPIO_LINEOUT_DET_INDEX 3
  56 #define GPIO_LINEIN_DET_INDEX 4
  57 
  58 static const struct acpi_gpio_params lineout_mute_gpio = { GPIO_LINEOUT_MUTE_INDEX, 0, true };
  59 static const struct acpi_gpio_params lineout_det_gpio = { GPIO_LINEOUT_DET_INDEX, 0, false };
  60 static const struct acpi_gpio_params mic_det_gpio = { GPIO_LINEIN_DET_INDEX, 0, false };
  61 
  62 
  63 static const struct acpi_gpio_mapping acpi_rt5660_gpios[] = {
  64         { "lineout-mute-gpios", &lineout_mute_gpio, 1 },
  65         { "lineout-det-gpios", &lineout_det_gpio, 1 },
  66         { "mic-det-gpios", &mic_det_gpio, 1 },
  67         { NULL },
  68 };
  69 
  70 static struct snd_soc_jack_pin lineout_jack_pin = {
  71         .pin    = "Line Out",
  72         .mask   = SND_JACK_LINEOUT,
  73 };
  74 
  75 static struct snd_soc_jack_pin mic_jack_pin = {
  76         .pin    = "Line In",
  77         .mask   = SND_JACK_MICROPHONE,
  78 };
  79 
  80 static struct snd_soc_jack_gpio lineout_jack_gpio = {
  81         .name                   = "lineout-det",
  82         .report                 = SND_JACK_LINEOUT,
  83         .debounce_time          = 200,
  84 };
  85 
  86 static struct snd_soc_jack_gpio mic_jack_gpio = {
  87         .name                   = "mic-det",
  88         .report                 = SND_JACK_MICROPHONE,
  89         .debounce_time          = 200,
  90 };
  91 
  92 static int kabylake_5660_event_lineout(struct snd_soc_dapm_widget *w,
  93                         struct snd_kcontrol *k, int event)
  94 {
  95         struct snd_soc_dapm_context *dapm = w->dapm;
  96         struct kbl_codec_private *priv = snd_soc_card_get_drvdata(dapm->card);
  97 
  98         gpiod_set_value_cansleep(priv->gpio_lo_mute,
  99                         !(SND_SOC_DAPM_EVENT_ON(event)));
 100 
 101         return 0;
 102 }
 103 
 104 static const struct snd_kcontrol_new kabylake_rt5660_controls[] = {
 105         SOC_DAPM_PIN_SWITCH("Line In"),
 106         SOC_DAPM_PIN_SWITCH("Line Out"),
 107 };
 108 
 109 static const struct snd_soc_dapm_widget kabylake_rt5660_widgets[] = {
 110         SND_SOC_DAPM_MIC("Line In", NULL),
 111         SND_SOC_DAPM_LINE("Line Out", kabylake_5660_event_lineout),
 112 };
 113 
 114 static const struct snd_soc_dapm_route kabylake_rt5660_map[] = {
 115         /* other jacks */
 116         {"IN1P", NULL, "Line In"},
 117         {"IN2P", NULL, "Line In"},
 118         {"Line Out", NULL, "LOUTR"},
 119         {"Line Out", NULL, "LOUTL"},
 120 
 121         /* CODEC BE connections */
 122         { "AIF1 Playback", NULL, "ssp0 Tx"},
 123         { "ssp0 Tx", NULL, "codec0_out"},
 124 
 125         { "codec0_in", NULL, "ssp0 Rx" },
 126         { "ssp0 Rx", NULL, "AIF1 Capture" },
 127 
 128         { "hifi1", NULL, "iDisp1 Tx"},
 129         { "iDisp1 Tx", NULL, "iDisp1_out"},
 130         { "hifi2", NULL, "iDisp2 Tx"},
 131         { "iDisp2 Tx", NULL, "iDisp2_out"},
 132         { "hifi3", NULL, "iDisp3 Tx"},
 133         { "iDisp3 Tx", NULL, "iDisp3_out"},
 134 };
 135 
 136 static int kabylake_ssp0_fixup(struct snd_soc_pcm_runtime *rtd,
 137                         struct snd_pcm_hw_params *params)
 138 {
 139         struct snd_interval *rate = hw_param_interval(params,
 140                         SNDRV_PCM_HW_PARAM_RATE);
 141         struct snd_interval *channels = hw_param_interval(params,
 142                         SNDRV_PCM_HW_PARAM_CHANNELS);
 143         struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
 144 
 145         /* The ADSP will convert the FE rate to 48k, stereo */
 146         rate->min = rate->max = 48000;
 147         channels->min = channels->max = DUAL_CHANNEL;
 148 
 149         /* set SSP0 to 24 bit */
 150         snd_mask_none(fmt);
 151         snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S24_LE);
 152 
 153         return 0;
 154 }
 155 
 156 static int kabylake_rt5660_codec_init(struct snd_soc_pcm_runtime *rtd)
 157 {
 158         int ret;
 159         struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(rtd->card);
 160         struct snd_soc_component *component = rtd->codec_dai->component;
 161         struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
 162 
 163         ret = devm_acpi_dev_add_driver_gpios(component->dev, acpi_rt5660_gpios);
 164         if (ret)
 165                 dev_warn(component->dev, "Failed to add driver gpios\n");
 166 
 167         /* Request rt5660 GPIO for lineout mute control, return if fails */
 168         ctx->gpio_lo_mute = devm_gpiod_get(component->dev, "lineout-mute",
 169                                            GPIOD_OUT_HIGH);
 170         if (IS_ERR(ctx->gpio_lo_mute)) {
 171                 dev_err(component->dev, "Can't find GPIO_MUTE# gpio\n");
 172                 return PTR_ERR(ctx->gpio_lo_mute);
 173         }
 174 
 175         /* Create and initialize headphone jack, this jack is not mandatory, don't return if fails */
 176         ret = snd_soc_card_jack_new(rtd->card, "Lineout Jack",
 177                                     SND_JACK_LINEOUT, &lineout_jack,
 178                                     &lineout_jack_pin, 1);
 179         if (ret)
 180                 dev_warn(component->dev, "Can't create Lineout jack\n");
 181         else {
 182                 lineout_jack_gpio.gpiod_dev = component->dev;
 183                 ret = snd_soc_jack_add_gpios(&lineout_jack, 1,
 184                                              &lineout_jack_gpio);
 185                 if (ret)
 186                         dev_warn(component->dev, "Can't add Lineout jack gpio\n");
 187         }
 188 
 189         /* Create and initialize mic jack, this jack is not mandatory, don't return if fails */
 190         ret = snd_soc_card_jack_new(rtd->card, "Mic Jack",
 191                                     SND_JACK_MICROPHONE, &mic_jack,
 192                                     &mic_jack_pin, 1);
 193         if (ret)
 194                 dev_warn(component->dev, "Can't create mic jack\n");
 195         else {
 196                 mic_jack_gpio.gpiod_dev = component->dev;
 197                 ret = snd_soc_jack_add_gpios(&mic_jack, 1, &mic_jack_gpio);
 198                 if (ret)
 199                         dev_warn(component->dev, "Can't add mic jack gpio\n");
 200         }
 201 
 202         /* Here we enable some dapms in advance to reduce the pop noise for recording via line-in */
 203         snd_soc_dapm_force_enable_pin(dapm, "MICBIAS1");
 204         snd_soc_dapm_force_enable_pin(dapm, "BST1");
 205         snd_soc_dapm_force_enable_pin(dapm, "BST2");
 206 
 207         return 0;
 208 }
 209 
 210 static int kabylake_hdmi_init(struct snd_soc_pcm_runtime *rtd, int device)
 211 {
 212         struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(rtd->card);
 213         struct snd_soc_dai *dai = rtd->codec_dai;
 214         struct kbl_hdmi_pcm *pcm;
 215 
 216         pcm = devm_kzalloc(rtd->card->dev, sizeof(*pcm), GFP_KERNEL);
 217         if (!pcm)
 218                 return -ENOMEM;
 219 
 220         pcm->device = device;
 221         pcm->codec_dai = dai;
 222 
 223         list_add_tail(&pcm->head, &ctx->hdmi_pcm_list);
 224 
 225         return 0;
 226 }
 227 
 228 static int kabylake_hdmi1_init(struct snd_soc_pcm_runtime *rtd)
 229 {
 230         return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI1_PB);
 231 }
 232 
 233 static int kabylake_hdmi2_init(struct snd_soc_pcm_runtime *rtd)
 234 {
 235         return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI2_PB);
 236 }
 237 
 238 static int kabylake_hdmi3_init(struct snd_soc_pcm_runtime *rtd)
 239 {
 240         return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI3_PB);
 241 }
 242 
 243 static int kabylake_rt5660_hw_params(struct snd_pcm_substream *substream,
 244         struct snd_pcm_hw_params *params)
 245 {
 246         struct snd_soc_pcm_runtime *rtd = substream->private_data;
 247         struct snd_soc_dai *codec_dai = rtd->codec_dai;
 248         int ret;
 249 
 250         ret = snd_soc_dai_set_sysclk(codec_dai,
 251                                      RT5660_SCLK_S_PLL1, params_rate(params) * 512,
 252                                      SND_SOC_CLOCK_IN);
 253         if (ret < 0) {
 254                 dev_err(rtd->dev, "snd_soc_dai_set_sysclk err = %d\n", ret);
 255                 return ret;
 256         }
 257 
 258         ret = snd_soc_dai_set_pll(codec_dai, 0,
 259                                   RT5660_PLL1_S_BCLK,
 260                                   params_rate(params) * 50,
 261                                   params_rate(params) * 512);
 262         if (ret < 0)
 263                 dev_err(codec_dai->dev, "can't set codec pll: %d\n", ret);
 264 
 265         return ret;
 266 }
 267 
 268 static struct snd_soc_ops kabylake_rt5660_ops = {
 269         .hw_params = kabylake_rt5660_hw_params,
 270 };
 271 
 272 static const unsigned int rates[] = {
 273         48000,
 274 };
 275 
 276 static const struct snd_pcm_hw_constraint_list constraints_rates = {
 277         .count = ARRAY_SIZE(rates),
 278         .list  = rates,
 279         .mask = 0,
 280 };
 281 
 282 static const unsigned int channels[] = {
 283         DUAL_CHANNEL,
 284 };
 285 
 286 static const struct snd_pcm_hw_constraint_list constraints_channels = {
 287         .count = ARRAY_SIZE(channels),
 288         .list = channels,
 289         .mask = 0,
 290 };
 291 
 292 static int kbl_fe_startup(struct snd_pcm_substream *substream)
 293 {
 294         struct snd_pcm_runtime *runtime = substream->runtime;
 295 
 296         /*
 297          * On this platform for PCM device we support,
 298          * 48Khz
 299          * stereo
 300          * 16 bit audio
 301          */
 302 
 303         runtime->hw.channels_max = DUAL_CHANNEL;
 304         snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
 305                                            &constraints_channels);
 306 
 307         runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
 308         snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16);
 309 
 310         snd_pcm_hw_constraint_list(runtime, 0,
 311                                 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
 312 
 313         return 0;
 314 }
 315 
 316 static const struct snd_soc_ops kabylake_rt5660_fe_ops = {
 317         .startup = kbl_fe_startup,
 318 };
 319 
 320 SND_SOC_DAILINK_DEF(dummy,
 321         DAILINK_COMP_ARRAY(COMP_DUMMY()));
 322 
 323 SND_SOC_DAILINK_DEF(system,
 324         DAILINK_COMP_ARRAY(COMP_CPU("System Pin")));
 325 
 326 SND_SOC_DAILINK_DEF(hdmi1,
 327         DAILINK_COMP_ARRAY(COMP_CPU("HDMI1 Pin")));
 328 
 329 SND_SOC_DAILINK_DEF(hdmi2,
 330         DAILINK_COMP_ARRAY(COMP_CPU("HDMI2 Pin")));
 331 
 332 SND_SOC_DAILINK_DEF(hdmi3,
 333         DAILINK_COMP_ARRAY(COMP_CPU("HDMI3 Pin")));
 334 
 335 SND_SOC_DAILINK_DEF(ssp0_pin,
 336         DAILINK_COMP_ARRAY(COMP_CPU("SSP0 Pin")));
 337 SND_SOC_DAILINK_DEF(ssp0_codec,
 338         DAILINK_COMP_ARRAY(COMP_CODEC("i2c-10EC3277:00", KBL_RT5660_CODEC_DAI)));
 339 
 340 SND_SOC_DAILINK_DEF(idisp1_pin,
 341                     DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin")));
 342 SND_SOC_DAILINK_DEF(idisp1_codec,
 343         DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi1")));
 344 
 345 SND_SOC_DAILINK_DEF(idisp2_pin,
 346         DAILINK_COMP_ARRAY(COMP_CPU("iDisp2 Pin")));
 347 SND_SOC_DAILINK_DEF(idisp2_codec,
 348         DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi2")));
 349 
 350 SND_SOC_DAILINK_DEF(idisp3_pin,
 351         DAILINK_COMP_ARRAY(COMP_CPU("iDisp3 Pin")));
 352 SND_SOC_DAILINK_DEF(idisp3_codec,
 353         DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi3")));
 354 
 355 SND_SOC_DAILINK_DEF(platform,
 356         DAILINK_COMP_ARRAY(COMP_PLATFORM("0000:00:1f.3")));
 357 
 358 /* kabylake digital audio interface glue - connects rt5660 codec <--> CPU */
 359 static struct snd_soc_dai_link kabylake_rt5660_dais[] = {
 360         /* Front End DAI links */
 361         [KBL_DPCM_AUDIO_PB] = {
 362                 .name = "Kbl Audio Port",
 363                 .stream_name = "Audio",
 364                 .dynamic = 1,
 365                 .nonatomic = 1,
 366                 .trigger = {
 367                         SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 368                 .dpcm_playback = 1,
 369                 .ops = &kabylake_rt5660_fe_ops,
 370                 SND_SOC_DAILINK_REG(system, dummy, platform),
 371         },
 372         [KBL_DPCM_AUDIO_CP] = {
 373                 .name = "Kbl Audio Capture Port",
 374                 .stream_name = "Audio Record",
 375                 .dynamic = 1,
 376                 .nonatomic = 1,
 377                 .trigger = {
 378                         SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 379                 .dpcm_capture = 1,
 380                 .ops = &kabylake_rt5660_fe_ops,
 381                 SND_SOC_DAILINK_REG(system, dummy, platform),
 382         },
 383         [KBL_DPCM_AUDIO_HDMI1_PB] = {
 384                 .name = "Kbl HDMI Port1",
 385                 .stream_name = "Hdmi1",
 386                 .dpcm_playback = 1,
 387                 .init = NULL,
 388                 .trigger = {
 389                         SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 390                 .nonatomic = 1,
 391                 .dynamic = 1,
 392                 SND_SOC_DAILINK_REG(hdmi1, dummy, platform),
 393         },
 394         [KBL_DPCM_AUDIO_HDMI2_PB] = {
 395                 .name = "Kbl HDMI Port2",
 396                 .stream_name = "Hdmi2",
 397                 .dpcm_playback = 1,
 398                 .init = NULL,
 399                 .trigger = {
 400                         SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 401                 .nonatomic = 1,
 402                 .dynamic = 1,
 403                 SND_SOC_DAILINK_REG(hdmi2, dummy, platform),
 404         },
 405         [KBL_DPCM_AUDIO_HDMI3_PB] = {
 406                 .name = "Kbl HDMI Port3",
 407                 .stream_name = "Hdmi3",
 408                 .trigger = {
 409                         SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 410                 .dpcm_playback = 1,
 411                 .init = NULL,
 412                 .nonatomic = 1,
 413                 .dynamic = 1,
 414                 SND_SOC_DAILINK_REG(hdmi3, dummy, platform),
 415         },
 416 
 417         /* Back End DAI links */
 418         {
 419                 /* SSP0 - Codec */
 420                 .name = "SSP0-Codec",
 421                 .id = 0,
 422                 .no_pcm = 1,
 423                 .init = kabylake_rt5660_codec_init,
 424                 .dai_fmt = SND_SOC_DAIFMT_I2S |
 425                 SND_SOC_DAIFMT_NB_NF |
 426                 SND_SOC_DAIFMT_CBS_CFS,
 427                 .ignore_pmdown_time = 1,
 428                 .be_hw_params_fixup = kabylake_ssp0_fixup,
 429                 .ops = &kabylake_rt5660_ops,
 430                 .dpcm_playback = 1,
 431                 .dpcm_capture = 1,
 432                 SND_SOC_DAILINK_REG(ssp0_pin, ssp0_codec, platform),
 433         },
 434         {
 435                 .name = "iDisp1",
 436                 .id = 1,
 437                 .dpcm_playback = 1,
 438                 .init = kabylake_hdmi1_init,
 439                 .no_pcm = 1,
 440                 SND_SOC_DAILINK_REG(idisp1_pin, idisp1_codec, platform),
 441         },
 442         {
 443                 .name = "iDisp2",
 444                 .id = 2,
 445                 .init = kabylake_hdmi2_init,
 446                 .dpcm_playback = 1,
 447                 .no_pcm = 1,
 448                 SND_SOC_DAILINK_REG(idisp2_pin, idisp2_codec, platform),
 449         },
 450         {
 451                 .name = "iDisp3",
 452                 .id = 3,
 453                 .init = kabylake_hdmi3_init,
 454                 .dpcm_playback = 1,
 455                 .no_pcm = 1,
 456                 SND_SOC_DAILINK_REG(idisp3_pin, idisp3_codec, platform),
 457         },
 458 };
 459 
 460 
 461 #define NAME_SIZE       32
 462 static int kabylake_card_late_probe(struct snd_soc_card *card)
 463 {
 464         struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(card);
 465         struct kbl_hdmi_pcm *pcm;
 466         struct snd_soc_component *component = NULL;
 467         int err, i = 0;
 468         char jack_name[NAME_SIZE];
 469 
 470         list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) {
 471                 component = pcm->codec_dai->component;
 472                 snprintf(jack_name, sizeof(jack_name),
 473                         "HDMI/DP, pcm=%d Jack", pcm->device);
 474                 err = snd_soc_card_jack_new(card, jack_name,
 475                                         SND_JACK_AVOUT, &skylake_hdmi[i],
 476                                         NULL, 0);
 477 
 478                 if (err)
 479                         return err;
 480 
 481                 err = hdac_hdmi_jack_init(pcm->codec_dai, pcm->device,
 482                                 &skylake_hdmi[i]);
 483                 if (err < 0)
 484                         return err;
 485 
 486                 i++;
 487 
 488         }
 489 
 490         if (!component)
 491                 return -EINVAL;
 492 
 493         return hdac_hdmi_jack_port_init(component, &card->dapm);
 494 }
 495 
 496 /* kabylake audio machine driver for rt5660 */
 497 static struct snd_soc_card kabylake_audio_card_rt5660 = {
 498         .name = "kblrt5660",
 499         .owner = THIS_MODULE,
 500         .dai_link = kabylake_rt5660_dais,
 501         .num_links = ARRAY_SIZE(kabylake_rt5660_dais),
 502         .controls = kabylake_rt5660_controls,
 503         .num_controls = ARRAY_SIZE(kabylake_rt5660_controls),
 504         .dapm_widgets = kabylake_rt5660_widgets,
 505         .num_dapm_widgets = ARRAY_SIZE(kabylake_rt5660_widgets),
 506         .dapm_routes = kabylake_rt5660_map,
 507         .num_dapm_routes = ARRAY_SIZE(kabylake_rt5660_map),
 508         .fully_routed = true,
 509         .late_probe = kabylake_card_late_probe,
 510 };
 511 
 512 static int kabylake_audio_probe(struct platform_device *pdev)
 513 {
 514         struct kbl_codec_private *ctx;
 515 
 516         ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
 517         if (!ctx)
 518                 return -ENOMEM;
 519 
 520         INIT_LIST_HEAD(&ctx->hdmi_pcm_list);
 521 
 522         kabylake_audio_card =
 523                 (struct snd_soc_card *)pdev->id_entry->driver_data;
 524 
 525         kabylake_audio_card->dev = &pdev->dev;
 526         snd_soc_card_set_drvdata(kabylake_audio_card, ctx);
 527         return devm_snd_soc_register_card(&pdev->dev, kabylake_audio_card);
 528 }
 529 
 530 static const struct platform_device_id kbl_board_ids[] = {
 531         {
 532                 .name = "kbl_rt5660",
 533                 .driver_data =
 534                         (kernel_ulong_t)&kabylake_audio_card_rt5660,
 535         },
 536         { }
 537 };
 538 
 539 static struct platform_driver kabylake_audio = {
 540         .probe = kabylake_audio_probe,
 541         .driver = {
 542                 .name = "kbl_rt5660",
 543                 .pm = &snd_soc_pm_ops,
 544         },
 545         .id_table = kbl_board_ids,
 546 };
 547 
 548 module_platform_driver(kabylake_audio)
 549 
 550 /* Module information */
 551 MODULE_DESCRIPTION("Audio Machine driver-RT5660 in I2S mode");
 552 MODULE_AUTHOR("Hui Wang <hui.wang@canonical.com>");
 553 MODULE_LICENSE("GPL v2");
 554 MODULE_ALIAS("platform:kbl_rt5660");

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