2008-07-23 17:03:07 +04:00
/*
* linux / sound / soc - dai . h - - ALSA SoC Layer
*
* Copyright : 2005 - 2008 Wolfson Microelectronics . PLC .
*
* 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 .
*
* Digital Audio Interface ( DAI ) API .
*/
# ifndef __LINUX_SND_SOC_DAI_H
# define __LINUX_SND_SOC_DAI_H
# include <linux/list.h>
2010-01-19 10:39:05 +03:00
# include <sound/soc.h>
2008-07-23 17:03:07 +04:00
struct snd_pcm_substream ;
/*
* DAI hardware audio formats .
*
* Describes the physical PCM data formating and clocking . Add new formats
* to the end .
*/
# define SND_SOC_DAIFMT_I2S 0 /* I2S mode */
# define SND_SOC_DAIFMT_RIGHT_J 1 /* Right Justified mode */
# define SND_SOC_DAIFMT_LEFT_J 2 /* Left Justified mode */
2009-07-14 02:05:11 +04:00
# define SND_SOC_DAIFMT_DSP_A 3 /* L data MSB after FRM LRC */
# define SND_SOC_DAIFMT_DSP_B 4 /* L data MSB during FRM LRC */
2008-07-23 17:03:07 +04:00
# define SND_SOC_DAIFMT_AC97 5 /* AC97 */
2009-09-26 06:02:49 +04:00
# define SND_SOC_DAIFMT_PDM 6 /* Pulse density modulation */
2008-07-23 17:03:07 +04:00
/* left and right justified also known as MSB and LSB respectively */
# define SND_SOC_DAIFMT_MSB SND_SOC_DAIFMT_LEFT_J
# define SND_SOC_DAIFMT_LSB SND_SOC_DAIFMT_RIGHT_J
/*
* DAI Clock gating .
*
2009-07-14 02:05:11 +04:00
* DAI bit clocks can be be gated ( disabled ) when the DAI is not
2008-07-23 17:03:07 +04:00
* sending or receiving PCM data in a frame . This can be used to save power .
*/
# define SND_SOC_DAIFMT_CONT (0 << 4) /* continuous clock */
# define SND_SOC_DAIFMT_GATED (1 << 4) /* clock is gated */
/*
* DAI hardware signal inversions .
*
* Specifies whether the DAI can also support inverted clocks for the specified
* format .
*/
# define SND_SOC_DAIFMT_NB_NF (0 << 8) /* normal bit clock + frame */
2009-07-14 02:05:11 +04:00
# define SND_SOC_DAIFMT_NB_IF (1 << 8) /* normal BCLK + inv FRM */
# define SND_SOC_DAIFMT_IB_NF (2 << 8) /* invert BCLK + nor FRM */
# define SND_SOC_DAIFMT_IB_IF (3 << 8) /* invert BCLK + FRM */
2008-07-23 17:03:07 +04:00
/*
* DAI hardware clock masters .
*
* This is wrt the codec , the inverse is true for the interface
2009-07-14 02:05:11 +04:00
* i . e . if the codec is clk and FRM master then the interface is
2008-07-23 17:03:07 +04:00
* clk and frame slave .
*/
2009-07-14 02:05:11 +04:00
# define SND_SOC_DAIFMT_CBM_CFM (0 << 12) /* codec clk & FRM master */
# define SND_SOC_DAIFMT_CBS_CFM (1 << 12) /* codec clk slave & FRM master */
2008-07-23 17:03:07 +04:00
# define SND_SOC_DAIFMT_CBM_CFS (2 << 12) /* codec clk master & frame slave */
2009-07-14 02:05:11 +04:00
# define SND_SOC_DAIFMT_CBS_CFS (3 << 12) /* codec clk & FRM slave */
2008-07-23 17:03:07 +04:00
# define SND_SOC_DAIFMT_FORMAT_MASK 0x000f
# define SND_SOC_DAIFMT_CLOCK_MASK 0x00f0
# define SND_SOC_DAIFMT_INV_MASK 0x0f00
# define SND_SOC_DAIFMT_MASTER_MASK 0xf000
/*
* Master Clock Directions
*/
# define SND_SOC_CLOCK_IN 0
# define SND_SOC_CLOCK_OUT 1
2009-08-09 23:08:31 +04:00
# define SND_SOC_STD_AC97_FMTS (SNDRV_PCM_FMTBIT_S8 |\
SNDRV_PCM_FMTBIT_S16_LE | \
SNDRV_PCM_FMTBIT_S16_BE | \
SNDRV_PCM_FMTBIT_S20_3LE | \
SNDRV_PCM_FMTBIT_S20_3BE | \
SNDRV_PCM_FMTBIT_S24_3LE | \
SNDRV_PCM_FMTBIT_S24_3BE | \
2009-05-14 05:59:14 +04:00
SNDRV_PCM_FMTBIT_S32_LE | \
SNDRV_PCM_FMTBIT_S32_BE )
2009-05-02 15:24:55 +04:00
2008-07-23 17:03:07 +04:00
struct snd_soc_dai_ops ;
struct snd_soc_dai ;
struct snd_ac97_bus_ops ;
2008-12-01 02:31:24 +03:00
/* Digital Audio Interface registration */
int snd_soc_register_dai ( struct snd_soc_dai * dai ) ;
void snd_soc_unregister_dai ( struct snd_soc_dai * dai ) ;
int snd_soc_register_dais ( struct snd_soc_dai * dai , size_t count ) ;
void snd_soc_unregister_dais ( struct snd_soc_dai * dai , size_t count ) ;
2008-07-23 17:03:07 +04:00
/* Digital Audio Interface clocking API.*/
int snd_soc_dai_set_sysclk ( struct snd_soc_dai * dai , int clk_id ,
unsigned int freq , int dir ) ;
int snd_soc_dai_set_clkdiv ( struct snd_soc_dai * dai ,
int div_id , int div ) ;
int snd_soc_dai_set_pll ( struct snd_soc_dai * dai ,
2009-09-05 21:52:16 +04:00
int pll_id , int source , unsigned int freq_in , unsigned int freq_out ) ;
2008-07-23 17:03:07 +04:00
/* Digital Audio interface formatting */
int snd_soc_dai_set_fmt ( struct snd_soc_dai * dai , unsigned int fmt ) ;
int snd_soc_dai_set_tdm_slot ( struct snd_soc_dai * dai ,
2009-06-16 04:44:31 +04:00
unsigned int tx_mask , unsigned int rx_mask , int slots , int slot_width ) ;
2008-07-23 17:03:07 +04:00
2009-09-11 21:16:29 +04:00
int snd_soc_dai_set_channel_map ( struct snd_soc_dai * dai ,
unsigned int tx_num , unsigned int * tx_slot ,
unsigned int rx_num , unsigned int * rx_slot ) ;
2008-07-23 17:03:07 +04:00
int snd_soc_dai_set_tristate ( struct snd_soc_dai * dai , int tristate ) ;
/* Digital Audio Interface mute */
int snd_soc_dai_digital_mute ( struct snd_soc_dai * dai , int mute ) ;
/*
* Digital Audio Interface .
*
2009-07-14 02:05:11 +04:00
* Describes the Digital Audio Interface in terms of its ALSA , DAI and AC97
* operations and capabilities . Codec and platform drivers will register this
2008-07-23 17:03:07 +04:00
* structure for every DAI they have .
*
* This structure covers the clocking , formating and ALSA operations for each
2009-07-14 02:05:11 +04:00
* interface .
2008-07-23 17:03:07 +04:00
*/
struct snd_soc_dai_ops {
/*
* DAI clocking configuration , all optional .
* Called by soc_card drivers , normally in their hw_params .
*/
int ( * set_sysclk ) ( struct snd_soc_dai * dai ,
int clk_id , unsigned int freq , int dir ) ;
2009-09-05 21:52:16 +04:00
int ( * set_pll ) ( struct snd_soc_dai * dai , int pll_id , int source ,
unsigned int freq_in , unsigned int freq_out ) ;
2008-07-23 17:03:07 +04:00
int ( * set_clkdiv ) ( struct snd_soc_dai * dai , int div_id , int div ) ;
/*
* DAI format configuration
* Called by soc_card drivers , normally in their hw_params .
*/
int ( * set_fmt ) ( struct snd_soc_dai * dai , unsigned int fmt ) ;
int ( * set_tdm_slot ) ( struct snd_soc_dai * dai ,
2009-06-16 04:44:31 +04:00
unsigned int tx_mask , unsigned int rx_mask ,
int slots , int slot_width ) ;
2009-09-11 21:16:29 +04:00
int ( * set_channel_map ) ( struct snd_soc_dai * dai ,
unsigned int tx_num , unsigned int * tx_slot ,
unsigned int rx_num , unsigned int * rx_slot ) ;
2008-07-23 17:03:07 +04:00
int ( * set_tristate ) ( struct snd_soc_dai * dai , int tristate ) ;
/*
* DAI digital mute - optional .
* Called by soc - core to minimise any pops .
*/
int ( * digital_mute ) ( struct snd_soc_dai * dai , int mute ) ;
2008-11-19 01:11:38 +03:00
/*
* ALSA PCM audio operations - all optional .
* Called by soc - core during audio PCM operations .
*/
int ( * startup ) ( struct snd_pcm_substream * ,
struct snd_soc_dai * ) ;
void ( * shutdown ) ( struct snd_pcm_substream * ,
struct snd_soc_dai * ) ;
int ( * hw_params ) ( struct snd_pcm_substream * ,
struct snd_pcm_hw_params * , struct snd_soc_dai * ) ;
int ( * hw_free ) ( struct snd_pcm_substream * ,
struct snd_soc_dai * ) ;
int ( * prepare ) ( struct snd_pcm_substream * ,
struct snd_soc_dai * ) ;
int ( * trigger ) ( struct snd_pcm_substream * , int ,
struct snd_soc_dai * ) ;
2010-03-03 16:08:07 +03:00
/*
* For hardware based FIFO caused delay reporting .
* Optional .
*/
snd_pcm_sframes_t ( * delay ) ( struct snd_pcm_substream * ,
struct snd_soc_dai * ) ;
2008-07-23 17:03:07 +04:00
} ;
/*
* Digital Audio Interface runtime data .
*
* Holds runtime data for a DAI .
*/
struct snd_soc_dai {
/* DAI description */
char * name ;
unsigned int id ;
2008-11-24 21:01:05 +03:00
int ac97_control ;
2008-07-23 17:03:07 +04:00
2008-12-01 02:31:24 +03:00
struct device * dev ;
2009-07-22 15:01:03 +04:00
void * ac97_pdata ; /* platform_data for the ac97 codec */
2008-12-01 02:31:24 +03:00
2008-07-23 17:03:07 +04:00
/* DAI callbacks */
int ( * probe ) ( struct platform_device * pdev ,
struct snd_soc_dai * dai ) ;
void ( * remove ) ( struct platform_device * pdev ,
struct snd_soc_dai * dai ) ;
2008-12-03 21:21:52 +03:00
int ( * suspend ) ( struct snd_soc_dai * dai ) ;
int ( * resume ) ( struct snd_soc_dai * dai ) ;
2008-07-23 17:03:07 +04:00
/* ops */
2009-03-03 04:41:00 +03:00
struct snd_soc_dai_ops * ops ;
2008-07-23 17:03:07 +04:00
/* DAI capabilities */
struct snd_soc_pcm_stream capture ;
struct snd_soc_pcm_stream playback ;
2009-04-07 21:10:13 +04:00
unsigned int symmetric_rates : 1 ;
2008-07-23 17:03:07 +04:00
/* DAI runtime info */
struct snd_soc_codec * codec ;
unsigned int active ;
unsigned char pop_wait : 1 ;
void * dma_data ;
/* DAI private data */
void * private_data ;
2009-05-05 13:27:38 +04:00
/* parent platform */
struct snd_soc_platform * platform ;
2008-07-23 17:03:07 +04:00
struct list_head list ;
} ;
# endif