blob: f7c4b11e8596f0ff259bfa329974afed937f63e9 [file] [log] [blame]
/*
* tz1090-i2s.h
*
*/
#ifndef TZ1090I2S_H_
#define TZ1090I2S_H_
#include <linux/io.h>
#include "tz1090-pcm.h"
#include <asm/soc-tz1090/defs.h>
struct tz1090_i2s {
struct snd_soc_dai_driver dai;
void __iomem *audio_out;
void __iomem *audio_in;
int periph_out;
int periph_in;
struct comet_pcm_dma_params stereo_out;
struct comet_pcm_dma_params stereo_in;
};
/*Helper Macros (dont use outside of this file) */
#define _REG_ADDRESS(REG) _##REG##_OFFSET
#define _REG_MASK(REG) _##REG##_MASK
#define _REG_SHIFT(REG) _##REG##_SHIFT
/**************************** I2S OUT *****************************************/
#define _I2S_OUT_INTERLEAVE_DATA_OFFSET 0x00
#define _I2S_OUT_CONTROL_OFFSET 0x04
#define _I2S_OUT_ACTIVE_CHAN_OFFSET _I2S_OUT_CONTROL_OFFSET
#define _I2S_OUT_ACTIVE_CHAN_SHIFT 13
#define _I2S_OUT_ACTIVE_CHAN_MASK 0x0001E000
#define _I2S_OUT_CLOCK_SELECT_OFFSET _I2S_OUT_CONTROL_OFFSET
#define _I2S_OUT_CLOCK_SELECT_SHIFT 12
#define _I2S_OUT_CLOCK_SELECT_MASK 0x00001000
#define _I2S_OUT_FRAME_OFFSET _I2S_OUT_CONTROL_OFFSET
#define _I2S_OUT_FRAME_SHIFT 7
#define _I2S_OUT_FRAME_MASK 0x00000180
#define _I2S_OUT_MASTER_OFFSET _I2S_OUT_CONTROL_OFFSET
#define _I2S_OUT_MASTER_SHIFT 6
#define _I2S_OUT_MASTER_MASK 0x00000040
#define _I2S_OUT_ACLK_SEL_OFFSET _I2S_OUT_CONTROL_OFFSET
#define _I2S_OUT_ACLK_SEL_SHIFT 5
#define _I2S_OUT_ACLK_SEL_MASK 0x00000020
#define _I2S_OUT_BCLK_EN_OFFSET _I2S_OUT_CONTROL_OFFSET
#define _I2S_OUT_BCLK_EN_SHIFT 4
#define _I2S_OUT_BCLK_EN_MASK 0x00000010
#define _I2S_OUT_LEFT_POL_OFFSET _I2S_OUT_CONTROL_OFFSET
#define _I2S_OUT_LEFT_POL_SHIFT 3
#define _I2S_OUT_LEFT_POL_MASK 0x00000008
#define _I2S_OUT_BCLK_POL_OFFSET _I2S_OUT_CONTROL_OFFSET
#define _I2S_OUT_BCLK_POL_SHIFT 2
#define _I2S_OUT_BCLK_POL_MASK 0x00000004
#define _I2S_OUT_PACKED_OFFSET _I2S_OUT_CONTROL_OFFSET
#define _I2S_OUT_PACKED_SHIFT 1
#define _I2S_OUT_PACKED_MASK 0x00000002
#define _I2S_OUT_ENABLE_OFFSET _I2S_OUT_CONTROL_OFFSET
#define _I2S_OUT_ENABLE_SHIFT 0
#define _I2S_OUT_ENABLE_MASK 0x00000001
#define _I2S_OUT_SOFT_RESET_OFFSET 0x08
#define _I2S_OUT_SOFT_RESET_SHIFT 0
#define _I2S_OUT_SOFT_RESET_MASK 0x00000001
#define _I2S_OUT_CHANS_OFFSET 0x80
#define _I2S_OUT_CHANS_STRIDE 0x20
#define _I2S_OUT_CHAN_DATA_OFFSET 0x00
#define _I2S_OUT_CHAN_CTRL_OFFSET 0x04
#define _I2S_OUT_CHAN_LRDATA_POL_OFFSET _I2S_OUT_CHAN_CTRL_OFFSET
#define _I2S_OUT_CHAN_LRDATA_POL_SHIFT 12
#define _I2S_OUT_CHAN_LRDATA_POL_MASK 0x00001000
#define _I2S_OUT_CHAN_LRFORCE_DIS_OFFSET _I2S_OUT_CHAN_CTRL_OFFSET
#define _I2S_OUT_CHAN_LRFORCE_DIS_SHIFT 11
#define _I2S_OUT_CHAN_LRFORCE_DIS_MASK 0x00000800
#define _I2S_OUT_CHAN_LOCK_DIS_OFFSET _I2S_OUT_CHAN_CTRL_OFFSET
#define _I2S_OUT_CHAN_LOCK_DIS_SHIFT 10
#define _I2S_OUT_CHAN_LOCK_DIS_MASK 0x00000400
#define _I2S_OUT_CHAN_REPEAT_OFFSET _I2S_OUT_CHAN_CTRL_OFFSET
#define _I2S_OUT_CHAN_REPEAT_SHIFT 9
#define _I2S_OUT_CHAN_REPEAT_MASK 0x00000200
#define _I2S_OUT_CHAN_PACKED_OFFSET _I2S_OUT_CHAN_CTRL_OFFSET
#define _I2S_OUT_CHAN_PACKED_SHIFT 8
#define _I2S_OUT_CHAN_PACKED_MASK 0x00000100
#define _I2S_OUT_CHAN_FORMAT_OFFSET _I2S_OUT_CHAN_CTRL_OFFSET
#define _I2S_OUT_CHAN_FORMAT_SHIFT 4
#define _I2S_OUT_CHAN_FORMAT_MASK 0x000000F0
#define _I2S_OUT_CHAN_MUSTBE1_OFFSET _I2S_OUT_CHAN_CTRL_OFFSET
#define _I2S_OUT_CHAN_MUSTB1_SHIFT 3
#define _I2S_OUT_CHAN_MUSTB1_MASK 0x00000008
#define _I2S_OUT_CHAN_FLUSH_OFFSET _I2S_OUT_CHAN_CTRL_OFFSET
#define _I2S_OUT_CHAN_FLUSH_SHIFT 2
#define _I2S_OUT_CHAN_FLUSH_MASK 0x00000004
#define _I2S_OUT_CHAN_PH_NSY_OFFSET _I2S_OUT_CHAN_CTRL_OFFSET
#define _I2S_OUT_CHAN_PH_NSY_SHIFT 1
#define _I2S_OUT_CHAN_PH_NSY_MASK 0x00000002
#define _I2S_OUT_CHAN_RUN_OFFSET _I2S_OUT_CHAN_CTRL_OFFSET
#define _I2S_OUT_CHAN_RUN_SHIFT 0
#define _I2S_OUT_CHAN_RUN_MASK 0x00000001
#define _I2S_OUT_SOFT_RESET_OFFSET 0x08
#define _I2S_OUT_CHAN_I_STATUS_OFFSET 0x08
#define _I2S_OUT_CHAN_I_ENABLE_OFFSET 0x0C
#define _I2S_OUT_CHAN_I_CLEAR_OFFSET 0x10
#define _I2S_OUT_SAMPLE_COUNT_OFFSET 0x1C
/* Helper to be used externally */
#define I2S_OUT_WRITE_REG(base, REG, value) \
iowrite32(value, (base)->audio_out + _REG_ADDRESS(REG))
#define I2S_OUT_SET_REG_FIELD(base, REG, value) \
{\
u32 temp = ioread32((base)->audio_out + _REG_ADDRESS(REG)); \
I2S_OUT_SET_FIELD(temp, REG, value); \
iowrite32(temp, (base)->audio_out + _REG_ADDRESS(REG)); \
}
#define I2S_OUT_SET_FIELD(data, FIELD, value) \
{\
data &= ~_REG_MASK(FIELD);\
data |= value << _REG_SHIFT(FIELD);\
}
static inline void I2S_OUT_RSET_CHAN_CONTROL(struct tz1090_i2s *base,
int channel,
u32 value)
{
iowrite32(value, base->audio_out + _I2S_OUT_CHANS_OFFSET +
channel * _I2S_OUT_CHANS_STRIDE +
_REG_ADDRESS(I2S_OUT_CHAN_CTRL));
}
static inline u32 I2S_OUT_RGET_CHAN_CONTROL(struct tz1090_i2s *base,
int channel)
{
return ioread32(base->audio_out + _I2S_OUT_CHANS_OFFSET +
channel * _I2S_OUT_CHANS_STRIDE +
_REG_ADDRESS(I2S_OUT_CHAN_CTRL));
}
static inline void I2S_OUT_RSET_MAIN_CONTROL(struct tz1090_i2s *base,
u32 value)
{
iowrite32(value, base->audio_out + _REG_ADDRESS(I2S_OUT_CONTROL));
}
static inline u32 I2S_OUT_RGET_MAIN_CONTROL(struct tz1090_i2s *base)
{
return ioread32(base->audio_out + _REG_ADDRESS(I2S_OUT_CONTROL));
}
/********************************** I2S IN ************************************/
#define _I2S_IN_DATA_OFFSET 0x00
#define _I2S_IN_CONTROL_OFFSET 0x04
#define _I2S_IN_RJUST_OFFSET _I2S_IN_CONTROL_OFFSET
#define _I2S_IN_RJUST_SHIFT 18
#define _I2S_IN_RJUST_MASK 0x00040000
#define _I2S_IN_CCDEL_OFFSET _I2S_IN_CONTROL_OFFSET
#define _I2S_IN_CCDEL_SHIFT 15
#define _I2S_IN_CCDEL_MASK 0x00038000
#define _I2S_IN_FEN_OFFSET _I2S_IN_CONTROL_OFFSET
#define _I2S_IN_FEN_SHIFT 14
#define _I2S_IN_FEN_MASK 0x00004000
#define _I2S_IN_FMODE_OFFSET _I2S_IN_CONTROL_OFFSET
#define _I2S_IN_FMODE_SHIFT 13
#define _I2S_IN_FMODE_MASK 0x00002000
#define _I2S_IN_FRAME_PACK_OFFSET _I2S_IN_CONTROL_OFFSET
#define _I2S_IN_FRAME_PACK_SHIFT 12
#define _I2S_IN_FRAME_PACK_MASK 0x00001000
#define _I2S_IN_LR_DATA_POL_OFFSET _I2S_IN_CONTROL_OFFSET
#define _I2S_IN_LR_DATA_POL_SHIFT 11
#define _I2S_IN_LR_DATA_POL_MASK 0x00000800
#define _I2S_IN_ALIGN_OFFSET _I2S_IN_CONTROL_OFFSET
#define _I2S_IN_ALIGN_SHIFT 10
#define _I2S_IN_ALIGN_MASK 0x00000400
#define _I2S_IN_PACKH_OFFSET _I2S_IN_CONTROL_OFFSET
#define _I2S_IN_PACKH_SHIFT 9
#define _I2S_IN_PACKH_MASK 0x00000200
#define _I2S_IN_LRDLY_OFFSET _I2S_IN_CONTROL_OFFSET
#define _I2S_IN_LRDLY_SHIFT 8
#define _I2S_IN_LRDLY_MASK 0x00000100
#define _I2S_IN_BCLKPOL_OFFSET _I2S_IN_CONTROL_OFFSET
#define _I2S_IN_BCLKPOL_SHIFT 7
#define _I2S_IN_BCLKPOL_MASK 0x00000080
#define _I2S_IN_FLUSHFIFO_OFFSET _I2S_IN_CONTROL_OFFSET
#define _I2S_IN_FLUSHFIFO_SHIFT 6
#define _I2S_IN_FLUSHFIFO_MASK 0x00000040
#define _I2S_IN_BOC_OFFSET _I2S_IN_CONTROL_OFFSET
#define _I2S_IN_BOC_SHIFT 5
#define _I2S_IN_BOC_MASK 0x00000020
#define _I2S_IN_CET_OFFSET _I2S_IN_CONTROL_OFFSET
#define _I2S_IN_CET_SHIFT 4
#define _I2S_IN_CET_MASK 0x00000010
#define _I2S_IN_LRD_OFFSET _I2S_IN_CONTROL_OFFSET
#define _I2S_IN_LRD_SHIFT 3
#define _I2S_IN_LRD_MASK 0x00000008
#define _I2S_IN_FRAME_WIDTH_OFFSET _I2S_IN_CONTROL_OFFSET
#define _I2S_IN_FRAME_WIDTH_SHIFT 2
#define _I2S_IN_FRAME_WIDTH_MASK 0x00000004
#define _I2S_IN_SAMPLE_WIDTH_OFFSET _I2S_IN_CONTROL_OFFSET
#define _I2S_IN_SAMPLE_WIDTH_SHIFT 1
#define _I2S_IN_SAMPLE_WIDTH_MASK 0x00000002
#define _I2S_IN_ENABLE_OFFSET _I2S_IN_CONTROL_OFFSET
#define _I2S_IN_ENABLE_SHIFT 0
#define _I2S_IN_ENABLE_MASK 0x00000001
#define _I2S_IN_STATUS_OFFSET 0x08
#define _I2S_IN_INT_EN_OFFSET 0x0c
#define _I2S_IN_SAMPLE_CNT_OFFSET 0x10
#define _I2S_IN_SOFT_REST_OFFSET 0x14
#define _I2S_IN_REVISON_OFFSET 0x1c
/* Helper to be used externally */
#define I2S_IN_SET_FIELD(data, FIELD, value) \
{\
data &= ~_REG_MASK(FIELD);\
data |= value << _REG_SHIFT(FIELD);\
}
static inline void I2S_IN_RSET_CONTROL(struct tz1090_i2s *base,
u32 value)
{
iowrite32(value, base->audio_in + _REG_ADDRESS(I2S_IN_CONTROL));
}
static inline u32 I2S_IN_RGET_CONTROL(struct tz1090_i2s *base)
{
return ioread32(base->audio_in + _REG_ADDRESS(I2S_IN_CONTROL));
}
#endif /* TZ1090I2S_H_ */