xref: /openbmc/linux/sound/soc/pxa/spitz.c (revision 92be5810)
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 
1597fb290d0SLiam Girdwood static 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 */
2607fb290d0SLiam Girdwood static struct snd_soc_dai_link spitz_dai = {
2617fb290d0SLiam Girdwood 	.name = "wm8750",
2627fb290d0SLiam Girdwood 	.stream_name = "WM8750",
263a3adfa00SDmitry Eremin-Solenikov 	.cpu_dai_name = "pxa2xx-i2s",
264f0fba2adSLiam Girdwood 	.codec_dai_name = "wm8750-hifi",
265f0fba2adSLiam Girdwood 	.platform_name = "pxa-pcm-audio",
266dc5de62bSMark Brown 	.codec_name = "wm8750.0-001b",
267c0e94231SAxel Lin 	.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
268c0e94231SAxel Lin 		   SND_SOC_DAIFMT_CBS_CFS,
26997952f60SLiam Girdwood 	.ops = &spitz_ops,
2707fb290d0SLiam Girdwood };
2717fb290d0SLiam Girdwood 
2727fb290d0SLiam Girdwood /* spitz audio machine driver */
27387506549SMark Brown static struct snd_soc_card snd_soc_spitz = {
2747fb290d0SLiam Girdwood 	.name = "Spitz",
275561c6a17SAxel Lin 	.owner = THIS_MODULE,
2767fb290d0SLiam Girdwood 	.dai_link = &spitz_dai,
2777fb290d0SLiam Girdwood 	.num_links = 1,
2787c274263SAxel Lin 
2797c274263SAxel Lin 	.controls = wm8750_spitz_controls,
2807c274263SAxel Lin 	.num_controls = ARRAY_SIZE(wm8750_spitz_controls),
2817c274263SAxel Lin 	.dapm_widgets = wm8750_dapm_widgets,
2827c274263SAxel Lin 	.num_dapm_widgets = ARRAY_SIZE(wm8750_dapm_widgets),
2837c274263SAxel Lin 	.dapm_routes = spitz_audio_map,
2847c274263SAxel Lin 	.num_dapm_routes = ARRAY_SIZE(spitz_audio_map),
285c4b7586cSLars-Peter Clausen 	.fully_routed = true,
2867fb290d0SLiam Girdwood };
2877fb290d0SLiam Girdwood 
288ecf00151SDmitry Eremin-Solenikov static int spitz_probe(struct platform_device *pdev)
2897fb290d0SLiam Girdwood {
290ecf00151SDmitry Eremin-Solenikov 	struct snd_soc_card *card = &snd_soc_spitz;
2917fb290d0SLiam Girdwood 	int ret;
2927fb290d0SLiam Girdwood 
293ecf00151SDmitry Eremin-Solenikov 	if (machine_is_akita())
29404368d05SMarek Vasut 		spitz_mic_gpio = AKITA_GPIO_MIC_BIAS;
295ecf00151SDmitry Eremin-Solenikov 	else
296ecf00151SDmitry Eremin-Solenikov 		spitz_mic_gpio = SPITZ_GPIO_MIC_BIAS;
29704368d05SMarek Vasut 
29804368d05SMarek Vasut 	ret = gpio_request(spitz_mic_gpio, "MIC GPIO");
29904368d05SMarek Vasut 	if (ret)
30004368d05SMarek Vasut 		goto err1;
30104368d05SMarek Vasut 
30204368d05SMarek Vasut 	ret = gpio_direction_output(spitz_mic_gpio, 0);
30304368d05SMarek Vasut 	if (ret)
30404368d05SMarek Vasut 		goto err2;
30504368d05SMarek Vasut 
306ecf00151SDmitry Eremin-Solenikov 	card->dev = &pdev->dev;
307ecf00151SDmitry Eremin-Solenikov 
3082fd7076aSAxel Lin 	ret = devm_snd_soc_register_card(&pdev->dev, card);
309ecf00151SDmitry Eremin-Solenikov 	if (ret) {
310ecf00151SDmitry Eremin-Solenikov 		dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
311ecf00151SDmitry Eremin-Solenikov 			ret);
31204368d05SMarek Vasut 		goto err2;
31304368d05SMarek Vasut 	}
3147fb290d0SLiam Girdwood 
31504368d05SMarek Vasut 	return 0;
31604368d05SMarek Vasut 
31704368d05SMarek Vasut err2:
31804368d05SMarek Vasut 	gpio_free(spitz_mic_gpio);
31904368d05SMarek Vasut err1:
3207fb290d0SLiam Girdwood 	return ret;
3217fb290d0SLiam Girdwood }
3227fb290d0SLiam Girdwood 
323ecf00151SDmitry Eremin-Solenikov static int spitz_remove(struct platform_device *pdev)
3247fb290d0SLiam Girdwood {
32504368d05SMarek Vasut 	gpio_free(spitz_mic_gpio);
326ecf00151SDmitry Eremin-Solenikov 	return 0;
3277fb290d0SLiam Girdwood }
3287fb290d0SLiam Girdwood 
329ecf00151SDmitry Eremin-Solenikov static struct platform_driver spitz_driver = {
330ecf00151SDmitry Eremin-Solenikov 	.driver		= {
331ecf00151SDmitry Eremin-Solenikov 		.name	= "spitz-audio",
332ecf00151SDmitry Eremin-Solenikov 		.pm     = &snd_soc_pm_ops,
333ecf00151SDmitry Eremin-Solenikov 	},
334ecf00151SDmitry Eremin-Solenikov 	.probe		= spitz_probe,
335ecf00151SDmitry Eremin-Solenikov 	.remove		= spitz_remove,
336ecf00151SDmitry Eremin-Solenikov };
337ecf00151SDmitry Eremin-Solenikov 
338ecf00151SDmitry Eremin-Solenikov module_platform_driver(spitz_driver);
3397fb290d0SLiam Girdwood 
3407fb290d0SLiam Girdwood MODULE_AUTHOR("Richard Purdie");
3417fb290d0SLiam Girdwood MODULE_DESCRIPTION("ALSA SoC Spitz");
3427fb290d0SLiam Girdwood MODULE_LICENSE("GPL");
343ecf00151SDmitry Eremin-Solenikov MODULE_ALIAS("platform:spitz-audio");
344