xref: /openbmc/linux/sound/soc/pxa/spitz.c (revision c71f5fa0)
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>
17*726d8c96SArnd Bergmann #include <linux/gpio/consumer.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>
237fb290d0SLiam Girdwood #include "../codecs/wm8750.h"
2497952f60SLiam Girdwood #include "pxa2xx-i2s.h"
257fb290d0SLiam Girdwood 
267fb290d0SLiam Girdwood #define SPITZ_HP        0
277fb290d0SLiam Girdwood #define SPITZ_MIC       1
287fb290d0SLiam Girdwood #define SPITZ_LINE      2
297fb290d0SLiam Girdwood #define SPITZ_HEADSET   3
307fb290d0SLiam Girdwood #define SPITZ_HP_OFF    4
317fb290d0SLiam Girdwood #define SPITZ_SPK_ON    0
327fb290d0SLiam Girdwood #define SPITZ_SPK_OFF   1
337fb290d0SLiam Girdwood 
347fb290d0SLiam Girdwood  /* audio clock in Hz - rounded from 12.235MHz */
357fb290d0SLiam Girdwood #define SPITZ_AUDIO_CLOCK 12288000
367fb290d0SLiam Girdwood 
377fb290d0SLiam Girdwood static int spitz_jack_func;
387fb290d0SLiam Girdwood static int spitz_spk_func;
39*726d8c96SArnd Bergmann static struct gpio_desc *gpiod_mic, *gpiod_mute_l, *gpiod_mute_r;
407fb290d0SLiam Girdwood 
spitz_ext_control(struct snd_soc_dapm_context * dapm)41059ad760SAxel Lin static void spitz_ext_control(struct snd_soc_dapm_context *dapm)
427fb290d0SLiam Girdwood {
431845a725SCharles Keepax 	snd_soc_dapm_mutex_lock(dapm);
441845a725SCharles Keepax 
457fb290d0SLiam Girdwood 	if (spitz_spk_func == SPITZ_SPK_ON)
461845a725SCharles Keepax 		snd_soc_dapm_enable_pin_unlocked(dapm, "Ext Spk");
477fb290d0SLiam Girdwood 	else
481845a725SCharles Keepax 		snd_soc_dapm_disable_pin_unlocked(dapm, "Ext Spk");
497fb290d0SLiam Girdwood 
507fb290d0SLiam Girdwood 	/* set up jack connection */
517fb290d0SLiam Girdwood 	switch (spitz_jack_func) {
527fb290d0SLiam Girdwood 	case SPITZ_HP:
537fb290d0SLiam Girdwood 		/* enable and unmute hp jack, disable mic bias */
541845a725SCharles Keepax 		snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack");
551845a725SCharles Keepax 		snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack");
561845a725SCharles Keepax 		snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack");
571845a725SCharles Keepax 		snd_soc_dapm_enable_pin_unlocked(dapm, "Headphone Jack");
58*726d8c96SArnd Bergmann 		gpiod_set_value(gpiod_mute_l, 1);
59*726d8c96SArnd Bergmann 		gpiod_set_value(gpiod_mute_r, 1);
607fb290d0SLiam Girdwood 		break;
617fb290d0SLiam Girdwood 	case SPITZ_MIC:
627fb290d0SLiam Girdwood 		/* enable mic jack and bias, mute hp */
631845a725SCharles Keepax 		snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack");
641845a725SCharles Keepax 		snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack");
651845a725SCharles Keepax 		snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack");
661845a725SCharles Keepax 		snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack");
67*726d8c96SArnd Bergmann 		gpiod_set_value(gpiod_mute_l, 0);
68*726d8c96SArnd Bergmann 		gpiod_set_value(gpiod_mute_r, 0);
697fb290d0SLiam Girdwood 		break;
707fb290d0SLiam Girdwood 	case SPITZ_LINE:
717fb290d0SLiam Girdwood 		/* enable line jack, disable mic bias and mute hp */
721845a725SCharles Keepax 		snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack");
731845a725SCharles Keepax 		snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack");
741845a725SCharles Keepax 		snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack");
751845a725SCharles Keepax 		snd_soc_dapm_enable_pin_unlocked(dapm, "Line Jack");
76*726d8c96SArnd Bergmann 		gpiod_set_value(gpiod_mute_l, 0);
77*726d8c96SArnd Bergmann 		gpiod_set_value(gpiod_mute_r, 0);
787fb290d0SLiam Girdwood 		break;
797fb290d0SLiam Girdwood 	case SPITZ_HEADSET:
807fb290d0SLiam Girdwood 		/* enable and unmute headset jack enable mic bias, mute L hp */
811845a725SCharles Keepax 		snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack");
821845a725SCharles Keepax 		snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack");
831845a725SCharles Keepax 		snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack");
841845a725SCharles Keepax 		snd_soc_dapm_enable_pin_unlocked(dapm, "Headset Jack");
85*726d8c96SArnd Bergmann 		gpiod_set_value(gpiod_mute_l, 0);
86*726d8c96SArnd Bergmann 		gpiod_set_value(gpiod_mute_r, 1);
877fb290d0SLiam Girdwood 		break;
887fb290d0SLiam Girdwood 	case SPITZ_HP_OFF:
897fb290d0SLiam Girdwood 
907fb290d0SLiam Girdwood 		/* jack removed, everything off */
911845a725SCharles Keepax 		snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack");
921845a725SCharles Keepax 		snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack");
931845a725SCharles Keepax 		snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack");
941845a725SCharles Keepax 		snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack");
95*726d8c96SArnd Bergmann 		gpiod_set_value(gpiod_mute_l, 0);
96*726d8c96SArnd Bergmann 		gpiod_set_value(gpiod_mute_r, 0);
977fb290d0SLiam Girdwood 		break;
987fb290d0SLiam Girdwood 	}
991845a725SCharles Keepax 
1001845a725SCharles Keepax 	snd_soc_dapm_sync_unlocked(dapm);
1011845a725SCharles Keepax 
1021845a725SCharles Keepax 	snd_soc_dapm_mutex_unlock(dapm);
1037fb290d0SLiam Girdwood }
1047fb290d0SLiam Girdwood 
spitz_startup(struct snd_pcm_substream * substream)1057fb290d0SLiam Girdwood static int spitz_startup(struct snd_pcm_substream *substream)
1067fb290d0SLiam Girdwood {
10783b95c2fSKuninori Morimoto 	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
10871a29560SMark Brown 
1097fb290d0SLiam Girdwood 	/* check the jack status at stream startup */
110e14de47aSLars-Peter Clausen 	spitz_ext_control(&rtd->card->dapm);
11171a29560SMark Brown 
1127fb290d0SLiam Girdwood 	return 0;
1137fb290d0SLiam Girdwood }
1147fb290d0SLiam Girdwood 
spitz_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params)11597952f60SLiam Girdwood static int spitz_hw_params(struct snd_pcm_substream *substream,
11697952f60SLiam Girdwood 	struct snd_pcm_hw_params *params)
11797952f60SLiam Girdwood {
11883b95c2fSKuninori Morimoto 	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
1198d8fef28SKuninori Morimoto 	struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
1208d8fef28SKuninori Morimoto 	struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
12197952f60SLiam Girdwood 	unsigned int clk = 0;
12297952f60SLiam Girdwood 	int ret = 0;
12397952f60SLiam Girdwood 
12497952f60SLiam Girdwood 	switch (params_rate(params)) {
12597952f60SLiam Girdwood 	case 8000:
12697952f60SLiam Girdwood 	case 16000:
12797952f60SLiam Girdwood 	case 48000:
12897952f60SLiam Girdwood 	case 96000:
12997952f60SLiam Girdwood 		clk = 12288000;
13097952f60SLiam Girdwood 		break;
13197952f60SLiam Girdwood 	case 11025:
13297952f60SLiam Girdwood 	case 22050:
13397952f60SLiam Girdwood 	case 44100:
13497952f60SLiam Girdwood 		clk = 11289600;
13597952f60SLiam Girdwood 		break;
13697952f60SLiam Girdwood 	}
13797952f60SLiam Girdwood 
13897952f60SLiam Girdwood 	/* set the codec system clock for DAC and ADC */
13964105cfdSLiam Girdwood 	ret = snd_soc_dai_set_sysclk(codec_dai, WM8750_SYSCLK, clk,
14097952f60SLiam Girdwood 		SND_SOC_CLOCK_IN);
14197952f60SLiam Girdwood 	if (ret < 0)
14297952f60SLiam Girdwood 		return ret;
14397952f60SLiam Girdwood 
14497952f60SLiam Girdwood 	/* set the I2S system clock as input (unused) */
14564105cfdSLiam Girdwood 	ret = snd_soc_dai_set_sysclk(cpu_dai, PXA2XX_I2S_SYSCLK, 0,
14697952f60SLiam Girdwood 		SND_SOC_CLOCK_IN);
14797952f60SLiam Girdwood 	if (ret < 0)
14897952f60SLiam Girdwood 		return ret;
14997952f60SLiam Girdwood 
15097952f60SLiam Girdwood 	return 0;
15197952f60SLiam Girdwood }
15297952f60SLiam Girdwood 
153943b7311SBhumika Goyal static const struct snd_soc_ops spitz_ops = {
1547fb290d0SLiam Girdwood 	.startup = spitz_startup,
15597952f60SLiam Girdwood 	.hw_params = spitz_hw_params,
1567fb290d0SLiam Girdwood };
1577fb290d0SLiam Girdwood 
spitz_get_jack(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1587fb290d0SLiam Girdwood static int spitz_get_jack(struct snd_kcontrol *kcontrol,
1597fb290d0SLiam Girdwood 	struct snd_ctl_elem_value *ucontrol)
1607fb290d0SLiam Girdwood {
16149a1ba16STakashi Iwai 	ucontrol->value.enumerated.item[0] = spitz_jack_func;
1627fb290d0SLiam Girdwood 	return 0;
1637fb290d0SLiam Girdwood }
1647fb290d0SLiam Girdwood 
spitz_set_jack(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1657fb290d0SLiam Girdwood static int spitz_set_jack(struct snd_kcontrol *kcontrol,
1667fb290d0SLiam Girdwood 	struct snd_ctl_elem_value *ucontrol)
1677fb290d0SLiam Girdwood {
1680e66821fSLiam Girdwood 	struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);
1697fb290d0SLiam Girdwood 
17049a1ba16STakashi Iwai 	if (spitz_jack_func == ucontrol->value.enumerated.item[0])
1717fb290d0SLiam Girdwood 		return 0;
1727fb290d0SLiam Girdwood 
17349a1ba16STakashi Iwai 	spitz_jack_func = ucontrol->value.enumerated.item[0];
174059ad760SAxel Lin 	spitz_ext_control(&card->dapm);
1757fb290d0SLiam Girdwood 	return 1;
1767fb290d0SLiam Girdwood }
1777fb290d0SLiam Girdwood 
spitz_get_spk(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1787fb290d0SLiam Girdwood static int spitz_get_spk(struct snd_kcontrol *kcontrol,
1797fb290d0SLiam Girdwood 	struct snd_ctl_elem_value *ucontrol)
1807fb290d0SLiam Girdwood {
18149a1ba16STakashi Iwai 	ucontrol->value.enumerated.item[0] = spitz_spk_func;
1827fb290d0SLiam Girdwood 	return 0;
1837fb290d0SLiam Girdwood }
1847fb290d0SLiam Girdwood 
spitz_set_spk(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1857fb290d0SLiam Girdwood static int spitz_set_spk(struct snd_kcontrol *kcontrol,
1867fb290d0SLiam Girdwood 	struct snd_ctl_elem_value *ucontrol)
1877fb290d0SLiam Girdwood {
1880e66821fSLiam Girdwood 	struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);
1897fb290d0SLiam Girdwood 
19049a1ba16STakashi Iwai 	if (spitz_spk_func == ucontrol->value.enumerated.item[0])
1917fb290d0SLiam Girdwood 		return 0;
1927fb290d0SLiam Girdwood 
19349a1ba16STakashi Iwai 	spitz_spk_func = ucontrol->value.enumerated.item[0];
194059ad760SAxel Lin 	spitz_ext_control(&card->dapm);
1957fb290d0SLiam Girdwood 	return 1;
1967fb290d0SLiam Girdwood }
1977fb290d0SLiam Girdwood 
spitz_mic_bias(struct snd_soc_dapm_widget * w,struct snd_kcontrol * k,int event)198338c7ed0SJarkko Nikula static int spitz_mic_bias(struct snd_soc_dapm_widget *w,
199338c7ed0SJarkko Nikula 	struct snd_kcontrol *k, int event)
2007fb290d0SLiam Girdwood {
201*726d8c96SArnd Bergmann 	gpiod_set_value_cansleep(gpiod_mic, SND_SOC_DAPM_EVENT_ON(event));
2027fb290d0SLiam Girdwood 	return 0;
2037fb290d0SLiam Girdwood }
2047fb290d0SLiam Girdwood 
2057fb290d0SLiam Girdwood /* spitz machine dapm widgets */
2067fb290d0SLiam Girdwood static const struct snd_soc_dapm_widget wm8750_dapm_widgets[] = {
2077fb290d0SLiam Girdwood 	SND_SOC_DAPM_HP("Headphone Jack", NULL),
2087fb290d0SLiam Girdwood 	SND_SOC_DAPM_MIC("Mic Jack", spitz_mic_bias),
2097fb290d0SLiam Girdwood 	SND_SOC_DAPM_SPK("Ext Spk", NULL),
2107fb290d0SLiam Girdwood 	SND_SOC_DAPM_LINE("Line Jack", NULL),
2117fb290d0SLiam Girdwood 
2127fb290d0SLiam Girdwood 	/* headset is a mic and mono headphone */
2137fb290d0SLiam Girdwood 	SND_SOC_DAPM_HP("Headset Jack", NULL),
2147fb290d0SLiam Girdwood };
2157fb290d0SLiam Girdwood 
2167fb290d0SLiam Girdwood /* Spitz machine audio_map */
2177c274263SAxel Lin static const struct snd_soc_dapm_route spitz_audio_map[] = {
2187fb290d0SLiam Girdwood 
2197fb290d0SLiam Girdwood 	/* headphone connected to LOUT1, ROUT1 */
2207fb290d0SLiam Girdwood 	{"Headphone Jack", NULL, "LOUT1"},
2217fb290d0SLiam Girdwood 	{"Headphone Jack", NULL, "ROUT1"},
2227fb290d0SLiam Girdwood 
2237fb290d0SLiam Girdwood 	/* headset connected to ROUT1 and LINPUT1 with bias (def below) */
2247fb290d0SLiam Girdwood 	{"Headset Jack", NULL, "ROUT1"},
2257fb290d0SLiam Girdwood 
2267fb290d0SLiam Girdwood 	/* ext speaker connected to LOUT2, ROUT2  */
2277fb290d0SLiam Girdwood 	{"Ext Spk", NULL, "ROUT2"},
2287fb290d0SLiam Girdwood 	{"Ext Spk", NULL, "LOUT2"},
2297fb290d0SLiam Girdwood 
2307fb290d0SLiam Girdwood 	/* mic is connected to input 1 - with bias */
2317fb290d0SLiam Girdwood 	{"LINPUT1", NULL, "Mic Bias"},
2327fb290d0SLiam Girdwood 	{"Mic Bias", NULL, "Mic Jack"},
2337fb290d0SLiam Girdwood 
2347fb290d0SLiam Girdwood 	/* line is connected to input 1 - no bias */
2357fb290d0SLiam Girdwood 	{"LINPUT1", NULL, "Line Jack"},
2367fb290d0SLiam Girdwood };
2377fb290d0SLiam Girdwood 
23892be5810SLars-Peter Clausen static const char * const jack_function[] = {"Headphone", "Mic", "Line",
23992be5810SLars-Peter Clausen 	"Headset", "Off"};
24092be5810SLars-Peter Clausen static const char * const spk_function[] = {"On", "Off"};
2417fb290d0SLiam Girdwood static const struct soc_enum spitz_enum[] = {
2427fb290d0SLiam Girdwood 	SOC_ENUM_SINGLE_EXT(5, jack_function),
2437fb290d0SLiam Girdwood 	SOC_ENUM_SINGLE_EXT(2, spk_function),
2447fb290d0SLiam Girdwood };
2457fb290d0SLiam Girdwood 
2467fb290d0SLiam Girdwood static const struct snd_kcontrol_new wm8750_spitz_controls[] = {
2477fb290d0SLiam Girdwood 	SOC_ENUM_EXT("Jack Function", spitz_enum[0], spitz_get_jack,
2487fb290d0SLiam Girdwood 		spitz_set_jack),
2497fb290d0SLiam Girdwood 	SOC_ENUM_EXT("Speaker Function", spitz_enum[1], spitz_get_spk,
2507fb290d0SLiam Girdwood 		spitz_set_spk),
2517fb290d0SLiam Girdwood };
2527fb290d0SLiam Girdwood 
2537fb290d0SLiam Girdwood /* spitz digital audio interface glue - connects codec <--> CPU */
254196a521aSKuninori Morimoto SND_SOC_DAILINK_DEFS(wm8750,
255196a521aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_CPU("pxa2xx-i2s")),
256196a521aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_CODEC("wm8750.0-001b", "wm8750-hifi")),
257196a521aSKuninori Morimoto 	DAILINK_COMP_ARRAY(COMP_PLATFORM("pxa-pcm-audio")));
258196a521aSKuninori Morimoto 
2597fb290d0SLiam Girdwood static struct snd_soc_dai_link spitz_dai = {
2607fb290d0SLiam Girdwood 	.name = "wm8750",
2617fb290d0SLiam Girdwood 	.stream_name = "WM8750",
262c0e94231SAxel Lin 	.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
263c0e94231SAxel Lin 		   SND_SOC_DAIFMT_CBS_CFS,
26497952f60SLiam Girdwood 	.ops = &spitz_ops,
265196a521aSKuninori Morimoto 	SND_SOC_DAILINK_REG(wm8750),
2667fb290d0SLiam Girdwood };
2677fb290d0SLiam Girdwood 
2687fb290d0SLiam Girdwood /* spitz audio machine driver */
26987506549SMark Brown static struct snd_soc_card snd_soc_spitz = {
2707fb290d0SLiam Girdwood 	.name = "Spitz",
271561c6a17SAxel Lin 	.owner = THIS_MODULE,
2727fb290d0SLiam Girdwood 	.dai_link = &spitz_dai,
2737fb290d0SLiam Girdwood 	.num_links = 1,
2747c274263SAxel Lin 
2757c274263SAxel Lin 	.controls = wm8750_spitz_controls,
2767c274263SAxel Lin 	.num_controls = ARRAY_SIZE(wm8750_spitz_controls),
2777c274263SAxel Lin 	.dapm_widgets = wm8750_dapm_widgets,
2787c274263SAxel Lin 	.num_dapm_widgets = ARRAY_SIZE(wm8750_dapm_widgets),
2797c274263SAxel Lin 	.dapm_routes = spitz_audio_map,
2807c274263SAxel Lin 	.num_dapm_routes = ARRAY_SIZE(spitz_audio_map),
281c4b7586cSLars-Peter Clausen 	.fully_routed = true,
2827fb290d0SLiam Girdwood };
2837fb290d0SLiam Girdwood 
spitz_probe(struct platform_device * pdev)284ecf00151SDmitry Eremin-Solenikov static int spitz_probe(struct platform_device *pdev)
2857fb290d0SLiam Girdwood {
286ecf00151SDmitry Eremin-Solenikov 	struct snd_soc_card *card = &snd_soc_spitz;
2877fb290d0SLiam Girdwood 	int ret;
2887fb290d0SLiam Girdwood 
289*726d8c96SArnd Bergmann 	gpiod_mic = devm_gpiod_get(&pdev->dev, "mic", GPIOD_OUT_LOW);
290*726d8c96SArnd Bergmann 	if (IS_ERR(gpiod_mic))
291*726d8c96SArnd Bergmann 		return PTR_ERR(gpiod_mic);
292*726d8c96SArnd Bergmann 	gpiod_mute_l = devm_gpiod_get(&pdev->dev, "mute-l", GPIOD_OUT_LOW);
293*726d8c96SArnd Bergmann 	if (IS_ERR(gpiod_mute_l))
294*726d8c96SArnd Bergmann 		return PTR_ERR(gpiod_mute_l);
295*726d8c96SArnd Bergmann 	gpiod_mute_r = devm_gpiod_get(&pdev->dev, "mute-r", GPIOD_OUT_LOW);
296*726d8c96SArnd Bergmann 	if (IS_ERR(gpiod_mute_r))
297*726d8c96SArnd Bergmann 		return PTR_ERR(gpiod_mute_r);
29804368d05SMarek Vasut 
299ecf00151SDmitry Eremin-Solenikov 	card->dev = &pdev->dev;
300ecf00151SDmitry Eremin-Solenikov 
3012fd7076aSAxel Lin 	ret = devm_snd_soc_register_card(&pdev->dev, card);
302*726d8c96SArnd Bergmann 	if (ret)
303ecf00151SDmitry Eremin-Solenikov 		dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
304ecf00151SDmitry Eremin-Solenikov 			ret);
3057fb290d0SLiam Girdwood 
3067fb290d0SLiam Girdwood 	return ret;
3077fb290d0SLiam Girdwood }
3087fb290d0SLiam Girdwood 
309ecf00151SDmitry Eremin-Solenikov static struct platform_driver spitz_driver = {
310ecf00151SDmitry Eremin-Solenikov 	.driver		= {
311ecf00151SDmitry Eremin-Solenikov 		.name	= "spitz-audio",
312ecf00151SDmitry Eremin-Solenikov 		.pm     = &snd_soc_pm_ops,
313ecf00151SDmitry Eremin-Solenikov 	},
314ecf00151SDmitry Eremin-Solenikov 	.probe		= spitz_probe,
315ecf00151SDmitry Eremin-Solenikov };
316ecf00151SDmitry Eremin-Solenikov 
317ecf00151SDmitry Eremin-Solenikov module_platform_driver(spitz_driver);
3187fb290d0SLiam Girdwood 
3197fb290d0SLiam Girdwood MODULE_AUTHOR("Richard Purdie");
3207fb290d0SLiam Girdwood MODULE_DESCRIPTION("ALSA SoC Spitz");
3217fb290d0SLiam Girdwood MODULE_LICENSE("GPL");
322ecf00151SDmitry Eremin-Solenikov MODULE_ALIAS("platform:spitz-audio");
323