Commit | Line | Data |
---|---|---|
2aec85b2 TG |
1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* Copyright (C) 2014-2015 Broadcom Corporation */ | |
a6ee05d9 SR |
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 | ||
a6ee05d9 SR |
120 | extern int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai, |
121 | int len); | |
122 | extern int cygnus_soc_platform_register(struct device *dev, | |
123 | struct cygnus_audio *cygaud); | |
124 | extern int cygnus_soc_platform_unregister(struct device *dev); | |
125 | extern int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai, | |
126 | int len); | |
127 | #endif |