/* * Copyright (C) 2014-2015 Broadcom Corporation * * 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 version 2. * * This program is distributed "as is" WITHOUT ANY WARRANTY of any * kind, whether express or implied; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifndef __CYGNUS_SSP_H__ #define __CYGNUS_SSP_H__ #define CYGNUS_TDM_DAI_MAX_SLOTS 16 #define CYGNUS_MAX_PLAYBACK_PORTS 4 #define CYGNUS_MAX_CAPTURE_PORTS 3 #define CYGNUS_MAX_I2S_PORTS 3 #define CYGNUS_MAX_PORTS CYGNUS_MAX_PLAYBACK_PORTS #define CYGNUS_AUIDO_MAX_NUM_CLKS 3 #define CYGNUS_SSP_FRAMEBITS_DIV 1 #define CYGNUS_SSPMODE_I2S 0 #define CYGNUS_SSPMODE_TDM 1 #define CYGNUS_SSPMODE_UNKNOWN -1 #define CYGNUS_SSP_CLKSRC_PLL 0 /* Max string length of our dt property names */ #define PROP_LEN_MAX 40 struct ringbuf_regs { unsigned rdaddr; unsigned wraddr; unsigned baseaddr; unsigned endaddr; unsigned fmark; /* freemark for play, fullmark for caputure */ unsigned period_bytes; unsigned buf_size; }; #define RINGBUF_REG_PLAYBACK(num) ((struct ringbuf_regs) { \ .rdaddr = SRC_RBUF_ ##num## _RDADDR_OFFSET, \ .wraddr = SRC_RBUF_ ##num## _WRADDR_OFFSET, \ .baseaddr = SRC_RBUF_ ##num## _BASEADDR_OFFSET, \ .endaddr = SRC_RBUF_ ##num## _ENDADDR_OFFSET, \ .fmark = SRC_RBUF_ ##num## _FREE_MARK_OFFSET, \ .period_bytes = 0, \ .buf_size = 0, \ }) #define RINGBUF_REG_CAPTURE(num) ((struct ringbuf_regs) { \ .rdaddr = DST_RBUF_ ##num## _RDADDR_OFFSET, \ .wraddr = DST_RBUF_ ##num## _WRADDR_OFFSET, \ .baseaddr = DST_RBUF_ ##num## _BASEADDR_OFFSET, \ .endaddr = DST_RBUF_ ##num## _ENDADDR_OFFSET, \ .fmark = DST_RBUF_ ##num## _FULL_MARK_OFFSET, \ .period_bytes = 0, \ .buf_size = 0, \ }) enum cygnus_audio_port_type { PORT_TDM, PORT_SPDIF, }; struct cygnus_ssp_regs { u32 i2s_stream_cfg; u32 i2s_cfg; u32 i2s_cap_stream_cfg; u32 i2s_cap_cfg; u32 i2s_mclk_cfg; u32 bf_destch_ctrl; u32 bf_destch_cfg; u32 bf_sourcech_ctrl; u32 bf_sourcech_cfg; u32 bf_sourcech_grp; }; struct cygnus_track_clk { bool cap_en; bool play_en; bool cap_clk_en; bool play_clk_en; }; struct cygnus_aio_port { int portnum; int mode; bool is_slave; int streams_on; /* will be 0 if both capture and play are off */ int fsync_width; int port_type; u32 mclk; u32 lrclk; u32 bit_per_frame; u32 pll_clk_num; struct cygnus_audio *cygaud; struct cygnus_ssp_regs regs; struct ringbuf_regs play_rb_regs; struct ringbuf_regs capture_rb_regs; struct snd_pcm_substream *play_stream; struct snd_pcm_substream *capture_stream; struct cygnus_track_clk clk_trace; }; struct cygnus_audio { struct cygnus_aio_port portinfo[CYGNUS_MAX_PORTS]; int irq_num; void __iomem *audio; struct device *dev; void __iomem *i2s_in; struct clk *audio_clk[CYGNUS_AUIDO_MAX_NUM_CLKS]; int active_ports; unsigned long vco_rate; }; extern int cygnus_ssp_get_mode(struct snd_soc_dai *cpu_dai); extern int cygnus_ssp_add_pll_tweak_controls(struct snd_soc_pcm_runtime *rtd); extern int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai, int len); extern int cygnus_soc_platform_register(struct device *dev, struct cygnus_audio *cygaud); extern int cygnus_soc_platform_unregister(struct device *dev); extern int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai, int len); #endif