diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/dmaengine.h | 6 | ||||
| -rw-r--r-- | include/linux/mfd/abx500/ab8500-codec.h | 52 | ||||
| -rw-r--r-- | include/linux/mfd/abx500/ab8500.h | 2 | ||||
| -rw-r--r-- | include/linux/platform_data/mmp_audio.h | 22 | ||||
| -rw-r--r-- | include/sound/designware_i2s.h | 69 | ||||
| -rw-r--r-- | include/sound/dmaengine_pcm.h | 1 | ||||
| -rw-r--r-- | include/sound/pcm.h | 11 | ||||
| -rw-r--r-- | include/sound/soc-dapm.h | 10 | ||||
| -rw-r--r-- | include/sound/soc.h | 77 | ||||
| -rw-r--r-- | include/sound/spear_dma.h | 35 | ||||
| -rw-r--r-- | include/sound/spear_spdif.h | 29 | 
11 files changed, 309 insertions, 5 deletions
diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index 56377df3912..cc0756a35ae 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h @@ -670,6 +670,12 @@ static inline int dmaengine_resume(struct dma_chan *chan)  	return dmaengine_device_control(chan, DMA_RESUME, 0);  } +static inline enum dma_status dmaengine_tx_status(struct dma_chan *chan, +	dma_cookie_t cookie, struct dma_tx_state *state) +{ +	return chan->device->device_tx_status(chan, cookie, state); +} +  static inline dma_cookie_t dmaengine_submit(struct dma_async_tx_descriptor *desc)  {  	return desc->tx_submit(desc); diff --git a/include/linux/mfd/abx500/ab8500-codec.h b/include/linux/mfd/abx500/ab8500-codec.h new file mode 100644 index 00000000000..dc6529202cd --- /dev/null +++ b/include/linux/mfd/abx500/ab8500-codec.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) ST-Ericsson SA 2012 + * + * Author: Ola Lilja <ola.o.lilja@stericsson.com> + *         for ST-Ericsson. + * + * License terms: + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +#ifndef AB8500_CORE_CODEC_H +#define AB8500_CORE_CODEC_H + +/* Mic-types */ +enum amic_type { +	AMIC_TYPE_SINGLE_ENDED, +	AMIC_TYPE_DIFFERENTIAL +}; + +/* Mic-biases */ +enum amic_micbias { +	AMIC_MICBIAS_VAMIC1, +	AMIC_MICBIAS_VAMIC2 +}; + +/* Bias-voltage */ +enum ear_cm_voltage { +	EAR_CMV_0_95V, +	EAR_CMV_1_10V, +	EAR_CMV_1_27V, +	EAR_CMV_1_58V +}; + +/* Analog microphone settings */ +struct amic_settings { +	enum amic_type mic1_type; +	enum amic_type mic2_type; +	enum amic_micbias mic1a_micbias; +	enum amic_micbias mic1b_micbias; +	enum amic_micbias mic2_micbias; +}; + +/* Platform data structure for the audio-parts of the AB8500 */ +struct ab8500_codec_platform_data { +	struct amic_settings amics; +	enum ear_cm_voltage ear_cmv; +}; + +#endif diff --git a/include/linux/mfd/abx500/ab8500.h b/include/linux/mfd/abx500/ab8500.h index 91dd3ef63e9..bc9b84b60ec 100644 --- a/include/linux/mfd/abx500/ab8500.h +++ b/include/linux/mfd/abx500/ab8500.h @@ -266,6 +266,7 @@ struct ab8500 {  struct regulator_reg_init;  struct regulator_init_data;  struct ab8500_gpio_platform_data; +struct ab8500_codec_platform_data;  /**   * struct ab8500_platform_data - AB8500 platform data @@ -284,6 +285,7 @@ struct ab8500_platform_data {  	int num_regulator;  	struct regulator_init_data *regulator;  	struct ab8500_gpio_platform_data *gpio; +	struct ab8500_codec_platform_data *codec;  };  extern int __devinit ab8500_init(struct ab8500 *ab8500, diff --git a/include/linux/platform_data/mmp_audio.h b/include/linux/platform_data/mmp_audio.h new file mode 100644 index 00000000000..0f25d165abd --- /dev/null +++ b/include/linux/platform_data/mmp_audio.h @@ -0,0 +1,22 @@ +/* + *  MMP Platform AUDIO Management + * + *  Copyright (c) 2011 Marvell Semiconductors Inc. + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License version 2 as + *  published by the Free Software Foundation. + * + */ + +#ifndef MMP_AUDIO_H +#define MMP_AUDIO_H + +struct mmp_audio_platdata { +	u32 period_max_capture; +	u32 buffer_max_capture; +	u32 period_max_playback; +	u32 buffer_max_playback; +}; + +#endif /* MMP_AUDIO_H */ diff --git a/include/sound/designware_i2s.h b/include/sound/designware_i2s.h new file mode 100644 index 00000000000..26f406e0f67 --- /dev/null +++ b/include/sound/designware_i2s.h @@ -0,0 +1,69 @@ +/* + * Copyright (ST) 2012 Rajeev Kumar (rajeev-dlh.kumar@st.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __SOUND_DESIGNWARE_I2S_H +#define __SOUND_DESIGNWARE_I2S_H + +#include <linux/dmaengine.h> +#include <linux/types.h> + +/* + * struct i2s_clk_config_data - represent i2s clk configuration data + * @chan_nr: number of channel + * @data_width: number of bits per sample (8/16/24/32 bit) + * @sample_rate: sampling frequency (8Khz, 16Khz, 32Khz, 44Khz, 48Khz) + */ +struct i2s_clk_config_data { +	int chan_nr; +	u32 data_width; +	u32 sample_rate; +}; + +struct i2s_platform_data { +	#define DWC_I2S_PLAY	(1 << 0) +	#define DWC_I2S_RECORD	(1 << 1) +	unsigned int cap; +	int channel; +	u32 snd_fmts; +	u32 snd_rates; + +	void *play_dma_data; +	void *capture_dma_data; +	bool (*filter)(struct dma_chan *chan, void *slave); +	int (*i2s_clk_cfg)(struct i2s_clk_config_data *config); +}; + +struct i2s_dma_data { +	void *data; +	dma_addr_t addr; +	u32 max_burst; +	enum dma_slave_buswidth addr_width; +	bool (*filter)(struct dma_chan *chan, void *slave); +}; + +/* I2S DMA registers */ +#define I2S_RXDMA		0x01C0 +#define I2S_TXDMA		0x01C8 + +#define TWO_CHANNEL_SUPPORT	2	/* up to 2.0 */ +#define FOUR_CHANNEL_SUPPORT	4	/* up to 3.1 */ +#define SIX_CHANNEL_SUPPORT	6	/* up to 5.1 */ +#define EIGHT_CHANNEL_SUPPORT	8	/* up to 7.1 */ + +#endif /*  __SOUND_DESIGNWARE_I2S_H */ diff --git a/include/sound/dmaengine_pcm.h b/include/sound/dmaengine_pcm.h index a8fcaa6d531..b877334bbb0 100644 --- a/include/sound/dmaengine_pcm.h +++ b/include/sound/dmaengine_pcm.h @@ -39,6 +39,7 @@ int snd_hwparams_to_dma_slave_config(const struct snd_pcm_substream *substream,  	const struct snd_pcm_hw_params *params, struct dma_slave_config *slave_config);  int snd_dmaengine_pcm_trigger(struct snd_pcm_substream *substream, int cmd);  snd_pcm_uframes_t snd_dmaengine_pcm_pointer(struct snd_pcm_substream *substream); +snd_pcm_uframes_t snd_dmaengine_pcm_pointer_no_residue(struct snd_pcm_substream *substream);  int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,  	dma_filter_fn filter_fn, void *filter_data); diff --git a/include/sound/pcm.h b/include/sound/pcm.h index 0d1112815be..a55d5db7eb5 100644 --- a/include/sound/pcm.h +++ b/include/sound/pcm.h @@ -1073,4 +1073,15 @@ static inline void snd_pcm_limit_isa_dma_size(int dma, size_t *max)  const char *snd_pcm_format_name(snd_pcm_format_t format); +/** + * Get a string naming the direction of a stream + */ +static inline const char *snd_pcm_stream_str(struct snd_pcm_substream *substream) +{ +	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) +		return "Playback"; +	else +		return "Capture"; +} +  #endif /* __SOUND_PCM_H */ diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h index e3833d9f191..05559e571d4 100644 --- a/include/sound/soc-dapm.h +++ b/include/sound/soc-dapm.h @@ -229,6 +229,10 @@ struct device;  {	.id = snd_soc_dapm_adc, .name = wname, .sname = stname, .reg = wreg, \  	.shift = wshift, .invert = winvert, \  	.event = wevent, .event_flags = wflags} +#define SND_SOC_DAPM_CLOCK_SUPPLY(wname) \ +{	.id = snd_soc_dapm_clock_supply, .name = wname, \ +	.reg = SND_SOC_NOPM, .event = dapm_clock_event, \ +	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD }  /* generic widgets */  #define SND_SOC_DAPM_REG(wid, wname, wreg, wshift, wmask, won_val, woff_val) \ @@ -245,6 +249,7 @@ struct device;  	.reg = SND_SOC_NOPM, .shift = wdelay, .event = dapm_regulator_event, \  	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD } +  /* dapm kcontrol types */  #define SOC_DAPM_SINGLE(xname, reg, shift, max, invert) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ @@ -327,6 +332,8 @@ int dapm_reg_event(struct snd_soc_dapm_widget *w,  		   struct snd_kcontrol *kcontrol, int event);  int dapm_regulator_event(struct snd_soc_dapm_widget *w,  			 struct snd_kcontrol *kcontrol, int event); +int dapm_clock_event(struct snd_soc_dapm_widget *w, +			 struct snd_kcontrol *kcontrol, int event);  /* dapm controls */  int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol, @@ -432,6 +439,7 @@ enum snd_soc_dapm_type {  	snd_soc_dapm_post,			/* machine specific post widget - exec last */  	snd_soc_dapm_supply,		/* power/clock supply */  	snd_soc_dapm_regulator_supply,	/* external regulator */ +	snd_soc_dapm_clock_supply,	/* external clock */  	snd_soc_dapm_aif_in,		/* audio interface input */  	snd_soc_dapm_aif_out,		/* audio interface output */  	snd_soc_dapm_siggen,		/* signal generator */ @@ -537,6 +545,8 @@ struct snd_soc_dapm_widget {  	struct list_head dirty;  	int inputs;  	int outputs; + +	struct clk *clk;  };  struct snd_soc_dapm_update { diff --git a/include/sound/soc.h b/include/sound/soc.h index c703871f5f6..e063380f63a 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -42,11 +42,22 @@  	((unsigned long)&(struct soc_mixer_control) \  	{.reg = xlreg, .rreg = xrreg, .shift = xshift, .rshift = xshift, \  	.max = xmax, .platform_max = xmax, .invert = xinvert}) +#define SOC_DOUBLE_R_RANGE_VALUE(xlreg, xrreg, xshift, xmin, xmax, xinvert) \ +	((unsigned long)&(struct soc_mixer_control) \ +	{.reg = xlreg, .rreg = xrreg, .shift = xshift, .rshift = xshift, \ +	.min = xmin, .max = xmax, .platform_max = xmax, .invert = xinvert})  #define SOC_SINGLE(xname, reg, shift, max, invert) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \  	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\  	.put = snd_soc_put_volsw, \  	.private_value =  SOC_SINGLE_VALUE(reg, shift, max, invert) } +#define SOC_SINGLE_RANGE(xname, xreg, xshift, xmin, xmax, xinvert) \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\ +	.info = snd_soc_info_volsw_range, .get = snd_soc_get_volsw_range, \ +	.put = snd_soc_put_volsw_range, \ +	.private_value = (unsigned long)&(struct soc_mixer_control) \ +		{.reg = xreg, .shift = xshift, .min = xmin,\ +		 .max = xmax, .platform_max = xmax, .invert = xinvert} }  #define SOC_SINGLE_TLV(xname, reg, shift, max, invert, tlv_array) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \  	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\ @@ -67,6 +78,16 @@  		{.reg = xreg, .rreg = xreg, \  		.shift = xshift, .rshift = xshift, \  		.max = xmax, .min = xmin} } +#define SOC_SINGLE_RANGE_TLV(xname, xreg, xshift, xmin, xmax, xinvert, tlv_array) \ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\ +	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\ +		 SNDRV_CTL_ELEM_ACCESS_READWRITE,\ +	.tlv.p = (tlv_array), \ +	.info = snd_soc_info_volsw_range, \ +	.get = snd_soc_get_volsw_range, .put = snd_soc_put_volsw_range, \ +	.private_value = (unsigned long)&(struct soc_mixer_control) \ +		{.reg = xreg, .shift = xshift, .min = xmin,\ +		 .max = xmax, .platform_max = xmax, .invert = xinvert} }  #define SOC_DOUBLE(xname, reg, shift_left, shift_right, max, invert) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\  	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \ @@ -79,6 +100,13 @@  	.get = snd_soc_get_volsw, .put = snd_soc_put_volsw, \  	.private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \  					    xmax, xinvert) } +#define SOC_DOUBLE_R_RANGE(xname, reg_left, reg_right, xshift, xmin, \ +			   xmax, xinvert)		\ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\ +	.info = snd_soc_info_volsw_range, \ +	.get = snd_soc_get_volsw_range, .put = snd_soc_put_volsw_range, \ +	.private_value = SOC_DOUBLE_R_RANGE_VALUE(reg_left, reg_right, \ +					    xshift, xmin, xmax, xinvert) }  #define SOC_DOUBLE_TLV(xname, reg, shift_left, shift_right, max, invert, tlv_array) \  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\  	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\ @@ -97,6 +125,16 @@  	.get = snd_soc_get_volsw, .put = snd_soc_put_volsw, \  	.private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \  					    xmax, xinvert) } +#define SOC_DOUBLE_R_RANGE_TLV(xname, reg_left, reg_right, xshift, xmin, \ +			       xmax, xinvert, tlv_array)		\ +{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\ +	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\ +		 SNDRV_CTL_ELEM_ACCESS_READWRITE,\ +	.tlv.p = (tlv_array), \ +	.info = snd_soc_info_volsw_range, \ +	.get = snd_soc_get_volsw_range, .put = snd_soc_put_volsw_range, \ +	.private_value = SOC_DOUBLE_R_RANGE_VALUE(reg_left, reg_right, \ +					    xshift, xmin, xmax, xinvert) }  #define SOC_DOUBLE_R_SX_TLV(xname, xreg, xrreg, xshift, xmin, xmax, tlv_array) \  {       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \  	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ @@ -460,6 +498,12 @@ int snd_soc_get_volsw_s8(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol);  int snd_soc_put_volsw_s8(struct snd_kcontrol *kcontrol,  	struct snd_ctl_elem_value *ucontrol); +int snd_soc_info_volsw_range(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_info *uinfo); +int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_value *ucontrol); +int snd_soc_get_volsw_range(struct snd_kcontrol *kcontrol, +	struct snd_ctl_elem_value *ucontrol);  int snd_soc_limit_volume(struct snd_soc_codec *codec,  	const char *name, int max);  int snd_soc_bytes_info(struct snd_kcontrol *kcontrol, @@ -785,13 +829,36 @@ struct snd_soc_dai_link {  	/* config - must be set by machine driver */  	const char *name;			/* Codec name */  	const char *stream_name;		/* Stream name */ -	const char *codec_name;		/* for multi-codec */ -	const struct device_node *codec_of_node; -	const char *platform_name;	/* for multi-platform */ -	const struct device_node *platform_of_node; +	/* +	 * You MAY specify the link's CPU-side device, either by device name, +	 * or by DT/OF node, but not both. If this information is omitted, +	 * the CPU-side DAI is matched using .cpu_dai_name only, which hence +	 * must be globally unique. These fields are currently typically used +	 * only for codec to codec links, or systems using device tree. +	 */ +	const char *cpu_name; +	const struct device_node *cpu_of_node; +	/* +	 * You MAY specify the DAI name of the CPU DAI. If this information is +	 * omitted, the CPU-side DAI is matched using .cpu_name/.cpu_of_node +	 * only, which only works well when that device exposes a single DAI. +	 */  	const char *cpu_dai_name; -	const struct device_node *cpu_dai_of_node; +	/* +	 * You MUST specify the link's codec, either by device name, or by +	 * DT/OF node, but not both. +	 */ +	const char *codec_name; +	const struct device_node *codec_of_node; +	/* You MUST specify the DAI name within the codec */  	const char *codec_dai_name; +	/* +	 * You MAY specify the link's platform/PCM/DMA driver, either by +	 * device name, or by DT/OF node, but not both. Some forms of link +	 * do not need a platform. +	 */ +	const char *platform_name; +	const struct device_node *platform_of_node;  	int be_id;	/* optional ID for machine driver BE identification */  	const struct snd_soc_pcm_stream *params; diff --git a/include/sound/spear_dma.h b/include/sound/spear_dma.h new file mode 100644 index 00000000000..1b365bfdfb3 --- /dev/null +++ b/include/sound/spear_dma.h @@ -0,0 +1,35 @@ +/* +* linux/spear_dma.h +* +* Copyright (ST) 2012 Rajeev Kumar (rajeev-dlh.kumar@st.com) +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +*/ + +#ifndef SPEAR_DMA_H +#define SPEAR_DMA_H + +#include <linux/dmaengine.h> + +struct spear_dma_data { +	void *data; +	dma_addr_t addr; +	u32 max_burst; +	enum dma_slave_buswidth addr_width; +	bool (*filter)(struct dma_chan *chan, void *slave); +}; + +#endif /* SPEAR_DMA_H */ diff --git a/include/sound/spear_spdif.h b/include/sound/spear_spdif.h new file mode 100644 index 00000000000..a12f3969561 --- /dev/null +++ b/include/sound/spear_spdif.h @@ -0,0 +1,29 @@ +/* + * Copyright (ST) 2012 Vipin Kumar (vipin.kumar@st.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __SOUND_SPDIF_H +#define __SOUND_SPDIF_H + +struct spear_spdif_platform_data { +	/* DMA params */ +	void *dma_params; +	bool (*filter)(struct dma_chan *chan, void *slave); +	void (*reset_perip)(void); +}; + +#endif /* SOUND_SPDIF_H */  |