| /* SPDX-License-Identifier: GPL-2.0-only */ |
| /* Copyright (C) 2014-2015 Broadcom Corporation */ |
| #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 |