1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (C) 2014-2015 Broadcom Corporation 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or 5*4882a593Smuzhiyun * modify it under the terms of the GNU General Public License as 6*4882a593Smuzhiyun * published by the Free Software Foundation version 2. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * This program is distributed "as is" WITHOUT ANY WARRANTY of any 9*4882a593Smuzhiyun * kind, whether express or implied; without even the implied warranty 10*4882a593Smuzhiyun * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11*4882a593Smuzhiyun * GNU General Public License for more details. 12*4882a593Smuzhiyun */ 13*4882a593Smuzhiyun #ifndef __CYGNUS_SSP_H__ 14*4882a593Smuzhiyun #define __CYGNUS_SSP_H__ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #define CYGNUS_TDM_DAI_MAX_SLOTS 16 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define CYGNUS_MAX_PLAYBACK_PORTS 4 19*4882a593Smuzhiyun #define CYGNUS_MAX_CAPTURE_PORTS 3 20*4882a593Smuzhiyun #define CYGNUS_MAX_I2S_PORTS 3 21*4882a593Smuzhiyun #define CYGNUS_MAX_PORTS CYGNUS_MAX_PLAYBACK_PORTS 22*4882a593Smuzhiyun #define CYGNUS_AUIDO_MAX_NUM_CLKS 3 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define CYGNUS_SSP_FRAMEBITS_DIV 1 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #define CYGNUS_SSPMODE_I2S 0 27*4882a593Smuzhiyun #define CYGNUS_SSPMODE_TDM 1 28*4882a593Smuzhiyun #define CYGNUS_SSPMODE_UNKNOWN -1 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #define CYGNUS_SSP_CLKSRC_PLL 0 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /* Max string length of our dt property names */ 33*4882a593Smuzhiyun #define PROP_LEN_MAX 40 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun struct ringbuf_regs { 36*4882a593Smuzhiyun unsigned rdaddr; 37*4882a593Smuzhiyun unsigned wraddr; 38*4882a593Smuzhiyun unsigned baseaddr; 39*4882a593Smuzhiyun unsigned endaddr; 40*4882a593Smuzhiyun unsigned fmark; /* freemark for play, fullmark for caputure */ 41*4882a593Smuzhiyun unsigned period_bytes; 42*4882a593Smuzhiyun unsigned buf_size; 43*4882a593Smuzhiyun }; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #define RINGBUF_REG_PLAYBACK(num) ((struct ringbuf_regs) { \ 46*4882a593Smuzhiyun .rdaddr = SRC_RBUF_ ##num## _RDADDR_OFFSET, \ 47*4882a593Smuzhiyun .wraddr = SRC_RBUF_ ##num## _WRADDR_OFFSET, \ 48*4882a593Smuzhiyun .baseaddr = SRC_RBUF_ ##num## _BASEADDR_OFFSET, \ 49*4882a593Smuzhiyun .endaddr = SRC_RBUF_ ##num## _ENDADDR_OFFSET, \ 50*4882a593Smuzhiyun .fmark = SRC_RBUF_ ##num## _FREE_MARK_OFFSET, \ 51*4882a593Smuzhiyun .period_bytes = 0, \ 52*4882a593Smuzhiyun .buf_size = 0, \ 53*4882a593Smuzhiyun }) 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define RINGBUF_REG_CAPTURE(num) ((struct ringbuf_regs) { \ 56*4882a593Smuzhiyun .rdaddr = DST_RBUF_ ##num## _RDADDR_OFFSET, \ 57*4882a593Smuzhiyun .wraddr = DST_RBUF_ ##num## _WRADDR_OFFSET, \ 58*4882a593Smuzhiyun .baseaddr = DST_RBUF_ ##num## _BASEADDR_OFFSET, \ 59*4882a593Smuzhiyun .endaddr = DST_RBUF_ ##num## _ENDADDR_OFFSET, \ 60*4882a593Smuzhiyun .fmark = DST_RBUF_ ##num## _FULL_MARK_OFFSET, \ 61*4882a593Smuzhiyun .period_bytes = 0, \ 62*4882a593Smuzhiyun .buf_size = 0, \ 63*4882a593Smuzhiyun }) 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun enum cygnus_audio_port_type { 66*4882a593Smuzhiyun PORT_TDM, 67*4882a593Smuzhiyun PORT_SPDIF, 68*4882a593Smuzhiyun }; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun struct cygnus_ssp_regs { 71*4882a593Smuzhiyun u32 i2s_stream_cfg; 72*4882a593Smuzhiyun u32 i2s_cfg; 73*4882a593Smuzhiyun u32 i2s_cap_stream_cfg; 74*4882a593Smuzhiyun u32 i2s_cap_cfg; 75*4882a593Smuzhiyun u32 i2s_mclk_cfg; 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun u32 bf_destch_ctrl; 78*4882a593Smuzhiyun u32 bf_destch_cfg; 79*4882a593Smuzhiyun u32 bf_sourcech_ctrl; 80*4882a593Smuzhiyun u32 bf_sourcech_cfg; 81*4882a593Smuzhiyun u32 bf_sourcech_grp; 82*4882a593Smuzhiyun }; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun struct cygnus_track_clk { 85*4882a593Smuzhiyun bool cap_en; 86*4882a593Smuzhiyun bool play_en; 87*4882a593Smuzhiyun bool cap_clk_en; 88*4882a593Smuzhiyun bool play_clk_en; 89*4882a593Smuzhiyun }; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun struct cygnus_aio_port { 92*4882a593Smuzhiyun int portnum; 93*4882a593Smuzhiyun int mode; 94*4882a593Smuzhiyun bool is_slave; 95*4882a593Smuzhiyun int streams_on; /* will be 0 if both capture and play are off */ 96*4882a593Smuzhiyun int fsync_width; 97*4882a593Smuzhiyun int port_type; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun u32 mclk; 100*4882a593Smuzhiyun u32 lrclk; 101*4882a593Smuzhiyun u32 bit_per_frame; 102*4882a593Smuzhiyun u32 pll_clk_num; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun struct cygnus_audio *cygaud; 105*4882a593Smuzhiyun struct cygnus_ssp_regs regs; 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun struct ringbuf_regs play_rb_regs; 108*4882a593Smuzhiyun struct ringbuf_regs capture_rb_regs; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun struct snd_pcm_substream *play_stream; 111*4882a593Smuzhiyun struct snd_pcm_substream *capture_stream; 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun struct cygnus_track_clk clk_trace; 114*4882a593Smuzhiyun }; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun struct cygnus_audio { 118*4882a593Smuzhiyun struct cygnus_aio_port portinfo[CYGNUS_MAX_PORTS]; 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun int irq_num; 121*4882a593Smuzhiyun void __iomem *audio; 122*4882a593Smuzhiyun struct device *dev; 123*4882a593Smuzhiyun void __iomem *i2s_in; 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun struct clk *audio_clk[CYGNUS_AUIDO_MAX_NUM_CLKS]; 126*4882a593Smuzhiyun int active_ports; 127*4882a593Smuzhiyun unsigned long vco_rate; 128*4882a593Smuzhiyun }; 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun extern int cygnus_ssp_get_mode(struct snd_soc_dai *cpu_dai); 131*4882a593Smuzhiyun extern int cygnus_ssp_add_pll_tweak_controls(struct snd_soc_pcm_runtime *rtd); 132*4882a593Smuzhiyun extern int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai, 133*4882a593Smuzhiyun int len); 134*4882a593Smuzhiyun extern int cygnus_soc_platform_register(struct device *dev, 135*4882a593Smuzhiyun struct cygnus_audio *cygaud); 136*4882a593Smuzhiyun extern int cygnus_soc_platform_unregister(struct device *dev); 137*4882a593Smuzhiyun extern int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai, 138*4882a593Smuzhiyun int len); 139*4882a593Smuzhiyun #endif 140