diff options
Diffstat (limited to 'include/sound/soc.h')
-rw-r--r-- | include/sound/soc.h | 87 |
1 files changed, 85 insertions, 2 deletions
diff --git a/include/sound/soc.h b/include/sound/soc.h index 74921f20a1d..41b931a0c52 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -235,6 +235,7 @@ struct snd_soc_codec_driver; struct soc_enum; struct snd_soc_jack; struct snd_soc_jack_pin; +struct snd_soc_dapm_context; struct snd_soc_cache_ops; #include <sound/soc-dapm.h> @@ -257,6 +258,12 @@ enum snd_soc_compress_type { SND_SOC_LZO_COMPRESSION, SND_SOC_RBTREE_COMPRESSION }; +/* Max number of Backend DAIs */ +#define SND_SOC_MAX_BE 8 + +/* DAI Link Host Mode Support */ +#define SND_SOC_DAI_LINK_NO_HOST 0x1 +#define SND_SOC_DAI_LINK_OPT_HOST 0x2 int snd_soc_register_platform(struct device *dev, struct snd_soc_platform_driver *platform_drv); @@ -277,6 +284,24 @@ int snd_soc_cache_write(struct snd_soc_codec *codec, int snd_soc_cache_read(struct snd_soc_codec *codec, unsigned int reg, unsigned int *value); +/* pcm <-> DAI connect */ +void snd_soc_free_pcms(struct snd_soc_codec *codec); +int snd_soc_new_pcms(struct snd_soc_codec *codec, int idx, const char *xid); + +/* DAI operations - for backend DAIs */ +int snd_soc_pcm_open(struct snd_pcm_substream *substream); +int snd_soc_pcm_close(struct snd_pcm_substream *substream); +int snd_soc_pcm_prepare(struct snd_pcm_substream *substream); +int snd_soc_pcm_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params); +int snd_soc_pcm_hw_free(struct snd_pcm_substream *substream); +int snd_soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd); +snd_pcm_uframes_t snd_soc_pcm_pointer(struct snd_pcm_substream *substream); +struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card, + const char *dai_link, int stream); +struct snd_soc_pcm_runtime *snd_soc_get_pcm_runtime(struct snd_soc_card *card, + const char *dai_link); + /* Utility functions to get clock rates from various things */ int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots); int snd_soc_params_to_frame_size(struct snd_pcm_hw_params *params); @@ -324,6 +349,8 @@ struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template, void *data, char *long_name); int snd_soc_add_controls(struct snd_soc_codec *codec, const struct snd_kcontrol_new *controls, int num_controls); +int snd_soc_add_platform_controls(struct snd_soc_platform *platform, + const struct snd_kcontrol_new *controls, int num_controls); int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo); int snd_soc_info_enum_ext(struct snd_kcontrol *kcontrol, @@ -519,6 +546,8 @@ struct snd_soc_codec_driver { /* codec bias level */ int (*set_bias_level)(struct snd_soc_codec *, enum snd_soc_bias_level level); + /* codec stream completion event */ + int (*stream_event)(struct snd_soc_dapm_context *dapm); }; /* SoC platform interface */ @@ -530,8 +559,7 @@ struct snd_soc_platform_driver { int (*resume)(struct snd_soc_dai *dai); /* pcm creation and destruction */ - int (*pcm_new)(struct snd_card *, struct snd_soc_dai *, - struct snd_pcm *); + int (*pcm_new)(struct snd_soc_pcm_runtime *); void (*pcm_free)(struct snd_pcm *); /* @@ -543,6 +571,13 @@ struct snd_soc_platform_driver { /* platform stream ops */ struct snd_pcm_ops *ops; + + /* platform DAPM IO TODO: refactor this */ + unsigned int (*read)(struct snd_soc_platform *, unsigned int); + int (*write)(struct snd_soc_platform *, unsigned int, unsigned int); + + /* platform stream completion event */ + int (*stream_event)(struct snd_soc_dapm_context *dapm); }; struct snd_soc_platform { @@ -557,6 +592,10 @@ struct snd_soc_platform { struct snd_soc_card *card; struct list_head list; struct list_head card_list; + int num_dai; + + /* dapm */ + struct snd_soc_dapm_context dapm; }; struct snd_soc_dai_link { @@ -568,15 +607,36 @@ struct snd_soc_dai_link { const char *cpu_dai_name; const char *codec_dai_name; + /* supported BE */ + const char **supported_be; + int num_be; + int fe_playback_channels; + int fe_capture_channels; + + /* Keep DAI active over suspend */ unsigned int ignore_suspend:1; /* Symmetry requirements */ unsigned int symmetric_rates:1; + /* No PCM created for this DAI link */ + unsigned int no_pcm:1; + /* This DAI link can change CODEC and platform at runtime*/ + unsigned int dynamic:1; + /* This DAI link has no codec side driver*/ + unsigned int no_codec:1; + /* This DAI has a Backend ID */ + unsigned int be_id; + /* This DAI can support no host IO (no pcm data is copied to from host) */ + unsigned int no_host_mode:2; /* codec/machine specific init - e.g. add machine controls */ int (*init)(struct snd_soc_pcm_runtime *rtd); + /* hw_params re-writing for BE and FE sync */ + int (*be_hw_params_fixup)(struct snd_soc_pcm_runtime *rtd, + struct snd_pcm_hw_params *params); + /* machine stream operations */ struct snd_soc_ops *ops; }; @@ -608,12 +668,14 @@ struct snd_soc_aux_dev { /* SoC card */ struct snd_soc_card { const char *name; + const char *long_name; struct device *dev; struct snd_card *snd_card; struct module *owner; struct list_head list; struct mutex mutex; + struct mutex dapm_mutex; bool instantiated; @@ -677,10 +739,18 @@ struct snd_soc_pcm_runtime { struct device dev; struct snd_soc_card *card; struct snd_soc_dai_link *dai_link; + struct mutex pcm_mutex; + struct snd_pcm_ops ops; unsigned int complete:1; unsigned int dev_registered:1; + /* BE runtime data */ + unsigned int fe_clients; + unsigned int num_be[2]; + unsigned int be_active; + struct snd_soc_pcm_runtime *be_rtd[SND_SOC_MAX_BE][2]; + /* Symmetry data - only valid if symmetry is being enforced */ unsigned int rate; long pmdown_time; @@ -691,6 +761,7 @@ struct snd_soc_pcm_runtime { struct snd_soc_platform *platform; struct snd_soc_dai *codec_dai; struct snd_soc_dai *cpu_dai; + int current_fe; struct delayed_work delayed_work; }; @@ -718,6 +789,18 @@ struct soc_enum { unsigned int snd_soc_read(struct snd_soc_codec *codec, unsigned int reg); unsigned int snd_soc_write(struct snd_soc_codec *codec, unsigned int reg, unsigned int val); +/* platform DAPM IO - refactor */ +static inline unsigned int snd_soc_platform_read(struct snd_soc_platform *platform, + unsigned int reg) +{ + return platform->driver->read(platform, reg); +} + +static inline unsigned int snd_soc_platform_write(struct snd_soc_platform *platform, + unsigned int reg, unsigned int val) +{ + return platform->driver->write(platform, reg, val); +} /* device driver data */ |