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