17fb290d0SLiam Girdwood /* 27fb290d0SLiam Girdwood * spitz.c -- SoC audio for Sharp SL-Cxx00 models Spitz, Borzoi and Akita 37fb290d0SLiam Girdwood * 47fb290d0SLiam Girdwood * Copyright 2005 Wolfson Microelectronics PLC. 57fb290d0SLiam Girdwood * Copyright 2005 Openedhand Ltd. 67fb290d0SLiam Girdwood * 7d331124dSLiam Girdwood * Authors: Liam Girdwood <lrg@slimlogic.co.uk> 87fb290d0SLiam Girdwood * Richard Purdie <richard@openedhand.com> 97fb290d0SLiam Girdwood * 107fb290d0SLiam Girdwood * This program is free software; you can redistribute it and/or modify it 117fb290d0SLiam Girdwood * under the terms of the GNU General Public License as published by the 127fb290d0SLiam Girdwood * Free Software Foundation; either version 2 of the License, or (at your 137fb290d0SLiam Girdwood * option) any later version. 147fb290d0SLiam Girdwood * 157fb290d0SLiam Girdwood */ 167fb290d0SLiam Girdwood 177fb290d0SLiam Girdwood #include <linux/module.h> 187fb290d0SLiam Girdwood #include <linux/moduleparam.h> 197fb290d0SLiam Girdwood #include <linux/timer.h> 207fb290d0SLiam Girdwood #include <linux/interrupt.h> 217fb290d0SLiam Girdwood #include <linux/platform_device.h> 22fff14720SEric Miao #include <linux/gpio.h> 237fb290d0SLiam Girdwood #include <sound/core.h> 247fb290d0SLiam Girdwood #include <sound/pcm.h> 257fb290d0SLiam Girdwood #include <sound/soc.h> 267fb290d0SLiam Girdwood 277fb290d0SLiam Girdwood #include <asm/mach-types.h> 28a09e64fbSRussell King #include <mach/spitz.h> 297fb290d0SLiam Girdwood #include "../codecs/wm8750.h" 3097952f60SLiam Girdwood #include "pxa2xx-i2s.h" 317fb290d0SLiam Girdwood 327fb290d0SLiam Girdwood #define SPITZ_HP 0 337fb290d0SLiam Girdwood #define SPITZ_MIC 1 347fb290d0SLiam Girdwood #define SPITZ_LINE 2 357fb290d0SLiam Girdwood #define SPITZ_HEADSET 3 367fb290d0SLiam Girdwood #define SPITZ_HP_OFF 4 377fb290d0SLiam Girdwood #define SPITZ_SPK_ON 0 387fb290d0SLiam Girdwood #define SPITZ_SPK_OFF 1 397fb290d0SLiam Girdwood 407fb290d0SLiam Girdwood /* audio clock in Hz - rounded from 12.235MHz */ 417fb290d0SLiam Girdwood #define SPITZ_AUDIO_CLOCK 12288000 427fb290d0SLiam Girdwood 437fb290d0SLiam Girdwood static int spitz_jack_func; 447fb290d0SLiam Girdwood static int spitz_spk_func; 4504368d05SMarek Vasut static int spitz_mic_gpio; 467fb290d0SLiam Girdwood 47059ad760SAxel Lin static void spitz_ext_control(struct snd_soc_dapm_context *dapm) 487fb290d0SLiam Girdwood { 491845a725SCharles Keepax snd_soc_dapm_mutex_lock(dapm); 501845a725SCharles Keepax 517fb290d0SLiam Girdwood if (spitz_spk_func == SPITZ_SPK_ON) 521845a725SCharles Keepax snd_soc_dapm_enable_pin_unlocked(dapm, "Ext Spk"); 537fb290d0SLiam Girdwood else 541845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Ext Spk"); 557fb290d0SLiam Girdwood 567fb290d0SLiam Girdwood /* set up jack connection */ 577fb290d0SLiam Girdwood switch (spitz_jack_func) { 587fb290d0SLiam Girdwood case SPITZ_HP: 597fb290d0SLiam Girdwood /* enable and unmute hp jack, disable mic bias */ 601845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); 611845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); 621845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); 631845a725SCharles Keepax snd_soc_dapm_enable_pin_unlocked(dapm, "Headphone Jack"); 64fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_L, 1); 65fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_R, 1); 667fb290d0SLiam Girdwood break; 677fb290d0SLiam Girdwood case SPITZ_MIC: 687fb290d0SLiam Girdwood /* enable mic jack and bias, mute hp */ 691845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); 701845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); 711845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); 721845a725SCharles Keepax snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack"); 73fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_L, 0); 74fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_R, 0); 757fb290d0SLiam Girdwood break; 767fb290d0SLiam Girdwood case SPITZ_LINE: 777fb290d0SLiam Girdwood /* enable line jack, disable mic bias and mute hp */ 781845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); 791845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); 801845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); 811845a725SCharles Keepax snd_soc_dapm_enable_pin_unlocked(dapm, "Line Jack"); 82fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_L, 0); 83fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_R, 0); 847fb290d0SLiam Girdwood break; 857fb290d0SLiam Girdwood case SPITZ_HEADSET: 867fb290d0SLiam Girdwood /* enable and unmute headset jack enable mic bias, mute L hp */ 871845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); 881845a725SCharles Keepax snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack"); 891845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); 901845a725SCharles Keepax snd_soc_dapm_enable_pin_unlocked(dapm, "Headset Jack"); 91fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_L, 0); 92fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_R, 1); 937fb290d0SLiam Girdwood break; 947fb290d0SLiam Girdwood case SPITZ_HP_OFF: 957fb290d0SLiam Girdwood 967fb290d0SLiam Girdwood /* jack removed, everything off */ 971845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); 981845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); 991845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); 1001845a725SCharles Keepax snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); 101fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_L, 0); 102fff14720SEric Miao gpio_set_value(SPITZ_GPIO_MUTE_R, 0); 1037fb290d0SLiam Girdwood break; 1047fb290d0SLiam Girdwood } 1051845a725SCharles Keepax 1061845a725SCharles Keepax snd_soc_dapm_sync_unlocked(dapm); 1071845a725SCharles Keepax 1081845a725SCharles Keepax snd_soc_dapm_mutex_unlock(dapm); 1097fb290d0SLiam Girdwood } 1107fb290d0SLiam Girdwood 1117fb290d0SLiam Girdwood static int spitz_startup(struct snd_pcm_substream *substream) 1127fb290d0SLiam Girdwood { 1137fb290d0SLiam Girdwood struct snd_soc_pcm_runtime *rtd = substream->private_data; 11471a29560SMark Brown 1157fb290d0SLiam Girdwood /* check the jack status at stream startup */ 116e14de47aSLars-Peter Clausen spitz_ext_control(&rtd->card->dapm); 11771a29560SMark Brown 1187fb290d0SLiam Girdwood return 0; 1197fb290d0SLiam Girdwood } 1207fb290d0SLiam Girdwood 12197952f60SLiam Girdwood static int spitz_hw_params(struct snd_pcm_substream *substream, 12297952f60SLiam Girdwood struct snd_pcm_hw_params *params) 12397952f60SLiam Girdwood { 12497952f60SLiam Girdwood struct snd_soc_pcm_runtime *rtd = substream->private_data; 125f0fba2adSLiam Girdwood struct snd_soc_dai *codec_dai = rtd->codec_dai; 126f0fba2adSLiam Girdwood struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 12797952f60SLiam Girdwood unsigned int clk = 0; 12897952f60SLiam Girdwood int ret = 0; 12997952f60SLiam Girdwood 13097952f60SLiam Girdwood switch (params_rate(params)) { 13197952f60SLiam Girdwood case 8000: 13297952f60SLiam Girdwood case 16000: 13397952f60SLiam Girdwood case 48000: 13497952f60SLiam Girdwood case 96000: 13597952f60SLiam Girdwood clk = 12288000; 13697952f60SLiam Girdwood break; 13797952f60SLiam Girdwood case 11025: 13897952f60SLiam Girdwood case 22050: 13997952f60SLiam Girdwood case 44100: 14097952f60SLiam Girdwood clk = 11289600; 14197952f60SLiam Girdwood break; 14297952f60SLiam Girdwood } 14397952f60SLiam Girdwood 14497952f60SLiam Girdwood /* set the codec system clock for DAC and ADC */ 14564105cfdSLiam Girdwood ret = snd_soc_dai_set_sysclk(codec_dai, WM8750_SYSCLK, clk, 14697952f60SLiam Girdwood SND_SOC_CLOCK_IN); 14797952f60SLiam Girdwood if (ret < 0) 14897952f60SLiam Girdwood return ret; 14997952f60SLiam Girdwood 15097952f60SLiam Girdwood /* set the I2S system clock as input (unused) */ 15164105cfdSLiam Girdwood ret = snd_soc_dai_set_sysclk(cpu_dai, PXA2XX_I2S_SYSCLK, 0, 15297952f60SLiam Girdwood SND_SOC_CLOCK_IN); 15397952f60SLiam Girdwood if (ret < 0) 15497952f60SLiam Girdwood return ret; 15597952f60SLiam Girdwood 15697952f60SLiam Girdwood return 0; 15797952f60SLiam Girdwood } 15897952f60SLiam Girdwood 159943b7311SBhumika Goyal static const struct snd_soc_ops spitz_ops = { 1607fb290d0SLiam Girdwood .startup = spitz_startup, 16197952f60SLiam Girdwood .hw_params = spitz_hw_params, 1627fb290d0SLiam Girdwood }; 1637fb290d0SLiam Girdwood 1647fb290d0SLiam Girdwood static int spitz_get_jack(struct snd_kcontrol *kcontrol, 1657fb290d0SLiam Girdwood struct snd_ctl_elem_value *ucontrol) 1667fb290d0SLiam Girdwood { 16749a1ba16STakashi Iwai ucontrol->value.enumerated.item[0] = spitz_jack_func; 1687fb290d0SLiam Girdwood return 0; 1697fb290d0SLiam Girdwood } 1707fb290d0SLiam Girdwood 1717fb290d0SLiam Girdwood static int spitz_set_jack(struct snd_kcontrol *kcontrol, 1727fb290d0SLiam Girdwood struct snd_ctl_elem_value *ucontrol) 1737fb290d0SLiam Girdwood { 1740e66821fSLiam Girdwood struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); 1757fb290d0SLiam Girdwood 17649a1ba16STakashi Iwai if (spitz_jack_func == ucontrol->value.enumerated.item[0]) 1777fb290d0SLiam Girdwood return 0; 1787fb290d0SLiam Girdwood 17949a1ba16STakashi Iwai spitz_jack_func = ucontrol->value.enumerated.item[0]; 180059ad760SAxel Lin spitz_ext_control(&card->dapm); 1817fb290d0SLiam Girdwood return 1; 1827fb290d0SLiam Girdwood } 1837fb290d0SLiam Girdwood 1847fb290d0SLiam Girdwood static int spitz_get_spk(struct snd_kcontrol *kcontrol, 1857fb290d0SLiam Girdwood struct snd_ctl_elem_value *ucontrol) 1867fb290d0SLiam Girdwood { 18749a1ba16STakashi Iwai ucontrol->value.enumerated.item[0] = spitz_spk_func; 1887fb290d0SLiam Girdwood return 0; 1897fb290d0SLiam Girdwood } 1907fb290d0SLiam Girdwood 1917fb290d0SLiam Girdwood static int spitz_set_spk(struct snd_kcontrol *kcontrol, 1927fb290d0SLiam Girdwood struct snd_ctl_elem_value *ucontrol) 1937fb290d0SLiam Girdwood { 1940e66821fSLiam Girdwood struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); 1957fb290d0SLiam Girdwood 19649a1ba16STakashi Iwai if (spitz_spk_func == ucontrol->value.enumerated.item[0]) 1977fb290d0SLiam Girdwood return 0; 1987fb290d0SLiam Girdwood 19949a1ba16STakashi Iwai spitz_spk_func = ucontrol->value.enumerated.item[0]; 200059ad760SAxel Lin spitz_ext_control(&card->dapm); 2017fb290d0SLiam Girdwood return 1; 2027fb290d0SLiam Girdwood } 2037fb290d0SLiam Girdwood 204338c7ed0SJarkko Nikula static int spitz_mic_bias(struct snd_soc_dapm_widget *w, 205338c7ed0SJarkko Nikula struct snd_kcontrol *k, int event) 2067fb290d0SLiam Girdwood { 20704368d05SMarek Vasut gpio_set_value_cansleep(spitz_mic_gpio, SND_SOC_DAPM_EVENT_ON(event)); 2087fb290d0SLiam Girdwood return 0; 2097fb290d0SLiam Girdwood } 2107fb290d0SLiam Girdwood 2117fb290d0SLiam Girdwood /* spitz machine dapm widgets */ 2127fb290d0SLiam Girdwood static const struct snd_soc_dapm_widget wm8750_dapm_widgets[] = { 2137fb290d0SLiam Girdwood SND_SOC_DAPM_HP("Headphone Jack", NULL), 2147fb290d0SLiam Girdwood SND_SOC_DAPM_MIC("Mic Jack", spitz_mic_bias), 2157fb290d0SLiam Girdwood SND_SOC_DAPM_SPK("Ext Spk", NULL), 2167fb290d0SLiam Girdwood SND_SOC_DAPM_LINE("Line Jack", NULL), 2177fb290d0SLiam Girdwood 2187fb290d0SLiam Girdwood /* headset is a mic and mono headphone */ 2197fb290d0SLiam Girdwood SND_SOC_DAPM_HP("Headset Jack", NULL), 2207fb290d0SLiam Girdwood }; 2217fb290d0SLiam Girdwood 2227fb290d0SLiam Girdwood /* Spitz machine audio_map */ 2237c274263SAxel Lin static const struct snd_soc_dapm_route spitz_audio_map[] = { 2247fb290d0SLiam Girdwood 2257fb290d0SLiam Girdwood /* headphone connected to LOUT1, ROUT1 */ 2267fb290d0SLiam Girdwood {"Headphone Jack", NULL, "LOUT1"}, 2277fb290d0SLiam Girdwood {"Headphone Jack", NULL, "ROUT1"}, 2287fb290d0SLiam Girdwood 2297fb290d0SLiam Girdwood /* headset connected to ROUT1 and LINPUT1 with bias (def below) */ 2307fb290d0SLiam Girdwood {"Headset Jack", NULL, "ROUT1"}, 2317fb290d0SLiam Girdwood 2327fb290d0SLiam Girdwood /* ext speaker connected to LOUT2, ROUT2 */ 2337fb290d0SLiam Girdwood {"Ext Spk", NULL, "ROUT2"}, 2347fb290d0SLiam Girdwood {"Ext Spk", NULL, "LOUT2"}, 2357fb290d0SLiam Girdwood 2367fb290d0SLiam Girdwood /* mic is connected to input 1 - with bias */ 2377fb290d0SLiam Girdwood {"LINPUT1", NULL, "Mic Bias"}, 2387fb290d0SLiam Girdwood {"Mic Bias", NULL, "Mic Jack"}, 2397fb290d0SLiam Girdwood 2407fb290d0SLiam Girdwood /* line is connected to input 1 - no bias */ 2417fb290d0SLiam Girdwood {"LINPUT1", NULL, "Line Jack"}, 2427fb290d0SLiam Girdwood }; 2437fb290d0SLiam Girdwood 24492be5810SLars-Peter Clausen static const char * const jack_function[] = {"Headphone", "Mic", "Line", 24592be5810SLars-Peter Clausen "Headset", "Off"}; 24692be5810SLars-Peter Clausen static const char * const spk_function[] = {"On", "Off"}; 2477fb290d0SLiam Girdwood static const struct soc_enum spitz_enum[] = { 2487fb290d0SLiam Girdwood SOC_ENUM_SINGLE_EXT(5, jack_function), 2497fb290d0SLiam Girdwood SOC_ENUM_SINGLE_EXT(2, spk_function), 2507fb290d0SLiam Girdwood }; 2517fb290d0SLiam Girdwood 2527fb290d0SLiam Girdwood static const struct snd_kcontrol_new wm8750_spitz_controls[] = { 2537fb290d0SLiam Girdwood SOC_ENUM_EXT("Jack Function", spitz_enum[0], spitz_get_jack, 2547fb290d0SLiam Girdwood spitz_set_jack), 2557fb290d0SLiam Girdwood SOC_ENUM_EXT("Speaker Function", spitz_enum[1], spitz_get_spk, 2567fb290d0SLiam Girdwood spitz_set_spk), 2577fb290d0SLiam Girdwood }; 2587fb290d0SLiam Girdwood 2597fb290d0SLiam Girdwood /* spitz digital audio interface glue - connects codec <--> CPU */ 260196a521aSKuninori Morimoto SND_SOC_DAILINK_DEFS(wm8750, 261196a521aSKuninori Morimoto DAILINK_COMP_ARRAY(COMP_CPU("pxa2xx-i2s")), 262196a521aSKuninori Morimoto DAILINK_COMP_ARRAY(COMP_CODEC("wm8750.0-001b", "wm8750-hifi")), 263196a521aSKuninori Morimoto DAILINK_COMP_ARRAY(COMP_PLATFORM("pxa-pcm-audio"))); 264196a521aSKuninori Morimoto 2657fb290d0SLiam Girdwood static struct snd_soc_dai_link spitz_dai = { 2667fb290d0SLiam Girdwood .name = "wm8750", 2677fb290d0SLiam Girdwood .stream_name = "WM8750", 268c0e94231SAxel Lin .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | 269c0e94231SAxel Lin SND_SOC_DAIFMT_CBS_CFS, 27097952f60SLiam Girdwood .ops = &spitz_ops, 271196a521aSKuninori Morimoto SND_SOC_DAILINK_REG(wm8750), 2727fb290d0SLiam Girdwood }; 2737fb290d0SLiam Girdwood 2747fb290d0SLiam Girdwood /* spitz audio machine driver */ 27587506549SMark Brown static struct snd_soc_card snd_soc_spitz = { 2767fb290d0SLiam Girdwood .name = "Spitz", 277561c6a17SAxel Lin .owner = THIS_MODULE, 2787fb290d0SLiam Girdwood .dai_link = &spitz_dai, 2797fb290d0SLiam Girdwood .num_links = 1, 2807c274263SAxel Lin 2817c274263SAxel Lin .controls = wm8750_spitz_controls, 2827c274263SAxel Lin .num_controls = ARRAY_SIZE(wm8750_spitz_controls), 2837c274263SAxel Lin .dapm_widgets = wm8750_dapm_widgets, 2847c274263SAxel Lin .num_dapm_widgets = ARRAY_SIZE(wm8750_dapm_widgets), 2857c274263SAxel Lin .dapm_routes = spitz_audio_map, 2867c274263SAxel Lin .num_dapm_routes = ARRAY_SIZE(spitz_audio_map), 287c4b7586cSLars-Peter Clausen .fully_routed = true, 2887fb290d0SLiam Girdwood }; 2897fb290d0SLiam Girdwood 290ecf00151SDmitry Eremin-Solenikov static int spitz_probe(struct platform_device *pdev) 2917fb290d0SLiam Girdwood { 292ecf00151SDmitry Eremin-Solenikov struct snd_soc_card *card = &snd_soc_spitz; 2937fb290d0SLiam Girdwood int ret; 2947fb290d0SLiam Girdwood 295ecf00151SDmitry Eremin-Solenikov if (machine_is_akita()) 29604368d05SMarek Vasut spitz_mic_gpio = AKITA_GPIO_MIC_BIAS; 297ecf00151SDmitry Eremin-Solenikov else 298ecf00151SDmitry Eremin-Solenikov spitz_mic_gpio = SPITZ_GPIO_MIC_BIAS; 29904368d05SMarek Vasut 30004368d05SMarek Vasut ret = gpio_request(spitz_mic_gpio, "MIC GPIO"); 30104368d05SMarek Vasut if (ret) 30204368d05SMarek Vasut goto err1; 30304368d05SMarek Vasut 30404368d05SMarek Vasut ret = gpio_direction_output(spitz_mic_gpio, 0); 30504368d05SMarek Vasut if (ret) 30604368d05SMarek Vasut goto err2; 30704368d05SMarek Vasut 308ecf00151SDmitry Eremin-Solenikov card->dev = &pdev->dev; 309ecf00151SDmitry Eremin-Solenikov 3102fd7076aSAxel Lin ret = devm_snd_soc_register_card(&pdev->dev, card); 311ecf00151SDmitry Eremin-Solenikov if (ret) { 312ecf00151SDmitry Eremin-Solenikov dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", 313ecf00151SDmitry Eremin-Solenikov ret); 31404368d05SMarek Vasut goto err2; 31504368d05SMarek Vasut } 3167fb290d0SLiam Girdwood 31704368d05SMarek Vasut return 0; 31804368d05SMarek Vasut 31904368d05SMarek Vasut err2: 32004368d05SMarek Vasut gpio_free(spitz_mic_gpio); 32104368d05SMarek Vasut err1: 3227fb290d0SLiam Girdwood return ret; 3237fb290d0SLiam Girdwood } 3247fb290d0SLiam Girdwood 325ecf00151SDmitry Eremin-Solenikov static int spitz_remove(struct platform_device *pdev) 3267fb290d0SLiam Girdwood { 32704368d05SMarek Vasut gpio_free(spitz_mic_gpio); 328ecf00151SDmitry Eremin-Solenikov return 0; 3297fb290d0SLiam Girdwood } 3307fb290d0SLiam Girdwood 331ecf00151SDmitry Eremin-Solenikov static struct platform_driver spitz_driver = { 332ecf00151SDmitry Eremin-Solenikov .driver = { 333ecf00151SDmitry Eremin-Solenikov .name = "spitz-audio", 334ecf00151SDmitry Eremin-Solenikov .pm = &snd_soc_pm_ops, 335ecf00151SDmitry Eremin-Solenikov }, 336ecf00151SDmitry Eremin-Solenikov .probe = spitz_probe, 337ecf00151SDmitry Eremin-Solenikov .remove = spitz_remove, 338ecf00151SDmitry Eremin-Solenikov }; 339ecf00151SDmitry Eremin-Solenikov 340ecf00151SDmitry Eremin-Solenikov module_platform_driver(spitz_driver); 3417fb290d0SLiam Girdwood 3427fb290d0SLiam Girdwood MODULE_AUTHOR("Richard Purdie"); 3437fb290d0SLiam Girdwood MODULE_DESCRIPTION("ALSA SoC Spitz"); 3447fb290d0SLiam Girdwood MODULE_LICENSE("GPL"); 345ecf00151SDmitry Eremin-Solenikov MODULE_ALIAS("platform:spitz-audio"); 346