xref: /openbmc/linux/sound/soc/pxa/spitz.c (revision a3adfa00)
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;
457fb290d0SLiam Girdwood 
467fb290d0SLiam Girdwood static void spitz_ext_control(struct snd_soc_codec *codec)
477fb290d0SLiam Girdwood {
48ce6120ccSLiam Girdwood 	struct snd_soc_dapm_context *dapm = &codec->dapm;
49ce6120ccSLiam Girdwood 
507fb290d0SLiam Girdwood 	if (spitz_spk_func == SPITZ_SPK_ON)
51ce6120ccSLiam Girdwood 		snd_soc_dapm_enable_pin(dapm, "Ext Spk");
527fb290d0SLiam Girdwood 	else
53ce6120ccSLiam Girdwood 		snd_soc_dapm_disable_pin(dapm, "Ext Spk");
547fb290d0SLiam Girdwood 
557fb290d0SLiam Girdwood 	/* set up jack connection */
567fb290d0SLiam Girdwood 	switch (spitz_jack_func) {
577fb290d0SLiam Girdwood 	case SPITZ_HP:
587fb290d0SLiam Girdwood 		/* enable and unmute hp jack, disable mic bias */
59ce6120ccSLiam Girdwood 		snd_soc_dapm_disable_pin(dapm, "Headset Jack");
60ce6120ccSLiam Girdwood 		snd_soc_dapm_disable_pin(dapm, "Mic Jack");
61ce6120ccSLiam Girdwood 		snd_soc_dapm_disable_pin(dapm, "Line Jack");
62ce6120ccSLiam Girdwood 		snd_soc_dapm_enable_pin(dapm, "Headphone Jack");
63fff14720SEric Miao 		gpio_set_value(SPITZ_GPIO_MUTE_L, 1);
64fff14720SEric Miao 		gpio_set_value(SPITZ_GPIO_MUTE_R, 1);
657fb290d0SLiam Girdwood 		break;
667fb290d0SLiam Girdwood 	case SPITZ_MIC:
677fb290d0SLiam Girdwood 		/* enable mic jack and bias, mute hp */
68ce6120ccSLiam Girdwood 		snd_soc_dapm_disable_pin(dapm, "Headphone Jack");
69ce6120ccSLiam Girdwood 		snd_soc_dapm_disable_pin(dapm, "Headset Jack");
70ce6120ccSLiam Girdwood 		snd_soc_dapm_disable_pin(dapm, "Line Jack");
71ce6120ccSLiam Girdwood 		snd_soc_dapm_enable_pin(dapm, "Mic Jack");
72fff14720SEric Miao 		gpio_set_value(SPITZ_GPIO_MUTE_L, 0);
73fff14720SEric Miao 		gpio_set_value(SPITZ_GPIO_MUTE_R, 0);
747fb290d0SLiam Girdwood 		break;
757fb290d0SLiam Girdwood 	case SPITZ_LINE:
767fb290d0SLiam Girdwood 		/* enable line jack, disable mic bias and mute hp */
77ce6120ccSLiam Girdwood 		snd_soc_dapm_disable_pin(dapm, "Headphone Jack");
78ce6120ccSLiam Girdwood 		snd_soc_dapm_disable_pin(dapm, "Headset Jack");
79ce6120ccSLiam Girdwood 		snd_soc_dapm_disable_pin(dapm, "Mic Jack");
80ce6120ccSLiam Girdwood 		snd_soc_dapm_enable_pin(dapm, "Line Jack");
81fff14720SEric Miao 		gpio_set_value(SPITZ_GPIO_MUTE_L, 0);
82fff14720SEric Miao 		gpio_set_value(SPITZ_GPIO_MUTE_R, 0);
837fb290d0SLiam Girdwood 		break;
847fb290d0SLiam Girdwood 	case SPITZ_HEADSET:
857fb290d0SLiam Girdwood 		/* enable and unmute headset jack enable mic bias, mute L hp */
86ce6120ccSLiam Girdwood 		snd_soc_dapm_disable_pin(dapm, "Headphone Jack");
87ce6120ccSLiam Girdwood 		snd_soc_dapm_enable_pin(dapm, "Mic Jack");
88ce6120ccSLiam Girdwood 		snd_soc_dapm_disable_pin(dapm, "Line Jack");
89ce6120ccSLiam Girdwood 		snd_soc_dapm_enable_pin(dapm, "Headset Jack");
90fff14720SEric Miao 		gpio_set_value(SPITZ_GPIO_MUTE_L, 0);
91fff14720SEric Miao 		gpio_set_value(SPITZ_GPIO_MUTE_R, 1);
927fb290d0SLiam Girdwood 		break;
937fb290d0SLiam Girdwood 	case SPITZ_HP_OFF:
947fb290d0SLiam Girdwood 
957fb290d0SLiam Girdwood 		/* jack removed, everything off */
96ce6120ccSLiam Girdwood 		snd_soc_dapm_disable_pin(dapm, "Headphone Jack");
97ce6120ccSLiam Girdwood 		snd_soc_dapm_disable_pin(dapm, "Headset Jack");
98ce6120ccSLiam Girdwood 		snd_soc_dapm_disable_pin(dapm, "Mic Jack");
99ce6120ccSLiam Girdwood 		snd_soc_dapm_disable_pin(dapm, "Line Jack");
100fff14720SEric Miao 		gpio_set_value(SPITZ_GPIO_MUTE_L, 0);
101fff14720SEric Miao 		gpio_set_value(SPITZ_GPIO_MUTE_R, 0);
1027fb290d0SLiam Girdwood 		break;
1037fb290d0SLiam Girdwood 	}
104ce6120ccSLiam Girdwood 	snd_soc_dapm_sync(dapm);
1057fb290d0SLiam Girdwood }
1067fb290d0SLiam Girdwood 
1077fb290d0SLiam Girdwood static int spitz_startup(struct snd_pcm_substream *substream)
1087fb290d0SLiam Girdwood {
1097fb290d0SLiam Girdwood 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
110f0fba2adSLiam Girdwood 	struct snd_soc_codec *codec = rtd->codec;
1117fb290d0SLiam Girdwood 
11271a29560SMark Brown 	mutex_lock(&codec->mutex);
11371a29560SMark Brown 
1147fb290d0SLiam Girdwood 	/* check the jack status at stream startup */
1157fb290d0SLiam Girdwood 	spitz_ext_control(codec);
11671a29560SMark Brown 
11771a29560SMark Brown 	mutex_unlock(&codec->mutex);
11871a29560SMark Brown 
1197fb290d0SLiam Girdwood 	return 0;
1207fb290d0SLiam Girdwood }
1217fb290d0SLiam Girdwood 
12297952f60SLiam Girdwood static int spitz_hw_params(struct snd_pcm_substream *substream,
12397952f60SLiam Girdwood 	struct snd_pcm_hw_params *params)
12497952f60SLiam Girdwood {
12597952f60SLiam Girdwood 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
126f0fba2adSLiam Girdwood 	struct snd_soc_dai *codec_dai = rtd->codec_dai;
127f0fba2adSLiam Girdwood 	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
12897952f60SLiam Girdwood 	unsigned int clk = 0;
12997952f60SLiam Girdwood 	int ret = 0;
13097952f60SLiam Girdwood 
13197952f60SLiam Girdwood 	switch (params_rate(params)) {
13297952f60SLiam Girdwood 	case 8000:
13397952f60SLiam Girdwood 	case 16000:
13497952f60SLiam Girdwood 	case 48000:
13597952f60SLiam Girdwood 	case 96000:
13697952f60SLiam Girdwood 		clk = 12288000;
13797952f60SLiam Girdwood 		break;
13897952f60SLiam Girdwood 	case 11025:
13997952f60SLiam Girdwood 	case 22050:
14097952f60SLiam Girdwood 	case 44100:
14197952f60SLiam Girdwood 		clk = 11289600;
14297952f60SLiam Girdwood 		break;
14397952f60SLiam Girdwood 	}
14497952f60SLiam Girdwood 
14597952f60SLiam Girdwood 	/* set codec DAI configuration */
14664105cfdSLiam Girdwood 	ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
14797952f60SLiam Girdwood 		SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS);
14897952f60SLiam Girdwood 	if (ret < 0)
14997952f60SLiam Girdwood 		return ret;
15097952f60SLiam Girdwood 
15197952f60SLiam Girdwood 	/* set cpu DAI configuration */
15264105cfdSLiam Girdwood 	ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
15397952f60SLiam Girdwood 		SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS);
15497952f60SLiam Girdwood 	if (ret < 0)
15597952f60SLiam Girdwood 		return ret;
15697952f60SLiam Girdwood 
15797952f60SLiam Girdwood 	/* set the codec system clock for DAC and ADC */
15864105cfdSLiam Girdwood 	ret = snd_soc_dai_set_sysclk(codec_dai, WM8750_SYSCLK, clk,
15997952f60SLiam Girdwood 		SND_SOC_CLOCK_IN);
16097952f60SLiam Girdwood 	if (ret < 0)
16197952f60SLiam Girdwood 		return ret;
16297952f60SLiam Girdwood 
16397952f60SLiam Girdwood 	/* set the I2S system clock as input (unused) */
16464105cfdSLiam Girdwood 	ret = snd_soc_dai_set_sysclk(cpu_dai, PXA2XX_I2S_SYSCLK, 0,
16597952f60SLiam Girdwood 		SND_SOC_CLOCK_IN);
16697952f60SLiam Girdwood 	if (ret < 0)
16797952f60SLiam Girdwood 		return ret;
16897952f60SLiam Girdwood 
16997952f60SLiam Girdwood 	return 0;
17097952f60SLiam Girdwood }
17197952f60SLiam Girdwood 
1727fb290d0SLiam Girdwood static struct snd_soc_ops spitz_ops = {
1737fb290d0SLiam Girdwood 	.startup = spitz_startup,
17497952f60SLiam Girdwood 	.hw_params = spitz_hw_params,
1757fb290d0SLiam Girdwood };
1767fb290d0SLiam Girdwood 
1777fb290d0SLiam Girdwood static int spitz_get_jack(struct snd_kcontrol *kcontrol,
1787fb290d0SLiam Girdwood 	struct snd_ctl_elem_value *ucontrol)
1797fb290d0SLiam Girdwood {
1807fb290d0SLiam Girdwood 	ucontrol->value.integer.value[0] = spitz_jack_func;
1817fb290d0SLiam Girdwood 	return 0;
1827fb290d0SLiam Girdwood }
1837fb290d0SLiam Girdwood 
1847fb290d0SLiam Girdwood static int spitz_set_jack(struct snd_kcontrol *kcontrol,
1857fb290d0SLiam Girdwood 	struct snd_ctl_elem_value *ucontrol)
1867fb290d0SLiam Girdwood {
1877fb290d0SLiam Girdwood 	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
1887fb290d0SLiam Girdwood 
1897fb290d0SLiam Girdwood 	if (spitz_jack_func == ucontrol->value.integer.value[0])
1907fb290d0SLiam Girdwood 		return 0;
1917fb290d0SLiam Girdwood 
1927fb290d0SLiam Girdwood 	spitz_jack_func = ucontrol->value.integer.value[0];
1937fb290d0SLiam Girdwood 	spitz_ext_control(codec);
1947fb290d0SLiam Girdwood 	return 1;
1957fb290d0SLiam Girdwood }
1967fb290d0SLiam Girdwood 
1977fb290d0SLiam Girdwood static int spitz_get_spk(struct snd_kcontrol *kcontrol,
1987fb290d0SLiam Girdwood 	struct snd_ctl_elem_value *ucontrol)
1997fb290d0SLiam Girdwood {
2007fb290d0SLiam Girdwood 	ucontrol->value.integer.value[0] = spitz_spk_func;
2017fb290d0SLiam Girdwood 	return 0;
2027fb290d0SLiam Girdwood }
2037fb290d0SLiam Girdwood 
2047fb290d0SLiam Girdwood static int spitz_set_spk(struct snd_kcontrol *kcontrol,
2057fb290d0SLiam Girdwood 	struct snd_ctl_elem_value *ucontrol)
2067fb290d0SLiam Girdwood {
2077fb290d0SLiam Girdwood 	struct snd_soc_codec *codec =  snd_kcontrol_chip(kcontrol);
2087fb290d0SLiam Girdwood 
2097fb290d0SLiam Girdwood 	if (spitz_spk_func == ucontrol->value.integer.value[0])
2107fb290d0SLiam Girdwood 		return 0;
2117fb290d0SLiam Girdwood 
2127fb290d0SLiam Girdwood 	spitz_spk_func = ucontrol->value.integer.value[0];
2137fb290d0SLiam Girdwood 	spitz_ext_control(codec);
2147fb290d0SLiam Girdwood 	return 1;
2157fb290d0SLiam Girdwood }
2167fb290d0SLiam Girdwood 
217338c7ed0SJarkko Nikula static int spitz_mic_bias(struct snd_soc_dapm_widget *w,
218338c7ed0SJarkko Nikula 	struct snd_kcontrol *k, int event)
2197fb290d0SLiam Girdwood {
220fff14720SEric Miao 	if (machine_is_borzoi() || machine_is_spitz())
221fff14720SEric Miao 		gpio_set_value(SPITZ_GPIO_MIC_BIAS,
222fff14720SEric Miao 				SND_SOC_DAPM_EVENT_ON(event));
2237fb290d0SLiam Girdwood 
224f72de663SEric Miao 	if (machine_is_akita())
225f72de663SEric Miao 		gpio_set_value(AKITA_GPIO_MIC_BIAS,
226f72de663SEric Miao 				SND_SOC_DAPM_EVENT_ON(event));
227f72de663SEric Miao 
2287fb290d0SLiam Girdwood 	return 0;
2297fb290d0SLiam Girdwood }
2307fb290d0SLiam Girdwood 
2317fb290d0SLiam Girdwood /* spitz machine dapm widgets */
2327fb290d0SLiam Girdwood static const struct snd_soc_dapm_widget wm8750_dapm_widgets[] = {
2337fb290d0SLiam Girdwood 	SND_SOC_DAPM_HP("Headphone Jack", NULL),
2347fb290d0SLiam Girdwood 	SND_SOC_DAPM_MIC("Mic Jack", spitz_mic_bias),
2357fb290d0SLiam Girdwood 	SND_SOC_DAPM_SPK("Ext Spk", NULL),
2367fb290d0SLiam Girdwood 	SND_SOC_DAPM_LINE("Line Jack", NULL),
2377fb290d0SLiam Girdwood 
2387fb290d0SLiam Girdwood 	/* headset is a mic and mono headphone */
2397fb290d0SLiam Girdwood 	SND_SOC_DAPM_HP("Headset Jack", NULL),
2407fb290d0SLiam Girdwood };
2417fb290d0SLiam Girdwood 
2427fb290d0SLiam Girdwood /* Spitz machine audio_map */
24325191c45SMark Brown static const struct snd_soc_dapm_route audio_map[] = {
2447fb290d0SLiam Girdwood 
2457fb290d0SLiam Girdwood 	/* headphone connected to LOUT1, ROUT1 */
2467fb290d0SLiam Girdwood 	{"Headphone Jack", NULL, "LOUT1"},
2477fb290d0SLiam Girdwood 	{"Headphone Jack", NULL, "ROUT1"},
2487fb290d0SLiam Girdwood 
2497fb290d0SLiam Girdwood 	/* headset connected to ROUT1 and LINPUT1 with bias (def below) */
2507fb290d0SLiam Girdwood 	{"Headset Jack", NULL, "ROUT1"},
2517fb290d0SLiam Girdwood 
2527fb290d0SLiam Girdwood 	/* ext speaker connected to LOUT2, ROUT2  */
2537fb290d0SLiam Girdwood 	{"Ext Spk", NULL , "ROUT2"},
2547fb290d0SLiam Girdwood 	{"Ext Spk", NULL , "LOUT2"},
2557fb290d0SLiam Girdwood 
2567fb290d0SLiam Girdwood 	/* mic is connected to input 1 - with bias */
2577fb290d0SLiam Girdwood 	{"LINPUT1", NULL, "Mic Bias"},
2587fb290d0SLiam Girdwood 	{"Mic Bias", NULL, "Mic Jack"},
2597fb290d0SLiam Girdwood 
2607fb290d0SLiam Girdwood 	/* line is connected to input 1 - no bias */
2617fb290d0SLiam Girdwood 	{"LINPUT1", NULL, "Line Jack"},
2627fb290d0SLiam Girdwood };
2637fb290d0SLiam Girdwood 
2647fb290d0SLiam Girdwood static const char *jack_function[] = {"Headphone", "Mic", "Line", "Headset",
2657fb290d0SLiam Girdwood 	"Off"};
2667fb290d0SLiam Girdwood static const char *spk_function[] = {"On", "Off"};
2677fb290d0SLiam Girdwood static const struct soc_enum spitz_enum[] = {
2687fb290d0SLiam Girdwood 	SOC_ENUM_SINGLE_EXT(5, jack_function),
2697fb290d0SLiam Girdwood 	SOC_ENUM_SINGLE_EXT(2, spk_function),
2707fb290d0SLiam Girdwood };
2717fb290d0SLiam Girdwood 
2727fb290d0SLiam Girdwood static const struct snd_kcontrol_new wm8750_spitz_controls[] = {
2737fb290d0SLiam Girdwood 	SOC_ENUM_EXT("Jack Function", spitz_enum[0], spitz_get_jack,
2747fb290d0SLiam Girdwood 		spitz_set_jack),
2757fb290d0SLiam Girdwood 	SOC_ENUM_EXT("Speaker Function", spitz_enum[1], spitz_get_spk,
2767fb290d0SLiam Girdwood 		spitz_set_spk),
2777fb290d0SLiam Girdwood };
2787fb290d0SLiam Girdwood 
2797fb290d0SLiam Girdwood /*
2807fb290d0SLiam Girdwood  * Logic for a wm8750 as connected on a Sharp SL-Cxx00 Device
2817fb290d0SLiam Girdwood  */
282f0fba2adSLiam Girdwood static int spitz_wm8750_init(struct snd_soc_pcm_runtime *rtd)
2837fb290d0SLiam Girdwood {
284f0fba2adSLiam Girdwood 	struct snd_soc_codec *codec = rtd->codec;
285ce6120ccSLiam Girdwood 	struct snd_soc_dapm_context *dapm = &codec->dapm;
286eb5f6d75SPhilipp Zabel 	int err;
2877fb290d0SLiam Girdwood 
2887fb290d0SLiam Girdwood 	/* NC codec pins */
289ce6120ccSLiam Girdwood 	snd_soc_dapm_nc_pin(dapm, "RINPUT1");
290ce6120ccSLiam Girdwood 	snd_soc_dapm_nc_pin(dapm, "LINPUT2");
291ce6120ccSLiam Girdwood 	snd_soc_dapm_nc_pin(dapm, "RINPUT2");
292ce6120ccSLiam Girdwood 	snd_soc_dapm_nc_pin(dapm, "LINPUT3");
293ce6120ccSLiam Girdwood 	snd_soc_dapm_nc_pin(dapm, "RINPUT3");
294ce6120ccSLiam Girdwood 	snd_soc_dapm_nc_pin(dapm, "OUT3");
295ce6120ccSLiam Girdwood 	snd_soc_dapm_nc_pin(dapm, "MONO1");
2967fb290d0SLiam Girdwood 
2977fb290d0SLiam Girdwood 	/* Add spitz specific controls */
298eb5f6d75SPhilipp Zabel 	err = snd_soc_add_controls(codec, wm8750_spitz_controls,
299eb5f6d75SPhilipp Zabel 				ARRAY_SIZE(wm8750_spitz_controls));
3007fb290d0SLiam Girdwood 	if (err < 0)
3017fb290d0SLiam Girdwood 		return err;
3027fb290d0SLiam Girdwood 
3037fb290d0SLiam Girdwood 	/* Add spitz specific widgets */
304ce6120ccSLiam Girdwood 	snd_soc_dapm_new_controls(dapm, wm8750_dapm_widgets,
30525191c45SMark Brown 				  ARRAY_SIZE(wm8750_dapm_widgets));
3067fb290d0SLiam Girdwood 
30725191c45SMark Brown 	/* Set up spitz specific audio paths */
308ce6120ccSLiam Girdwood 	snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map));
3097fb290d0SLiam Girdwood 
310ce6120ccSLiam Girdwood 	snd_soc_dapm_sync(dapm);
3117fb290d0SLiam Girdwood 	return 0;
3127fb290d0SLiam Girdwood }
3137fb290d0SLiam Girdwood 
3147fb290d0SLiam Girdwood /* spitz digital audio interface glue - connects codec <--> CPU */
3157fb290d0SLiam Girdwood static struct snd_soc_dai_link spitz_dai = {
3167fb290d0SLiam Girdwood 	.name = "wm8750",
3177fb290d0SLiam Girdwood 	.stream_name = "WM8750",
318a3adfa00SDmitry Eremin-Solenikov 	.cpu_dai_name = "pxa2xx-i2s",
319f0fba2adSLiam Girdwood 	.codec_dai_name = "wm8750-hifi",
320f0fba2adSLiam Girdwood 	.platform_name = "pxa-pcm-audio",
321a3adfa00SDmitry Eremin-Solenikov 	.codec_name = "wm8750-codec.0-001b",
3227fb290d0SLiam Girdwood 	.init = spitz_wm8750_init,
32397952f60SLiam Girdwood 	.ops = &spitz_ops,
3247fb290d0SLiam Girdwood };
3257fb290d0SLiam Girdwood 
3267fb290d0SLiam Girdwood /* spitz audio machine driver */
32787506549SMark Brown static struct snd_soc_card snd_soc_spitz = {
3287fb290d0SLiam Girdwood 	.name = "Spitz",
3297fb290d0SLiam Girdwood 	.dai_link = &spitz_dai,
3307fb290d0SLiam Girdwood 	.num_links = 1,
3317fb290d0SLiam Girdwood };
3327fb290d0SLiam Girdwood 
3337fb290d0SLiam Girdwood static struct platform_device *spitz_snd_device;
3347fb290d0SLiam Girdwood 
3357fb290d0SLiam Girdwood static int __init spitz_init(void)
3367fb290d0SLiam Girdwood {
3377fb290d0SLiam Girdwood 	int ret;
3387fb290d0SLiam Girdwood 
3397fb290d0SLiam Girdwood 	if (!(machine_is_spitz() || machine_is_borzoi() || machine_is_akita()))
3407fb290d0SLiam Girdwood 		return -ENODEV;
3417fb290d0SLiam Girdwood 
3427fb290d0SLiam Girdwood 	spitz_snd_device = platform_device_alloc("soc-audio", -1);
3437fb290d0SLiam Girdwood 	if (!spitz_snd_device)
3447fb290d0SLiam Girdwood 		return -ENOMEM;
3457fb290d0SLiam Girdwood 
346f0fba2adSLiam Girdwood 	platform_set_drvdata(spitz_snd_device, &snd_soc_spitz);
3477fb290d0SLiam Girdwood 	ret = platform_device_add(spitz_snd_device);
3487fb290d0SLiam Girdwood 
3497fb290d0SLiam Girdwood 	if (ret)
3507fb290d0SLiam Girdwood 		platform_device_put(spitz_snd_device);
3517fb290d0SLiam Girdwood 
3527fb290d0SLiam Girdwood 	return ret;
3537fb290d0SLiam Girdwood }
3547fb290d0SLiam Girdwood 
3557fb290d0SLiam Girdwood static void __exit spitz_exit(void)
3567fb290d0SLiam Girdwood {
3577fb290d0SLiam Girdwood 	platform_device_unregister(spitz_snd_device);
3587fb290d0SLiam Girdwood }
3597fb290d0SLiam Girdwood 
3607fb290d0SLiam Girdwood module_init(spitz_init);
3617fb290d0SLiam Girdwood module_exit(spitz_exit);
3627fb290d0SLiam Girdwood 
3637fb290d0SLiam Girdwood MODULE_AUTHOR("Richard Purdie");
3647fb290d0SLiam Girdwood MODULE_DESCRIPTION("ALSA SoC Spitz");
3657fb290d0SLiam Girdwood MODULE_LICENSE("GPL");
366