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