xref: /linux/include/sound/soc.h (revision 7c761b593e2c1dc6bc6c0c15ec338af1f00cabd7)
1808db4a4SRichard Purdie /*
2808db4a4SRichard Purdie  * linux/sound/soc.h -- ALSA SoC Layer
3808db4a4SRichard Purdie  *
4808db4a4SRichard Purdie  * Author:		Liam Girdwood
5808db4a4SRichard Purdie  * Created:		Aug 11th 2005
6808db4a4SRichard Purdie  * Copyright:	Wolfson Microelectronics. PLC.
7808db4a4SRichard Purdie  *
8808db4a4SRichard Purdie  * This program is free software; you can redistribute it and/or modify
9808db4a4SRichard Purdie  * it under the terms of the GNU General Public License version 2 as
10808db4a4SRichard Purdie  * published by the Free Software Foundation.
11808db4a4SRichard Purdie  */
12808db4a4SRichard Purdie 
13808db4a4SRichard Purdie #ifndef __LINUX_SND_SOC_H
14808db4a4SRichard Purdie #define __LINUX_SND_SOC_H
15808db4a4SRichard Purdie 
16cb470087SKuninori Morimoto #include <linux/of.h>
17808db4a4SRichard Purdie #include <linux/platform_device.h>
18808db4a4SRichard Purdie #include <linux/types.h>
19d5021ec9SMark Brown #include <linux/notifier.h>
204484bb2eSAndrew Morton #include <linux/workqueue.h>
21ec67624dSLopez Cruz, Misael #include <linux/interrupt.h>
22ec67624dSLopez Cruz, Misael #include <linux/kernel.h>
23be3ea3b9SMark Brown #include <linux/regmap.h>
2486767b7dSLars-Peter Clausen #include <linux/log2.h>
25808db4a4SRichard Purdie #include <sound/core.h>
26808db4a4SRichard Purdie #include <sound/pcm.h>
2749681077SVinod Koul #include <sound/compress_driver.h>
28808db4a4SRichard Purdie #include <sound/control.h>
29808db4a4SRichard Purdie #include <sound/ac97_codec.h>
30808db4a4SRichard Purdie 
31808db4a4SRichard Purdie /*
32808db4a4SRichard Purdie  * Convenience kcontrol builders
33808db4a4SRichard Purdie  */
3457295073SLars-Peter Clausen #define SOC_DOUBLE_VALUE(xreg, shift_left, shift_right, xmax, xinvert, xautodisable) \
354eaa9819SJon Smirl 	((unsigned long)&(struct soc_mixer_control) \
3630d86ba4SPeter Ujfalusi 	{.reg = xreg, .rreg = xreg, .shift = shift_left, \
3730d86ba4SPeter Ujfalusi 	.rshift = shift_right, .max = xmax, .platform_max = xmax, \
3857295073SLars-Peter Clausen 	.invert = xinvert, .autodisable = xautodisable})
39c1b4d1c7SLars-Peter Clausen #define SOC_DOUBLE_S_VALUE(xreg, shift_left, shift_right, xmin, xmax, xsign_bit, xinvert, xautodisable) \
40c1b4d1c7SLars-Peter Clausen 	((unsigned long)&(struct soc_mixer_control) \
41c1b4d1c7SLars-Peter Clausen 	{.reg = xreg, .rreg = xreg, .shift = shift_left, \
42c1b4d1c7SLars-Peter Clausen 	.rshift = shift_right, .min = xmin, .max = xmax, .platform_max = xmax, \
43c1b4d1c7SLars-Peter Clausen 	.sign_bit = xsign_bit, .invert = xinvert, .autodisable = xautodisable})
4457295073SLars-Peter Clausen #define SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert, xautodisable) \
4557295073SLars-Peter Clausen 	SOC_DOUBLE_VALUE(xreg, xshift, xshift, xmax, xinvert, xautodisable)
464eaa9819SJon Smirl #define SOC_SINGLE_VALUE_EXT(xreg, xmax, xinvert) \
474eaa9819SJon Smirl 	((unsigned long)&(struct soc_mixer_control) \
48d11bb4a9SPeter Ujfalusi 	{.reg = xreg, .max = xmax, .platform_max = xmax, .invert = xinvert})
49cdffa775SPeter Ujfalusi #define SOC_DOUBLE_R_VALUE(xlreg, xrreg, xshift, xmax, xinvert) \
50cdffa775SPeter Ujfalusi 	((unsigned long)&(struct soc_mixer_control) \
51cdffa775SPeter Ujfalusi 	{.reg = xlreg, .rreg = xrreg, .shift = xshift, .rshift = xshift, \
52cdffa775SPeter Ujfalusi 	.max = xmax, .platform_max = xmax, .invert = xinvert})
53cd21b123SMarkus Pargmann #define SOC_DOUBLE_R_S_VALUE(xlreg, xrreg, xshift, xmin, xmax, xsign_bit, xinvert) \
54cd21b123SMarkus Pargmann 	((unsigned long)&(struct soc_mixer_control) \
55cd21b123SMarkus Pargmann 	{.reg = xlreg, .rreg = xrreg, .shift = xshift, .rshift = xshift, \
56cd21b123SMarkus Pargmann 	.max = xmax, .min = xmin, .platform_max = xmax, .sign_bit = xsign_bit, \
57cd21b123SMarkus Pargmann 	.invert = xinvert})
58229e3fdcSMark Brown #define SOC_DOUBLE_R_RANGE_VALUE(xlreg, xrreg, xshift, xmin, xmax, xinvert) \
59229e3fdcSMark Brown 	((unsigned long)&(struct soc_mixer_control) \
60229e3fdcSMark Brown 	{.reg = xlreg, .rreg = xrreg, .shift = xshift, .rshift = xshift, \
61229e3fdcSMark Brown 	.min = xmin, .max = xmax, .platform_max = xmax, .invert = xinvert})
62a7a4ac86SPhilipp Zabel #define SOC_SINGLE(xname, reg, shift, max, invert) \
63808db4a4SRichard Purdie {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
64808db4a4SRichard Purdie 	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
65808db4a4SRichard Purdie 	.put = snd_soc_put_volsw, \
6657295073SLars-Peter Clausen 	.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) }
676c9d8cf6SAdam Thomson #define SOC_SINGLE_RANGE(xname, xreg, xshift, xmin, xmax, xinvert) \
686c9d8cf6SAdam Thomson {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
696c9d8cf6SAdam Thomson 	.info = snd_soc_info_volsw_range, .get = snd_soc_get_volsw_range, \
706c9d8cf6SAdam Thomson 	.put = snd_soc_put_volsw_range, \
716c9d8cf6SAdam Thomson 	.private_value = (unsigned long)&(struct soc_mixer_control) \
729bde4f0bSMark Brown 		{.reg = xreg, .rreg = xreg, .shift = xshift, \
739bde4f0bSMark Brown 		 .rshift = xshift,  .min = xmin, .max = xmax, \
749bde4f0bSMark Brown 		 .platform_max = xmax, .invert = xinvert} }
75a7a4ac86SPhilipp Zabel #define SOC_SINGLE_TLV(xname, reg, shift, max, invert, tlv_array) \
76a7a4ac86SPhilipp Zabel {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
77a7a4ac86SPhilipp Zabel 	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
78a7a4ac86SPhilipp Zabel 		 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
79a7a4ac86SPhilipp Zabel 	.tlv.p = (tlv_array), \
80a7a4ac86SPhilipp Zabel 	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
81a7a4ac86SPhilipp Zabel 	.put = snd_soc_put_volsw, \
8257295073SLars-Peter Clausen 	.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) }
831d99f243SBrian Austin #define SOC_SINGLE_SX_TLV(xname, xreg, xshift, xmin, xmax, tlv_array) \
841d99f243SBrian Austin {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
851d99f243SBrian Austin 	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
861d99f243SBrian Austin 	SNDRV_CTL_ELEM_ACCESS_READWRITE, \
871d99f243SBrian Austin 	.tlv.p  = (tlv_array),\
8834198710SCharles Keepax 	.info = snd_soc_info_volsw_sx, \
891d99f243SBrian Austin 	.get = snd_soc_get_volsw_sx,\
901d99f243SBrian Austin 	.put = snd_soc_put_volsw_sx, \
911d99f243SBrian Austin 	.private_value = (unsigned long)&(struct soc_mixer_control) \
921d99f243SBrian Austin 		{.reg = xreg, .rreg = xreg, \
931d99f243SBrian Austin 		.shift = xshift, .rshift = xshift, \
941d99f243SBrian Austin 		.max = xmax, .min = xmin} }
956c9d8cf6SAdam Thomson #define SOC_SINGLE_RANGE_TLV(xname, xreg, xshift, xmin, xmax, xinvert, tlv_array) \
966c9d8cf6SAdam Thomson {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
976c9d8cf6SAdam Thomson 	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
986c9d8cf6SAdam Thomson 		 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
996c9d8cf6SAdam Thomson 	.tlv.p = (tlv_array), \
1006c9d8cf6SAdam Thomson 	.info = snd_soc_info_volsw_range, \
1016c9d8cf6SAdam Thomson 	.get = snd_soc_get_volsw_range, .put = snd_soc_put_volsw_range, \
1026c9d8cf6SAdam Thomson 	.private_value = (unsigned long)&(struct soc_mixer_control) \
1039bde4f0bSMark Brown 		{.reg = xreg, .rreg = xreg, .shift = xshift, \
1049bde4f0bSMark Brown 		 .rshift = xshift, .min = xmin, .max = xmax, \
1059bde4f0bSMark Brown 		 .platform_max = xmax, .invert = xinvert} }
106460acbecSPeter Ujfalusi #define SOC_DOUBLE(xname, reg, shift_left, shift_right, max, invert) \
107808db4a4SRichard Purdie {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
108808db4a4SRichard Purdie 	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \
109808db4a4SRichard Purdie 	.put = snd_soc_put_volsw, \
110460acbecSPeter Ujfalusi 	.private_value = SOC_DOUBLE_VALUE(reg, shift_left, shift_right, \
11157295073SLars-Peter Clausen 					  max, invert, 0) }
112d13871b3SDamien.Horsley #define SOC_DOUBLE_STS(xname, reg, shift_left, shift_right, max, invert) \
113d13871b3SDamien.Horsley {									\
114d13871b3SDamien.Horsley 	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),		\
115d13871b3SDamien.Horsley 	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw,		\
116d13871b3SDamien.Horsley 	.access = SNDRV_CTL_ELEM_ACCESS_READ |				\
117d13871b3SDamien.Horsley 		SNDRV_CTL_ELEM_ACCESS_VOLATILE,				\
118d13871b3SDamien.Horsley 	.private_value = SOC_DOUBLE_VALUE(reg, shift_left, shift_right,	\
119d13871b3SDamien.Horsley 					  max, invert, 0) }
1204eaa9819SJon Smirl #define SOC_DOUBLE_R(xname, reg_left, reg_right, xshift, xmax, xinvert) \
121808db4a4SRichard Purdie {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
122e8f5a103SPeter Ujfalusi 	.info = snd_soc_info_volsw, \
123974815baSPeter Ujfalusi 	.get = snd_soc_get_volsw, .put = snd_soc_put_volsw, \
124cdffa775SPeter Ujfalusi 	.private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \
125cdffa775SPeter Ujfalusi 					    xmax, xinvert) }
126229e3fdcSMark Brown #define SOC_DOUBLE_R_RANGE(xname, reg_left, reg_right, xshift, xmin, \
127229e3fdcSMark Brown 			   xmax, xinvert)		\
128229e3fdcSMark Brown {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
129229e3fdcSMark Brown 	.info = snd_soc_info_volsw_range, \
130229e3fdcSMark Brown 	.get = snd_soc_get_volsw_range, .put = snd_soc_put_volsw_range, \
131229e3fdcSMark Brown 	.private_value = SOC_DOUBLE_R_RANGE_VALUE(reg_left, reg_right, \
132229e3fdcSMark Brown 					    xshift, xmin, xmax, xinvert) }
133460acbecSPeter Ujfalusi #define SOC_DOUBLE_TLV(xname, reg, shift_left, shift_right, max, invert, tlv_array) \
134a7a4ac86SPhilipp Zabel {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
135a7a4ac86SPhilipp Zabel 	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
136a7a4ac86SPhilipp Zabel 		 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
137a7a4ac86SPhilipp Zabel 	.tlv.p = (tlv_array), \
138a7a4ac86SPhilipp Zabel 	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \
139a7a4ac86SPhilipp Zabel 	.put = snd_soc_put_volsw, \
140460acbecSPeter Ujfalusi 	.private_value = SOC_DOUBLE_VALUE(reg, shift_left, shift_right, \
14157295073SLars-Peter Clausen 					  max, invert, 0) }
1424eaa9819SJon Smirl #define SOC_DOUBLE_R_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert, tlv_array) \
143a7a4ac86SPhilipp Zabel {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
144a7a4ac86SPhilipp Zabel 	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
145a7a4ac86SPhilipp Zabel 		 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
146a7a4ac86SPhilipp Zabel 	.tlv.p = (tlv_array), \
147e8f5a103SPeter Ujfalusi 	.info = snd_soc_info_volsw, \
148974815baSPeter Ujfalusi 	.get = snd_soc_get_volsw, .put = snd_soc_put_volsw, \
149cdffa775SPeter Ujfalusi 	.private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \
150cdffa775SPeter Ujfalusi 					    xmax, xinvert) }
151229e3fdcSMark Brown #define SOC_DOUBLE_R_RANGE_TLV(xname, reg_left, reg_right, xshift, xmin, \
152229e3fdcSMark Brown 			       xmax, xinvert, tlv_array)		\
153229e3fdcSMark Brown {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
154229e3fdcSMark Brown 	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
155229e3fdcSMark Brown 		 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
156229e3fdcSMark Brown 	.tlv.p = (tlv_array), \
157229e3fdcSMark Brown 	.info = snd_soc_info_volsw_range, \
158229e3fdcSMark Brown 	.get = snd_soc_get_volsw_range, .put = snd_soc_put_volsw_range, \
159229e3fdcSMark Brown 	.private_value = SOC_DOUBLE_R_RANGE_VALUE(reg_left, reg_right, \
160229e3fdcSMark Brown 					    xshift, xmin, xmax, xinvert) }
1611d99f243SBrian Austin #define SOC_DOUBLE_R_SX_TLV(xname, xreg, xrreg, xshift, xmin, xmax, tlv_array) \
1621d99f243SBrian Austin {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
1631d99f243SBrian Austin 	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
1641d99f243SBrian Austin 	SNDRV_CTL_ELEM_ACCESS_READWRITE, \
1651d99f243SBrian Austin 	.tlv.p  = (tlv_array), \
16634198710SCharles Keepax 	.info = snd_soc_info_volsw_sx, \
1671d99f243SBrian Austin 	.get = snd_soc_get_volsw_sx, \
1681d99f243SBrian Austin 	.put = snd_soc_put_volsw_sx, \
1691d99f243SBrian Austin 	.private_value = (unsigned long)&(struct soc_mixer_control) \
1701d99f243SBrian Austin 		{.reg = xreg, .rreg = xrreg, \
1711d99f243SBrian Austin 		.shift = xshift, .rshift = xshift, \
1721d99f243SBrian Austin 		.max = xmax, .min = xmin} }
173cd21b123SMarkus Pargmann #define SOC_DOUBLE_R_S_TLV(xname, reg_left, reg_right, xshift, xmin, xmax, xsign_bit, xinvert, tlv_array) \
174cd21b123SMarkus Pargmann {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
175cd21b123SMarkus Pargmann 	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
176cd21b123SMarkus Pargmann 		 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
177cd21b123SMarkus Pargmann 	.tlv.p = (tlv_array), \
178cd21b123SMarkus Pargmann 	.info = snd_soc_info_volsw, \
179cd21b123SMarkus Pargmann 	.get = snd_soc_get_volsw, .put = snd_soc_put_volsw, \
180cd21b123SMarkus Pargmann 	.private_value = SOC_DOUBLE_R_S_VALUE(reg_left, reg_right, xshift, \
181cd21b123SMarkus Pargmann 					    xmin, xmax, xsign_bit, xinvert) }
182dcc0799bSSrinivas Kandagatla #define SOC_SINGLE_S8_TLV(xname, xreg, xmin, xmax, tlv_array) \
183dcc0799bSSrinivas Kandagatla {	.iface  = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
184dcc0799bSSrinivas Kandagatla 	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
185dcc0799bSSrinivas Kandagatla 		  SNDRV_CTL_ELEM_ACCESS_READWRITE, \
186dcc0799bSSrinivas Kandagatla 	.tlv.p  = (tlv_array), \
187dcc0799bSSrinivas Kandagatla 	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
188dcc0799bSSrinivas Kandagatla 	.put = snd_soc_put_volsw, \
189dcc0799bSSrinivas Kandagatla 	.private_value = (unsigned long)&(struct soc_mixer_control) \
190dcc0799bSSrinivas Kandagatla 	{.reg = xreg, .rreg = xreg,  \
191dcc0799bSSrinivas Kandagatla 	 .min = xmin, .max = xmax, .platform_max = xmax, \
192dcc0799bSSrinivas Kandagatla 	.sign_bit = 7,} }
1934eaa9819SJon Smirl #define SOC_DOUBLE_S8_TLV(xname, xreg, xmin, xmax, tlv_array) \
194e13ac2e9SMark Brown {	.iface  = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
195e13ac2e9SMark Brown 	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
196e13ac2e9SMark Brown 		  SNDRV_CTL_ELEM_ACCESS_READWRITE, \
197e13ac2e9SMark Brown 	.tlv.p  = (tlv_array), \
198c1b4d1c7SLars-Peter Clausen 	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
199c1b4d1c7SLars-Peter Clausen 	.put = snd_soc_put_volsw, \
200c1b4d1c7SLars-Peter Clausen 	.private_value = SOC_DOUBLE_S_VALUE(xreg, 0, 8, xmin, xmax, 7, 0, 0) }
2019a8d38dbSTakashi Iwai #define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xitems, xtexts) \
202808db4a4SRichard Purdie {	.reg = xreg, .shift_l = xshift_l, .shift_r = xshift_r, \
2039a8d38dbSTakashi Iwai 	.items = xitems, .texts = xtexts, \
2049a8d38dbSTakashi Iwai 	.mask = xitems ? roundup_pow_of_two(xitems) - 1 : 0}
2059a8d38dbSTakashi Iwai #define SOC_ENUM_SINGLE(xreg, xshift, xitems, xtexts) \
2069a8d38dbSTakashi Iwai 	SOC_ENUM_DOUBLE(xreg, xshift, xshift, xitems, xtexts)
2079a8d38dbSTakashi Iwai #define SOC_ENUM_SINGLE_EXT(xitems, xtexts) \
2089a8d38dbSTakashi Iwai {	.items = xitems, .texts = xtexts }
2099a8d38dbSTakashi Iwai #define SOC_VALUE_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, xitems, xtexts, xvalues) \
2102e72f8e3SPeter Ujfalusi {	.reg = xreg, .shift_l = xshift_l, .shift_r = xshift_r, \
2119a8d38dbSTakashi Iwai 	.mask = xmask, .items = xitems, .texts = xtexts, .values = xvalues}
2125967cb3dSCharles Keepax #define SOC_VALUE_ENUM_SINGLE(xreg, xshift, xmask, xitems, xtexts, xvalues) \
2135967cb3dSCharles Keepax 	SOC_VALUE_ENUM_DOUBLE(xreg, xshift, xshift, xmask, xitems, xtexts, xvalues)
214561ed680SCharles Keepax #define SOC_VALUE_ENUM_SINGLE_AUTODISABLE(xreg, xshift, xmask, xitems, xtexts, xvalues) \
215561ed680SCharles Keepax {	.reg = xreg, .shift_l = xshift, .shift_r = xshift, \
216561ed680SCharles Keepax 	.mask = xmask, .items = xitems, .texts = xtexts, \
217561ed680SCharles Keepax 	.values = xvalues, .autodisable = 1}
218b948837aSLars-Peter Clausen #define SOC_ENUM_SINGLE_VIRT(xitems, xtexts) \
219b948837aSLars-Peter Clausen 	SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, xitems, xtexts)
220808db4a4SRichard Purdie #define SOC_ENUM(xname, xenum) \
221808db4a4SRichard Purdie {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\
222808db4a4SRichard Purdie 	.info = snd_soc_info_enum_double, \
223808db4a4SRichard Purdie 	.get = snd_soc_get_enum_double, .put = snd_soc_put_enum_double, \
224808db4a4SRichard Purdie 	.private_value = (unsigned long)&xenum }
225f8ba0b7bSJon Smirl #define SOC_SINGLE_EXT(xname, xreg, xshift, xmax, xinvert,\
226808db4a4SRichard Purdie 	 xhandler_get, xhandler_put) \
227808db4a4SRichard Purdie {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
2281c433fbdSGraeme Gregory 	.info = snd_soc_info_volsw, \
229808db4a4SRichard Purdie 	.get = xhandler_get, .put = xhandler_put, \
23057295073SLars-Peter Clausen 	.private_value = SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert, 0) }
231460acbecSPeter Ujfalusi #define SOC_DOUBLE_EXT(xname, reg, shift_left, shift_right, max, invert,\
2327629ad24SDaniel Mack 	 xhandler_get, xhandler_put) \
2337629ad24SDaniel Mack {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
2347629ad24SDaniel Mack 	.info = snd_soc_info_volsw, \
2357629ad24SDaniel Mack 	.get = xhandler_get, .put = xhandler_put, \
236460acbecSPeter Ujfalusi 	.private_value = \
23757295073SLars-Peter Clausen 		SOC_DOUBLE_VALUE(reg, shift_left, shift_right, max, invert, 0) }
238c25c79b4SAdam Thomson #define SOC_DOUBLE_R_EXT(xname, reg_left, reg_right, xshift, xmax, xinvert,\
239c25c79b4SAdam Thomson 	 xhandler_get, xhandler_put) \
240c25c79b4SAdam Thomson {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
241c25c79b4SAdam Thomson 	.info = snd_soc_info_volsw, \
242c25c79b4SAdam Thomson 	.get = xhandler_get, .put = xhandler_put, \
243c25c79b4SAdam Thomson 	.private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \
244c25c79b4SAdam Thomson 					    xmax, xinvert) }
245f8ba0b7bSJon Smirl #define SOC_SINGLE_EXT_TLV(xname, xreg, xshift, xmax, xinvert,\
24610144c09SMike Montour 	 xhandler_get, xhandler_put, tlv_array) \
24710144c09SMike Montour {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
24810144c09SMike Montour 	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
24910144c09SMike Montour 		 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
25010144c09SMike Montour 	.tlv.p = (tlv_array), \
25110144c09SMike Montour 	.info = snd_soc_info_volsw, \
25210144c09SMike Montour 	.get = xhandler_get, .put = xhandler_put, \
25357295073SLars-Peter Clausen 	.private_value = SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert, 0) }
254a54e22f4SCharles Keepax #define SOC_SINGLE_RANGE_EXT_TLV(xname, xreg, xshift, xmin, xmax, xinvert, \
255a54e22f4SCharles Keepax 				 xhandler_get, xhandler_put, tlv_array) \
256a54e22f4SCharles Keepax {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
257a54e22f4SCharles Keepax 	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
258a54e22f4SCharles Keepax 		 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
259a54e22f4SCharles Keepax 	.tlv.p = (tlv_array), \
260a54e22f4SCharles Keepax 	.info = snd_soc_info_volsw_range, \
261a54e22f4SCharles Keepax 	.get = xhandler_get, .put = xhandler_put, \
262a54e22f4SCharles Keepax 	.private_value = (unsigned long)&(struct soc_mixer_control) \
263a54e22f4SCharles Keepax 		{.reg = xreg, .rreg = xreg, .shift = xshift, \
264a54e22f4SCharles Keepax 		 .rshift = xshift, .min = xmin, .max = xmax, \
265a54e22f4SCharles Keepax 		 .platform_max = xmax, .invert = xinvert} }
266d0af93dbSJoonyoung Shim #define SOC_DOUBLE_EXT_TLV(xname, xreg, shift_left, shift_right, xmax, xinvert,\
267d0af93dbSJoonyoung Shim 	 xhandler_get, xhandler_put, tlv_array) \
268d0af93dbSJoonyoung Shim {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
269d0af93dbSJoonyoung Shim 	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
270d0af93dbSJoonyoung Shim 		 SNDRV_CTL_ELEM_ACCESS_READWRITE, \
271d0af93dbSJoonyoung Shim 	.tlv.p = (tlv_array), \
272d0af93dbSJoonyoung Shim 	.info = snd_soc_info_volsw, \
273d0af93dbSJoonyoung Shim 	.get = xhandler_get, .put = xhandler_put, \
274460acbecSPeter Ujfalusi 	.private_value = SOC_DOUBLE_VALUE(xreg, shift_left, shift_right, \
27557295073SLars-Peter Clausen 					  xmax, xinvert, 0) }
2763ce91d5aSJoonyoung Shim #define SOC_DOUBLE_R_EXT_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert,\
2773ce91d5aSJoonyoung Shim 	 xhandler_get, xhandler_put, tlv_array) \
2783ce91d5aSJoonyoung Shim {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
2793ce91d5aSJoonyoung Shim 	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2803ce91d5aSJoonyoung Shim 		 SNDRV_CTL_ELEM_ACCESS_READWRITE, \
2813ce91d5aSJoonyoung Shim 	.tlv.p = (tlv_array), \
282e8f5a103SPeter Ujfalusi 	.info = snd_soc_info_volsw, \
2833ce91d5aSJoonyoung Shim 	.get = xhandler_get, .put = xhandler_put, \
284cdffa775SPeter Ujfalusi 	.private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \
285cdffa775SPeter Ujfalusi 					    xmax, xinvert) }
286808db4a4SRichard Purdie #define SOC_SINGLE_BOOL_EXT(xname, xdata, xhandler_get, xhandler_put) \
287808db4a4SRichard Purdie {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
288808db4a4SRichard Purdie 	.info = snd_soc_info_bool_ext, \
289808db4a4SRichard Purdie 	.get = xhandler_get, .put = xhandler_put, \
290808db4a4SRichard Purdie 	.private_value = xdata }
291808db4a4SRichard Purdie #define SOC_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put) \
292808db4a4SRichard Purdie {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
2939a953e6fSLars-Peter Clausen 	.info = snd_soc_info_enum_double, \
294808db4a4SRichard Purdie 	.get = xhandler_get, .put = xhandler_put, \
295808db4a4SRichard Purdie 	.private_value = (unsigned long)&xenum }
2961e4c0d7cSRichard Fitzgerald #define SOC_VALUE_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put) \
2971e4c0d7cSRichard Fitzgerald 	SOC_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put)
298808db4a4SRichard Purdie 
29971d08516SMark Brown #define SND_SOC_BYTES(xname, xbase, xregs)		      \
30071d08516SMark Brown {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,   \
30171d08516SMark Brown 	.info = snd_soc_bytes_info, .get = snd_soc_bytes_get, \
30271d08516SMark Brown 	.put = snd_soc_bytes_put, .private_value =	      \
30371d08516SMark Brown 		((unsigned long)&(struct soc_bytes)           \
30471d08516SMark Brown 		{.base = xbase, .num_regs = xregs }) }
305b6f4bb38Sapatard@mandriva.com 
306f831b055SMark Brown #define SND_SOC_BYTES_MASK(xname, xbase, xregs, xmask)	      \
307f831b055SMark Brown {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,   \
308f831b055SMark Brown 	.info = snd_soc_bytes_info, .get = snd_soc_bytes_get, \
309f831b055SMark Brown 	.put = snd_soc_bytes_put, .private_value =	      \
310f831b055SMark Brown 		((unsigned long)&(struct soc_bytes)           \
311f831b055SMark Brown 		{.base = xbase, .num_regs = xregs,	      \
312f831b055SMark Brown 		 .mask = xmask }) }
313f831b055SMark Brown 
31450a4f98dSVinod Koul /*
31550a4f98dSVinod Koul  * SND_SOC_BYTES_EXT is deprecated, please USE SND_SOC_BYTES_TLV instead
31650a4f98dSVinod Koul  */
317d9881208SVinod Koul #define SND_SOC_BYTES_EXT(xname, xcount, xhandler_get, xhandler_put) \
318d9881208SVinod Koul {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
319d9881208SVinod Koul 	.info = snd_soc_bytes_info_ext, \
320d9881208SVinod Koul 	.get = xhandler_get, .put = xhandler_put, \
321d9881208SVinod Koul 	.private_value = (unsigned long)&(struct soc_bytes_ext) \
322d9881208SVinod Koul 		{.max = xcount} }
3237523a271SOmair Mohammed Abdullah #define SND_SOC_BYTES_TLV(xname, xcount, xhandler_get, xhandler_put) \
3247523a271SOmair Mohammed Abdullah {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
3257523a271SOmair Mohammed Abdullah 	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE | \
3267523a271SOmair Mohammed Abdullah 		  SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
3277523a271SOmair Mohammed Abdullah 	.tlv.c = (snd_soc_bytes_tlv_callback), \
3284d61b39bSSubhransu S. Prusty 	.info = snd_soc_bytes_info_ext, \
3297523a271SOmair Mohammed Abdullah 	.private_value = (unsigned long)&(struct soc_bytes_ext) \
3307523a271SOmair Mohammed Abdullah 		{.max = xcount, .get = xhandler_get, .put = xhandler_put, } }
3314183eed2SKristoffer KARLSSON #define SOC_SINGLE_XR_SX(xname, xregbase, xregcount, xnbits, \
3324183eed2SKristoffer KARLSSON 		xmin, xmax, xinvert) \
3334183eed2SKristoffer KARLSSON {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
3344183eed2SKristoffer KARLSSON 	.info = snd_soc_info_xr_sx, .get = snd_soc_get_xr_sx, \
3354183eed2SKristoffer KARLSSON 	.put = snd_soc_put_xr_sx, \
3364183eed2SKristoffer KARLSSON 	.private_value = (unsigned long)&(struct soc_mreg_control) \
3374183eed2SKristoffer KARLSSON 		{.regbase = xregbase, .regcount = xregcount, .nbits = xnbits, \
3384183eed2SKristoffer KARLSSON 		.invert = xinvert, .min = xmin, .max = xmax} }
3394183eed2SKristoffer KARLSSON 
340dd7b10b3SKristoffer KARLSSON #define SOC_SINGLE_STROBE(xname, xreg, xshift, xinvert) \
341dd7b10b3SKristoffer KARLSSON 	SOC_SINGLE_EXT(xname, xreg, xshift, 1, xinvert, \
342dd7b10b3SKristoffer KARLSSON 		snd_soc_get_strobe, snd_soc_put_strobe)
343dd7b10b3SKristoffer KARLSSON 
344808db4a4SRichard Purdie /*
3456c2fb6a8SGuennadi Liakhovetski  * Simplified versions of above macros, declaring a struct and calculating
3466c2fb6a8SGuennadi Liakhovetski  * ARRAY_SIZE internally
3476c2fb6a8SGuennadi Liakhovetski  */
3486c2fb6a8SGuennadi Liakhovetski #define SOC_ENUM_DOUBLE_DECL(name, xreg, xshift_l, xshift_r, xtexts) \
3492e7e1993STakashi Iwai 	const struct soc_enum name = SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, \
3506c2fb6a8SGuennadi Liakhovetski 						ARRAY_SIZE(xtexts), xtexts)
3516c2fb6a8SGuennadi Liakhovetski #define SOC_ENUM_SINGLE_DECL(name, xreg, xshift, xtexts) \
3526c2fb6a8SGuennadi Liakhovetski 	SOC_ENUM_DOUBLE_DECL(name, xreg, xshift, xshift, xtexts)
3536c2fb6a8SGuennadi Liakhovetski #define SOC_ENUM_SINGLE_EXT_DECL(name, xtexts) \
3542e7e1993STakashi Iwai 	const struct soc_enum name = SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(xtexts), xtexts)
3556c2fb6a8SGuennadi Liakhovetski #define SOC_VALUE_ENUM_DOUBLE_DECL(name, xreg, xshift_l, xshift_r, xmask, xtexts, xvalues) \
3562e7e1993STakashi Iwai 	const struct soc_enum name = SOC_VALUE_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, \
3576c2fb6a8SGuennadi Liakhovetski 							ARRAY_SIZE(xtexts), xtexts, xvalues)
3586c2fb6a8SGuennadi Liakhovetski #define SOC_VALUE_ENUM_SINGLE_DECL(name, xreg, xshift, xmask, xtexts, xvalues) \
3596c2fb6a8SGuennadi Liakhovetski 	SOC_VALUE_ENUM_DOUBLE_DECL(name, xreg, xshift, xshift, xmask, xtexts, xvalues)
360561ed680SCharles Keepax 
361561ed680SCharles Keepax #define SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(name, xreg, xshift, xmask, xtexts, xvalues) \
362561ed680SCharles Keepax 	const struct soc_enum name = SOC_VALUE_ENUM_SINGLE_AUTODISABLE(xreg, \
363561ed680SCharles Keepax 		xshift, xmask, ARRAY_SIZE(xtexts), xtexts, xvalues)
364561ed680SCharles Keepax 
365b948837aSLars-Peter Clausen #define SOC_ENUM_SINGLE_VIRT_DECL(name, xtexts) \
366b948837aSLars-Peter Clausen 	const struct soc_enum name = SOC_ENUM_SINGLE_VIRT(ARRAY_SIZE(xtexts), xtexts)
3676c2fb6a8SGuennadi Liakhovetski 
3686c2fb6a8SGuennadi Liakhovetski /*
3690168bf0dSLiam Girdwood  * Component probe and remove ordering levels for components with runtime
3700168bf0dSLiam Girdwood  * dependencies.
3710168bf0dSLiam Girdwood  */
3720168bf0dSLiam Girdwood #define SND_SOC_COMP_ORDER_FIRST		-2
3730168bf0dSLiam Girdwood #define SND_SOC_COMP_ORDER_EARLY		-1
3740168bf0dSLiam Girdwood #define SND_SOC_COMP_ORDER_NORMAL		0
3750168bf0dSLiam Girdwood #define SND_SOC_COMP_ORDER_LATE		1
3760168bf0dSLiam Girdwood #define SND_SOC_COMP_ORDER_LAST		2
3770168bf0dSLiam Girdwood 
3780168bf0dSLiam Girdwood /*
3790be9898aSMark Brown  * Bias levels
3800be9898aSMark Brown  *
3810be9898aSMark Brown  * @ON:      Bias is fully on for audio playback and capture operations.
3820be9898aSMark Brown  * @PREPARE: Prepare for audio operations. Called before DAPM switching for
3830be9898aSMark Brown  *           stream start and stop operations.
3840be9898aSMark Brown  * @STANDBY: Low power standby state when no playback/capture operations are
3850be9898aSMark Brown  *           in progress. NOTE: The transition time between STANDBY and ON
3860be9898aSMark Brown  *           should be as fast as possible and no longer than 10ms.
3870be9898aSMark Brown  * @OFF:     Power Off. No restrictions on transition times.
3880be9898aSMark Brown  */
3890be9898aSMark Brown enum snd_soc_bias_level {
39056fba41fSMark Brown 	SND_SOC_BIAS_OFF = 0,
39156fba41fSMark Brown 	SND_SOC_BIAS_STANDBY = 1,
39256fba41fSMark Brown 	SND_SOC_BIAS_PREPARE = 2,
39356fba41fSMark Brown 	SND_SOC_BIAS_ON = 3,
3940be9898aSMark Brown };
3950be9898aSMark Brown 
3965a504963SStephen Warren struct device_node;
3978a2cd618SMark Brown struct snd_jack;
3988a2cd618SMark Brown struct snd_soc_card;
399808db4a4SRichard Purdie struct snd_soc_pcm_stream;
400808db4a4SRichard Purdie struct snd_soc_ops;
401808db4a4SRichard Purdie struct snd_soc_pcm_runtime;
4023c4b266fSLiam Girdwood struct snd_soc_dai;
403f0fba2adSLiam Girdwood struct snd_soc_dai_driver;
40412a48a8cSMark Brown struct snd_soc_platform;
405d273ebe7Sjassi brar struct snd_soc_dai_link;
406f0fba2adSLiam Girdwood struct snd_soc_platform_driver;
407808db4a4SRichard Purdie struct snd_soc_codec;
408f0fba2adSLiam Girdwood struct snd_soc_codec_driver;
409030e79f6SKuninori Morimoto struct snd_soc_component;
410030e79f6SKuninori Morimoto struct snd_soc_component_driver;
411808db4a4SRichard Purdie struct soc_enum;
4128a2cd618SMark Brown struct snd_soc_jack;
413fa9879edSVinod Koul struct snd_soc_jack_zone;
4148a2cd618SMark Brown struct snd_soc_jack_pin;
415ce6120ccSLiam Girdwood #include <sound/soc-dapm.h>
41601d7584cSLiam Girdwood #include <sound/soc-dpcm.h>
41764527e8aSMengdong Lin #include <sound/soc-topology.h>
418f0fba2adSLiam Girdwood 
419ec67624dSLopez Cruz, Misael struct snd_soc_jack_gpio;
420808db4a4SRichard Purdie 
421808db4a4SRichard Purdie typedef int (*hw_write_t)(void *,const char* ,int);
422808db4a4SRichard Purdie 
423b8c0dab9SLiam Girdwood enum snd_soc_pcm_subclass {
424b8c0dab9SLiam Girdwood 	SND_SOC_PCM_CLASS_PCM	= 0,
425b8c0dab9SLiam Girdwood 	SND_SOC_PCM_CLASS_BE	= 1,
426b8c0dab9SLiam Girdwood };
427b8c0dab9SLiam Girdwood 
42801b9d99aSLiam Girdwood enum snd_soc_card_subclass {
42901b9d99aSLiam Girdwood 	SND_SOC_CARD_CLASS_INIT		= 0,
4306874a918SLiam Girdwood 	SND_SOC_CARD_CLASS_RUNTIME	= 1,
43101b9d99aSLiam Girdwood };
43201b9d99aSLiam Girdwood 
433ec4ee52aSMark Brown int snd_soc_codec_set_sysclk(struct snd_soc_codec *codec, int clk_id,
434da1c6ea6SMark Brown 			     int source, unsigned int freq, int dir);
435ec4ee52aSMark Brown int snd_soc_codec_set_pll(struct snd_soc_codec *codec, int pll_id, int source,
436ec4ee52aSMark Brown 			  unsigned int freq_in, unsigned int freq_out);
437d7344010SBard Liao int snd_soc_codec_set_jack(struct snd_soc_codec *codec,
438d7344010SBard Liao 			   struct snd_soc_jack *jack, void *data);
439ec4ee52aSMark Brown 
44070a7ca34SVinod Koul int snd_soc_register_card(struct snd_soc_card *card);
44170a7ca34SVinod Koul int snd_soc_unregister_card(struct snd_soc_card *card);
4420e4ff5c8SMark Brown int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card);
443aae013d6SJie Yang #ifdef CONFIG_PM_SLEEP
4446f8ab4acSMark Brown int snd_soc_suspend(struct device *dev);
4456f8ab4acSMark Brown int snd_soc_resume(struct device *dev);
446aae013d6SJie Yang #else
447aae013d6SJie Yang static inline int snd_soc_suspend(struct device *dev)
448aae013d6SJie Yang {
449aae013d6SJie Yang 	return 0;
450aae013d6SJie Yang }
451aae013d6SJie Yang 
452aae013d6SJie Yang static inline int snd_soc_resume(struct device *dev)
453aae013d6SJie Yang {
454aae013d6SJie Yang 	return 0;
455aae013d6SJie Yang }
456aae013d6SJie Yang #endif
4576f8ab4acSMark Brown int snd_soc_poweroff(struct device *dev);
458f0fba2adSLiam Girdwood int snd_soc_register_platform(struct device *dev,
459d79e57dbSLars-Peter Clausen 		const struct snd_soc_platform_driver *platform_drv);
4608931bf62SPeter Ujfalusi int devm_snd_soc_register_platform(struct device *dev,
4618931bf62SPeter Ujfalusi 		const struct snd_soc_platform_driver *platform_drv);
462f0fba2adSLiam Girdwood void snd_soc_unregister_platform(struct device *dev);
46371a45cdaSLars-Peter Clausen int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform,
46471a45cdaSLars-Peter Clausen 		const struct snd_soc_platform_driver *platform_drv);
46571a45cdaSLars-Peter Clausen void snd_soc_remove_platform(struct snd_soc_platform *platform);
46671a45cdaSLars-Peter Clausen struct snd_soc_platform *snd_soc_lookup_platform(struct device *dev);
467f0fba2adSLiam Girdwood int snd_soc_register_codec(struct device *dev,
468001ae4c0SMark Brown 		const struct snd_soc_codec_driver *codec_drv,
469f0fba2adSLiam Girdwood 		struct snd_soc_dai_driver *dai_drv, int num_dai);
470f0fba2adSLiam Girdwood void snd_soc_unregister_codec(struct device *dev);
471030e79f6SKuninori Morimoto int snd_soc_register_component(struct device *dev,
472cf9e829eSKuninori Morimoto 			 const struct snd_soc_component_driver *component_driver,
473030e79f6SKuninori Morimoto 			 struct snd_soc_dai_driver *dai_drv, int num_dai);
474a0b03a61SMark Brown int devm_snd_soc_register_component(struct device *dev,
475cf9e829eSKuninori Morimoto 			 const struct snd_soc_component_driver *component_driver,
476a0b03a61SMark Brown 			 struct snd_soc_dai_driver *dai_drv, int num_dai);
477030e79f6SKuninori Morimoto void snd_soc_unregister_component(struct device *dev);
4787a30a3dbSDimitris Papastamos int snd_soc_cache_init(struct snd_soc_codec *codec);
4797a30a3dbSDimitris Papastamos int snd_soc_cache_exit(struct snd_soc_codec *codec);
480427d204cSLars-Peter Clausen 
481f1442bc1SLiam Girdwood int snd_soc_platform_read(struct snd_soc_platform *platform,
482f1442bc1SLiam Girdwood 					unsigned int reg);
483f1442bc1SLiam Girdwood int snd_soc_platform_write(struct snd_soc_platform *platform,
484f1442bc1SLiam Girdwood 					unsigned int reg, unsigned int val);
485354a2142SMark Brown int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num);
4866f0c4226SJie Yang #ifdef CONFIG_SND_SOC_COMPRESS
4876f0c4226SJie Yang int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num);
4886f0c4226SJie Yang #endif
48912a48a8cSMark Brown 
49047c88fffSLiam Girdwood struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card,
49147c88fffSLiam Girdwood 		const char *dai_link, int stream);
49247c88fffSLiam Girdwood struct snd_soc_pcm_runtime *snd_soc_get_pcm_runtime(struct snd_soc_card *card,
49347c88fffSLiam Girdwood 		const char *dai_link);
49447c88fffSLiam Girdwood 
495208a1589SLars-Peter Clausen bool snd_soc_runtime_ignore_pmdown_time(struct snd_soc_pcm_runtime *rtd);
49624894b76SLars-Peter Clausen void snd_soc_runtime_activate(struct snd_soc_pcm_runtime *rtd, int stream);
49724894b76SLars-Peter Clausen void snd_soc_runtime_deactivate(struct snd_soc_pcm_runtime *rtd, int stream);
498208a1589SLars-Peter Clausen 
499ce64c8b9SLars-Peter Clausen int snd_soc_runtime_set_dai_fmt(struct snd_soc_pcm_runtime *rtd,
500ce64c8b9SLars-Peter Clausen 	unsigned int dai_fmt);
501ce64c8b9SLars-Peter Clausen 
5021f5a4535STakashi Iwai #ifdef CONFIG_DMI
503345233d7SLiam Girdwood int snd_soc_set_dmi_name(struct snd_soc_card *card, const char *flavour);
5041f5a4535STakashi Iwai #else
5051f5a4535STakashi Iwai static inline int snd_soc_set_dmi_name(struct snd_soc_card *card,
5061f5a4535STakashi Iwai 				       const char *flavour)
5071f5a4535STakashi Iwai {
5081f5a4535STakashi Iwai 	return 0;
5091f5a4535STakashi Iwai }
5101f5a4535STakashi Iwai #endif
511345233d7SLiam Girdwood 
5127aae816dSMark Brown /* Utility functions to get clock rates from various things */
5137aae816dSMark Brown int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots);
5147aae816dSMark Brown int snd_soc_params_to_frame_size(struct snd_pcm_hw_params *params);
515c0fa59dfSMark Brown int snd_soc_calc_bclk(int fs, int sample_size, int channels, int tdm_slots);
5167aae816dSMark Brown int snd_soc_params_to_bclk(struct snd_pcm_hw_params *parms);
5177aae816dSMark Brown 
518808db4a4SRichard Purdie /* set runtime hw params */
519808db4a4SRichard Purdie int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,
520808db4a4SRichard Purdie 	const struct snd_pcm_hardware *hw);
521808db4a4SRichard Purdie 
52293e6958aSBenoit Cousson int soc_dai_hw_params(struct snd_pcm_substream *substream,
52393e6958aSBenoit Cousson 		      struct snd_pcm_hw_params *params,
52493e6958aSBenoit Cousson 		      struct snd_soc_dai *dai);
52593e6958aSBenoit Cousson 
5268a2cd618SMark Brown /* Jack reporting */
52797093996SLars-Peter Clausen int snd_soc_card_jack_new(struct snd_soc_card *card, const char *id, int type,
52897093996SLars-Peter Clausen 	struct snd_soc_jack *jack, struct snd_soc_jack_pin *pins,
52997093996SLars-Peter Clausen 	unsigned int num_pins);
53097093996SLars-Peter Clausen 
5318a2cd618SMark Brown void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask);
5328a2cd618SMark Brown int snd_soc_jack_add_pins(struct snd_soc_jack *jack, int count,
5338a2cd618SMark Brown 			  struct snd_soc_jack_pin *pins);
534d5021ec9SMark Brown void snd_soc_jack_notifier_register(struct snd_soc_jack *jack,
535d5021ec9SMark Brown 				    struct notifier_block *nb);
536d5021ec9SMark Brown void snd_soc_jack_notifier_unregister(struct snd_soc_jack *jack,
537d5021ec9SMark Brown 				      struct notifier_block *nb);
538fa9879edSVinod Koul int snd_soc_jack_add_zones(struct snd_soc_jack *jack, int count,
539fa9879edSVinod Koul 			  struct snd_soc_jack_zone *zones);
540fa9879edSVinod Koul int snd_soc_jack_get_type(struct snd_soc_jack *jack, int micbias_voltage);
541ec67624dSLopez Cruz, Misael #ifdef CONFIG_GPIOLIB
542ec67624dSLopez Cruz, Misael int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
543ec67624dSLopez Cruz, Misael 			struct snd_soc_jack_gpio *gpios);
544f025d3b9SJarkko Nikula int snd_soc_jack_add_gpiods(struct device *gpiod_dev,
545f025d3b9SJarkko Nikula 			    struct snd_soc_jack *jack,
546f025d3b9SJarkko Nikula 			    int count, struct snd_soc_jack_gpio *gpios);
547ec67624dSLopez Cruz, Misael void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count,
548ec67624dSLopez Cruz, Misael 			struct snd_soc_jack_gpio *gpios);
5498778ac6bSTakashi Iwai #else
5508778ac6bSTakashi Iwai static inline int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
5518778ac6bSTakashi Iwai 					 struct snd_soc_jack_gpio *gpios)
5528778ac6bSTakashi Iwai {
5538778ac6bSTakashi Iwai 	return 0;
5548778ac6bSTakashi Iwai }
5558778ac6bSTakashi Iwai 
556e667487bSJarkko Nikula static inline int snd_soc_jack_add_gpiods(struct device *gpiod_dev,
557f025d3b9SJarkko Nikula 					  struct snd_soc_jack *jack,
558e667487bSJarkko Nikula 					  int count,
559e667487bSJarkko Nikula 					  struct snd_soc_jack_gpio *gpios)
560f025d3b9SJarkko Nikula {
561f025d3b9SJarkko Nikula 	return 0;
562f025d3b9SJarkko Nikula }
563f025d3b9SJarkko Nikula 
5648778ac6bSTakashi Iwai static inline void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count,
5658778ac6bSTakashi Iwai 					   struct snd_soc_jack_gpio *gpios)
5668778ac6bSTakashi Iwai {
5678778ac6bSTakashi Iwai }
568ec67624dSLopez Cruz, Misael #endif
5698a2cd618SMark Brown 
570808db4a4SRichard Purdie /* codec register bit access */
5711a39019eSBard Liao int snd_soc_update_bits(struct snd_soc_codec *codec, unsigned int reg,
57246f5822fSDaniel Ribeiro 				unsigned int mask, unsigned int value);
573dd1b3d53SMark Brown int snd_soc_update_bits_locked(struct snd_soc_codec *codec,
5741a39019eSBard Liao 			       unsigned int reg, unsigned int mask,
575dd1b3d53SMark Brown 			       unsigned int value);
5761a39019eSBard Liao int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned int reg,
57746f5822fSDaniel Ribeiro 				unsigned int mask, unsigned int value);
578808db4a4SRichard Purdie 
579336b8423SLars-Peter Clausen #ifdef CONFIG_SND_SOC_AC97_BUS
58047e03941SLars-Peter Clausen struct snd_ac97 *snd_soc_alloc_ac97_codec(struct snd_soc_codec *codec);
5817361fbeaSLars-Peter Clausen struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec,
5827361fbeaSLars-Peter Clausen 	unsigned int id, unsigned int id_mask);
583358a8bb5SLars-Peter Clausen void snd_soc_free_ac97_codec(struct snd_ac97 *ac97);
584808db4a4SRichard Purdie 
585b047e1ccSMark Brown int snd_soc_set_ac97_ops(struct snd_ac97_bus_ops *ops);
586741a509fSMarkus Pargmann int snd_soc_set_ac97_ops_of_reset(struct snd_ac97_bus_ops *ops,
587741a509fSMarkus Pargmann 		struct platform_device *pdev);
588b047e1ccSMark Brown 
589336b8423SLars-Peter Clausen extern struct snd_ac97_bus_ops *soc_ac97_ops;
590336b8423SLars-Peter Clausen #else
591336b8423SLars-Peter Clausen static inline int snd_soc_set_ac97_ops_of_reset(struct snd_ac97_bus_ops *ops,
592336b8423SLars-Peter Clausen 	struct platform_device *pdev)
593336b8423SLars-Peter Clausen {
594336b8423SLars-Peter Clausen 	return 0;
595336b8423SLars-Peter Clausen }
596336b8423SLars-Peter Clausen 
597336b8423SLars-Peter Clausen static inline int snd_soc_set_ac97_ops(struct snd_ac97_bus_ops *ops)
598336b8423SLars-Peter Clausen {
599336b8423SLars-Peter Clausen 	return 0;
600336b8423SLars-Peter Clausen }
601336b8423SLars-Peter Clausen #endif
602336b8423SLars-Peter Clausen 
603808db4a4SRichard Purdie /*
604808db4a4SRichard Purdie  *Controls
605808db4a4SRichard Purdie  */
606808db4a4SRichard Purdie struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template,
6073056557fSMark Brown 				  void *data, const char *long_name,
608efb7ac3fSMark Brown 				  const char *prefix);
6094fefd698SDimitris Papastamos struct snd_kcontrol *snd_soc_card_get_kcontrol(struct snd_soc_card *soc_card,
6104fefd698SDimitris Papastamos 					       const char *name);
6110f2780adSLars-Peter Clausen int snd_soc_add_component_controls(struct snd_soc_component *component,
6120f2780adSLars-Peter Clausen 	const struct snd_kcontrol_new *controls, unsigned int num_controls);
613022658beSLiam Girdwood int snd_soc_add_codec_controls(struct snd_soc_codec *codec,
6140f2780adSLars-Peter Clausen 	const struct snd_kcontrol_new *controls, unsigned int num_controls);
615a491a5c8SLiam Girdwood int snd_soc_add_platform_controls(struct snd_soc_platform *platform,
6160f2780adSLars-Peter Clausen 	const struct snd_kcontrol_new *controls, unsigned int num_controls);
617022658beSLiam Girdwood int snd_soc_add_card_controls(struct snd_soc_card *soc_card,
618022658beSLiam Girdwood 	const struct snd_kcontrol_new *controls, int num_controls);
619022658beSLiam Girdwood int snd_soc_add_dai_controls(struct snd_soc_dai *dai,
620022658beSLiam Girdwood 	const struct snd_kcontrol_new *controls, int num_controls);
621808db4a4SRichard Purdie int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol,
622808db4a4SRichard Purdie 	struct snd_ctl_elem_info *uinfo);
623808db4a4SRichard Purdie int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol,
624808db4a4SRichard Purdie 	struct snd_ctl_elem_value *ucontrol);
625808db4a4SRichard Purdie int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
626808db4a4SRichard Purdie 	struct snd_ctl_elem_value *ucontrol);
627808db4a4SRichard Purdie int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
628808db4a4SRichard Purdie 	struct snd_ctl_elem_info *uinfo);
62934198710SCharles Keepax int snd_soc_info_volsw_sx(struct snd_kcontrol *kcontrol,
63034198710SCharles Keepax 			  struct snd_ctl_elem_info *uinfo);
631392abe9cSPhilipp Zabel #define snd_soc_info_bool_ext		snd_ctl_boolean_mono_info
632808db4a4SRichard Purdie int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
633808db4a4SRichard Purdie 	struct snd_ctl_elem_value *ucontrol);
634808db4a4SRichard Purdie int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
635808db4a4SRichard Purdie 	struct snd_ctl_elem_value *ucontrol);
636a92f1394SPeter Ujfalusi #define snd_soc_get_volsw_2r snd_soc_get_volsw
637a92f1394SPeter Ujfalusi #define snd_soc_put_volsw_2r snd_soc_put_volsw
6381d99f243SBrian Austin int snd_soc_get_volsw_sx(struct snd_kcontrol *kcontrol,
6391d99f243SBrian Austin 	struct snd_ctl_elem_value *ucontrol);
6401d99f243SBrian Austin int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
6411d99f243SBrian Austin 	struct snd_ctl_elem_value *ucontrol);
6426c9d8cf6SAdam Thomson int snd_soc_info_volsw_range(struct snd_kcontrol *kcontrol,
6436c9d8cf6SAdam Thomson 	struct snd_ctl_elem_info *uinfo);
6446c9d8cf6SAdam Thomson int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
6456c9d8cf6SAdam Thomson 	struct snd_ctl_elem_value *ucontrol);
6466c9d8cf6SAdam Thomson int snd_soc_get_volsw_range(struct snd_kcontrol *kcontrol,
6476c9d8cf6SAdam Thomson 	struct snd_ctl_elem_value *ucontrol);
64826d9ca34SLars-Peter Clausen int snd_soc_limit_volume(struct snd_soc_card *card,
649637d3847SPeter Ujfalusi 	const char *name, int max);
65071d08516SMark Brown int snd_soc_bytes_info(struct snd_kcontrol *kcontrol,
65171d08516SMark Brown 		       struct snd_ctl_elem_info *uinfo);
65271d08516SMark Brown int snd_soc_bytes_get(struct snd_kcontrol *kcontrol,
65371d08516SMark Brown 		      struct snd_ctl_elem_value *ucontrol);
65471d08516SMark Brown int snd_soc_bytes_put(struct snd_kcontrol *kcontrol,
65571d08516SMark Brown 		      struct snd_ctl_elem_value *ucontrol);
656d9881208SVinod Koul int snd_soc_bytes_info_ext(struct snd_kcontrol *kcontrol,
657d9881208SVinod Koul 	struct snd_ctl_elem_info *ucontrol);
6587523a271SOmair Mohammed Abdullah int snd_soc_bytes_tlv_callback(struct snd_kcontrol *kcontrol, int op_flag,
6597523a271SOmair Mohammed Abdullah 	unsigned int size, unsigned int __user *tlv);
6604183eed2SKristoffer KARLSSON int snd_soc_info_xr_sx(struct snd_kcontrol *kcontrol,
6614183eed2SKristoffer KARLSSON 	struct snd_ctl_elem_info *uinfo);
6624183eed2SKristoffer KARLSSON int snd_soc_get_xr_sx(struct snd_kcontrol *kcontrol,
6634183eed2SKristoffer KARLSSON 	struct snd_ctl_elem_value *ucontrol);
6644183eed2SKristoffer KARLSSON int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol,
6654183eed2SKristoffer KARLSSON 	struct snd_ctl_elem_value *ucontrol);
666dd7b10b3SKristoffer KARLSSON int snd_soc_get_strobe(struct snd_kcontrol *kcontrol,
667dd7b10b3SKristoffer KARLSSON 	struct snd_ctl_elem_value *ucontrol);
668dd7b10b3SKristoffer KARLSSON int snd_soc_put_strobe(struct snd_kcontrol *kcontrol,
669dd7b10b3SKristoffer KARLSSON 	struct snd_ctl_elem_value *ucontrol);
670808db4a4SRichard Purdie 
6718a2cd618SMark Brown /**
6728a2cd618SMark Brown  * struct snd_soc_jack_pin - Describes a pin to update based on jack detection
6738a2cd618SMark Brown  *
6748a2cd618SMark Brown  * @pin:    name of the pin to update
6758a2cd618SMark Brown  * @mask:   bits to check for in reported jack status
6768a2cd618SMark Brown  * @invert: if non-zero then pin is enabled when status is not reported
677628536eaSJonathan Corbet  * @list:   internal list entry
6788a2cd618SMark Brown  */
6798a2cd618SMark Brown struct snd_soc_jack_pin {
6808a2cd618SMark Brown 	struct list_head list;
6818a2cd618SMark Brown 	const char *pin;
6828a2cd618SMark Brown 	int mask;
6838a2cd618SMark Brown 	bool invert;
6848a2cd618SMark Brown };
6858a2cd618SMark Brown 
686ec67624dSLopez Cruz, Misael /**
687fa9879edSVinod Koul  * struct snd_soc_jack_zone - Describes voltage zones of jack detection
688fa9879edSVinod Koul  *
689fa9879edSVinod Koul  * @min_mv: start voltage in mv
690fa9879edSVinod Koul  * @max_mv: end voltage in mv
691fa9879edSVinod Koul  * @jack_type: type of jack that is expected for this voltage
692fa9879edSVinod Koul  * @debounce_time: debounce_time for jack, codec driver should wait for this
693fa9879edSVinod Koul  *		duration before reading the adc for voltages
694628536eaSJonathan Corbet  * @list:   internal list entry
695fa9879edSVinod Koul  */
696fa9879edSVinod Koul struct snd_soc_jack_zone {
697fa9879edSVinod Koul 	unsigned int min_mv;
698fa9879edSVinod Koul 	unsigned int max_mv;
699fa9879edSVinod Koul 	unsigned int jack_type;
700fa9879edSVinod Koul 	unsigned int debounce_time;
701fa9879edSVinod Koul 	struct list_head list;
702fa9879edSVinod Koul };
703fa9879edSVinod Koul 
704fa9879edSVinod Koul /**
705ec67624dSLopez Cruz, Misael  * struct snd_soc_jack_gpio - Describes a gpio pin for jack detection
706ec67624dSLopez Cruz, Misael  *
707f025d3b9SJarkko Nikula  * @gpio:         legacy gpio number
70883ad152dSJarkko Nikula  * @idx:          gpio descriptor index within the function of the GPIO
70983ad152dSJarkko Nikula  *                consumer device
710628536eaSJonathan Corbet  * @gpiod_dev:    GPIO consumer device
71183ad152dSJarkko Nikula  * @name:         gpio name. Also as connection ID for the GPIO consumer
71283ad152dSJarkko Nikula  *                device function name lookup
713ec67624dSLopez Cruz, Misael  * @report:       value to report when jack detected
714ec67624dSLopez Cruz, Misael  * @invert:       report presence in low state
715628536eaSJonathan Corbet  * @debounce_time: debounce time in ms
7167887ab3aSMark Brown  * @wake:	  enable as wake source
717fadddc87SMark Brown  * @jack_status_check: callback function which overrides the detection
718fadddc87SMark Brown  *		       to provide more complex checks (eg, reading an
719fadddc87SMark Brown  *		       ADC).
720ec67624dSLopez Cruz, Misael  */
721ec67624dSLopez Cruz, Misael struct snd_soc_jack_gpio {
722ec67624dSLopez Cruz, Misael 	unsigned int gpio;
723f025d3b9SJarkko Nikula 	unsigned int idx;
724f025d3b9SJarkko Nikula 	struct device *gpiod_dev;
725ec67624dSLopez Cruz, Misael 	const char *name;
726ec67624dSLopez Cruz, Misael 	int report;
727ec67624dSLopez Cruz, Misael 	int invert;
728ec67624dSLopez Cruz, Misael 	int debounce_time;
7297887ab3aSMark Brown 	bool wake;
7307887ab3aSMark Brown 
731628536eaSJonathan Corbet 	/* private: */
732ec67624dSLopez Cruz, Misael 	struct snd_soc_jack *jack;
7334c14d78eSMark Brown 	struct delayed_work work;
73473548dd3SDmitry Torokhov 	struct notifier_block pm_notifier;
73550dfb69dSJarkko Nikula 	struct gpio_desc *desc;
736c871a053SJoonyoung Shim 
737cb29d7b9Sxiangxiao 	void *data;
738628536eaSJonathan Corbet 	/* public: */
739cb29d7b9Sxiangxiao 	int (*jack_status_check)(void *data);
740ec67624dSLopez Cruz, Misael };
741ec67624dSLopez Cruz, Misael 
7428a2cd618SMark Brown struct snd_soc_jack {
7432667b4b8SMark Brown 	struct mutex mutex;
7448a2cd618SMark Brown 	struct snd_jack *jack;
74597093996SLars-Peter Clausen 	struct snd_soc_card *card;
7468a2cd618SMark Brown 	struct list_head pins;
7478a2cd618SMark Brown 	int status;
748d5021ec9SMark Brown 	struct blocking_notifier_head notifier;
749fa9879edSVinod Koul 	struct list_head jack_zones;
7508a2cd618SMark Brown };
7518a2cd618SMark Brown 
752808db4a4SRichard Purdie /* SoC PCM stream information */
753808db4a4SRichard Purdie struct snd_soc_pcm_stream {
754f0fba2adSLiam Girdwood 	const char *stream_name;
7551c433fbdSGraeme Gregory 	u64 formats;			/* SNDRV_PCM_FMTBIT_* */
7561c433fbdSGraeme Gregory 	unsigned int rates;		/* SNDRV_PCM_RATE_* */
757808db4a4SRichard Purdie 	unsigned int rate_min;		/* min rate */
758808db4a4SRichard Purdie 	unsigned int rate_max;		/* max rate */
759808db4a4SRichard Purdie 	unsigned int channels_min;	/* min channels */
760808db4a4SRichard Purdie 	unsigned int channels_max;	/* max channels */
76158ba9b25SMark Brown 	unsigned int sig_bits;		/* number of bits of content */
762808db4a4SRichard Purdie };
763808db4a4SRichard Purdie 
764808db4a4SRichard Purdie /* SoC audio ops */
765808db4a4SRichard Purdie struct snd_soc_ops {
766808db4a4SRichard Purdie 	int (*startup)(struct snd_pcm_substream *);
767808db4a4SRichard Purdie 	void (*shutdown)(struct snd_pcm_substream *);
768808db4a4SRichard Purdie 	int (*hw_params)(struct snd_pcm_substream *, struct snd_pcm_hw_params *);
769808db4a4SRichard Purdie 	int (*hw_free)(struct snd_pcm_substream *);
770808db4a4SRichard Purdie 	int (*prepare)(struct snd_pcm_substream *);
771808db4a4SRichard Purdie 	int (*trigger)(struct snd_pcm_substream *, int);
772808db4a4SRichard Purdie };
773808db4a4SRichard Purdie 
77449681077SVinod Koul struct snd_soc_compr_ops {
77549681077SVinod Koul 	int (*startup)(struct snd_compr_stream *);
77649681077SVinod Koul 	void (*shutdown)(struct snd_compr_stream *);
77749681077SVinod Koul 	int (*set_params)(struct snd_compr_stream *);
77849681077SVinod Koul 	int (*trigger)(struct snd_compr_stream *);
77949681077SVinod Koul };
78049681077SVinod Koul 
781d191bd8dSKuninori Morimoto /* component interface */
782d191bd8dSKuninori Morimoto struct snd_soc_component_driver {
783d191bd8dSKuninori Morimoto 	const char *name;
784cb470087SKuninori Morimoto 
78561aca564SLars-Peter Clausen 	/* Default control and setup, added after probe() is run */
78661aca564SLars-Peter Clausen 	const struct snd_kcontrol_new *controls;
78761aca564SLars-Peter Clausen 	unsigned int num_controls;
78861aca564SLars-Peter Clausen 	const struct snd_soc_dapm_widget *dapm_widgets;
78961aca564SLars-Peter Clausen 	unsigned int num_dapm_widgets;
79061aca564SLars-Peter Clausen 	const struct snd_soc_dapm_route *dapm_routes;
79161aca564SLars-Peter Clausen 	unsigned int num_dapm_routes;
79261aca564SLars-Peter Clausen 
79361aca564SLars-Peter Clausen 	int (*probe)(struct snd_soc_component *);
79461aca564SLars-Peter Clausen 	void (*remove)(struct snd_soc_component *);
7959178feb4SKuninori Morimoto 	int (*suspend)(struct snd_soc_component *);
7969178feb4SKuninori Morimoto 	int (*resume)(struct snd_soc_component *);
79761aca564SLars-Peter Clausen 
79871ccef0dSKuninori Morimoto 	/* component wide operations */
79971ccef0dSKuninori Morimoto 	int (*set_sysclk)(struct snd_soc_component *component,
80071ccef0dSKuninori Morimoto 			  int clk_id, int source, unsigned int freq, int dir);
801ef641e5dSKuninori Morimoto 	int (*set_pll)(struct snd_soc_component *component, int pll_id,
802ef641e5dSKuninori Morimoto 		       int source, unsigned int freq_in, unsigned int freq_out);
80344c07365SKuninori Morimoto 	int (*set_jack)(struct snd_soc_component *component,
80444c07365SKuninori Morimoto 			struct snd_soc_jack *jack,  void *data);
80571ccef0dSKuninori Morimoto 
806cb470087SKuninori Morimoto 	/* DT */
807cb470087SKuninori Morimoto 	int (*of_xlate_dai_name)(struct snd_soc_component *component,
808cb470087SKuninori Morimoto 				 struct of_phandle_args *args,
809cb470087SKuninori Morimoto 				 const char **dai_name);
810a180e8b9SKuninori Morimoto 	int (*of_xlate_dai_id)(struct snd_soc_component *comment,
811a180e8b9SKuninori Morimoto 			       struct device_node *endpoint);
81214e8bdebSLars-Peter Clausen 	void (*seq_notifier)(struct snd_soc_component *, enum snd_soc_dapm_type,
81314e8bdebSLars-Peter Clausen 		int subseq);
81414e8bdebSLars-Peter Clausen 	int (*stream_event)(struct snd_soc_component *, int event);
815f1d45cc3SLars-Peter Clausen 
816f1d45cc3SLars-Peter Clausen 	/* probe ordering - for components with runtime dependencies */
817f1d45cc3SLars-Peter Clausen 	int probe_order;
818f1d45cc3SLars-Peter Clausen 	int remove_order;
819d191bd8dSKuninori Morimoto };
820d191bd8dSKuninori Morimoto 
821d191bd8dSKuninori Morimoto struct snd_soc_component {
822d191bd8dSKuninori Morimoto 	const char *name;
823d191bd8dSKuninori Morimoto 	int id;
82494f99c87SLars-Peter Clausen 	const char *name_prefix;
825d191bd8dSKuninori Morimoto 	struct device *dev;
82600200107SLars-Peter Clausen 	struct snd_soc_card *card;
827cdde4ccbSLars-Peter Clausen 
828cdde4ccbSLars-Peter Clausen 	unsigned int active;
829cdde4ccbSLars-Peter Clausen 
8303d59400fSLars-Peter Clausen 	unsigned int ignore_pmdown_time:1; /* pmdown_time is ignored at stop */
83198e639fbSLars-Peter Clausen 	unsigned int registered_as_component:1;
8329178feb4SKuninori Morimoto 	unsigned int suspended:1; /* is in suspend PM state */
8333d59400fSLars-Peter Clausen 
834d191bd8dSKuninori Morimoto 	struct list_head list;
835d2e3a135SSylwester Nawrocki 	struct list_head card_aux_list; /* for auxiliary bound components */
836d9fc4063SKuninori Morimoto 	struct list_head card_list;
837d191bd8dSKuninori Morimoto 
8386833c452SKuninori Morimoto 	struct snd_soc_dai_driver *dai_drv;
8396833c452SKuninori Morimoto 	int num_dai;
8406833c452SKuninori Morimoto 
841d191bd8dSKuninori Morimoto 	const struct snd_soc_component_driver *driver;
8421438c2f6SLars-Peter Clausen 
8431438c2f6SLars-Peter Clausen 	struct list_head dai_list;
844e2c330b9SLars-Peter Clausen 
845e2c330b9SLars-Peter Clausen 	int (*read)(struct snd_soc_component *, unsigned int, unsigned int *);
846e2c330b9SLars-Peter Clausen 	int (*write)(struct snd_soc_component *, unsigned int, unsigned int);
847e2c330b9SLars-Peter Clausen 
848e2c330b9SLars-Peter Clausen 	struct regmap *regmap;
849e2c330b9SLars-Peter Clausen 	int val_bytes;
850e2c330b9SLars-Peter Clausen 
851e2c330b9SLars-Peter Clausen 	struct mutex io_mutex;
852ce0fc93aSLars-Peter Clausen 
8538a978234SLiam Girdwood 	/* attached dynamic objects */
8548a978234SLiam Girdwood 	struct list_head dobj_list;
8558a978234SLiam Girdwood 
85681c7cfd1SLars-Peter Clausen #ifdef CONFIG_DEBUG_FS
85781c7cfd1SLars-Peter Clausen 	struct dentry *debugfs_root;
85881c7cfd1SLars-Peter Clausen #endif
85981c7cfd1SLars-Peter Clausen 
86081c7cfd1SLars-Peter Clausen 	/*
86181c7cfd1SLars-Peter Clausen 	* DO NOT use any of the fields below in drivers, they are temporary and
86281c7cfd1SLars-Peter Clausen 	* are going to be removed again soon. If you use them in driver code the
86381c7cfd1SLars-Peter Clausen 	* driver will be marked as BROKEN when these fields are removed.
86481c7cfd1SLars-Peter Clausen 	*/
86581c7cfd1SLars-Peter Clausen 
866ce0fc93aSLars-Peter Clausen 	/* Don't use these, use snd_soc_component_get_dapm() */
867ce0fc93aSLars-Peter Clausen 	struct snd_soc_dapm_context dapm;
86881c7cfd1SLars-Peter Clausen 
869f1d45cc3SLars-Peter Clausen 	struct snd_soc_codec *codec;
870f1d45cc3SLars-Peter Clausen 
871f1d45cc3SLars-Peter Clausen 	int (*probe)(struct snd_soc_component *);
872f1d45cc3SLars-Peter Clausen 	void (*remove)(struct snd_soc_component *);
8739178feb4SKuninori Morimoto 	int (*suspend)(struct snd_soc_component *);
8749178feb4SKuninori Morimoto 	int (*resume)(struct snd_soc_component *);
875f1d45cc3SLars-Peter Clausen 
87671ccef0dSKuninori Morimoto 	int (*set_sysclk)(struct snd_soc_component *component,
87771ccef0dSKuninori Morimoto 			  int clk_id, int source, unsigned int freq, int dir);
878ef641e5dSKuninori Morimoto 	int (*set_pll)(struct snd_soc_component *component, int pll_id,
879ef641e5dSKuninori Morimoto 		       int source, unsigned int freq_in, unsigned int freq_out);
88044c07365SKuninori Morimoto 	int (*set_jack)(struct snd_soc_component *component,
88144c07365SKuninori Morimoto 			struct snd_soc_jack *jack,  void *data);
88271ccef0dSKuninori Morimoto 
883f2ed6b07SMengdong Lin 	/* machine specific init */
884f2ed6b07SMengdong Lin 	int (*init)(struct snd_soc_component *component);
885f2ed6b07SMengdong Lin 
88681c7cfd1SLars-Peter Clausen #ifdef CONFIG_DEBUG_FS
88781c7cfd1SLars-Peter Clausen 	void (*init_debugfs)(struct snd_soc_component *component);
88881c7cfd1SLars-Peter Clausen 	const char *debugfs_prefix;
88981c7cfd1SLars-Peter Clausen #endif
890d191bd8dSKuninori Morimoto };
891d191bd8dSKuninori Morimoto 
892a0ac4411SKuninori Morimoto struct snd_soc_rtdcom_list {
893a0ac4411SKuninori Morimoto 	struct snd_soc_component *component;
894a0ac4411SKuninori Morimoto 	struct list_head list; /* rtd::component_list */
895a0ac4411SKuninori Morimoto };
896a0ac4411SKuninori Morimoto struct snd_soc_component*
897a0ac4411SKuninori Morimoto snd_soc_rtdcom_lookup(struct snd_soc_pcm_runtime *rtd,
898a0ac4411SKuninori Morimoto 		       const char *driver_name);
899a0ac4411SKuninori Morimoto #define for_each_rtdcom(rtd, rtdcom) \
900a0ac4411SKuninori Morimoto 	list_for_each_entry(rtdcom, &(rtd)->component_list, list)
901a0ac4411SKuninori Morimoto #define for_each_rtdcom_safe(rtd, rtdcom1, rtdcom2) \
902a0ac4411SKuninori Morimoto 	list_for_each_entry_safe(rtdcom1, rtdcom2, &(rtd)->component_list, list)
903a0ac4411SKuninori Morimoto 
904f0fba2adSLiam Girdwood /* SoC Audio Codec device */
905808db4a4SRichard Purdie struct snd_soc_codec {
9060d0cf00aSMark Brown 	struct device *dev;
907001ae4c0SMark Brown 	const struct snd_soc_codec_driver *driver;
9080d0cf00aSMark Brown 
9090d0cf00aSMark Brown 	struct list_head list;
910808db4a4SRichard Purdie 
911808db4a4SRichard Purdie 	/* runtime */
912fdf0f54dSDimitris Papastamos 	unsigned int cache_init:1; /* codec cache has been initialized */
913f0fba2adSLiam Girdwood 
914f0fba2adSLiam Girdwood 	/* codec IO */
915f0fba2adSLiam Girdwood 	void *control_data; /* codec control (i2c/3wire) data */
916f0fba2adSLiam Girdwood 	hw_write_t hw_write;
917f0fba2adSLiam Girdwood 	void *reg_cache;
918a96ca338SMark Brown 
919d191bd8dSKuninori Morimoto 	/* component */
920d191bd8dSKuninori Morimoto 	struct snd_soc_component component;
921808db4a4SRichard Purdie };
922808db4a4SRichard Purdie 
923f0fba2adSLiam Girdwood /* codec driver */
924f0fba2adSLiam Girdwood struct snd_soc_codec_driver {
925f0fba2adSLiam Girdwood 
926f0fba2adSLiam Girdwood 	/* driver ops */
927f0fba2adSLiam Girdwood 	int (*probe)(struct snd_soc_codec *);
928f0fba2adSLiam Girdwood 	int (*remove)(struct snd_soc_codec *);
92984b315eeSLars-Peter Clausen 	int (*suspend)(struct snd_soc_codec *);
930f0fba2adSLiam Girdwood 	int (*resume)(struct snd_soc_codec *);
931d191bd8dSKuninori Morimoto 	struct snd_soc_component_driver component_driver;
932f0fba2adSLiam Girdwood 
933ec4ee52aSMark Brown 	/* codec wide operations */
934ec4ee52aSMark Brown 	int (*set_sysclk)(struct snd_soc_codec *codec,
935da1c6ea6SMark Brown 			  int clk_id, int source, unsigned int freq, int dir);
936ec4ee52aSMark Brown 	int (*set_pll)(struct snd_soc_codec *codec, int pll_id, int source,
937ec4ee52aSMark Brown 		unsigned int freq_in, unsigned int freq_out);
938d7344010SBard Liao 	int (*set_jack)(struct snd_soc_codec *codec,
939d7344010SBard Liao 			struct snd_soc_jack *jack,  void *data);
940ec4ee52aSMark Brown 
941f0fba2adSLiam Girdwood 	/* codec IO */
942a39f75f7SXiubo Li 	struct regmap *(*get_regmap)(struct device *);
943f0fba2adSLiam Girdwood 	unsigned int (*read)(struct snd_soc_codec *, unsigned int);
944f0fba2adSLiam Girdwood 	int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
9454a8923baSMark Brown 	unsigned int reg_cache_size;
946f0fba2adSLiam Girdwood 	short reg_cache_step;
947f0fba2adSLiam Girdwood 	short reg_word_size;
948f0fba2adSLiam Girdwood 	const void *reg_cache_default;
949f0fba2adSLiam Girdwood 
950f0fba2adSLiam Girdwood 	/* codec bias level */
951f0fba2adSLiam Girdwood 	int (*set_bias_level)(struct snd_soc_codec *,
952f0fba2adSLiam Girdwood 			      enum snd_soc_bias_level level);
95333c5f969SMark Brown 	bool idle_bias_off;
95486dbf2acSLars-Peter Clausen 	bool suspend_bias_off;
955474b62d6SMark Brown 
956474b62d6SMark Brown 	void (*seq_notifier)(struct snd_soc_dapm_context *,
957f85a9e0dSMark Brown 			     enum snd_soc_dapm_type, int);
9580168bf0dSLiam Girdwood 
9595124e69eSMark Brown 	bool ignore_pmdown_time;  /* Doesn't benefit from pmdown delay */
960808db4a4SRichard Purdie };
961808db4a4SRichard Purdie 
962808db4a4SRichard Purdie /* SoC platform interface */
963f0fba2adSLiam Girdwood struct snd_soc_platform_driver {
964808db4a4SRichard Purdie 
965f0fba2adSLiam Girdwood 	int (*probe)(struct snd_soc_platform *);
966f0fba2adSLiam Girdwood 	int (*remove)(struct snd_soc_platform *);
967b37f1d12SLars-Peter Clausen 	struct snd_soc_component_driver component_driver;
968808db4a4SRichard Purdie 
969808db4a4SRichard Purdie 	/* pcm creation and destruction */
970552d1ef6SLiam Girdwood 	int (*pcm_new)(struct snd_soc_pcm_runtime *);
971808db4a4SRichard Purdie 	void (*pcm_free)(struct snd_pcm *);
972808db4a4SRichard Purdie 
97349681077SVinod Koul 	/* platform stream pcm ops */
9741f03f55bSLars-Peter Clausen 	const struct snd_pcm_ops *ops;
9750168bf0dSLiam Girdwood 
97649681077SVinod Koul 	/* platform stream compress ops */
977ef03c9aeSLars-Peter Clausen 	const struct snd_compr_ops *compr_ops;
978808db4a4SRichard Purdie };
979808db4a4SRichard Purdie 
98088bd870fSBenoit Cousson struct snd_soc_dai_link_component {
98188bd870fSBenoit Cousson 	const char *name;
982c362effeSJean-Francois Moine 	struct device_node *of_node;
98388bd870fSBenoit Cousson 	const char *dai_name;
98488bd870fSBenoit Cousson };
98588bd870fSBenoit Cousson 
986f0fba2adSLiam Girdwood struct snd_soc_platform {
987f0fba2adSLiam Girdwood 	struct device *dev;
988d79e57dbSLars-Peter Clausen 	const struct snd_soc_platform_driver *driver;
989f0fba2adSLiam Girdwood 
990f0fba2adSLiam Girdwood 	struct list_head list;
991b7950641SLiam Girdwood 
992b37f1d12SLars-Peter Clausen 	struct snd_soc_component component;
993f0fba2adSLiam Girdwood };
994f0fba2adSLiam Girdwood 
995808db4a4SRichard Purdie struct snd_soc_dai_link {
996f0fba2adSLiam Girdwood 	/* config - must be set by machine driver */
997f0fba2adSLiam Girdwood 	const char *name;			/* Codec name */
998f0fba2adSLiam Girdwood 	const char *stream_name;		/* Stream name */
999bc92657aSStephen Warren 	/*
1000bc92657aSStephen Warren 	 * You MAY specify the link's CPU-side device, either by device name,
1001bc92657aSStephen Warren 	 * or by DT/OF node, but not both. If this information is omitted,
1002bc92657aSStephen Warren 	 * the CPU-side DAI is matched using .cpu_dai_name only, which hence
1003bc92657aSStephen Warren 	 * must be globally unique. These fields are currently typically used
1004bc92657aSStephen Warren 	 * only for codec to codec links, or systems using device tree.
1005bc92657aSStephen Warren 	 */
1006bc92657aSStephen Warren 	const char *cpu_name;
10078ad9f9efSSylwester Nawrocki 	struct device_node *cpu_of_node;
1008bc92657aSStephen Warren 	/*
1009bc92657aSStephen Warren 	 * You MAY specify the DAI name of the CPU DAI. If this information is
1010bc92657aSStephen Warren 	 * omitted, the CPU-side DAI is matched using .cpu_name/.cpu_of_node
1011bc92657aSStephen Warren 	 * only, which only works well when that device exposes a single DAI.
1012bc92657aSStephen Warren 	 */
1013f0fba2adSLiam Girdwood 	const char *cpu_dai_name;
1014bc92657aSStephen Warren 	/*
1015bc92657aSStephen Warren 	 * You MUST specify the link's codec, either by device name, or by
1016bc92657aSStephen Warren 	 * DT/OF node, but not both.
1017bc92657aSStephen Warren 	 */
1018bc92657aSStephen Warren 	const char *codec_name;
10198ad9f9efSSylwester Nawrocki 	struct device_node *codec_of_node;
1020bc92657aSStephen Warren 	/* You MUST specify the DAI name within the codec */
1021f0fba2adSLiam Girdwood 	const char *codec_dai_name;
102288bd870fSBenoit Cousson 
102388bd870fSBenoit Cousson 	struct snd_soc_dai_link_component *codecs;
102488bd870fSBenoit Cousson 	unsigned int num_codecs;
102588bd870fSBenoit Cousson 
1026bc92657aSStephen Warren 	/*
1027bc92657aSStephen Warren 	 * You MAY specify the link's platform/PCM/DMA driver, either by
1028bc92657aSStephen Warren 	 * device name, or by DT/OF node, but not both. Some forms of link
1029bc92657aSStephen Warren 	 * do not need a platform.
1030bc92657aSStephen Warren 	 */
1031bc92657aSStephen Warren 	const char *platform_name;
10328ad9f9efSSylwester Nawrocki 	struct device_node *platform_of_node;
10332f0ad491SMengdong Lin 	int id;	/* optional ID for machine driver link identification */
10344ccab3e7SLiam Girdwood 
1035c74184edSMark Brown 	const struct snd_soc_pcm_stream *params;
1036c6615082SNikesh Oswal 	unsigned int num_params;
1037c74184edSMark Brown 
103875d9ac46SMark Brown 	unsigned int dai_fmt;           /* format to set on init */
103975d9ac46SMark Brown 
104001d7584cSLiam Girdwood 	enum snd_soc_dpcm_trigger trigger[2]; /* trigger type for DPCM */
104101d7584cSLiam Girdwood 
1042f0fba2adSLiam Girdwood 	/* codec/machine specific init - e.g. add machine controls */
1043f0fba2adSLiam Girdwood 	int (*init)(struct snd_soc_pcm_runtime *rtd);
104406f409d7SMark Brown 
104501d7584cSLiam Girdwood 	/* optional hw_params re-writing for BE and FE sync */
104601d7584cSLiam Girdwood 	int (*be_hw_params_fixup)(struct snd_soc_pcm_runtime *rtd,
104701d7584cSLiam Girdwood 			struct snd_pcm_hw_params *params);
104801d7584cSLiam Girdwood 
1049f0fba2adSLiam Girdwood 	/* machine stream operations */
105013aec722SLars-Peter Clausen 	const struct snd_soc_ops *ops;
105113aec722SLars-Peter Clausen 	const struct snd_soc_compr_ops *compr_ops;
1052d6bead02SFabio Estevam 
10532dc0f16bSKuninori Morimoto 	/* Mark this pcm with non atomic ops */
10542dc0f16bSKuninori Morimoto 	bool nonatomic;
10552dc0f16bSKuninori Morimoto 
10561236fa1eSKuninori Morimoto 	/* For unidirectional dai links */
10571236fa1eSKuninori Morimoto 	unsigned int playback_only:1;
10581236fa1eSKuninori Morimoto 	unsigned int capture_only:1;
10591236fa1eSKuninori Morimoto 
10602dc0f16bSKuninori Morimoto 	/* Keep DAI active over suspend */
10612dc0f16bSKuninori Morimoto 	unsigned int ignore_suspend:1;
10622dc0f16bSKuninori Morimoto 
10632dc0f16bSKuninori Morimoto 	/* Symmetry requirements */
10642dc0f16bSKuninori Morimoto 	unsigned int symmetric_rates:1;
10652dc0f16bSKuninori Morimoto 	unsigned int symmetric_channels:1;
10662dc0f16bSKuninori Morimoto 	unsigned int symmetric_samplebits:1;
10672dc0f16bSKuninori Morimoto 
10682dc0f16bSKuninori Morimoto 	/* Do not create a PCM for this DAI link (Backend link) */
10692dc0f16bSKuninori Morimoto 	unsigned int no_pcm:1;
10702dc0f16bSKuninori Morimoto 
10712dc0f16bSKuninori Morimoto 	/* This DAI link can route to other DAI links at runtime (Frontend)*/
10722dc0f16bSKuninori Morimoto 	unsigned int dynamic:1;
10732dc0f16bSKuninori Morimoto 
10742dc0f16bSKuninori Morimoto 	/* DPCM capture and Playback support */
10752dc0f16bSKuninori Morimoto 	unsigned int dpcm_capture:1;
10762dc0f16bSKuninori Morimoto 	unsigned int dpcm_playback:1;
10772dc0f16bSKuninori Morimoto 
1078b073ed4eSKuninori Morimoto 	/* DPCM used FE & BE merged format */
1079b073ed4eSKuninori Morimoto 	unsigned int dpcm_merged_format:1;
1080b073ed4eSKuninori Morimoto 
10812dc0f16bSKuninori Morimoto 	/* pmdown_time is ignored at stop */
10822dc0f16bSKuninori Morimoto 	unsigned int ignore_pmdown_time:1;
1083f8f80361SMengdong Lin 
1084f8f80361SMengdong Lin 	struct list_head list; /* DAI link list of the soc card */
1085f8f80361SMengdong Lin 	struct snd_soc_dobj dobj; /* For topology */
1086808db4a4SRichard Purdie };
1087808db4a4SRichard Purdie 
1088ff819b83SDimitris Papastamos struct snd_soc_codec_conf {
10893ca041edSSebastian Reichel 	/*
10903ca041edSSebastian Reichel 	 * specify device either by device name, or by
10913ca041edSSebastian Reichel 	 * DT/OF node, but not both.
10923ca041edSSebastian Reichel 	 */
1093ead9b919SJarkko Nikula 	const char *dev_name;
1094c362effeSJean-Francois Moine 	struct device_node *of_node;
1095ff819b83SDimitris Papastamos 
1096ff819b83SDimitris Papastamos 	/*
1097ff819b83SDimitris Papastamos 	 * optional map of kcontrol, widget and path name prefixes that are
1098ff819b83SDimitris Papastamos 	 * associated per device
1099ff819b83SDimitris Papastamos 	 */
1100ead9b919SJarkko Nikula 	const char *name_prefix;
1101ead9b919SJarkko Nikula };
1102ead9b919SJarkko Nikula 
11032eea392dSJarkko Nikula struct snd_soc_aux_dev {
11042eea392dSJarkko Nikula 	const char *name;		/* Codec name */
11053ca041edSSebastian Reichel 
11063ca041edSSebastian Reichel 	/*
11073ca041edSSebastian Reichel 	 * specify multi-codec either by device name, or by
11083ca041edSSebastian Reichel 	 * DT/OF node, but not both.
11093ca041edSSebastian Reichel 	 */
11103ca041edSSebastian Reichel 	const char *codec_name;
1111c362effeSJean-Francois Moine 	struct device_node *codec_of_node;
11122eea392dSJarkko Nikula 
11132eea392dSJarkko Nikula 	/* codec/machine specific init - e.g. add machine controls */
111457bf7726SLars-Peter Clausen 	int (*init)(struct snd_soc_component *component);
11152eea392dSJarkko Nikula };
11162eea392dSJarkko Nikula 
111787506549SMark Brown /* SoC card */
111887506549SMark Brown struct snd_soc_card {
1119f0fba2adSLiam Girdwood 	const char *name;
112022de71baSLiam Girdwood 	const char *long_name;
112122de71baSLiam Girdwood 	const char *driver_name;
1122345233d7SLiam Girdwood 	char dmi_longname[80];
1123345233d7SLiam Girdwood 
1124c5af3a2eSMark Brown 	struct device *dev;
1125f0fba2adSLiam Girdwood 	struct snd_card *snd_card;
1126f0fba2adSLiam Girdwood 	struct module *owner;
1127c5af3a2eSMark Brown 
1128f0fba2adSLiam Girdwood 	struct mutex mutex;
1129a73fb2dfSLiam Girdwood 	struct mutex dapm_mutex;
1130c5af3a2eSMark Brown 
1131f0fba2adSLiam Girdwood 	bool instantiated;
1132808db4a4SRichard Purdie 
1133e7361ec4SMark Brown 	int (*probe)(struct snd_soc_card *card);
113428e9ad92SMark Brown 	int (*late_probe)(struct snd_soc_card *card);
1135e7361ec4SMark Brown 	int (*remove)(struct snd_soc_card *card);
1136808db4a4SRichard Purdie 
1137808db4a4SRichard Purdie 	/* the pre and post PM functions are used to do any PM work before and
1138808db4a4SRichard Purdie 	 * after the codec and DAI's do any PM work. */
113970b2ac12SMark Brown 	int (*suspend_pre)(struct snd_soc_card *card);
114070b2ac12SMark Brown 	int (*suspend_post)(struct snd_soc_card *card);
114170b2ac12SMark Brown 	int (*resume_pre)(struct snd_soc_card *card);
114270b2ac12SMark Brown 	int (*resume_post)(struct snd_soc_card *card);
1143808db4a4SRichard Purdie 
11440b4d221bSLiam Girdwood 	/* callbacks */
114587506549SMark Brown 	int (*set_bias_level)(struct snd_soc_card *,
1146d4c6005fSMark Brown 			      struct snd_soc_dapm_context *dapm,
11470be9898aSMark Brown 			      enum snd_soc_bias_level level);
11481badabd9SMark Brown 	int (*set_bias_level_post)(struct snd_soc_card *,
1149d4c6005fSMark Brown 				   struct snd_soc_dapm_context *dapm,
11501badabd9SMark Brown 				   enum snd_soc_bias_level level);
11510b4d221bSLiam Girdwood 
1152d6f220eaSMengdong Lin 	int (*add_dai_link)(struct snd_soc_card *,
1153d6f220eaSMengdong Lin 			    struct snd_soc_dai_link *link);
1154d6f220eaSMengdong Lin 	void (*remove_dai_link)(struct snd_soc_card *,
1155d6f220eaSMengdong Lin 			    struct snd_soc_dai_link *link);
1156d6f220eaSMengdong Lin 
11576c5f1fedSMark Brown 	long pmdown_time;
115896dd3622SMark Brown 
1159808db4a4SRichard Purdie 	/* CPU <--> Codec DAI links  */
1160f8f80361SMengdong Lin 	struct snd_soc_dai_link *dai_link;  /* predefined links only */
1161f8f80361SMengdong Lin 	int num_links;  /* predefined links only */
1162f8f80361SMengdong Lin 	struct list_head dai_link_list; /* all links */
1163f8f80361SMengdong Lin 	int num_dai_links;
1164f8f80361SMengdong Lin 
11651a497983SMengdong Lin 	struct list_head rtd_list;
1166f0fba2adSLiam Girdwood 	int num_rtd;
11676308419aSMark Brown 
1168ff819b83SDimitris Papastamos 	/* optional codec specific configuration */
1169ff819b83SDimitris Papastamos 	struct snd_soc_codec_conf *codec_conf;
1170ff819b83SDimitris Papastamos 	int num_configs;
1171ead9b919SJarkko Nikula 
11722eea392dSJarkko Nikula 	/*
11732eea392dSJarkko Nikula 	 * optional auxiliary devices such as amplifiers or codecs with DAI
11742eea392dSJarkko Nikula 	 * link unused
11752eea392dSJarkko Nikula 	 */
11762eea392dSJarkko Nikula 	struct snd_soc_aux_dev *aux_dev;
11772eea392dSJarkko Nikula 	int num_aux_devs;
1178d2e3a135SSylwester Nawrocki 	struct list_head aux_comp_list;
11792eea392dSJarkko Nikula 
1180b7af1dafSMark Brown 	const struct snd_kcontrol_new *controls;
1181b7af1dafSMark Brown 	int num_controls;
1182b7af1dafSMark Brown 
1183b8ad29deSMark Brown 	/*
1184b8ad29deSMark Brown 	 * Card-specific routes and widgets.
1185f23e860eSNicolin Chen 	 * Note: of_dapm_xxx for Device Tree; Otherwise for driver build-in.
1186b8ad29deSMark Brown 	 */
1187d06e48dbSLars-Peter Clausen 	const struct snd_soc_dapm_widget *dapm_widgets;
1188b8ad29deSMark Brown 	int num_dapm_widgets;
1189d06e48dbSLars-Peter Clausen 	const struct snd_soc_dapm_route *dapm_routes;
1190b8ad29deSMark Brown 	int num_dapm_routes;
1191f23e860eSNicolin Chen 	const struct snd_soc_dapm_widget *of_dapm_widgets;
1192f23e860eSNicolin Chen 	int num_of_dapm_widgets;
1193f23e860eSNicolin Chen 	const struct snd_soc_dapm_route *of_dapm_routes;
1194f23e860eSNicolin Chen 	int num_of_dapm_routes;
11951633281bSStephen Warren 	bool fully_routed;
1196b8ad29deSMark Brown 
11976308419aSMark Brown 	struct work_struct deferred_resume_work;
1198f0fba2adSLiam Girdwood 
1199f0fba2adSLiam Girdwood 	/* lists of probed devices belonging to this card */
1200d9fc4063SKuninori Morimoto 	struct list_head component_dev_list;
1201a6052154SJarkko Nikula 
120297c866deSJarkko Nikula 	struct list_head widgets;
12038ddab3f5SJarkko Nikula 	struct list_head paths;
12047be31be8SJarkko Nikula 	struct list_head dapm_list;
1205db432b41SMark Brown 	struct list_head dapm_dirty;
12068ddab3f5SJarkko Nikula 
12078a978234SLiam Girdwood 	/* attached dynamic objects */
12088a978234SLiam Girdwood 	struct list_head dobj_list;
12098a978234SLiam Girdwood 
1210e37a4970SMark Brown 	/* Generic DAPM context for the card */
1211e37a4970SMark Brown 	struct snd_soc_dapm_context dapm;
1212de02d078SMark Brown 	struct snd_soc_dapm_stats dapm_stats;
1213564c6504SLars-Peter Clausen 	struct snd_soc_dapm_update *update;
1214e37a4970SMark Brown 
1215a6052154SJarkko Nikula #ifdef CONFIG_DEBUG_FS
1216a6052154SJarkko Nikula 	struct dentry *debugfs_card_root;
12173a45b867SJarkko Nikula 	struct dentry *debugfs_pop_time;
1218a6052154SJarkko Nikula #endif
12193a45b867SJarkko Nikula 	u32 pop_time;
1220dddf3e4cSMark Brown 
1221dddf3e4cSMark Brown 	void *drvdata;
1222808db4a4SRichard Purdie };
1223808db4a4SRichard Purdie 
1224f0fba2adSLiam Girdwood /* SoC machine DAI configuration, glues a codec and cpu DAI together */
1225808db4a4SRichard Purdie struct snd_soc_pcm_runtime {
122636ae1a96SMark Brown 	struct device *dev;
1227f0fba2adSLiam Girdwood 	struct snd_soc_card *card;
1228f0fba2adSLiam Girdwood 	struct snd_soc_dai_link *dai_link;
1229b8c0dab9SLiam Girdwood 	struct mutex pcm_mutex;
1230b8c0dab9SLiam Girdwood 	enum snd_soc_pcm_subclass pcm_subclass;
1231b8c0dab9SLiam Girdwood 	struct snd_pcm_ops ops;
1232f0fba2adSLiam Girdwood 
123301d7584cSLiam Girdwood 	/* Dynamic PCM BE runtime data */
123401d7584cSLiam Girdwood 	struct snd_soc_dpcm_runtime dpcm[2];
12352a99ef0fSLiam Girdwood 	int fe_compr;
123601d7584cSLiam Girdwood 
1237f0fba2adSLiam Girdwood 	long pmdown_time;
1238f0fba2adSLiam Girdwood 
1239f0fba2adSLiam Girdwood 	/* runtime devices */
1240f0fba2adSLiam Girdwood 	struct snd_pcm *pcm;
124149681077SVinod Koul 	struct snd_compr *compr;
1242f0fba2adSLiam Girdwood 	struct snd_soc_codec *codec;
124390be711eSKuninori Morimoto 	struct snd_soc_platform *platform; /* will be removed */
1244f0fba2adSLiam Girdwood 	struct snd_soc_dai *codec_dai;
1245f0fba2adSLiam Girdwood 	struct snd_soc_dai *cpu_dai;
1246f0fba2adSLiam Girdwood 
124788bd870fSBenoit Cousson 	struct snd_soc_dai **codec_dais;
124888bd870fSBenoit Cousson 	unsigned int num_codecs;
124988bd870fSBenoit Cousson 
1250f0fba2adSLiam Girdwood 	struct delayed_work delayed_work;
1251f86dcef8SLiam Girdwood #ifdef CONFIG_DEBUG_FS
1252f86dcef8SLiam Girdwood 	struct dentry *debugfs_dpcm_root;
1253f86dcef8SLiam Girdwood #endif
12541a497983SMengdong Lin 
12551a497983SMengdong Lin 	unsigned int num; /* 0-based and monotonic increasing */
12561a497983SMengdong Lin 	struct list_head list; /* rtd list of the soc card */
1257a0ac4411SKuninori Morimoto 	struct list_head component_list; /* list of connected components */
1258a7df0d3bSKuninori Morimoto 
1259a7df0d3bSKuninori Morimoto 	/* bit field */
1260a7df0d3bSKuninori Morimoto 	unsigned int dev_registered:1;
1261a7df0d3bSKuninori Morimoto 	unsigned int pop_wait:1;
1262808db4a4SRichard Purdie };
1263808db4a4SRichard Purdie 
12644eaa9819SJon Smirl /* mixer control */
12654eaa9819SJon Smirl struct soc_mixer_control {
1266d11bb4a9SPeter Ujfalusi 	int min, max, platform_max;
1267249ce138SLars-Peter Clausen 	int reg, rreg;
1268249ce138SLars-Peter Clausen 	unsigned int shift, rshift;
1269f227b88fSMarkus Pargmann 	unsigned int sign_bit;
127057295073SLars-Peter Clausen 	unsigned int invert:1;
127157295073SLars-Peter Clausen 	unsigned int autodisable:1;
12728a978234SLiam Girdwood 	struct snd_soc_dobj dobj;
12734eaa9819SJon Smirl };
12744eaa9819SJon Smirl 
127571d08516SMark Brown struct soc_bytes {
127671d08516SMark Brown 	int base;
127771d08516SMark Brown 	int num_regs;
1278f831b055SMark Brown 	u32 mask;
127971d08516SMark Brown };
128071d08516SMark Brown 
1281d9881208SVinod Koul struct soc_bytes_ext {
1282d9881208SVinod Koul 	int max;
12838a978234SLiam Girdwood 	struct snd_soc_dobj dobj;
12848a978234SLiam Girdwood 
12857523a271SOmair Mohammed Abdullah 	/* used for TLV byte control */
1286a1e5e7e9SMythri P K 	int (*get)(struct snd_kcontrol *kcontrol, unsigned int __user *bytes,
1287a1e5e7e9SMythri P K 			unsigned int size);
1288a1e5e7e9SMythri P K 	int (*put)(struct snd_kcontrol *kcontrol, const unsigned int __user *bytes,
1289a1e5e7e9SMythri P K 			unsigned int size);
1290d9881208SVinod Koul };
1291d9881208SVinod Koul 
12924183eed2SKristoffer KARLSSON /* multi register control */
12934183eed2SKristoffer KARLSSON struct soc_mreg_control {
12944183eed2SKristoffer KARLSSON 	long min, max;
12954183eed2SKristoffer KARLSSON 	unsigned int regbase, regcount, nbits, invert;
12964183eed2SKristoffer KARLSSON };
12974183eed2SKristoffer KARLSSON 
1298808db4a4SRichard Purdie /* enumerated kcontrol */
1299808db4a4SRichard Purdie struct soc_enum {
1300b948837aSLars-Peter Clausen 	int reg;
1301808db4a4SRichard Purdie 	unsigned char shift_l;
1302808db4a4SRichard Purdie 	unsigned char shift_r;
13039a8d38dbSTakashi Iwai 	unsigned int items;
13042e72f8e3SPeter Ujfalusi 	unsigned int mask;
130587023ff7STakashi Iwai 	const char * const *texts;
13062e72f8e3SPeter Ujfalusi 	const unsigned int *values;
1307561ed680SCharles Keepax 	unsigned int autodisable:1;
13088a978234SLiam Girdwood 	struct snd_soc_dobj dobj;
13092e72f8e3SPeter Ujfalusi };
13102e72f8e3SPeter Ujfalusi 
131128d6d175SLars-Peter Clausen /**
131228d6d175SLars-Peter Clausen  * snd_soc_component_to_codec() - Casts a component to the CODEC it is embedded in
131328d6d175SLars-Peter Clausen  * @component: The component to cast to a CODEC
131428d6d175SLars-Peter Clausen  *
131528d6d175SLars-Peter Clausen  * This function must only be used on components that are known to be CODECs.
131628d6d175SLars-Peter Clausen  * Otherwise the behavior is undefined.
131728d6d175SLars-Peter Clausen  */
131828d6d175SLars-Peter Clausen static inline struct snd_soc_codec *snd_soc_component_to_codec(
131928d6d175SLars-Peter Clausen 	struct snd_soc_component *component)
132028d6d175SLars-Peter Clausen {
132128d6d175SLars-Peter Clausen 	return container_of(component, struct snd_soc_codec, component);
132228d6d175SLars-Peter Clausen }
132328d6d175SLars-Peter Clausen 
1324b37f1d12SLars-Peter Clausen /**
1325b37f1d12SLars-Peter Clausen  * snd_soc_component_to_platform() - Casts a component to the platform it is embedded in
1326b37f1d12SLars-Peter Clausen  * @component: The component to cast to a platform
1327b37f1d12SLars-Peter Clausen  *
1328b37f1d12SLars-Peter Clausen  * This function must only be used on components that are known to be platforms.
1329b37f1d12SLars-Peter Clausen  * Otherwise the behavior is undefined.
1330b37f1d12SLars-Peter Clausen  */
1331b37f1d12SLars-Peter Clausen static inline struct snd_soc_platform *snd_soc_component_to_platform(
1332b37f1d12SLars-Peter Clausen 	struct snd_soc_component *component)
1333b37f1d12SLars-Peter Clausen {
1334b37f1d12SLars-Peter Clausen 	return container_of(component, struct snd_soc_platform, component);
1335b37f1d12SLars-Peter Clausen }
1336b37f1d12SLars-Peter Clausen 
133724089e04SLars-Peter Clausen /**
1338ce0fc93aSLars-Peter Clausen  * snd_soc_dapm_to_component() - Casts a DAPM context to the component it is
1339ce0fc93aSLars-Peter Clausen  *  embedded in
1340ce0fc93aSLars-Peter Clausen  * @dapm: The DAPM context to cast to the component
1341ce0fc93aSLars-Peter Clausen  *
1342ce0fc93aSLars-Peter Clausen  * This function must only be used on DAPM contexts that are known to be part of
1343ce0fc93aSLars-Peter Clausen  * a component (e.g. in a component driver). Otherwise the behavior is
1344ce0fc93aSLars-Peter Clausen  * undefined.
1345ce0fc93aSLars-Peter Clausen  */
1346ce0fc93aSLars-Peter Clausen static inline struct snd_soc_component *snd_soc_dapm_to_component(
1347ce0fc93aSLars-Peter Clausen 	struct snd_soc_dapm_context *dapm)
1348ce0fc93aSLars-Peter Clausen {
1349ce0fc93aSLars-Peter Clausen 	return container_of(dapm, struct snd_soc_component, dapm);
1350ce0fc93aSLars-Peter Clausen }
1351ce0fc93aSLars-Peter Clausen 
1352ce0fc93aSLars-Peter Clausen /**
135324089e04SLars-Peter Clausen  * snd_soc_dapm_to_codec() - Casts a DAPM context to the CODEC it is embedded in
135424089e04SLars-Peter Clausen  * @dapm: The DAPM context to cast to the CODEC
135524089e04SLars-Peter Clausen  *
135624089e04SLars-Peter Clausen  * This function must only be used on DAPM contexts that are known to be part of
135724089e04SLars-Peter Clausen  * a CODEC (e.g. in a CODEC driver). Otherwise the behavior is undefined.
135824089e04SLars-Peter Clausen  */
135924089e04SLars-Peter Clausen static inline struct snd_soc_codec *snd_soc_dapm_to_codec(
136024089e04SLars-Peter Clausen 	struct snd_soc_dapm_context *dapm)
136124089e04SLars-Peter Clausen {
13624890140fSLars-Peter Clausen 	return snd_soc_component_to_codec(snd_soc_dapm_to_component(dapm));
136324089e04SLars-Peter Clausen }
136424089e04SLars-Peter Clausen 
136524089e04SLars-Peter Clausen /**
136624089e04SLars-Peter Clausen  * snd_soc_dapm_to_platform() - Casts a DAPM context to the platform it is
136724089e04SLars-Peter Clausen  *  embedded in
136824089e04SLars-Peter Clausen  * @dapm: The DAPM context to cast to the platform.
136924089e04SLars-Peter Clausen  *
137024089e04SLars-Peter Clausen  * This function must only be used on DAPM contexts that are known to be part of
137124089e04SLars-Peter Clausen  * a platform (e.g. in a platform driver). Otherwise the behavior is undefined.
137224089e04SLars-Peter Clausen  */
137324089e04SLars-Peter Clausen static inline struct snd_soc_platform *snd_soc_dapm_to_platform(
137424089e04SLars-Peter Clausen 	struct snd_soc_dapm_context *dapm)
137524089e04SLars-Peter Clausen {
1376bc9af9faSLars-Peter Clausen 	return snd_soc_component_to_platform(snd_soc_dapm_to_component(dapm));
137724089e04SLars-Peter Clausen }
137824089e04SLars-Peter Clausen 
1379ce0fc93aSLars-Peter Clausen /**
1380ce0fc93aSLars-Peter Clausen  * snd_soc_component_get_dapm() - Returns the DAPM context associated with a
1381ce0fc93aSLars-Peter Clausen  *  component
1382ce0fc93aSLars-Peter Clausen  * @component: The component for which to get the DAPM context
1383ce0fc93aSLars-Peter Clausen  */
1384ce0fc93aSLars-Peter Clausen static inline struct snd_soc_dapm_context *snd_soc_component_get_dapm(
1385ce0fc93aSLars-Peter Clausen 	struct snd_soc_component *component)
1386ce0fc93aSLars-Peter Clausen {
13874890140fSLars-Peter Clausen 	return &component->dapm;
1388ce0fc93aSLars-Peter Clausen }
1389ce0fc93aSLars-Peter Clausen 
13906b5b042dSLars-Peter Clausen /**
139139ed68c8SLars-Peter Clausen  * snd_soc_codec_get_dapm() - Returns the DAPM context for the CODEC
139239ed68c8SLars-Peter Clausen  * @codec: The CODEC for which to get the DAPM context
139339ed68c8SLars-Peter Clausen  *
139439ed68c8SLars-Peter Clausen  * Note: Use this function instead of directly accessing the CODEC's dapm field
139539ed68c8SLars-Peter Clausen  */
139639ed68c8SLars-Peter Clausen static inline struct snd_soc_dapm_context *snd_soc_codec_get_dapm(
139739ed68c8SLars-Peter Clausen 	struct snd_soc_codec *codec)
139839ed68c8SLars-Peter Clausen {
13994890140fSLars-Peter Clausen 	return snd_soc_component_get_dapm(&codec->component);
140039ed68c8SLars-Peter Clausen }
140139ed68c8SLars-Peter Clausen 
140239ed68c8SLars-Peter Clausen /**
1403fa880775SLars-Peter Clausen  * snd_soc_dapm_init_bias_level() - Initialize CODEC DAPM bias level
1404628536eaSJonathan Corbet  * @codec: The CODEC for which to initialize the DAPM bias level
1405fa880775SLars-Peter Clausen  * @level: The DAPM level to initialize to
1406fa880775SLars-Peter Clausen  *
1407fa880775SLars-Peter Clausen  * Initializes the CODEC DAPM bias level. See snd_soc_dapm_init_bias_level().
1408fa880775SLars-Peter Clausen  */
1409fa880775SLars-Peter Clausen static inline void snd_soc_codec_init_bias_level(struct snd_soc_codec *codec,
1410fa880775SLars-Peter Clausen 	enum snd_soc_bias_level level)
1411fa880775SLars-Peter Clausen {
1412fa880775SLars-Peter Clausen 	snd_soc_dapm_init_bias_level(snd_soc_codec_get_dapm(codec), level);
1413fa880775SLars-Peter Clausen }
1414fa880775SLars-Peter Clausen 
1415fa880775SLars-Peter Clausen /**
1416fa880775SLars-Peter Clausen  * snd_soc_dapm_get_bias_level() - Get current CODEC DAPM bias level
1417fa880775SLars-Peter Clausen  * @codec: The CODEC for which to get the DAPM bias level
1418fa880775SLars-Peter Clausen  *
1419fa880775SLars-Peter Clausen  * Returns: The current DAPM bias level of the CODEC.
1420fa880775SLars-Peter Clausen  */
1421fa880775SLars-Peter Clausen static inline enum snd_soc_bias_level snd_soc_codec_get_bias_level(
1422fa880775SLars-Peter Clausen 	struct snd_soc_codec *codec)
1423fa880775SLars-Peter Clausen {
1424fa880775SLars-Peter Clausen 	return snd_soc_dapm_get_bias_level(snd_soc_codec_get_dapm(codec));
1425fa880775SLars-Peter Clausen }
1426fa880775SLars-Peter Clausen 
1427fa880775SLars-Peter Clausen /**
1428fa880775SLars-Peter Clausen  * snd_soc_codec_force_bias_level() - Set the CODEC DAPM bias level
1429fa880775SLars-Peter Clausen  * @codec: The CODEC for which to set the level
1430fa880775SLars-Peter Clausen  * @level: The level to set to
1431fa880775SLars-Peter Clausen  *
1432fa880775SLars-Peter Clausen  * Forces the CODEC bias level to a specific state. See
1433fa880775SLars-Peter Clausen  * snd_soc_dapm_force_bias_level().
1434fa880775SLars-Peter Clausen  */
1435fa880775SLars-Peter Clausen static inline int snd_soc_codec_force_bias_level(struct snd_soc_codec *codec,
1436fa880775SLars-Peter Clausen 	enum snd_soc_bias_level level)
1437fa880775SLars-Peter Clausen {
1438fa880775SLars-Peter Clausen 	return snd_soc_dapm_force_bias_level(snd_soc_codec_get_dapm(codec),
1439fa880775SLars-Peter Clausen 		level);
1440fa880775SLars-Peter Clausen }
1441fa880775SLars-Peter Clausen 
1442fa880775SLars-Peter Clausen /**
14436b5b042dSLars-Peter Clausen  * snd_soc_dapm_kcontrol_codec() - Returns the codec associated to a kcontrol
14446b5b042dSLars-Peter Clausen  * @kcontrol: The kcontrol
14456b5b042dSLars-Peter Clausen  *
14466b5b042dSLars-Peter Clausen  * This function must only be used on DAPM contexts that are known to be part of
14476b5b042dSLars-Peter Clausen  * a CODEC (e.g. in a CODEC driver). Otherwise the behavior is undefined.
14486b5b042dSLars-Peter Clausen  */
14496b5b042dSLars-Peter Clausen static inline struct snd_soc_codec *snd_soc_dapm_kcontrol_codec(
14506b5b042dSLars-Peter Clausen 	struct snd_kcontrol *kcontrol)
14516b5b042dSLars-Peter Clausen {
14526b5b042dSLars-Peter Clausen 	return snd_soc_dapm_to_codec(snd_soc_dapm_kcontrol_dapm(kcontrol));
14536b5b042dSLars-Peter Clausen }
14546b5b042dSLars-Peter Clausen 
14555c82f567SMark Brown /* codec IO */
1456c3753707SMark Brown unsigned int snd_soc_read(struct snd_soc_codec *codec, unsigned int reg);
1457ab2874a8SLars-Peter Clausen int snd_soc_write(struct snd_soc_codec *codec, unsigned int reg,
1458ab2874a8SLars-Peter Clausen 	unsigned int val);
14595c82f567SMark Brown 
1460427d204cSLars-Peter Clausen /**
1461427d204cSLars-Peter Clausen  * snd_soc_cache_sync() - Sync the register cache with the hardware
1462427d204cSLars-Peter Clausen  * @codec: CODEC to sync
1463427d204cSLars-Peter Clausen  *
1464427d204cSLars-Peter Clausen  * Note: This function will call regcache_sync()
1465427d204cSLars-Peter Clausen  */
1466427d204cSLars-Peter Clausen static inline int snd_soc_cache_sync(struct snd_soc_codec *codec)
1467427d204cSLars-Peter Clausen {
1468427d204cSLars-Peter Clausen 	return regcache_sync(codec->component.regmap);
1469427d204cSLars-Peter Clausen }
1470427d204cSLars-Peter Clausen 
1471e2c330b9SLars-Peter Clausen /* component IO */
1472e2c330b9SLars-Peter Clausen int snd_soc_component_read(struct snd_soc_component *component,
1473e2c330b9SLars-Peter Clausen 	unsigned int reg, unsigned int *val);
1474e2c330b9SLars-Peter Clausen int snd_soc_component_write(struct snd_soc_component *component,
1475e2c330b9SLars-Peter Clausen 	unsigned int reg, unsigned int val);
1476e2c330b9SLars-Peter Clausen int snd_soc_component_update_bits(struct snd_soc_component *component,
1477e2c330b9SLars-Peter Clausen 	unsigned int reg, unsigned int mask, unsigned int val);
1478e2c330b9SLars-Peter Clausen int snd_soc_component_update_bits_async(struct snd_soc_component *component,
1479e2c330b9SLars-Peter Clausen 	unsigned int reg, unsigned int mask, unsigned int val);
1480e2c330b9SLars-Peter Clausen void snd_soc_component_async_complete(struct snd_soc_component *component);
1481e2c330b9SLars-Peter Clausen int snd_soc_component_test_bits(struct snd_soc_component *component,
1482e2c330b9SLars-Peter Clausen 	unsigned int reg, unsigned int mask, unsigned int value);
1483e2c330b9SLars-Peter Clausen 
148471ccef0dSKuninori Morimoto /* component wide operations */
148571ccef0dSKuninori Morimoto int snd_soc_component_set_sysclk(struct snd_soc_component *component,
148671ccef0dSKuninori Morimoto 			int clk_id, int source, unsigned int freq, int dir);
1487ef641e5dSKuninori Morimoto int snd_soc_component_set_pll(struct snd_soc_component *component, int pll_id,
1488ef641e5dSKuninori Morimoto 			      int source, unsigned int freq_in,
1489ef641e5dSKuninori Morimoto 			      unsigned int freq_out);
149071ccef0dSKuninori Morimoto 
1491e874bf5fSLars-Peter Clausen #ifdef CONFIG_REGMAP
1492e874bf5fSLars-Peter Clausen 
149320feb881SLars-Peter Clausen void snd_soc_component_init_regmap(struct snd_soc_component *component,
149420feb881SLars-Peter Clausen 	struct regmap *regmap);
149520feb881SLars-Peter Clausen void snd_soc_component_exit_regmap(struct snd_soc_component *component);
149620feb881SLars-Peter Clausen 
149720feb881SLars-Peter Clausen /**
149820feb881SLars-Peter Clausen  * snd_soc_codec_init_regmap() - Initialize regmap instance for the CODEC
149920feb881SLars-Peter Clausen  * @codec: The CODEC for which to initialize the regmap instance
150020feb881SLars-Peter Clausen  * @regmap: The regmap instance that should be used by the CODEC
150120feb881SLars-Peter Clausen  *
150220feb881SLars-Peter Clausen  * This function allows deferred assignment of the regmap instance that is
150320feb881SLars-Peter Clausen  * associated with the CODEC. Only use this if the regmap instance is not yet
150420feb881SLars-Peter Clausen  * ready when the CODEC is registered. The function must also be called before
150520feb881SLars-Peter Clausen  * the first IO attempt of the CODEC.
150620feb881SLars-Peter Clausen  */
150720feb881SLars-Peter Clausen static inline void snd_soc_codec_init_regmap(struct snd_soc_codec *codec,
150820feb881SLars-Peter Clausen 	struct regmap *regmap)
150920feb881SLars-Peter Clausen {
151020feb881SLars-Peter Clausen 	snd_soc_component_init_regmap(&codec->component, regmap);
151120feb881SLars-Peter Clausen }
151220feb881SLars-Peter Clausen 
151320feb881SLars-Peter Clausen /**
151420feb881SLars-Peter Clausen  * snd_soc_codec_exit_regmap() - De-initialize regmap instance for the CODEC
151520feb881SLars-Peter Clausen  * @codec: The CODEC for which to de-initialize the regmap instance
151620feb881SLars-Peter Clausen  *
151720feb881SLars-Peter Clausen  * Calls regmap_exit() on the regmap instance associated to the CODEC and
151820feb881SLars-Peter Clausen  * removes the regmap instance from the CODEC.
151920feb881SLars-Peter Clausen  *
152020feb881SLars-Peter Clausen  * This function should only be used if snd_soc_codec_init_regmap() was used to
152120feb881SLars-Peter Clausen  * initialize the regmap instance.
152220feb881SLars-Peter Clausen  */
152320feb881SLars-Peter Clausen static inline void snd_soc_codec_exit_regmap(struct snd_soc_codec *codec)
152420feb881SLars-Peter Clausen {
152520feb881SLars-Peter Clausen 	snd_soc_component_exit_regmap(&codec->component);
152620feb881SLars-Peter Clausen }
152720feb881SLars-Peter Clausen 
1528e874bf5fSLars-Peter Clausen #endif
1529e874bf5fSLars-Peter Clausen 
1530f0fba2adSLiam Girdwood /* device driver data */
1531f0fba2adSLiam Girdwood 
1532dddf3e4cSMark Brown static inline void snd_soc_card_set_drvdata(struct snd_soc_card *card,
1533dddf3e4cSMark Brown 		void *data)
1534dddf3e4cSMark Brown {
1535dddf3e4cSMark Brown 	card->drvdata = data;
1536dddf3e4cSMark Brown }
1537dddf3e4cSMark Brown 
1538dddf3e4cSMark Brown static inline void *snd_soc_card_get_drvdata(struct snd_soc_card *card)
1539dddf3e4cSMark Brown {
1540dddf3e4cSMark Brown 	return card->drvdata;
1541dddf3e4cSMark Brown }
1542dddf3e4cSMark Brown 
1543c815dbb4SLars-Peter Clausen static inline void snd_soc_component_set_drvdata(struct snd_soc_component *c,
1544c815dbb4SLars-Peter Clausen 		void *data)
1545c815dbb4SLars-Peter Clausen {
1546c815dbb4SLars-Peter Clausen 	dev_set_drvdata(c->dev, data);
1547c815dbb4SLars-Peter Clausen }
1548c815dbb4SLars-Peter Clausen 
1549c815dbb4SLars-Peter Clausen static inline void *snd_soc_component_get_drvdata(struct snd_soc_component *c)
1550c815dbb4SLars-Peter Clausen {
1551c815dbb4SLars-Peter Clausen 	return dev_get_drvdata(c->dev);
1552c815dbb4SLars-Peter Clausen }
1553c815dbb4SLars-Peter Clausen 
1554b2c812e2SMark Brown static inline void snd_soc_codec_set_drvdata(struct snd_soc_codec *codec,
1555b2c812e2SMark Brown 		void *data)
1556b2c812e2SMark Brown {
1557c815dbb4SLars-Peter Clausen 	snd_soc_component_set_drvdata(&codec->component, data);
1558b2c812e2SMark Brown }
1559b2c812e2SMark Brown 
1560b2c812e2SMark Brown static inline void *snd_soc_codec_get_drvdata(struct snd_soc_codec *codec)
1561b2c812e2SMark Brown {
1562c815dbb4SLars-Peter Clausen 	return snd_soc_component_get_drvdata(&codec->component);
1563f0fba2adSLiam Girdwood }
1564f0fba2adSLiam Girdwood 
1565f0fba2adSLiam Girdwood static inline void snd_soc_platform_set_drvdata(struct snd_soc_platform *platform,
1566f0fba2adSLiam Girdwood 		void *data)
1567f0fba2adSLiam Girdwood {
1568c815dbb4SLars-Peter Clausen 	snd_soc_component_set_drvdata(&platform->component, data);
1569f0fba2adSLiam Girdwood }
1570f0fba2adSLiam Girdwood 
1571f0fba2adSLiam Girdwood static inline void *snd_soc_platform_get_drvdata(struct snd_soc_platform *platform)
1572f0fba2adSLiam Girdwood {
1573c815dbb4SLars-Peter Clausen 	return snd_soc_component_get_drvdata(&platform->component);
1574f0fba2adSLiam Girdwood }
1575f0fba2adSLiam Girdwood 
15764e10bda0SVinod Koul static inline void snd_soc_initialize_card_lists(struct snd_soc_card *card)
15774e10bda0SVinod Koul {
15784e10bda0SVinod Koul 	INIT_LIST_HEAD(&card->widgets);
15794e10bda0SVinod Koul 	INIT_LIST_HEAD(&card->paths);
15804e10bda0SVinod Koul 	INIT_LIST_HEAD(&card->dapm_list);
1581d2e3a135SSylwester Nawrocki 	INIT_LIST_HEAD(&card->aux_comp_list);
1582d9fc4063SKuninori Morimoto 	INIT_LIST_HEAD(&card->component_dev_list);
15834e10bda0SVinod Koul }
15844e10bda0SVinod Koul 
158530d86ba4SPeter Ujfalusi static inline bool snd_soc_volsw_is_stereo(struct soc_mixer_control *mc)
158630d86ba4SPeter Ujfalusi {
158730d86ba4SPeter Ujfalusi 	if (mc->reg == mc->rreg && mc->shift == mc->rshift)
158830d86ba4SPeter Ujfalusi 		return 0;
158930d86ba4SPeter Ujfalusi 	/*
159030d86ba4SPeter Ujfalusi 	 * mc->reg == mc->rreg && mc->shift != mc->rshift, or
159130d86ba4SPeter Ujfalusi 	 * mc->reg != mc->rreg means that the control is
159230d86ba4SPeter Ujfalusi 	 * stereo (bits in one register or in two registers)
159330d86ba4SPeter Ujfalusi 	 */
159430d86ba4SPeter Ujfalusi 	return 1;
159530d86ba4SPeter Ujfalusi }
159630d86ba4SPeter Ujfalusi 
159729ae2fa5SLars-Peter Clausen static inline unsigned int snd_soc_enum_val_to_item(struct soc_enum *e,
159829ae2fa5SLars-Peter Clausen 	unsigned int val)
159929ae2fa5SLars-Peter Clausen {
160029ae2fa5SLars-Peter Clausen 	unsigned int i;
160129ae2fa5SLars-Peter Clausen 
160229ae2fa5SLars-Peter Clausen 	if (!e->values)
160329ae2fa5SLars-Peter Clausen 		return val;
160429ae2fa5SLars-Peter Clausen 
160529ae2fa5SLars-Peter Clausen 	for (i = 0; i < e->items; i++)
160629ae2fa5SLars-Peter Clausen 		if (val == e->values[i])
160729ae2fa5SLars-Peter Clausen 			return i;
160829ae2fa5SLars-Peter Clausen 
160929ae2fa5SLars-Peter Clausen 	return 0;
161029ae2fa5SLars-Peter Clausen }
161129ae2fa5SLars-Peter Clausen 
161229ae2fa5SLars-Peter Clausen static inline unsigned int snd_soc_enum_item_to_val(struct soc_enum *e,
161329ae2fa5SLars-Peter Clausen 	unsigned int item)
161429ae2fa5SLars-Peter Clausen {
161529ae2fa5SLars-Peter Clausen 	if (!e->values)
161629ae2fa5SLars-Peter Clausen 		return item;
161729ae2fa5SLars-Peter Clausen 
161829ae2fa5SLars-Peter Clausen 	return e->values[item];
161929ae2fa5SLars-Peter Clausen }
162029ae2fa5SLars-Peter Clausen 
1621cdde4ccbSLars-Peter Clausen static inline bool snd_soc_component_is_active(
1622cdde4ccbSLars-Peter Clausen 	struct snd_soc_component *component)
1623cdde4ccbSLars-Peter Clausen {
1624cdde4ccbSLars-Peter Clausen 	return component->active != 0;
1625cdde4ccbSLars-Peter Clausen }
1626cdde4ccbSLars-Peter Clausen 
16275c898e74SLars-Peter Clausen static inline bool snd_soc_codec_is_active(struct snd_soc_codec *codec)
16285c898e74SLars-Peter Clausen {
1629cdde4ccbSLars-Peter Clausen 	return snd_soc_component_is_active(&codec->component);
16305c898e74SLars-Peter Clausen }
16315c898e74SLars-Peter Clausen 
1632ea53bf77SLars-Peter Clausen /**
1633907fe36aSLars-Peter Clausen  * snd_soc_kcontrol_component() - Returns the component that registered the
1634907fe36aSLars-Peter Clausen  *  control
1635907fe36aSLars-Peter Clausen  * @kcontrol: The control for which to get the component
1636907fe36aSLars-Peter Clausen  *
1637907fe36aSLars-Peter Clausen  * Note: This function will work correctly if the control has been registered
1638907fe36aSLars-Peter Clausen  * for a component. Either with snd_soc_add_codec_controls() or
1639907fe36aSLars-Peter Clausen  * snd_soc_add_platform_controls() or via  table based setup for either a
1640907fe36aSLars-Peter Clausen  * CODEC, a platform or component driver. Otherwise the behavior is undefined.
1641907fe36aSLars-Peter Clausen  */
1642907fe36aSLars-Peter Clausen static inline struct snd_soc_component *snd_soc_kcontrol_component(
1643907fe36aSLars-Peter Clausen 	struct snd_kcontrol *kcontrol)
1644907fe36aSLars-Peter Clausen {
1645907fe36aSLars-Peter Clausen 	return snd_kcontrol_chip(kcontrol);
1646907fe36aSLars-Peter Clausen }
1647907fe36aSLars-Peter Clausen 
1648907fe36aSLars-Peter Clausen /**
1649ea53bf77SLars-Peter Clausen  * snd_soc_kcontrol_codec() - Returns the CODEC that registered the control
1650ea53bf77SLars-Peter Clausen  * @kcontrol: The control for which to get the CODEC
1651ea53bf77SLars-Peter Clausen  *
1652ea53bf77SLars-Peter Clausen  * Note: This function will only work correctly if the control has been
1653ea53bf77SLars-Peter Clausen  * registered with snd_soc_add_codec_controls() or via table based setup of
1654ea53bf77SLars-Peter Clausen  * snd_soc_codec_driver. Otherwise the behavior is undefined.
1655ea53bf77SLars-Peter Clausen  */
1656ea53bf77SLars-Peter Clausen static inline struct snd_soc_codec *snd_soc_kcontrol_codec(
1657ea53bf77SLars-Peter Clausen 	struct snd_kcontrol *kcontrol)
1658ea53bf77SLars-Peter Clausen {
1659907fe36aSLars-Peter Clausen 	return snd_soc_component_to_codec(snd_soc_kcontrol_component(kcontrol));
1660ea53bf77SLars-Peter Clausen }
1661ea53bf77SLars-Peter Clausen 
1662f6272ff8SLars-Peter Clausen /**
16631a6ab46fSMasanari Iida  * snd_soc_kcontrol_platform() - Returns the platform that registered the control
1664f6272ff8SLars-Peter Clausen  * @kcontrol: The control for which to get the platform
1665f6272ff8SLars-Peter Clausen  *
1666f6272ff8SLars-Peter Clausen  * Note: This function will only work correctly if the control has been
1667f6272ff8SLars-Peter Clausen  * registered with snd_soc_add_platform_controls() or via table based setup of
1668f6272ff8SLars-Peter Clausen  * a snd_soc_platform_driver. Otherwise the behavior is undefined.
1669f6272ff8SLars-Peter Clausen  */
167066097ca7SLars-Peter Clausen static inline struct snd_soc_platform *snd_soc_kcontrol_platform(
1671f6272ff8SLars-Peter Clausen 	struct snd_kcontrol *kcontrol)
1672f6272ff8SLars-Peter Clausen {
1673907fe36aSLars-Peter Clausen 	return snd_soc_component_to_platform(snd_soc_kcontrol_component(kcontrol));
1674f6272ff8SLars-Peter Clausen }
1675f6272ff8SLars-Peter Clausen 
1676fb257897SMark Brown int snd_soc_util_init(void);
1677fb257897SMark Brown void snd_soc_util_exit(void);
1678fb257897SMark Brown 
1679b07609ceSKuninori Morimoto int snd_soc_of_parse_card_name(struct snd_soc_card *card,
1680bec4fa05SStephen Warren 			       const char *propname);
168121efde50SKuninori Morimoto int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card,
16829a6d4860SXiubo Li 					  const char *propname);
168389c67857SXiubo Li int snd_soc_of_parse_tdm_slot(struct device_node *np,
16846131084aSJyri Sarha 			      unsigned int *tx_mask,
16856131084aSJyri Sarha 			      unsigned int *rx_mask,
168689c67857SXiubo Li 			      unsigned int *slots,
168789c67857SXiubo Li 			      unsigned int *slot_width);
1688440a3006SKuninori Morimoto void snd_soc_of_parse_audio_prefix(struct snd_soc_card *card,
16895e3cdaa2SKuninori Morimoto 				   struct snd_soc_codec_conf *codec_conf,
16905e3cdaa2SKuninori Morimoto 				   struct device_node *of_node,
16915e3cdaa2SKuninori Morimoto 				   const char *propname);
16922bc644afSKuninori Morimoto int snd_soc_of_parse_audio_routing(struct snd_soc_card *card,
1693a4a54dd5SStephen Warren 				   const char *propname);
1694a7930ed4SKuninori Morimoto unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
1695389cb834SJyri Sarha 				     const char *prefix,
1696389cb834SJyri Sarha 				     struct device_node **bitclkmaster,
1697389cb834SJyri Sarha 				     struct device_node **framemaster);
1698a180e8b9SKuninori Morimoto int snd_soc_get_dai_id(struct device_node *ep);
16991ad8ec53SKuninori Morimoto int snd_soc_get_dai_name(struct of_phandle_args *args,
17001ad8ec53SKuninori Morimoto 			 const char **dai_name);
1701cb470087SKuninori Morimoto int snd_soc_of_get_dai_name(struct device_node *of_node,
1702cb470087SKuninori Morimoto 			    const char **dai_name);
170393b0f3eeSJean-Francois Moine int snd_soc_of_get_dai_link_codecs(struct device *dev,
170493b0f3eeSJean-Francois Moine 				   struct device_node *of_node,
170593b0f3eeSJean-Francois Moine 				   struct snd_soc_dai_link *dai_link);
1706bec4fa05SStephen Warren 
1707f8f80361SMengdong Lin int snd_soc_add_dai_link(struct snd_soc_card *card,
1708f8f80361SMengdong Lin 				struct snd_soc_dai_link *dai_link);
1709f8f80361SMengdong Lin void snd_soc_remove_dai_link(struct snd_soc_card *card,
1710f8f80361SMengdong Lin 			     struct snd_soc_dai_link *dai_link);
171117fb1755SMengdong Lin struct snd_soc_dai_link *snd_soc_find_dai_link(struct snd_soc_card *card,
171217fb1755SMengdong Lin 					       int id, const char *name,
171317fb1755SMengdong Lin 					       const char *stream_name);
1714f8f80361SMengdong Lin 
171568003e6cSMengdong Lin int snd_soc_register_dai(struct snd_soc_component *component,
171668003e6cSMengdong Lin 	struct snd_soc_dai_driver *dai_drv);
171768003e6cSMengdong Lin 
1718305e9020SMengdong Lin struct snd_soc_dai *snd_soc_find_dai(
1719305e9020SMengdong Lin 	const struct snd_soc_dai_link_component *dlc);
1720305e9020SMengdong Lin 
1721a47cbe72SMark Brown #include <sound/soc-dai.h>
1722a47cbe72SMark Brown 
1723*7c761b59SPierre-Louis Bossart static inline
1724*7c761b59SPierre-Louis Bossart struct snd_soc_dai *snd_soc_card_get_codec_dai(struct snd_soc_card *card,
1725*7c761b59SPierre-Louis Bossart 					       const char *dai_name)
1726*7c761b59SPierre-Louis Bossart {
1727*7c761b59SPierre-Louis Bossart 	struct snd_soc_pcm_runtime *rtd;
1728*7c761b59SPierre-Louis Bossart 
1729*7c761b59SPierre-Louis Bossart 	list_for_each_entry(rtd, &card->rtd_list, list) {
1730*7c761b59SPierre-Louis Bossart 		if (!strcmp(rtd->codec_dai->name, dai_name))
1731*7c761b59SPierre-Louis Bossart 			return rtd->codec_dai;
1732*7c761b59SPierre-Louis Bossart 	}
1733*7c761b59SPierre-Louis Bossart 
1734*7c761b59SPierre-Louis Bossart 	return NULL;
1735*7c761b59SPierre-Louis Bossart }
1736*7c761b59SPierre-Louis Bossart 
1737faff4bb0SStephen Warren #ifdef CONFIG_DEBUG_FS
17388a9dab1aSMark Brown extern struct dentry *snd_soc_debugfs_root;
1739faff4bb0SStephen Warren #endif
1740faff4bb0SStephen Warren 
17416f8ab4acSMark Brown extern const struct dev_pm_ops snd_soc_pm_ops;
17426f8ab4acSMark Brown 
1743f6d5e586SCharles Keepax /* Helper functions */
1744f6d5e586SCharles Keepax static inline void snd_soc_dapm_mutex_lock(struct snd_soc_dapm_context *dapm)
1745f6d5e586SCharles Keepax {
1746783513eeSCharles Keepax 	mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
1747f6d5e586SCharles Keepax }
1748f6d5e586SCharles Keepax 
1749f6d5e586SCharles Keepax static inline void snd_soc_dapm_mutex_unlock(struct snd_soc_dapm_context *dapm)
1750f6d5e586SCharles Keepax {
1751f6d5e586SCharles Keepax 	mutex_unlock(&dapm->card->dapm_mutex);
1752f6d5e586SCharles Keepax }
1753f6d5e586SCharles Keepax 
17541b4d9c22SRichard Fitzgerald int snd_soc_component_enable_pin(struct snd_soc_component *component,
17551b4d9c22SRichard Fitzgerald 				 const char *pin);
17561b4d9c22SRichard Fitzgerald int snd_soc_component_enable_pin_unlocked(struct snd_soc_component *component,
17571b4d9c22SRichard Fitzgerald 					  const char *pin);
17581b4d9c22SRichard Fitzgerald int snd_soc_component_disable_pin(struct snd_soc_component *component,
17591b4d9c22SRichard Fitzgerald 				  const char *pin);
17601b4d9c22SRichard Fitzgerald int snd_soc_component_disable_pin_unlocked(struct snd_soc_component *component,
17611b4d9c22SRichard Fitzgerald 					   const char *pin);
17621b4d9c22SRichard Fitzgerald int snd_soc_component_nc_pin(struct snd_soc_component *component,
17631b4d9c22SRichard Fitzgerald 			     const char *pin);
17641b4d9c22SRichard Fitzgerald int snd_soc_component_nc_pin_unlocked(struct snd_soc_component *component,
17651b4d9c22SRichard Fitzgerald 				      const char *pin);
17661b4d9c22SRichard Fitzgerald int snd_soc_component_get_pin_status(struct snd_soc_component *component,
17671b4d9c22SRichard Fitzgerald 				     const char *pin);
17681b4d9c22SRichard Fitzgerald int snd_soc_component_force_enable_pin(struct snd_soc_component *component,
17691b4d9c22SRichard Fitzgerald 				       const char *pin);
17701b4d9c22SRichard Fitzgerald int snd_soc_component_force_enable_pin_unlocked(
17711b4d9c22SRichard Fitzgerald 					struct snd_soc_component *component,
17721b4d9c22SRichard Fitzgerald 					const char *pin);
17731b4d9c22SRichard Fitzgerald 
1774808db4a4SRichard Purdie #endif
1775