linux/include/sound/soc.h
<<
>>
Prefs
   1/*
   2 * linux/sound/soc.h -- ALSA SoC Layer
   3 *
   4 * Author:              Liam Girdwood
   5 * Created:             Aug 11th 2005
   6 * 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.
  11 */
  12
  13#ifndef __LINUX_SND_SOC_H
  14#define __LINUX_SND_SOC_H
  15
  16#include <linux/platform_device.h>
  17#include <linux/types.h>
  18#include <linux/notifier.h>
  19#include <linux/workqueue.h>
  20#include <linux/interrupt.h>
  21#include <linux/kernel.h>
  22#include <sound/core.h>
  23#include <sound/pcm.h>
  24#include <sound/control.h>
  25#include <sound/ac97_codec.h>
  26
  27/*
  28 * Convenience kcontrol builders
  29 */
  30#define SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert) \
  31        ((unsigned long)&(struct soc_mixer_control) \
  32        {.reg = xreg, .shift = xshift, .rshift = xshift, .max = xmax, \
  33        .platform_max = xmax, .invert = xinvert})
  34#define SOC_SINGLE_VALUE_EXT(xreg, xmax, xinvert) \
  35        ((unsigned long)&(struct soc_mixer_control) \
  36        {.reg = xreg, .max = xmax, .platform_max = xmax, .invert = xinvert})
  37#define SOC_SINGLE(xname, reg, shift, max, invert) \
  38{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
  39        .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
  40        .put = snd_soc_put_volsw, \
  41        .private_value =  SOC_SINGLE_VALUE(reg, shift, max, invert) }
  42#define SOC_SINGLE_TLV(xname, reg, shift, max, invert, tlv_array) \
  43{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
  44        .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
  45                 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
  46        .tlv.p = (tlv_array), \
  47        .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
  48        .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) \
  51{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
  52        .info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \
  53        .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} }
  57#define SOC_DOUBLE_R(xname, reg_left, reg_right, xshift, xmax, xinvert) \
  58{       .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) \
  65{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
  66        .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
  67                 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
  68        .tlv.p = (tlv_array), \
  69        .info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \
  70        .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} }
  74#define SOC_DOUBLE_R_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert, tlv_array) \
  75{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
  76        .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
  77                 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
  78        .tlv.p = (tlv_array), \
  79        .info = snd_soc_info_volsw_2r, \
  80        .get = snd_soc_get_volsw_2r, .put = snd_soc_put_volsw_2r, \
  81        .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} }
  84#define SOC_DOUBLE_S8_TLV(xname, xreg, xmin, xmax, tlv_array) \
  85{       .iface  = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
  86        .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
  87                  SNDRV_CTL_ELEM_ACCESS_READWRITE, \
  88        .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) \
  95{       .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) \
 102{       .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)
 106#define SOC_ENUM(xname, xenum) \
 107{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\
 108        .info = snd_soc_info_enum_double, \
 109        .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, \
 116        .private_value = (unsigned long)&xenum }
 117#define SOC_SINGLE_EXT(xname, xreg, xshift, xmax, xinvert,\
 118         xhandler_get, xhandler_put) \
 119{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
 120        .info = snd_soc_info_volsw, \
 121        .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,\
 124         xhandler_get, xhandler_put) \
 125{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
 126        .info = snd_soc_info_volsw, \
 127        .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} }
 131#define SOC_SINGLE_EXT_TLV(xname, xreg, xshift, xmax, xinvert,\
 132         xhandler_get, xhandler_put, tlv_array) \
 133{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
 134        .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
 135                 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
 136        .tlv.p = (tlv_array), \
 137        .info = snd_soc_info_volsw, \
 138        .get = xhandler_get, .put = xhandler_put, \
 139        .private_value = SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert) }
 140#define SOC_DOUBLE_EXT_TLV(xname, xreg, shift_left, shift_right, xmax, xinvert,\
 141         xhandler_get, xhandler_put, tlv_array) \
 142{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
 143        .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
 144                 SNDRV_CTL_ELEM_ACCESS_READWRITE, \
 145        .tlv.p = (tlv_array), \
 146        .info = snd_soc_info_volsw, \
 147        .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} }
 151#define SOC_DOUBLE_R_EXT_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert,\
 152         xhandler_get, xhandler_put, tlv_array) \
 153{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
 154        .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
 155                 SNDRV_CTL_ELEM_ACCESS_READWRITE, \
 156        .tlv.p = (tlv_array), \
 157        .info = snd_soc_info_volsw_2r, \
 158        .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} }
 162#define SOC_SINGLE_BOOL_EXT(xname, xdata, xhandler_get, xhandler_put) \
 163{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
 164        .info = snd_soc_info_bool_ext, \
 165        .get = xhandler_get, .put = xhandler_put, \
 166        .private_value = xdata }
 167#define SOC_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put) \
 168{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
 169        .info = snd_soc_info_enum_ext, \
 170        .get = xhandler_get, .put = xhandler_put, \
 171        .private_value = (unsigned long)&xenum }
 172
 173#define SOC_DOUBLE_R_SX_TLV(xname, xreg_left, xreg_right, xshift,\
 174                xmin, xmax, tlv_array) \
 175{       .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
 187
 188/*
 189 * Simplified versions of above macros, declaring a struct and calculating
 190 * ARRAY_SIZE internally
 191 */
 192#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, \
 194                                                ARRAY_SIZE(xtexts), xtexts)
 195#define SOC_ENUM_SINGLE_DECL(name, xreg, xshift, xtexts) \
 196        SOC_ENUM_DOUBLE_DECL(name, xreg, xshift, xshift, xtexts)
 197#define SOC_ENUM_SINGLE_EXT_DECL(name, xtexts) \
 198        struct soc_enum name = SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(xtexts), xtexts)
 199#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, \
 201                                                        ARRAY_SIZE(xtexts), xtexts, xvalues)
 202#define SOC_VALUE_ENUM_SINGLE_DECL(name, xreg, xshift, xmask, xtexts, xvalues) \
 203        SOC_VALUE_ENUM_DOUBLE_DECL(name, xreg, xshift, xshift, xmask, xtexts, xvalues)
 204
 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 */
 216enum 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
 223struct snd_jack;
 224struct snd_soc_card;
 225struct snd_soc_pcm_stream;
 226struct snd_soc_ops;
 227struct snd_soc_pcm_runtime;
 228struct snd_soc_dai;
 229struct snd_soc_dai_driver;
 230struct snd_soc_platform;
 231struct snd_soc_dai_link;
 232struct snd_soc_platform_driver;
 233struct snd_soc_codec;
 234struct snd_soc_codec_driver;
 235struct soc_enum;
 236struct snd_soc_jack;
 237struct snd_soc_jack_zone;
 238struct snd_soc_jack_pin;
 239struct snd_soc_cache_ops;
 240#include <sound/soc-dapm.h>
 241
 242#ifdef CONFIG_GPIOLIB
 243struct snd_soc_jack_gpio;
 244#endif
 245
 246typedef int (*hw_write_t)(void *,const char* ,int);
 247
 248extern struct snd_ac97_bus_ops soc_ac97_ops;
 249
 250enum snd_soc_control_type {
 251        SND_SOC_CUSTOM,
 252        SND_SOC_I2C,
 253        SND_SOC_SPI,
 254};
 255
 256enum snd_soc_compress_type {
 257        SND_SOC_FLAT_COMPRESSION = 1,
 258        SND_SOC_LZO_COMPRESSION,
 259        SND_SOC_RBTREE_COMPRESSION
 260};
 261
 262int snd_soc_codec_set_sysclk(struct snd_soc_codec *codec, int clk_id,
 263                             unsigned int freq, int dir);
 264int snd_soc_codec_set_pll(struct snd_soc_codec *codec, int pll_id, int source,
 265                          unsigned int freq_in, unsigned int freq_out);
 266
 267int snd_soc_register_card(struct snd_soc_card *card);
 268int snd_soc_unregister_card(struct snd_soc_card *card);
 269int snd_soc_suspend(struct device *dev);
 270int snd_soc_resume(struct device *dev);
 271int snd_soc_poweroff(struct device *dev);
 272int snd_soc_register_platform(struct device *dev,
 273                struct snd_soc_platform_driver *platform_drv);
 274void snd_soc_unregister_platform(struct device *dev);
 275int snd_soc_register_codec(struct device *dev,
 276                const struct snd_soc_codec_driver *codec_drv,
 277                struct snd_soc_dai_driver *dai_drv, int num_dai);
 278void snd_soc_unregister_codec(struct device *dev);
 279int snd_soc_codec_volatile_register(struct snd_soc_codec *codec,
 280                                    unsigned int reg);
 281int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
 282                               int addr_bits, int data_bits,
 283                               enum snd_soc_control_type control);
 284int snd_soc_cache_sync(struct snd_soc_codec *codec);
 285int snd_soc_cache_init(struct snd_soc_codec *codec);
 286int snd_soc_cache_exit(struct snd_soc_codec *codec);
 287int snd_soc_cache_write(struct snd_soc_codec *codec,
 288                        unsigned int reg, unsigned int value);
 289int snd_soc_cache_read(struct snd_soc_codec *codec,
 290                       unsigned int reg, unsigned int *value);
 291int snd_soc_default_volatile_register(struct snd_soc_codec *codec,
 292                                      unsigned int reg);
 293int snd_soc_default_readable_register(struct snd_soc_codec *codec,
 294                                      unsigned int reg);
 295
 296/* Utility functions to get clock rates from various things */
 297int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots);
 298int snd_soc_params_to_frame_size(struct snd_pcm_hw_params *params);
 299int snd_soc_calc_bclk(int fs, int sample_size, int channels, int tdm_slots);
 300int snd_soc_params_to_bclk(struct snd_pcm_hw_params *parms);
 301
 302/* set runtime hw params */
 303int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,
 304        const struct snd_pcm_hardware *hw);
 305
 306/* Jack reporting */
 307int snd_soc_jack_new(struct snd_soc_codec *codec, const char *id, int type,
 308                     struct snd_soc_jack *jack);
 309void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask);
 310int snd_soc_jack_add_pins(struct snd_soc_jack *jack, int count,
 311                          struct snd_soc_jack_pin *pins);
 312void snd_soc_jack_notifier_register(struct snd_soc_jack *jack,
 313                                    struct notifier_block *nb);
 314void snd_soc_jack_notifier_unregister(struct snd_soc_jack *jack,
 315                                      struct notifier_block *nb);
 316int snd_soc_jack_add_zones(struct snd_soc_jack *jack, int count,
 317                          struct snd_soc_jack_zone *zones);
 318int snd_soc_jack_get_type(struct snd_soc_jack *jack, int micbias_voltage);
 319#ifdef CONFIG_GPIOLIB
 320int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
 321                        struct snd_soc_jack_gpio *gpios);
 322void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count,
 323                        struct snd_soc_jack_gpio *gpios);
 324#endif
 325
 326/* codec register bit access */
 327int snd_soc_update_bits(struct snd_soc_codec *codec, unsigned short reg,
 328                                unsigned int mask, unsigned int value);
 329int snd_soc_update_bits_locked(struct snd_soc_codec *codec,
 330                               unsigned short reg, unsigned int mask,
 331                               unsigned int value);
 332int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned short reg,
 333                                unsigned int mask, unsigned int value);
 334
 335int snd_soc_new_ac97_codec(struct snd_soc_codec *codec,
 336        struct snd_ac97_bus_ops *ops, int num);
 337void snd_soc_free_ac97_codec(struct snd_soc_codec *codec);
 338
 339/*
 340 *Controls
 341 */
 342struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template,
 343                                  void *data, char *long_name,
 344                                  const char *prefix);
 345int snd_soc_add_controls(struct snd_soc_codec *codec,
 346        const struct snd_kcontrol_new *controls, int num_controls);
 347int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol,
 348        struct snd_ctl_elem_info *uinfo);
 349int snd_soc_info_enum_ext(struct snd_kcontrol *kcontrol,
 350        struct snd_ctl_elem_info *uinfo);
 351int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol,
 352        struct snd_ctl_elem_value *ucontrol);
 353int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
 354        struct snd_ctl_elem_value *ucontrol);
 355int snd_soc_get_value_enum_double(struct snd_kcontrol *kcontrol,
 356        struct snd_ctl_elem_value *ucontrol);
 357int snd_soc_put_value_enum_double(struct snd_kcontrol *kcontrol,
 358        struct snd_ctl_elem_value *ucontrol);
 359int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
 360        struct snd_ctl_elem_info *uinfo);
 361int snd_soc_info_volsw_ext(struct snd_kcontrol *kcontrol,
 362        struct snd_ctl_elem_info *uinfo);
 363#define snd_soc_info_bool_ext           snd_ctl_boolean_mono_info
 364int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
 365        struct snd_ctl_elem_value *ucontrol);
 366int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
 367        struct snd_ctl_elem_value *ucontrol);
 368int snd_soc_info_volsw_2r(struct snd_kcontrol *kcontrol,
 369        struct snd_ctl_elem_info *uinfo);
 370int snd_soc_get_volsw_2r(struct snd_kcontrol *kcontrol,
 371        struct snd_ctl_elem_value *ucontrol);
 372int snd_soc_put_volsw_2r(struct snd_kcontrol *kcontrol,
 373        struct snd_ctl_elem_value *ucontrol);
 374int snd_soc_info_volsw_s8(struct snd_kcontrol *kcontrol,
 375        struct snd_ctl_elem_info *uinfo);
 376int snd_soc_get_volsw_s8(struct snd_kcontrol *kcontrol,
 377        struct snd_ctl_elem_value *ucontrol);
 378int snd_soc_put_volsw_s8(struct snd_kcontrol *kcontrol,
 379        struct snd_ctl_elem_value *ucontrol);
 380int snd_soc_limit_volume(struct snd_soc_codec *codec,
 381        const char *name, int max);
 382int snd_soc_info_volsw_2r_sx(struct snd_kcontrol *kcontrol,
 383        struct snd_ctl_elem_info *uinfo);
 384int snd_soc_get_volsw_2r_sx(struct snd_kcontrol *kcontrol,
 385        struct snd_ctl_elem_value *ucontrol);
 386int snd_soc_put_volsw_2r_sx(struct snd_kcontrol *kcontrol,
 387        struct snd_ctl_elem_value *ucontrol);
 388
 389/**
 390 * struct snd_soc_reg_access - Describes whether a given register is
 391 * readable, writable or volatile.
 392 *
 393 * @reg: the register number
 394 * @read: whether this register is readable
 395 * @write: whether this register is writable
 396 * @vol: whether this register is volatile
 397 */
 398struct snd_soc_reg_access {
 399        u16 reg;
 400        u16 read;
 401        u16 write;
 402        u16 vol;
 403};
 404
 405/**
 406 * struct snd_soc_jack_pin - Describes a pin to update based on jack detection
 407 *
 408 * @pin:    name of the pin to update
 409 * @mask:   bits to check for in reported jack status
 410 * @invert: if non-zero then pin is enabled when status is not reported
 411 */
 412struct snd_soc_jack_pin {
 413        struct list_head list;
 414        const char *pin;
 415        int mask;
 416        bool invert;
 417};
 418
 419/**
 420 * struct snd_soc_jack_zone - Describes voltage zones of jack detection
 421 *
 422 * @min_mv: start voltage in mv
 423 * @max_mv: end voltage in mv
 424 * @jack_type: type of jack that is expected for this voltage
 425 * @debounce_time: debounce_time for jack, codec driver should wait for this
 426 *              duration before reading the adc for voltages
 427 * @:list: list container
 428 */
 429struct snd_soc_jack_zone {
 430        unsigned int min_mv;
 431        unsigned int max_mv;
 432        unsigned int jack_type;
 433        unsigned int debounce_time;
 434        struct list_head list;
 435};
 436
 437/**
 438 * struct snd_soc_jack_gpio - Describes a gpio pin for jack detection
 439 *
 440 * @gpio:         gpio number
 441 * @name:         gpio name
 442 * @report:       value to report when jack detected
 443 * @invert:       report presence in low state
 444 * @debouce_time: debouce time in ms
 445 * @wake:         enable as wake source
 446 * @jack_status_check: callback function which overrides the detection
 447 *                     to provide more complex checks (eg, reading an
 448 *                     ADC).
 449 */
 450#ifdef CONFIG_GPIOLIB
 451struct snd_soc_jack_gpio {
 452        unsigned int gpio;
 453        const char *name;
 454        int report;
 455        int invert;
 456        int debounce_time;
 457        bool wake;
 458
 459        struct snd_soc_jack *jack;
 460        struct delayed_work work;
 461
 462        int (*jack_status_check)(void);
 463};
 464#endif
 465
 466struct snd_soc_jack {
 467        struct snd_jack *jack;
 468        struct snd_soc_codec *codec;
 469        struct list_head pins;
 470        int status;
 471        struct blocking_notifier_head notifier;
 472        struct list_head jack_zones;
 473};
 474
 475/* SoC PCM stream information */
 476struct snd_soc_pcm_stream {
 477        const char *stream_name;
 478        u64 formats;                    /* SNDRV_PCM_FMTBIT_* */
 479        unsigned int rates;             /* SNDRV_PCM_RATE_* */
 480        unsigned int rate_min;          /* min rate */
 481        unsigned int rate_max;          /* max rate */
 482        unsigned int channels_min;      /* min channels */
 483        unsigned int channels_max;      /* max channels */
 484};
 485
 486/* SoC audio ops */
 487struct snd_soc_ops {
 488        int (*startup)(struct snd_pcm_substream *);
 489        void (*shutdown)(struct snd_pcm_substream *);
 490        int (*hw_params)(struct snd_pcm_substream *, struct snd_pcm_hw_params *);
 491        int (*hw_free)(struct snd_pcm_substream *);
 492        int (*prepare)(struct snd_pcm_substream *);
 493        int (*trigger)(struct snd_pcm_substream *, int);
 494};
 495
 496/* SoC cache ops */
 497struct snd_soc_cache_ops {
 498        const char *name;
 499        enum snd_soc_compress_type id;
 500        int (*init)(struct snd_soc_codec *codec);
 501        int (*exit)(struct snd_soc_codec *codec);
 502        int (*read)(struct snd_soc_codec *codec, unsigned int reg,
 503                unsigned int *value);
 504        int (*write)(struct snd_soc_codec *codec, unsigned int reg,
 505                unsigned int value);
 506        int (*sync)(struct snd_soc_codec *codec);
 507};
 508
 509/* SoC Audio Codec device */
 510struct snd_soc_codec {
 511        const char *name;
 512        const char *name_prefix;
 513        int id;
 514        struct device *dev;
 515        const struct snd_soc_codec_driver *driver;
 516
 517        struct mutex mutex;
 518        struct snd_soc_card *card;
 519        struct list_head list;
 520        struct list_head card_list;
 521        int num_dai;
 522        enum snd_soc_compress_type compress_type;
 523        size_t reg_size;        /* reg_cache_size * reg_word_size */
 524        int (*volatile_register)(struct snd_soc_codec *, unsigned int);
 525        int (*readable_register)(struct snd_soc_codec *, unsigned int);
 526
 527        /* runtime */
 528        struct snd_ac97 *ac97;  /* for ad-hoc ac97 devices */
 529        unsigned int active;
 530        unsigned int cache_bypass:1; /* Suppress access to the cache */
 531        unsigned int suspended:1; /* Codec is in suspend PM state */
 532        unsigned int probed:1; /* Codec has been probed */
 533        unsigned int ac97_registered:1; /* Codec has been AC97 registered */
 534        unsigned int ac97_created:1; /* Codec has been created by SoC */
 535        unsigned int sysfs_registered:1; /* codec has been sysfs registered */
 536        unsigned int cache_init:1; /* codec cache has been initialized */
 537        u32 cache_only;  /* Suppress writes to hardware */
 538        u32 cache_sync; /* Cache needs to be synced to hardware */
 539
 540        /* codec IO */
 541        void *control_data; /* codec control (i2c/3wire) data */
 542        hw_write_t hw_write;
 543        unsigned int (*hw_read)(struct snd_soc_codec *, unsigned int);
 544        unsigned int (*read)(struct snd_soc_codec *, unsigned int);
 545        int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
 546        void *reg_cache;
 547        const void *reg_def_copy;
 548        const struct snd_soc_cache_ops *cache_ops;
 549        struct mutex cache_rw_mutex;
 550
 551        /* dapm */
 552        struct snd_soc_dapm_context dapm;
 553
 554#ifdef CONFIG_DEBUG_FS
 555        struct dentry *debugfs_codec_root;
 556        struct dentry *debugfs_reg;
 557        struct dentry *debugfs_dapm;
 558#endif
 559};
 560
 561/* codec driver */
 562struct snd_soc_codec_driver {
 563
 564        /* driver ops */
 565        int (*probe)(struct snd_soc_codec *);
 566        int (*remove)(struct snd_soc_codec *);
 567        int (*suspend)(struct snd_soc_codec *,
 568                        pm_message_t state);
 569        int (*resume)(struct snd_soc_codec *);
 570
 571        /* Default DAPM setup, added after probe() is run */
 572        const struct snd_soc_dapm_widget *dapm_widgets;
 573        int num_dapm_widgets;
 574        const struct snd_soc_dapm_route *dapm_routes;
 575        int num_dapm_routes;
 576
 577        /* codec wide operations */
 578        int (*set_sysclk)(struct snd_soc_codec *codec,
 579                          int clk_id, unsigned int freq, int dir);
 580        int (*set_pll)(struct snd_soc_codec *codec, int pll_id, int source,
 581                unsigned int freq_in, unsigned int freq_out);
 582
 583        /* codec IO */
 584        unsigned int (*read)(struct snd_soc_codec *, unsigned int);
 585        int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
 586        int (*display_register)(struct snd_soc_codec *, char *,
 587                                size_t, unsigned int);
 588        int (*volatile_register)(struct snd_soc_codec *, unsigned int);
 589        int (*readable_register)(struct snd_soc_codec *, unsigned int);
 590        short reg_cache_size;
 591        short reg_cache_step;
 592        short reg_word_size;
 593        const void *reg_cache_default;
 594        short reg_access_size;
 595        const struct snd_soc_reg_access *reg_access_default;
 596        enum snd_soc_compress_type compress_type;
 597
 598        /* codec bias level */
 599        int (*set_bias_level)(struct snd_soc_codec *,
 600                              enum snd_soc_bias_level level);
 601
 602        void (*seq_notifier)(struct snd_soc_dapm_context *,
 603                             enum snd_soc_dapm_type, int);
 604};
 605
 606/* SoC platform interface */
 607struct snd_soc_platform_driver {
 608
 609        int (*probe)(struct snd_soc_platform *);
 610        int (*remove)(struct snd_soc_platform *);
 611        int (*suspend)(struct snd_soc_dai *dai);
 612        int (*resume)(struct snd_soc_dai *dai);
 613
 614        /* pcm creation and destruction */
 615        int (*pcm_new)(struct snd_card *, struct snd_soc_dai *,
 616                struct snd_pcm *);
 617        void (*pcm_free)(struct snd_pcm *);
 618
 619        /*
 620         * For platform caused delay reporting.
 621         * Optional.
 622         */
 623        snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *,
 624                struct snd_soc_dai *);
 625
 626        /* platform stream ops */
 627        struct snd_pcm_ops *ops;
 628};
 629
 630struct snd_soc_platform {
 631        const char *name;
 632        int id;
 633        struct device *dev;
 634        struct snd_soc_platform_driver *driver;
 635
 636        unsigned int suspended:1; /* platform is suspended */
 637        unsigned int probed:1;
 638
 639        struct snd_soc_card *card;
 640        struct list_head list;
 641        struct list_head card_list;
 642};
 643
 644struct snd_soc_dai_link {
 645        /* config - must be set by machine driver */
 646        const char *name;                       /* Codec name */
 647        const char *stream_name;                /* Stream name */
 648        const char *codec_name;         /* for multi-codec */
 649        const char *platform_name;      /* for multi-platform */
 650        const char *cpu_dai_name;
 651        const char *codec_dai_name;
 652
 653        /* Keep DAI active over suspend */
 654        unsigned int ignore_suspend:1;
 655
 656        /* Symmetry requirements */
 657        unsigned int symmetric_rates:1;
 658
 659        /* codec/machine specific init - e.g. add machine controls */
 660        int (*init)(struct snd_soc_pcm_runtime *rtd);
 661
 662        /* machine stream operations */
 663        struct snd_soc_ops *ops;
 664};
 665
 666struct snd_soc_codec_conf {
 667        const char *dev_name;
 668
 669        /*
 670         * optional map of kcontrol, widget and path name prefixes that are
 671         * associated per device
 672         */
 673        const char *name_prefix;
 674
 675        /*
 676         * set this to the desired compression type if you want to
 677         * override the one supplied in codec->driver->compress_type
 678         */
 679        enum snd_soc_compress_type compress_type;
 680};
 681
 682struct snd_soc_aux_dev {
 683        const char *name;               /* Codec name */
 684        const char *codec_name;         /* for multi-codec */
 685
 686        /* codec/machine specific init - e.g. add machine controls */
 687        int (*init)(struct snd_soc_dapm_context *dapm);
 688};
 689
 690/* SoC card */
 691struct snd_soc_card {
 692        const char *name;
 693        struct device *dev;
 694        struct snd_card *snd_card;
 695        struct module *owner;
 696
 697        struct list_head list;
 698        struct mutex mutex;
 699
 700        bool instantiated;
 701
 702        int (*probe)(struct snd_soc_card *card);
 703        int (*late_probe)(struct snd_soc_card *card);
 704        int (*remove)(struct snd_soc_card *card);
 705
 706        /* the pre and post PM functions are used to do any PM work before and
 707         * after the codec and DAI's do any PM work. */
 708        int (*suspend_pre)(struct snd_soc_card *card);
 709        int (*suspend_post)(struct snd_soc_card *card);
 710        int (*resume_pre)(struct snd_soc_card *card);
 711        int (*resume_post)(struct snd_soc_card *card);
 712
 713        /* callbacks */
 714        int (*set_bias_level)(struct snd_soc_card *,
 715                              enum snd_soc_bias_level level);
 716        int (*set_bias_level_post)(struct snd_soc_card *,
 717                                   enum snd_soc_bias_level level);
 718
 719        long pmdown_time;
 720
 721        /* CPU <--> Codec DAI links  */
 722        struct snd_soc_dai_link *dai_link;
 723        int num_links;
 724        struct snd_soc_pcm_runtime *rtd;
 725        int num_rtd;
 726
 727        /* optional codec specific configuration */
 728        struct snd_soc_codec_conf *codec_conf;
 729        int num_configs;
 730
 731        /*
 732         * optional auxiliary devices such as amplifiers or codecs with DAI
 733         * link unused
 734         */
 735        struct snd_soc_aux_dev *aux_dev;
 736        int num_aux_devs;
 737        struct snd_soc_pcm_runtime *rtd_aux;
 738        int num_aux_rtd;
 739
 740        /*
 741         * Card-specific routes and widgets.
 742         */
 743        struct snd_soc_dapm_widget *dapm_widgets;
 744        int num_dapm_widgets;
 745        struct snd_soc_dapm_route *dapm_routes;
 746        int num_dapm_routes;
 747
 748        struct work_struct deferred_resume_work;
 749
 750        /* lists of probed devices belonging to this card */
 751        struct list_head codec_dev_list;
 752        struct list_head platform_dev_list;
 753        struct list_head dai_dev_list;
 754
 755        struct list_head widgets;
 756        struct list_head paths;
 757        struct list_head dapm_list;
 758
 759        /* Generic DAPM context for the card */
 760        struct snd_soc_dapm_context dapm;
 761
 762#ifdef CONFIG_DEBUG_FS
 763        struct dentry *debugfs_card_root;
 764        struct dentry *debugfs_pop_time;
 765#endif
 766        u32 pop_time;
 767
 768        void *drvdata;
 769};
 770
 771/* SoC machine DAI configuration, glues a codec and cpu DAI together */
 772struct snd_soc_pcm_runtime  {
 773        struct device dev;
 774        struct snd_soc_card *card;
 775        struct snd_soc_dai_link *dai_link;
 776
 777        unsigned int complete:1;
 778        unsigned int dev_registered:1;
 779
 780        /* Symmetry data - only valid if symmetry is being enforced */
 781        unsigned int rate;
 782        long pmdown_time;
 783
 784        /* runtime devices */
 785        struct snd_pcm *pcm;
 786        struct snd_soc_codec *codec;
 787        struct snd_soc_platform *platform;
 788        struct snd_soc_dai *codec_dai;
 789        struct snd_soc_dai *cpu_dai;
 790
 791        struct delayed_work delayed_work;
 792};
 793
 794/* mixer control */
 795struct soc_mixer_control {
 796        int min, max, platform_max;
 797        unsigned int reg, rreg, shift, rshift, invert;
 798};
 799
 800/* enumerated kcontrol */
 801struct soc_enum {
 802        unsigned short reg;
 803        unsigned short reg2;
 804        unsigned char shift_l;
 805        unsigned char shift_r;
 806        unsigned int max;
 807        unsigned int mask;
 808        const char **texts;
 809        const unsigned int *values;
 810        void *dapm;
 811};
 812
 813/* codec IO */
 814unsigned int snd_soc_read(struct snd_soc_codec *codec, unsigned int reg);
 815unsigned int snd_soc_write(struct snd_soc_codec *codec,
 816                           unsigned int reg, unsigned int val);
 817
 818/* device driver data */
 819
 820static inline void snd_soc_card_set_drvdata(struct snd_soc_card *card,
 821                void *data)
 822{
 823        card->drvdata = data;
 824}
 825
 826static inline void *snd_soc_card_get_drvdata(struct snd_soc_card *card)
 827{
 828        return card->drvdata;
 829}
 830
 831static inline void snd_soc_codec_set_drvdata(struct snd_soc_codec *codec,
 832                void *data)
 833{
 834        dev_set_drvdata(codec->dev, data);
 835}
 836
 837static inline void *snd_soc_codec_get_drvdata(struct snd_soc_codec *codec)
 838{
 839        return dev_get_drvdata(codec->dev);
 840}
 841
 842static inline void snd_soc_platform_set_drvdata(struct snd_soc_platform *platform,
 843                void *data)
 844{
 845        dev_set_drvdata(platform->dev, data);
 846}
 847
 848static inline void *snd_soc_platform_get_drvdata(struct snd_soc_platform *platform)
 849{
 850        return dev_get_drvdata(platform->dev);
 851}
 852
 853static inline void snd_soc_pcm_set_drvdata(struct snd_soc_pcm_runtime *rtd,
 854                void *data)
 855{
 856        dev_set_drvdata(&rtd->dev, data);
 857}
 858
 859static inline void *snd_soc_pcm_get_drvdata(struct snd_soc_pcm_runtime *rtd)
 860{
 861        return dev_get_drvdata(&rtd->dev);
 862}
 863
 864static inline void snd_soc_initialize_card_lists(struct snd_soc_card *card)
 865{
 866        INIT_LIST_HEAD(&card->dai_dev_list);
 867        INIT_LIST_HEAD(&card->codec_dev_list);
 868        INIT_LIST_HEAD(&card->platform_dev_list);
 869        INIT_LIST_HEAD(&card->widgets);
 870        INIT_LIST_HEAD(&card->paths);
 871        INIT_LIST_HEAD(&card->dapm_list);
 872}
 873
 874#include <sound/soc-dai.h>
 875
 876#ifdef CONFIG_DEBUG_FS
 877extern struct dentry *snd_soc_debugfs_root;
 878#endif
 879
 880extern const struct dev_pm_ops snd_soc_pm_ops;
 881
 882#endif
 883