Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge remote-tracking branches 'asoc/topic/fsl', 'asoc/topic/fsl-ssi', 'asoc/topic/fsl_asrc' and 'asoc/topic/hdac_hdmi' into asoc-next

+963 -956
+8
include/sound/pcm.h
··· 169 169 #define SNDRV_PCM_FMTBIT_IMA_ADPCM _SNDRV_PCM_FMTBIT(IMA_ADPCM) 170 170 #define SNDRV_PCM_FMTBIT_MPEG _SNDRV_PCM_FMTBIT(MPEG) 171 171 #define SNDRV_PCM_FMTBIT_GSM _SNDRV_PCM_FMTBIT(GSM) 172 + #define SNDRV_PCM_FMTBIT_S20_LE _SNDRV_PCM_FMTBIT(S20_LE) 173 + #define SNDRV_PCM_FMTBIT_U20_LE _SNDRV_PCM_FMTBIT(U20_LE) 174 + #define SNDRV_PCM_FMTBIT_S20_BE _SNDRV_PCM_FMTBIT(S20_BE) 175 + #define SNDRV_PCM_FMTBIT_U20_BE _SNDRV_PCM_FMTBIT(U20_BE) 172 176 #define SNDRV_PCM_FMTBIT_SPECIAL _SNDRV_PCM_FMTBIT(SPECIAL) 173 177 #define SNDRV_PCM_FMTBIT_S24_3LE _SNDRV_PCM_FMTBIT(S24_3LE) 174 178 #define SNDRV_PCM_FMTBIT_U24_3LE _SNDRV_PCM_FMTBIT(U24_3LE) ··· 206 202 #define SNDRV_PCM_FMTBIT_FLOAT SNDRV_PCM_FMTBIT_FLOAT_LE 207 203 #define SNDRV_PCM_FMTBIT_FLOAT64 SNDRV_PCM_FMTBIT_FLOAT64_LE 208 204 #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE 205 + #define SNDRV_PCM_FMTBIT_S20 SNDRV_PCM_FMTBIT_S20_LE 206 + #define SNDRV_PCM_FMTBIT_U20 SNDRV_PCM_FMTBIT_U20_LE 209 207 #endif 210 208 #ifdef SNDRV_BIG_ENDIAN 211 209 #define SNDRV_PCM_FMTBIT_S16 SNDRV_PCM_FMTBIT_S16_BE ··· 219 213 #define SNDRV_PCM_FMTBIT_FLOAT SNDRV_PCM_FMTBIT_FLOAT_BE 220 214 #define SNDRV_PCM_FMTBIT_FLOAT64 SNDRV_PCM_FMTBIT_FLOAT64_BE 221 215 #define SNDRV_PCM_FMTBIT_IEC958_SUBFRAME SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE 216 + #define SNDRV_PCM_FMTBIT_S20 SNDRV_PCM_FMTBIT_S20_BE 217 + #define SNDRV_PCM_FMTBIT_U20 SNDRV_PCM_FMTBIT_U20_BE 222 218 #endif 223 219 224 220 struct snd_pcm_file {
+2
include/sound/soc-dai.h
··· 102 102 SNDRV_PCM_FMTBIT_S16_BE |\ 103 103 SNDRV_PCM_FMTBIT_S20_3LE |\ 104 104 SNDRV_PCM_FMTBIT_S20_3BE |\ 105 + SNDRV_PCM_FMTBIT_S20_LE |\ 106 + SNDRV_PCM_FMTBIT_S20_BE |\ 105 107 SNDRV_PCM_FMTBIT_S24_3LE |\ 106 108 SNDRV_PCM_FMTBIT_S24_3BE |\ 107 109 SNDRV_PCM_FMTBIT_S32_LE |\
+9
include/uapi/sound/asound.h
··· 214 214 #define SNDRV_PCM_FORMAT_IMA_ADPCM ((__force snd_pcm_format_t) 22) 215 215 #define SNDRV_PCM_FORMAT_MPEG ((__force snd_pcm_format_t) 23) 216 216 #define SNDRV_PCM_FORMAT_GSM ((__force snd_pcm_format_t) 24) 217 + #define SNDRV_PCM_FORMAT_S20_LE ((__force snd_pcm_format_t) 25) /* in four bytes, LSB justified */ 218 + #define SNDRV_PCM_FORMAT_S20_BE ((__force snd_pcm_format_t) 26) /* in four bytes, LSB justified */ 219 + #define SNDRV_PCM_FORMAT_U20_LE ((__force snd_pcm_format_t) 27) /* in four bytes, LSB justified */ 220 + #define SNDRV_PCM_FORMAT_U20_BE ((__force snd_pcm_format_t) 28) /* in four bytes, LSB justified */ 221 + /* gap in the numbering for a future standard linear format */ 217 222 #define SNDRV_PCM_FORMAT_SPECIAL ((__force snd_pcm_format_t) 31) 218 223 #define SNDRV_PCM_FORMAT_S24_3LE ((__force snd_pcm_format_t) 32) /* in three bytes */ 219 224 #define SNDRV_PCM_FORMAT_S24_3BE ((__force snd_pcm_format_t) 33) /* in three bytes */ ··· 253 248 #define SNDRV_PCM_FORMAT_FLOAT SNDRV_PCM_FORMAT_FLOAT_LE 254 249 #define SNDRV_PCM_FORMAT_FLOAT64 SNDRV_PCM_FORMAT_FLOAT64_LE 255 250 #define SNDRV_PCM_FORMAT_IEC958_SUBFRAME SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE 251 + #define SNDRV_PCM_FORMAT_S20 SNDRV_PCM_FORMAT_S20_LE 252 + #define SNDRV_PCM_FORMAT_U20 SNDRV_PCM_FORMAT_U20_LE 256 253 #endif 257 254 #ifdef SNDRV_BIG_ENDIAN 258 255 #define SNDRV_PCM_FORMAT_S16 SNDRV_PCM_FORMAT_S16_BE ··· 266 259 #define SNDRV_PCM_FORMAT_FLOAT SNDRV_PCM_FORMAT_FLOAT_BE 267 260 #define SNDRV_PCM_FORMAT_FLOAT64 SNDRV_PCM_FORMAT_FLOAT64_BE 268 261 #define SNDRV_PCM_FORMAT_IEC958_SUBFRAME SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE 262 + #define SNDRV_PCM_FORMAT_S20 SNDRV_PCM_FORMAT_S20_BE 263 + #define SNDRV_PCM_FORMAT_U20 SNDRV_PCM_FORMAT_U20_BE 269 264 #endif 270 265 271 266 typedef int __bitwise snd_pcm_subformat_t;
+18 -1
sound/core/pcm_misc.c
··· 163 163 .width = 32, .phys = 32, .le = 0, .signd = 0, 164 164 .silence = { 0x69, 0x69, 0x69, 0x69 }, 165 165 }, 166 - /* FIXME: the following three formats are not defined properly yet */ 166 + /* FIXME: the following two formats are not defined properly yet */ 167 167 [SNDRV_PCM_FORMAT_MPEG] = { 168 168 .le = -1, .signd = -1, 169 169 }, 170 170 [SNDRV_PCM_FORMAT_GSM] = { 171 171 .le = -1, .signd = -1, 172 172 }, 173 + [SNDRV_PCM_FORMAT_S20_LE] = { 174 + .width = 20, .phys = 32, .le = 1, .signd = 1, 175 + .silence = {}, 176 + }, 177 + [SNDRV_PCM_FORMAT_S20_BE] = { 178 + .width = 20, .phys = 32, .le = 0, .signd = 1, 179 + .silence = {}, 180 + }, 181 + [SNDRV_PCM_FORMAT_U20_LE] = { 182 + .width = 20, .phys = 32, .le = 1, .signd = 0, 183 + .silence = { 0x00, 0x00, 0x08, 0x00 }, 184 + }, 185 + [SNDRV_PCM_FORMAT_U20_BE] = { 186 + .width = 20, .phys = 32, .le = 0, .signd = 0, 187 + .silence = { 0x00, 0x08, 0x00, 0x00 }, 188 + }, 189 + /* FIXME: the following format is not defined properly yet */ 173 190 [SNDRV_PCM_FORMAT_SPECIAL] = { 174 191 .le = -1, .signd = -1, 175 192 },
+2
sound/soc/codecs/hdac_hdmi.c
··· 2186 2186 HDA_CODEC_EXT_ENTRY(0x80862809, 0x100000, "Skylake HDMI", 0), 2187 2187 HDA_CODEC_EXT_ENTRY(0x8086280a, 0x100000, "Broxton HDMI", 0), 2188 2188 HDA_CODEC_EXT_ENTRY(0x8086280b, 0x100000, "Kabylake HDMI", 0), 2189 + HDA_CODEC_EXT_ENTRY(0x8086280c, 0x100000, "Cannonlake HDMI", 2190 + &intel_glk_drv_data), 2189 2191 HDA_CODEC_EXT_ENTRY(0x8086280d, 0x100000, "Geminilake HDMI", 2190 2192 &intel_glk_drv_data), 2191 2193 {}
+2 -2
sound/soc/fsl/fsl-asoc-card.c
··· 442 442 443 443 if (fsl_asoc_card_is_ac97(priv)) { 444 444 #if IS_ENABLED(CONFIG_SND_AC97_CODEC) 445 - struct snd_soc_codec *codec = rtd->codec; 446 - struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec); 445 + struct snd_soc_component *component = rtd->codec_dai->component; 446 + struct snd_ac97 *ac97 = snd_soc_component_get_drvdata(component); 447 447 448 448 /* 449 449 * Use slots 3/4 for S/PDIF so SSI won't try to enable
+1 -1
sound/soc/fsl/fsl_asrc.h
··· 57 57 #define REG_ASRDOC 0x74 58 58 #define REG_ASRDI(i) (REG_ASRDIA + (i << 3)) 59 59 #define REG_ASRDO(i) (REG_ASRDOA + (i << 3)) 60 - #define REG_ASRDx(x, i) (x == IN ? REG_ASRDI(i) : REG_ASRDO(i)) 60 + #define REG_ASRDx(x, i) ((x) == IN ? REG_ASRDI(i) : REG_ASRDO(i)) 61 61 62 62 #define REG_ASRIDRHA 0x80 63 63 #define REG_ASRIDRLA 0x84
+646 -741
sound/soc/fsl/fsl_ssi.c
··· 69 69 * samples will be written to STX properly. 70 70 */ 71 71 #ifdef __BIG_ENDIAN 72 - #define FSLSSI_I2S_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_BE | \ 73 - SNDRV_PCM_FMTBIT_S18_3BE | SNDRV_PCM_FMTBIT_S20_3BE | \ 74 - SNDRV_PCM_FMTBIT_S24_3BE | SNDRV_PCM_FMTBIT_S24_BE) 72 + #define FSLSSI_I2S_FORMATS \ 73 + (SNDRV_PCM_FMTBIT_S8 | \ 74 + SNDRV_PCM_FMTBIT_S16_BE | \ 75 + SNDRV_PCM_FMTBIT_S18_3BE | \ 76 + SNDRV_PCM_FMTBIT_S20_3BE | \ 77 + SNDRV_PCM_FMTBIT_S24_3BE | \ 78 + SNDRV_PCM_FMTBIT_S24_BE) 75 79 #else 76 - #define FSLSSI_I2S_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE | \ 77 - SNDRV_PCM_FMTBIT_S18_3LE | SNDRV_PCM_FMTBIT_S20_3LE | \ 78 - SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_LE) 80 + #define FSLSSI_I2S_FORMATS \ 81 + (SNDRV_PCM_FMTBIT_S8 | \ 82 + SNDRV_PCM_FMTBIT_S16_LE | \ 83 + SNDRV_PCM_FMTBIT_S18_3LE | \ 84 + SNDRV_PCM_FMTBIT_S20_3LE | \ 85 + SNDRV_PCM_FMTBIT_S24_3LE | \ 86 + SNDRV_PCM_FMTBIT_S24_LE) 79 87 #endif 80 88 81 - #define FSLSSI_SIER_DBG_RX_FLAGS (CCSR_SSI_SIER_RFF0_EN | \ 82 - CCSR_SSI_SIER_RLS_EN | CCSR_SSI_SIER_RFS_EN | \ 83 - CCSR_SSI_SIER_ROE0_EN | CCSR_SSI_SIER_RFRC_EN) 84 - #define FSLSSI_SIER_DBG_TX_FLAGS (CCSR_SSI_SIER_TFE0_EN | \ 85 - CCSR_SSI_SIER_TLS_EN | CCSR_SSI_SIER_TFS_EN | \ 86 - CCSR_SSI_SIER_TUE0_EN | CCSR_SSI_SIER_TFRC_EN) 89 + #define FSLSSI_SIER_DBG_RX_FLAGS \ 90 + (SSI_SIER_RFF0_EN | \ 91 + SSI_SIER_RLS_EN | \ 92 + SSI_SIER_RFS_EN | \ 93 + SSI_SIER_ROE0_EN | \ 94 + SSI_SIER_RFRC_EN) 95 + #define FSLSSI_SIER_DBG_TX_FLAGS \ 96 + (SSI_SIER_TFE0_EN | \ 97 + SSI_SIER_TLS_EN | \ 98 + SSI_SIER_TFS_EN | \ 99 + SSI_SIER_TUE0_EN | \ 100 + SSI_SIER_TFRC_EN) 87 101 88 102 enum fsl_ssi_type { 89 103 FSL_SSI_MCP8610, ··· 106 92 FSL_SSI_MX51, 107 93 }; 108 94 109 - struct fsl_ssi_reg_val { 95 + struct fsl_ssi_regvals { 110 96 u32 sier; 111 97 u32 srcr; 112 98 u32 stcr; 113 99 u32 scr; 114 100 }; 115 101 116 - struct fsl_ssi_rxtx_reg_val { 117 - struct fsl_ssi_reg_val rx; 118 - struct fsl_ssi_reg_val tx; 119 - }; 120 - 121 102 static bool fsl_ssi_readable_reg(struct device *dev, unsigned int reg) 122 103 { 123 104 switch (reg) { 124 - case CCSR_SSI_SACCEN: 125 - case CCSR_SSI_SACCDIS: 105 + case REG_SSI_SACCEN: 106 + case REG_SSI_SACCDIS: 126 107 return false; 127 108 default: 128 109 return true; ··· 127 118 static bool fsl_ssi_volatile_reg(struct device *dev, unsigned int reg) 128 119 { 129 120 switch (reg) { 130 - case CCSR_SSI_STX0: 131 - case CCSR_SSI_STX1: 132 - case CCSR_SSI_SRX0: 133 - case CCSR_SSI_SRX1: 134 - case CCSR_SSI_SISR: 135 - case CCSR_SSI_SFCSR: 136 - case CCSR_SSI_SACNT: 137 - case CCSR_SSI_SACADD: 138 - case CCSR_SSI_SACDAT: 139 - case CCSR_SSI_SATAG: 140 - case CCSR_SSI_SACCST: 141 - case CCSR_SSI_SOR: 121 + case REG_SSI_STX0: 122 + case REG_SSI_STX1: 123 + case REG_SSI_SRX0: 124 + case REG_SSI_SRX1: 125 + case REG_SSI_SISR: 126 + case REG_SSI_SFCSR: 127 + case REG_SSI_SACNT: 128 + case REG_SSI_SACADD: 129 + case REG_SSI_SACDAT: 130 + case REG_SSI_SATAG: 131 + case REG_SSI_SACCST: 132 + case REG_SSI_SOR: 142 133 return true; 143 134 default: 144 135 return false; ··· 148 139 static bool fsl_ssi_precious_reg(struct device *dev, unsigned int reg) 149 140 { 150 141 switch (reg) { 151 - case CCSR_SSI_SRX0: 152 - case CCSR_SSI_SRX1: 153 - case CCSR_SSI_SISR: 154 - case CCSR_SSI_SACADD: 155 - case CCSR_SSI_SACDAT: 156 - case CCSR_SSI_SATAG: 142 + case REG_SSI_SRX0: 143 + case REG_SSI_SRX1: 144 + case REG_SSI_SISR: 145 + case REG_SSI_SACADD: 146 + case REG_SSI_SACDAT: 147 + case REG_SSI_SATAG: 157 148 return true; 158 149 default: 159 150 return false; ··· 163 154 static bool fsl_ssi_writeable_reg(struct device *dev, unsigned int reg) 164 155 { 165 156 switch (reg) { 166 - case CCSR_SSI_SRX0: 167 - case CCSR_SSI_SRX1: 168 - case CCSR_SSI_SACCST: 157 + case REG_SSI_SRX0: 158 + case REG_SSI_SRX1: 159 + case REG_SSI_SACCST: 169 160 return false; 170 161 default: 171 162 return true; ··· 173 164 } 174 165 175 166 static const struct regmap_config fsl_ssi_regconfig = { 176 - .max_register = CCSR_SSI_SACCDIS, 167 + .max_register = REG_SSI_SACCDIS, 177 168 .reg_bits = 32, 178 169 .val_bits = 32, 179 170 .reg_stride = 4, 180 171 .val_format_endian = REGMAP_ENDIAN_NATIVE, 181 - .num_reg_defaults_raw = CCSR_SSI_SACCDIS / sizeof(uint32_t) + 1, 172 + .num_reg_defaults_raw = REG_SSI_SACCDIS / sizeof(uint32_t) + 1, 182 173 .readable_reg = fsl_ssi_readable_reg, 183 174 .volatile_reg = fsl_ssi_volatile_reg, 184 175 .precious_reg = fsl_ssi_precious_reg, ··· 194 185 }; 195 186 196 187 /** 197 - * fsl_ssi_private: per-SSI private data 188 + * fsl_ssi: per-SSI private data 198 189 * 199 - * @reg: Pointer to the regmap registers 190 + * @regs: Pointer to the regmap registers 200 191 * @irq: IRQ of this SSI 201 192 * @cpu_dai_drv: CPU DAI driver for this device 202 193 * 203 194 * @dai_fmt: DAI configuration this device is currently used with 204 - * @i2s_mode: i2s and network mode configuration of the device. Is used to 205 - * switch between normal and i2s/network mode 206 - * mode depending on the number of channels 195 + * @i2s_net: I2S and Network mode configurations of SCR register 207 196 * @use_dma: DMA is used or FIQ with stream filter 208 - * @use_dual_fifo: DMA with support for both FIFOs used 209 - * @fifo_deph: Depth of the SSI FIFOs 210 - * @slot_width: width of each DAI slot 211 - * @slots: number of slots 212 - * @rxtx_reg_val: Specific register settings for receive/transmit configuration 197 + * @use_dual_fifo: DMA with support for dual FIFO mode 198 + * @has_ipg_clk_name: If "ipg" is in the clock name list of device tree 199 + * @fifo_depth: Depth of the SSI FIFOs 200 + * @slot_width: Width of each DAI slot 201 + * @slots: Number of slots 202 + * @regvals: Specific RX/TX register settings 213 203 * 214 - * @clk: SSI clock 215 - * @baudclk: SSI baud clock for master mode 204 + * @clk: Clock source to access register 205 + * @baudclk: Clock source to generate bit and frame-sync clocks 216 206 * @baudclk_streams: Active streams that are using baudclk 207 + * 208 + * @regcache_sfcsr: Cache sfcsr register value during suspend and resume 209 + * @regcache_sacnt: Cache sacnt register value during suspend and resume 217 210 * 218 211 * @dma_params_tx: DMA transmit parameters 219 212 * @dma_params_rx: DMA receive parameters ··· 223 212 * 224 213 * @fiq_params: FIQ stream filtering parameters 225 214 * 226 - * @pdev: Pointer to pdev used for deprecated fsl-ssi sound card 215 + * @pdev: Pointer to pdev when using fsl-ssi as sound card (ppc only) 216 + * TODO: Should be replaced with simple-sound-card 227 217 * 228 218 * @dbg_stats: Debugging statistics 229 219 * 230 220 * @soc: SoC specific data 221 + * @dev: Pointer to &pdev->dev 231 222 * 232 - * @fifo_watermark: the FIFO watermark setting. Notifies DMA when 233 - * there are @fifo_watermark or fewer words in TX fifo or 234 - * @fifo_watermark or more empty words in RX fifo. 235 - * @dma_maxburst: max number of words to transfer in one go. So far, 236 - * this is always the same as fifo_watermark. 223 + * @fifo_watermark: The FIFO watermark setting. Notifies DMA when there are 224 + * @fifo_watermark or fewer words in TX fifo or 225 + * @fifo_watermark or more empty words in RX fifo. 226 + * @dma_maxburst: Max number of words to transfer in one go. So far, 227 + * this is always the same as fifo_watermark. 228 + * 229 + * @ac97_reg_lock: Mutex lock to serialize AC97 register access operations 237 230 */ 238 - struct fsl_ssi_private { 231 + struct fsl_ssi { 239 232 struct regmap *regs; 240 233 int irq; 241 234 struct snd_soc_dai_driver cpu_dai_drv; 242 235 243 236 unsigned int dai_fmt; 244 - u8 i2s_mode; 237 + u8 i2s_net; 245 238 bool use_dma; 246 239 bool use_dual_fifo; 247 240 bool has_ipg_clk_name; 248 241 unsigned int fifo_depth; 249 242 unsigned int slot_width; 250 243 unsigned int slots; 251 - struct fsl_ssi_rxtx_reg_val rxtx_reg_val; 244 + struct fsl_ssi_regvals regvals[2]; 252 245 253 246 struct clk *clk; 254 247 struct clk *baudclk; 255 248 unsigned int baudclk_streams; 256 249 257 - /* regcache for volatile regs */ 258 250 u32 regcache_sfcsr; 259 251 u32 regcache_sacnt; 260 252 261 - /* DMA params */ 262 253 struct snd_dmaengine_dai_dma_data dma_params_tx; 263 254 struct snd_dmaengine_dai_dma_data dma_params_rx; 264 255 dma_addr_t ssi_phys; 265 256 266 - /* params for non-dma FIQ stream filtered mode */ 267 257 struct imx_pcm_fiq_params fiq_params; 268 258 269 - /* Used when using fsl-ssi as sound-card. This is only used by ppc and 270 - * should be replaced with simple-sound-card. */ 271 259 struct platform_device *pdev; 272 260 273 261 struct fsl_ssi_dbg dbg_stats; ··· 281 271 }; 282 272 283 273 /* 284 - * imx51 and later SoCs have a slightly different IP that allows the 285 - * SSI configuration while the SSI unit is running. 274 + * SoC specific data 286 275 * 287 - * More important, it is necessary on those SoCs to configure the 288 - * sperate TX/RX DMA bits just before starting the stream 289 - * (fsl_ssi_trigger). The SDMA unit has to be configured before fsl_ssi 290 - * sends any DMA requests to the SDMA unit, otherwise it is not defined 291 - * how the SDMA unit handles the DMA request. 292 - * 293 - * SDMA units are present on devices starting at imx35 but the imx35 294 - * reference manual states that the DMA bits should not be changed 295 - * while the SSI unit is running (SSIEN). So we support the necessary 296 - * online configuration of fsl-ssi starting at imx51. 276 + * Notes: 277 + * 1) SSI in earlier SoCS has critical bits in control registers that 278 + * cannot be changed after SSI starts running -- a software reset 279 + * (set SSIEN to 0) is required to change their values. So adding 280 + * an offline_config flag for these SoCs. 281 + * 2) SDMA is available since imx35. However, imx35 does not support 282 + * DMA bits changing when SSI is running, so set offline_config. 283 + * 3) imx51 and later versions support register configurations when 284 + * SSI is running (SSIEN); For these versions, DMA needs to be 285 + * configured before SSI sends DMA request to avoid an undefined 286 + * DMA request on the SDMA side. 297 287 */ 298 288 299 289 static struct fsl_ssi_soc_data fsl_ssi_mpc8610 = { 300 290 .imx = false, 301 291 .offline_config = true, 302 - .sisr_write_mask = CCSR_SSI_SISR_RFRC | CCSR_SSI_SISR_TFRC | 303 - CCSR_SSI_SISR_ROE0 | CCSR_SSI_SISR_ROE1 | 304 - CCSR_SSI_SISR_TUE0 | CCSR_SSI_SISR_TUE1, 292 + .sisr_write_mask = SSI_SISR_RFRC | SSI_SISR_TFRC | 293 + SSI_SISR_ROE0 | SSI_SISR_ROE1 | 294 + SSI_SISR_TUE0 | SSI_SISR_TUE1, 305 295 }; 306 296 307 297 static struct fsl_ssi_soc_data fsl_ssi_imx21 = { ··· 314 304 static struct fsl_ssi_soc_data fsl_ssi_imx35 = { 315 305 .imx = true, 316 306 .offline_config = true, 317 - .sisr_write_mask = CCSR_SSI_SISR_RFRC | CCSR_SSI_SISR_TFRC | 318 - CCSR_SSI_SISR_ROE0 | CCSR_SSI_SISR_ROE1 | 319 - CCSR_SSI_SISR_TUE0 | CCSR_SSI_SISR_TUE1, 307 + .sisr_write_mask = SSI_SISR_RFRC | SSI_SISR_TFRC | 308 + SSI_SISR_ROE0 | SSI_SISR_ROE1 | 309 + SSI_SISR_TUE0 | SSI_SISR_TUE1, 320 310 }; 321 311 322 312 static struct fsl_ssi_soc_data fsl_ssi_imx51 = { 323 313 .imx = true, 324 314 .offline_config = false, 325 - .sisr_write_mask = CCSR_SSI_SISR_ROE0 | CCSR_SSI_SISR_ROE1 | 326 - CCSR_SSI_SISR_TUE0 | CCSR_SSI_SISR_TUE1, 315 + .sisr_write_mask = SSI_SISR_ROE0 | SSI_SISR_ROE1 | 316 + SSI_SISR_TUE0 | SSI_SISR_TUE1, 327 317 }; 328 318 329 319 static const struct of_device_id fsl_ssi_ids[] = { ··· 335 325 }; 336 326 MODULE_DEVICE_TABLE(of, fsl_ssi_ids); 337 327 338 - static bool fsl_ssi_is_ac97(struct fsl_ssi_private *ssi_private) 328 + static bool fsl_ssi_is_ac97(struct fsl_ssi *ssi) 339 329 { 340 - return (ssi_private->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK) == 330 + return (ssi->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK) == 341 331 SND_SOC_DAIFMT_AC97; 342 332 } 343 333 344 - static bool fsl_ssi_is_i2s_master(struct fsl_ssi_private *ssi_private) 334 + static bool fsl_ssi_is_i2s_master(struct fsl_ssi *ssi) 345 335 { 346 - return (ssi_private->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) == 336 + return (ssi->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) == 347 337 SND_SOC_DAIFMT_CBS_CFS; 348 338 } 349 339 350 - static bool fsl_ssi_is_i2s_cbm_cfs(struct fsl_ssi_private *ssi_private) 340 + static bool fsl_ssi_is_i2s_cbm_cfs(struct fsl_ssi *ssi) 351 341 { 352 - return (ssi_private->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) == 342 + return (ssi->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) == 353 343 SND_SOC_DAIFMT_CBM_CFS; 354 344 } 345 + 355 346 /** 356 - * fsl_ssi_isr: SSI interrupt handler 357 - * 358 - * Although it's possible to use the interrupt handler to send and receive 359 - * data to/from the SSI, we use the DMA instead. Programming is more 360 - * complicated, but the performance is much better. 361 - * 362 - * This interrupt handler is used only to gather statistics. 363 - * 364 - * @irq: IRQ of the SSI device 365 - * @dev_id: pointer to the ssi_private structure for this SSI device 347 + * Interrupt handler to gather states 366 348 */ 367 349 static irqreturn_t fsl_ssi_isr(int irq, void *dev_id) 368 350 { 369 - struct fsl_ssi_private *ssi_private = dev_id; 370 - struct regmap *regs = ssi_private->regs; 351 + struct fsl_ssi *ssi = dev_id; 352 + struct regmap *regs = ssi->regs; 371 353 __be32 sisr; 372 354 __be32 sisr2; 373 355 374 - /* We got an interrupt, so read the status register to see what we 375 - were interrupted for. We mask it with the Interrupt Enable register 376 - so that we only check for events that we're interested in. 377 - */ 378 - regmap_read(regs, CCSR_SSI_SISR, &sisr); 356 + regmap_read(regs, REG_SSI_SISR, &sisr); 379 357 380 - sisr2 = sisr & ssi_private->soc->sisr_write_mask; 358 + sisr2 = sisr & ssi->soc->sisr_write_mask; 381 359 /* Clear the bits that we set */ 382 360 if (sisr2) 383 - regmap_write(regs, CCSR_SSI_SISR, sisr2); 361 + regmap_write(regs, REG_SSI_SISR, sisr2); 384 362 385 - fsl_ssi_dbg_isr(&ssi_private->dbg_stats, sisr); 363 + fsl_ssi_dbg_isr(&ssi->dbg_stats, sisr); 386 364 387 365 return IRQ_HANDLED; 388 366 } 389 367 390 - /* 391 - * Enable/Disable all rx/tx config flags at once. 368 + /** 369 + * Enable or disable all rx/tx config flags at once 392 370 */ 393 - static void fsl_ssi_rxtx_config(struct fsl_ssi_private *ssi_private, 394 - bool enable) 371 + static void fsl_ssi_rxtx_config(struct fsl_ssi *ssi, bool enable) 395 372 { 396 - struct regmap *regs = ssi_private->regs; 397 - struct fsl_ssi_rxtx_reg_val *vals = &ssi_private->rxtx_reg_val; 373 + struct regmap *regs = ssi->regs; 374 + struct fsl_ssi_regvals *vals = ssi->regvals; 398 375 399 376 if (enable) { 400 - regmap_update_bits(regs, CCSR_SSI_SIER, 401 - vals->rx.sier | vals->tx.sier, 402 - vals->rx.sier | vals->tx.sier); 403 - regmap_update_bits(regs, CCSR_SSI_SRCR, 404 - vals->rx.srcr | vals->tx.srcr, 405 - vals->rx.srcr | vals->tx.srcr); 406 - regmap_update_bits(regs, CCSR_SSI_STCR, 407 - vals->rx.stcr | vals->tx.stcr, 408 - vals->rx.stcr | vals->tx.stcr); 377 + regmap_update_bits(regs, REG_SSI_SIER, 378 + vals[RX].sier | vals[TX].sier, 379 + vals[RX].sier | vals[TX].sier); 380 + regmap_update_bits(regs, REG_SSI_SRCR, 381 + vals[RX].srcr | vals[TX].srcr, 382 + vals[RX].srcr | vals[TX].srcr); 383 + regmap_update_bits(regs, REG_SSI_STCR, 384 + vals[RX].stcr | vals[TX].stcr, 385 + vals[RX].stcr | vals[TX].stcr); 409 386 } else { 410 - regmap_update_bits(regs, CCSR_SSI_SRCR, 411 - vals->rx.srcr | vals->tx.srcr, 0); 412 - regmap_update_bits(regs, CCSR_SSI_STCR, 413 - vals->rx.stcr | vals->tx.stcr, 0); 414 - regmap_update_bits(regs, CCSR_SSI_SIER, 415 - vals->rx.sier | vals->tx.sier, 0); 387 + regmap_update_bits(regs, REG_SSI_SRCR, 388 + vals[RX].srcr | vals[TX].srcr, 0); 389 + regmap_update_bits(regs, REG_SSI_STCR, 390 + vals[RX].stcr | vals[TX].stcr, 0); 391 + regmap_update_bits(regs, REG_SSI_SIER, 392 + vals[RX].sier | vals[TX].sier, 0); 416 393 } 417 394 } 418 395 419 - /* 420 - * Clear RX or TX FIFO to remove samples from the previous 421 - * stream session which may be still present in the FIFO and 422 - * may introduce bad samples and/or channel slipping. 423 - * 424 - * Note: The SOR is not documented in recent IMX datasheet, but 425 - * is described in IMX51 reference manual at section 56.3.3.15. 396 + /** 397 + * Clear remaining data in the FIFO to avoid dirty data or channel slipping 426 398 */ 427 - static void fsl_ssi_fifo_clear(struct fsl_ssi_private *ssi_private, 428 - bool is_rx) 399 + static void fsl_ssi_fifo_clear(struct fsl_ssi *ssi, bool is_rx) 429 400 { 430 - if (is_rx) { 431 - regmap_update_bits(ssi_private->regs, CCSR_SSI_SOR, 432 - CCSR_SSI_SOR_RX_CLR, CCSR_SSI_SOR_RX_CLR); 433 - } else { 434 - regmap_update_bits(ssi_private->regs, CCSR_SSI_SOR, 435 - CCSR_SSI_SOR_TX_CLR, CCSR_SSI_SOR_TX_CLR); 436 - } 401 + bool tx = !is_rx; 402 + 403 + regmap_update_bits(ssi->regs, REG_SSI_SOR, 404 + SSI_SOR_xX_CLR(tx), SSI_SOR_xX_CLR(tx)); 437 405 } 438 406 439 - /* 407 + /** 440 408 * Calculate the bits that have to be disabled for the current stream that is 441 409 * getting disabled. This keeps the bits enabled that are necessary for the 442 410 * second stream to work if 'stream_active' is true. ··· 434 446 ((vals_disable) & \ 435 447 ((vals_disable) ^ ((vals_stream) * (u32)!!(stream_active)))) 436 448 437 - /* 438 - * Enable/Disable a ssi configuration. You have to pass either 439 - * ssi_private->rxtx_reg_val.rx or tx as vals parameter. 449 + /** 450 + * Enable or disable SSI configuration. 440 451 */ 441 - static void fsl_ssi_config(struct fsl_ssi_private *ssi_private, bool enable, 442 - struct fsl_ssi_reg_val *vals) 452 + static void fsl_ssi_config(struct fsl_ssi *ssi, bool enable, 453 + struct fsl_ssi_regvals *vals) 443 454 { 444 - struct regmap *regs = ssi_private->regs; 445 - struct fsl_ssi_reg_val *avals; 455 + struct regmap *regs = ssi->regs; 456 + struct fsl_ssi_regvals *avals; 446 457 int nr_active_streams; 447 - u32 scr_val; 458 + u32 scr; 448 459 int keep_active; 449 460 450 - regmap_read(regs, CCSR_SSI_SCR, &scr_val); 461 + regmap_read(regs, REG_SSI_SCR, &scr); 451 462 452 - nr_active_streams = !!(scr_val & CCSR_SSI_SCR_TE) + 453 - !!(scr_val & CCSR_SSI_SCR_RE); 463 + nr_active_streams = !!(scr & SSI_SCR_TE) + !!(scr & SSI_SCR_RE); 454 464 455 465 if (nr_active_streams - 1 > 0) 456 466 keep_active = 1; 457 467 else 458 468 keep_active = 0; 459 469 460 - /* Find the other direction values rx or tx which we do not want to 461 - * modify */ 462 - if (&ssi_private->rxtx_reg_val.rx == vals) 463 - avals = &ssi_private->rxtx_reg_val.tx; 470 + /* Get the opposite direction to keep its values untouched */ 471 + if (&ssi->regvals[RX] == vals) 472 + avals = &ssi->regvals[TX]; 464 473 else 465 - avals = &ssi_private->rxtx_reg_val.rx; 474 + avals = &ssi->regvals[RX]; 466 475 467 - /* If vals should be disabled, start with disabling the unit */ 468 476 if (!enable) { 477 + /* 478 + * To keep the other stream safe, exclude shared bits between 479 + * both streams, and get safe bits to disable current stream 480 + */ 469 481 u32 scr = fsl_ssi_disable_val(vals->scr, avals->scr, 470 - keep_active); 471 - regmap_update_bits(regs, CCSR_SSI_SCR, scr, 0); 482 + keep_active); 483 + /* Safely disable SCR register for the stream */ 484 + regmap_update_bits(regs, REG_SSI_SCR, scr, 0); 472 485 } 473 486 474 487 /* 475 - * We are running on a SoC which does not support online SSI 476 - * reconfiguration, so we have to enable all necessary flags at once 477 - * even if we do not use them later (capture and playback configuration) 488 + * For cases where online configuration is not supported, 489 + * 1) Enable all necessary bits of both streams when 1st stream starts 490 + * even if the opposite stream will not start 491 + * 2) Disable all remaining bits of both streams when last stream ends 478 492 */ 479 - if (ssi_private->soc->offline_config) { 480 - if ((enable && !nr_active_streams) || 481 - (!enable && !keep_active)) 482 - fsl_ssi_rxtx_config(ssi_private, enable); 493 + if (ssi->soc->offline_config) { 494 + if ((enable && !nr_active_streams) || (!enable && !keep_active)) 495 + fsl_ssi_rxtx_config(ssi, enable); 483 496 484 497 goto config_done; 485 498 } 486 499 487 - /* 488 - * Configure single direction units while the SSI unit is running 489 - * (online configuration) 490 - */ 500 + /* Online configure single direction while SSI is running */ 491 501 if (enable) { 492 - fsl_ssi_fifo_clear(ssi_private, vals->scr & CCSR_SSI_SCR_RE); 502 + fsl_ssi_fifo_clear(ssi, vals->scr & SSI_SCR_RE); 493 503 494 - regmap_update_bits(regs, CCSR_SSI_SRCR, vals->srcr, vals->srcr); 495 - regmap_update_bits(regs, CCSR_SSI_STCR, vals->stcr, vals->stcr); 496 - regmap_update_bits(regs, CCSR_SSI_SIER, vals->sier, vals->sier); 504 + regmap_update_bits(regs, REG_SSI_SRCR, vals->srcr, vals->srcr); 505 + regmap_update_bits(regs, REG_SSI_STCR, vals->stcr, vals->stcr); 506 + regmap_update_bits(regs, REG_SSI_SIER, vals->sier, vals->sier); 497 507 } else { 498 508 u32 sier; 499 509 u32 srcr; 500 510 u32 stcr; 501 511 502 512 /* 503 - * Disabling the necessary flags for one of rx/tx while the 504 - * other stream is active is a little bit more difficult. We 505 - * have to disable only those flags that differ between both 506 - * streams (rx XOR tx) and that are set in the stream that is 507 - * disabled now. Otherwise we could alter flags of the other 508 - * stream 513 + * To keep the other stream safe, exclude shared bits between 514 + * both streams, and get safe bits to disable current stream 509 515 */ 510 - 511 - /* These assignments are simply vals without bits set in avals*/ 512 516 sier = fsl_ssi_disable_val(vals->sier, avals->sier, 513 - keep_active); 517 + keep_active); 514 518 srcr = fsl_ssi_disable_val(vals->srcr, avals->srcr, 515 - keep_active); 519 + keep_active); 516 520 stcr = fsl_ssi_disable_val(vals->stcr, avals->stcr, 517 - keep_active); 521 + keep_active); 518 522 519 - regmap_update_bits(regs, CCSR_SSI_SRCR, srcr, 0); 520 - regmap_update_bits(regs, CCSR_SSI_STCR, stcr, 0); 521 - regmap_update_bits(regs, CCSR_SSI_SIER, sier, 0); 523 + /* Safely disable other control registers for the stream */ 524 + regmap_update_bits(regs, REG_SSI_SRCR, srcr, 0); 525 + regmap_update_bits(regs, REG_SSI_STCR, stcr, 0); 526 + regmap_update_bits(regs, REG_SSI_SIER, sier, 0); 522 527 } 523 528 524 529 config_done: 525 530 /* Enabling of subunits is done after configuration */ 526 531 if (enable) { 527 - if (ssi_private->use_dma && (vals->scr & CCSR_SSI_SCR_TE)) { 528 - /* 529 - * Be sure the Tx FIFO is filled when TE is set. 530 - * Otherwise, there are some chances to start the 531 - * playback with some void samples inserted first, 532 - * generating a channel slip. 533 - * 534 - * First, SSIEN must be set, to let the FIFO be filled. 535 - * 536 - * Notes: 537 - * - Limit this fix to the DMA case until FIQ cases can 538 - * be tested. 539 - * - Limit the length of the busy loop to not lock the 540 - * system too long, even if 1-2 loops are sufficient 541 - * in general. 542 - */ 532 + /* 533 + * Start DMA before setting TE to avoid FIFO underrun 534 + * which may cause a channel slip or a channel swap 535 + * 536 + * TODO: FIQ cases might also need this upon testing 537 + */ 538 + if (ssi->use_dma && (vals->scr & SSI_SCR_TE)) { 543 539 int i; 544 540 int max_loop = 100; 545 - regmap_update_bits(regs, CCSR_SSI_SCR, 546 - CCSR_SSI_SCR_SSIEN, CCSR_SSI_SCR_SSIEN); 541 + 542 + /* Enable SSI first to send TX DMA request */ 543 + regmap_update_bits(regs, REG_SSI_SCR, 544 + SSI_SCR_SSIEN, SSI_SCR_SSIEN); 545 + 546 + /* Busy wait until TX FIFO not empty -- DMA working */ 547 547 for (i = 0; i < max_loop; i++) { 548 548 u32 sfcsr; 549 - regmap_read(regs, CCSR_SSI_SFCSR, &sfcsr); 550 - if (CCSR_SSI_SFCSR_TFCNT0(sfcsr)) 549 + regmap_read(regs, REG_SSI_SFCSR, &sfcsr); 550 + if (SSI_SFCSR_TFCNT0(sfcsr)) 551 551 break; 552 552 } 553 553 if (i == max_loop) { 554 - dev_err(ssi_private->dev, 554 + dev_err(ssi->dev, 555 555 "Timeout waiting TX FIFO filling\n"); 556 556 } 557 557 } 558 - regmap_update_bits(regs, CCSR_SSI_SCR, vals->scr, vals->scr); 558 + /* Enable all remaining bits */ 559 + regmap_update_bits(regs, REG_SSI_SCR, vals->scr, vals->scr); 559 560 } 560 561 } 561 562 562 - 563 - static void fsl_ssi_rx_config(struct fsl_ssi_private *ssi_private, bool enable) 563 + static void fsl_ssi_rx_config(struct fsl_ssi *ssi, bool enable) 564 564 { 565 - fsl_ssi_config(ssi_private, enable, &ssi_private->rxtx_reg_val.rx); 565 + fsl_ssi_config(ssi, enable, &ssi->regvals[RX]); 566 566 } 567 567 568 - static void fsl_ssi_tx_config(struct fsl_ssi_private *ssi_private, bool enable) 568 + static void fsl_ssi_tx_ac97_saccst_setup(struct fsl_ssi *ssi) 569 569 { 570 - fsl_ssi_config(ssi_private, enable, &ssi_private->rxtx_reg_val.tx); 571 - } 572 - 573 - /* 574 - * Setup rx/tx register values used to enable/disable the streams. These will 575 - * be used later in fsl_ssi_config to setup the streams without the need to 576 - * check for all different SSI modes. 577 - */ 578 - static void fsl_ssi_setup_reg_vals(struct fsl_ssi_private *ssi_private) 579 - { 580 - struct fsl_ssi_rxtx_reg_val *reg = &ssi_private->rxtx_reg_val; 581 - 582 - reg->rx.sier = CCSR_SSI_SIER_RFF0_EN; 583 - reg->rx.srcr = CCSR_SSI_SRCR_RFEN0; 584 - reg->rx.scr = 0; 585 - reg->tx.sier = CCSR_SSI_SIER_TFE0_EN; 586 - reg->tx.stcr = CCSR_SSI_STCR_TFEN0; 587 - reg->tx.scr = 0; 588 - 589 - if (!fsl_ssi_is_ac97(ssi_private)) { 590 - reg->rx.scr = CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_RE; 591 - reg->rx.sier |= CCSR_SSI_SIER_RFF0_EN; 592 - reg->tx.scr = CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_TE; 593 - reg->tx.sier |= CCSR_SSI_SIER_TFE0_EN; 594 - } 595 - 596 - if (ssi_private->use_dma) { 597 - reg->rx.sier |= CCSR_SSI_SIER_RDMAE; 598 - reg->tx.sier |= CCSR_SSI_SIER_TDMAE; 599 - } else { 600 - reg->rx.sier |= CCSR_SSI_SIER_RIE; 601 - reg->tx.sier |= CCSR_SSI_SIER_TIE; 602 - } 603 - 604 - reg->rx.sier |= FSLSSI_SIER_DBG_RX_FLAGS; 605 - reg->tx.sier |= FSLSSI_SIER_DBG_TX_FLAGS; 606 - } 607 - 608 - static void fsl_ssi_setup_ac97(struct fsl_ssi_private *ssi_private) 609 - { 610 - struct regmap *regs = ssi_private->regs; 611 - 612 - /* 613 - * Setup the clock control register 614 - */ 615 - regmap_write(regs, CCSR_SSI_STCCR, 616 - CCSR_SSI_SxCCR_WL(17) | CCSR_SSI_SxCCR_DC(13)); 617 - regmap_write(regs, CCSR_SSI_SRCCR, 618 - CCSR_SSI_SxCCR_WL(17) | CCSR_SSI_SxCCR_DC(13)); 619 - 620 - /* 621 - * Enable AC97 mode and startup the SSI 622 - */ 623 - regmap_write(regs, CCSR_SSI_SACNT, 624 - CCSR_SSI_SACNT_AC97EN | CCSR_SSI_SACNT_FV); 570 + struct regmap *regs = ssi->regs; 625 571 626 572 /* no SACC{ST,EN,DIS} regs on imx21-class SSI */ 627 - if (!ssi_private->soc->imx21regs) { 628 - regmap_write(regs, CCSR_SSI_SACCDIS, 0xff); 629 - regmap_write(regs, CCSR_SSI_SACCEN, 0x300); 573 + if (!ssi->soc->imx21regs) { 574 + /* Disable all channel slots */ 575 + regmap_write(regs, REG_SSI_SACCDIS, 0xff); 576 + /* Enable slots 3 & 4 -- PCM Playback Left & Right channels */ 577 + regmap_write(regs, REG_SSI_SACCEN, 0x300); 630 578 } 579 + } 631 580 581 + static void fsl_ssi_tx_config(struct fsl_ssi *ssi, bool enable) 582 + { 632 583 /* 633 - * Enable SSI, Transmit and Receive. AC97 has to communicate with the 634 - * codec before a stream is started. 584 + * SACCST might be modified via AC Link by a CODEC if it sends 585 + * extra bits in their SLOTREQ requests, which'll accidentally 586 + * send valid data to slots other than normal playback slots. 587 + * 588 + * To be safe, configure SACCST right before TX starts. 635 589 */ 636 - regmap_update_bits(regs, CCSR_SSI_SCR, 637 - CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_TE | CCSR_SSI_SCR_RE, 638 - CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_TE | CCSR_SSI_SCR_RE); 590 + if (enable && fsl_ssi_is_ac97(ssi)) 591 + fsl_ssi_tx_ac97_saccst_setup(ssi); 639 592 640 - regmap_write(regs, CCSR_SSI_SOR, CCSR_SSI_SOR_WAIT(3)); 593 + fsl_ssi_config(ssi, enable, &ssi->regvals[TX]); 641 594 } 642 595 643 596 /** 644 - * fsl_ssi_startup: create a new substream 645 - * 646 - * This is the first function called when a stream is opened. 647 - * 648 - * If this is the first stream open, then grab the IRQ and program most of 649 - * the SSI registers. 597 + * Cache critical bits of SIER, SRCR, STCR and SCR to later set them safely 650 598 */ 599 + static void fsl_ssi_setup_regvals(struct fsl_ssi *ssi) 600 + { 601 + struct fsl_ssi_regvals *vals = ssi->regvals; 602 + 603 + vals[RX].sier = SSI_SIER_RFF0_EN; 604 + vals[RX].srcr = SSI_SRCR_RFEN0; 605 + vals[RX].scr = 0; 606 + vals[TX].sier = SSI_SIER_TFE0_EN; 607 + vals[TX].stcr = SSI_STCR_TFEN0; 608 + vals[TX].scr = 0; 609 + 610 + /* AC97 has already enabled SSIEN, RE and TE, so ignore them */ 611 + if (!fsl_ssi_is_ac97(ssi)) { 612 + vals[RX].scr = SSI_SCR_SSIEN | SSI_SCR_RE; 613 + vals[TX].scr = SSI_SCR_SSIEN | SSI_SCR_TE; 614 + } 615 + 616 + if (ssi->use_dma) { 617 + vals[RX].sier |= SSI_SIER_RDMAE; 618 + vals[TX].sier |= SSI_SIER_TDMAE; 619 + } else { 620 + vals[RX].sier |= SSI_SIER_RIE; 621 + vals[TX].sier |= SSI_SIER_TIE; 622 + } 623 + 624 + vals[RX].sier |= FSLSSI_SIER_DBG_RX_FLAGS; 625 + vals[TX].sier |= FSLSSI_SIER_DBG_TX_FLAGS; 626 + } 627 + 628 + static void fsl_ssi_setup_ac97(struct fsl_ssi *ssi) 629 + { 630 + struct regmap *regs = ssi->regs; 631 + 632 + /* Setup the clock control register */ 633 + regmap_write(regs, REG_SSI_STCCR, SSI_SxCCR_WL(17) | SSI_SxCCR_DC(13)); 634 + regmap_write(regs, REG_SSI_SRCCR, SSI_SxCCR_WL(17) | SSI_SxCCR_DC(13)); 635 + 636 + /* Enable AC97 mode and startup the SSI */ 637 + regmap_write(regs, REG_SSI_SACNT, SSI_SACNT_AC97EN | SSI_SACNT_FV); 638 + 639 + /* AC97 has to communicate with codec before starting a stream */ 640 + regmap_update_bits(regs, REG_SSI_SCR, 641 + SSI_SCR_SSIEN | SSI_SCR_TE | SSI_SCR_RE, 642 + SSI_SCR_SSIEN | SSI_SCR_TE | SSI_SCR_RE); 643 + 644 + regmap_write(regs, REG_SSI_SOR, SSI_SOR_WAIT(3)); 645 + } 646 + 651 647 static int fsl_ssi_startup(struct snd_pcm_substream *substream, 652 648 struct snd_soc_dai *dai) 653 649 { 654 650 struct snd_soc_pcm_runtime *rtd = substream->private_data; 655 - struct fsl_ssi_private *ssi_private = 656 - snd_soc_dai_get_drvdata(rtd->cpu_dai); 651 + struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai); 657 652 int ret; 658 653 659 - ret = clk_prepare_enable(ssi_private->clk); 654 + ret = clk_prepare_enable(ssi->clk); 660 655 if (ret) 661 656 return ret; 662 657 663 - /* When using dual fifo mode, it is safer to ensure an even period 658 + /* 659 + * When using dual fifo mode, it is safer to ensure an even period 664 660 * size. If appearing to an odd number while DMA always starts its 665 661 * task from fifo0, fifo1 would be neglected at the end of each 666 662 * period. But SSI would still access fifo1 with an invalid data. 667 663 */ 668 - if (ssi_private->use_dual_fifo) 664 + if (ssi->use_dual_fifo) 669 665 snd_pcm_hw_constraint_step(substream->runtime, 0, 670 - SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 2); 666 + SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 2); 671 667 672 668 return 0; 673 669 } 674 670 675 - /** 676 - * fsl_ssi_shutdown: shutdown the SSI 677 - * 678 - */ 679 671 static void fsl_ssi_shutdown(struct snd_pcm_substream *substream, 680 - struct snd_soc_dai *dai) 672 + struct snd_soc_dai *dai) 681 673 { 682 674 struct snd_soc_pcm_runtime *rtd = substream->private_data; 683 - struct fsl_ssi_private *ssi_private = 684 - snd_soc_dai_get_drvdata(rtd->cpu_dai); 675 + struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai); 685 676 686 - clk_disable_unprepare(ssi_private->clk); 687 - 677 + clk_disable_unprepare(ssi->clk); 688 678 } 689 679 690 680 /** 691 - * fsl_ssi_set_bclk - configure Digital Audio Interface bit clock 681 + * Configure Digital Audio Interface bit clock 692 682 * 693 683 * Note: This function can be only called when using SSI as DAI master 694 684 * ··· 675 709 * (In 2-channel I2S Master mode, slot_width is fixed 32) 676 710 */ 677 711 static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream, 678 - struct snd_soc_dai *cpu_dai, 679 - struct snd_pcm_hw_params *hw_params) 712 + struct snd_soc_dai *dai, 713 + struct snd_pcm_hw_params *hw_params) 680 714 { 681 - struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); 682 - struct regmap *regs = ssi_private->regs; 683 - int synchronous = ssi_private->cpu_dai_drv.symmetric_rates, ret; 715 + bool tx2, tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 716 + struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai); 717 + struct regmap *regs = ssi->regs; 718 + int synchronous = ssi->cpu_dai_drv.symmetric_rates, ret; 684 719 u32 pm = 999, div2, psr, stccr, mask, afreq, factor, i; 685 720 unsigned long clkrate, baudrate, tmprate; 686 721 unsigned int slots = params_channels(hw_params); ··· 691 724 bool baudclk_is_used; 692 725 693 726 /* Override slots and slot_width if being specifically set... */ 694 - if (ssi_private->slots) 695 - slots = ssi_private->slots; 727 + if (ssi->slots) 728 + slots = ssi->slots; 696 729 /* ...but keep 32 bits if slots is 2 -- I2S Master mode */ 697 - if (ssi_private->slot_width && slots != 2) 698 - slot_width = ssi_private->slot_width; 730 + if (ssi->slot_width && slots != 2) 731 + slot_width = ssi->slot_width; 699 732 700 733 /* Generate bit clock based on the slot number and slot width */ 701 734 freq = slots * slot_width * params_rate(hw_params); 702 735 703 736 /* Don't apply it to any non-baudclk circumstance */ 704 - if (IS_ERR(ssi_private->baudclk)) 737 + if (IS_ERR(ssi->baudclk)) 705 738 return -EINVAL; 706 739 707 740 /* 708 741 * Hardware limitation: The bclk rate must be 709 742 * never greater than 1/5 IPG clock rate 710 743 */ 711 - if (freq * 5 > clk_get_rate(ssi_private->clk)) { 712 - dev_err(cpu_dai->dev, "bitclk > ipgclk/5\n"); 744 + if (freq * 5 > clk_get_rate(ssi->clk)) { 745 + dev_err(dai->dev, "bitclk > ipgclk / 5\n"); 713 746 return -EINVAL; 714 747 } 715 748 716 - baudclk_is_used = ssi_private->baudclk_streams & ~(BIT(substream->stream)); 749 + baudclk_is_used = ssi->baudclk_streams & ~(BIT(substream->stream)); 717 750 718 751 /* It should be already enough to divide clock by setting pm alone */ 719 752 psr = 0; ··· 725 758 tmprate = freq * factor * (i + 1); 726 759 727 760 if (baudclk_is_used) 728 - clkrate = clk_get_rate(ssi_private->baudclk); 761 + clkrate = clk_get_rate(ssi->baudclk); 729 762 else 730 - clkrate = clk_round_rate(ssi_private->baudclk, tmprate); 763 + clkrate = clk_round_rate(ssi->baudclk, tmprate); 731 764 732 765 clkrate /= factor; 733 766 afreq = clkrate / (i + 1); ··· 758 791 759 792 /* No proper pm found if it is still remaining the initial value */ 760 793 if (pm == 999) { 761 - dev_err(cpu_dai->dev, "failed to handle the required sysclk\n"); 794 + dev_err(dai->dev, "failed to handle the required sysclk\n"); 762 795 return -EINVAL; 763 796 } 764 797 765 - stccr = CCSR_SSI_SxCCR_PM(pm + 1) | (div2 ? CCSR_SSI_SxCCR_DIV2 : 0) | 766 - (psr ? CCSR_SSI_SxCCR_PSR : 0); 767 - mask = CCSR_SSI_SxCCR_PM_MASK | CCSR_SSI_SxCCR_DIV2 | 768 - CCSR_SSI_SxCCR_PSR; 798 + stccr = SSI_SxCCR_PM(pm + 1) | (div2 ? SSI_SxCCR_DIV2 : 0) | 799 + (psr ? SSI_SxCCR_PSR : 0); 800 + mask = SSI_SxCCR_PM_MASK | SSI_SxCCR_DIV2 | SSI_SxCCR_PSR; 769 801 770 - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || synchronous) 771 - regmap_update_bits(regs, CCSR_SSI_STCCR, mask, stccr); 772 - else 773 - regmap_update_bits(regs, CCSR_SSI_SRCCR, mask, stccr); 802 + /* STCCR is used for RX in synchronous mode */ 803 + tx2 = tx || synchronous; 804 + regmap_update_bits(regs, REG_SSI_SxCCR(tx2), mask, stccr); 774 805 775 806 if (!baudclk_is_used) { 776 - ret = clk_set_rate(ssi_private->baudclk, baudrate); 807 + ret = clk_set_rate(ssi->baudclk, baudrate); 777 808 if (ret) { 778 - dev_err(cpu_dai->dev, "failed to set baudclk rate\n"); 809 + dev_err(dai->dev, "failed to set baudclk rate\n"); 779 810 return -EINVAL; 780 811 } 781 812 } ··· 782 817 } 783 818 784 819 /** 785 - * fsl_ssi_hw_params - program the sample size 820 + * Configure SSI based on PCM hardware parameters 786 821 * 787 - * Most of the SSI registers have been programmed in the startup function, 788 - * but the word length must be programmed here. Unfortunately, programming 789 - * the SxCCR.WL bits requires the SSI to be temporarily disabled. This can 790 - * cause a problem with supporting simultaneous playback and capture. If 791 - * the SSI is already playing a stream, then that stream may be temporarily 792 - * stopped when you start capture. 793 - * 794 - * Note: The SxCCR.DC and SxCCR.PM bits are only used if the SSI is the 795 - * clock master. 822 + * Notes: 823 + * 1) SxCCR.WL bits are critical bits that require SSI to be temporarily 824 + * disabled on offline_config SoCs. Even for online configurable SoCs 825 + * running in synchronous mode (both TX and RX use STCCR), it is not 826 + * safe to re-configure them when both two streams start running. 827 + * 2) SxCCR.PM, SxCCR.DIV2 and SxCCR.PSR bits will be configured in the 828 + * fsl_ssi_set_bclk() if SSI is the DAI clock master. 796 829 */ 797 830 static int fsl_ssi_hw_params(struct snd_pcm_substream *substream, 798 - struct snd_pcm_hw_params *hw_params, struct snd_soc_dai *cpu_dai) 831 + struct snd_pcm_hw_params *hw_params, 832 + struct snd_soc_dai *dai) 799 833 { 800 - struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); 801 - struct regmap *regs = ssi_private->regs; 834 + bool tx2, tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 835 + struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai); 836 + struct regmap *regs = ssi->regs; 802 837 unsigned int channels = params_channels(hw_params); 803 838 unsigned int sample_size = params_width(hw_params); 804 - u32 wl = CCSR_SSI_SxCCR_WL(sample_size); 839 + u32 wl = SSI_SxCCR_WL(sample_size); 805 840 int ret; 806 - u32 scr_val; 841 + u32 scr; 807 842 int enabled; 808 843 809 - regmap_read(regs, CCSR_SSI_SCR, &scr_val); 810 - enabled = scr_val & CCSR_SSI_SCR_SSIEN; 844 + regmap_read(regs, REG_SSI_SCR, &scr); 845 + enabled = scr & SSI_SCR_SSIEN; 811 846 812 847 /* 813 - * If we're in synchronous mode, and the SSI is already enabled, 814 - * then STCCR is already set properly. 848 + * SSI is properly configured if it is enabled and running in 849 + * the synchronous mode; Note that AC97 mode is an exception 850 + * that should set separate configurations for STCCR and SRCCR 851 + * despite running in the synchronous mode. 815 852 */ 816 - if (enabled && ssi_private->cpu_dai_drv.symmetric_rates) 853 + if (enabled && ssi->cpu_dai_drv.symmetric_rates) 817 854 return 0; 818 855 819 - if (fsl_ssi_is_i2s_master(ssi_private)) { 820 - ret = fsl_ssi_set_bclk(substream, cpu_dai, hw_params); 856 + if (fsl_ssi_is_i2s_master(ssi)) { 857 + ret = fsl_ssi_set_bclk(substream, dai, hw_params); 821 858 if (ret) 822 859 return ret; 823 860 824 861 /* Do not enable the clock if it is already enabled */ 825 - if (!(ssi_private->baudclk_streams & BIT(substream->stream))) { 826 - ret = clk_prepare_enable(ssi_private->baudclk); 862 + if (!(ssi->baudclk_streams & BIT(substream->stream))) { 863 + ret = clk_prepare_enable(ssi->baudclk); 827 864 if (ret) 828 865 return ret; 829 866 830 - ssi_private->baudclk_streams |= BIT(substream->stream); 867 + ssi->baudclk_streams |= BIT(substream->stream); 831 868 } 832 869 } 833 870 834 - if (!fsl_ssi_is_ac97(ssi_private)) { 835 - u8 i2smode; 836 - /* 837 - * Switch to normal net mode in order to have a frame sync 838 - * signal every 32 bits instead of 16 bits 839 - */ 840 - if (fsl_ssi_is_i2s_cbm_cfs(ssi_private) && sample_size == 16) 841 - i2smode = CCSR_SSI_SCR_I2S_MODE_NORMAL | 842 - CCSR_SSI_SCR_NET; 871 + if (!fsl_ssi_is_ac97(ssi)) { 872 + u8 i2s_net; 873 + /* Normal + Network mode to send 16-bit data in 32-bit frames */ 874 + if (fsl_ssi_is_i2s_cbm_cfs(ssi) && sample_size == 16) 875 + i2s_net = SSI_SCR_I2S_MODE_NORMAL | SSI_SCR_NET; 843 876 else 844 - i2smode = ssi_private->i2s_mode; 877 + i2s_net = ssi->i2s_net; 845 878 846 - regmap_update_bits(regs, CCSR_SSI_SCR, 847 - CCSR_SSI_SCR_NET | CCSR_SSI_SCR_I2S_MODE_MASK, 848 - channels == 1 ? 0 : i2smode); 879 + regmap_update_bits(regs, REG_SSI_SCR, 880 + SSI_SCR_I2S_NET_MASK, 881 + channels == 1 ? 0 : i2s_net); 849 882 } 850 883 851 - /* 852 - * FIXME: The documentation says that SxCCR[WL] should not be 853 - * modified while the SSI is enabled. The only time this can 854 - * happen is if we're trying to do simultaneous playback and 855 - * capture in asynchronous mode. Unfortunately, I have been enable 856 - * to get that to work at all on the P1022DS. Therefore, we don't 857 - * bother to disable/enable the SSI when setting SxCCR[WL], because 858 - * the SSI will stop anyway. Maybe one day, this will get fixed. 859 - */ 860 - 861 884 /* In synchronous mode, the SSI uses STCCR for capture */ 862 - if ((substream->stream == SNDRV_PCM_STREAM_PLAYBACK) || 863 - ssi_private->cpu_dai_drv.symmetric_rates) 864 - regmap_update_bits(regs, CCSR_SSI_STCCR, CCSR_SSI_SxCCR_WL_MASK, 865 - wl); 866 - else 867 - regmap_update_bits(regs, CCSR_SSI_SRCCR, CCSR_SSI_SxCCR_WL_MASK, 868 - wl); 885 + tx2 = tx || ssi->cpu_dai_drv.symmetric_rates; 886 + regmap_update_bits(regs, REG_SSI_SxCCR(tx2), SSI_SxCCR_WL_MASK, wl); 869 887 870 888 return 0; 871 889 } 872 890 873 891 static int fsl_ssi_hw_free(struct snd_pcm_substream *substream, 874 - struct snd_soc_dai *cpu_dai) 892 + struct snd_soc_dai *dai) 875 893 { 876 894 struct snd_soc_pcm_runtime *rtd = substream->private_data; 877 - struct fsl_ssi_private *ssi_private = 878 - snd_soc_dai_get_drvdata(rtd->cpu_dai); 895 + struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai); 879 896 880 - if (fsl_ssi_is_i2s_master(ssi_private) && 881 - ssi_private->baudclk_streams & BIT(substream->stream)) { 882 - clk_disable_unprepare(ssi_private->baudclk); 883 - ssi_private->baudclk_streams &= ~BIT(substream->stream); 897 + if (fsl_ssi_is_i2s_master(ssi) && 898 + ssi->baudclk_streams & BIT(substream->stream)) { 899 + clk_disable_unprepare(ssi->baudclk); 900 + ssi->baudclk_streams &= ~BIT(substream->stream); 884 901 } 885 902 886 903 return 0; 887 904 } 888 905 889 906 static int _fsl_ssi_set_dai_fmt(struct device *dev, 890 - struct fsl_ssi_private *ssi_private, 891 - unsigned int fmt) 907 + struct fsl_ssi *ssi, unsigned int fmt) 892 908 { 893 - struct regmap *regs = ssi_private->regs; 909 + struct regmap *regs = ssi->regs; 894 910 u32 strcr = 0, stcr, srcr, scr, mask; 895 911 u8 wm; 896 912 897 - ssi_private->dai_fmt = fmt; 913 + ssi->dai_fmt = fmt; 898 914 899 - if (fsl_ssi_is_i2s_master(ssi_private) && IS_ERR(ssi_private->baudclk)) { 900 - dev_err(dev, "baudclk is missing which is necessary for master mode\n"); 915 + if (fsl_ssi_is_i2s_master(ssi) && IS_ERR(ssi->baudclk)) { 916 + dev_err(dev, "missing baudclk for master mode\n"); 901 917 return -EINVAL; 902 918 } 903 919 904 - fsl_ssi_setup_reg_vals(ssi_private); 920 + fsl_ssi_setup_regvals(ssi); 905 921 906 - regmap_read(regs, CCSR_SSI_SCR, &scr); 907 - scr &= ~(CCSR_SSI_SCR_SYN | CCSR_SSI_SCR_I2S_MODE_MASK); 908 - scr |= CCSR_SSI_SCR_SYNC_TX_FS; 922 + regmap_read(regs, REG_SSI_SCR, &scr); 923 + scr &= ~(SSI_SCR_SYN | SSI_SCR_I2S_MODE_MASK); 924 + /* Synchronize frame sync clock for TE to avoid data slipping */ 925 + scr |= SSI_SCR_SYNC_TX_FS; 909 926 910 - mask = CCSR_SSI_STCR_TXBIT0 | CCSR_SSI_STCR_TFDIR | CCSR_SSI_STCR_TXDIR | 911 - CCSR_SSI_STCR_TSCKP | CCSR_SSI_STCR_TFSI | CCSR_SSI_STCR_TFSL | 912 - CCSR_SSI_STCR_TEFS; 913 - regmap_read(regs, CCSR_SSI_STCR, &stcr); 914 - regmap_read(regs, CCSR_SSI_SRCR, &srcr); 927 + mask = SSI_STCR_TXBIT0 | SSI_STCR_TFDIR | SSI_STCR_TXDIR | 928 + SSI_STCR_TSCKP | SSI_STCR_TFSI | SSI_STCR_TFSL | SSI_STCR_TEFS; 929 + regmap_read(regs, REG_SSI_STCR, &stcr); 930 + regmap_read(regs, REG_SSI_SRCR, &srcr); 915 931 stcr &= ~mask; 916 932 srcr &= ~mask; 917 933 918 - ssi_private->i2s_mode = CCSR_SSI_SCR_NET; 934 + /* Use Network mode as default */ 935 + ssi->i2s_net = SSI_SCR_NET; 919 936 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 920 937 case SND_SOC_DAIFMT_I2S: 921 - regmap_update_bits(regs, CCSR_SSI_STCCR, 922 - CCSR_SSI_SxCCR_DC_MASK, 923 - CCSR_SSI_SxCCR_DC(2)); 924 - regmap_update_bits(regs, CCSR_SSI_SRCCR, 925 - CCSR_SSI_SxCCR_DC_MASK, 926 - CCSR_SSI_SxCCR_DC(2)); 938 + regmap_update_bits(regs, REG_SSI_STCCR, 939 + SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(2)); 940 + regmap_update_bits(regs, REG_SSI_SRCCR, 941 + SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(2)); 927 942 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 928 943 case SND_SOC_DAIFMT_CBM_CFS: 929 944 case SND_SOC_DAIFMT_CBS_CFS: 930 - ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_MASTER; 945 + ssi->i2s_net |= SSI_SCR_I2S_MODE_MASTER; 931 946 break; 932 947 case SND_SOC_DAIFMT_CBM_CFM: 933 - ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_SLAVE; 948 + ssi->i2s_net |= SSI_SCR_I2S_MODE_SLAVE; 934 949 break; 935 950 default: 936 951 return -EINVAL; 937 952 } 938 953 939 954 /* Data on rising edge of bclk, frame low, 1clk before data */ 940 - strcr |= CCSR_SSI_STCR_TFSI | CCSR_SSI_STCR_TSCKP | 941 - CCSR_SSI_STCR_TXBIT0 | CCSR_SSI_STCR_TEFS; 955 + strcr |= SSI_STCR_TFSI | SSI_STCR_TSCKP | 956 + SSI_STCR_TXBIT0 | SSI_STCR_TEFS; 942 957 break; 943 958 case SND_SOC_DAIFMT_LEFT_J: 944 959 /* Data on rising edge of bclk, frame high */ 945 - strcr |= CCSR_SSI_STCR_TXBIT0 | CCSR_SSI_STCR_TSCKP; 960 + strcr |= SSI_STCR_TXBIT0 | SSI_STCR_TSCKP; 946 961 break; 947 962 case SND_SOC_DAIFMT_DSP_A: 948 963 /* Data on rising edge of bclk, frame high, 1clk before data */ 949 - strcr |= CCSR_SSI_STCR_TFSL | CCSR_SSI_STCR_TSCKP | 950 - CCSR_SSI_STCR_TXBIT0 | CCSR_SSI_STCR_TEFS; 964 + strcr |= SSI_STCR_TFSL | SSI_STCR_TSCKP | 965 + SSI_STCR_TXBIT0 | SSI_STCR_TEFS; 951 966 break; 952 967 case SND_SOC_DAIFMT_DSP_B: 953 968 /* Data on rising edge of bclk, frame high */ 954 - strcr |= CCSR_SSI_STCR_TFSL | CCSR_SSI_STCR_TSCKP | 955 - CCSR_SSI_STCR_TXBIT0; 969 + strcr |= SSI_STCR_TFSL | SSI_STCR_TSCKP | SSI_STCR_TXBIT0; 956 970 break; 957 971 case SND_SOC_DAIFMT_AC97: 958 - ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_NORMAL; 972 + /* Data on falling edge of bclk, frame high, 1clk before data */ 973 + ssi->i2s_net |= SSI_SCR_I2S_MODE_NORMAL; 959 974 break; 960 975 default: 961 976 return -EINVAL; 962 977 } 963 - scr |= ssi_private->i2s_mode; 978 + scr |= ssi->i2s_net; 964 979 965 980 /* DAI clock inversion */ 966 981 switch (fmt & SND_SOC_DAIFMT_INV_MASK) { ··· 949 1004 break; 950 1005 case SND_SOC_DAIFMT_IB_NF: 951 1006 /* Invert bit clock */ 952 - strcr ^= CCSR_SSI_STCR_TSCKP; 1007 + strcr ^= SSI_STCR_TSCKP; 953 1008 break; 954 1009 case SND_SOC_DAIFMT_NB_IF: 955 1010 /* Invert frame clock */ 956 - strcr ^= CCSR_SSI_STCR_TFSI; 1011 + strcr ^= SSI_STCR_TFSI; 957 1012 break; 958 1013 case SND_SOC_DAIFMT_IB_IF: 959 1014 /* Invert both clocks */ 960 - strcr ^= CCSR_SSI_STCR_TSCKP; 961 - strcr ^= CCSR_SSI_STCR_TFSI; 1015 + strcr ^= SSI_STCR_TSCKP; 1016 + strcr ^= SSI_STCR_TFSI; 962 1017 break; 963 1018 default: 964 1019 return -EINVAL; ··· 967 1022 /* DAI clock master masks */ 968 1023 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 969 1024 case SND_SOC_DAIFMT_CBS_CFS: 970 - strcr |= CCSR_SSI_STCR_TFDIR | CCSR_SSI_STCR_TXDIR; 971 - scr |= CCSR_SSI_SCR_SYS_CLK_EN; 1025 + /* Output bit and frame sync clocks */ 1026 + strcr |= SSI_STCR_TFDIR | SSI_STCR_TXDIR; 1027 + scr |= SSI_SCR_SYS_CLK_EN; 972 1028 break; 973 1029 case SND_SOC_DAIFMT_CBM_CFM: 974 - scr &= ~CCSR_SSI_SCR_SYS_CLK_EN; 1030 + /* Input bit or frame sync clocks */ 1031 + scr &= ~SSI_SCR_SYS_CLK_EN; 975 1032 break; 976 1033 case SND_SOC_DAIFMT_CBM_CFS: 977 - strcr &= ~CCSR_SSI_STCR_TXDIR; 978 - strcr |= CCSR_SSI_STCR_TFDIR; 979 - scr &= ~CCSR_SSI_SCR_SYS_CLK_EN; 1034 + /* Input bit clock but output frame sync clock */ 1035 + strcr &= ~SSI_STCR_TXDIR; 1036 + strcr |= SSI_STCR_TFDIR; 1037 + scr &= ~SSI_SCR_SYS_CLK_EN; 980 1038 break; 981 1039 default: 982 - if (!fsl_ssi_is_ac97(ssi_private)) 1040 + if (!fsl_ssi_is_ac97(ssi)) 983 1041 return -EINVAL; 984 1042 } 985 1043 986 1044 stcr |= strcr; 987 1045 srcr |= strcr; 988 1046 989 - if (ssi_private->cpu_dai_drv.symmetric_rates 990 - || fsl_ssi_is_ac97(ssi_private)) { 991 - /* Need to clear RXDIR when using SYNC or AC97 mode */ 992 - srcr &= ~CCSR_SSI_SRCR_RXDIR; 993 - scr |= CCSR_SSI_SCR_SYN; 1047 + /* Set SYN mode and clear RXDIR bit when using SYN or AC97 mode */ 1048 + if (ssi->cpu_dai_drv.symmetric_rates || fsl_ssi_is_ac97(ssi)) { 1049 + srcr &= ~SSI_SRCR_RXDIR; 1050 + scr |= SSI_SCR_SYN; 994 1051 } 995 1052 996 - regmap_write(regs, CCSR_SSI_STCR, stcr); 997 - regmap_write(regs, CCSR_SSI_SRCR, srcr); 998 - regmap_write(regs, CCSR_SSI_SCR, scr); 1053 + regmap_write(regs, REG_SSI_STCR, stcr); 1054 + regmap_write(regs, REG_SSI_SRCR, srcr); 1055 + regmap_write(regs, REG_SSI_SCR, scr); 999 1056 1000 - wm = ssi_private->fifo_watermark; 1057 + wm = ssi->fifo_watermark; 1001 1058 1002 - regmap_write(regs, CCSR_SSI_SFCSR, 1003 - CCSR_SSI_SFCSR_TFWM0(wm) | CCSR_SSI_SFCSR_RFWM0(wm) | 1004 - CCSR_SSI_SFCSR_TFWM1(wm) | CCSR_SSI_SFCSR_RFWM1(wm)); 1059 + regmap_write(regs, REG_SSI_SFCSR, 1060 + SSI_SFCSR_TFWM0(wm) | SSI_SFCSR_RFWM0(wm) | 1061 + SSI_SFCSR_TFWM1(wm) | SSI_SFCSR_RFWM1(wm)); 1005 1062 1006 - if (ssi_private->use_dual_fifo) { 1007 - regmap_update_bits(regs, CCSR_SSI_SRCR, CCSR_SSI_SRCR_RFEN1, 1008 - CCSR_SSI_SRCR_RFEN1); 1009 - regmap_update_bits(regs, CCSR_SSI_STCR, CCSR_SSI_STCR_TFEN1, 1010 - CCSR_SSI_STCR_TFEN1); 1011 - regmap_update_bits(regs, CCSR_SSI_SCR, CCSR_SSI_SCR_TCH_EN, 1012 - CCSR_SSI_SCR_TCH_EN); 1063 + if (ssi->use_dual_fifo) { 1064 + regmap_update_bits(regs, REG_SSI_SRCR, 1065 + SSI_SRCR_RFEN1, SSI_SRCR_RFEN1); 1066 + regmap_update_bits(regs, REG_SSI_STCR, 1067 + SSI_STCR_TFEN1, SSI_STCR_TFEN1); 1068 + regmap_update_bits(regs, REG_SSI_SCR, 1069 + SSI_SCR_TCH_EN, SSI_SCR_TCH_EN); 1013 1070 } 1014 1071 1015 1072 if ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_AC97) 1016 - fsl_ssi_setup_ac97(ssi_private); 1073 + fsl_ssi_setup_ac97(ssi); 1017 1074 1018 1075 return 0; 1019 - 1020 1076 } 1021 1077 1022 1078 /** 1023 - * fsl_ssi_set_dai_fmt - configure Digital Audio Interface Format. 1079 + * Configure Digital Audio Interface (DAI) Format 1024 1080 */ 1025 - static int fsl_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) 1081 + static int fsl_ssi_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) 1026 1082 { 1027 - struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); 1083 + struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai); 1028 1084 1029 - return _fsl_ssi_set_dai_fmt(cpu_dai->dev, ssi_private, fmt); 1085 + /* AC97 configured DAIFMT earlier in the probe() */ 1086 + if (fsl_ssi_is_ac97(ssi)) 1087 + return 0; 1088 + 1089 + return _fsl_ssi_set_dai_fmt(dai->dev, ssi, fmt); 1030 1090 } 1031 1091 1032 1092 /** 1033 - * fsl_ssi_set_dai_tdm_slot - set TDM slot number 1034 - * 1035 - * Note: This function can be only called when using SSI as DAI master 1093 + * Set TDM slot number and slot width 1036 1094 */ 1037 - static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, u32 tx_mask, 1038 - u32 rx_mask, int slots, int slot_width) 1095 + static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask, 1096 + u32 rx_mask, int slots, int slot_width) 1039 1097 { 1040 - struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai); 1041 - struct regmap *regs = ssi_private->regs; 1098 + struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai); 1099 + struct regmap *regs = ssi->regs; 1042 1100 u32 val; 1043 1101 1044 1102 /* The word length should be 8, 10, 12, 16, 18, 20, 22 or 24 */ 1045 1103 if (slot_width & 1 || slot_width < 8 || slot_width > 24) { 1046 - dev_err(cpu_dai->dev, "invalid slot width: %d\n", slot_width); 1104 + dev_err(dai->dev, "invalid slot width: %d\n", slot_width); 1047 1105 return -EINVAL; 1048 1106 } 1049 1107 1050 1108 /* The slot number should be >= 2 if using Network mode or I2S mode */ 1051 - regmap_read(regs, CCSR_SSI_SCR, &val); 1052 - val &= CCSR_SSI_SCR_I2S_MODE_MASK | CCSR_SSI_SCR_NET; 1109 + regmap_read(regs, REG_SSI_SCR, &val); 1110 + val &= SSI_SCR_I2S_MODE_MASK | SSI_SCR_NET; 1053 1111 if (val && slots < 2) { 1054 - dev_err(cpu_dai->dev, "slot number should be >= 2 in I2S or NET\n"); 1112 + dev_err(dai->dev, "slot number should be >= 2 in I2S or NET\n"); 1055 1113 return -EINVAL; 1056 1114 } 1057 1115 1058 - regmap_update_bits(regs, CCSR_SSI_STCCR, CCSR_SSI_SxCCR_DC_MASK, 1059 - CCSR_SSI_SxCCR_DC(slots)); 1060 - regmap_update_bits(regs, CCSR_SSI_SRCCR, CCSR_SSI_SxCCR_DC_MASK, 1061 - CCSR_SSI_SxCCR_DC(slots)); 1116 + regmap_update_bits(regs, REG_SSI_STCCR, 1117 + SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(slots)); 1118 + regmap_update_bits(regs, REG_SSI_SRCCR, 1119 + SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(slots)); 1062 1120 1063 - /* The register SxMSKs needs SSI to provide essential clock due to 1064 - * hardware design. So we here temporarily enable SSI to set them. 1065 - */ 1066 - regmap_read(regs, CCSR_SSI_SCR, &val); 1067 - val &= CCSR_SSI_SCR_SSIEN; 1068 - regmap_update_bits(regs, CCSR_SSI_SCR, CCSR_SSI_SCR_SSIEN, 1069 - CCSR_SSI_SCR_SSIEN); 1121 + /* Save SSIEN bit of the SCR register */ 1122 + regmap_read(regs, REG_SSI_SCR, &val); 1123 + val &= SSI_SCR_SSIEN; 1124 + /* Temporarily enable SSI to allow SxMSKs to be configurable */ 1125 + regmap_update_bits(regs, REG_SSI_SCR, SSI_SCR_SSIEN, SSI_SCR_SSIEN); 1070 1126 1071 - regmap_write(regs, CCSR_SSI_STMSK, ~tx_mask); 1072 - regmap_write(regs, CCSR_SSI_SRMSK, ~rx_mask); 1127 + regmap_write(regs, REG_SSI_STMSK, ~tx_mask); 1128 + regmap_write(regs, REG_SSI_SRMSK, ~rx_mask); 1073 1129 1074 - regmap_update_bits(regs, CCSR_SSI_SCR, CCSR_SSI_SCR_SSIEN, val); 1130 + /* Restore the value of SSIEN bit */ 1131 + regmap_update_bits(regs, REG_SSI_SCR, SSI_SCR_SSIEN, val); 1075 1132 1076 - ssi_private->slot_width = slot_width; 1077 - ssi_private->slots = slots; 1133 + ssi->slot_width = slot_width; 1134 + ssi->slots = slots; 1078 1135 1079 1136 return 0; 1080 1137 } 1081 1138 1082 1139 /** 1083 - * fsl_ssi_trigger: start and stop the DMA transfer. 1084 - * 1085 - * This function is called by ALSA to start, stop, pause, and resume the DMA 1086 - * transfer of data. 1140 + * Start or stop SSI and corresponding DMA transaction. 1087 1141 * 1088 1142 * The DMA channel is in external master start and pause mode, which 1089 1143 * means the SSI completely controls the flow of data. ··· 1091 1147 struct snd_soc_dai *dai) 1092 1148 { 1093 1149 struct snd_soc_pcm_runtime *rtd = substream->private_data; 1094 - struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(rtd->cpu_dai); 1095 - struct regmap *regs = ssi_private->regs; 1150 + struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai); 1151 + struct regmap *regs = ssi->regs; 1096 1152 1097 1153 switch (cmd) { 1098 1154 case SNDRV_PCM_TRIGGER_START: 1099 1155 case SNDRV_PCM_TRIGGER_RESUME: 1100 1156 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 1101 1157 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 1102 - fsl_ssi_tx_config(ssi_private, true); 1158 + fsl_ssi_tx_config(ssi, true); 1103 1159 else 1104 - fsl_ssi_rx_config(ssi_private, true); 1160 + fsl_ssi_rx_config(ssi, true); 1105 1161 break; 1106 1162 1107 1163 case SNDRV_PCM_TRIGGER_STOP: 1108 1164 case SNDRV_PCM_TRIGGER_SUSPEND: 1109 1165 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 1110 1166 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 1111 - fsl_ssi_tx_config(ssi_private, false); 1167 + fsl_ssi_tx_config(ssi, false); 1112 1168 else 1113 - fsl_ssi_rx_config(ssi_private, false); 1169 + fsl_ssi_rx_config(ssi, false); 1114 1170 break; 1115 1171 1116 1172 default: 1117 1173 return -EINVAL; 1118 1174 } 1119 1175 1120 - if (fsl_ssi_is_ac97(ssi_private)) { 1176 + /* Clear corresponding FIFO */ 1177 + if (fsl_ssi_is_ac97(ssi)) { 1121 1178 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 1122 - regmap_write(regs, CCSR_SSI_SOR, CCSR_SSI_SOR_TX_CLR); 1179 + regmap_write(regs, REG_SSI_SOR, SSI_SOR_TX_CLR); 1123 1180 else 1124 - regmap_write(regs, CCSR_SSI_SOR, CCSR_SSI_SOR_RX_CLR); 1181 + regmap_write(regs, REG_SSI_SOR, SSI_SOR_RX_CLR); 1125 1182 } 1126 1183 1127 1184 return 0; ··· 1130 1185 1131 1186 static int fsl_ssi_dai_probe(struct snd_soc_dai *dai) 1132 1187 { 1133 - struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(dai); 1188 + struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai); 1134 1189 1135 - if (ssi_private->soc->imx && ssi_private->use_dma) { 1136 - dai->playback_dma_data = &ssi_private->dma_params_tx; 1137 - dai->capture_dma_data = &ssi_private->dma_params_rx; 1190 + if (ssi->soc->imx && ssi->use_dma) { 1191 + dai->playback_dma_data = &ssi->dma_params_tx; 1192 + dai->capture_dma_data = &ssi->dma_params_rx; 1138 1193 } 1139 1194 1140 1195 return 0; 1141 1196 } 1142 1197 1143 1198 static const struct snd_soc_dai_ops fsl_ssi_dai_ops = { 1144 - .startup = fsl_ssi_startup, 1145 - .shutdown = fsl_ssi_shutdown, 1146 - .hw_params = fsl_ssi_hw_params, 1147 - .hw_free = fsl_ssi_hw_free, 1148 - .set_fmt = fsl_ssi_set_dai_fmt, 1149 - .set_tdm_slot = fsl_ssi_set_dai_tdm_slot, 1150 - .trigger = fsl_ssi_trigger, 1199 + .startup = fsl_ssi_startup, 1200 + .shutdown = fsl_ssi_shutdown, 1201 + .hw_params = fsl_ssi_hw_params, 1202 + .hw_free = fsl_ssi_hw_free, 1203 + .set_fmt = fsl_ssi_set_dai_fmt, 1204 + .set_tdm_slot = fsl_ssi_set_dai_tdm_slot, 1205 + .trigger = fsl_ssi_trigger, 1151 1206 }; 1152 1207 1153 - /* Template for the CPU dai driver structure */ 1154 1208 static struct snd_soc_dai_driver fsl_ssi_dai_template = { 1155 1209 .probe = fsl_ssi_dai_probe, 1156 1210 .playback = { ··· 1170 1226 }; 1171 1227 1172 1228 static const struct snd_soc_component_driver fsl_ssi_component = { 1173 - .name = "fsl-ssi", 1229 + .name = "fsl-ssi", 1174 1230 }; 1175 1231 1176 1232 static struct snd_soc_dai_driver fsl_ssi_ac97_dai = { ··· 1181 1237 .channels_min = 2, 1182 1238 .channels_max = 2, 1183 1239 .rates = SNDRV_PCM_RATE_8000_48000, 1184 - .formats = SNDRV_PCM_FMTBIT_S16_LE, 1240 + .formats = SNDRV_PCM_FMTBIT_S16 | SNDRV_PCM_FMTBIT_S20, 1185 1241 }, 1186 1242 .capture = { 1187 1243 .stream_name = "AC97 Capture", 1188 1244 .channels_min = 2, 1189 1245 .channels_max = 2, 1190 1246 .rates = SNDRV_PCM_RATE_48000, 1191 - .formats = SNDRV_PCM_FMTBIT_S16_LE, 1247 + /* 16-bit capture is broken (errata ERR003778) */ 1248 + .formats = SNDRV_PCM_FMTBIT_S20, 1192 1249 }, 1193 1250 .ops = &fsl_ssi_dai_ops, 1194 1251 }; 1195 1252 1196 - 1197 - static struct fsl_ssi_private *fsl_ac97_data; 1253 + static struct fsl_ssi *fsl_ac97_data; 1198 1254 1199 1255 static void fsl_ssi_ac97_write(struct snd_ac97 *ac97, unsigned short reg, 1200 - unsigned short val) 1256 + unsigned short val) 1201 1257 { 1202 1258 struct regmap *regs = fsl_ac97_data->regs; 1203 1259 unsigned int lreg; ··· 1217 1273 } 1218 1274 1219 1275 lreg = reg << 12; 1220 - regmap_write(regs, CCSR_SSI_SACADD, lreg); 1276 + regmap_write(regs, REG_SSI_SACADD, lreg); 1221 1277 1222 1278 lval = val << 4; 1223 - regmap_write(regs, CCSR_SSI_SACDAT, lval); 1279 + regmap_write(regs, REG_SSI_SACDAT, lval); 1224 1280 1225 - regmap_update_bits(regs, CCSR_SSI_SACNT, CCSR_SSI_SACNT_RDWR_MASK, 1226 - CCSR_SSI_SACNT_WR); 1281 + regmap_update_bits(regs, REG_SSI_SACNT, 1282 + SSI_SACNT_RDWR_MASK, SSI_SACNT_WR); 1227 1283 udelay(100); 1228 1284 1229 1285 clk_disable_unprepare(fsl_ac97_data->clk); ··· 1233 1289 } 1234 1290 1235 1291 static unsigned short fsl_ssi_ac97_read(struct snd_ac97 *ac97, 1236 - unsigned short reg) 1292 + unsigned short reg) 1237 1293 { 1238 1294 struct regmap *regs = fsl_ac97_data->regs; 1239 - 1240 1295 unsigned short val = 0; 1241 1296 u32 reg_val; 1242 1297 unsigned int lreg; ··· 1245 1302 1246 1303 ret = clk_prepare_enable(fsl_ac97_data->clk); 1247 1304 if (ret) { 1248 - pr_err("ac97 read clk_prepare_enable failed: %d\n", 1249 - ret); 1305 + pr_err("ac97 read clk_prepare_enable failed: %d\n", ret); 1250 1306 goto ret_unlock; 1251 1307 } 1252 1308 1253 1309 lreg = (reg & 0x7f) << 12; 1254 - regmap_write(regs, CCSR_SSI_SACADD, lreg); 1255 - regmap_update_bits(regs, CCSR_SSI_SACNT, CCSR_SSI_SACNT_RDWR_MASK, 1256 - CCSR_SSI_SACNT_RD); 1310 + regmap_write(regs, REG_SSI_SACADD, lreg); 1311 + regmap_update_bits(regs, REG_SSI_SACNT, 1312 + SSI_SACNT_RDWR_MASK, SSI_SACNT_RD); 1257 1313 1258 1314 udelay(100); 1259 1315 1260 - regmap_read(regs, CCSR_SSI_SACDAT, &reg_val); 1316 + regmap_read(regs, REG_SSI_SACDAT, &reg_val); 1261 1317 val = (reg_val >> 4) & 0xffff; 1262 1318 1263 1319 clk_disable_unprepare(fsl_ac97_data->clk); ··· 1267 1325 } 1268 1326 1269 1327 static struct snd_ac97_bus_ops fsl_ssi_ac97_ops = { 1270 - .read = fsl_ssi_ac97_read, 1271 - .write = fsl_ssi_ac97_write, 1328 + .read = fsl_ssi_ac97_read, 1329 + .write = fsl_ssi_ac97_write, 1272 1330 }; 1273 1331 1274 1332 /** ··· 1283 1341 } 1284 1342 1285 1343 static int fsl_ssi_imx_probe(struct platform_device *pdev, 1286 - struct fsl_ssi_private *ssi_private, void __iomem *iomem) 1344 + struct fsl_ssi *ssi, void __iomem *iomem) 1287 1345 { 1288 1346 struct device_node *np = pdev->dev.of_node; 1347 + struct device *dev = &pdev->dev; 1289 1348 u32 dmas[4]; 1290 1349 int ret; 1291 1350 1292 - if (ssi_private->has_ipg_clk_name) 1293 - ssi_private->clk = devm_clk_get(&pdev->dev, "ipg"); 1351 + /* Backward compatible for a DT without ipg clock name assigned */ 1352 + if (ssi->has_ipg_clk_name) 1353 + ssi->clk = devm_clk_get(dev, "ipg"); 1294 1354 else 1295 - ssi_private->clk = devm_clk_get(&pdev->dev, NULL); 1296 - if (IS_ERR(ssi_private->clk)) { 1297 - ret = PTR_ERR(ssi_private->clk); 1298 - dev_err(&pdev->dev, "could not get clock: %d\n", ret); 1355 + ssi->clk = devm_clk_get(dev, NULL); 1356 + if (IS_ERR(ssi->clk)) { 1357 + ret = PTR_ERR(ssi->clk); 1358 + dev_err(dev, "failed to get clock: %d\n", ret); 1299 1359 return ret; 1300 1360 } 1301 1361 1302 - if (!ssi_private->has_ipg_clk_name) { 1303 - ret = clk_prepare_enable(ssi_private->clk); 1362 + /* Enable the clock since regmap will not handle it in this case */ 1363 + if (!ssi->has_ipg_clk_name) { 1364 + ret = clk_prepare_enable(ssi->clk); 1304 1365 if (ret) { 1305 - dev_err(&pdev->dev, "clk_prepare_enable failed: %d\n", ret); 1366 + dev_err(dev, "clk_prepare_enable failed: %d\n", ret); 1306 1367 return ret; 1307 1368 } 1308 1369 } 1309 1370 1310 - /* For those SLAVE implementations, we ignore non-baudclk cases 1311 - * and, instead, abandon MASTER mode that needs baud clock. 1312 - */ 1313 - ssi_private->baudclk = devm_clk_get(&pdev->dev, "baud"); 1314 - if (IS_ERR(ssi_private->baudclk)) 1315 - dev_dbg(&pdev->dev, "could not get baud clock: %ld\n", 1316 - PTR_ERR(ssi_private->baudclk)); 1371 + /* Do not error out for slave cases that live without a baud clock */ 1372 + ssi->baudclk = devm_clk_get(dev, "baud"); 1373 + if (IS_ERR(ssi->baudclk)) 1374 + dev_dbg(dev, "failed to get baud clock: %ld\n", 1375 + PTR_ERR(ssi->baudclk)); 1317 1376 1318 - ssi_private->dma_params_tx.maxburst = ssi_private->dma_maxburst; 1319 - ssi_private->dma_params_rx.maxburst = ssi_private->dma_maxburst; 1320 - ssi_private->dma_params_tx.addr = ssi_private->ssi_phys + CCSR_SSI_STX0; 1321 - ssi_private->dma_params_rx.addr = ssi_private->ssi_phys + CCSR_SSI_SRX0; 1377 + ssi->dma_params_tx.maxburst = ssi->dma_maxburst; 1378 + ssi->dma_params_rx.maxburst = ssi->dma_maxburst; 1379 + ssi->dma_params_tx.addr = ssi->ssi_phys + REG_SSI_STX0; 1380 + ssi->dma_params_rx.addr = ssi->ssi_phys + REG_SSI_SRX0; 1322 1381 1382 + /* Set to dual FIFO mode according to the SDMA sciprt */ 1323 1383 ret = of_property_read_u32_array(np, "dmas", dmas, 4); 1324 - if (ssi_private->use_dma && !ret && dmas[2] == IMX_DMATYPE_SSI_DUAL) { 1325 - ssi_private->use_dual_fifo = true; 1326 - /* When using dual fifo mode, we need to keep watermark 1327 - * as even numbers due to dma script limitation. 1384 + if (ssi->use_dma && !ret && dmas[2] == IMX_DMATYPE_SSI_DUAL) { 1385 + ssi->use_dual_fifo = true; 1386 + /* 1387 + * Use even numbers to avoid channel swap due to SDMA 1388 + * script design 1328 1389 */ 1329 - ssi_private->dma_params_tx.maxburst &= ~0x1; 1330 - ssi_private->dma_params_rx.maxburst &= ~0x1; 1390 + ssi->dma_params_tx.maxburst &= ~0x1; 1391 + ssi->dma_params_rx.maxburst &= ~0x1; 1331 1392 } 1332 1393 1333 - if (!ssi_private->use_dma) { 1334 - 1394 + if (!ssi->use_dma) { 1335 1395 /* 1336 - * Some boards use an incompatible codec. To get it 1337 - * working, we are using imx-fiq-pcm-audio, that 1338 - * can handle those codecs. DMA is not possible in this 1339 - * situation. 1396 + * Some boards use an incompatible codec. Use imx-fiq-pcm-audio 1397 + * to get it working, as DMA is not possible in this situation. 1340 1398 */ 1399 + ssi->fiq_params.irq = ssi->irq; 1400 + ssi->fiq_params.base = iomem; 1401 + ssi->fiq_params.dma_params_rx = &ssi->dma_params_rx; 1402 + ssi->fiq_params.dma_params_tx = &ssi->dma_params_tx; 1341 1403 1342 - ssi_private->fiq_params.irq = ssi_private->irq; 1343 - ssi_private->fiq_params.base = iomem; 1344 - ssi_private->fiq_params.dma_params_rx = 1345 - &ssi_private->dma_params_rx; 1346 - ssi_private->fiq_params.dma_params_tx = 1347 - &ssi_private->dma_params_tx; 1348 - 1349 - ret = imx_pcm_fiq_init(pdev, &ssi_private->fiq_params); 1404 + ret = imx_pcm_fiq_init(pdev, &ssi->fiq_params); 1350 1405 if (ret) 1351 1406 goto error_pcm; 1352 1407 } else { ··· 1355 1416 return 0; 1356 1417 1357 1418 error_pcm: 1419 + if (!ssi->has_ipg_clk_name) 1420 + clk_disable_unprepare(ssi->clk); 1358 1421 1359 - if (!ssi_private->has_ipg_clk_name) 1360 - clk_disable_unprepare(ssi_private->clk); 1361 1422 return ret; 1362 1423 } 1363 1424 1364 - static void fsl_ssi_imx_clean(struct platform_device *pdev, 1365 - struct fsl_ssi_private *ssi_private) 1425 + static void fsl_ssi_imx_clean(struct platform_device *pdev, struct fsl_ssi *ssi) 1366 1426 { 1367 - if (!ssi_private->use_dma) 1427 + if (!ssi->use_dma) 1368 1428 imx_pcm_fiq_exit(pdev); 1369 - if (!ssi_private->has_ipg_clk_name) 1370 - clk_disable_unprepare(ssi_private->clk); 1429 + if (!ssi->has_ipg_clk_name) 1430 + clk_disable_unprepare(ssi->clk); 1371 1431 } 1372 1432 1373 1433 static int fsl_ssi_probe(struct platform_device *pdev) 1374 1434 { 1375 - struct fsl_ssi_private *ssi_private; 1435 + struct fsl_ssi *ssi; 1376 1436 int ret = 0; 1377 1437 struct device_node *np = pdev->dev.of_node; 1438 + struct device *dev = &pdev->dev; 1378 1439 const struct of_device_id *of_id; 1379 1440 const char *p, *sprop; 1380 1441 const uint32_t *iprop; ··· 1383 1444 char name[64]; 1384 1445 struct regmap_config regconfig = fsl_ssi_regconfig; 1385 1446 1386 - of_id = of_match_device(fsl_ssi_ids, &pdev->dev); 1447 + of_id = of_match_device(fsl_ssi_ids, dev); 1387 1448 if (!of_id || !of_id->data) 1388 1449 return -EINVAL; 1389 1450 1390 - ssi_private = devm_kzalloc(&pdev->dev, sizeof(*ssi_private), 1391 - GFP_KERNEL); 1392 - if (!ssi_private) 1451 + ssi = devm_kzalloc(dev, sizeof(*ssi), GFP_KERNEL); 1452 + if (!ssi) 1393 1453 return -ENOMEM; 1394 1454 1395 - ssi_private->soc = of_id->data; 1396 - ssi_private->dev = &pdev->dev; 1455 + ssi->soc = of_id->data; 1456 + ssi->dev = dev; 1397 1457 1458 + /* Check if being used in AC97 mode */ 1398 1459 sprop = of_get_property(np, "fsl,mode", NULL); 1399 1460 if (sprop) { 1400 1461 if (!strcmp(sprop, "ac97-slave")) 1401 - ssi_private->dai_fmt = SND_SOC_DAIFMT_AC97; 1462 + ssi->dai_fmt = SND_SOC_DAIFMT_AC97; 1402 1463 } 1403 1464 1404 - ssi_private->use_dma = !of_property_read_bool(np, 1405 - "fsl,fiq-stream-filter"); 1465 + /* Select DMA or FIQ */ 1466 + ssi->use_dma = !of_property_read_bool(np, "fsl,fiq-stream-filter"); 1406 1467 1407 - if (fsl_ssi_is_ac97(ssi_private)) { 1408 - memcpy(&ssi_private->cpu_dai_drv, &fsl_ssi_ac97_dai, 1409 - sizeof(fsl_ssi_ac97_dai)); 1410 - 1411 - fsl_ac97_data = ssi_private; 1468 + if (fsl_ssi_is_ac97(ssi)) { 1469 + memcpy(&ssi->cpu_dai_drv, &fsl_ssi_ac97_dai, 1470 + sizeof(fsl_ssi_ac97_dai)); 1471 + fsl_ac97_data = ssi; 1412 1472 } else { 1413 - /* Initialize this copy of the CPU DAI driver structure */ 1414 - memcpy(&ssi_private->cpu_dai_drv, &fsl_ssi_dai_template, 1473 + memcpy(&ssi->cpu_dai_drv, &fsl_ssi_dai_template, 1415 1474 sizeof(fsl_ssi_dai_template)); 1416 1475 } 1417 - ssi_private->cpu_dai_drv.name = dev_name(&pdev->dev); 1476 + ssi->cpu_dai_drv.name = dev_name(dev); 1418 1477 1419 1478 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1420 - iomem = devm_ioremap_resource(&pdev->dev, res); 1479 + iomem = devm_ioremap_resource(dev, res); 1421 1480 if (IS_ERR(iomem)) 1422 1481 return PTR_ERR(iomem); 1423 - ssi_private->ssi_phys = res->start; 1482 + ssi->ssi_phys = res->start; 1424 1483 1425 - if (ssi_private->soc->imx21regs) { 1426 - /* 1427 - * According to datasheet imx21-class SSI 1428 - * don't have SACC{ST,EN,DIS} regs. 1429 - */ 1430 - regconfig.max_register = CCSR_SSI_SRMSK; 1484 + if (ssi->soc->imx21regs) { 1485 + /* No SACC{ST,EN,DIS} regs in imx21-class SSI */ 1486 + regconfig.max_register = REG_SSI_SRMSK; 1431 1487 regconfig.num_reg_defaults_raw = 1432 - CCSR_SSI_SRMSK / sizeof(uint32_t) + 1; 1488 + REG_SSI_SRMSK / sizeof(uint32_t) + 1; 1433 1489 } 1434 1490 1435 1491 ret = of_property_match_string(np, "clock-names", "ipg"); 1436 1492 if (ret < 0) { 1437 - ssi_private->has_ipg_clk_name = false; 1438 - ssi_private->regs = devm_regmap_init_mmio(&pdev->dev, iomem, 1439 - &regconfig); 1493 + ssi->has_ipg_clk_name = false; 1494 + ssi->regs = devm_regmap_init_mmio(dev, iomem, &regconfig); 1440 1495 } else { 1441 - ssi_private->has_ipg_clk_name = true; 1442 - ssi_private->regs = devm_regmap_init_mmio_clk(&pdev->dev, 1443 - "ipg", iomem, &regconfig); 1496 + ssi->has_ipg_clk_name = true; 1497 + ssi->regs = devm_regmap_init_mmio_clk(dev, "ipg", iomem, 1498 + &regconfig); 1444 1499 } 1445 - if (IS_ERR(ssi_private->regs)) { 1446 - dev_err(&pdev->dev, "Failed to init register map\n"); 1447 - return PTR_ERR(ssi_private->regs); 1448 - } 1449 - 1450 - ssi_private->irq = platform_get_irq(pdev, 0); 1451 - if (ssi_private->irq < 0) { 1452 - dev_err(&pdev->dev, "no irq for node %s\n", pdev->name); 1453 - return ssi_private->irq; 1500 + if (IS_ERR(ssi->regs)) { 1501 + dev_err(dev, "failed to init register map\n"); 1502 + return PTR_ERR(ssi->regs); 1454 1503 } 1455 1504 1456 - /* Are the RX and the TX clocks locked? */ 1505 + ssi->irq = platform_get_irq(pdev, 0); 1506 + if (ssi->irq < 0) { 1507 + dev_err(dev, "no irq for node %s\n", pdev->name); 1508 + return ssi->irq; 1509 + } 1510 + 1511 + /* Set software limitations for synchronous mode */ 1457 1512 if (!of_find_property(np, "fsl,ssi-asynchronous", NULL)) { 1458 - if (!fsl_ssi_is_ac97(ssi_private)) 1459 - ssi_private->cpu_dai_drv.symmetric_rates = 1; 1513 + if (!fsl_ssi_is_ac97(ssi)) { 1514 + ssi->cpu_dai_drv.symmetric_rates = 1; 1515 + ssi->cpu_dai_drv.symmetric_samplebits = 1; 1516 + } 1460 1517 1461 - ssi_private->cpu_dai_drv.symmetric_channels = 1; 1462 - ssi_private->cpu_dai_drv.symmetric_samplebits = 1; 1518 + ssi->cpu_dai_drv.symmetric_channels = 1; 1463 1519 } 1464 1520 1465 - /* Determine the FIFO depth. */ 1521 + /* Fetch FIFO depth; Set to 8 for older DT without this property */ 1466 1522 iprop = of_get_property(np, "fsl,fifo-depth", NULL); 1467 1523 if (iprop) 1468 - ssi_private->fifo_depth = be32_to_cpup(iprop); 1524 + ssi->fifo_depth = be32_to_cpup(iprop); 1469 1525 else 1470 - /* Older 8610 DTs didn't have the fifo-depth property */ 1471 - ssi_private->fifo_depth = 8; 1526 + ssi->fifo_depth = 8; 1472 1527 1473 1528 /* 1474 - * Set the watermark for transmit FIFO 0 and receive FIFO 0. We don't 1475 - * use FIFO 1 but set the watermark appropriately nontheless. 1476 - * We program the transmit water to signal a DMA transfer 1477 - * if there are N elements left in the FIFO. For chips with 15-deep 1478 - * FIFOs, set watermark to 8. This allows the SSI to operate at a 1479 - * high data rate without channel slipping. Behavior is unchanged 1480 - * for the older chips with a fifo depth of only 8. A value of 4 1481 - * might be appropriate for the older chips, but is left at 1482 - * fifo_depth-2 until sombody has a chance to test. 1529 + * Configure TX and RX DMA watermarks -- when to send a DMA request 1483 1530 * 1484 - * We set the watermark on the same level as the DMA burstsize. For 1485 - * fiq it is probably better to use the biggest possible watermark 1486 - * size. 1531 + * Values should be tested to avoid FIFO under/over run. Set maxburst 1532 + * to fifo_watermark to maxiumize DMA transaction to reduce overhead. 1487 1533 */ 1488 - switch (ssi_private->fifo_depth) { 1534 + switch (ssi->fifo_depth) { 1489 1535 case 15: 1490 1536 /* 1491 - * 2 samples is not enough when running at high data 1492 - * rates (like 48kHz @ 16 bits/channel, 16 channels) 1493 - * 8 seems to split things evenly and leave enough time 1494 - * for the DMA to fill the FIFO before it's over/under 1495 - * run. 1537 + * Set to 8 as a balanced configuration -- When TX FIFO has 8 1538 + * empty slots, send a DMA request to fill these 8 slots. The 1539 + * remaining 7 slots should be able to allow DMA to finish the 1540 + * transaction before TX FIFO underruns; Same applies to RX. 1541 + * 1542 + * Tested with cases running at 48kHz @ 16 bits x 16 channels 1496 1543 */ 1497 - ssi_private->fifo_watermark = 8; 1498 - ssi_private->dma_maxburst = 8; 1544 + ssi->fifo_watermark = 8; 1545 + ssi->dma_maxburst = 8; 1499 1546 break; 1500 1547 case 8: 1501 1548 default: 1502 - /* 1503 - * maintain old behavior for older chips. 1504 - * Keeping it the same because I don't have an older 1505 - * board to test with. 1506 - * I suspect this could be changed to be something to 1507 - * leave some more space in the fifo. 1508 - */ 1509 - ssi_private->fifo_watermark = ssi_private->fifo_depth - 2; 1510 - ssi_private->dma_maxburst = ssi_private->fifo_depth - 2; 1549 + /* Safely use old watermark configurations for older chips */ 1550 + ssi->fifo_watermark = ssi->fifo_depth - 2; 1551 + ssi->dma_maxburst = ssi->fifo_depth - 2; 1511 1552 break; 1512 1553 } 1513 1554 1514 - dev_set_drvdata(&pdev->dev, ssi_private); 1555 + dev_set_drvdata(dev, ssi); 1515 1556 1516 - if (ssi_private->soc->imx) { 1517 - ret = fsl_ssi_imx_probe(pdev, ssi_private, iomem); 1557 + if (ssi->soc->imx) { 1558 + ret = fsl_ssi_imx_probe(pdev, ssi, iomem); 1518 1559 if (ret) 1519 1560 return ret; 1520 1561 } 1521 1562 1522 - if (fsl_ssi_is_ac97(ssi_private)) { 1523 - mutex_init(&ssi_private->ac97_reg_lock); 1563 + if (fsl_ssi_is_ac97(ssi)) { 1564 + mutex_init(&ssi->ac97_reg_lock); 1524 1565 ret = snd_soc_set_ac97_ops_of_reset(&fsl_ssi_ac97_ops, pdev); 1525 1566 if (ret) { 1526 - dev_err(&pdev->dev, "could not set AC'97 ops\n"); 1567 + dev_err(dev, "failed to set AC'97 ops\n"); 1527 1568 goto error_ac97_ops; 1528 1569 } 1529 1570 } 1530 1571 1531 - ret = devm_snd_soc_register_component(&pdev->dev, &fsl_ssi_component, 1532 - &ssi_private->cpu_dai_drv, 1); 1572 + ret = devm_snd_soc_register_component(dev, &fsl_ssi_component, 1573 + &ssi->cpu_dai_drv, 1); 1533 1574 if (ret) { 1534 - dev_err(&pdev->dev, "failed to register DAI: %d\n", ret); 1575 + dev_err(dev, "failed to register DAI: %d\n", ret); 1535 1576 goto error_asoc_register; 1536 1577 } 1537 1578 1538 - if (ssi_private->use_dma) { 1539 - ret = devm_request_irq(&pdev->dev, ssi_private->irq, 1540 - fsl_ssi_isr, 0, dev_name(&pdev->dev), 1541 - ssi_private); 1579 + if (ssi->use_dma) { 1580 + ret = devm_request_irq(dev, ssi->irq, fsl_ssi_isr, 0, 1581 + dev_name(dev), ssi); 1542 1582 if (ret < 0) { 1543 - dev_err(&pdev->dev, "could not claim irq %u\n", 1544 - ssi_private->irq); 1583 + dev_err(dev, "failed to claim irq %u\n", ssi->irq); 1545 1584 goto error_asoc_register; 1546 1585 } 1547 1586 } 1548 1587 1549 - ret = fsl_ssi_debugfs_create(&ssi_private->dbg_stats, &pdev->dev); 1588 + ret = fsl_ssi_debugfs_create(&ssi->dbg_stats, dev); 1550 1589 if (ret) 1551 1590 goto error_asoc_register; 1552 1591 1553 - /* 1554 - * If codec-handle property is missing from SSI node, we assume 1555 - * that the machine driver uses new binding which does not require 1556 - * SSI driver to trigger machine driver's probe. 1557 - */ 1592 + /* Bypass it if using newer DT bindings of ASoC machine drivers */ 1558 1593 if (!of_get_property(np, "codec-handle", NULL)) 1559 1594 goto done; 1560 1595 1561 - /* Trigger the machine driver's probe function. The platform driver 1562 - * name of the machine driver is taken from /compatible property of the 1563 - * device tree. We also pass the address of the CPU DAI driver 1564 - * structure. 1596 + /* 1597 + * Backward compatible for older bindings by manually triggering the 1598 + * machine driver's probe(). Use /compatible property, including the 1599 + * address of CPU DAI driver structure, as the name of machine driver. 1565 1600 */ 1566 1601 sprop = of_get_property(of_find_node_by_path("/"), "compatible", NULL); 1567 1602 /* Sometimes the compatible name has a "fsl," prefix, so we strip it. */ ··· 1545 1632 snprintf(name, sizeof(name), "snd-soc-%s", sprop); 1546 1633 make_lowercase(name); 1547 1634 1548 - ssi_private->pdev = 1549 - platform_device_register_data(&pdev->dev, name, 0, NULL, 0); 1550 - if (IS_ERR(ssi_private->pdev)) { 1551 - ret = PTR_ERR(ssi_private->pdev); 1552 - dev_err(&pdev->dev, "failed to register platform: %d\n", ret); 1635 + ssi->pdev = platform_device_register_data(dev, name, 0, NULL, 0); 1636 + if (IS_ERR(ssi->pdev)) { 1637 + ret = PTR_ERR(ssi->pdev); 1638 + dev_err(dev, "failed to register platform: %d\n", ret); 1553 1639 goto error_sound_card; 1554 1640 } 1555 1641 1556 1642 done: 1557 - if (ssi_private->dai_fmt) 1558 - _fsl_ssi_set_dai_fmt(&pdev->dev, ssi_private, 1559 - ssi_private->dai_fmt); 1643 + if (ssi->dai_fmt) 1644 + _fsl_ssi_set_dai_fmt(dev, ssi, ssi->dai_fmt); 1560 1645 1561 - if (fsl_ssi_is_ac97(ssi_private)) { 1646 + if (fsl_ssi_is_ac97(ssi)) { 1562 1647 u32 ssi_idx; 1563 1648 1564 1649 ret = of_property_read_u32(np, "cell-index", &ssi_idx); 1565 1650 if (ret) { 1566 - dev_err(&pdev->dev, "cannot get SSI index property\n"); 1651 + dev_err(dev, "failed to get SSI index property\n"); 1567 1652 goto error_sound_card; 1568 1653 } 1569 1654 1570 - ssi_private->pdev = 1571 - platform_device_register_data(NULL, 1572 - "ac97-codec", ssi_idx, NULL, 0); 1573 - if (IS_ERR(ssi_private->pdev)) { 1574 - ret = PTR_ERR(ssi_private->pdev); 1575 - dev_err(&pdev->dev, 1655 + ssi->pdev = platform_device_register_data(NULL, "ac97-codec", 1656 + ssi_idx, NULL, 0); 1657 + if (IS_ERR(ssi->pdev)) { 1658 + ret = PTR_ERR(ssi->pdev); 1659 + dev_err(dev, 1576 1660 "failed to register AC97 codec platform: %d\n", 1577 1661 ret); 1578 1662 goto error_sound_card; ··· 1579 1669 return 0; 1580 1670 1581 1671 error_sound_card: 1582 - fsl_ssi_debugfs_remove(&ssi_private->dbg_stats); 1583 - 1672 + fsl_ssi_debugfs_remove(&ssi->dbg_stats); 1584 1673 error_asoc_register: 1585 - if (fsl_ssi_is_ac97(ssi_private)) 1674 + if (fsl_ssi_is_ac97(ssi)) 1586 1675 snd_soc_set_ac97_ops(NULL); 1587 - 1588 1676 error_ac97_ops: 1589 - if (fsl_ssi_is_ac97(ssi_private)) 1590 - mutex_destroy(&ssi_private->ac97_reg_lock); 1677 + if (fsl_ssi_is_ac97(ssi)) 1678 + mutex_destroy(&ssi->ac97_reg_lock); 1591 1679 1592 - if (ssi_private->soc->imx) 1593 - fsl_ssi_imx_clean(pdev, ssi_private); 1680 + if (ssi->soc->imx) 1681 + fsl_ssi_imx_clean(pdev, ssi); 1594 1682 1595 1683 return ret; 1596 1684 } 1597 1685 1598 1686 static int fsl_ssi_remove(struct platform_device *pdev) 1599 1687 { 1600 - struct fsl_ssi_private *ssi_private = dev_get_drvdata(&pdev->dev); 1688 + struct fsl_ssi *ssi = dev_get_drvdata(&pdev->dev); 1601 1689 1602 - fsl_ssi_debugfs_remove(&ssi_private->dbg_stats); 1690 + fsl_ssi_debugfs_remove(&ssi->dbg_stats); 1603 1691 1604 - if (ssi_private->pdev) 1605 - platform_device_unregister(ssi_private->pdev); 1692 + if (ssi->pdev) 1693 + platform_device_unregister(ssi->pdev); 1606 1694 1607 - if (ssi_private->soc->imx) 1608 - fsl_ssi_imx_clean(pdev, ssi_private); 1695 + if (ssi->soc->imx) 1696 + fsl_ssi_imx_clean(pdev, ssi); 1609 1697 1610 - if (fsl_ssi_is_ac97(ssi_private)) { 1698 + if (fsl_ssi_is_ac97(ssi)) { 1611 1699 snd_soc_set_ac97_ops(NULL); 1612 - mutex_destroy(&ssi_private->ac97_reg_lock); 1700 + mutex_destroy(&ssi->ac97_reg_lock); 1613 1701 } 1614 1702 1615 1703 return 0; ··· 1616 1708 #ifdef CONFIG_PM_SLEEP 1617 1709 static int fsl_ssi_suspend(struct device *dev) 1618 1710 { 1619 - struct fsl_ssi_private *ssi_private = dev_get_drvdata(dev); 1620 - struct regmap *regs = ssi_private->regs; 1711 + struct fsl_ssi *ssi = dev_get_drvdata(dev); 1712 + struct regmap *regs = ssi->regs; 1621 1713 1622 - regmap_read(regs, CCSR_SSI_SFCSR, 1623 - &ssi_private->regcache_sfcsr); 1624 - regmap_read(regs, CCSR_SSI_SACNT, 1625 - &ssi_private->regcache_sacnt); 1714 + regmap_read(regs, REG_SSI_SFCSR, &ssi->regcache_sfcsr); 1715 + regmap_read(regs, REG_SSI_SACNT, &ssi->regcache_sacnt); 1626 1716 1627 1717 regcache_cache_only(regs, true); 1628 1718 regcache_mark_dirty(regs); ··· 1630 1724 1631 1725 static int fsl_ssi_resume(struct device *dev) 1632 1726 { 1633 - struct fsl_ssi_private *ssi_private = dev_get_drvdata(dev); 1634 - struct regmap *regs = ssi_private->regs; 1727 + struct fsl_ssi *ssi = dev_get_drvdata(dev); 1728 + struct regmap *regs = ssi->regs; 1635 1729 1636 1730 regcache_cache_only(regs, false); 1637 1731 1638 - regmap_update_bits(regs, CCSR_SSI_SFCSR, 1639 - CCSR_SSI_SFCSR_RFWM1_MASK | CCSR_SSI_SFCSR_TFWM1_MASK | 1640 - CCSR_SSI_SFCSR_RFWM0_MASK | CCSR_SSI_SFCSR_TFWM0_MASK, 1641 - ssi_private->regcache_sfcsr); 1642 - regmap_write(regs, CCSR_SSI_SACNT, 1643 - ssi_private->regcache_sacnt); 1732 + regmap_update_bits(regs, REG_SSI_SFCSR, 1733 + SSI_SFCSR_RFWM1_MASK | SSI_SFCSR_TFWM1_MASK | 1734 + SSI_SFCSR_RFWM0_MASK | SSI_SFCSR_TFWM0_MASK, 1735 + ssi->regcache_sfcsr); 1736 + regmap_write(regs, REG_SSI_SACNT, ssi->regcache_sacnt); 1644 1737 1645 1738 return regcache_sync(regs); 1646 1739 }
+245 -182
sound/soc/fsl/fsl_ssi.h
··· 1 1 /* 2 - * fsl_ssi.h - ALSA SSI interface for the Freescale MPC8610 SoC 2 + * fsl_ssi.h - ALSA SSI interface for the Freescale MPC8610 and i.MX SoC 3 3 * 4 4 * Author: Timur Tabi <timur@freescale.com> 5 5 * ··· 12 12 #ifndef _MPC8610_I2S_H 13 13 #define _MPC8610_I2S_H 14 14 15 - /* SSI registers */ 16 - #define CCSR_SSI_STX0 0x00 17 - #define CCSR_SSI_STX1 0x04 18 - #define CCSR_SSI_SRX0 0x08 19 - #define CCSR_SSI_SRX1 0x0c 20 - #define CCSR_SSI_SCR 0x10 21 - #define CCSR_SSI_SISR 0x14 22 - #define CCSR_SSI_SIER 0x18 23 - #define CCSR_SSI_STCR 0x1c 24 - #define CCSR_SSI_SRCR 0x20 25 - #define CCSR_SSI_STCCR 0x24 26 - #define CCSR_SSI_SRCCR 0x28 27 - #define CCSR_SSI_SFCSR 0x2c 28 - #define CCSR_SSI_STR 0x30 29 - #define CCSR_SSI_SOR 0x34 30 - #define CCSR_SSI_SACNT 0x38 31 - #define CCSR_SSI_SACADD 0x3c 32 - #define CCSR_SSI_SACDAT 0x40 33 - #define CCSR_SSI_SATAG 0x44 34 - #define CCSR_SSI_STMSK 0x48 35 - #define CCSR_SSI_SRMSK 0x4c 36 - #define CCSR_SSI_SACCST 0x50 37 - #define CCSR_SSI_SACCEN 0x54 38 - #define CCSR_SSI_SACCDIS 0x58 15 + #define RX 0 16 + #define TX 1 39 17 40 - #define CCSR_SSI_SCR_SYNC_TX_FS 0x00001000 41 - #define CCSR_SSI_SCR_RFR_CLK_DIS 0x00000800 42 - #define CCSR_SSI_SCR_TFR_CLK_DIS 0x00000400 43 - #define CCSR_SSI_SCR_TCH_EN 0x00000100 44 - #define CCSR_SSI_SCR_SYS_CLK_EN 0x00000080 45 - #define CCSR_SSI_SCR_I2S_MODE_MASK 0x00000060 46 - #define CCSR_SSI_SCR_I2S_MODE_NORMAL 0x00000000 47 - #define CCSR_SSI_SCR_I2S_MODE_MASTER 0x00000020 48 - #define CCSR_SSI_SCR_I2S_MODE_SLAVE 0x00000040 49 - #define CCSR_SSI_SCR_SYN 0x00000010 50 - #define CCSR_SSI_SCR_NET 0x00000008 51 - #define CCSR_SSI_SCR_RE 0x00000004 52 - #define CCSR_SSI_SCR_TE 0x00000002 53 - #define CCSR_SSI_SCR_SSIEN 0x00000001 18 + /* -- SSI Register Map -- */ 54 19 55 - #define CCSR_SSI_SISR_RFRC 0x01000000 56 - #define CCSR_SSI_SISR_TFRC 0x00800000 57 - #define CCSR_SSI_SISR_CMDAU 0x00040000 58 - #define CCSR_SSI_SISR_CMDDU 0x00020000 59 - #define CCSR_SSI_SISR_RXT 0x00010000 60 - #define CCSR_SSI_SISR_RDR1 0x00008000 61 - #define CCSR_SSI_SISR_RDR0 0x00004000 62 - #define CCSR_SSI_SISR_TDE1 0x00002000 63 - #define CCSR_SSI_SISR_TDE0 0x00001000 64 - #define CCSR_SSI_SISR_ROE1 0x00000800 65 - #define CCSR_SSI_SISR_ROE0 0x00000400 66 - #define CCSR_SSI_SISR_TUE1 0x00000200 67 - #define CCSR_SSI_SISR_TUE0 0x00000100 68 - #define CCSR_SSI_SISR_TFS 0x00000080 69 - #define CCSR_SSI_SISR_RFS 0x00000040 70 - #define CCSR_SSI_SISR_TLS 0x00000020 71 - #define CCSR_SSI_SISR_RLS 0x00000010 72 - #define CCSR_SSI_SISR_RFF1 0x00000008 73 - #define CCSR_SSI_SISR_RFF0 0x00000004 74 - #define CCSR_SSI_SISR_TFE1 0x00000002 75 - #define CCSR_SSI_SISR_TFE0 0x00000001 20 + /* SSI Transmit Data Register 0 */ 21 + #define REG_SSI_STX0 0x00 22 + /* SSI Transmit Data Register 1 */ 23 + #define REG_SSI_STX1 0x04 24 + /* SSI Receive Data Register 0 */ 25 + #define REG_SSI_SRX0 0x08 26 + /* SSI Receive Data Register 1 */ 27 + #define REG_SSI_SRX1 0x0c 28 + /* SSI Control Register */ 29 + #define REG_SSI_SCR 0x10 30 + /* SSI Interrupt Status Register */ 31 + #define REG_SSI_SISR 0x14 32 + /* SSI Interrupt Enable Register */ 33 + #define REG_SSI_SIER 0x18 34 + /* SSI Transmit Configuration Register */ 35 + #define REG_SSI_STCR 0x1c 36 + /* SSI Receive Configuration Register */ 37 + #define REG_SSI_SRCR 0x20 38 + #define REG_SSI_SxCR(tx) ((tx) ? REG_SSI_STCR : REG_SSI_SRCR) 39 + /* SSI Transmit Clock Control Register */ 40 + #define REG_SSI_STCCR 0x24 41 + /* SSI Receive Clock Control Register */ 42 + #define REG_SSI_SRCCR 0x28 43 + #define REG_SSI_SxCCR(tx) ((tx) ? REG_SSI_STCCR : REG_SSI_SRCCR) 44 + /* SSI FIFO Control/Status Register */ 45 + #define REG_SSI_SFCSR 0x2c 46 + /* 47 + * SSI Test Register (Intended for debugging purposes only) 48 + * 49 + * Note: STR is not documented in recent IMX datasheet, but 50 + * is described in IMX51 reference manual at section 56.3.3.14 51 + */ 52 + #define REG_SSI_STR 0x30 53 + /* 54 + * SSI Option Register (Intended for internal use only) 55 + * 56 + * Note: SOR is not documented in recent IMX datasheet, but 57 + * is described in IMX51 reference manual at section 56.3.3.15 58 + */ 59 + #define REG_SSI_SOR 0x34 60 + /* SSI AC97 Control Register */ 61 + #define REG_SSI_SACNT 0x38 62 + /* SSI AC97 Command Address Register */ 63 + #define REG_SSI_SACADD 0x3c 64 + /* SSI AC97 Command Data Register */ 65 + #define REG_SSI_SACDAT 0x40 66 + /* SSI AC97 Tag Register */ 67 + #define REG_SSI_SATAG 0x44 68 + /* SSI Transmit Time Slot Mask Register */ 69 + #define REG_SSI_STMSK 0x48 70 + /* SSI Receive Time Slot Mask Register */ 71 + #define REG_SSI_SRMSK 0x4c 72 + #define REG_SSI_SxMSK(tx) ((tx) ? REG_SSI_STMSK : REG_SSI_SRMSK) 73 + /* 74 + * SSI AC97 Channel Status Register 75 + * 76 + * The status could be changed by: 77 + * 1) Writing a '1' bit at some position in SACCEN sets relevant bit in SACCST 78 + * 2) Writing a '1' bit at some position in SACCDIS unsets the relevant bit 79 + * 3) Receivng a '1' in SLOTREQ bit from external CODEC via AC Link 80 + */ 81 + #define REG_SSI_SACCST 0x50 82 + /* SSI AC97 Channel Enable Register -- Set bits in SACCST */ 83 + #define REG_SSI_SACCEN 0x54 84 + /* SSI AC97 Channel Disable Register -- Clear bits in SACCST */ 85 + #define REG_SSI_SACCDIS 0x58 76 86 77 - #define CCSR_SSI_SIER_RFRC_EN 0x01000000 78 - #define CCSR_SSI_SIER_TFRC_EN 0x00800000 79 - #define CCSR_SSI_SIER_RDMAE 0x00400000 80 - #define CCSR_SSI_SIER_RIE 0x00200000 81 - #define CCSR_SSI_SIER_TDMAE 0x00100000 82 - #define CCSR_SSI_SIER_TIE 0x00080000 83 - #define CCSR_SSI_SIER_CMDAU_EN 0x00040000 84 - #define CCSR_SSI_SIER_CMDDU_EN 0x00020000 85 - #define CCSR_SSI_SIER_RXT_EN 0x00010000 86 - #define CCSR_SSI_SIER_RDR1_EN 0x00008000 87 - #define CCSR_SSI_SIER_RDR0_EN 0x00004000 88 - #define CCSR_SSI_SIER_TDE1_EN 0x00002000 89 - #define CCSR_SSI_SIER_TDE0_EN 0x00001000 90 - #define CCSR_SSI_SIER_ROE1_EN 0x00000800 91 - #define CCSR_SSI_SIER_ROE0_EN 0x00000400 92 - #define CCSR_SSI_SIER_TUE1_EN 0x00000200 93 - #define CCSR_SSI_SIER_TUE0_EN 0x00000100 94 - #define CCSR_SSI_SIER_TFS_EN 0x00000080 95 - #define CCSR_SSI_SIER_RFS_EN 0x00000040 96 - #define CCSR_SSI_SIER_TLS_EN 0x00000020 97 - #define CCSR_SSI_SIER_RLS_EN 0x00000010 98 - #define CCSR_SSI_SIER_RFF1_EN 0x00000008 99 - #define CCSR_SSI_SIER_RFF0_EN 0x00000004 100 - #define CCSR_SSI_SIER_TFE1_EN 0x00000002 101 - #define CCSR_SSI_SIER_TFE0_EN 0x00000001 87 + /* -- SSI Register Field Maps -- */ 102 88 103 - #define CCSR_SSI_STCR_TXBIT0 0x00000200 104 - #define CCSR_SSI_STCR_TFEN1 0x00000100 105 - #define CCSR_SSI_STCR_TFEN0 0x00000080 106 - #define CCSR_SSI_STCR_TFDIR 0x00000040 107 - #define CCSR_SSI_STCR_TXDIR 0x00000020 108 - #define CCSR_SSI_STCR_TSHFD 0x00000010 109 - #define CCSR_SSI_STCR_TSCKP 0x00000008 110 - #define CCSR_SSI_STCR_TFSI 0x00000004 111 - #define CCSR_SSI_STCR_TFSL 0x00000002 112 - #define CCSR_SSI_STCR_TEFS 0x00000001 89 + /* SSI Control Register -- REG_SSI_SCR 0x10 */ 90 + #define SSI_SCR_SYNC_TX_FS 0x00001000 91 + #define SSI_SCR_RFR_CLK_DIS 0x00000800 92 + #define SSI_SCR_TFR_CLK_DIS 0x00000400 93 + #define SSI_SCR_TCH_EN 0x00000100 94 + #define SSI_SCR_SYS_CLK_EN 0x00000080 95 + #define SSI_SCR_I2S_MODE_MASK 0x00000060 96 + #define SSI_SCR_I2S_MODE_NORMAL 0x00000000 97 + #define SSI_SCR_I2S_MODE_MASTER 0x00000020 98 + #define SSI_SCR_I2S_MODE_SLAVE 0x00000040 99 + #define SSI_SCR_SYN 0x00000010 100 + #define SSI_SCR_NET 0x00000008 101 + #define SSI_SCR_I2S_NET_MASK (SSI_SCR_NET | SSI_SCR_I2S_MODE_MASK) 102 + #define SSI_SCR_RE 0x00000004 103 + #define SSI_SCR_TE 0x00000002 104 + #define SSI_SCR_SSIEN 0x00000001 113 105 114 - #define CCSR_SSI_SRCR_RXEXT 0x00000400 115 - #define CCSR_SSI_SRCR_RXBIT0 0x00000200 116 - #define CCSR_SSI_SRCR_RFEN1 0x00000100 117 - #define CCSR_SSI_SRCR_RFEN0 0x00000080 118 - #define CCSR_SSI_SRCR_RFDIR 0x00000040 119 - #define CCSR_SSI_SRCR_RXDIR 0x00000020 120 - #define CCSR_SSI_SRCR_RSHFD 0x00000010 121 - #define CCSR_SSI_SRCR_RSCKP 0x00000008 122 - #define CCSR_SSI_SRCR_RFSI 0x00000004 123 - #define CCSR_SSI_SRCR_RFSL 0x00000002 124 - #define CCSR_SSI_SRCR_REFS 0x00000001 106 + /* SSI Interrupt Status Register -- REG_SSI_SISR 0x14 */ 107 + #define SSI_SISR_RFRC 0x01000000 108 + #define SSI_SISR_TFRC 0x00800000 109 + #define SSI_SISR_CMDAU 0x00040000 110 + #define SSI_SISR_CMDDU 0x00020000 111 + #define SSI_SISR_RXT 0x00010000 112 + #define SSI_SISR_RDR1 0x00008000 113 + #define SSI_SISR_RDR0 0x00004000 114 + #define SSI_SISR_TDE1 0x00002000 115 + #define SSI_SISR_TDE0 0x00001000 116 + #define SSI_SISR_ROE1 0x00000800 117 + #define SSI_SISR_ROE0 0x00000400 118 + #define SSI_SISR_TUE1 0x00000200 119 + #define SSI_SISR_TUE0 0x00000100 120 + #define SSI_SISR_TFS 0x00000080 121 + #define SSI_SISR_RFS 0x00000040 122 + #define SSI_SISR_TLS 0x00000020 123 + #define SSI_SISR_RLS 0x00000010 124 + #define SSI_SISR_RFF1 0x00000008 125 + #define SSI_SISR_RFF0 0x00000004 126 + #define SSI_SISR_TFE1 0x00000002 127 + #define SSI_SISR_TFE0 0x00000001 125 128 126 - /* STCCR and SRCCR */ 127 - #define CCSR_SSI_SxCCR_DIV2_SHIFT 18 128 - #define CCSR_SSI_SxCCR_DIV2 0x00040000 129 - #define CCSR_SSI_SxCCR_PSR_SHIFT 17 130 - #define CCSR_SSI_SxCCR_PSR 0x00020000 131 - #define CCSR_SSI_SxCCR_WL_SHIFT 13 132 - #define CCSR_SSI_SxCCR_WL_MASK 0x0001E000 133 - #define CCSR_SSI_SxCCR_WL(x) \ 134 - (((((x) / 2) - 1) << CCSR_SSI_SxCCR_WL_SHIFT) & CCSR_SSI_SxCCR_WL_MASK) 135 - #define CCSR_SSI_SxCCR_DC_SHIFT 8 136 - #define CCSR_SSI_SxCCR_DC_MASK 0x00001F00 137 - #define CCSR_SSI_SxCCR_DC(x) \ 138 - ((((x) - 1) << CCSR_SSI_SxCCR_DC_SHIFT) & CCSR_SSI_SxCCR_DC_MASK) 139 - #define CCSR_SSI_SxCCR_PM_SHIFT 0 140 - #define CCSR_SSI_SxCCR_PM_MASK 0x000000FF 141 - #define CCSR_SSI_SxCCR_PM(x) \ 142 - ((((x) - 1) << CCSR_SSI_SxCCR_PM_SHIFT) & CCSR_SSI_SxCCR_PM_MASK) 129 + /* SSI Interrupt Enable Register -- REG_SSI_SIER 0x18 */ 130 + #define SSI_SIER_RFRC_EN 0x01000000 131 + #define SSI_SIER_TFRC_EN 0x00800000 132 + #define SSI_SIER_RDMAE 0x00400000 133 + #define SSI_SIER_RIE 0x00200000 134 + #define SSI_SIER_TDMAE 0x00100000 135 + #define SSI_SIER_TIE 0x00080000 136 + #define SSI_SIER_CMDAU_EN 0x00040000 137 + #define SSI_SIER_CMDDU_EN 0x00020000 138 + #define SSI_SIER_RXT_EN 0x00010000 139 + #define SSI_SIER_RDR1_EN 0x00008000 140 + #define SSI_SIER_RDR0_EN 0x00004000 141 + #define SSI_SIER_TDE1_EN 0x00002000 142 + #define SSI_SIER_TDE0_EN 0x00001000 143 + #define SSI_SIER_ROE1_EN 0x00000800 144 + #define SSI_SIER_ROE0_EN 0x00000400 145 + #define SSI_SIER_TUE1_EN 0x00000200 146 + #define SSI_SIER_TUE0_EN 0x00000100 147 + #define SSI_SIER_TFS_EN 0x00000080 148 + #define SSI_SIER_RFS_EN 0x00000040 149 + #define SSI_SIER_TLS_EN 0x00000020 150 + #define SSI_SIER_RLS_EN 0x00000010 151 + #define SSI_SIER_RFF1_EN 0x00000008 152 + #define SSI_SIER_RFF0_EN 0x00000004 153 + #define SSI_SIER_TFE1_EN 0x00000002 154 + #define SSI_SIER_TFE0_EN 0x00000001 155 + 156 + /* SSI Transmit Configuration Register -- REG_SSI_STCR 0x1C */ 157 + #define SSI_STCR_TXBIT0 0x00000200 158 + #define SSI_STCR_TFEN1 0x00000100 159 + #define SSI_STCR_TFEN0 0x00000080 160 + #define SSI_STCR_TFDIR 0x00000040 161 + #define SSI_STCR_TXDIR 0x00000020 162 + #define SSI_STCR_TSHFD 0x00000010 163 + #define SSI_STCR_TSCKP 0x00000008 164 + #define SSI_STCR_TFSI 0x00000004 165 + #define SSI_STCR_TFSL 0x00000002 166 + #define SSI_STCR_TEFS 0x00000001 167 + 168 + /* SSI Receive Configuration Register -- REG_SSI_SRCR 0x20 */ 169 + #define SSI_SRCR_RXEXT 0x00000400 170 + #define SSI_SRCR_RXBIT0 0x00000200 171 + #define SSI_SRCR_RFEN1 0x00000100 172 + #define SSI_SRCR_RFEN0 0x00000080 173 + #define SSI_SRCR_RFDIR 0x00000040 174 + #define SSI_SRCR_RXDIR 0x00000020 175 + #define SSI_SRCR_RSHFD 0x00000010 176 + #define SSI_SRCR_RSCKP 0x00000008 177 + #define SSI_SRCR_RFSI 0x00000004 178 + #define SSI_SRCR_RFSL 0x00000002 179 + #define SSI_SRCR_REFS 0x00000001 143 180 144 181 /* 145 - * The xFCNT bits are read-only, and the xFWM bits are read/write. Use the 146 - * CCSR_SSI_SFCSR_xFCNTy() macros to read the FIFO counters, and use the 147 - * CCSR_SSI_SFCSR_xFWMy() macros to set the watermarks. 182 + * SSI Transmit Clock Control Register -- REG_SSI_STCCR 0x24 183 + * SSI Receive Clock Control Register -- REG_SSI_SRCCR 0x28 148 184 */ 149 - #define CCSR_SSI_SFCSR_RFCNT1_SHIFT 28 150 - #define CCSR_SSI_SFCSR_RFCNT1_MASK 0xF0000000 151 - #define CCSR_SSI_SFCSR_RFCNT1(x) \ 152 - (((x) & CCSR_SSI_SFCSR_RFCNT1_MASK) >> CCSR_SSI_SFCSR_RFCNT1_SHIFT) 153 - #define CCSR_SSI_SFCSR_TFCNT1_SHIFT 24 154 - #define CCSR_SSI_SFCSR_TFCNT1_MASK 0x0F000000 155 - #define CCSR_SSI_SFCSR_TFCNT1(x) \ 156 - (((x) & CCSR_SSI_SFCSR_TFCNT1_MASK) >> CCSR_SSI_SFCSR_TFCNT1_SHIFT) 157 - #define CCSR_SSI_SFCSR_RFWM1_SHIFT 20 158 - #define CCSR_SSI_SFCSR_RFWM1_MASK 0x00F00000 159 - #define CCSR_SSI_SFCSR_RFWM1(x) \ 160 - (((x) << CCSR_SSI_SFCSR_RFWM1_SHIFT) & CCSR_SSI_SFCSR_RFWM1_MASK) 161 - #define CCSR_SSI_SFCSR_TFWM1_SHIFT 16 162 - #define CCSR_SSI_SFCSR_TFWM1_MASK 0x000F0000 163 - #define CCSR_SSI_SFCSR_TFWM1(x) \ 164 - (((x) << CCSR_SSI_SFCSR_TFWM1_SHIFT) & CCSR_SSI_SFCSR_TFWM1_MASK) 165 - #define CCSR_SSI_SFCSR_RFCNT0_SHIFT 12 166 - #define CCSR_SSI_SFCSR_RFCNT0_MASK 0x0000F000 167 - #define CCSR_SSI_SFCSR_RFCNT0(x) \ 168 - (((x) & CCSR_SSI_SFCSR_RFCNT0_MASK) >> CCSR_SSI_SFCSR_RFCNT0_SHIFT) 169 - #define CCSR_SSI_SFCSR_TFCNT0_SHIFT 8 170 - #define CCSR_SSI_SFCSR_TFCNT0_MASK 0x00000F00 171 - #define CCSR_SSI_SFCSR_TFCNT0(x) \ 172 - (((x) & CCSR_SSI_SFCSR_TFCNT0_MASK) >> CCSR_SSI_SFCSR_TFCNT0_SHIFT) 173 - #define CCSR_SSI_SFCSR_RFWM0_SHIFT 4 174 - #define CCSR_SSI_SFCSR_RFWM0_MASK 0x000000F0 175 - #define CCSR_SSI_SFCSR_RFWM0(x) \ 176 - (((x) << CCSR_SSI_SFCSR_RFWM0_SHIFT) & CCSR_SSI_SFCSR_RFWM0_MASK) 177 - #define CCSR_SSI_SFCSR_TFWM0_SHIFT 0 178 - #define CCSR_SSI_SFCSR_TFWM0_MASK 0x0000000F 179 - #define CCSR_SSI_SFCSR_TFWM0(x) \ 180 - (((x) << CCSR_SSI_SFCSR_TFWM0_SHIFT) & CCSR_SSI_SFCSR_TFWM0_MASK) 185 + #define SSI_SxCCR_DIV2_SHIFT 18 186 + #define SSI_SxCCR_DIV2 0x00040000 187 + #define SSI_SxCCR_PSR_SHIFT 17 188 + #define SSI_SxCCR_PSR 0x00020000 189 + #define SSI_SxCCR_WL_SHIFT 13 190 + #define SSI_SxCCR_WL_MASK 0x0001E000 191 + #define SSI_SxCCR_WL(x) \ 192 + (((((x) / 2) - 1) << SSI_SxCCR_WL_SHIFT) & SSI_SxCCR_WL_MASK) 193 + #define SSI_SxCCR_DC_SHIFT 8 194 + #define SSI_SxCCR_DC_MASK 0x00001F00 195 + #define SSI_SxCCR_DC(x) \ 196 + ((((x) - 1) << SSI_SxCCR_DC_SHIFT) & SSI_SxCCR_DC_MASK) 197 + #define SSI_SxCCR_PM_SHIFT 0 198 + #define SSI_SxCCR_PM_MASK 0x000000FF 199 + #define SSI_SxCCR_PM(x) \ 200 + ((((x) - 1) << SSI_SxCCR_PM_SHIFT) & SSI_SxCCR_PM_MASK) 181 201 182 - #define CCSR_SSI_STR_TEST 0x00008000 183 - #define CCSR_SSI_STR_RCK2TCK 0x00004000 184 - #define CCSR_SSI_STR_RFS2TFS 0x00002000 185 - #define CCSR_SSI_STR_RXSTATE(x) (((x) >> 8) & 0x1F) 186 - #define CCSR_SSI_STR_TXD2RXD 0x00000080 187 - #define CCSR_SSI_STR_TCK2RCK 0x00000040 188 - #define CCSR_SSI_STR_TFS2RFS 0x00000020 189 - #define CCSR_SSI_STR_TXSTATE(x) ((x) & 0x1F) 202 + /* 203 + * SSI FIFO Control/Status Register -- REG_SSI_SFCSR 0x2c 204 + * 205 + * Tx or Rx FIFO Counter -- SSI_SFCSR_xFCNTy Read-Only 206 + * Tx or Rx FIFO Watermarks -- SSI_SFCSR_xFWMy Read/Write 207 + */ 208 + #define SSI_SFCSR_RFCNT1_SHIFT 28 209 + #define SSI_SFCSR_RFCNT1_MASK 0xF0000000 210 + #define SSI_SFCSR_RFCNT1(x) \ 211 + (((x) & SSI_SFCSR_RFCNT1_MASK) >> SSI_SFCSR_RFCNT1_SHIFT) 212 + #define SSI_SFCSR_TFCNT1_SHIFT 24 213 + #define SSI_SFCSR_TFCNT1_MASK 0x0F000000 214 + #define SSI_SFCSR_TFCNT1(x) \ 215 + (((x) & SSI_SFCSR_TFCNT1_MASK) >> SSI_SFCSR_TFCNT1_SHIFT) 216 + #define SSI_SFCSR_RFWM1_SHIFT 20 217 + #define SSI_SFCSR_RFWM1_MASK 0x00F00000 218 + #define SSI_SFCSR_RFWM1(x) \ 219 + (((x) << SSI_SFCSR_RFWM1_SHIFT) & SSI_SFCSR_RFWM1_MASK) 220 + #define SSI_SFCSR_TFWM1_SHIFT 16 221 + #define SSI_SFCSR_TFWM1_MASK 0x000F0000 222 + #define SSI_SFCSR_TFWM1(x) \ 223 + (((x) << SSI_SFCSR_TFWM1_SHIFT) & SSI_SFCSR_TFWM1_MASK) 224 + #define SSI_SFCSR_RFCNT0_SHIFT 12 225 + #define SSI_SFCSR_RFCNT0_MASK 0x0000F000 226 + #define SSI_SFCSR_RFCNT0(x) \ 227 + (((x) & SSI_SFCSR_RFCNT0_MASK) >> SSI_SFCSR_RFCNT0_SHIFT) 228 + #define SSI_SFCSR_TFCNT0_SHIFT 8 229 + #define SSI_SFCSR_TFCNT0_MASK 0x00000F00 230 + #define SSI_SFCSR_TFCNT0(x) \ 231 + (((x) & SSI_SFCSR_TFCNT0_MASK) >> SSI_SFCSR_TFCNT0_SHIFT) 232 + #define SSI_SFCSR_RFWM0_SHIFT 4 233 + #define SSI_SFCSR_RFWM0_MASK 0x000000F0 234 + #define SSI_SFCSR_RFWM0(x) \ 235 + (((x) << SSI_SFCSR_RFWM0_SHIFT) & SSI_SFCSR_RFWM0_MASK) 236 + #define SSI_SFCSR_TFWM0_SHIFT 0 237 + #define SSI_SFCSR_TFWM0_MASK 0x0000000F 238 + #define SSI_SFCSR_TFWM0(x) \ 239 + (((x) << SSI_SFCSR_TFWM0_SHIFT) & SSI_SFCSR_TFWM0_MASK) 190 240 191 - #define CCSR_SSI_SOR_CLKOFF 0x00000040 192 - #define CCSR_SSI_SOR_RX_CLR 0x00000020 193 - #define CCSR_SSI_SOR_TX_CLR 0x00000010 194 - #define CCSR_SSI_SOR_INIT 0x00000008 195 - #define CCSR_SSI_SOR_WAIT_SHIFT 1 196 - #define CCSR_SSI_SOR_WAIT_MASK 0x00000006 197 - #define CCSR_SSI_SOR_WAIT(x) (((x) & 3) << CCSR_SSI_SOR_WAIT_SHIFT) 198 - #define CCSR_SSI_SOR_SYNRST 0x00000001 241 + /* SSI Test Register -- REG_SSI_STR 0x30 */ 242 + #define SSI_STR_TEST 0x00008000 243 + #define SSI_STR_RCK2TCK 0x00004000 244 + #define SSI_STR_RFS2TFS 0x00002000 245 + #define SSI_STR_RXSTATE(x) (((x) >> 8) & 0x1F) 246 + #define SSI_STR_TXD2RXD 0x00000080 247 + #define SSI_STR_TCK2RCK 0x00000040 248 + #define SSI_STR_TFS2RFS 0x00000020 249 + #define SSI_STR_TXSTATE(x) ((x) & 0x1F) 199 250 200 - #define CCSR_SSI_SACNT_FRDIV(x) (((x) & 0x3f) << 5) 201 - #define CCSR_SSI_SACNT_WR 0x00000010 202 - #define CCSR_SSI_SACNT_RD 0x00000008 203 - #define CCSR_SSI_SACNT_RDWR_MASK 0x00000018 204 - #define CCSR_SSI_SACNT_TIF 0x00000004 205 - #define CCSR_SSI_SACNT_FV 0x00000002 206 - #define CCSR_SSI_SACNT_AC97EN 0x00000001 251 + /* SSI Option Register -- REG_SSI_SOR 0x34 */ 252 + #define SSI_SOR_CLKOFF 0x00000040 253 + #define SSI_SOR_RX_CLR 0x00000020 254 + #define SSI_SOR_TX_CLR 0x00000010 255 + #define SSI_SOR_xX_CLR(tx) ((tx) ? SSI_SOR_TX_CLR : SSI_SOR_RX_CLR) 256 + #define SSI_SOR_INIT 0x00000008 257 + #define SSI_SOR_WAIT_SHIFT 1 258 + #define SSI_SOR_WAIT_MASK 0x00000006 259 + #define SSI_SOR_WAIT(x) (((x) & 3) << SSI_SOR_WAIT_SHIFT) 260 + #define SSI_SOR_SYNRST 0x00000001 261 + 262 + /* SSI AC97 Control Register -- REG_SSI_SACNT 0x38 */ 263 + #define SSI_SACNT_FRDIV(x) (((x) & 0x3f) << 5) 264 + #define SSI_SACNT_WR 0x00000010 265 + #define SSI_SACNT_RD 0x00000008 266 + #define SSI_SACNT_RDWR_MASK 0x00000018 267 + #define SSI_SACNT_TIF 0x00000004 268 + #define SSI_SACNT_FV 0x00000002 269 + #define SSI_SACNT_AC97EN 0x00000001 207 270 208 271 209 272 struct device; ··· 318 255 } 319 256 320 257 static inline int fsl_ssi_debugfs_create(struct fsl_ssi_dbg *ssi_dbg, 321 - struct device *dev) 258 + struct device *dev) 322 259 { 323 260 return 0; 324 261 }
+30 -29
sound/soc/fsl/fsl_ssi_dbg.c
··· 18 18 19 19 void fsl_ssi_dbg_isr(struct fsl_ssi_dbg *dbg, u32 sisr) 20 20 { 21 - if (sisr & CCSR_SSI_SISR_RFRC) 21 + if (sisr & SSI_SISR_RFRC) 22 22 dbg->stats.rfrc++; 23 23 24 - if (sisr & CCSR_SSI_SISR_TFRC) 24 + if (sisr & SSI_SISR_TFRC) 25 25 dbg->stats.tfrc++; 26 26 27 - if (sisr & CCSR_SSI_SISR_CMDAU) 27 + if (sisr & SSI_SISR_CMDAU) 28 28 dbg->stats.cmdau++; 29 29 30 - if (sisr & CCSR_SSI_SISR_CMDDU) 30 + if (sisr & SSI_SISR_CMDDU) 31 31 dbg->stats.cmddu++; 32 32 33 - if (sisr & CCSR_SSI_SISR_RXT) 33 + if (sisr & SSI_SISR_RXT) 34 34 dbg->stats.rxt++; 35 35 36 - if (sisr & CCSR_SSI_SISR_RDR1) 36 + if (sisr & SSI_SISR_RDR1) 37 37 dbg->stats.rdr1++; 38 38 39 - if (sisr & CCSR_SSI_SISR_RDR0) 39 + if (sisr & SSI_SISR_RDR0) 40 40 dbg->stats.rdr0++; 41 41 42 - if (sisr & CCSR_SSI_SISR_TDE1) 42 + if (sisr & SSI_SISR_TDE1) 43 43 dbg->stats.tde1++; 44 44 45 - if (sisr & CCSR_SSI_SISR_TDE0) 45 + if (sisr & SSI_SISR_TDE0) 46 46 dbg->stats.tde0++; 47 47 48 - if (sisr & CCSR_SSI_SISR_ROE1) 48 + if (sisr & SSI_SISR_ROE1) 49 49 dbg->stats.roe1++; 50 50 51 - if (sisr & CCSR_SSI_SISR_ROE0) 51 + if (sisr & SSI_SISR_ROE0) 52 52 dbg->stats.roe0++; 53 53 54 - if (sisr & CCSR_SSI_SISR_TUE1) 54 + if (sisr & SSI_SISR_TUE1) 55 55 dbg->stats.tue1++; 56 56 57 - if (sisr & CCSR_SSI_SISR_TUE0) 57 + if (sisr & SSI_SISR_TUE0) 58 58 dbg->stats.tue0++; 59 59 60 - if (sisr & CCSR_SSI_SISR_TFS) 60 + if (sisr & SSI_SISR_TFS) 61 61 dbg->stats.tfs++; 62 62 63 - if (sisr & CCSR_SSI_SISR_RFS) 63 + if (sisr & SSI_SISR_RFS) 64 64 dbg->stats.rfs++; 65 65 66 - if (sisr & CCSR_SSI_SISR_TLS) 66 + if (sisr & SSI_SISR_TLS) 67 67 dbg->stats.tls++; 68 68 69 - if (sisr & CCSR_SSI_SISR_RLS) 69 + if (sisr & SSI_SISR_RLS) 70 70 dbg->stats.rls++; 71 71 72 - if (sisr & CCSR_SSI_SISR_RFF1) 72 + if (sisr & SSI_SISR_RFF1) 73 73 dbg->stats.rff1++; 74 74 75 - if (sisr & CCSR_SSI_SISR_RFF0) 75 + if (sisr & SSI_SISR_RFF0) 76 76 dbg->stats.rff0++; 77 77 78 - if (sisr & CCSR_SSI_SISR_TFE1) 78 + if (sisr & SSI_SISR_TFE1) 79 79 dbg->stats.tfe1++; 80 80 81 - if (sisr & CCSR_SSI_SISR_TFE0) 81 + if (sisr & SSI_SISR_TFE0) 82 82 dbg->stats.tfe0++; 83 83 } 84 84 85 - /* Show the statistics of a flag only if its interrupt is enabled. The 86 - * compiler will optimze this code to a no-op if the interrupt is not 87 - * enabled. 85 + /** 86 + * Show the statistics of a flag only if its interrupt is enabled 87 + * 88 + * Compilers will optimize it to a no-op if the interrupt is disabled 88 89 */ 89 90 #define SIER_SHOW(flag, name) \ 90 91 do { \ 91 - if (CCSR_SSI_SIER_##flag) \ 92 + if (SSI_SIER_##flag) \ 92 93 seq_printf(s, #name "=%u\n", ssi_dbg->stats.name); \ 93 94 } while (0) 94 95 95 96 96 97 /** 97 - * fsl_sysfs_ssi_show: display SSI statistics 98 + * Display the statistics for the current SSI device 98 99 * 99 - * Display the statistics for the current SSI device. To avoid confusion, 100 - * we only show those counts that are enabled. 100 + * To avoid confusion, only show those counts that are enabled 101 101 */ 102 102 static int fsl_ssi_stats_show(struct seq_file *s, void *unused) 103 103 { ··· 147 147 return -ENOMEM; 148 148 149 149 ssi_dbg->dbg_stats = debugfs_create_file("stats", S_IRUGO, 150 - ssi_dbg->dbg_dir, ssi_dbg, &fsl_ssi_stats_ops); 150 + ssi_dbg->dbg_dir, ssi_dbg, 151 + &fsl_ssi_stats_ops); 151 152 if (!ssi_dbg->dbg_stats) { 152 153 debugfs_remove(ssi_dbg->dbg_dir); 153 154 return -ENOMEM;