fsl_ssi.h 10.2 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0 */
2
/*
N
Nicolin Chen 已提交
3
 * fsl_ssi.h - ALSA SSI interface for the Freescale MPC8610 and i.MX SoC
4 5 6
 *
 * Author: Timur Tabi <timur@freescale.com>
 *
7
 * Copyright 2007-2008 Freescale Semiconductor, Inc.
8 9 10 11 12
 */

#ifndef _MPC8610_I2S_H
#define _MPC8610_I2S_H

N
Nicolin Chen 已提交
13 14 15
/* -- SSI Register Map -- */

/* SSI Transmit Data Register 0 */
16
#define REG_SSI_STX0			0x00
N
Nicolin Chen 已提交
17
/* SSI Transmit Data Register 1 */
18
#define REG_SSI_STX1			0x04
N
Nicolin Chen 已提交
19
/* SSI Receive Data Register 0 */
20
#define REG_SSI_SRX0			0x08
N
Nicolin Chen 已提交
21
/* SSI Receive Data Register 1 */
22
#define REG_SSI_SRX1			0x0c
N
Nicolin Chen 已提交
23
/* SSI Control Register */
24
#define REG_SSI_SCR			0x10
N
Nicolin Chen 已提交
25
/* SSI Interrupt Status Register */
26
#define REG_SSI_SISR			0x14
N
Nicolin Chen 已提交
27
/* SSI Interrupt Enable Register */
28
#define REG_SSI_SIER			0x18
N
Nicolin Chen 已提交
29
/* SSI Transmit Configuration Register */
30
#define REG_SSI_STCR			0x1c
N
Nicolin Chen 已提交
31
/* SSI Receive Configuration Register */
32
#define REG_SSI_SRCR			0x20
33
#define REG_SSI_SxCR(tx)		((tx) ? REG_SSI_STCR : REG_SSI_SRCR)
N
Nicolin Chen 已提交
34
/* SSI Transmit Clock Control Register */
35
#define REG_SSI_STCCR			0x24
N
Nicolin Chen 已提交
36
/* SSI Receive Clock Control Register */
37
#define REG_SSI_SRCCR			0x28
38
#define REG_SSI_SxCCR(tx)		((tx) ? REG_SSI_STCCR : REG_SSI_SRCCR)
N
Nicolin Chen 已提交
39
/* SSI FIFO Control/Status Register */
40
#define REG_SSI_SFCSR			0x2c
N
Nicolin Chen 已提交
41 42 43 44 45 46
/*
 * SSI Test Register (Intended for debugging purposes only)
 *
 * Note: STR is not documented in recent IMX datasheet, but
 * is described in IMX51 reference manual at section 56.3.3.14
 */
47
#define REG_SSI_STR			0x30
N
Nicolin Chen 已提交
48 49 50 51 52 53
/*
 * SSI Option Register (Intended for internal use only)
 *
 * Note: SOR is not documented in recent IMX datasheet, but
 * is described in IMX51 reference manual at section 56.3.3.15
 */
54
#define REG_SSI_SOR			0x34
N
Nicolin Chen 已提交
55
/* SSI AC97 Control Register */
56
#define REG_SSI_SACNT			0x38
N
Nicolin Chen 已提交
57
/* SSI AC97 Command Address Register */
58
#define REG_SSI_SACADD			0x3c
N
Nicolin Chen 已提交
59
/* SSI AC97 Command Data Register */
60
#define REG_SSI_SACDAT			0x40
N
Nicolin Chen 已提交
61
/* SSI AC97 Tag Register */
62
#define REG_SSI_SATAG			0x44
N
Nicolin Chen 已提交
63
/* SSI Transmit Time Slot Mask Register */
64
#define REG_SSI_STMSK			0x48
N
Nicolin Chen 已提交
65
/* SSI  Receive Time Slot Mask Register */
66
#define REG_SSI_SRMSK			0x4c
67
#define REG_SSI_SxMSK(tx)		((tx) ? REG_SSI_STMSK : REG_SSI_SRMSK)
N
Nicolin Chen 已提交
68 69 70 71 72 73 74 75
/*
 * SSI AC97 Channel Status Register
 *
 * The status could be changed by:
 * 1) Writing a '1' bit at some position in SACCEN sets relevant bit in SACCST
 * 2) Writing a '1' bit at some position in SACCDIS unsets the relevant bit
 * 3) Receivng a '1' in SLOTREQ bit from external CODEC via AC Link
 */
