162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/* Copyright (C) 2014-2015 Broadcom Corporation */
362306a36Sopenharmony_ci#ifndef __CYGNUS_SSP_H__
462306a36Sopenharmony_ci#define __CYGNUS_SSP_H__
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#define CYGNUS_TDM_DAI_MAX_SLOTS 16
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#define CYGNUS_MAX_PLAYBACK_PORTS 4
962306a36Sopenharmony_ci#define CYGNUS_MAX_CAPTURE_PORTS 3
1062306a36Sopenharmony_ci#define CYGNUS_MAX_I2S_PORTS 3
1162306a36Sopenharmony_ci#define CYGNUS_MAX_PORTS  CYGNUS_MAX_PLAYBACK_PORTS
1262306a36Sopenharmony_ci#define CYGNUS_AUIDO_MAX_NUM_CLKS 3
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define CYGNUS_SSP_FRAMEBITS_DIV 1
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define CYGNUS_SSPMODE_I2S 0
1762306a36Sopenharmony_ci#define CYGNUS_SSPMODE_TDM 1
1862306a36Sopenharmony_ci#define CYGNUS_SSPMODE_UNKNOWN -1
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define CYGNUS_SSP_CLKSRC_PLL      0
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci/* Max string length of our dt property names */
2362306a36Sopenharmony_ci#define PROP_LEN_MAX 40
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistruct ringbuf_regs {
2662306a36Sopenharmony_ci	unsigned rdaddr;
2762306a36Sopenharmony_ci	unsigned wraddr;
2862306a36Sopenharmony_ci	unsigned baseaddr;
2962306a36Sopenharmony_ci	unsigned endaddr;
3062306a36Sopenharmony_ci	unsigned fmark;   /* freemark for play, fullmark for caputure */
3162306a36Sopenharmony_ci	unsigned period_bytes;
3262306a36Sopenharmony_ci	unsigned buf_size;
3362306a36Sopenharmony_ci};
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#define RINGBUF_REG_PLAYBACK(num) ((struct ringbuf_regs) { \
3662306a36Sopenharmony_ci	.rdaddr = SRC_RBUF_ ##num## _RDADDR_OFFSET, \
3762306a36Sopenharmony_ci	.wraddr = SRC_RBUF_ ##num## _WRADDR_OFFSET, \
3862306a36Sopenharmony_ci	.baseaddr = SRC_RBUF_ ##num## _BASEADDR_OFFSET, \
3962306a36Sopenharmony_ci	.endaddr = SRC_RBUF_ ##num## _ENDADDR_OFFSET, \
4062306a36Sopenharmony_ci	.fmark = SRC_RBUF_ ##num## _FREE_MARK_OFFSET, \
4162306a36Sopenharmony_ci	.period_bytes = 0, \
4262306a36Sopenharmony_ci	.buf_size = 0, \
4362306a36Sopenharmony_ci})
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci#define RINGBUF_REG_CAPTURE(num) ((struct ringbuf_regs)  { \
4662306a36Sopenharmony_ci	.rdaddr = DST_RBUF_ ##num## _RDADDR_OFFSET, \
4762306a36Sopenharmony_ci	.wraddr = DST_RBUF_ ##num## _WRADDR_OFFSET, \
4862306a36Sopenharmony_ci	.baseaddr = DST_RBUF_ ##num## _BASEADDR_OFFSET, \
4962306a36Sopenharmony_ci	.endaddr = DST_RBUF_ ##num## _ENDADDR_OFFSET, \
5062306a36Sopenharmony_ci	.fmark = DST_RBUF_ ##num## _FULL_MARK_OFFSET, \
5162306a36Sopenharmony_ci	.period_bytes = 0, \
5262306a36Sopenharmony_ci	.buf_size = 0, \
5362306a36Sopenharmony_ci})
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cienum cygnus_audio_port_type {
5662306a36Sopenharmony_ci	PORT_TDM,
5762306a36Sopenharmony_ci	PORT_SPDIF,
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistruct cygnus_ssp_regs {
6162306a36Sopenharmony_ci	u32 i2s_stream_cfg;
6262306a36Sopenharmony_ci	u32 i2s_cfg;
6362306a36Sopenharmony_ci	u32 i2s_cap_stream_cfg;
6462306a36Sopenharmony_ci	u32 i2s_cap_cfg;
6562306a36Sopenharmony_ci	u32 i2s_mclk_cfg;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	u32 bf_destch_ctrl;
6862306a36Sopenharmony_ci	u32 bf_destch_cfg;
6962306a36Sopenharmony_ci	u32 bf_sourcech_ctrl;
7062306a36Sopenharmony_ci	u32 bf_sourcech_cfg;
7162306a36Sopenharmony_ci	u32 bf_sourcech_grp;
7262306a36Sopenharmony_ci};
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_cistruct cygnus_track_clk {
7562306a36Sopenharmony_ci	bool cap_en;
7662306a36Sopenharmony_ci	bool play_en;
7762306a36Sopenharmony_ci	bool cap_clk_en;
7862306a36Sopenharmony_ci	bool play_clk_en;
7962306a36Sopenharmony_ci};
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_cistruct cygnus_aio_port {
8262306a36Sopenharmony_ci	int portnum;
8362306a36Sopenharmony_ci	int mode;
8462306a36Sopenharmony_ci	bool is_slave;
8562306a36Sopenharmony_ci	int streams_on;   /* will be 0 if both capture and play are off */
8662306a36Sopenharmony_ci	int fsync_width;
8762306a36Sopenharmony_ci	int port_type;
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	u32 mclk;
9062306a36Sopenharmony_ci	u32 lrclk;
9162306a36Sopenharmony_ci	u32 bit_per_frame;
9262306a36Sopenharmony_ci	u32 pll_clk_num;
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	struct cygnus_audio *cygaud;
9562306a36Sopenharmony_ci	struct cygnus_ssp_regs regs;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	struct ringbuf_regs play_rb_regs;
9862306a36Sopenharmony_ci	struct ringbuf_regs capture_rb_regs;
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci	struct snd_pcm_substream *play_stream;
10162306a36Sopenharmony_ci	struct snd_pcm_substream *capture_stream;
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci	struct cygnus_track_clk clk_trace;
10462306a36Sopenharmony_ci};
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_cistruct cygnus_audio {
10862306a36Sopenharmony_ci	struct cygnus_aio_port  portinfo[CYGNUS_MAX_PORTS];
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci	int irq_num;
11162306a36Sopenharmony_ci	void __iomem *audio;
11262306a36Sopenharmony_ci	struct device *dev;
11362306a36Sopenharmony_ci	void __iomem *i2s_in;
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci	struct clk *audio_clk[CYGNUS_AUIDO_MAX_NUM_CLKS];
11662306a36Sopenharmony_ci	int active_ports;
11762306a36Sopenharmony_ci	unsigned long vco_rate;
11862306a36Sopenharmony_ci};
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ciextern int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai,
12162306a36Sopenharmony_ci						int len);
12262306a36Sopenharmony_ciextern int cygnus_soc_platform_register(struct device *dev,
12362306a36Sopenharmony_ci					struct cygnus_audio *cygaud);
12462306a36Sopenharmony_ciextern int cygnus_soc_platform_unregister(struct device *dev);
12562306a36Sopenharmony_ciextern int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai,
12662306a36Sopenharmony_ci	int len);
12762306a36Sopenharmony_ci#endif
128