Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * fsl_ssi.h - ALSA SSI interface for the Freescale MPC8610 and i.MX SoC
0004  *
0005  * Author: Timur Tabi <timur@freescale.com>
0006  *
0007  * Copyright 2007-2008 Freescale Semiconductor, Inc.
0008  */
0009 
0010 #ifndef _MPC8610_I2S_H
0011 #define _MPC8610_I2S_H
0012 
0013 /* -- SSI Register Map -- */
0014 
0015 /* SSI Transmit Data Register 0 */
0016 #define REG_SSI_STX0            0x00
0017 /* SSI Transmit Data Register 1 */
0018 #define REG_SSI_STX1            0x04
0019 /* SSI Receive Data Register 0 */
0020 #define REG_SSI_SRX0            0x08
0021 /* SSI Receive Data Register 1 */
0022 #define REG_SSI_SRX1            0x0c
0023 /* SSI Control Register */
0024 #define REG_SSI_SCR         0x10
0025 /* SSI Interrupt Status Register */
0026 #define REG_SSI_SISR            0x14
0027 /* SSI Interrupt Enable Register */
0028 #define REG_SSI_SIER            0x18
0029 /* SSI Transmit Configuration Register */
0030 #define REG_SSI_STCR            0x1c
0031 /* SSI Receive Configuration Register */
0032 #define REG_SSI_SRCR            0x20
0033 #define REG_SSI_SxCR(tx)        ((tx) ? REG_SSI_STCR : REG_SSI_SRCR)
0034 /* SSI Transmit Clock Control Register */
0035 #define REG_SSI_STCCR           0x24
0036 /* SSI Receive Clock Control Register */
0037 #define REG_SSI_SRCCR           0x28
0038 #define REG_SSI_SxCCR(tx)       ((tx) ? REG_SSI_STCCR : REG_SSI_SRCCR)
0039 /* SSI FIFO Control/Status Register */
0040 #define REG_SSI_SFCSR           0x2c
0041 /*
0042  * SSI Test Register (Intended for debugging purposes only)
0043  *
0044  * Note: STR is not documented in recent IMX datasheet, but
0045  * is described in IMX51 reference manual at section 56.3.3.14
0046  */
0047 #define REG_SSI_STR         0x30
0048 /*
0049  * SSI Option Register (Intended for internal use only)
0050  *
0051  * Note: SOR is not documented in recent IMX datasheet, but
0052  * is described in IMX51 reference manual at section 56.3.3.15
0053  */
0054 #define REG_SSI_SOR         0x34
0055 /* SSI AC97 Control Register */
0056 #define REG_SSI_SACNT           0x38
0057 /* SSI AC97 Command Address Register */
0058 #define REG_SSI_SACADD          0x3c
0059 /* SSI AC97 Command Data Register */
0060 #define REG_SSI_SACDAT          0x40
0061 /* SSI AC97 Tag Register */
0062 #define REG_SSI_SATAG           0x44
0063 /* SSI Transmit Time Slot Mask Register */
0064 #define REG_SSI_STMSK           0x48
0065 /* SSI  Receive Time Slot Mask Register */
0066 #define REG_SSI_SRMSK           0x4c
0067 #define REG_SSI_SxMSK(tx)       ((tx) ? REG_SSI_STMSK : REG_SSI_SRMSK)
0068 /*
0069  * SSI AC97 Channel Status Register
0070  *
0071  * The status could be changed by:
0072  * 1) Writing a '1' bit at some position in SACCEN sets relevant bit in SACCST
0073  * 2) Writing a '1' bit at some position in SACCDIS unsets the relevant bit
0074  * 3) Receivng a '1' in SLOTREQ bit from external CODEC via AC Link
0075  */
0076 #define REG_SSI_SACCST          0x50
0077 /* SSI AC97 Channel Enable Register -- Set bits in SACCST */
0078 #define REG_SSI_SACCEN          0x54
0079 /* SSI AC97 Channel Disable Register -- Clear bits in SACCST */
0080 #define REG_SSI_SACCDIS         0x58
0081 
0082 /* -- SSI Register Field Maps -- */
0083 
0084 /* SSI Control Register -- REG_SSI_SCR 0x10 */
0085 #define SSI_SCR_SYNC_TX_FS      0x00001000
0086 #define SSI_SCR_RFR_CLK_DIS     0x00000800
0087 #define SSI_SCR_TFR_CLK_DIS     0x00000400
0088 #define SSI_SCR_TCH_EN          0x00000100
0089 #define SSI_SCR_SYS_CLK_EN      0x00000080
0090 #define SSI_SCR_I2S_MODE_MASK       0x00000060
0091 #define SSI_SCR_I2S_MODE_NORMAL     0x00000000
0092 #define SSI_SCR_I2S_MODE_MASTER     0x00000020
0093 #define SSI_SCR_I2S_MODE_SLAVE      0x00000040
0094 #define SSI_SCR_SYN         0x00000010
0095 #define SSI_SCR_NET         0x00000008
0096 #define SSI_SCR_I2S_NET_MASK        (SSI_SCR_NET | SSI_SCR_I2S_MODE_MASK)
0097 #define SSI_SCR_RE          0x00000004
0098 #define SSI_SCR_TE          0x00000002
0099 #define SSI_SCR_SSIEN           0x00000001
0100 
0101 /* SSI Interrupt Status Register -- REG_SSI_SISR 0x14 */
0102 #define SSI_SISR_RFRC           0x01000000
0103 #define SSI_SISR_TFRC           0x00800000
0104 #define SSI_SISR_CMDAU          0x00040000
0105 #define SSI_SISR_CMDDU          0x00020000
0106 #define SSI_SISR_RXT            0x00010000
0107 #define SSI_SISR_RDR1           0x00008000
0108 #define SSI_SISR_RDR0           0x00004000
0109 #define SSI_SISR_TDE1           0x00002000
0110 #define SSI_SISR_TDE0           0x00001000
0111 #define SSI_SISR_ROE1           0x00000800
0112 #define SSI_SISR_ROE0           0x00000400
0113 #define SSI_SISR_TUE1           0x00000200
0114 #define SSI_SISR_TUE0           0x00000100
0115 #define SSI_SISR_TFS            0x00000080
0116 #define SSI_SISR_RFS            0x00000040
0117 #define SSI_SISR_TLS            0x00000020
0118 #define SSI_SISR_RLS            0x00000010
0119 #define SSI_SISR_RFF1           0x00000008
0120 #define SSI_SISR_RFF0           0x00000004
0121 #define SSI_SISR_TFE1           0x00000002
0122 #define SSI_SISR_TFE0           0x00000001
0123 
0124 /* SSI Interrupt Enable Register -- REG_SSI_SIER 0x18 */
0125 #define SSI_SIER_RFRC_EN        0x01000000
0126 #define SSI_SIER_TFRC_EN        0x00800000
0127 #define SSI_SIER_RDMAE          0x00400000
0128 #define SSI_SIER_RIE            0x00200000
0129 #define SSI_SIER_TDMAE          0x00100000
0130 #define SSI_SIER_TIE            0x00080000
0131 #define SSI_SIER_CMDAU_EN       0x00040000
0132 #define SSI_SIER_CMDDU_EN       0x00020000
0133 #define SSI_SIER_RXT_EN         0x00010000
0134 #define SSI_SIER_RDR1_EN        0x00008000
0135 #define SSI_SIER_RDR0_EN        0x00004000
0136 #define SSI_SIER_TDE1_EN        0x00002000
0137 #define SSI_SIER_TDE0_EN        0x00001000
0138 #define SSI_SIER_ROE1_EN        0x00000800
0139 #define SSI_SIER_ROE0_EN        0x00000400
0140 #define SSI_SIER_TUE1_EN        0x00000200
0141 #define SSI_SIER_TUE0_EN        0x00000100
0142 #define SSI_SIER_TFS_EN         0x00000080
0143 #define SSI_SIER_RFS_EN         0x00000040
0144 #define SSI_SIER_TLS_EN         0x00000020
0145 #define SSI_SIER_RLS_EN         0x00000010
0146 #define SSI_SIER_RFF1_EN        0x00000008
0147 #define SSI_SIER_RFF0_EN        0x00000004
0148 #define SSI_SIER_TFE1_EN        0x00000002
0149 #define SSI_SIER_TFE0_EN        0x00000001
0150 
0151 /* SSI Transmit Configuration Register -- REG_SSI_STCR 0x1C */
0152 #define SSI_STCR_TXBIT0         0x00000200
0153 #define SSI_STCR_TFEN1          0x00000100
0154 #define SSI_STCR_TFEN0          0x00000080
0155 #define SSI_STCR_TFDIR          0x00000040
0156 #define SSI_STCR_TXDIR          0x00000020
0157 #define SSI_STCR_TSHFD          0x00000010
0158 #define SSI_STCR_TSCKP          0x00000008
0159 #define SSI_STCR_TFSI           0x00000004
0160 #define SSI_STCR_TFSL           0x00000002
0161 #define SSI_STCR_TEFS           0x00000001
0162 
0163 /* SSI Receive Configuration Register -- REG_SSI_SRCR 0x20 */
0164 #define SSI_SRCR_RXEXT          0x00000400
0165 #define SSI_SRCR_RXBIT0         0x00000200
0166 #define SSI_SRCR_RFEN1          0x00000100
0167 #define SSI_SRCR_RFEN0          0x00000080
0168 #define SSI_SRCR_RFDIR          0x00000040
0169 #define SSI_SRCR_RXDIR          0x00000020
0170 #define SSI_SRCR_RSHFD          0x00000010
0171 #define SSI_SRCR_RSCKP          0x00000008
0172 #define SSI_SRCR_RFSI           0x00000004
0173 #define SSI_SRCR_RFSL           0x00000002
0174 #define SSI_SRCR_REFS           0x00000001
0175 
0176 /*
0177  * SSI Transmit Clock Control Register -- REG_SSI_STCCR 0x24
0178  * SSI Receive Clock Control Register -- REG_SSI_SRCCR 0x28
0179  */
0180 #define SSI_SxCCR_DIV2_SHIFT        18
0181 #define SSI_SxCCR_DIV2          0x00040000
0182 #define SSI_SxCCR_PSR_SHIFT     17
0183 #define SSI_SxCCR_PSR           0x00020000
0184 #define SSI_SxCCR_WL_SHIFT      13
0185 #define SSI_SxCCR_WL_MASK       0x0001E000
0186 #define SSI_SxCCR_WL(x) \
0187     (((((x) / 2) - 1) << SSI_SxCCR_WL_SHIFT) & SSI_SxCCR_WL_MASK)
0188 #define SSI_SxCCR_DC_SHIFT      8
0189 #define SSI_SxCCR_DC_MASK       0x00001F00
0190 #define SSI_SxCCR_DC(x) \
0191     ((((x) - 1) << SSI_SxCCR_DC_SHIFT) & SSI_SxCCR_DC_MASK)
0192 #define SSI_SxCCR_PM_SHIFT      0
0193 #define SSI_SxCCR_PM_MASK       0x000000FF
0194 #define SSI_SxCCR_PM(x) \
0195     ((((x) - 1) << SSI_SxCCR_PM_SHIFT) & SSI_SxCCR_PM_MASK)
0196 
0197 /*
0198  * SSI FIFO Control/Status Register -- REG_SSI_SFCSR 0x2c
0199  *
0200  * Tx or Rx FIFO Counter -- SSI_SFCSR_xFCNTy Read-Only
0201  * Tx or Rx FIFO Watermarks -- SSI_SFCSR_xFWMy Read/Write
0202  */
0203 #define SSI_SFCSR_RFCNT1_SHIFT      28
0204 #define SSI_SFCSR_RFCNT1_MASK       0xF0000000
0205 #define SSI_SFCSR_RFCNT1(x) \
0206     (((x) & SSI_SFCSR_RFCNT1_MASK) >> SSI_SFCSR_RFCNT1_SHIFT)
0207 #define SSI_SFCSR_TFCNT1_SHIFT      24
0208 #define SSI_SFCSR_TFCNT1_MASK       0x0F000000
0209 #define SSI_SFCSR_TFCNT1(x) \
0210     (((x) & SSI_SFCSR_TFCNT1_MASK) >> SSI_SFCSR_TFCNT1_SHIFT)
0211 #define SSI_SFCSR_RFWM1_SHIFT       20
0212 #define SSI_SFCSR_RFWM1_MASK        0x00F00000
0213 #define SSI_SFCSR_RFWM1(x)  \
0214     (((x) << SSI_SFCSR_RFWM1_SHIFT) & SSI_SFCSR_RFWM1_MASK)
0215 #define SSI_SFCSR_TFWM1_SHIFT       16
0216 #define SSI_SFCSR_TFWM1_MASK        0x000F0000
0217 #define SSI_SFCSR_TFWM1(x)  \
0218     (((x) << SSI_SFCSR_TFWM1_SHIFT) & SSI_SFCSR_TFWM1_MASK)
0219 #define SSI_SFCSR_RFCNT0_SHIFT      12
0220 #define SSI_SFCSR_RFCNT0_MASK       0x0000F000
0221 #define SSI_SFCSR_RFCNT0(x) \
0222     (((x) & SSI_SFCSR_RFCNT0_MASK) >> SSI_SFCSR_RFCNT0_SHIFT)
0223 #define SSI_SFCSR_TFCNT0_SHIFT      8
0224 #define SSI_SFCSR_TFCNT0_MASK       0x00000F00
0225 #define SSI_SFCSR_TFCNT0(x) \
0226     (((x) & SSI_SFCSR_TFCNT0_MASK) >> SSI_SFCSR_TFCNT0_SHIFT)
0227 #define SSI_SFCSR_RFWM0_SHIFT       4
0228 #define SSI_SFCSR_RFWM0_MASK        0x000000F0
0229 #define SSI_SFCSR_RFWM0(x)  \
0230     (((x) << SSI_SFCSR_RFWM0_SHIFT) & SSI_SFCSR_RFWM0_MASK)
0231 #define SSI_SFCSR_TFWM0_SHIFT       0
0232 #define SSI_SFCSR_TFWM0_MASK        0x0000000F
0233 #define SSI_SFCSR_TFWM0(x)  \
0234     (((x) << SSI_SFCSR_TFWM0_SHIFT) & SSI_SFCSR_TFWM0_MASK)
0235 
0236 /* SSI Test Register -- REG_SSI_STR 0x30 */
0237 #define SSI_STR_TEST            0x00008000
0238 #define SSI_STR_RCK2TCK         0x00004000
0239 #define SSI_STR_RFS2TFS         0x00002000
0240 #define SSI_STR_RXSTATE(x)      (((x) >> 8) & 0x1F)
0241 #define SSI_STR_TXD2RXD         0x00000080
0242 #define SSI_STR_TCK2RCK         0x00000040
0243 #define SSI_STR_TFS2RFS         0x00000020
0244 #define SSI_STR_TXSTATE(x)      ((x) & 0x1F)
0245 
0246 /* SSI Option Register -- REG_SSI_SOR 0x34 */
0247 #define SSI_SOR_CLKOFF          0x00000040
0248 #define SSI_SOR_RX_CLR          0x00000020
0249 #define SSI_SOR_TX_CLR          0x00000010
0250 #define SSI_SOR_xX_CLR(tx)      ((tx) ? SSI_SOR_TX_CLR : SSI_SOR_RX_CLR)
0251 #define SSI_SOR_INIT            0x00000008
0252 #define SSI_SOR_WAIT_SHIFT      1
0253 #define SSI_SOR_WAIT_MASK       0x00000006
0254 #define SSI_SOR_WAIT(x)         (((x) & 3) << SSI_SOR_WAIT_SHIFT)
0255 #define SSI_SOR_SYNRST          0x00000001
0256 
0257 /* SSI AC97 Control Register -- REG_SSI_SACNT 0x38 */
0258 #define SSI_SACNT_FRDIV(x)      (((x) & 0x3f) << 5)
0259 #define SSI_SACNT_WR            0x00000010
0260 #define SSI_SACNT_RD            0x00000008
0261 #define SSI_SACNT_RDWR_MASK     0x00000018
0262 #define SSI_SACNT_TIF           0x00000004
0263 #define SSI_SACNT_FV            0x00000002
0264 #define SSI_SACNT_AC97EN        0x00000001
0265 
0266 
0267 struct device;
0268 
0269 #if IS_ENABLED(CONFIG_DEBUG_FS)
0270 
0271 struct fsl_ssi_dbg {
0272     struct dentry *dbg_dir;
0273 
0274     struct {
0275         unsigned int rfrc;
0276         unsigned int tfrc;
0277         unsigned int cmdau;
0278         unsigned int cmddu;
0279         unsigned int rxt;
0280         unsigned int rdr1;
0281         unsigned int rdr0;
0282         unsigned int tde1;
0283         unsigned int tde0;
0284         unsigned int roe1;
0285         unsigned int roe0;
0286         unsigned int tue1;
0287         unsigned int tue0;
0288         unsigned int tfs;
0289         unsigned int rfs;
0290         unsigned int tls;
0291         unsigned int rls;
0292         unsigned int rff1;
0293         unsigned int rff0;
0294         unsigned int tfe1;
0295         unsigned int tfe0;
0296     } stats;
0297 };
0298 
0299 void fsl_ssi_dbg_isr(struct fsl_ssi_dbg *ssi_dbg, u32 sisr);
0300 
0301 void fsl_ssi_debugfs_create(struct fsl_ssi_dbg *ssi_dbg, struct device *dev);
0302 
0303 void fsl_ssi_debugfs_remove(struct fsl_ssi_dbg *ssi_dbg);
0304 
0305 #else
0306 
0307 struct fsl_ssi_dbg {
0308 };
0309 
0310 static inline void fsl_ssi_dbg_isr(struct fsl_ssi_dbg *stats, u32 sisr)
0311 {
0312 }
0313 
0314 static inline void fsl_ssi_debugfs_create(struct fsl_ssi_dbg *ssi_dbg,
0315                       struct device *dev)
0316 {
0317 }
0318 
0319 static inline void fsl_ssi_debugfs_remove(struct fsl_ssi_dbg *ssi_dbg)
0320 {
0321 }
0322 #endif  /* ! IS_ENABLED(CONFIG_DEBUG_FS) */
0323 
0324 #endif