76
#define REG_SSI_SACCST			0x50
N
Nicolin Chen 已提交
77
/* SSI AC97 Channel Enable Register -- Set bits in SACCST */
78
#define REG_SSI_SACCEN			0x54
N
Nicolin Chen 已提交
79
/* SSI AC97 Channel Disable Register -- Clear bits in SACCST */
80
#define REG_SSI_SACCDIS			0x58
81

N
Nicolin Chen 已提交
82 83
/* -- SSI Register Field Maps -- */

84 85 86 87 88 89 90 91 92 93 94 95
/* SSI Control Register -- REG_SSI_SCR 0x10 */
#define SSI_SCR_SYNC_TX_FS		0x00001000
#define SSI_SCR_RFR_CLK_DIS		0x00000800
#define SSI_SCR_TFR_CLK_DIS		0x00000400
#define SSI_SCR_TCH_EN			0x00000100
#define SSI_SCR_SYS_CLK_EN		0x00000080
#define SSI_SCR_I2S_MODE_MASK		0x00000060
#define SSI_SCR_I2S_MODE_NORMAL		0x00000000
#define SSI_SCR_I2S_MODE_MASTER		0x00000020
#define SSI_SCR_I2S_MODE_SLAVE		0x00000040
#define SSI_SCR_SYN			0x00000010
#define SSI_SCR_NET			0x00000008
96
#define SSI_SCR_I2S_NET_MASK		(SSI_SCR_NET | SSI_SCR_I2S_MODE_MASK)
97 98 99
#define SSI_SCR_RE			0x00000004
#define SSI_SCR_TE			0x00000002
#define SSI_SCR_SSIEN			0x00000001
100

101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
/* SSI Interrupt Status Register -- REG_SSI_SISR 0x14 */
#define SSI_SISR_RFRC			0x01000000
#define SSI_SISR_TFRC			0x00800000
#define SSI_SISR_CMDAU			0x00040000
#define SSI_SISR_CMDDU			0x00020000
#define SSI_SISR_RXT			0x00010000
#define SSI_SISR_RDR1			0x00008000
#define SSI_SISR_RDR0			0x00004000
#define SSI_SISR_TDE1			0x00002000
#define SSI_SISR_TDE0			0x00001000
#define SSI_SISR_ROE1			0x00000800
#define SSI_SISR_ROE0			0x00000400
#define SSI_SISR_TUE1			0x00000200
#define SSI_SISR_TUE0			0x00000100
#define SSI_SISR_TFS			0x00000080
#define SSI_SISR_RFS			0x00000040
#define SSI_SISR_TLS			0x00000020
#define SSI_SISR_RLS			0x00000010
#define SSI_SISR_RFF1			0x00000008
#define SSI_SISR_RFF0			0x00000004
#define SSI_SISR_TFE1			0x00000002
#define SSI_SISR_TFE0			0x00000001
123

124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
/* SSI Interrupt Enable Register -- REG_SSI_SIER 0x18 */
#define SSI_SIER_RFRC_EN		0x01000000
#define SSI_SIER_TFRC_EN		0x00800000
#define SSI_SIER_RDMAE			0x00400000
#define SSI_SIER_RIE			0x00200000
#define SSI_SIER_TDMAE			0x00100000
#define SSI_SIER_TIE			0x00080000
#define SSI_SIER_CMDAU_EN		0x00040000
#define SSI_SIER_CMDDU_EN		0x00020000
#define SSI_SIER_RXT_EN			0x00010000
#define SSI_SIER_RDR1_EN		0x00008000
#define SSI_SIER_RDR0_EN		0x00004000
#define SSI_SIER_TDE1_EN		0x00002000
#define SSI_SIER_TDE0_EN		0x00001000
#define SSI_SIER_ROE1_EN		0x00000800
#define SSI_SIER_ROE0_EN		0x00000400
#define SSI_SIER_TUE1_EN		0x00000200
#define SSI_SIER_TUE0_EN		0x00000100
#define SSI_SIER_TFS_EN			0x00000080
#define SSI_SIER_RFS_EN			0x00000040
#define SSI_SIER_TLS_EN			0x00000020
#define SSI_SIER_RLS_EN			0x00000010
#define SSI_SIER_RFF1_EN		0x00000008
#define SSI_SIER_RFF0_EN		0x00000004
#define SSI_SIER_TFE1_EN		0x00000002
#define SSI_SIER_TFE0_EN		0x00000001
150

151 152 153 154 155 156 157 158 159 160 161
/* SSI Transmit Configuration Register -- REG_SSI_STCR 0x1C */
#define SSI_STCR_TXBIT0			0x00000200
#define SSI_STCR_TFEN1			0x00000100
#define SSI_STCR_TFEN0			0x00000080
#define SSI_STCR_TFDIR			0x00000040
#define SSI_STCR_TXDIR			0x00000020
#define SSI_STCR_TSHFD			0x00000010
#define SSI_STCR_TSCKP			0x00000008
#define SSI_STCR_TFSI			0x00000004
#define SSI_STCR_TFSL			0x00000002
#define SSI_STCR_TEFS			0x00000001
162

