Ignore:
Timestamp:
Mar 18, 2021, 8:57:36 PM (4 years ago)
Author:
David Azarewicz
Message:

Merge changes from Paul's uniaud32next branch.

Location:
GPL/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • GPL/trunk

  • GPL/trunk/alsa-kernel/include/sound/soc.h

    r598 r679  
    1 /*
     1/* SPDX-License-Identifier: GPL-2.0
     2 *
    23 * linux/sound/soc.h -- ALSA SoC Layer
    34 *
    4  * Author:              Liam Girdwood
    5  * Created:             Aug 11th 2005
     5 * Author:      Liam Girdwood
     6 * Created:     Aug 11th 2005
    67 * Copyright:   Wolfson Microelectronics. PLC.
    7  *
    8  * This program is free software; you can redistribute it and/or modify
    9  * it under the terms of the GNU General Public License version 2 as
    10  * published by the Free Software Foundation.
    118 */
    129
     
    1411#define __LINUX_SND_SOC_H
    1512
     13#include <linux/of.h>
    1614#include <linux/platform_device.h>
    1715#include <linux/types.h>
     
    2018#include <linux/interrupt.h>
    2119#include <linux/kernel.h>
     20#include <linux/regmap.h>
     21#include <linux/log2.h>
    2222#include <sound/core.h>
    2323#include <sound/pcm.h>
     24#include <sound/compress_driver.h>
    2425#include <sound/control.h>
    2526#include <sound/ac97_codec.h>
     
    2829 * Convenience kcontrol builders
    2930 */
    30 #define SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert) \
     31#define SOC_DOUBLE_VALUE(xreg, shift_left, shift_right, xmax, xinvert, xautodisable) \
    3132        ((unsigned long)&(struct soc_mixer_control) \
    32         {.reg = xreg, .shift = xshift, .rshift = xshift, .max = xmax, \
    33         .platform_max = xmax, .invert = xinvert})
     33        {.reg = xreg, .rreg = xreg, .shift = shift_left, \
     34        .rshift = shift_right, .max = xmax, .platform_max = xmax, \
     35        .invert = xinvert, .autodisable = xautodisable})
     36#define SOC_DOUBLE_S_VALUE(xreg, shift_left, shift_right, xmin, xmax, xsign_bit, xinvert, xautodisable) \
     37        ((unsigned long)&(struct soc_mixer_control) \
     38        {.reg = xreg, .rreg = xreg, .shift = shift_left, \
     39        .rshift = shift_right, .min = xmin, .max = xmax, .platform_max = xmax, \
     40        .sign_bit = xsign_bit, .invert = xinvert, .autodisable = xautodisable})
     41#define SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert, xautodisable) \
     42        SOC_DOUBLE_VALUE(xreg, xshift, xshift, xmax, xinvert, xautodisable)
    3443#define SOC_SINGLE_VALUE_EXT(xreg, xmax, xinvert) \
    3544        ((unsigned long)&(struct soc_mixer_control) \
    3645        {.reg = xreg, .max = xmax, .platform_max = xmax, .invert = xinvert})
     46#define SOC_DOUBLE_R_VALUE(xlreg, xrreg, xshift, xmax, xinvert) \
     47        ((unsigned long)&(struct soc_mixer_control) \
     48        {.reg = xlreg, .rreg = xrreg, .shift = xshift, .rshift = xshift, \
     49        .max = xmax, .platform_max = xmax, .invert = xinvert})
     50#define SOC_DOUBLE_R_S_VALUE(xlreg, xrreg, xshift, xmin, xmax, xsign_bit, xinvert) \
     51        ((unsigned long)&(struct soc_mixer_control) \
     52        {.reg = xlreg, .rreg = xrreg, .shift = xshift, .rshift = xshift, \
     53        .max = xmax, .min = xmin, .platform_max = xmax, .sign_bit = xsign_bit, \
     54        .invert = xinvert})
     55#define SOC_DOUBLE_R_RANGE_VALUE(xlreg, xrreg, xshift, xmin, xmax, xinvert) \
     56        ((unsigned long)&(struct soc_mixer_control) \
     57        {.reg = xlreg, .rreg = xrreg, .shift = xshift, .rshift = xshift, \
     58        .min = xmin, .max = xmax, .platform_max = xmax, .invert = xinvert})
    3759#define SOC_SINGLE(xname, reg, shift, max, invert) \
    3860{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
    3961        .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
    4062        .put = snd_soc_put_volsw, \
    41         .private_value =  SOC_SINGLE_VALUE(reg, shift, max, invert) }
     63        .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) }
     64#define SOC_SINGLE_RANGE(xname, xreg, xshift, xmin, xmax, xinvert) \
     65{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
     66        .info = snd_soc_info_volsw_range, .get = snd_soc_get_volsw_range, \
     67        .put = snd_soc_put_volsw_range, \
     68        .private_value = (unsigned long)&(struct soc_mixer_control) \
     69                {.reg = xreg, .rreg = xreg, .shift = xshift, \
     70                 .rshift = xshift,  .min = xmin, .max = xmax, \
     71                 .platform_max = xmax, .invert = xinvert} }
    4272#define SOC_SINGLE_TLV(xname, reg, shift, max, invert, tlv_array) \
    4373{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
     
    4777        .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
    4878        .put = snd_soc_put_volsw, \
    49         .private_value =  SOC_SINGLE_VALUE(reg, shift, max, invert) }
    50 #define SOC_DOUBLE(xname, xreg, shift_left, shift_right, xmax, xinvert) \
     79        .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) }
     80#define SOC_SINGLE_SX_TLV(xname, xreg, xshift, xmin, xmax, tlv_array) \
     81{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
     82        .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
     83        SNDRV_CTL_ELEM_ACCESS_READWRITE, \
     84        .tlv.p  = (tlv_array),\
     85        .info = snd_soc_info_volsw_sx, \
     86        .get = snd_soc_get_volsw_sx,\
     87        .put = snd_soc_put_volsw_sx, \
     88        .private_value = (unsigned long)&(struct soc_mixer_control) \
     89                {.reg = xreg, .rreg = xreg, \
     90                .shift = xshift, .rshift = xshift, \
     91                .max = xmax, .min = xmin} }
     92#define SOC_SINGLE_RANGE_TLV(xname, xreg, xshift, xmin, xmax, xinvert, tlv_array) \
     93{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
     94        .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
     95                 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
     96        .tlv.p = (tlv_array), \
     97        .info = snd_soc_info_volsw_range, \
     98        .get = snd_soc_get_volsw_range, .put = snd_soc_put_volsw_range, \
     99        .private_value = (unsigned long)&(struct soc_mixer_control) \
     100                {.reg = xreg, .rreg = xreg, .shift = xshift, \
     101                 .rshift = xshift, .min = xmin, .max = xmax, \
     102                 .platform_max = xmax, .invert = xinvert} }
     103#define SOC_DOUBLE(xname, reg, shift_left, shift_right, max, invert) \
    51104{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
    52105        .info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \
    53106        .put = snd_soc_put_volsw, \
    54         .private_value = (unsigned long)&(struct soc_mixer_control) \
    55                 {.reg = xreg, .shift = shift_left, .rshift = shift_right, \
    56                  .max = xmax, .platform_max = xmax, .invert = xinvert} }
     107        .private_value = SOC_DOUBLE_VALUE(reg, shift_left, shift_right, \
     108                                          max, invert, 0) }
     109#define SOC_DOUBLE_STS(xname, reg, shift_left, shift_right, max, invert) \
     110{                                                                       \
     111        .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),           \
     112        .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,           \
     113        .access = SNDRV_CTL_ELEM_ACCESS_READ |                          \
     114                SNDRV_CTL_ELEM_ACCESS_VOLATILE,                         \
     115        .private_value = SOC_DOUBLE_VALUE(reg, shift_left, shift_right, \
     116                                          max, invert, 0) }
    57117#define SOC_DOUBLE_R(xname, reg_left, reg_right, xshift, xmax, xinvert) \
    58118{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
    59         .info = snd_soc_info_volsw_2r, \
    60         .get = snd_soc_get_volsw_2r, .put = snd_soc_put_volsw_2r, \
    61         .private_value = (unsigned long)&(struct soc_mixer_control) \
    62                 {.reg = reg_left, .rreg = reg_right, .shift = xshift, \
    63                 .max = xmax, .platform_max = xmax, .invert = xinvert} }
    64 #define SOC_DOUBLE_TLV(xname, xreg, shift_left, shift_right, xmax, xinvert, tlv_array) \
     119        .info = snd_soc_info_volsw, \
     120        .get = snd_soc_get_volsw, .put = snd_soc_put_volsw, \
     121        .private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \
     122                                            xmax, xinvert) }
     123#define SOC_DOUBLE_R_RANGE(xname, reg_left, reg_right, xshift, xmin, \
     124                           xmax, xinvert)               \
     125{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
     126        .info = snd_soc_info_volsw_range, \
     127        .get = snd_soc_get_volsw_range, .put = snd_soc_put_volsw_range, \
     128        .private_value = SOC_DOUBLE_R_RANGE_VALUE(reg_left, reg_right, \
     129                                            xshift, xmin, xmax, xinvert) }
     130#define SOC_DOUBLE_TLV(xname, reg, shift_left, shift_right, max, invert, tlv_array) \
    65131{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
    66132        .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
     
    69135        .info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \
    70136        .put = snd_soc_put_volsw, \
    71         .private_value = (unsigned long)&(struct soc_mixer_control) \
    72                 {.reg = xreg, .shift = shift_left, .rshift = shift_right,\
    73                  .max = xmax, .platform_max = xmax, .invert = xinvert} }
     137        .private_value = SOC_DOUBLE_VALUE(reg, shift_left, shift_right, \
     138                                          max, invert, 0) }
    74139#define SOC_DOUBLE_R_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert, tlv_array) \
    75140{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
     
    77142                 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
    78143        .tlv.p = (tlv_array), \
    79         .info = snd_soc_info_volsw_2r, \
    80         .get = snd_soc_get_volsw_2r, .put = snd_soc_put_volsw_2r, \
     144        .info = snd_soc_info_volsw, \
     145        .get = snd_soc_get_volsw, .put = snd_soc_put_volsw, \
     146        .private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \
     147                                            xmax, xinvert) }
     148#define SOC_DOUBLE_R_RANGE_TLV(xname, reg_left, reg_right, xshift, xmin, \
     149                               xmax, xinvert, tlv_array)                \
     150{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
     151        .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
     152                 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
     153        .tlv.p = (tlv_array), \
     154        .info = snd_soc_info_volsw_range, \
     155        .get = snd_soc_get_volsw_range, .put = snd_soc_put_volsw_range, \
     156        .private_value = SOC_DOUBLE_R_RANGE_VALUE(reg_left, reg_right, \
     157                                            xshift, xmin, xmax, xinvert) }
     158#define SOC_DOUBLE_R_SX_TLV(xname, xreg, xrreg, xshift, xmin, xmax, tlv_array) \
     159{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
     160        .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
     161        SNDRV_CTL_ELEM_ACCESS_READWRITE, \
     162        .tlv.p  = (tlv_array), \
     163        .info = snd_soc_info_volsw_sx, \
     164        .get = snd_soc_get_volsw_sx, \
     165        .put = snd_soc_put_volsw_sx, \
    81166        .private_value = (unsigned long)&(struct soc_mixer_control) \
    82                 {.reg = reg_left, .rreg = reg_right, .shift = xshift, \
    83                 .max = xmax, .platform_max = xmax, .invert = xinvert} }
     167                {.reg = xreg, .rreg = xrreg, \
     168                .shift = xshift, .rshift = xshift, \
     169                .max = xmax, .min = xmin} }
     170#define SOC_DOUBLE_R_S_TLV(xname, reg_left, reg_right, xshift, xmin, xmax, xsign_bit, xinvert, tlv_array) \
     171{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
     172        .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
     173                 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
     174        .tlv.p = (tlv_array), \
     175        .info = snd_soc_info_volsw, \
     176        .get = snd_soc_get_volsw, .put = snd_soc_put_volsw, \
     177        .private_value = SOC_DOUBLE_R_S_VALUE(reg_left, reg_right, xshift, \
     178                                            xmin, xmax, xsign_bit, xinvert) }
     179#define SOC_SINGLE_S8_TLV(xname, xreg, xmin, xmax, tlv_array) \
     180{       .iface  = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
     181        .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
     182                  SNDRV_CTL_ELEM_ACCESS_READWRITE, \
     183        .tlv.p  = (tlv_array), \
     184        .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
     185        .put = snd_soc_put_volsw, \
     186        .private_value = (unsigned long)&(struct soc_mixer_control) \
     187        {.reg = xreg, .rreg = xreg,  \
     188         .min = xmin, .max = xmax, .platform_max = xmax, \
     189        .sign_bit = 7,} }
    84190#define SOC_DOUBLE_S8_TLV(xname, xreg, xmin, xmax, tlv_array) \
    85191{       .iface  = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
     
    87193                  SNDRV_CTL_ELEM_ACCESS_READWRITE, \
    88194        .tlv.p  = (tlv_array), \
    89         .info   = snd_soc_info_volsw_s8, .get = snd_soc_get_volsw_s8, \
    90         .put    = snd_soc_put_volsw_s8, \
    91         .private_value = (unsigned long)&(struct soc_mixer_control) \
    92                 {.reg = xreg, .min = xmin, .max = xmax, \
    93                  .platform_max = xmax} }
    94 #define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmax, xtexts) \
     195        .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
     196        .put = snd_soc_put_volsw, \
     197        .private_value = SOC_DOUBLE_S_VALUE(xreg, 0, 8, xmin, xmax, 7, 0, 0) }
     198#define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xitems, xtexts) \
    95199{       .reg = xreg, .shift_l = xshift_l, .shift_r = xshift_r, \
    96         .max = xmax, .texts = xtexts }
    97 #define SOC_ENUM_SINGLE(xreg, xshift, xmax, xtexts) \
    98         SOC_ENUM_DOUBLE(xreg, xshift, xshift, xmax, xtexts)
    99 #define SOC_ENUM_SINGLE_EXT(xmax, xtexts) \
    100 {       .max = xmax, .texts = xtexts }
    101 #define SOC_VALUE_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, xmax, xtexts, xvalues) \
     200        .items = xitems, .texts = xtexts, \
     201        .mask = xitems ? roundup_pow_of_two(xitems) - 1 : 0}
     202#define SOC_ENUM_SINGLE(xreg, xshift, xitems, xtexts) \
     203        SOC_ENUM_DOUBLE(xreg, xshift, xshift, xitems, xtexts)
     204#define SOC_ENUM_SINGLE_EXT(xitems, xtexts) \
     205{       .items = xitems, .texts = xtexts }
     206#define SOC_VALUE_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, xitems, xtexts, xvalues) \
    102207{       .reg = xreg, .shift_l = xshift_l, .shift_r = xshift_r, \
    103         .mask = xmask, .max = xmax, .texts = xtexts, .values = xvalues}
    104 #define SOC_VALUE_ENUM_SINGLE(xreg, xshift, xmask, xmax, xtexts, xvalues) \
    105         SOC_VALUE_ENUM_DOUBLE(xreg, xshift, xshift, xmask, xmax, xtexts, xvalues)
     208        .mask = xmask, .items = xitems, .texts = xtexts, .values = xvalues}
     209#define SOC_VALUE_ENUM_SINGLE(xreg, xshift, xmask, xitems, xtexts, xvalues) \
     210        SOC_VALUE_ENUM_DOUBLE(xreg, xshift, xshift, xmask, xitems, xtexts, xvalues)
     211#define SOC_VALUE_ENUM_SINGLE_AUTODISABLE(xreg, xshift, xmask, xitems, xtexts, xvalues) \
     212{       .reg = xreg, .shift_l = xshift, .shift_r = xshift, \
     213        .mask = xmask, .items = xitems, .texts = xtexts, \
     214        .values = xvalues, .autodisable = 1}
     215#define SOC_ENUM_SINGLE_VIRT(xitems, xtexts) \
     216        SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, xitems, xtexts)
    106217#define SOC_ENUM(xname, xenum) \
    107218{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\
    108219        .info = snd_soc_info_enum_double, \
    109220        .get = snd_soc_get_enum_double, .put = snd_soc_put_enum_double, \
    110         .private_value = (unsigned long)&xenum }
    111 #define SOC_VALUE_ENUM(xname, xenum) \
    112 {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\
    113         .info = snd_soc_info_enum_double, \
    114         .get = snd_soc_get_value_enum_double, \
    115         .put = snd_soc_put_value_enum_double, \
    116221        .private_value = (unsigned long)&xenum }
    117222#define SOC_SINGLE_EXT(xname, xreg, xshift, xmax, xinvert,\
     
    120225        .info = snd_soc_info_volsw, \
    121226        .get = xhandler_get, .put = xhandler_put, \
    122         .private_value = SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert) }
    123 #define SOC_DOUBLE_EXT(xname, xreg, shift_left, shift_right, xmax, xinvert,\
     227        .private_value = SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert, 0) }
     228#define SOC_DOUBLE_EXT(xname, reg, shift_left, shift_right, max, invert,\
    124229         xhandler_get, xhandler_put) \
    125230{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
    126231        .info = snd_soc_info_volsw, \
    127232        .get = xhandler_get, .put = xhandler_put, \
    128         .private_value = (unsigned long)&(struct soc_mixer_control) \
    129                 {.reg = xreg, .shift = shift_left, .rshift = shift_right, \
    130                  .max = xmax, .platform_max = xmax, .invert = xinvert} }
     233        .private_value = \
     234                SOC_DOUBLE_VALUE(reg, shift_left, shift_right, max, invert, 0) }
     235#define SOC_DOUBLE_R_EXT(xname, reg_left, reg_right, xshift, xmax, xinvert,\
     236         xhandler_get, xhandler_put) \
     237{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
     238        .info = snd_soc_info_volsw, \
     239        .get = xhandler_get, .put = xhandler_put, \
     240        .private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \
     241                                            xmax, xinvert) }
    131242#define SOC_SINGLE_EXT_TLV(xname, xreg, xshift, xmax, xinvert,\
    132243         xhandler_get, xhandler_put, tlv_array) \
     
    137248        .info = snd_soc_info_volsw, \
    138249        .get = xhandler_get, .put = xhandler_put, \
    139         .private_value = SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert) }
     250        .private_value = SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert, 0) }
     251#define SOC_SINGLE_RANGE_EXT_TLV(xname, xreg, xshift, xmin, xmax, xinvert, \
     252                                 xhandler_get, xhandler_put, tlv_array) \
     253{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
     254        .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
     255                 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
     256        .tlv.p = (tlv_array), \
     257        .info = snd_soc_info_volsw_range, \
     258        .get = xhandler_get, .put = xhandler_put, \
     259        .private_value = (unsigned long)&(struct soc_mixer_control) \
     260                {.reg = xreg, .rreg = xreg, .shift = xshift, \
     261                 .rshift = xshift, .min = xmin, .max = xmax, \
     262                 .platform_max = xmax, .invert = xinvert} }
    140263#define SOC_DOUBLE_EXT_TLV(xname, xreg, shift_left, shift_right, xmax, xinvert,\
    141264         xhandler_get, xhandler_put, tlv_array) \
     
    146269        .info = snd_soc_info_volsw, \
    147270        .get = xhandler_get, .put = xhandler_put, \
    148         .private_value = (unsigned long)&(struct soc_mixer_control) \
    149                 {.reg = xreg, .shift = shift_left, .rshift = shift_right, \
    150                 .max = xmax, .platform_max = xmax, .invert = xinvert} }
     271        .private_value = SOC_DOUBLE_VALUE(xreg, shift_left, shift_right, \
     272                                          xmax, xinvert, 0) }
    151273#define SOC_DOUBLE_R_EXT_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert,\
    152274         xhandler_get, xhandler_put, tlv_array) \
     
    155277                 SNDRV_CTL_ELEM_ACCESS_READWRITE, \
    156278        .tlv.p = (tlv_array), \
    157         .info = snd_soc_info_volsw_2r, \
     279        .info = snd_soc_info_volsw, \
    158280        .get = xhandler_get, .put = xhandler_put, \
    159         .private_value = (unsigned long)&(struct soc_mixer_control) \
    160                 {.reg = reg_left, .rreg = reg_right, .shift = xshift, \
    161                 .max = xmax, .platform_max = xmax, .invert = xinvert} }
     281        .private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \
     282                                            xmax, xinvert) }
    162283#define SOC_SINGLE_BOOL_EXT(xname, xdata, xhandler_get, xhandler_put) \
    163284{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
     
    167288#define SOC_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put) \
    168289{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
    169         .info = snd_soc_info_enum_ext, \
     290        .info = snd_soc_info_enum_double, \
    170291        .get = xhandler_get, .put = xhandler_put, \
    171292        .private_value = (unsigned long)&xenum }
    172 
    173 #define SOC_DOUBLE_R_SX_TLV(xname, xreg_left, xreg_right, xshift,\
    174                 xmin, xmax, tlv_array) \
     293#define SOC_VALUE_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put) \
     294        SOC_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put)
     295
     296#define SND_SOC_BYTES(xname, xbase, xregs)                    \
     297{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,   \
     298        .info = snd_soc_bytes_info, .get = snd_soc_bytes_get, \
     299        .put = snd_soc_bytes_put, .private_value =            \
     300                ((unsigned long)&(struct soc_bytes)           \
     301                {.base = xbase, .num_regs = xregs }) }
     302#define SND_SOC_BYTES_E(xname, xbase, xregs, xhandler_get, xhandler_put) \
     303{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
     304        .info = snd_soc_bytes_info, .get = xhandler_get, \
     305        .put = xhandler_put, .private_value = \
     306                ((unsigned long)&(struct soc_bytes) \
     307                {.base = xbase, .num_regs = xregs }) }
     308
     309#define SND_SOC_BYTES_MASK(xname, xbase, xregs, xmask)        \
     310{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,   \
     311        .info = snd_soc_bytes_info, .get = snd_soc_bytes_get, \
     312        .put = snd_soc_bytes_put, .private_value =            \
     313                ((unsigned long)&(struct soc_bytes)           \
     314                {.base = xbase, .num_regs = xregs,            \
     315                 .mask = xmask }) }
     316
     317/*
     318 * SND_SOC_BYTES_EXT is deprecated, please USE SND_SOC_BYTES_TLV instead
     319 */
     320#define SND_SOC_BYTES_EXT(xname, xcount, xhandler_get, xhandler_put) \
     321{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
     322        .info = snd_soc_bytes_info_ext, \
     323        .get = xhandler_get, .put = xhandler_put, \
     324        .private_value = (unsigned long)&(struct soc_bytes_ext) \
     325                {.max = xcount} }
     326#define SND_SOC_BYTES_TLV(xname, xcount, xhandler_get, xhandler_put) \
     327{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
     328        .access = SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE | \
     329                  SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
     330        .tlv.c = (snd_soc_bytes_tlv_callback), \
     331        .info = snd_soc_bytes_info_ext, \
     332        .private_value = (unsigned long)&(struct soc_bytes_ext) \
     333                {.max = xcount, .get = xhandler_get, .put = xhandler_put, } }
     334#define SOC_SINGLE_XR_SX(xname, xregbase, xregcount, xnbits, \
     335                xmin, xmax, xinvert) \
    175336{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
    176         .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
    177                   SNDRV_CTL_ELEM_ACCESS_READWRITE, \
    178         .tlv.p = (tlv_array), \
    179         .info = snd_soc_info_volsw_2r_sx, \
    180         .get = snd_soc_get_volsw_2r_sx, \
    181         .put = snd_soc_put_volsw_2r_sx, \
    182         .private_value = (unsigned long)&(struct soc_mixer_control) \
    183                 {.reg = xreg_left, \
    184                  .rreg = xreg_right, .shift = xshift, \
    185                  .min = xmin, .max = xmax} }
    186 
     337        .info = snd_soc_info_xr_sx, .get = snd_soc_get_xr_sx, \
     338        .put = snd_soc_put_xr_sx, \
     339        .private_value = (unsigned long)&(struct soc_mreg_control) \
     340                {.regbase = xregbase, .regcount = xregcount, .nbits = xnbits, \
     341                .invert = xinvert, .min = xmin, .max = xmax} }
     342
     343#define SOC_SINGLE_STROBE(xname, xreg, xshift, xinvert) \
     344        SOC_SINGLE_EXT(xname, xreg, xshift, 1, xinvert, \
     345                snd_soc_get_strobe, snd_soc_put_strobe)
    187346
    188347/*
     
    191350 */
    192351#define SOC_ENUM_DOUBLE_DECL(name, xreg, xshift_l, xshift_r, xtexts) \
    193         struct soc_enum name = SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, \
     352        const struct soc_enum name = SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, \
    194353                                                ARRAY_SIZE(xtexts), xtexts)
    195354#define SOC_ENUM_SINGLE_DECL(name, xreg, xshift, xtexts) \
    196355        SOC_ENUM_DOUBLE_DECL(name, xreg, xshift, xshift, xtexts)
    197356#define SOC_ENUM_SINGLE_EXT_DECL(name, xtexts) \
    198         struct soc_enum name = SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(xtexts), xtexts)
     357        const struct soc_enum name = SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(xtexts), xtexts)
    199358#define SOC_VALUE_ENUM_DOUBLE_DECL(name, xreg, xshift_l, xshift_r, xmask, xtexts, xvalues) \
    200         struct soc_enum name = SOC_VALUE_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, \
     359        const struct soc_enum name = SOC_VALUE_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, \
    201360                                                        ARRAY_SIZE(xtexts), xtexts, xvalues)
    202361#define SOC_VALUE_ENUM_SINGLE_DECL(name, xreg, xshift, xmask, xtexts, xvalues) \
    203362        SOC_VALUE_ENUM_DOUBLE_DECL(name, xreg, xshift, xshift, xmask, xtexts, xvalues)
    204363
    205 /*
    206  * Bias levels
    207  *
    208  * @ON:      Bias is fully on for audio playback and capture operations.
    209  * @PREPARE: Prepare for audio operations. Called before DAPM switching for
    210  *           stream start and stop operations.
    211  * @STANDBY: Low power standby state when no playback/capture operations are
    212  *           in progress. NOTE: The transition time between STANDBY and ON
    213  *           should be as fast as possible and no longer than 10ms.
    214  * @OFF:     Power Off. No restrictions on transition times.
    215  */
    216 enum snd_soc_bias_level {
    217         SND_SOC_BIAS_OFF,
    218         SND_SOC_BIAS_STANDBY,
    219         SND_SOC_BIAS_PREPARE,
    220         SND_SOC_BIAS_ON,
    221 };
    222 
     364#define SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(name, xreg, xshift, xmask, xtexts, xvalues) \
     365        const struct soc_enum name = SOC_VALUE_ENUM_SINGLE_AUTODISABLE(xreg, \
     366                xshift, xmask, ARRAY_SIZE(xtexts), xtexts, xvalues)
     367
     368#define SOC_ENUM_SINGLE_VIRT_DECL(name, xtexts) \
     369        const struct soc_enum name = SOC_ENUM_SINGLE_VIRT(ARRAY_SIZE(xtexts), xtexts)
     370
     371struct device_node;
    223372struct snd_jack;
    224373struct snd_soc_card;
     
    228377struct snd_soc_dai;
    229378struct snd_soc_dai_driver;
    230 struct snd_soc_platform;
    231379struct snd_soc_dai_link;
    232 struct snd_soc_platform_driver;
    233 struct snd_soc_codec;
    234 struct snd_soc_codec_driver;
     380struct snd_soc_component;
     381struct snd_soc_component_driver;
    235382struct soc_enum;
    236383struct snd_soc_jack;
     384struct snd_soc_jack_zone;
    237385struct snd_soc_jack_pin;
    238 struct snd_soc_cache_ops;
    239386#include <sound/soc-dapm.h>
    240 
    241 #ifdef CONFIG_GPIOLIB
     387#include <sound/soc-dpcm.h>
     388#include <sound/soc-topology.h>
     389
    242390struct snd_soc_jack_gpio;
    243 #endif
    244391
    245392typedef int (*hw_write_t)(void *,const char* ,int);
    246393
    247 extern struct snd_ac97_bus_ops soc_ac97_ops;
    248 
    249 enum snd_soc_control_type {
    250         SND_SOC_CUSTOM,
    251         SND_SOC_I2C,
    252         SND_SOC_SPI,
    253 };
    254 
    255 enum snd_soc_compress_type {
    256         SND_SOC_FLAT_COMPRESSION = 1,
    257         SND_SOC_LZO_COMPRESSION,
    258         SND_SOC_RBTREE_COMPRESSION
     394enum snd_soc_pcm_subclass {
     395        SND_SOC_PCM_CLASS_PCM   = 0,
     396        SND_SOC_PCM_CLASS_BE    = 1,
    259397};
    260398
    261399int snd_soc_register_card(struct snd_soc_card *card);
    262400int snd_soc_unregister_card(struct snd_soc_card *card);
    263 int snd_soc_register_platform(struct device *dev,
    264                 struct snd_soc_platform_driver *platform_drv);
    265 void snd_soc_unregister_platform(struct device *dev);
    266 int snd_soc_register_codec(struct device *dev,
    267                 const struct snd_soc_codec_driver *codec_drv,
    268                 struct snd_soc_dai_driver *dai_drv, int num_dai);
    269 void snd_soc_unregister_codec(struct device *dev);
    270 int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, int reg);
    271 int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
    272                                int addr_bits, int data_bits,
    273                                enum snd_soc_control_type control);
    274 int snd_soc_cache_sync(struct snd_soc_codec *codec);
    275 int snd_soc_cache_init(struct snd_soc_codec *codec);
    276 int snd_soc_cache_exit(struct snd_soc_codec *codec);
    277 int snd_soc_cache_write(struct snd_soc_codec *codec,
    278                         unsigned int reg, unsigned int value);
    279 int snd_soc_cache_read(struct snd_soc_codec *codec,
    280                        unsigned int reg, unsigned int *value);
    281 int snd_soc_default_volatile_register(struct snd_soc_codec *codec,
    282                                       unsigned int reg);
    283 int snd_soc_default_readable_register(struct snd_soc_codec *codec,
    284                                       unsigned int reg);
     401int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card);
     402#ifdef CONFIG_PM_SLEEP
     403int snd_soc_suspend(struct device *dev);
     404int snd_soc_resume(struct device *dev);
     405#else
     406static inline int snd_soc_suspend(struct device *dev)
     407{
     408        return 0;
     409}
     410
     411static inline int snd_soc_resume(struct device *dev)
     412{
     413        return 0;
     414}
     415#endif
     416int snd_soc_poweroff(struct device *dev);
     417int snd_soc_component_initialize(struct snd_soc_component *component,
     418                                 const struct snd_soc_component_driver *driver,
     419                                 struct device *dev);
     420int snd_soc_add_component(struct snd_soc_component *component,
     421                          struct snd_soc_dai_driver *dai_drv,
     422                          int num_dai);
     423int snd_soc_register_component(struct device *dev,
     424                         const struct snd_soc_component_driver *component_driver,
     425                         struct snd_soc_dai_driver *dai_drv, int num_dai);
     426int devm_snd_soc_register_component(struct device *dev,
     427                         const struct snd_soc_component_driver *component_driver,
     428                         struct snd_soc_dai_driver *dai_drv, int num_dai);
     429void snd_soc_unregister_component(struct device *dev);
     430void snd_soc_unregister_component_by_driver(struct device *dev,
     431                         const struct snd_soc_component_driver *component_driver);
     432struct snd_soc_component *snd_soc_lookup_component_nolocked(struct device *dev,
     433                                                            const char *driver_name);
     434struct snd_soc_component *snd_soc_lookup_component(struct device *dev,
     435                                                   const char *driver_name);
     436
     437int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num);
     438#ifdef CONFIG_SND_SOC_COMPRESS
     439int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num);
     440#else
     441static inline int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
     442{
     443        return 0;
     444}
     445#endif
     446
     447void snd_soc_disconnect_sync(struct device *dev);
     448
     449struct snd_soc_pcm_runtime *snd_soc_get_pcm_runtime(struct snd_soc_card *card,
     450                                struct snd_soc_dai_link *dai_link);
     451
     452bool snd_soc_runtime_ignore_pmdown_time(struct snd_soc_pcm_runtime *rtd);
     453
     454void snd_soc_runtime_action(struct snd_soc_pcm_runtime *rtd,
     455                            int stream, int action);
     456static inline void snd_soc_runtime_activate(struct snd_soc_pcm_runtime *rtd,
     457                                     int stream)
     458{
     459        snd_soc_runtime_action(rtd, stream, 1);
     460}
     461static inline void snd_soc_runtime_deactivate(struct snd_soc_pcm_runtime *rtd,
     462                                       int stream)
     463{
     464        snd_soc_runtime_action(rtd, stream, -1);
     465}
     466
     467int snd_soc_runtime_calc_hw(struct snd_soc_pcm_runtime *rtd,
     468                            struct snd_pcm_hardware *hw, int stream);
     469
     470int snd_soc_runtime_set_dai_fmt(struct snd_soc_pcm_runtime *rtd,
     471        unsigned int dai_fmt);
     472
     473#ifdef CONFIG_DMI
     474int snd_soc_set_dmi_name(struct snd_soc_card *card, const char *flavour);
     475#else
     476static inline int snd_soc_set_dmi_name(struct snd_soc_card *card,
     477                                       const char *flavour)
     478{
     479        return 0;
     480}
     481#endif
    285482
    286483/* Utility functions to get clock rates from various things */
     
    295492
    296493/* Jack reporting */
    297 int snd_soc_jack_new(struct snd_soc_codec *codec, const char *id, int type,
    298                      struct snd_soc_jack *jack);
    299494void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask);
    300495int snd_soc_jack_add_pins(struct snd_soc_jack *jack, int count,
     
    304499void snd_soc_jack_notifier_unregister(struct snd_soc_jack *jack,
    305500                                      struct notifier_block *nb);
     501int snd_soc_jack_add_zones(struct snd_soc_jack *jack, int count,
     502                          struct snd_soc_jack_zone *zones);
     503int snd_soc_jack_get_type(struct snd_soc_jack *jack, int micbias_voltage);
    306504#ifdef CONFIG_GPIOLIB
    307505int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
    308506                        struct snd_soc_jack_gpio *gpios);
     507int snd_soc_jack_add_gpiods(struct device *gpiod_dev,
     508                            struct snd_soc_jack *jack,
     509                            int count, struct snd_soc_jack_gpio *gpios);
    309510void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count,
    310511                        struct snd_soc_jack_gpio *gpios);
     512#else
     513static inline int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
     514                                         struct snd_soc_jack_gpio *gpios)
     515{
     516        return 0;
     517}
     518
     519static inline int snd_soc_jack_add_gpiods(struct device *gpiod_dev,
     520                                          struct snd_soc_jack *jack,
     521                                          int count,
     522                                          struct snd_soc_jack_gpio *gpios)
     523{
     524        return 0;
     525}
     526
     527static inline void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count,
     528                                           struct snd_soc_jack_gpio *gpios)
     529{
     530}
    311531#endif
    312532
    313 /* codec register bit access */
    314 int snd_soc_update_bits(struct snd_soc_codec *codec, unsigned short reg,
    315                                 unsigned int mask, unsigned int value);
    316 int snd_soc_update_bits_locked(struct snd_soc_codec *codec,
    317                                unsigned short reg, unsigned int mask,
    318                                unsigned int value);
    319 int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned short reg,
    320                                 unsigned int mask, unsigned int value);
    321 
    322 int snd_soc_new_ac97_codec(struct snd_soc_codec *codec,
    323         struct snd_ac97_bus_ops *ops, int num);
    324 void snd_soc_free_ac97_codec(struct snd_soc_codec *codec);
     533struct snd_ac97 *snd_soc_alloc_ac97_component(struct snd_soc_component *component);
     534struct snd_ac97 *snd_soc_new_ac97_component(struct snd_soc_component *component,
     535        unsigned int id, unsigned int id_mask);
     536void snd_soc_free_ac97_component(struct snd_ac97 *ac97);
     537
     538#ifdef CONFIG_SND_SOC_AC97_BUS
     539int snd_soc_set_ac97_ops(struct snd_ac97_bus_ops *ops);
     540int snd_soc_set_ac97_ops_of_reset(struct snd_ac97_bus_ops *ops,
     541                struct platform_device *pdev);
     542
     543extern struct snd_ac97_bus_ops *soc_ac97_ops;
     544#else
     545static inline int snd_soc_set_ac97_ops_of_reset(struct snd_ac97_bus_ops *ops,
     546        struct platform_device *pdev)
     547{
     548        return 0;
     549}
     550
     551static inline int snd_soc_set_ac97_ops(struct snd_ac97_bus_ops *ops)
     552{
     553        return 0;
     554}
     555#endif
    325556
    326557/*
     
    328559 */
    329560struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template,
    330         void *data, char *long_name);
    331 int snd_soc_add_controls(struct snd_soc_codec *codec,
     561                                  void *data, const char *long_name,
     562                                  const char *prefix);
     563int snd_soc_add_component_controls(struct snd_soc_component *component,
     564        const struct snd_kcontrol_new *controls, unsigned int num_controls);
     565int snd_soc_add_card_controls(struct snd_soc_card *soc_card,
     566        const struct snd_kcontrol_new *controls, int num_controls);
     567int snd_soc_add_dai_controls(struct snd_soc_dai *dai,
    332568        const struct snd_kcontrol_new *controls, int num_controls);
    333569int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol,
    334         struct snd_ctl_elem_info *uinfo);
    335 int snd_soc_info_enum_ext(struct snd_kcontrol *kcontrol,
    336570        struct snd_ctl_elem_info *uinfo);
    337571int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol,
     
    339573int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
    340574        struct snd_ctl_elem_value *ucontrol);
    341 int snd_soc_get_value_enum_double(struct snd_kcontrol *kcontrol,
    342         struct snd_ctl_elem_value *ucontrol);
    343 int snd_soc_put_value_enum_double(struct snd_kcontrol *kcontrol,
    344         struct snd_ctl_elem_value *ucontrol);
    345575int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
    346576        struct snd_ctl_elem_info *uinfo);
    347 int snd_soc_info_volsw_ext(struct snd_kcontrol *kcontrol,
    348         struct snd_ctl_elem_info *uinfo);
     577int snd_soc_info_volsw_sx(struct snd_kcontrol *kcontrol,
     578                          struct snd_ctl_elem_info *uinfo);
    349579#define snd_soc_info_bool_ext           snd_ctl_boolean_mono_info
    350580int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
     
    352582int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
    353583        struct snd_ctl_elem_value *ucontrol);
    354 int snd_soc_info_volsw_2r(struct snd_kcontrol *kcontrol,
     584#define snd_soc_get_volsw_2r snd_soc_get_volsw
     585#define snd_soc_put_volsw_2r snd_soc_put_volsw
     586int snd_soc_get_volsw_sx(struct snd_kcontrol *kcontrol,
     587        struct snd_ctl_elem_value *ucontrol);
     588int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
     589        struct snd_ctl_elem_value *ucontrol);
     590int snd_soc_info_volsw_range(struct snd_kcontrol *kcontrol,
    355591        struct snd_ctl_elem_info *uinfo);
    356 int snd_soc_get_volsw_2r(struct snd_kcontrol *kcontrol,
     592int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
    357593        struct snd_ctl_elem_value *ucontrol);
    358 int snd_soc_put_volsw_2r(struct snd_kcontrol *kcontrol,
     594int snd_soc_get_volsw_range(struct snd_kcontrol *kcontrol,
    359595        struct snd_ctl_elem_value *ucontrol);
    360 int snd_soc_info_volsw_s8(struct snd_kcontrol *kcontrol,
     596int snd_soc_limit_volume(struct snd_soc_card *card,
     597        const char *name, int max);
     598int snd_soc_bytes_info(struct snd_kcontrol *kcontrol,
     599                       struct snd_ctl_elem_info *uinfo);
     600int snd_soc_bytes_get(struct snd_kcontrol *kcontrol,
     601                      struct snd_ctl_elem_value *ucontrol);
     602int snd_soc_bytes_put(struct snd_kcontrol *kcontrol,
     603                      struct snd_ctl_elem_value *ucontrol);
     604int snd_soc_bytes_info_ext(struct snd_kcontrol *kcontrol,
     605        struct snd_ctl_elem_info *ucontrol);
     606int snd_soc_bytes_tlv_callback(struct snd_kcontrol *kcontrol, int op_flag,
     607        unsigned int size, unsigned int __user *tlv);
     608int snd_soc_info_xr_sx(struct snd_kcontrol *kcontrol,
    361609        struct snd_ctl_elem_info *uinfo);
    362 int snd_soc_get_volsw_s8(struct snd_kcontrol *kcontrol,
     610int snd_soc_get_xr_sx(struct snd_kcontrol *kcontrol,
    363611        struct snd_ctl_elem_value *ucontrol);
    364 int snd_soc_put_volsw_s8(struct snd_kcontrol *kcontrol,
     612int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol,
    365613        struct snd_ctl_elem_value *ucontrol);
    366 int snd_soc_limit_volume(struct snd_soc_codec *codec,
    367         const char *name, int max);
    368 int snd_soc_info_volsw_2r_sx(struct snd_kcontrol *kcontrol,
    369         struct snd_ctl_elem_info *uinfo);
    370 int snd_soc_get_volsw_2r_sx(struct snd_kcontrol *kcontrol,
     614int snd_soc_get_strobe(struct snd_kcontrol *kcontrol,
    371615        struct snd_ctl_elem_value *ucontrol);
    372 int snd_soc_put_volsw_2r_sx(struct snd_kcontrol *kcontrol,
     616int snd_soc_put_strobe(struct snd_kcontrol *kcontrol,
    373617        struct snd_ctl_elem_value *ucontrol);
    374 
    375 /**
    376  * struct snd_soc_reg_access - Describes whether a given register is
    377  * readable, writable or volatile.
    378  *
    379  * @reg: the register number
    380  * @read: whether this register is readable
    381  * @write: whether this register is writable
    382  * @vol: whether this register is volatile
    383  */
    384 struct snd_soc_reg_access {
    385         u16 reg;
    386         u16 read;
    387         u16 write;
    388         u16 vol;
    389 };
    390618
    391619/**
     
    395623 * @mask:   bits to check for in reported jack status
    396624 * @invert: if non-zero then pin is enabled when status is not reported
     625 * @list:   internal list entry
    397626 */
    398627struct snd_soc_jack_pin {
     
    404633
    405634/**
     635 * struct snd_soc_jack_zone - Describes voltage zones of jack detection
     636 *
     637 * @min_mv: start voltage in mv
     638 * @max_mv: end voltage in mv
     639 * @jack_type: type of jack that is expected for this voltage
     640 * @debounce_time: debounce_time for jack, codec driver should wait for this
     641 *              duration before reading the adc for voltages
     642 * @list:   internal list entry
     643 */
     644struct snd_soc_jack_zone {
     645        unsigned int min_mv;
     646        unsigned int max_mv;
     647        unsigned int jack_type;
     648        unsigned int debounce_time;
     649        struct list_head list;
     650};
     651
     652/**
    406653 * struct snd_soc_jack_gpio - Describes a gpio pin for jack detection
    407654 *
    408  * @gpio:         gpio number
    409  * @name:         gpio name
     655 * @gpio:         legacy gpio number
     656 * @idx:          gpio descriptor index within the function of the GPIO
     657 *                consumer device
     658 * @gpiod_dev:    GPIO consumer device
     659 * @name:         gpio name. Also as connection ID for the GPIO consumer
     660 *                device function name lookup
    410661 * @report:       value to report when jack detected
    411662 * @invert:       report presence in low state
    412  * @debouce_time: debouce time in ms
     663 * @debounce_time: debounce time in ms
     664 * @wake:         enable as wake source
     665 * @jack_status_check: callback function which overrides the detection
     666 *                     to provide more complex checks (eg, reading an
     667 *                     ADC).
    413668 */
    414 #ifdef CONFIG_GPIOLIB
    415669struct snd_soc_jack_gpio {
    416670        unsigned int gpio;
     671        unsigned int idx;
     672        struct device *gpiod_dev;
    417673        const char *name;
    418674        int report;
    419675        int invert;
    420676        int debounce_time;
     677        bool wake;
     678
     679        /* private: */
    421680        struct snd_soc_jack *jack;
    422681        struct delayed_work work;
    423 
    424         int (*jack_status_check)(void);
    425 };
    426 #endif
     682        struct notifier_block pm_notifier;
     683        struct gpio_desc *desc;
     684
     685        void *data;
     686        /* public: */
     687        int (*jack_status_check)(void *data);
     688};
    427689
    428690struct snd_soc_jack {
     691        struct mutex mutex;
    429692        struct snd_jack *jack;
    430         struct snd_soc_codec *codec;
     693        struct snd_soc_card *card;
    431694        struct list_head pins;
    432695        int status;
    433696        struct blocking_notifier_head notifier;
     697        struct list_head jack_zones;
    434698};
    435699
     
    443707        unsigned int channels_min;      /* min channels */
    444708        unsigned int channels_max;      /* max channels */
     709        unsigned int sig_bits;          /* number of bits of content */
    445710};
    446711
     
    455720};
    456721
    457 /* SoC cache ops */
    458 struct snd_soc_cache_ops {
     722struct snd_soc_compr_ops {
     723        int (*startup)(struct snd_compr_stream *);
     724        void (*shutdown)(struct snd_compr_stream *);
     725        int (*set_params)(struct snd_compr_stream *);
     726        int (*trigger)(struct snd_compr_stream *);
     727};
     728
     729struct snd_soc_component*
     730snd_soc_rtdcom_lookup(struct snd_soc_pcm_runtime *rtd,
     731                       const char *driver_name);
     732
     733struct snd_soc_dai_link_component {
    459734        const char *name;
    460         enum snd_soc_compress_type id;
    461         int (*init)(struct snd_soc_codec *codec);
    462         int (*exit)(struct snd_soc_codec *codec);
    463         int (*read)(struct snd_soc_codec *codec, unsigned int reg,
    464                 unsigned int *value);
    465         int (*write)(struct snd_soc_codec *codec, unsigned int reg,
    466                 unsigned int value);
    467         int (*sync)(struct snd_soc_codec *codec);
    468 };
    469 
    470 /* SoC Audio Codec device */
    471 struct snd_soc_codec {
    472         const char *name;
    473         const char *name_prefix;
    474         int id;
    475         struct device *dev;
    476         const struct snd_soc_codec_driver *driver;
    477 
    478         struct mutex mutex;
    479         struct snd_soc_card *card;
    480         struct list_head list;
    481         struct list_head card_list;
    482         int num_dai;
    483         enum snd_soc_compress_type compress_type;
    484         size_t reg_size;        /* reg_cache_size * reg_word_size */
    485         int (*volatile_register)(struct snd_soc_codec *, unsigned int);
    486         int (*readable_register)(struct snd_soc_codec *, unsigned int);
    487 
    488         /* runtime */
    489         struct snd_ac97 *ac97;  /* for ad-hoc ac97 devices */
    490         unsigned int active;
    491         unsigned int cache_only:1;  /* Suppress writes to hardware */
    492         unsigned int cache_sync:1; /* Cache needs to be synced to hardware */
    493         unsigned int suspended:1; /* Codec is in suspend PM state */
    494         unsigned int probed:1; /* Codec has been probed */
    495         unsigned int ac97_registered:1; /* Codec has been AC97 registered */
    496         unsigned int ac97_created:1; /* Codec has been created by SoC */
    497         unsigned int sysfs_registered:1; /* codec has been sysfs registered */
    498         unsigned int cache_init:1; /* codec cache has been initialized */
    499 
    500         /* codec IO */
    501         void *control_data; /* codec control (i2c/3wire) data */
    502         hw_write_t hw_write;
    503         unsigned int (*hw_read)(struct snd_soc_codec *, unsigned int);
    504         unsigned int (*read)(struct snd_soc_codec *, unsigned int);
    505         int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
    506         void *reg_cache;
    507         const void *reg_def_copy;
    508         const struct snd_soc_cache_ops *cache_ops;
    509         struct mutex cache_rw_mutex;
    510 
    511         /* dapm */
    512         struct snd_soc_dapm_context dapm;
    513 
    514 #ifdef CONFIG_DEBUG_FS
    515         struct dentry *debugfs_codec_root;
    516         struct dentry *debugfs_reg;
    517         struct dentry *debugfs_dapm;
    518 #endif
    519 };
    520 
    521 /* codec driver */
    522 struct snd_soc_codec_driver {
    523 
    524         /* driver ops */
    525         int (*probe)(struct snd_soc_codec *);
    526         int (*remove)(struct snd_soc_codec *);
    527         int (*suspend)(struct snd_soc_codec *,
    528                         pm_message_t state);
    529         int (*resume)(struct snd_soc_codec *);
    530 
    531         /* codec IO */
    532         unsigned int (*read)(struct snd_soc_codec *, unsigned int);
    533         int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
    534         int (*display_register)(struct snd_soc_codec *, char *,
    535                                 size_t, unsigned int);
    536         int (*volatile_register)(struct snd_soc_codec *, unsigned int);
    537         int (*readable_register)(struct snd_soc_codec *, unsigned int);
    538         short reg_cache_size;
    539         short reg_cache_step;
    540         short reg_word_size;
    541         const void *reg_cache_default;
    542         short reg_access_size;
    543         const struct snd_soc_reg_access *reg_access_default;
    544         enum snd_soc_compress_type compress_type;
    545 
    546         /* codec bias level */
    547         int (*set_bias_level)(struct snd_soc_codec *,
    548                               enum snd_soc_bias_level level);
    549 };
    550 
    551 /* SoC platform interface */
    552 struct snd_soc_platform_driver {
    553 
    554         int (*probe)(struct snd_soc_platform *);
    555         int (*remove)(struct snd_soc_platform *);
    556         int (*suspend)(struct snd_soc_dai *dai);
    557         int (*resume)(struct snd_soc_dai *dai);
    558 
    559         /* pcm creation and destruction */
    560         int (*pcm_new)(struct snd_card *, struct snd_soc_dai *,
    561                 struct snd_pcm *);
    562         void (*pcm_free)(struct snd_pcm *);
    563 
    564         /*
    565          * For platform caused delay reporting.
    566          * Optional.
    567          */
    568         snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *,
    569                 struct snd_soc_dai *);
    570 
    571         /* platform stream ops */
    572         struct snd_pcm_ops *ops;
    573 };
    574 
    575 struct snd_soc_platform {
    576         const char *name;
    577         int id;
    578         struct device *dev;
    579         struct snd_soc_platform_driver *driver;
    580 
    581         unsigned int suspended:1; /* platform is suspended */
    582         unsigned int probed:1;
    583 
    584         struct snd_soc_card *card;
    585         struct list_head list;
    586         struct list_head card_list;
     735        struct device_node *of_node;
     736        const char *dai_name;
    587737};
    588738
     
    591741        const char *name;                       /* Codec name */
    592742        const char *stream_name;                /* Stream name */
    593         const char *codec_name;         /* for multi-codec */
    594         const char *platform_name;      /* for multi-platform */
    595         const char *cpu_dai_name;
    596         const char *codec_dai_name;
     743
     744        /*
     745         * You MAY specify the link's CPU-side device, either by device name,
     746         * or by DT/OF node, but not both. If this information is omitted,
     747         * the CPU-side DAI is matched using .cpu_dai_name only, which hence
     748         * must be globally unique. These fields are currently typically used
     749         * only for codec to codec links, or systems using device tree.
     750         */
     751        /*
     752         * You MAY specify the DAI name of the CPU DAI. If this information is
     753         * omitted, the CPU-side DAI is matched using .cpu_name/.cpu_of_node
     754         * only, which only works well when that device exposes a single DAI.
     755         */
     756        struct snd_soc_dai_link_component *cpus;
     757        unsigned int num_cpus;
     758
     759        /*
     760         * You MUST specify the link's codec, either by device name, or by
     761         * DT/OF node, but not both.
     762         */
     763        /* You MUST specify the DAI name within the codec */
     764        struct snd_soc_dai_link_component *codecs;
     765        unsigned int num_codecs;
     766
     767        /*
     768         * You MAY specify the link's platform/PCM/DMA driver, either by
     769         * device name, or by DT/OF node, but not both. Some forms of link
     770         * do not need a platform. In such case, platforms are not mandatory.
     771         */
     772        struct snd_soc_dai_link_component *platforms;
     773        unsigned int num_platforms;
     774
     775        int id; /* optional ID for machine driver link identification */
     776
     777        const struct snd_soc_pcm_stream *params;
     778        unsigned int num_params;
     779
     780        unsigned int dai_fmt;           /* format to set on init */
     781
     782        enum snd_soc_dpcm_trigger trigger[2]; /* trigger type for DPCM */
     783
     784        /* codec/machine specific init - e.g. add machine controls */
     785        int (*init)(struct snd_soc_pcm_runtime *rtd);
     786
     787        /* codec/machine specific exit - dual of init() */
     788        void (*exit)(struct snd_soc_pcm_runtime *rtd);
     789
     790        /* optional hw_params re-writing for BE and FE sync */
     791        int (*be_hw_params_fixup)(struct snd_soc_pcm_runtime *rtd,
     792                        struct snd_pcm_hw_params *params);
     793
     794        /* machine stream operations */
     795        const struct snd_soc_ops *ops;
     796        const struct snd_soc_compr_ops *compr_ops;
     797
     798        /* Mark this pcm with non atomic ops */
     799        unsigned int nonatomic:1;
     800
     801        /* For unidirectional dai links */
     802        unsigned int playback_only:1;
     803        unsigned int capture_only:1;
    597804
    598805        /* Keep DAI active over suspend */
     
    601808        /* Symmetry requirements */
    602809        unsigned int symmetric_rates:1;
    603 
    604         /* codec/machine specific init - e.g. add machine controls */
    605         int (*init)(struct snd_soc_pcm_runtime *rtd);
    606 
    607         /* machine stream operations */
    608         struct snd_soc_ops *ops;
    609 };
     810        unsigned int symmetric_channels:1;
     811        unsigned int symmetric_samplebits:1;
     812
     813        /* Do not create a PCM for this DAI link (Backend link) */
     814        unsigned int no_pcm:1;
     815
     816        /* This DAI link can route to other DAI links at runtime (Frontend)*/
     817        unsigned int dynamic:1;
     818
     819        /* DPCM capture and Playback support */
     820        unsigned int dpcm_capture:1;
     821        unsigned int dpcm_playback:1;
     822
     823        /* DPCM used FE & BE merged format */
     824        unsigned int dpcm_merged_format:1;
     825        /* DPCM used FE & BE merged channel */
     826        unsigned int dpcm_merged_chan:1;
     827        /* DPCM used FE & BE merged rate */
     828        unsigned int dpcm_merged_rate:1;
     829
     830        /* pmdown_time is ignored at stop */
     831        unsigned int ignore_pmdown_time:1;
     832
     833        /* Do not create a PCM for this DAI link (Backend link) */
     834        unsigned int ignore:1;
     835
     836#ifdef CONFIG_SND_SOC_TOPOLOGY
     837        struct snd_soc_dobj dobj; /* For topology */
     838#endif
     839};
     840#define for_each_link_codecs(link, i, codec)                            \
     841        for ((i) = 0;                                                   \
     842             ((i) < link->num_codecs) && ((codec) = &link->codecs[i]);  \
     843             (i)++)
     844
     845#define for_each_link_platforms(link, i, platform)                      \
     846        for ((i) = 0;                                                   \
     847             ((i) < link->num_platforms) &&                             \
     848             ((platform) = &link->platforms[i]);                        \
     849             (i)++)
     850
     851#define for_each_link_cpus(link, i, cpu)                                \
     852        for ((i) = 0;                                                   \
     853             ((i) < link->num_cpus) && ((cpu) = &link->cpus[i]);        \
     854             (i)++)
     855
     856/*
     857 * Sample 1 : Single CPU/Codec/Platform
     858 *
     859 * SND_SOC_DAILINK_DEFS(test,
     860 *      DAILINK_COMP_ARRAY(COMP_CPU("cpu_dai")),
     861 *      DAILINK_COMP_ARRAY(COMP_CODEC("codec", "codec_dai")),
     862 *      DAILINK_COMP_ARRAY(COMP_PLATFORM("platform")));
     863 *
     864 * struct snd_soc_dai_link link = {
     865 *      ...
     866 *      SND_SOC_DAILINK_REG(test),
     867 * };
     868 *
     869 * Sample 2 : Multi CPU/Codec, no Platform
     870 *
     871 * SND_SOC_DAILINK_DEFS(test,
     872 *      DAILINK_COMP_ARRAY(COMP_CPU("cpu_dai1"),
     873 *                         COMP_CPU("cpu_dai2")),
     874 *      DAILINK_COMP_ARRAY(COMP_CODEC("codec1", "codec_dai1"),
     875 *                         COMP_CODEC("codec2", "codec_dai2")));
     876 *
     877 * struct snd_soc_dai_link link = {
     878 *      ...
     879 *      SND_SOC_DAILINK_REG(test),
     880 * };
     881 *
     882 * Sample 3 : Define each CPU/Codec/Platform manually
     883 *
     884 * SND_SOC_DAILINK_DEF(test_cpu,
     885 *              DAILINK_COMP_ARRAY(COMP_CPU("cpu_dai1"),
     886 *                                 COMP_CPU("cpu_dai2")));
     887 * SND_SOC_DAILINK_DEF(test_codec,
     888 *              DAILINK_COMP_ARRAY(COMP_CODEC("codec1", "codec_dai1"),
     889 *                                 COMP_CODEC("codec2", "codec_dai2")));
     890 * SND_SOC_DAILINK_DEF(test_platform,
     891 *              DAILINK_COMP_ARRAY(COMP_PLATFORM("platform")));
     892 *
     893 * struct snd_soc_dai_link link = {
     894 *      ...
     895 *      SND_SOC_DAILINK_REG(test_cpu,
     896 *                          test_codec,
     897 *                          test_platform),
     898 * };
     899 *
     900 * Sample 4 : Sample3 without platform
     901 *
     902 * struct snd_soc_dai_link link = {
     903 *      ...
     904 *      SND_SOC_DAILINK_REG(test_cpu,
     905 *                          test_codec);
     906 * };
     907 */
     908
     909#define SND_SOC_DAILINK_REG1(name)       SND_SOC_DAILINK_REG3(name##_cpus, name##_codecs, name##_platforms)
     910#define SND_SOC_DAILINK_REG2(cpu, codec) SND_SOC_DAILINK_REG3(cpu, codec, null_dailink_component)
     911#define SND_SOC_DAILINK_REG3(cpu, codec, platform)      \
     912        .cpus           = cpu,                          \
     913        .num_cpus       = ARRAY_SIZE(cpu),              \
     914        .codecs         = codec,                        \
     915        .num_codecs     = ARRAY_SIZE(codec),            \
     916        .platforms      = platform,                     \
     917        .num_platforms  = ARRAY_SIZE(platform)
     918
     919#define SND_SOC_DAILINK_REGx(_1, _2, _3, func, ...) func
     920#define SND_SOC_DAILINK_REG(...) \
     921        SND_SOC_DAILINK_REGx(__VA_ARGS__,               \
     922                        SND_SOC_DAILINK_REG3,   \
     923                        SND_SOC_DAILINK_REG2,   \
     924                        SND_SOC_DAILINK_REG1)(__VA_ARGS__)
     925
     926#define SND_SOC_DAILINK_DEF(name, def...)               \
     927        static struct snd_soc_dai_link_component name[] = { def }
     928
     929#define SND_SOC_DAILINK_DEFS(name, cpu, codec, platform...)     \
     930        SND_SOC_DAILINK_DEF(name##_cpus, cpu);                  \
     931        SND_SOC_DAILINK_DEF(name##_codecs, codec);              \
     932        SND_SOC_DAILINK_DEF(name##_platforms, platform)
     933
     934#define DAILINK_COMP_ARRAY(param...)    param
     935#define COMP_EMPTY()                    { }
     936#define COMP_CPU(_dai)                  { .dai_name = _dai, }
     937#define COMP_CODEC(_name, _dai)         { .name = _name, .dai_name = _dai, }
     938#define COMP_PLATFORM(_name)            { .name = _name }
     939#define COMP_AUX(_name)                 { .name = _name }
     940#define COMP_CODEC_CONF(_name)          { .name = _name }
     941#define COMP_DUMMY()                    { .name = "snd-soc-dummy", .dai_name = "snd-soc-dummy-dai", }
     942
     943extern struct snd_soc_dai_link_component null_dailink_component[0];
     944
    610945
    611946struct snd_soc_codec_conf {
    612         const char *dev_name;
     947        /*
     948         * specify device either by device name, or by
     949         * DT/OF node, but not both.
     950         */
     951        struct snd_soc_dai_link_component dlc;
    613952
    614953        /*
     
    617956         */
    618957        const char *name_prefix;
    619 
     958};
     959
     960struct snd_soc_aux_dev {
    620961        /*
    621          * set this to the desired compression type if you want to
    622          * override the one supplied in codec->driver->compress_type
     962         * specify multi-codec either by device name, or by
     963         * DT/OF node, but not both.
    623964         */
    624         enum snd_soc_compress_type compress_type;
    625 };
    626 
    627 struct snd_soc_aux_dev {
    628         const char *name;               /* Codec name */
    629         const char *codec_name;         /* for multi-codec */
     965        struct snd_soc_dai_link_component dlc;
    630966
    631967        /* codec/machine specific init - e.g. add machine controls */
    632         int (*init)(struct snd_soc_dapm_context *dapm);
     968        int (*init)(struct snd_soc_component *component);
    633969};
    634970
     
    636972struct snd_soc_card {
    637973        const char *name;
     974        const char *long_name;
     975        const char *driver_name;
     976        const char *components;
     977#ifdef CONFIG_DMI
     978        char dmi_longname[80];
     979#endif /* CONFIG_DMI */
     980        char topology_shortname[32];
     981
    638982        struct device *dev;
    639983        struct snd_card *snd_card;
    640984        struct module *owner;
    641985
    642         struct list_head list;
    643986        struct mutex mutex;
    644 
    645         bool instantiated;
    646 
    647         int (*probe)(struct platform_device *pdev);
    648         int (*remove)(struct platform_device *pdev);
     987        struct mutex dapm_mutex;
     988
     989        /* Mutex for PCM operations */
     990        struct mutex pcm_mutex;
     991        enum snd_soc_pcm_subclass pcm_subclass;
     992
     993        spinlock_t dpcm_lock;
     994
     995        int (*probe)(struct snd_soc_card *card);
     996        int (*late_probe)(struct snd_soc_card *card);
     997        int (*remove)(struct snd_soc_card *card);
    649998
    650999        /* the pre and post PM functions are used to do any PM work before and
    6511000         * after the codec and DAI's do any PM work. */
    652         int (*suspend_pre)(struct platform_device *pdev, pm_message_t state);
    653         int (*suspend_post)(struct platform_device *pdev, pm_message_t state);
    654         int (*resume_pre)(struct platform_device *pdev);
    655         int (*resume_post)(struct platform_device *pdev);
     1001        int (*suspend_pre)(struct snd_soc_card *card);
     1002        int (*suspend_post)(struct snd_soc_card *card);
     1003        int (*resume_pre)(struct snd_soc_card *card);
     1004        int (*resume_post)(struct snd_soc_card *card);
    6561005
    6571006        /* callbacks */
    6581007        int (*set_bias_level)(struct snd_soc_card *,
     1008                              struct snd_soc_dapm_context *dapm,
    6591009                              enum snd_soc_bias_level level);
    6601010        int (*set_bias_level_post)(struct snd_soc_card *,
     1011                                   struct snd_soc_dapm_context *dapm,
    6611012                                   enum snd_soc_bias_level level);
    6621013
     1014        int (*add_dai_link)(struct snd_soc_card *,
     1015                            struct snd_soc_dai_link *link);
     1016        void (*remove_dai_link)(struct snd_soc_card *,
     1017                            struct snd_soc_dai_link *link);
     1018
    6631019        long pmdown_time;
    6641020
    6651021        /* CPU <--> Codec DAI links  */
    666         struct snd_soc_dai_link *dai_link;
    667         int num_links;
    668         struct snd_soc_pcm_runtime *rtd;
     1022        struct snd_soc_dai_link *dai_link;  /* predefined links only */
     1023        int num_links;  /* predefined links only */
     1024
     1025        struct list_head rtd_list;
    6691026        int num_rtd;
    6701027
     
    6791036        struct snd_soc_aux_dev *aux_dev;
    6801037        int num_aux_devs;
    681         struct snd_soc_pcm_runtime *rtd_aux;
    682         int num_aux_rtd;
    683 
    684         struct work_struct deferred_resume_work;
     1038        struct list_head aux_comp_list;
     1039
     1040        const struct snd_kcontrol_new *controls;
     1041        int num_controls;
     1042
     1043        /*
     1044         * Card-specific routes and widgets.
     1045         * Note: of_dapm_xxx for Device Tree; Otherwise for driver build-in.
     1046         */
     1047        const struct snd_soc_dapm_widget *dapm_widgets;
     1048        int num_dapm_widgets;
     1049        const struct snd_soc_dapm_route *dapm_routes;
     1050        int num_dapm_routes;
     1051        const struct snd_soc_dapm_widget *of_dapm_widgets;
     1052        int num_of_dapm_widgets;
     1053        const struct snd_soc_dapm_route *of_dapm_routes;
     1054        int num_of_dapm_routes;
    6851055
    6861056        /* lists of probed devices belonging to this card */
    687         struct list_head codec_dev_list;
    688         struct list_head platform_dev_list;
    689         struct list_head dai_dev_list;
     1057        struct list_head component_dev_list;
     1058        struct list_head list;
    6901059
    6911060        struct list_head widgets;
    6921061        struct list_head paths;
    6931062        struct list_head dapm_list;
     1063        struct list_head dapm_dirty;
     1064
     1065        /* attached dynamic objects */
     1066        struct list_head dobj_list;
     1067
     1068        /* Generic DAPM context for the card */
     1069        struct snd_soc_dapm_context dapm;
     1070        struct snd_soc_dapm_stats dapm_stats;
     1071        struct snd_soc_dapm_update *update;
    6941072
    6951073#ifdef CONFIG_DEBUG_FS
    6961074        struct dentry *debugfs_card_root;
    697         struct dentry *debugfs_pop_time;
     1075#endif
     1076#ifdef CONFIG_PM_SLEEP
     1077        struct work_struct deferred_resume_work;
    6981078#endif
    6991079        u32 pop_time;
    700 };
     1080
     1081        /* bit field */
     1082        unsigned int instantiated:1;
     1083        unsigned int topology_shortname_created:1;
     1084        unsigned int fully_routed:1;
     1085        unsigned int disable_route_checks:1;
     1086        unsigned int probed:1;
     1087
     1088        void *drvdata;
     1089};
     1090#define for_each_card_prelinks(card, i, link)                           \
     1091        for ((i) = 0;                                                   \
     1092             ((i) < (card)->num_links) && ((link) = &(card)->dai_link[i]); \
     1093             (i)++)
     1094#define for_each_card_pre_auxs(card, i, aux)                            \
     1095        for ((i) = 0;                                                   \
     1096             ((i) < (card)->num_aux_devs) && ((aux) = &(card)->aux_dev[i]); \
     1097             (i)++)
     1098
     1099#define for_each_card_rtds(card, rtd)                   \
     1100        list_for_each_entry(rtd, &(card)->rtd_list, list)
     1101#define for_each_card_rtds_safe(card, rtd, _rtd)        \
     1102        list_for_each_entry_safe(rtd, _rtd, &(card)->rtd_list, list)
     1103
     1104#define for_each_card_auxs(card, component)                     \
     1105        list_for_each_entry(component, &card->aux_comp_list, card_aux_list)
     1106#define for_each_card_auxs_safe(card, component, _comp) \
     1107        list_for_each_entry_safe(component, _comp,      \
     1108                                 &card->aux_comp_list, card_aux_list)
     1109
     1110#define for_each_card_components(card, component)                       \
     1111        list_for_each_entry(component, &(card)->component_dev_list, card_list)
     1112
     1113#define for_each_card_dapms(card, dapm)                                 \
     1114        list_for_each_entry(dapm, &card->dapm_list, list)
     1115
     1116#define for_each_card_widgets(card, w)\
     1117        list_for_each_entry(w, &card->widgets, list)
     1118#define for_each_card_widgets_safe(card, w, _w) \
     1119        list_for_each_entry_safe(w, _w, &card->widgets, list)
    7011120
    7021121/* SoC machine DAI configuration, glues a codec and cpu DAI together */
    703 struct snd_soc_pcm_runtime  {
    704         struct device dev;
     1122struct snd_soc_pcm_runtime {
     1123        struct device *dev;
    7051124        struct snd_soc_card *card;
    7061125        struct snd_soc_dai_link *dai_link;
    707 
    708         unsigned int complete:1;
    709         unsigned int dev_registered:1;
    710 
    711         /* Symmetry data - only valid if symmetry is being enforced */
    712         unsigned int rate;
     1126        struct snd_pcm_ops ops;
     1127
     1128        unsigned int params_select; /* currently selected param for dai link */
     1129
     1130        /* Dynamic PCM BE runtime data */
     1131        struct snd_soc_dpcm_runtime dpcm[2];
     1132
    7131133        long pmdown_time;
    7141134
    7151135        /* runtime devices */
    7161136        struct snd_pcm *pcm;
    717         struct snd_soc_codec *codec;
    718         struct snd_soc_platform *platform;
    719         struct snd_soc_dai *codec_dai;
    720         struct snd_soc_dai *cpu_dai;
     1137        struct snd_compr *compr;
     1138
     1139        /*
     1140         * dais = cpu_dai + codec_dai
     1141         * see
     1142         *      soc_new_pcm_runtime()
     1143         *      asoc_rtd_to_cpu()
     1144         *      asoc_rtd_to_codec()
     1145         */
     1146        struct snd_soc_dai **dais;
     1147        unsigned int num_codecs;
     1148        unsigned int num_cpus;
     1149
     1150        struct snd_soc_dapm_widget *playback_widget;
     1151        struct snd_soc_dapm_widget *capture_widget;
    7211152
    7221153        struct delayed_work delayed_work;
    723 };
     1154        void (*close_delayed_work_func)(struct snd_soc_pcm_runtime *rtd);
     1155#ifdef CONFIG_DEBUG_FS
     1156        struct dentry *debugfs_dpcm_root;
     1157#endif
     1158
     1159        unsigned int num; /* 0-based and monotonic increasing */
     1160        struct list_head list; /* rtd list of the soc card */
     1161
     1162        /* function mark */
     1163        struct snd_pcm_substream *mark_startup;
     1164
     1165        /* bit field */
     1166        unsigned int pop_wait:1;
     1167        unsigned int fe_compr:1; /* for Dynamic PCM */
     1168
     1169        int num_components;
     1170        struct snd_soc_component *components[]; /* CPU/Codec/Platform */
     1171};
     1172/* see soc_new_pcm_runtime()  */
     1173#define asoc_rtd_to_cpu(rtd, n)   (rtd)->dais[n]
     1174#define asoc_rtd_to_codec(rtd, n) (rtd)->dais[n + (rtd)->num_cpus]
     1175#define asoc_substream_to_rtd(substream) \
     1176        (struct snd_soc_pcm_runtime *)snd_pcm_substream_chip(substream)
     1177
     1178#define for_each_rtd_components(rtd, i, component)                      \
     1179        for ((i) = 0, component = NULL;                                 \
     1180             ((i) < rtd->num_components) && ((component) = rtd->components[i]);\
     1181             (i)++)
     1182#define for_each_rtd_cpu_dais(rtd, i, dai)                              \
     1183        for ((i) = 0;                                                   \
     1184             ((i) < rtd->num_cpus) && ((dai) = asoc_rtd_to_cpu(rtd, i)); \
     1185             (i)++)
     1186#define for_each_rtd_cpu_dais_rollback(rtd, i, dai)             \
     1187        for (; (--(i) >= 0) && ((dai) = asoc_rtd_to_cpu(rtd, i));)
     1188#define for_each_rtd_codec_dais(rtd, i, dai)                            \
     1189        for ((i) = 0;                                                   \
     1190             ((i) < rtd->num_codecs) && ((dai) = asoc_rtd_to_codec(rtd, i)); \
     1191             (i)++)
     1192#define for_each_rtd_codec_dais_rollback(rtd, i, dai)           \
     1193        for (; (--(i) >= 0) && ((dai) = asoc_rtd_to_codec(rtd, i));)
     1194#define for_each_rtd_dais(rtd, i, dai)                                  \
     1195        for ((i) = 0;                                                   \
     1196             ((i) < (rtd)->num_cpus + (rtd)->num_codecs) &&             \
     1197                     ((dai) = (rtd)->dais[i]);                          \
     1198             (i)++)
     1199#define for_each_rtd_dais_rollback(rtd, i, dai)         \
     1200        for (; (--(i) >= 0) && ((dai) = (rtd)->dais[i]);)
     1201
     1202void snd_soc_close_delayed_work(struct snd_soc_pcm_runtime *rtd);
    7241203
    7251204/* mixer control */
    7261205struct soc_mixer_control {
    7271206        int min, max, platform_max;
    728         unsigned int reg, rreg, shift, rshift, invert;
     1207        int reg, rreg;
     1208        unsigned int shift, rshift;
     1209        unsigned int sign_bit;
     1210        unsigned int invert:1;
     1211        unsigned int autodisable:1;
     1212#ifdef CONFIG_SND_SOC_TOPOLOGY
     1213        struct snd_soc_dobj dobj;
     1214#endif
     1215};
     1216
     1217struct soc_bytes {
     1218        int base;
     1219        int num_regs;
     1220        u32 mask;
     1221};
     1222
     1223struct soc_bytes_ext {
     1224        int max;
     1225#ifdef CONFIG_SND_SOC_TOPOLOGY
     1226        struct snd_soc_dobj dobj;
     1227#endif
     1228        /* used for TLV byte control */
     1229        int (*get)(struct snd_kcontrol *kcontrol, unsigned int __user *bytes,
     1230                        unsigned int size);
     1231        int (*put)(struct snd_kcontrol *kcontrol, const unsigned int __user *bytes,
     1232                        unsigned int size);
     1233};
     1234
     1235/* multi register control */
     1236struct soc_mreg_control {
     1237        long min, max;
     1238        unsigned int regbase, regcount, nbits, invert;
    7291239};
    7301240
    7311241/* enumerated kcontrol */
    7321242struct soc_enum {
    733         unsigned short reg;
    734         unsigned short reg2;
     1243        int reg;
    7351244        unsigned char shift_l;
    7361245        unsigned char shift_r;
    737         unsigned int max;
     1246        unsigned int items;
    7381247        unsigned int mask;
    739         const char **texts;
     1248        const char * const *texts;
    7401249        const unsigned int *values;
    741         void *dapm;
    742 };
    743 
    744 /* codec IO */
    745 unsigned int snd_soc_read(struct snd_soc_codec *codec, unsigned int reg);
    746 unsigned int snd_soc_write(struct snd_soc_codec *codec,
    747                            unsigned int reg, unsigned int val);
    748 
    749 /* device driver data */
    750 
    751 static inline void snd_soc_codec_set_drvdata(struct snd_soc_codec *codec,
    752                 void *data)
    753 {
    754         dev_set_drvdata(codec->dev, data);
    755 }
    756 
    757 static inline void *snd_soc_codec_get_drvdata(struct snd_soc_codec *codec)
    758 {
    759         return dev_get_drvdata(codec->dev);
    760 }
    761 
    762 static inline void snd_soc_platform_set_drvdata(struct snd_soc_platform *platform,
    763                 void *data)
    764 {
    765         dev_set_drvdata(platform->dev, data);
    766 }
    767 
    768 static inline void *snd_soc_platform_get_drvdata(struct snd_soc_platform *platform)
    769 {
    770         return dev_get_drvdata(platform->dev);
    771 }
    772 
    773 static inline void snd_soc_pcm_set_drvdata(struct snd_soc_pcm_runtime *rtd,
    774                 void *data)
    775 {
    776         dev_set_drvdata(&rtd->dev, data);
    777 }
    778 
    779 static inline void *snd_soc_pcm_get_drvdata(struct snd_soc_pcm_runtime *rtd)
    780 {
    781         return dev_get_drvdata(&rtd->dev);
    782 }
    783 
    784 static inline void snd_soc_initialize_card_lists(struct snd_soc_card *card)
    785 {
    786         INIT_LIST_HEAD(&card->dai_dev_list);
    787         INIT_LIST_HEAD(&card->codec_dev_list);
    788         INIT_LIST_HEAD(&card->platform_dev_list);
    789         INIT_LIST_HEAD(&card->widgets);
    790         INIT_LIST_HEAD(&card->paths);
    791         INIT_LIST_HEAD(&card->dapm_list);
    792 }
     1250        unsigned int autodisable:1;
     1251#ifdef CONFIG_SND_SOC_TOPOLOGY
     1252        struct snd_soc_dobj dobj;
     1253#endif
     1254};
     1255
     1256static inline bool snd_soc_volsw_is_stereo(struct soc_mixer_control *mc)
     1257{
     1258        if (mc->reg == mc->rreg && mc->shift == mc->rshift)
     1259                return false;
     1260        /*
     1261         * mc->reg == mc->rreg && mc->shift != mc->rshift, or
     1262         * mc->reg != mc->rreg means that the control is
     1263         * stereo (bits in one register or in two registers)
     1264         */
     1265        return true;
     1266}
     1267
     1268static inline unsigned int snd_soc_enum_val_to_item(struct soc_enum *e,
     1269        unsigned int val)
     1270{
     1271        unsigned int i;
     1272
     1273        if (!e->values)
     1274                return val;
     1275
     1276        for (i = 0; i < e->items; i++)
     1277                if (val == e->values[i])
     1278                        return i;
     1279
     1280        return 0;
     1281}
     1282
     1283static inline unsigned int snd_soc_enum_item_to_val(struct soc_enum *e,
     1284        unsigned int item)
     1285{
     1286        if (!e->values)
     1287                return item;
     1288
     1289        return e->values[item];
     1290}
     1291
     1292/**
     1293 * snd_soc_kcontrol_component() - Returns the component that registered the
     1294 *  control
     1295 * @kcontrol: The control for which to get the component
     1296 *
     1297 * Note: This function will work correctly if the control has been registered
     1298 * for a component. With snd_soc_add_codec_controls() or via table based
     1299 * setup for either a CODEC or component driver. Otherwise the behavior is
     1300 * undefined.
     1301 */
     1302static inline struct snd_soc_component *snd_soc_kcontrol_component(
     1303        struct snd_kcontrol *kcontrol)
     1304{
     1305        return snd_kcontrol_chip(kcontrol);
     1306}
     1307
     1308int snd_soc_util_init(void);
     1309void snd_soc_util_exit(void);
     1310
     1311int snd_soc_of_parse_card_name(struct snd_soc_card *card,
     1312                               const char *propname);
     1313int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card,
     1314                                          const char *propname);
     1315int snd_soc_of_get_slot_mask(struct device_node *np,
     1316                             const char *prop_name,
     1317                             unsigned int *mask);
     1318int snd_soc_of_parse_tdm_slot(struct device_node *np,
     1319                              unsigned int *tx_mask,
     1320                              unsigned int *rx_mask,
     1321                              unsigned int *slots,
     1322                              unsigned int *slot_width);
     1323void snd_soc_of_parse_node_prefix(struct device_node *np,
     1324                                   struct snd_soc_codec_conf *codec_conf,
     1325                                   struct device_node *of_node,
     1326                                   const char *propname);
     1327static inline
     1328void snd_soc_of_parse_audio_prefix(struct snd_soc_card *card,
     1329                                   struct snd_soc_codec_conf *codec_conf,
     1330                                   struct device_node *of_node,
     1331                                   const char *propname)
     1332{
     1333        snd_soc_of_parse_node_prefix(card->dev->of_node,
     1334                                     codec_conf, of_node, propname);
     1335}
     1336
     1337int snd_soc_of_parse_audio_routing(struct snd_soc_card *card,
     1338                                   const char *propname);
     1339int snd_soc_of_parse_aux_devs(struct snd_soc_card *card, const char *propname);
     1340unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
     1341                                     const char *prefix,
     1342                                     struct device_node **bitclkmaster,
     1343                                     struct device_node **framemaster);
     1344int snd_soc_get_dai_id(struct device_node *ep);
     1345int snd_soc_get_dai_name(struct of_phandle_args *args,
     1346                         const char **dai_name);
     1347int snd_soc_of_get_dai_name(struct device_node *of_node,
     1348                            const char **dai_name);
     1349int snd_soc_of_get_dai_link_codecs(struct device *dev,
     1350                                   struct device_node *of_node,
     1351                                   struct snd_soc_dai_link *dai_link);
     1352void snd_soc_of_put_dai_link_codecs(struct snd_soc_dai_link *dai_link);
     1353
     1354int snd_soc_add_pcm_runtime(struct snd_soc_card *card,
     1355                            struct snd_soc_dai_link *dai_link);
     1356void snd_soc_remove_pcm_runtime(struct snd_soc_card *card,
     1357                                struct snd_soc_pcm_runtime *rtd);
     1358
     1359struct snd_soc_dai *snd_soc_register_dai(struct snd_soc_component *component,
     1360                                         struct snd_soc_dai_driver *dai_drv,
     1361                                         bool legacy_dai_naming);
     1362struct snd_soc_dai *devm_snd_soc_register_dai(struct device *dev,
     1363                                              struct snd_soc_component *component,
     1364                                              struct snd_soc_dai_driver *dai_drv,
     1365                                              bool legacy_dai_naming);
     1366void snd_soc_unregister_dai(struct snd_soc_dai *dai);
     1367
     1368struct snd_soc_dai *snd_soc_find_dai(
     1369        const struct snd_soc_dai_link_component *dlc);
     1370struct snd_soc_dai *snd_soc_find_dai_with_mutex(
     1371        const struct snd_soc_dai_link_component *dlc);
    7931372
    7941373#include <sound/soc-dai.h>
     1374
     1375static inline
     1376int snd_soc_fixup_dai_links_platform_name(struct snd_soc_card *card,
     1377                                          const char *platform_name)
     1378{
     1379        struct snd_soc_dai_link *dai_link;
     1380        const char *name;
     1381        int i;
     1382
     1383        if (!platform_name) /* nothing to do */
     1384                return 0;
     1385
     1386        /* set platform name for each dailink */
     1387        for_each_card_prelinks(card, i, dai_link) {
     1388                name = devm_kstrdup(card->dev, platform_name, GFP_KERNEL);
     1389                if (!name)
     1390                        return -ENOMEM;
     1391
     1392                if (!dai_link->platforms)
     1393                        return -EINVAL;
     1394
     1395                /* only single platform is supported for now */
     1396                dai_link->platforms->name = name;
     1397        }
     1398
     1399        return 0;
     1400}
    7951401
    7961402#ifdef CONFIG_DEBUG_FS
     
    7981404#endif
    7991405
     1406extern const struct dev_pm_ops snd_soc_pm_ops;
     1407
     1408/* Helper functions */
     1409static inline void snd_soc_dapm_mutex_lock(struct snd_soc_dapm_context *dapm)
     1410{
     1411        mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
     1412}
     1413
     1414static inline void snd_soc_dapm_mutex_unlock(struct snd_soc_dapm_context *dapm)
     1415{
     1416        mutex_unlock(&dapm->card->dapm_mutex);
     1417}
     1418
     1419#include <sound/soc-component.h>
     1420#include <sound/soc-card.h>
     1421
    8001422#endif
Note: See TracChangeset for help on using the changeset viewer.