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