163 164 165 166 167 168 169 170 171 172 173 174
/* SSI Receive Configuration Register -- REG_SSI_SRCR 0x20 */
#define SSI_SRCR_RXEXT			0x00000400
#define SSI_SRCR_RXBIT0			0x00000200
#define SSI_SRCR_RFEN1			0x00000100
#define SSI_SRCR_RFEN0			0x00000080
#define SSI_SRCR_RFDIR			0x00000040
#define SSI_SRCR_RXDIR			0x00000020
#define SSI_SRCR_RSHFD			0x00000010
#define SSI_SRCR_RSCKP			0x00000008
#define SSI_SRCR_RFSI			0x00000004
#define SSI_SRCR_RFSL			0x00000002
#define SSI_SRCR_REFS			0x00000001
175

N
Nicolin Chen 已提交
176
/*
177 178
 * SSI Transmit Clock Control Register -- REG_SSI_STCCR 0x24
 * SSI Receive Clock Control Register -- REG_SSI_SRCCR 0x28
N
Nicolin Chen 已提交
179
 */
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
#define SSI_SxCCR_DIV2_SHIFT		18
#define SSI_SxCCR_DIV2			0x00040000
#define SSI_SxCCR_PSR_SHIFT		17
#define SSI_SxCCR_PSR			0x00020000
#define SSI_SxCCR_WL_SHIFT		13
#define SSI_SxCCR_WL_MASK		0x0001E000
#define SSI_SxCCR_WL(x) \
	(((((x) / 2) - 1) << SSI_SxCCR_WL_SHIFT) & SSI_SxCCR_WL_MASK)
#define SSI_SxCCR_DC_SHIFT		8
#define SSI_SxCCR_DC_MASK		0x00001F00
#define SSI_SxCCR_DC(x) \
	((((x) - 1) << SSI_SxCCR_DC_SHIFT) & SSI_SxCCR_DC_MASK)
#define SSI_SxCCR_PM_SHIFT		0
#define SSI_SxCCR_PM_MASK		0x000000FF
#define SSI_SxCCR_PM(x) \
	((((x) - 1) << SSI_SxCCR_PM_SHIFT) & SSI_SxCCR_PM_MASK)
196 197

/*
198
 * SSI FIFO Control/Status Register -- REG_SSI_SFCSR 0x2c
N
Nicolin Chen 已提交
199
 *
200 201
 * Tx or Rx FIFO Counter -- SSI_SFCSR_xFCNTy Read-Only
 * Tx or Rx FIFO Watermarks -- SSI_SFCSR_xFWMy Read/Write
202
 */
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
#define SSI_SFCSR_RFCNT1_SHIFT		28
#define SSI_SFCSR_RFCNT1_MASK		0xF0000000
#define SSI_SFCSR_RFCNT1(x) \
	(((x) & SSI_SFCSR_RFCNT1_MASK) >> SSI_SFCSR_RFCNT1_SHIFT)
#define SSI_SFCSR_TFCNT1_SHIFT		24
#define SSI_SFCSR_TFCNT1_MASK		0x0F000000
#define SSI_SFCSR_TFCNT1(x) \
	(((x) & SSI_SFCSR_TFCNT1_MASK) >> SSI_SFCSR_TFCNT1_SHIFT)
#define SSI_SFCSR_RFWM1_SHIFT		20
#define SSI_SFCSR_RFWM1_MASK		0x00F00000
#define SSI_SFCSR_RFWM1(x)	\
	(((x) << SSI_SFCSR_RFWM1_SHIFT) & SSI_SFCSR_RFWM1_MASK)
#define SSI_SFCSR_TFWM1_SHIFT		16
#define SSI_SFCSR_TFWM1_MASK		0x000F0000
#define SSI_SFCSR_TFWM1(x)	\
	(((x) << SSI_SFCSR_TFWM1_SHIFT) & SSI_SFCSR_TFWM1_MASK)
#define SSI_SFCSR_RFCNT0_SHIFT		12
#define SSI_SFCSR_RFCNT0_MASK		0x0000F000
#define SSI_SFCSR_RFCNT0(x) \
	(((x) & SSI_SFCSR_RFCNT0_MASK) >> SSI_SFCSR_RFCNT0_SHIFT)
