162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci// 362306a36Sopenharmony_ci// Speyside audio support 462306a36Sopenharmony_ci// 562306a36Sopenharmony_ci// Copyright 2011 Wolfson Microelectronics 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <sound/soc.h> 862306a36Sopenharmony_ci#include <sound/soc-dapm.h> 962306a36Sopenharmony_ci#include <sound/jack.h> 1062306a36Sopenharmony_ci#include <linux/gpio.h> 1162306a36Sopenharmony_ci#include <linux/module.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include "../codecs/wm8996.h" 1462306a36Sopenharmony_ci#include "../codecs/wm9081.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define WM8996_HPSEL_GPIO 214 1762306a36Sopenharmony_ci#define MCLK_AUDIO_RATE (512 * 48000) 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistatic int speyside_set_bias_level(struct snd_soc_card *card, 2062306a36Sopenharmony_ci struct snd_soc_dapm_context *dapm, 2162306a36Sopenharmony_ci enum snd_soc_bias_level level) 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci struct snd_soc_pcm_runtime *rtd; 2462306a36Sopenharmony_ci struct snd_soc_dai *codec_dai; 2562306a36Sopenharmony_ci int ret; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci rtd = snd_soc_get_pcm_runtime(card, &card->dai_link[1]); 2862306a36Sopenharmony_ci codec_dai = asoc_rtd_to_codec(rtd, 0); 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci if (dapm->dev != codec_dai->dev) 3162306a36Sopenharmony_ci return 0; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci switch (level) { 3462306a36Sopenharmony_ci case SND_SOC_BIAS_STANDBY: 3562306a36Sopenharmony_ci ret = snd_soc_dai_set_sysclk(codec_dai, WM8996_SYSCLK_MCLK2, 3662306a36Sopenharmony_ci 32768, SND_SOC_CLOCK_IN); 3762306a36Sopenharmony_ci if (ret < 0) 3862306a36Sopenharmony_ci return ret; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci ret = snd_soc_dai_set_pll(codec_dai, WM8996_FLL_MCLK2, 4162306a36Sopenharmony_ci 0, 0, 0); 4262306a36Sopenharmony_ci if (ret < 0) { 4362306a36Sopenharmony_ci pr_err("Failed to stop FLL\n"); 4462306a36Sopenharmony_ci return ret; 4562306a36Sopenharmony_ci } 4662306a36Sopenharmony_ci break; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci default: 4962306a36Sopenharmony_ci break; 5062306a36Sopenharmony_ci } 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci return 0; 5362306a36Sopenharmony_ci} 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic int speyside_set_bias_level_post(struct snd_soc_card *card, 5662306a36Sopenharmony_ci struct snd_soc_dapm_context *dapm, 5762306a36Sopenharmony_ci enum snd_soc_bias_level level) 5862306a36Sopenharmony_ci{ 5962306a36Sopenharmony_ci struct snd_soc_pcm_runtime *rtd; 6062306a36Sopenharmony_ci struct snd_soc_dai *codec_dai; 6162306a36Sopenharmony_ci int ret; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci rtd = snd_soc_get_pcm_runtime(card, &card->dai_link[1]); 6462306a36Sopenharmony_ci codec_dai = asoc_rtd_to_codec(rtd, 0); 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci if (dapm->dev != codec_dai->dev) 6762306a36Sopenharmony_ci return 0; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci switch (level) { 7062306a36Sopenharmony_ci case SND_SOC_BIAS_PREPARE: 7162306a36Sopenharmony_ci if (card->dapm.bias_level == SND_SOC_BIAS_STANDBY) { 7262306a36Sopenharmony_ci ret = snd_soc_dai_set_pll(codec_dai, 0, 7362306a36Sopenharmony_ci WM8996_FLL_MCLK2, 7462306a36Sopenharmony_ci 32768, MCLK_AUDIO_RATE); 7562306a36Sopenharmony_ci if (ret < 0) { 7662306a36Sopenharmony_ci pr_err("Failed to start FLL\n"); 7762306a36Sopenharmony_ci return ret; 7862306a36Sopenharmony_ci } 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci ret = snd_soc_dai_set_sysclk(codec_dai, 8162306a36Sopenharmony_ci WM8996_SYSCLK_FLL, 8262306a36Sopenharmony_ci MCLK_AUDIO_RATE, 8362306a36Sopenharmony_ci SND_SOC_CLOCK_IN); 8462306a36Sopenharmony_ci if (ret < 0) 8562306a36Sopenharmony_ci return ret; 8662306a36Sopenharmony_ci } 8762306a36Sopenharmony_ci break; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci default: 9062306a36Sopenharmony_ci break; 9162306a36Sopenharmony_ci } 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci card->dapm.bias_level = level; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci return 0; 9662306a36Sopenharmony_ci} 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_cistatic struct snd_soc_jack speyside_headset; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci/* Headset jack detection DAPM pins */ 10162306a36Sopenharmony_cistatic struct snd_soc_jack_pin speyside_headset_pins[] = { 10262306a36Sopenharmony_ci { 10362306a36Sopenharmony_ci .pin = "Headset Mic", 10462306a36Sopenharmony_ci .mask = SND_JACK_MICROPHONE, 10562306a36Sopenharmony_ci }, 10662306a36Sopenharmony_ci}; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci/* Default the headphone selection to active high */ 10962306a36Sopenharmony_cistatic int speyside_jack_polarity; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistatic int speyside_get_micbias(struct snd_soc_dapm_widget *source, 11262306a36Sopenharmony_ci struct snd_soc_dapm_widget *sink) 11362306a36Sopenharmony_ci{ 11462306a36Sopenharmony_ci if (speyside_jack_polarity && (strcmp(source->name, "MICB1") == 0)) 11562306a36Sopenharmony_ci return 1; 11662306a36Sopenharmony_ci if (!speyside_jack_polarity && (strcmp(source->name, "MICB2") == 0)) 11762306a36Sopenharmony_ci return 1; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci return 0; 12062306a36Sopenharmony_ci} 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_cistatic void speyside_set_polarity(struct snd_soc_component *component, 12362306a36Sopenharmony_ci int polarity) 12462306a36Sopenharmony_ci{ 12562306a36Sopenharmony_ci speyside_jack_polarity = !polarity; 12662306a36Sopenharmony_ci gpio_direction_output(WM8996_HPSEL_GPIO, speyside_jack_polarity); 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci /* Re-run DAPM to make sure we're using the correct mic bias */ 12962306a36Sopenharmony_ci snd_soc_dapm_sync(snd_soc_component_get_dapm(component)); 13062306a36Sopenharmony_ci} 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cistatic int speyside_wm0010_init(struct snd_soc_pcm_runtime *rtd) 13362306a36Sopenharmony_ci{ 13462306a36Sopenharmony_ci struct snd_soc_dai *dai = asoc_rtd_to_codec(rtd, 0); 13562306a36Sopenharmony_ci int ret; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci ret = snd_soc_dai_set_sysclk(dai, 0, MCLK_AUDIO_RATE, 0); 13862306a36Sopenharmony_ci if (ret < 0) 13962306a36Sopenharmony_ci return ret; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci return 0; 14262306a36Sopenharmony_ci} 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_cistatic int speyside_wm8996_init(struct snd_soc_pcm_runtime *rtd) 14562306a36Sopenharmony_ci{ 14662306a36Sopenharmony_ci struct snd_soc_dai *dai = asoc_rtd_to_codec(rtd, 0); 14762306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 14862306a36Sopenharmony_ci int ret; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci ret = snd_soc_dai_set_sysclk(dai, WM8996_SYSCLK_MCLK2, 32768, 0); 15162306a36Sopenharmony_ci if (ret < 0) 15262306a36Sopenharmony_ci return ret; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci ret = gpio_request(WM8996_HPSEL_GPIO, "HP_SEL"); 15562306a36Sopenharmony_ci if (ret != 0) 15662306a36Sopenharmony_ci pr_err("Failed to request HP_SEL GPIO: %d\n", ret); 15762306a36Sopenharmony_ci gpio_direction_output(WM8996_HPSEL_GPIO, speyside_jack_polarity); 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci ret = snd_soc_card_jack_new_pins(rtd->card, "Headset", 16062306a36Sopenharmony_ci SND_JACK_LINEOUT | SND_JACK_HEADSET | 16162306a36Sopenharmony_ci SND_JACK_BTN_0, 16262306a36Sopenharmony_ci &speyside_headset, 16362306a36Sopenharmony_ci speyside_headset_pins, 16462306a36Sopenharmony_ci ARRAY_SIZE(speyside_headset_pins)); 16562306a36Sopenharmony_ci if (ret) 16662306a36Sopenharmony_ci return ret; 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci wm8996_detect(component, &speyside_headset, speyside_set_polarity); 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci return 0; 17162306a36Sopenharmony_ci} 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_cistatic int speyside_late_probe(struct snd_soc_card *card) 17462306a36Sopenharmony_ci{ 17562306a36Sopenharmony_ci snd_soc_dapm_ignore_suspend(&card->dapm, "Headphone"); 17662306a36Sopenharmony_ci snd_soc_dapm_ignore_suspend(&card->dapm, "Headset Mic"); 17762306a36Sopenharmony_ci snd_soc_dapm_ignore_suspend(&card->dapm, "Main AMIC"); 17862306a36Sopenharmony_ci snd_soc_dapm_ignore_suspend(&card->dapm, "Main DMIC"); 17962306a36Sopenharmony_ci snd_soc_dapm_ignore_suspend(&card->dapm, "Main Speaker"); 18062306a36Sopenharmony_ci snd_soc_dapm_ignore_suspend(&card->dapm, "WM1250 Output"); 18162306a36Sopenharmony_ci snd_soc_dapm_ignore_suspend(&card->dapm, "WM1250 Input"); 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci return 0; 18462306a36Sopenharmony_ci} 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cistatic const struct snd_soc_pcm_stream dsp_codec_params = { 18762306a36Sopenharmony_ci .formats = SNDRV_PCM_FMTBIT_S32_LE, 18862306a36Sopenharmony_ci .rate_min = 48000, 18962306a36Sopenharmony_ci .rate_max = 48000, 19062306a36Sopenharmony_ci .channels_min = 2, 19162306a36Sopenharmony_ci .channels_max = 2, 19262306a36Sopenharmony_ci}; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(cpu_dsp, 19562306a36Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("samsung-i2s.0")), 19662306a36Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CODEC("spi0.0", "wm0010-sdi1")), 19762306a36Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_PLATFORM("samsung-i2s.0"))); 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(dsp_codec, 20062306a36Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("wm0010-sdi2")), 20162306a36Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CODEC("wm8996.1-001a", "wm8996-aif1"))); 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ciSND_SOC_DAILINK_DEFS(baseband, 20462306a36Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CPU("wm8996-aif2")), 20562306a36Sopenharmony_ci DAILINK_COMP_ARRAY(COMP_CODEC("wm1250-ev1.1-0027", "wm1250-ev1"))); 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_cistatic struct snd_soc_dai_link speyside_dai[] = { 20862306a36Sopenharmony_ci { 20962306a36Sopenharmony_ci .name = "CPU-DSP", 21062306a36Sopenharmony_ci .stream_name = "CPU-DSP", 21162306a36Sopenharmony_ci .init = speyside_wm0010_init, 21262306a36Sopenharmony_ci .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF 21362306a36Sopenharmony_ci | SND_SOC_DAIFMT_CBM_CFM, 21462306a36Sopenharmony_ci SND_SOC_DAILINK_REG(cpu_dsp), 21562306a36Sopenharmony_ci }, 21662306a36Sopenharmony_ci { 21762306a36Sopenharmony_ci .name = "DSP-CODEC", 21862306a36Sopenharmony_ci .stream_name = "DSP-CODEC", 21962306a36Sopenharmony_ci .init = speyside_wm8996_init, 22062306a36Sopenharmony_ci .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF 22162306a36Sopenharmony_ci | SND_SOC_DAIFMT_CBM_CFM, 22262306a36Sopenharmony_ci .c2c_params = &dsp_codec_params, 22362306a36Sopenharmony_ci .num_c2c_params = 1, 22462306a36Sopenharmony_ci .ignore_suspend = 1, 22562306a36Sopenharmony_ci SND_SOC_DAILINK_REG(dsp_codec), 22662306a36Sopenharmony_ci }, 22762306a36Sopenharmony_ci { 22862306a36Sopenharmony_ci .name = "Baseband", 22962306a36Sopenharmony_ci .stream_name = "Baseband", 23062306a36Sopenharmony_ci .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF 23162306a36Sopenharmony_ci | SND_SOC_DAIFMT_CBM_CFM, 23262306a36Sopenharmony_ci .ignore_suspend = 1, 23362306a36Sopenharmony_ci SND_SOC_DAILINK_REG(baseband), 23462306a36Sopenharmony_ci }, 23562306a36Sopenharmony_ci}; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_cistatic int speyside_wm9081_init(struct snd_soc_component *component) 23862306a36Sopenharmony_ci{ 23962306a36Sopenharmony_ci /* At any time the WM9081 is active it will have this clock */ 24062306a36Sopenharmony_ci return snd_soc_component_set_sysclk(component, WM9081_SYSCLK_MCLK, 0, 24162306a36Sopenharmony_ci MCLK_AUDIO_RATE, 0); 24262306a36Sopenharmony_ci} 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_cistatic struct snd_soc_aux_dev speyside_aux_dev[] = { 24562306a36Sopenharmony_ci { 24662306a36Sopenharmony_ci .dlc = COMP_AUX("wm9081.1-006c"), 24762306a36Sopenharmony_ci .init = speyside_wm9081_init, 24862306a36Sopenharmony_ci }, 24962306a36Sopenharmony_ci}; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cistatic struct snd_soc_codec_conf speyside_codec_conf[] = { 25262306a36Sopenharmony_ci { 25362306a36Sopenharmony_ci .dlc = COMP_CODEC_CONF("wm9081.1-006c"), 25462306a36Sopenharmony_ci .name_prefix = "Sub", 25562306a36Sopenharmony_ci }, 25662306a36Sopenharmony_ci}; 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_cistatic const struct snd_kcontrol_new controls[] = { 25962306a36Sopenharmony_ci SOC_DAPM_PIN_SWITCH("Main Speaker"), 26062306a36Sopenharmony_ci SOC_DAPM_PIN_SWITCH("Main DMIC"), 26162306a36Sopenharmony_ci SOC_DAPM_PIN_SWITCH("Main AMIC"), 26262306a36Sopenharmony_ci SOC_DAPM_PIN_SWITCH("WM1250 Input"), 26362306a36Sopenharmony_ci SOC_DAPM_PIN_SWITCH("WM1250 Output"), 26462306a36Sopenharmony_ci SOC_DAPM_PIN_SWITCH("Headphone"), 26562306a36Sopenharmony_ci}; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget widgets[] = { 26862306a36Sopenharmony_ci SND_SOC_DAPM_HP("Headphone", NULL), 26962306a36Sopenharmony_ci SND_SOC_DAPM_MIC("Headset Mic", NULL), 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci SND_SOC_DAPM_SPK("Main Speaker", NULL), 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci SND_SOC_DAPM_MIC("Main AMIC", NULL), 27462306a36Sopenharmony_ci SND_SOC_DAPM_MIC("Main DMIC", NULL), 27562306a36Sopenharmony_ci}; 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_cistatic const struct snd_soc_dapm_route audio_paths[] = { 27862306a36Sopenharmony_ci { "IN1RN", NULL, "MICB1" }, 27962306a36Sopenharmony_ci { "IN1RP", NULL, "MICB1" }, 28062306a36Sopenharmony_ci { "IN1RN", NULL, "MICB2" }, 28162306a36Sopenharmony_ci { "IN1RP", NULL, "MICB2" }, 28262306a36Sopenharmony_ci { "MICB1", NULL, "Headset Mic", speyside_get_micbias }, 28362306a36Sopenharmony_ci { "MICB2", NULL, "Headset Mic", speyside_get_micbias }, 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci { "IN1LP", NULL, "MICB2" }, 28662306a36Sopenharmony_ci { "IN1RN", NULL, "MICB1" }, 28762306a36Sopenharmony_ci { "MICB2", NULL, "Main AMIC" }, 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci { "DMIC1DAT", NULL, "MICB1" }, 29062306a36Sopenharmony_ci { "DMIC2DAT", NULL, "MICB1" }, 29162306a36Sopenharmony_ci { "MICB1", NULL, "Main DMIC" }, 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci { "Headphone", NULL, "HPOUT1L" }, 29462306a36Sopenharmony_ci { "Headphone", NULL, "HPOUT1R" }, 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci { "Sub IN1", NULL, "HPOUT2L" }, 29762306a36Sopenharmony_ci { "Sub IN2", NULL, "HPOUT2R" }, 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci { "Main Speaker", NULL, "Sub SPKN" }, 30062306a36Sopenharmony_ci { "Main Speaker", NULL, "Sub SPKP" }, 30162306a36Sopenharmony_ci { "Main Speaker", NULL, "SPKDAT" }, 30262306a36Sopenharmony_ci}; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_cistatic struct snd_soc_card speyside = { 30562306a36Sopenharmony_ci .name = "Speyside", 30662306a36Sopenharmony_ci .owner = THIS_MODULE, 30762306a36Sopenharmony_ci .dai_link = speyside_dai, 30862306a36Sopenharmony_ci .num_links = ARRAY_SIZE(speyside_dai), 30962306a36Sopenharmony_ci .aux_dev = speyside_aux_dev, 31062306a36Sopenharmony_ci .num_aux_devs = ARRAY_SIZE(speyside_aux_dev), 31162306a36Sopenharmony_ci .codec_conf = speyside_codec_conf, 31262306a36Sopenharmony_ci .num_configs = ARRAY_SIZE(speyside_codec_conf), 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci .set_bias_level = speyside_set_bias_level, 31562306a36Sopenharmony_ci .set_bias_level_post = speyside_set_bias_level_post, 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci .controls = controls, 31862306a36Sopenharmony_ci .num_controls = ARRAY_SIZE(controls), 31962306a36Sopenharmony_ci .dapm_widgets = widgets, 32062306a36Sopenharmony_ci .num_dapm_widgets = ARRAY_SIZE(widgets), 32162306a36Sopenharmony_ci .dapm_routes = audio_paths, 32262306a36Sopenharmony_ci .num_dapm_routes = ARRAY_SIZE(audio_paths), 32362306a36Sopenharmony_ci .fully_routed = true, 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci .late_probe = speyside_late_probe, 32662306a36Sopenharmony_ci}; 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_cistatic int speyside_probe(struct platform_device *pdev) 32962306a36Sopenharmony_ci{ 33062306a36Sopenharmony_ci struct snd_soc_card *card = &speyside; 33162306a36Sopenharmony_ci int ret; 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci card->dev = &pdev->dev; 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci ret = devm_snd_soc_register_card(&pdev->dev, card); 33662306a36Sopenharmony_ci if (ret) 33762306a36Sopenharmony_ci dev_err_probe(&pdev->dev, ret, "snd_soc_register_card() failed\n"); 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci return ret; 34062306a36Sopenharmony_ci} 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_cistatic struct platform_driver speyside_driver = { 34362306a36Sopenharmony_ci .driver = { 34462306a36Sopenharmony_ci .name = "speyside", 34562306a36Sopenharmony_ci .pm = &snd_soc_pm_ops, 34662306a36Sopenharmony_ci }, 34762306a36Sopenharmony_ci .probe = speyside_probe, 34862306a36Sopenharmony_ci}; 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_cimodule_platform_driver(speyside_driver); 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ciMODULE_DESCRIPTION("Speyside audio support"); 35362306a36Sopenharmony_ciMODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); 35462306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 35562306a36Sopenharmony_ciMODULE_ALIAS("platform:speyside"); 356