128 lines · c
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 167 8#define CYGNUS_MAX_PLAYBACK_PORTS 49#define CYGNUS_MAX_CAPTURE_PORTS 310#define CYGNUS_MAX_I2S_PORTS 311#define CYGNUS_MAX_PORTS CYGNUS_MAX_PLAYBACK_PORTS12#define CYGNUS_AUIDO_MAX_NUM_CLKS 313 14#define CYGNUS_SSP_FRAMEBITS_DIV 115 16#define CYGNUS_SSPMODE_I2S 017#define CYGNUS_SSPMODE_TDM 118#define CYGNUS_SSPMODE_UNKNOWN -119 20#define CYGNUS_SSP_CLKSRC_PLL 021 22/* Max string length of our dt property names */23#define PROP_LEN_MAX 4024 25struct 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 55enum cygnus_audio_port_type {56 PORT_TDM,57 PORT_SPDIF,58};59 60struct 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 74struct cygnus_track_clk {75 bool cap_en;76 bool play_en;77 bool cap_clk_en;78 bool play_clk_en;79};80 81struct 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 107struct 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 120extern int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai,121 int len);122extern int cygnus_soc_platform_register(struct device *dev,123 struct cygnus_audio *cygaud);124extern int cygnus_soc_platform_unregister(struct device *dev);125extern int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai,126 int len);127#endif128