#define SSI_SFCSR_TFCNT0_SHIFT		8
#define SSI_SFCSR_TFCNT0_MASK		0x00000F00
#define SSI_SFCSR_TFCNT0(x) \
	(((x) & SSI_SFCSR_TFCNT0_MASK) >> SSI_SFCSR_TFCNT0_SHIFT)
#define SSI_SFCSR_RFWM0_SHIFT		4
#define SSI_SFCSR_RFWM0_MASK		0x000000F0
#define SSI_SFCSR_RFWM0(x)	\
	(((x) << SSI_SFCSR_RFWM0_SHIFT) & SSI_SFCSR_RFWM0_MASK)
#define SSI_SFCSR_TFWM0_SHIFT		0
#define SSI_SFCSR_TFWM0_MASK		0x0000000F
#define SSI_SFCSR_TFWM0(x)	\
	(((x) << SSI_SFCSR_TFWM0_SHIFT) & SSI_SFCSR_TFWM0_MASK)
235

236 237 238 239 240 241 242 243 244
/* SSI Test Register -- REG_SSI_STR 0x30 */
#define SSI_STR_TEST			0x00008000
#define SSI_STR_RCK2TCK			0x00004000
#define SSI_STR_RFS2TFS			0x00002000
#define SSI_STR_RXSTATE(x)		(((x) >> 8) & 0x1F)
#define SSI_STR_TXD2RXD			0x00000080
#define SSI_STR_TCK2RCK			0x00000040
#define SSI_STR_TFS2RFS			0x00000020
#define SSI_STR_TXSTATE(x)		((x) & 0x1F)
245

246 247 248 249
/* SSI Option Register -- REG_SSI_SOR 0x34 */
#define SSI_SOR_CLKOFF			0x00000040
#define SSI_SOR_RX_CLR			0x00000020
#define SSI_SOR_TX_CLR			0x00000010
250
#define SSI_SOR_xX_CLR(tx)		((tx) ? SSI_SOR_TX_CLR : SSI_SOR_RX_CLR)
251 252 253 254 255
#define SSI_SOR_INIT			0x00000008
#define SSI_SOR_WAIT_SHIFT		1
#define SSI_SOR_WAIT_MASK		0x00000006
#define SSI_SOR_WAIT(x)			(((x) & 3) << SSI_SOR_WAIT_SHIFT)
#define SSI_SOR_SYNRST			0x00000001
256

257 258 259 260 261 262 263 264
/* SSI AC97 Control Register -- REG_SSI_SACNT 0x38 */
#define SSI_SACNT_FRDIV(x)		(((x) & 0x3f) << 5)
#define SSI_SACNT_WR			0x00000010
#define SSI_SACNT_RD			0x00000008
#define SSI_SACNT_RDWR_MASK		0x00000018
#define SSI_SACNT_TIF			0x00000004
#define SSI_SACNT_FV			0x00000002
#define SSI_SACNT_AC97EN		0x00000001
265

266

267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
struct device;

#if IS_ENABLED(CONFIG_DEBUG_FS)

struct fsl_ssi_dbg {
	struct dentry *dbg_dir;
	struct dentry *dbg_stats;

	struct {
		unsigned int rfrc;
		unsigned int tfrc;
		unsigned int cmdau;
		unsigned int cmddu;
		unsigned int rxt;
		unsigned int rdr1;
		unsigned int rdr0;
		unsigned int tde1;
		unsigned int tde0;
		unsigned int roe1;
		unsigned int roe0;
		unsigned int tue1;
		unsigned int tue0;
		unsigned int tfs;
		unsigned int rfs;
		unsigned int tls;
		unsigned int rls;
		unsigned int rff1;
		unsigned int rff0;
		unsigned int tfe1;
		unsigned int tfe0;
	} stats;
};

void fsl_ssi_dbg_isr(struct fsl_ssi_dbg *ssi_dbg, u32 sisr);

int fsl_ssi_debugfs_create(struct fsl_ssi_dbg *ssi_dbg, struct device *dev);

void fsl_ssi_debugfs_remove(struct fsl_ssi_dbg *ssi_dbg);

#else

struct fsl_ssi_dbg {
};

static inline void fsl_ssi_dbg_isr(struct fsl_ssi_dbg *stats, u32 sisr)
{
}

static inline int fsl_ssi_debugfs_create(struct fsl_ssi_dbg *ssi_dbg,
316
					 struct device *dev)
317 318 319 320 321 322 323 324 325 326
{
	return 0;
}

static inline void fsl_ssi_debugfs_remove(struct fsl_ssi_dbg *ssi_dbg)
{
}
#endif  /* ! IS_ENABLED(CONFIG_DEBUG_FS) */

#endif