12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 27fb290d0SLiam Girdwood /* 37fb290d0SLiam Girdwood * spitz.c -- SoC audio for Sharp SL-Cxx00 models Spitz, Borzoi and Akita 47fb290d0SLiam Girdwood * 57fb290d0SLiam Girdwood * Copyright 2005 Wolfson Microelectronics PLC. 67fb290d0SLiam Girdwood * Copyright 2005 Openedhand Ltd. 77fb290d0SLiam Girdwood * 8d331124dSLiam Girdwood * Authors: Liam Girdwood <lrg@slimlogic.co.uk> 97fb290d0SLiam Girdwood * Richard Purdie <richard@openedhand.com> 107fb290d0SLiam Girdwood */ 117fb290d0SLiam Girdwood 127fb290d0SLiam Girdwood #include <linux/module.h> 137fb290d0SLiam Girdwood #include <linux/moduleparam.h> 147fb290d0SLiam Girdwood #include <linux/timer.h> 157fb290d0SLiam Girdwood #include <linux/interrupt.h> 167fb290d0SLiam Girdwood #include <linux/platform_device.h> 17fff14720SEric Miao #include <linux/gpio.h> 187fb290d0SLiam Girdwood #include <sound/core.h> 197fb290d0SLiam Girdwood #include <sound/pcm.h> 207fb290d0SLiam Girdwood #include <sound/soc.h> 217fb290d0SLiam Girdwood 227fb290d0SLiam Girdwood #include <asm/mach-types.h> 23a09e64fbSRussell King #include <mach/spitz.h> 247fb290d0SLiam Girdwood #include "../codecs/wm8750.h" 2597952f60SLiam Girdwood #include "pxa2xx-i2s.h" 267fb290d0SLiam Girdwood 277fb290d0SLiam Girdwood #define SPITZ_HP 0 287fb290d0SLiam Girdwood #define SPITZ_MIC 1 297fb290d0SLiam Girdwood #define SPITZ_LINE 2 307fb290d0SLiam Girdwood #define SPITZ_HEADSET 3 317fb290d0SLiam Girdwood #define SPITZ_HP_OFF 4 327fb290d0SLiam Girdwood #define SPITZ_SPK_ON 0 337fb290d0SLiam Girdwood #define SPITZ_SPK_OFF 1 347fb290d0SLiam Girdwood 357fb290d0SLiam Girdwood /* audio clock in Hz - rounded from 12.235MHz */ 367fb290d0SLiam Girdwood #define SPITZ_AUDIO_CLOCK 12288000 377fb290d0SLiam Girdwood 387fb290d0SLiam Girdwood static int spitz_jack_func; 397fb290d0SLiam Girdwood static int spitz_spk_func; 4004368d05SMarek Vasut static int spitz_mic_gpio; 417fb290d0SLiam Girdwood 42059ad760SAxel Lin static void spitz_ext_control(struct snd_soc_dapm_context *dapm) 437fb290d0SLiam Girdwood { 441845a725SCharles Keepax snd_soc_dapm_mutex_lock(dapm); 451845a725SCharles Keepax 467fb290d0SLiam Girdwood if (spitz_spk_func == SPITZ_SPK_ON) 471845a725SCharles Keepax snd_soc_dapm_enable_pin_unlocked(dapm, "Ext Spk"); 487fb290d0SLiam Girdwood else 491845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Ext Spk"); 507fb290d0SLiam Girdwood 517fb290d0SLiam Girdwood /* set up jack connection */ 527fb290d0SLiam Girdwood switch (spitz_jack_func) { 537fb290d0SLiam Girdwood case SPITZ_HP: 547fb290d0SLiam Girdwood /* enable and unmute hp jack, disable mic bias */ 551845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); 561845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); 571845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); 581845a725SCharles Keepax snd_soc_dapm_enable_pin_unlocked(dapm, "Headphone Jack"); 59fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_L, 1); 60fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_R, 1); 617fb290d0SLiam Girdwood break; 627fb290d0SLiam Girdwood case SPITZ_MIC: 637fb290d0SLiam Girdwood /* enable mic jack and bias, mute hp */ 641845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); 651845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); 661845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); 671845a725SCharles Keepax snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack"); 68fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_L, 0); 69fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_R, 0); 707fb290d0SLiam Girdwood break; 717fb290d0SLiam Girdwood case SPITZ_LINE: 727fb290d0SLiam Girdwood /* enable line jack, disable mic bias and mute hp */ 731845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); 741845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); 751845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); 761845a725SCharles Keepax snd_soc_dapm_enable_pin_unlocked(dapm, "Line Jack"); 77fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_L, 0); 78fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_R, 0); 797fb290d0SLiam Girdwood break; 807fb290d0SLiam Girdwood case SPITZ_HEADSET: 817fb290d0SLiam Girdwood /* enable and unmute headset jack enable mic bias, mute L hp */ 821845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); 831845a725SCharles Keepax snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack"); 841845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); 851845a725SCharles Keepax snd_soc_dapm_enable_pin_unlocked(dapm, "Headset Jack"); 86fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_L, 0); 87fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_R, 1); 887fb290d0SLiam Girdwood break; 897fb290d0SLiam Girdwood case SPITZ_HP_OFF: 907fb290d0SLiam Girdwood 917fb290d0SLiam Girdwood /* jack removed, everything off */ 921845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); 931845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); 941845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); 951845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); 96fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_L, 0); 97fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_R, 0); 987fb290d0SLiam Girdwood break; 997fb290d0SLiam Girdwood } 1001845a725SCharles Keepax 1011845a725SCharles Keepax snd_soc_dapm_sync_unlocked(dapm); 1021845a725SCharles Keepax 1031845a725SCharles Keepax snd_soc_dapm_mutex_unlock(dapm); 1047fb290d0SLiam Girdwood } 1057fb290d0SLiam Girdwood 1067fb290d0SLiam Girdwood static int spitz_startup(struct snd_pcm_substream *substream) 1077fb290d0SLiam Girdwood { 10883b95c2fSKuninori Morimoto struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); 10971a29560SMark Brown 1107fb290d0SLiam Girdwood /* check the jack status at stream startup */ 111e14de47aSLars-Peter Clausen spitz_ext_control(&rtd->card->dapm); 11271a29560SMark Brown 1137fb290d0SLiam Girdwood return 0; 1147fb290d0SLiam Girdwood } 1157fb290d0SLiam Girdwood 11697952f60SLiam Girdwood static int spitz_hw_params(struct snd_pcm_substream *substream, 11797952f60SLiam Girdwood struct snd_pcm_hw_params *params) 11897952f60SLiam Girdwood { 11983b95c2fSKuninori Morimoto struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); 1208d8fef28SKuninori Morimoto struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0); 1218d8fef28SKuninori Morimoto struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0); 12297952f60SLiam Girdwood unsigned int clk = 0; 12397952f60SLiam Girdwood int ret = 0; 12497952f60SLiam Girdwood 12597952f60SLiam Girdwood switch (params_rate(params)) { 12697952f60SLiam Girdwood case 8000: 12797952f60SLiam Girdwood case 16000: 12897952f60SLiam Girdwood case 48000: 12997952f60SLiam Girdwood case 96000: 13097952f60SLiam Girdwood clk = 12288000; 13197952f60SLiam Girdwood break; 13297952f60SLiam Girdwood case 11025: 13397952f60SLiam Girdwood case 22050: 13497952f60SLiam Girdwood case 44100: 13597952f60SLiam Girdwood clk = 11289600; 13697952f60SLiam Girdwood break; 13797952f60SLiam Girdwood } 13897952f60SLiam Girdwood 13997952f60SLiam Girdwood /* set the codec system clock for DAC and ADC */ 14064105cfdSLiam Girdwood ret = snd_soc_dai_set_sysclk(codec_dai, WM8750_SYSCLK, clk, 14197952f60SLiam Girdwood SND_SOC_CLOCK_IN); 14297952f60SLiam Girdwood if (ret < 0) 14397952f60SLiam Girdwood return ret; 14497952f60SLiam Girdwood 14597952f60SLiam Girdwood /* set the I2S system clock as input (unused) */ 14664105cfdSLiam Girdwood ret = snd_soc_dai_set_sysclk(cpu_dai, PXA2XX_I2S_SYSCLK, 0, 14797952f60SLiam Girdwood SND_SOC_CLOCK_IN); 14897952f60SLiam Girdwood if (ret < 0) 14997952f60SLiam Girdwood return ret; 15097952f60SLiam Girdwood 15197952f60SLiam Girdwood return 0; 15297952f60SLiam Girdwood } 15397952f60SLiam Girdwood 154943b7311SBhumika Goyal static const struct snd_soc_ops spitz_ops = { 1557fb290d0SLiam Girdwood .startup = spitz_startup, 15697952f60SLiam Girdwood .hw_params = spitz_hw_params, 1577fb290d0SLiam Girdwood }; 1587fb290d0SLiam Girdwood 1597fb290d0SLiam Girdwood static int spitz_get_jack(struct snd_kcontrol *kcontrol, 1607fb290d0SLiam Girdwood struct snd_ctl_elem_value *ucontrol) 1617fb290d0SLiam Girdwood { 16249a1ba16STakashi Iwai ucontrol->value.enumerated.item[0] = spitz_jack_func; 1637fb290d0SLiam Girdwood return 0; 1647fb290d0SLiam Girdwood } 1657fb290d0SLiam Girdwood 1667fb290d0SLiam Girdwood static int spitz_set_jack(struct snd_kcontrol *kcontrol, 1677fb290d0SLiam Girdwood struct snd_ctl_elem_value *ucontrol) 1687fb290d0SLiam Girdwood { 1690e66821fSLiam Girdwood struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); 1707fb290d0SLiam Girdwood 17149a1ba16STakashi Iwai if (spitz_jack_func == ucontrol->value.enumerated.item[0]) 1727fb290d0SLiam Girdwood return 0; 1737fb290d0SLiam Girdwood 17449a1ba16STakashi Iwai spitz_jack_func = ucontrol->value.enumerated.item[0]; 175059ad760SAxel Lin spitz_ext_control(&card->dapm); 1767fb290d0SLiam Girdwood return 1; 1777fb290d0SLiam Girdwood } 1787fb290d0SLiam Girdwood 1797fb290d0SLiam Girdwood static int spitz_get_spk(struct snd_kcontrol *kcontrol, 1807fb290d0SLiam Girdwood struct snd_ctl_elem_value *ucontrol) 1817fb290d0SLiam Girdwood { 18249a1ba16STakashi Iwai ucontrol->value.enumerated.item[0] = spitz_spk_func; 1837fb290d0SLiam Girdwood return 0; 1847fb290d0SLiam Girdwood } 1857fb290d0SLiam Girdwood 1867fb290d0SLiam Girdwood static int spitz_set_spk(struct snd_kcontrol *kcontrol, 1877fb290d0SLiam Girdwood struct snd_ctl_elem_value *ucontrol) 1887fb290d0SLiam Girdwood { 1890e66821fSLiam Girdwood struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); 1907fb290d0SLiam Girdwood 19149a1ba16STakashi Iwai if (spitz_spk_func == ucontrol->value.enumerated.item[0]) 1927fb290d0SLiam Girdwood return 0; 1937fb290d0SLiam Girdwood 19449a1ba16STakashi Iwai spitz_spk_func = ucontrol->value.enumerated.item[0]; 195059ad760SAxel Lin spitz_ext_control(&card->dapm); 1967fb290d0SLiam Girdwood return 1; 1977fb290d0SLiam Girdwood } 1987fb290d0SLiam Girdwood 199338c7ed0SJarkko Nikula static int spitz_mic_bias(struct snd_soc_dapm_widget *w, 200338c7ed0SJarkko Nikula struct snd_kcontrol *k, int event) 2017fb290d0SLiam Girdwood { 20204368d05SMarek Vasut gpio_set_value_cansleep(spitz_mic_gpio, SND_SOC_DAPM_EVENT_ON(event)); 2037fb290d0SLiam Girdwood return 0; 2047fb290d0SLiam Girdwood } 2057fb290d0SLiam Girdwood 2067fb290d0SLiam Girdwood /* spitz machine dapm widgets */ 2077fb290d0SLiam Girdwood static const struct snd_soc_dapm_widget wm8750_dapm_widgets[] = { 2087fb290d0SLiam Girdwood SND_SOC_DAPM_HP("Headphone Jack", NULL), 2097fb290d0SLiam Girdwood SND_SOC_DAPM_MIC("Mic Jack", spitz_mic_bias), 2107fb290d0SLiam Girdwood SND_SOC_DAPM_SPK("Ext Spk", NULL), 2117fb290d0SLiam Girdwood SND_SOC_DAPM_LINE("Line Jack", NULL), 2127fb290d0SLiam Girdwood 2137fb290d0SLiam Girdwood /* headset is a mic and mono headphone */ 2147fb290d0SLiam Girdwood SND_SOC_DAPM_HP("Headset Jack", NULL), 2157fb290d0SLiam Girdwood }; 2167fb290d0SLiam Girdwood 2177fb290d0SLiam Girdwood /* Spitz machine audio_map */ 2187c274263SAxel Lin static const struct snd_soc_dapm_route spitz_audio_map[] = { 2197fb290d0SLiam Girdwood 2207fb290d0SLiam Girdwood /* headphone connected to LOUT1, ROUT1 */ 2217fb290d0SLiam Girdwood {"Headphone Jack", NULL, "LOUT1"}, 2227fb290d0SLiam Girdwood {"Headphone Jack", NULL, "ROUT1"}, 2237fb290d0SLiam Girdwood 2247fb290d0SLiam Girdwood /* headset connected to ROUT1 and LINPUT1 with bias (def below) */ 2257fb290d0SLiam Girdwood {"Headset Jack", NULL, "ROUT1"}, 2267fb290d0SLiam Girdwood 2277fb290d0SLiam Girdwood /* ext speaker connected to LOUT2, ROUT2 */ 2287fb290d0SLiam Girdwood {"Ext Spk", NULL, "ROUT2"}, 2297fb290d0SLiam Girdwood {"Ext Spk", NULL, "LOUT2"}, 2307fb290d0SLiam Girdwood 2317fb290d0SLiam Girdwood /* mic is connected to input 1 - with bias */ 2327fb290d0SLiam Girdwood {"LINPUT1", NULL, "Mic Bias"}, 2337fb290d0SLiam Girdwood {"Mic Bias", NULL, "Mic Jack"}, 2347fb290d0SLiam Girdwood 2357fb290d0SLiam Girdwood /* line is connected to input 1 - no bias */ 2367fb290d0SLiam Girdwood {"LINPUT1", NULL, "Line Jack"}, 2377fb290d0SLiam Girdwood }; 2387fb290d0SLiam Girdwood 23992be5810SLars-Peter Clausen static const char * const jack_function[] = {"Headphone", "Mic", "Line", 24092be5810SLars-Peter Clausen "Headset", "Off"}; 24192be5810SLars-Peter Clausen static const char * const spk_function[] = {"On", "Off"}; 2427fb290d0SLiam Girdwood static const struct soc_enum spitz_enum[] = { 2437fb290d0SLiam Girdwood SOC_ENUM_SINGLE_EXT(5, jack_function), 2447fb290d0SLiam Girdwood SOC_ENUM_SINGLE_EXT(2, spk_function), 2457fb290d0SLiam Girdwood }; 2467fb290d0SLiam Girdwood 2477fb290d0SLiam Girdwood static const struct snd_kcontrol_new wm8750_spitz_controls[] = { 2487fb290d0SLiam Girdwood SOC_ENUM_EXT("Jack Function", spitz_enum[0], spitz_get_jack, 2497fb290d0SLiam Girdwood spitz_set_jack), 2507fb290d0SLiam Girdwood SOC_ENUM_EXT("Speaker Function", spitz_enum[1], spitz_get_spk, 2517fb290d0SLiam Girdwood spitz_set_spk), 2527fb290d0SLiam Girdwood }; 2537fb290d0SLiam Girdwood 2547fb290d0SLiam Girdwood /* spitz digital audio interface glue - connects codec <--> CPU */ 255196a521aSKuninori Morimoto SND_SOC_DAILINK_DEFS(wm8750, 256196a521aSKuninori Morimoto DAILINK_COMP_ARRAY(COMP_CPU("pxa2xx-i2s")), 257196a521aSKuninori Morimoto DAILINK_COMP_ARRAY(COMP_CODEC("wm8750.0-001b", "wm8750-hifi")), 258196a521aSKuninori Morimoto DAILINK_COMP_ARRAY(COMP_PLATFORM("pxa-pcm-audio"))); 259196a521aSKuninori Morimoto 2607fb290d0SLiam Girdwood static struct snd_soc_dai_link spitz_dai = { 2617fb290d0SLiam Girdwood .name = "wm8750", 2627fb290d0SLiam Girdwood .stream_name = "WM8750", 263c0e94231SAxel Lin .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | 264c0e94231SAxel Lin SND_SOC_DAIFMT_CBS_CFS, 26597952f60SLiam Girdwood .ops = &spitz_ops, 266196a521aSKuninori Morimoto SND_SOC_DAILINK_REG(wm8750), 2677fb290d0SLiam Girdwood }; 2687fb290d0SLiam Girdwood 2697fb290d0SLiam Girdwood /* spitz audio machine driver */ 27087506549SMark Brown static struct snd_soc_card snd_soc_spitz = { 2717fb290d0SLiam Girdwood .name = "Spitz", 272561c6a17SAxel Lin .owner = THIS_MODULE, 2737fb290d0SLiam Girdwood .dai_link = &spitz_dai, 2747fb290d0SLiam Girdwood .num_links = 1, 2757c274263SAxel Lin 2767c274263SAxel Lin .controls = wm8750_spitz_controls, 2777c274263SAxel Lin .num_controls = ARRAY_SIZE(wm8750_spitz_controls), 2787c274263SAxel Lin .dapm_widgets = wm8750_dapm_widgets, 2797c274263SAxel Lin .num_dapm_widgets = ARRAY_SIZE(wm8750_dapm_widgets), 2807c274263SAxel Lin .dapm_routes = spitz_audio_map, 2817c274263SAxel Lin .num_dapm_routes = ARRAY_SIZE(spitz_audio_map), 282c4b7586cSLars-Peter Clausen .fully_routed = true, 2837fb290d0SLiam Girdwood }; 2847fb290d0SLiam Girdwood 285ecf00151SDmitry Eremin-Solenikov static int spitz_probe(struct platform_device *pdev) 2867fb290d0SLiam Girdwood { 287ecf00151SDmitry Eremin-Solenikov struct snd_soc_card *card = &snd_soc_spitz; 2887fb290d0SLiam Girdwood int ret; 2897fb290d0SLiam Girdwood 290ecf00151SDmitry Eremin-Solenikov if (machine_is_akita()) 29104368d05SMarek Vasut spitz_mic_gpio = AKITA_GPIO_MIC_BIAS; 292ecf00151SDmitry Eremin-Solenikov else 293ecf00151SDmitry Eremin-Solenikov spitz_mic_gpio = SPITZ_GPIO_MIC_BIAS; 29404368d05SMarek Vasut 29504368d05SMarek Vasut ret = gpio_request(spitz_mic_gpio, "MIC GPIO"); 29604368d05SMarek Vasut if (ret) 29704368d05SMarek Vasut goto err1; 29804368d05SMarek Vasut 29904368d05SMarek Vasut ret = gpio_direction_output(spitz_mic_gpio, 0); 30004368d05SMarek Vasut if (ret) 30104368d05SMarek Vasut goto err2; 30204368d05SMarek Vasut 303ecf00151SDmitry Eremin-Solenikov card->dev = &pdev->dev; 304ecf00151SDmitry Eremin-Solenikov 3052fd7076aSAxel Lin ret = devm_snd_soc_register_card(&pdev->dev, card); 306ecf00151SDmitry Eremin-Solenikov if (ret) { 307ecf00151SDmitry Eremin-Solenikov dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", 308ecf00151SDmitry Eremin-Solenikov ret); 30904368d05SMarek Vasut goto err2; 31004368d05SMarek Vasut } 3117fb290d0SLiam Girdwood 31204368d05SMarek Vasut return 0; 31304368d05SMarek Vasut 31404368d05SMarek Vasut err2: 31504368d05SMarek Vasut gpio_free(spitz_mic_gpio); 31604368d05SMarek Vasut err1: 3177fb290d0SLiam Girdwood return ret; 3187fb290d0SLiam Girdwood } 3197fb290d0SLiam Girdwood 320ecf00151SDmitry Eremin-Solenikov static int spitz_remove(struct platform_device *pdev) 3217fb290d0SLiam Girdwood { 32204368d05SMarek Vasut gpio_free(spitz_mic_gpio); 323ecf00151SDmitry Eremin-Solenikov return 0; 3247fb290d0SLiam Girdwood } 3257fb290d0SLiam Girdwood 326ecf00151SDmitry Eremin-Solenikov static struct platform_driver spitz_driver = { 327ecf00151SDmitry Eremin-Solenikov .driver = { 328ecf00151SDmitry Eremin-Solenikov .name = "spitz-audio", 329ecf00151SDmitry Eremin-Solenikov .pm = &snd_soc_pm_ops, 330ecf00151SDmitry Eremin-Solenikov }, 331ecf00151SDmitry Eremin-Solenikov .probe = spitz_probe, 332ecf00151SDmitry Eremin-Solenikov .remove = spitz_remove, 333ecf00151SDmitry Eremin-Solenikov }; 334ecf00151SDmitry Eremin-Solenikov 335ecf00151SDmitry Eremin-Solenikov module_platform_driver(spitz_driver); 3367fb290d0SLiam Girdwood 3377fb290d0SLiam Girdwood MODULE_AUTHOR("Richard Purdie"); 3387fb290d0SLiam Girdwood MODULE_DESCRIPTION("ALSA SoC Spitz"); 3397fb290d0SLiam Girdwood MODULE_LICENSE("GPL"); 340ecf00151SDmitry Eremin-Solenikov MODULE_ALIAS("platform:spitz-audio"); 341