xref: /openbmc/linux/sound/soc/pxa/spitz.c (revision 83b95c2f)
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