···442442443443 if (fsl_asoc_card_is_ac97(priv)) {444444#if IS_ENABLED(CONFIG_SND_AC97_CODEC)445445- struct snd_soc_codec *codec = rtd->codec;446446- struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);445445+ struct snd_soc_component *component = rtd->codec_dai->component;446446+ struct snd_ac97 *ac97 = snd_soc_component_get_drvdata(component);447447448448 /*449449 * Use slots 3/4 for S/PDIF so SSI won't try to enable
+1-1
sound/soc/fsl/fsl_asrc.h
···5757#define REG_ASRDOC 0x745858#define REG_ASRDI(i) (REG_ASRDIA + (i << 3))5959#define REG_ASRDO(i) (REG_ASRDOA + (i << 3))6060-#define REG_ASRDx(x, i) (x == IN ? REG_ASRDI(i) : REG_ASRDO(i))6060+#define REG_ASRDx(x, i) ((x) == IN ? REG_ASRDI(i) : REG_ASRDO(i))61616262#define REG_ASRIDRHA 0x806363#define REG_ASRIDRLA 0x84
+646-741
sound/soc/fsl/fsl_ssi.c
···6969 * samples will be written to STX properly.7070 */7171#ifdef __BIG_ENDIAN7272-#define FSLSSI_I2S_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_BE | \7373- SNDRV_PCM_FMTBIT_S18_3BE | SNDRV_PCM_FMTBIT_S20_3BE | \7474- SNDRV_PCM_FMTBIT_S24_3BE | SNDRV_PCM_FMTBIT_S24_BE)7272+#define FSLSSI_I2S_FORMATS \7373+ (SNDRV_PCM_FMTBIT_S8 | \7474+ SNDRV_PCM_FMTBIT_S16_BE | \7575+ SNDRV_PCM_FMTBIT_S18_3BE | \7676+ SNDRV_PCM_FMTBIT_S20_3BE | \7777+ SNDRV_PCM_FMTBIT_S24_3BE | \7878+ SNDRV_PCM_FMTBIT_S24_BE)7579#else7676-#define FSLSSI_I2S_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE | \7777- SNDRV_PCM_FMTBIT_S18_3LE | SNDRV_PCM_FMTBIT_S20_3LE | \7878- SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_LE)8080+#define FSLSSI_I2S_FORMATS \8181+ (SNDRV_PCM_FMTBIT_S8 | \8282+ SNDRV_PCM_FMTBIT_S16_LE | \8383+ SNDRV_PCM_FMTBIT_S18_3LE | \8484+ SNDRV_PCM_FMTBIT_S20_3LE | \8585+ SNDRV_PCM_FMTBIT_S24_3LE | \8686+ SNDRV_PCM_FMTBIT_S24_LE)7987#endif80888181-#define FSLSSI_SIER_DBG_RX_FLAGS (CCSR_SSI_SIER_RFF0_EN | \8282- CCSR_SSI_SIER_RLS_EN | CCSR_SSI_SIER_RFS_EN | \8383- CCSR_SSI_SIER_ROE0_EN | CCSR_SSI_SIER_RFRC_EN)8484-#define FSLSSI_SIER_DBG_TX_FLAGS (CCSR_SSI_SIER_TFE0_EN | \8585- CCSR_SSI_SIER_TLS_EN | CCSR_SSI_SIER_TFS_EN | \8686- CCSR_SSI_SIER_TUE0_EN | CCSR_SSI_SIER_TFRC_EN)8989+#define FSLSSI_SIER_DBG_RX_FLAGS \9090+ (SSI_SIER_RFF0_EN | \9191+ SSI_SIER_RLS_EN | \9292+ SSI_SIER_RFS_EN | \9393+ SSI_SIER_ROE0_EN | \9494+ SSI_SIER_RFRC_EN)9595+#define FSLSSI_SIER_DBG_TX_FLAGS \9696+ (SSI_SIER_TFE0_EN | \9797+ SSI_SIER_TLS_EN | \9898+ SSI_SIER_TFS_EN | \9999+ SSI_SIER_TUE0_EN | \100100+ SSI_SIER_TFRC_EN)8710188102enum fsl_ssi_type {89103 FSL_SSI_MCP8610,···10692 FSL_SSI_MX51,10793};10894109109-struct fsl_ssi_reg_val {9595+struct fsl_ssi_regvals {11096 u32 sier;11197 u32 srcr;11298 u32 stcr;11399 u32 scr;114100};115101116116-struct fsl_ssi_rxtx_reg_val {117117- struct fsl_ssi_reg_val rx;118118- struct fsl_ssi_reg_val tx;119119-};120120-121102static bool fsl_ssi_readable_reg(struct device *dev, unsigned int reg)122103{123104 switch (reg) {124124- case CCSR_SSI_SACCEN:125125- case CCSR_SSI_SACCDIS:105105+ case REG_SSI_SACCEN:106106+ case REG_SSI_SACCDIS:126107 return false;127108 default:128109 return true;···127118static bool fsl_ssi_volatile_reg(struct device *dev, unsigned int reg)128119{129120 switch (reg) {130130- case CCSR_SSI_STX0:131131- case CCSR_SSI_STX1:132132- case CCSR_SSI_SRX0:133133- case CCSR_SSI_SRX1:134134- case CCSR_SSI_SISR:135135- case CCSR_SSI_SFCSR:136136- case CCSR_SSI_SACNT:137137- case CCSR_SSI_SACADD:138138- case CCSR_SSI_SACDAT:139139- case CCSR_SSI_SATAG:140140- case CCSR_SSI_SACCST:141141- case CCSR_SSI_SOR:121121+ case REG_SSI_STX0:122122+ case REG_SSI_STX1:123123+ case REG_SSI_SRX0:124124+ case REG_SSI_SRX1:125125+ case REG_SSI_SISR:126126+ case REG_SSI_SFCSR:127127+ case REG_SSI_SACNT:128128+ case REG_SSI_SACADD:129129+ case REG_SSI_SACDAT:130130+ case REG_SSI_SATAG:131131+ case REG_SSI_SACCST:132132+ case REG_SSI_SOR:142133 return true;143134 default:144135 return false;···148139static bool fsl_ssi_precious_reg(struct device *dev, unsigned int reg)149140{150141 switch (reg) {151151- case CCSR_SSI_SRX0:152152- case CCSR_SSI_SRX1:153153- case CCSR_SSI_SISR:154154- case CCSR_SSI_SACADD:155155- case CCSR_SSI_SACDAT:156156- case CCSR_SSI_SATAG:142142+ case REG_SSI_SRX0:143143+ case REG_SSI_SRX1:144144+ case REG_SSI_SISR:145145+ case REG_SSI_SACADD:146146+ case REG_SSI_SACDAT:147147+ case REG_SSI_SATAG:157148 return true;158149 default:159150 return false;···163154static bool fsl_ssi_writeable_reg(struct device *dev, unsigned int reg)164155{165156 switch (reg) {166166- case CCSR_SSI_SRX0:167167- case CCSR_SSI_SRX1:168168- case CCSR_SSI_SACCST:157157+ case REG_SSI_SRX0:158158+ case REG_SSI_SRX1:159159+ case REG_SSI_SACCST:169160 return false;170161 default:171162 return true;···173164}174165175166static const struct regmap_config fsl_ssi_regconfig = {176176- .max_register = CCSR_SSI_SACCDIS,167167+ .max_register = REG_SSI_SACCDIS,177168 .reg_bits = 32,178169 .val_bits = 32,179170 .reg_stride = 4,180171 .val_format_endian = REGMAP_ENDIAN_NATIVE,181181- .num_reg_defaults_raw = CCSR_SSI_SACCDIS / sizeof(uint32_t) + 1,172172+ .num_reg_defaults_raw = REG_SSI_SACCDIS / sizeof(uint32_t) + 1,182173 .readable_reg = fsl_ssi_readable_reg,183174 .volatile_reg = fsl_ssi_volatile_reg,184175 .precious_reg = fsl_ssi_precious_reg,···194185};195186196187/**197197- * fsl_ssi_private: per-SSI private data188188+ * fsl_ssi: per-SSI private data198189 *199199- * @reg: Pointer to the regmap registers190190+ * @regs: Pointer to the regmap registers200191 * @irq: IRQ of this SSI201192 * @cpu_dai_drv: CPU DAI driver for this device202193 *203194 * @dai_fmt: DAI configuration this device is currently used with204204- * @i2s_mode: i2s and network mode configuration of the device. Is used to205205- * switch between normal and i2s/network mode206206- * mode depending on the number of channels195195+ * @i2s_net: I2S and Network mode configurations of SCR register207196 * @use_dma: DMA is used or FIQ with stream filter208208- * @use_dual_fifo: DMA with support for both FIFOs used209209- * @fifo_deph: Depth of the SSI FIFOs210210- * @slot_width: width of each DAI slot211211- * @slots: number of slots212212- * @rxtx_reg_val: Specific register settings for receive/transmit configuration197197+ * @use_dual_fifo: DMA with support for dual FIFO mode198198+ * @has_ipg_clk_name: If "ipg" is in the clock name list of device tree199199+ * @fifo_depth: Depth of the SSI FIFOs200200+ * @slot_width: Width of each DAI slot201201+ * @slots: Number of slots202202+ * @regvals: Specific RX/TX register settings213203 *214214- * @clk: SSI clock215215- * @baudclk: SSI baud clock for master mode204204+ * @clk: Clock source to access register205205+ * @baudclk: Clock source to generate bit and frame-sync clocks216206 * @baudclk_streams: Active streams that are using baudclk207207+ *208208+ * @regcache_sfcsr: Cache sfcsr register value during suspend and resume209209+ * @regcache_sacnt: Cache sacnt register value during suspend and resume217210 *218211 * @dma_params_tx: DMA transmit parameters219212 * @dma_params_rx: DMA receive parameters···223212 *224213 * @fiq_params: FIQ stream filtering parameters225214 *226226- * @pdev: Pointer to pdev used for deprecated fsl-ssi sound card215215+ * @pdev: Pointer to pdev when using fsl-ssi as sound card (ppc only)216216+ * TODO: Should be replaced with simple-sound-card227217 *228218 * @dbg_stats: Debugging statistics229219 *230220 * @soc: SoC specific data221221+ * @dev: Pointer to &pdev->dev231222 *232232- * @fifo_watermark: the FIFO watermark setting. Notifies DMA when233233- * there are @fifo_watermark or fewer words in TX fifo or234234- * @fifo_watermark or more empty words in RX fifo.235235- * @dma_maxburst: max number of words to transfer in one go. So far,236236- * this is always the same as fifo_watermark.223223+ * @fifo_watermark: The FIFO watermark setting. Notifies DMA when there are224224+ * @fifo_watermark or fewer words in TX fifo or225225+ * @fifo_watermark or more empty words in RX fifo.226226+ * @dma_maxburst: Max number of words to transfer in one go. So far,227227+ * this is always the same as fifo_watermark.228228+ *229229+ * @ac97_reg_lock: Mutex lock to serialize AC97 register access operations237230 */238238-struct fsl_ssi_private {231231+struct fsl_ssi {239232 struct regmap *regs;240233 int irq;241234 struct snd_soc_dai_driver cpu_dai_drv;242235243236 unsigned int dai_fmt;244244- u8 i2s_mode;237237+ u8 i2s_net;245238 bool use_dma;246239 bool use_dual_fifo;247240 bool has_ipg_clk_name;248241 unsigned int fifo_depth;249242 unsigned int slot_width;250243 unsigned int slots;251251- struct fsl_ssi_rxtx_reg_val rxtx_reg_val;244244+ struct fsl_ssi_regvals regvals[2];252245253246 struct clk *clk;254247 struct clk *baudclk;255248 unsigned int baudclk_streams;256249257257- /* regcache for volatile regs */258250 u32 regcache_sfcsr;259251 u32 regcache_sacnt;260252261261- /* DMA params */262253 struct snd_dmaengine_dai_dma_data dma_params_tx;263254 struct snd_dmaengine_dai_dma_data dma_params_rx;264255 dma_addr_t ssi_phys;265256266266- /* params for non-dma FIQ stream filtered mode */267257 struct imx_pcm_fiq_params fiq_params;268258269269- /* Used when using fsl-ssi as sound-card. This is only used by ppc and270270- * should be replaced with simple-sound-card. */271259 struct platform_device *pdev;272260273261 struct fsl_ssi_dbg dbg_stats;···281271};282272283273/*284284- * imx51 and later SoCs have a slightly different IP that allows the285285- * SSI configuration while the SSI unit is running.274274+ * SoC specific data286275 *287287- * More important, it is necessary on those SoCs to configure the288288- * sperate TX/RX DMA bits just before starting the stream289289- * (fsl_ssi_trigger). The SDMA unit has to be configured before fsl_ssi290290- * sends any DMA requests to the SDMA unit, otherwise it is not defined291291- * how the SDMA unit handles the DMA request.292292- *293293- * SDMA units are present on devices starting at imx35 but the imx35294294- * reference manual states that the DMA bits should not be changed295295- * while the SSI unit is running (SSIEN). So we support the necessary296296- * online configuration of fsl-ssi starting at imx51.276276+ * Notes:277277+ * 1) SSI in earlier SoCS has critical bits in control registers that278278+ * cannot be changed after SSI starts running -- a software reset279279+ * (set SSIEN to 0) is required to change their values. So adding280280+ * an offline_config flag for these SoCs.281281+ * 2) SDMA is available since imx35. However, imx35 does not support282282+ * DMA bits changing when SSI is running, so set offline_config.283283+ * 3) imx51 and later versions support register configurations when284284+ * SSI is running (SSIEN); For these versions, DMA needs to be285285+ * configured before SSI sends DMA request to avoid an undefined286286+ * DMA request on the SDMA side.297287 */298288299289static struct fsl_ssi_soc_data fsl_ssi_mpc8610 = {300290 .imx = false,301291 .offline_config = true,302302- .sisr_write_mask = CCSR_SSI_SISR_RFRC | CCSR_SSI_SISR_TFRC |303303- CCSR_SSI_SISR_ROE0 | CCSR_SSI_SISR_ROE1 |304304- CCSR_SSI_SISR_TUE0 | CCSR_SSI_SISR_TUE1,292292+ .sisr_write_mask = SSI_SISR_RFRC | SSI_SISR_TFRC |293293+ SSI_SISR_ROE0 | SSI_SISR_ROE1 |294294+ SSI_SISR_TUE0 | SSI_SISR_TUE1,305295};306296307297static struct fsl_ssi_soc_data fsl_ssi_imx21 = {···314304static struct fsl_ssi_soc_data fsl_ssi_imx35 = {315305 .imx = true,316306 .offline_config = true,317317- .sisr_write_mask = CCSR_SSI_SISR_RFRC | CCSR_SSI_SISR_TFRC |318318- CCSR_SSI_SISR_ROE0 | CCSR_SSI_SISR_ROE1 |319319- CCSR_SSI_SISR_TUE0 | CCSR_SSI_SISR_TUE1,307307+ .sisr_write_mask = SSI_SISR_RFRC | SSI_SISR_TFRC |308308+ SSI_SISR_ROE0 | SSI_SISR_ROE1 |309309+ SSI_SISR_TUE0 | SSI_SISR_TUE1,320310};321311322312static struct fsl_ssi_soc_data fsl_ssi_imx51 = {323313 .imx = true,324314 .offline_config = false,325325- .sisr_write_mask = CCSR_SSI_SISR_ROE0 | CCSR_SSI_SISR_ROE1 |326326- CCSR_SSI_SISR_TUE0 | CCSR_SSI_SISR_TUE1,315315+ .sisr_write_mask = SSI_SISR_ROE0 | SSI_SISR_ROE1 |316316+ SSI_SISR_TUE0 | SSI_SISR_TUE1,327317};328318329319static const struct of_device_id fsl_ssi_ids[] = {···335325};336326MODULE_DEVICE_TABLE(of, fsl_ssi_ids);337327338338-static bool fsl_ssi_is_ac97(struct fsl_ssi_private *ssi_private)328328+static bool fsl_ssi_is_ac97(struct fsl_ssi *ssi)339329{340340- return (ssi_private->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK) ==330330+ return (ssi->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK) ==341331 SND_SOC_DAIFMT_AC97;342332}343333344344-static bool fsl_ssi_is_i2s_master(struct fsl_ssi_private *ssi_private)334334+static bool fsl_ssi_is_i2s_master(struct fsl_ssi *ssi)345335{346346- return (ssi_private->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) ==336336+ return (ssi->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) ==347337 SND_SOC_DAIFMT_CBS_CFS;348338}349339350350-static bool fsl_ssi_is_i2s_cbm_cfs(struct fsl_ssi_private *ssi_private)340340+static bool fsl_ssi_is_i2s_cbm_cfs(struct fsl_ssi *ssi)351341{352352- return (ssi_private->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) ==342342+ return (ssi->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) ==353343 SND_SOC_DAIFMT_CBM_CFS;354344}345345+355346/**356356- * fsl_ssi_isr: SSI interrupt handler357357- *358358- * Although it's possible to use the interrupt handler to send and receive359359- * data to/from the SSI, we use the DMA instead. Programming is more360360- * complicated, but the performance is much better.361361- *362362- * This interrupt handler is used only to gather statistics.363363- *364364- * @irq: IRQ of the SSI device365365- * @dev_id: pointer to the ssi_private structure for this SSI device347347+ * Interrupt handler to gather states366348 */367349static irqreturn_t fsl_ssi_isr(int irq, void *dev_id)368350{369369- struct fsl_ssi_private *ssi_private = dev_id;370370- struct regmap *regs = ssi_private->regs;351351+ struct fsl_ssi *ssi = dev_id;352352+ struct regmap *regs = ssi->regs;371353 __be32 sisr;372354 __be32 sisr2;373355374374- /* We got an interrupt, so read the status register to see what we375375- were interrupted for. We mask it with the Interrupt Enable register376376- so that we only check for events that we're interested in.377377- */378378- regmap_read(regs, CCSR_SSI_SISR, &sisr);356356+ regmap_read(regs, REG_SSI_SISR, &sisr);379357380380- sisr2 = sisr & ssi_private->soc->sisr_write_mask;358358+ sisr2 = sisr & ssi->soc->sisr_write_mask;381359 /* Clear the bits that we set */382360 if (sisr2)383383- regmap_write(regs, CCSR_SSI_SISR, sisr2);361361+ regmap_write(regs, REG_SSI_SISR, sisr2);384362385385- fsl_ssi_dbg_isr(&ssi_private->dbg_stats, sisr);363363+ fsl_ssi_dbg_isr(&ssi->dbg_stats, sisr);386364387365 return IRQ_HANDLED;388366}389367390390-/*391391- * Enable/Disable all rx/tx config flags at once.368368+/**369369+ * Enable or disable all rx/tx config flags at once392370 */393393-static void fsl_ssi_rxtx_config(struct fsl_ssi_private *ssi_private,394394- bool enable)371371+static void fsl_ssi_rxtx_config(struct fsl_ssi *ssi, bool enable)395372{396396- struct regmap *regs = ssi_private->regs;397397- struct fsl_ssi_rxtx_reg_val *vals = &ssi_private->rxtx_reg_val;373373+ struct regmap *regs = ssi->regs;374374+ struct fsl_ssi_regvals *vals = ssi->regvals;398375399376 if (enable) {400400- regmap_update_bits(regs, CCSR_SSI_SIER,401401- vals->rx.sier | vals->tx.sier,402402- vals->rx.sier | vals->tx.sier);403403- regmap_update_bits(regs, CCSR_SSI_SRCR,404404- vals->rx.srcr | vals->tx.srcr,405405- vals->rx.srcr | vals->tx.srcr);406406- regmap_update_bits(regs, CCSR_SSI_STCR,407407- vals->rx.stcr | vals->tx.stcr,408408- vals->rx.stcr | vals->tx.stcr);377377+ regmap_update_bits(regs, REG_SSI_SIER,378378+ vals[RX].sier | vals[TX].sier,379379+ vals[RX].sier | vals[TX].sier);380380+ regmap_update_bits(regs, REG_SSI_SRCR,381381+ vals[RX].srcr | vals[TX].srcr,382382+ vals[RX].srcr | vals[TX].srcr);383383+ regmap_update_bits(regs, REG_SSI_STCR,384384+ vals[RX].stcr | vals[TX].stcr,385385+ vals[RX].stcr | vals[TX].stcr);409386 } else {410410- regmap_update_bits(regs, CCSR_SSI_SRCR,411411- vals->rx.srcr | vals->tx.srcr, 0);412412- regmap_update_bits(regs, CCSR_SSI_STCR,413413- vals->rx.stcr | vals->tx.stcr, 0);414414- regmap_update_bits(regs, CCSR_SSI_SIER,415415- vals->rx.sier | vals->tx.sier, 0);387387+ regmap_update_bits(regs, REG_SSI_SRCR,388388+ vals[RX].srcr | vals[TX].srcr, 0);389389+ regmap_update_bits(regs, REG_SSI_STCR,390390+ vals[RX].stcr | vals[TX].stcr, 0);391391+ regmap_update_bits(regs, REG_SSI_SIER,392392+ vals[RX].sier | vals[TX].sier, 0);416393 }417394}418395419419-/*420420- * Clear RX or TX FIFO to remove samples from the previous421421- * stream session which may be still present in the FIFO and422422- * may introduce bad samples and/or channel slipping.423423- *424424- * Note: The SOR is not documented in recent IMX datasheet, but425425- * is described in IMX51 reference manual at section 56.3.3.15.396396+/**397397+ * Clear remaining data in the FIFO to avoid dirty data or channel slipping426398 */427427-static void fsl_ssi_fifo_clear(struct fsl_ssi_private *ssi_private,428428- bool is_rx)399399+static void fsl_ssi_fifo_clear(struct fsl_ssi *ssi, bool is_rx)429400{430430- if (is_rx) {431431- regmap_update_bits(ssi_private->regs, CCSR_SSI_SOR,432432- CCSR_SSI_SOR_RX_CLR, CCSR_SSI_SOR_RX_CLR);433433- } else {434434- regmap_update_bits(ssi_private->regs, CCSR_SSI_SOR,435435- CCSR_SSI_SOR_TX_CLR, CCSR_SSI_SOR_TX_CLR);436436- }401401+ bool tx = !is_rx;402402+403403+ regmap_update_bits(ssi->regs, REG_SSI_SOR,404404+ SSI_SOR_xX_CLR(tx), SSI_SOR_xX_CLR(tx));437405}438406439439-/*407407+/**440408 * Calculate the bits that have to be disabled for the current stream that is441409 * getting disabled. This keeps the bits enabled that are necessary for the442410 * second stream to work if 'stream_active' is true.···434446 ((vals_disable) & \435447 ((vals_disable) ^ ((vals_stream) * (u32)!!(stream_active))))436448437437-/*438438- * Enable/Disable a ssi configuration. You have to pass either439439- * ssi_private->rxtx_reg_val.rx or tx as vals parameter.449449+/**450450+ * Enable or disable SSI configuration.440451 */441441-static void fsl_ssi_config(struct fsl_ssi_private *ssi_private, bool enable,442442- struct fsl_ssi_reg_val *vals)452452+static void fsl_ssi_config(struct fsl_ssi *ssi, bool enable,453453+ struct fsl_ssi_regvals *vals)443454{444444- struct regmap *regs = ssi_private->regs;445445- struct fsl_ssi_reg_val *avals;455455+ struct regmap *regs = ssi->regs;456456+ struct fsl_ssi_regvals *avals;446457 int nr_active_streams;447447- u32 scr_val;458458+ u32 scr;448459 int keep_active;449460450450- regmap_read(regs, CCSR_SSI_SCR, &scr_val);461461+ regmap_read(regs, REG_SSI_SCR, &scr);451462452452- nr_active_streams = !!(scr_val & CCSR_SSI_SCR_TE) +453453- !!(scr_val & CCSR_SSI_SCR_RE);463463+ nr_active_streams = !!(scr & SSI_SCR_TE) + !!(scr & SSI_SCR_RE);454464455465 if (nr_active_streams - 1 > 0)456466 keep_active = 1;457467 else458468 keep_active = 0;459469460460- /* Find the other direction values rx or tx which we do not want to461461- * modify */462462- if (&ssi_private->rxtx_reg_val.rx == vals)463463- avals = &ssi_private->rxtx_reg_val.tx;470470+ /* Get the opposite direction to keep its values untouched */471471+ if (&ssi->regvals[RX] == vals)472472+ avals = &ssi->regvals[TX];464473 else465465- avals = &ssi_private->rxtx_reg_val.rx;474474+ avals = &ssi->regvals[RX];466475467467- /* If vals should be disabled, start with disabling the unit */468476 if (!enable) {477477+ /*478478+ * To keep the other stream safe, exclude shared bits between479479+ * both streams, and get safe bits to disable current stream480480+ */469481 u32 scr = fsl_ssi_disable_val(vals->scr, avals->scr,470470- keep_active);471471- regmap_update_bits(regs, CCSR_SSI_SCR, scr, 0);482482+ keep_active);483483+ /* Safely disable SCR register for the stream */484484+ regmap_update_bits(regs, REG_SSI_SCR, scr, 0);472485 }473486474487 /*475475- * We are running on a SoC which does not support online SSI476476- * reconfiguration, so we have to enable all necessary flags at once477477- * even if we do not use them later (capture and playback configuration)488488+ * For cases where online configuration is not supported,489489+ * 1) Enable all necessary bits of both streams when 1st stream starts490490+ * even if the opposite stream will not start491491+ * 2) Disable all remaining bits of both streams when last stream ends478492 */479479- if (ssi_private->soc->offline_config) {480480- if ((enable && !nr_active_streams) ||481481- (!enable && !keep_active))482482- fsl_ssi_rxtx_config(ssi_private, enable);493493+ if (ssi->soc->offline_config) {494494+ if ((enable && !nr_active_streams) || (!enable && !keep_active))495495+ fsl_ssi_rxtx_config(ssi, enable);483496484497 goto config_done;485498 }486499487487- /*488488- * Configure single direction units while the SSI unit is running489489- * (online configuration)490490- */500500+ /* Online configure single direction while SSI is running */491501 if (enable) {492492- fsl_ssi_fifo_clear(ssi_private, vals->scr & CCSR_SSI_SCR_RE);502502+ fsl_ssi_fifo_clear(ssi, vals->scr & SSI_SCR_RE);493503494494- regmap_update_bits(regs, CCSR_SSI_SRCR, vals->srcr, vals->srcr);495495- regmap_update_bits(regs, CCSR_SSI_STCR, vals->stcr, vals->stcr);496496- regmap_update_bits(regs, CCSR_SSI_SIER, vals->sier, vals->sier);504504+ regmap_update_bits(regs, REG_SSI_SRCR, vals->srcr, vals->srcr);505505+ regmap_update_bits(regs, REG_SSI_STCR, vals->stcr, vals->stcr);506506+ regmap_update_bits(regs, REG_SSI_SIER, vals->sier, vals->sier);497507 } else {498508 u32 sier;499509 u32 srcr;500510 u32 stcr;501511502512 /*503503- * Disabling the necessary flags for one of rx/tx while the504504- * other stream is active is a little bit more difficult. We505505- * have to disable only those flags that differ between both506506- * streams (rx XOR tx) and that are set in the stream that is507507- * disabled now. Otherwise we could alter flags of the other508508- * stream513513+ * To keep the other stream safe, exclude shared bits between514514+ * both streams, and get safe bits to disable current stream509515 */510510-511511- /* These assignments are simply vals without bits set in avals*/512516 sier = fsl_ssi_disable_val(vals->sier, avals->sier,513513- keep_active);517517+ keep_active);514518 srcr = fsl_ssi_disable_val(vals->srcr, avals->srcr,515515- keep_active);519519+ keep_active);516520 stcr = fsl_ssi_disable_val(vals->stcr, avals->stcr,517517- keep_active);521521+ keep_active);518522519519- regmap_update_bits(regs, CCSR_SSI_SRCR, srcr, 0);520520- regmap_update_bits(regs, CCSR_SSI_STCR, stcr, 0);521521- regmap_update_bits(regs, CCSR_SSI_SIER, sier, 0);523523+ /* Safely disable other control registers for the stream */524524+ regmap_update_bits(regs, REG_SSI_SRCR, srcr, 0);525525+ regmap_update_bits(regs, REG_SSI_STCR, stcr, 0);526526+ regmap_update_bits(regs, REG_SSI_SIER, sier, 0);522527 }523528524529config_done:525530 /* Enabling of subunits is done after configuration */526531 if (enable) {527527- if (ssi_private->use_dma && (vals->scr & CCSR_SSI_SCR_TE)) {528528- /*529529- * Be sure the Tx FIFO is filled when TE is set.530530- * Otherwise, there are some chances to start the531531- * playback with some void samples inserted first,532532- * generating a channel slip.533533- *534534- * First, SSIEN must be set, to let the FIFO be filled.535535- *536536- * Notes:537537- * - Limit this fix to the DMA case until FIQ cases can538538- * be tested.539539- * - Limit the length of the busy loop to not lock the540540- * system too long, even if 1-2 loops are sufficient541541- * in general.542542- */532532+ /*533533+ * Start DMA before setting TE to avoid FIFO underrun534534+ * which may cause a channel slip or a channel swap535535+ *536536+ * TODO: FIQ cases might also need this upon testing537537+ */538538+ if (ssi->use_dma && (vals->scr & SSI_SCR_TE)) {543539 int i;544540 int max_loop = 100;545545- regmap_update_bits(regs, CCSR_SSI_SCR,546546- CCSR_SSI_SCR_SSIEN, CCSR_SSI_SCR_SSIEN);541541+542542+ /* Enable SSI first to send TX DMA request */543543+ regmap_update_bits(regs, REG_SSI_SCR,544544+ SSI_SCR_SSIEN, SSI_SCR_SSIEN);545545+546546+ /* Busy wait until TX FIFO not empty -- DMA working */547547 for (i = 0; i < max_loop; i++) {548548 u32 sfcsr;549549- regmap_read(regs, CCSR_SSI_SFCSR, &sfcsr);550550- if (CCSR_SSI_SFCSR_TFCNT0(sfcsr))549549+ regmap_read(regs, REG_SSI_SFCSR, &sfcsr);550550+ if (SSI_SFCSR_TFCNT0(sfcsr))551551 break;552552 }553553 if (i == max_loop) {554554- dev_err(ssi_private->dev,554554+ dev_err(ssi->dev,555555 "Timeout waiting TX FIFO filling\n");556556 }557557 }558558- regmap_update_bits(regs, CCSR_SSI_SCR, vals->scr, vals->scr);558558+ /* Enable all remaining bits */559559+ regmap_update_bits(regs, REG_SSI_SCR, vals->scr, vals->scr);559560 }560561}561562562562-563563-static void fsl_ssi_rx_config(struct fsl_ssi_private *ssi_private, bool enable)563563+static void fsl_ssi_rx_config(struct fsl_ssi *ssi, bool enable)564564{565565- fsl_ssi_config(ssi_private, enable, &ssi_private->rxtx_reg_val.rx);565565+ fsl_ssi_config(ssi, enable, &ssi->regvals[RX]);566566}567567568568-static void fsl_ssi_tx_config(struct fsl_ssi_private *ssi_private, bool enable)568568+static void fsl_ssi_tx_ac97_saccst_setup(struct fsl_ssi *ssi)569569{570570- fsl_ssi_config(ssi_private, enable, &ssi_private->rxtx_reg_val.tx);571571-}572572-573573-/*574574- * Setup rx/tx register values used to enable/disable the streams. These will575575- * be used later in fsl_ssi_config to setup the streams without the need to576576- * check for all different SSI modes.577577- */578578-static void fsl_ssi_setup_reg_vals(struct fsl_ssi_private *ssi_private)579579-{580580- struct fsl_ssi_rxtx_reg_val *reg = &ssi_private->rxtx_reg_val;581581-582582- reg->rx.sier = CCSR_SSI_SIER_RFF0_EN;583583- reg->rx.srcr = CCSR_SSI_SRCR_RFEN0;584584- reg->rx.scr = 0;585585- reg->tx.sier = CCSR_SSI_SIER_TFE0_EN;586586- reg->tx.stcr = CCSR_SSI_STCR_TFEN0;587587- reg->tx.scr = 0;588588-589589- if (!fsl_ssi_is_ac97(ssi_private)) {590590- reg->rx.scr = CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_RE;591591- reg->rx.sier |= CCSR_SSI_SIER_RFF0_EN;592592- reg->tx.scr = CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_TE;593593- reg->tx.sier |= CCSR_SSI_SIER_TFE0_EN;594594- }595595-596596- if (ssi_private->use_dma) {597597- reg->rx.sier |= CCSR_SSI_SIER_RDMAE;598598- reg->tx.sier |= CCSR_SSI_SIER_TDMAE;599599- } else {600600- reg->rx.sier |= CCSR_SSI_SIER_RIE;601601- reg->tx.sier |= CCSR_SSI_SIER_TIE;602602- }603603-604604- reg->rx.sier |= FSLSSI_SIER_DBG_RX_FLAGS;605605- reg->tx.sier |= FSLSSI_SIER_DBG_TX_FLAGS;606606-}607607-608608-static void fsl_ssi_setup_ac97(struct fsl_ssi_private *ssi_private)609609-{610610- struct regmap *regs = ssi_private->regs;611611-612612- /*613613- * Setup the clock control register614614- */615615- regmap_write(regs, CCSR_SSI_STCCR,616616- CCSR_SSI_SxCCR_WL(17) | CCSR_SSI_SxCCR_DC(13));617617- regmap_write(regs, CCSR_SSI_SRCCR,618618- CCSR_SSI_SxCCR_WL(17) | CCSR_SSI_SxCCR_DC(13));619619-620620- /*621621- * Enable AC97 mode and startup the SSI622622- */623623- regmap_write(regs, CCSR_SSI_SACNT,624624- CCSR_SSI_SACNT_AC97EN | CCSR_SSI_SACNT_FV);570570+ struct regmap *regs = ssi->regs;625571626572 /* no SACC{ST,EN,DIS} regs on imx21-class SSI */627627- if (!ssi_private->soc->imx21regs) {628628- regmap_write(regs, CCSR_SSI_SACCDIS, 0xff);629629- regmap_write(regs, CCSR_SSI_SACCEN, 0x300);573573+ if (!ssi->soc->imx21regs) {574574+ /* Disable all channel slots */575575+ regmap_write(regs, REG_SSI_SACCDIS, 0xff);576576+ /* Enable slots 3 & 4 -- PCM Playback Left & Right channels */577577+ regmap_write(regs, REG_SSI_SACCEN, 0x300);630578 }579579+}631580581581+static void fsl_ssi_tx_config(struct fsl_ssi *ssi, bool enable)582582+{632583 /*633633- * Enable SSI, Transmit and Receive. AC97 has to communicate with the634634- * codec before a stream is started.584584+ * SACCST might be modified via AC Link by a CODEC if it sends585585+ * extra bits in their SLOTREQ requests, which'll accidentally586586+ * send valid data to slots other than normal playback slots.587587+ *588588+ * To be safe, configure SACCST right before TX starts.635589 */636636- regmap_update_bits(regs, CCSR_SSI_SCR,637637- CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_TE | CCSR_SSI_SCR_RE,638638- CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_TE | CCSR_SSI_SCR_RE);590590+ if (enable && fsl_ssi_is_ac97(ssi))591591+ fsl_ssi_tx_ac97_saccst_setup(ssi);639592640640- regmap_write(regs, CCSR_SSI_SOR, CCSR_SSI_SOR_WAIT(3));593593+ fsl_ssi_config(ssi, enable, &ssi->regvals[TX]);641594}642595643596/**644644- * fsl_ssi_startup: create a new substream645645- *646646- * This is the first function called when a stream is opened.647647- *648648- * If this is the first stream open, then grab the IRQ and program most of649649- * the SSI registers.597597+ * Cache critical bits of SIER, SRCR, STCR and SCR to later set them safely650598 */599599+static void fsl_ssi_setup_regvals(struct fsl_ssi *ssi)600600+{601601+ struct fsl_ssi_regvals *vals = ssi->regvals;602602+603603+ vals[RX].sier = SSI_SIER_RFF0_EN;604604+ vals[RX].srcr = SSI_SRCR_RFEN0;605605+ vals[RX].scr = 0;606606+ vals[TX].sier = SSI_SIER_TFE0_EN;607607+ vals[TX].stcr = SSI_STCR_TFEN0;608608+ vals[TX].scr = 0;609609+610610+ /* AC97 has already enabled SSIEN, RE and TE, so ignore them */611611+ if (!fsl_ssi_is_ac97(ssi)) {612612+ vals[RX].scr = SSI_SCR_SSIEN | SSI_SCR_RE;613613+ vals[TX].scr = SSI_SCR_SSIEN | SSI_SCR_TE;614614+ }615615+616616+ if (ssi->use_dma) {617617+ vals[RX].sier |= SSI_SIER_RDMAE;618618+ vals[TX].sier |= SSI_SIER_TDMAE;619619+ } else {620620+ vals[RX].sier |= SSI_SIER_RIE;621621+ vals[TX].sier |= SSI_SIER_TIE;622622+ }623623+624624+ vals[RX].sier |= FSLSSI_SIER_DBG_RX_FLAGS;625625+ vals[TX].sier |= FSLSSI_SIER_DBG_TX_FLAGS;626626+}627627+628628+static void fsl_ssi_setup_ac97(struct fsl_ssi *ssi)629629+{630630+ struct regmap *regs = ssi->regs;631631+632632+ /* Setup the clock control register */633633+ regmap_write(regs, REG_SSI_STCCR, SSI_SxCCR_WL(17) | SSI_SxCCR_DC(13));634634+ regmap_write(regs, REG_SSI_SRCCR, SSI_SxCCR_WL(17) | SSI_SxCCR_DC(13));635635+636636+ /* Enable AC97 mode and startup the SSI */637637+ regmap_write(regs, REG_SSI_SACNT, SSI_SACNT_AC97EN | SSI_SACNT_FV);638638+639639+ /* AC97 has to communicate with codec before starting a stream */640640+ regmap_update_bits(regs, REG_SSI_SCR,641641+ SSI_SCR_SSIEN | SSI_SCR_TE | SSI_SCR_RE,642642+ SSI_SCR_SSIEN | SSI_SCR_TE | SSI_SCR_RE);643643+644644+ regmap_write(regs, REG_SSI_SOR, SSI_SOR_WAIT(3));645645+}646646+651647static int fsl_ssi_startup(struct snd_pcm_substream *substream,652648 struct snd_soc_dai *dai)653649{654650 struct snd_soc_pcm_runtime *rtd = substream->private_data;655655- struct fsl_ssi_private *ssi_private =656656- snd_soc_dai_get_drvdata(rtd->cpu_dai);651651+ struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);657652 int ret;658653659659- ret = clk_prepare_enable(ssi_private->clk);654654+ ret = clk_prepare_enable(ssi->clk);660655 if (ret)661656 return ret;662657663663- /* When using dual fifo mode, it is safer to ensure an even period658658+ /*659659+ * When using dual fifo mode, it is safer to ensure an even period664660 * size. If appearing to an odd number while DMA always starts its665661 * task from fifo0, fifo1 would be neglected at the end of each666662 * period. But SSI would still access fifo1 with an invalid data.667663 */668668- if (ssi_private->use_dual_fifo)664664+ if (ssi->use_dual_fifo)669665 snd_pcm_hw_constraint_step(substream->runtime, 0,670670- SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 2);666666+ SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 2);671667672668 return 0;673669}674670675675-/**676676- * fsl_ssi_shutdown: shutdown the SSI677677- *678678- */679671static void fsl_ssi_shutdown(struct snd_pcm_substream *substream,680680- struct snd_soc_dai *dai)672672+ struct snd_soc_dai *dai)681673{682674 struct snd_soc_pcm_runtime *rtd = substream->private_data;683683- struct fsl_ssi_private *ssi_private =684684- snd_soc_dai_get_drvdata(rtd->cpu_dai);675675+ struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);685676686686- clk_disable_unprepare(ssi_private->clk);687687-677677+ clk_disable_unprepare(ssi->clk);688678}689679690680/**691691- * fsl_ssi_set_bclk - configure Digital Audio Interface bit clock681681+ * Configure Digital Audio Interface bit clock692682 *693683 * Note: This function can be only called when using SSI as DAI master694684 *···675709 * (In 2-channel I2S Master mode, slot_width is fixed 32)676710 */677711static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream,678678- struct snd_soc_dai *cpu_dai,679679- struct snd_pcm_hw_params *hw_params)712712+ struct snd_soc_dai *dai,713713+ struct snd_pcm_hw_params *hw_params)680714{681681- struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai);682682- struct regmap *regs = ssi_private->regs;683683- int synchronous = ssi_private->cpu_dai_drv.symmetric_rates, ret;715715+ bool tx2, tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;716716+ struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);717717+ struct regmap *regs = ssi->regs;718718+ int synchronous = ssi->cpu_dai_drv.symmetric_rates, ret;684719 u32 pm = 999, div2, psr, stccr, mask, afreq, factor, i;685720 unsigned long clkrate, baudrate, tmprate;686721 unsigned int slots = params_channels(hw_params);···691724 bool baudclk_is_used;692725693726 /* Override slots and slot_width if being specifically set... */694694- if (ssi_private->slots)695695- slots = ssi_private->slots;727727+ if (ssi->slots)728728+ slots = ssi->slots;696729 /* ...but keep 32 bits if slots is 2 -- I2S Master mode */697697- if (ssi_private->slot_width && slots != 2)698698- slot_width = ssi_private->slot_width;730730+ if (ssi->slot_width && slots != 2)731731+ slot_width = ssi->slot_width;699732700733 /* Generate bit clock based on the slot number and slot width */701734 freq = slots * slot_width * params_rate(hw_params);702735703736 /* Don't apply it to any non-baudclk circumstance */704704- if (IS_ERR(ssi_private->baudclk))737737+ if (IS_ERR(ssi->baudclk))705738 return -EINVAL;706739707740 /*708741 * Hardware limitation: The bclk rate must be709742 * never greater than 1/5 IPG clock rate710743 */711711- if (freq * 5 > clk_get_rate(ssi_private->clk)) {712712- dev_err(cpu_dai->dev, "bitclk > ipgclk/5\n");744744+ if (freq * 5 > clk_get_rate(ssi->clk)) {745745+ dev_err(dai->dev, "bitclk > ipgclk / 5\n");713746 return -EINVAL;714747 }715748716716- baudclk_is_used = ssi_private->baudclk_streams & ~(BIT(substream->stream));749749+ baudclk_is_used = ssi->baudclk_streams & ~(BIT(substream->stream));717750718751 /* It should be already enough to divide clock by setting pm alone */719752 psr = 0;···725758 tmprate = freq * factor * (i + 1);726759727760 if (baudclk_is_used)728728- clkrate = clk_get_rate(ssi_private->baudclk);761761+ clkrate = clk_get_rate(ssi->baudclk);729762 else730730- clkrate = clk_round_rate(ssi_private->baudclk, tmprate);763763+ clkrate = clk_round_rate(ssi->baudclk, tmprate);731764732765 clkrate /= factor;733766 afreq = clkrate / (i + 1);···758791759792 /* No proper pm found if it is still remaining the initial value */760793 if (pm == 999) {761761- dev_err(cpu_dai->dev, "failed to handle the required sysclk\n");794794+ dev_err(dai->dev, "failed to handle the required sysclk\n");762795 return -EINVAL;763796 }764797765765- stccr = CCSR_SSI_SxCCR_PM(pm + 1) | (div2 ? CCSR_SSI_SxCCR_DIV2 : 0) |766766- (psr ? CCSR_SSI_SxCCR_PSR : 0);767767- mask = CCSR_SSI_SxCCR_PM_MASK | CCSR_SSI_SxCCR_DIV2 |768768- CCSR_SSI_SxCCR_PSR;798798+ stccr = SSI_SxCCR_PM(pm + 1) | (div2 ? SSI_SxCCR_DIV2 : 0) |799799+ (psr ? SSI_SxCCR_PSR : 0);800800+ mask = SSI_SxCCR_PM_MASK | SSI_SxCCR_DIV2 | SSI_SxCCR_PSR;769801770770- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || synchronous)771771- regmap_update_bits(regs, CCSR_SSI_STCCR, mask, stccr);772772- else773773- regmap_update_bits(regs, CCSR_SSI_SRCCR, mask, stccr);802802+ /* STCCR is used for RX in synchronous mode */803803+ tx2 = tx || synchronous;804804+ regmap_update_bits(regs, REG_SSI_SxCCR(tx2), mask, stccr);774805775806 if (!baudclk_is_used) {776776- ret = clk_set_rate(ssi_private->baudclk, baudrate);807807+ ret = clk_set_rate(ssi->baudclk, baudrate);777808 if (ret) {778778- dev_err(cpu_dai->dev, "failed to set baudclk rate\n");809809+ dev_err(dai->dev, "failed to set baudclk rate\n");779810 return -EINVAL;780811 }781812 }···782817}783818784819/**785785- * fsl_ssi_hw_params - program the sample size820820+ * Configure SSI based on PCM hardware parameters786821 *787787- * Most of the SSI registers have been programmed in the startup function,788788- * but the word length must be programmed here. Unfortunately, programming789789- * the SxCCR.WL bits requires the SSI to be temporarily disabled. This can790790- * cause a problem with supporting simultaneous playback and capture. If791791- * the SSI is already playing a stream, then that stream may be temporarily792792- * stopped when you start capture.793793- *794794- * Note: The SxCCR.DC and SxCCR.PM bits are only used if the SSI is the795795- * clock master.822822+ * Notes:823823+ * 1) SxCCR.WL bits are critical bits that require SSI to be temporarily824824+ * disabled on offline_config SoCs. Even for online configurable SoCs825825+ * running in synchronous mode (both TX and RX use STCCR), it is not826826+ * safe to re-configure them when both two streams start running.827827+ * 2) SxCCR.PM, SxCCR.DIV2 and SxCCR.PSR bits will be configured in the828828+ * fsl_ssi_set_bclk() if SSI is the DAI clock master.796829 */797830static int fsl_ssi_hw_params(struct snd_pcm_substream *substream,798798- struct snd_pcm_hw_params *hw_params, struct snd_soc_dai *cpu_dai)831831+ struct snd_pcm_hw_params *hw_params,832832+ struct snd_soc_dai *dai)799833{800800- struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai);801801- struct regmap *regs = ssi_private->regs;834834+ bool tx2, tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;835835+ struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);836836+ struct regmap *regs = ssi->regs;802837 unsigned int channels = params_channels(hw_params);803838 unsigned int sample_size = params_width(hw_params);804804- u32 wl = CCSR_SSI_SxCCR_WL(sample_size);839839+ u32 wl = SSI_SxCCR_WL(sample_size);805840 int ret;806806- u32 scr_val;841841+ u32 scr;807842 int enabled;808843809809- regmap_read(regs, CCSR_SSI_SCR, &scr_val);810810- enabled = scr_val & CCSR_SSI_SCR_SSIEN;844844+ regmap_read(regs, REG_SSI_SCR, &scr);845845+ enabled = scr & SSI_SCR_SSIEN;811846812847 /*813813- * If we're in synchronous mode, and the SSI is already enabled,814814- * then STCCR is already set properly.848848+ * SSI is properly configured if it is enabled and running in849849+ * the synchronous mode; Note that AC97 mode is an exception850850+ * that should set separate configurations for STCCR and SRCCR851851+ * despite running in the synchronous mode.815852 */816816- if (enabled && ssi_private->cpu_dai_drv.symmetric_rates)853853+ if (enabled && ssi->cpu_dai_drv.symmetric_rates)817854 return 0;818855819819- if (fsl_ssi_is_i2s_master(ssi_private)) {820820- ret = fsl_ssi_set_bclk(substream, cpu_dai, hw_params);856856+ if (fsl_ssi_is_i2s_master(ssi)) {857857+ ret = fsl_ssi_set_bclk(substream, dai, hw_params);821858 if (ret)822859 return ret;823860824861 /* Do not enable the clock if it is already enabled */825825- if (!(ssi_private->baudclk_streams & BIT(substream->stream))) {826826- ret = clk_prepare_enable(ssi_private->baudclk);862862+ if (!(ssi->baudclk_streams & BIT(substream->stream))) {863863+ ret = clk_prepare_enable(ssi->baudclk);827864 if (ret)828865 return ret;829866830830- ssi_private->baudclk_streams |= BIT(substream->stream);867867+ ssi->baudclk_streams |= BIT(substream->stream);831868 }832869 }833870834834- if (!fsl_ssi_is_ac97(ssi_private)) {835835- u8 i2smode;836836- /*837837- * Switch to normal net mode in order to have a frame sync838838- * signal every 32 bits instead of 16 bits839839- */840840- if (fsl_ssi_is_i2s_cbm_cfs(ssi_private) && sample_size == 16)841841- i2smode = CCSR_SSI_SCR_I2S_MODE_NORMAL |842842- CCSR_SSI_SCR_NET;871871+ if (!fsl_ssi_is_ac97(ssi)) {872872+ u8 i2s_net;873873+ /* Normal + Network mode to send 16-bit data in 32-bit frames */874874+ if (fsl_ssi_is_i2s_cbm_cfs(ssi) && sample_size == 16)875875+ i2s_net = SSI_SCR_I2S_MODE_NORMAL | SSI_SCR_NET;843876 else844844- i2smode = ssi_private->i2s_mode;877877+ i2s_net = ssi->i2s_net;845878846846- regmap_update_bits(regs, CCSR_SSI_SCR,847847- CCSR_SSI_SCR_NET | CCSR_SSI_SCR_I2S_MODE_MASK,848848- channels == 1 ? 0 : i2smode);879879+ regmap_update_bits(regs, REG_SSI_SCR,880880+ SSI_SCR_I2S_NET_MASK,881881+ channels == 1 ? 0 : i2s_net);849882 }850883851851- /*852852- * FIXME: The documentation says that SxCCR[WL] should not be853853- * modified while the SSI is enabled. The only time this can854854- * happen is if we're trying to do simultaneous playback and855855- * capture in asynchronous mode. Unfortunately, I have been enable856856- * to get that to work at all on the P1022DS. Therefore, we don't857857- * bother to disable/enable the SSI when setting SxCCR[WL], because858858- * the SSI will stop anyway. Maybe one day, this will get fixed.859859- */860860-861884 /* In synchronous mode, the SSI uses STCCR for capture */862862- if ((substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ||863863- ssi_private->cpu_dai_drv.symmetric_rates)864864- regmap_update_bits(regs, CCSR_SSI_STCCR, CCSR_SSI_SxCCR_WL_MASK,865865- wl);866866- else867867- regmap_update_bits(regs, CCSR_SSI_SRCCR, CCSR_SSI_SxCCR_WL_MASK,868868- wl);885885+ tx2 = tx || ssi->cpu_dai_drv.symmetric_rates;886886+ regmap_update_bits(regs, REG_SSI_SxCCR(tx2), SSI_SxCCR_WL_MASK, wl);869887870888 return 0;871889}872890873891static int fsl_ssi_hw_free(struct snd_pcm_substream *substream,874874- struct snd_soc_dai *cpu_dai)892892+ struct snd_soc_dai *dai)875893{876894 struct snd_soc_pcm_runtime *rtd = substream->private_data;877877- struct fsl_ssi_private *ssi_private =878878- snd_soc_dai_get_drvdata(rtd->cpu_dai);895895+ struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);879896880880- if (fsl_ssi_is_i2s_master(ssi_private) &&881881- ssi_private->baudclk_streams & BIT(substream->stream)) {882882- clk_disable_unprepare(ssi_private->baudclk);883883- ssi_private->baudclk_streams &= ~BIT(substream->stream);897897+ if (fsl_ssi_is_i2s_master(ssi) &&898898+ ssi->baudclk_streams & BIT(substream->stream)) {899899+ clk_disable_unprepare(ssi->baudclk);900900+ ssi->baudclk_streams &= ~BIT(substream->stream);884901 }885902886903 return 0;887904}888905889906static int _fsl_ssi_set_dai_fmt(struct device *dev,890890- struct fsl_ssi_private *ssi_private,891891- unsigned int fmt)907907+ struct fsl_ssi *ssi, unsigned int fmt)892908{893893- struct regmap *regs = ssi_private->regs;909909+ struct regmap *regs = ssi->regs;894910 u32 strcr = 0, stcr, srcr, scr, mask;895911 u8 wm;896912897897- ssi_private->dai_fmt = fmt;913913+ ssi->dai_fmt = fmt;898914899899- if (fsl_ssi_is_i2s_master(ssi_private) && IS_ERR(ssi_private->baudclk)) {900900- dev_err(dev, "baudclk is missing which is necessary for master mode\n");915915+ if (fsl_ssi_is_i2s_master(ssi) && IS_ERR(ssi->baudclk)) {916916+ dev_err(dev, "missing baudclk for master mode\n");901917 return -EINVAL;902918 }903919904904- fsl_ssi_setup_reg_vals(ssi_private);920920+ fsl_ssi_setup_regvals(ssi);905921906906- regmap_read(regs, CCSR_SSI_SCR, &scr);907907- scr &= ~(CCSR_SSI_SCR_SYN | CCSR_SSI_SCR_I2S_MODE_MASK);908908- scr |= CCSR_SSI_SCR_SYNC_TX_FS;922922+ regmap_read(regs, REG_SSI_SCR, &scr);923923+ scr &= ~(SSI_SCR_SYN | SSI_SCR_I2S_MODE_MASK);924924+ /* Synchronize frame sync clock for TE to avoid data slipping */925925+ scr |= SSI_SCR_SYNC_TX_FS;909926910910- mask = CCSR_SSI_STCR_TXBIT0 | CCSR_SSI_STCR_TFDIR | CCSR_SSI_STCR_TXDIR |911911- CCSR_SSI_STCR_TSCKP | CCSR_SSI_STCR_TFSI | CCSR_SSI_STCR_TFSL |912912- CCSR_SSI_STCR_TEFS;913913- regmap_read(regs, CCSR_SSI_STCR, &stcr);914914- regmap_read(regs, CCSR_SSI_SRCR, &srcr);927927+ mask = SSI_STCR_TXBIT0 | SSI_STCR_TFDIR | SSI_STCR_TXDIR |928928+ SSI_STCR_TSCKP | SSI_STCR_TFSI | SSI_STCR_TFSL | SSI_STCR_TEFS;929929+ regmap_read(regs, REG_SSI_STCR, &stcr);930930+ regmap_read(regs, REG_SSI_SRCR, &srcr);915931 stcr &= ~mask;916932 srcr &= ~mask;917933918918- ssi_private->i2s_mode = CCSR_SSI_SCR_NET;934934+ /* Use Network mode as default */935935+ ssi->i2s_net = SSI_SCR_NET;919936 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {920937 case SND_SOC_DAIFMT_I2S:921921- regmap_update_bits(regs, CCSR_SSI_STCCR,922922- CCSR_SSI_SxCCR_DC_MASK,923923- CCSR_SSI_SxCCR_DC(2));924924- regmap_update_bits(regs, CCSR_SSI_SRCCR,925925- CCSR_SSI_SxCCR_DC_MASK,926926- CCSR_SSI_SxCCR_DC(2));938938+ regmap_update_bits(regs, REG_SSI_STCCR,939939+ SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(2));940940+ regmap_update_bits(regs, REG_SSI_SRCCR,941941+ SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(2));927942 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {928943 case SND_SOC_DAIFMT_CBM_CFS:929944 case SND_SOC_DAIFMT_CBS_CFS:930930- ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_MASTER;945945+ ssi->i2s_net |= SSI_SCR_I2S_MODE_MASTER;931946 break;932947 case SND_SOC_DAIFMT_CBM_CFM:933933- ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_SLAVE;948948+ ssi->i2s_net |= SSI_SCR_I2S_MODE_SLAVE;934949 break;935950 default:936951 return -EINVAL;937952 }938953939954 /* Data on rising edge of bclk, frame low, 1clk before data */940940- strcr |= CCSR_SSI_STCR_TFSI | CCSR_SSI_STCR_TSCKP |941941- CCSR_SSI_STCR_TXBIT0 | CCSR_SSI_STCR_TEFS;955955+ strcr |= SSI_STCR_TFSI | SSI_STCR_TSCKP |956956+ SSI_STCR_TXBIT0 | SSI_STCR_TEFS;942957 break;943958 case SND_SOC_DAIFMT_LEFT_J:944959 /* Data on rising edge of bclk, frame high */945945- strcr |= CCSR_SSI_STCR_TXBIT0 | CCSR_SSI_STCR_TSCKP;960960+ strcr |= SSI_STCR_TXBIT0 | SSI_STCR_TSCKP;946961 break;947962 case SND_SOC_DAIFMT_DSP_A:948963 /* Data on rising edge of bclk, frame high, 1clk before data */949949- strcr |= CCSR_SSI_STCR_TFSL | CCSR_SSI_STCR_TSCKP |950950- CCSR_SSI_STCR_TXBIT0 | CCSR_SSI_STCR_TEFS;964964+ strcr |= SSI_STCR_TFSL | SSI_STCR_TSCKP |965965+ SSI_STCR_TXBIT0 | SSI_STCR_TEFS;951966 break;952967 case SND_SOC_DAIFMT_DSP_B:953968 /* Data on rising edge of bclk, frame high */954954- strcr |= CCSR_SSI_STCR_TFSL | CCSR_SSI_STCR_TSCKP |955955- CCSR_SSI_STCR_TXBIT0;969969+ strcr |= SSI_STCR_TFSL | SSI_STCR_TSCKP | SSI_STCR_TXBIT0;956970 break;957971 case SND_SOC_DAIFMT_AC97:958958- ssi_private->i2s_mode |= CCSR_SSI_SCR_I2S_MODE_NORMAL;972972+ /* Data on falling edge of bclk, frame high, 1clk before data */973973+ ssi->i2s_net |= SSI_SCR_I2S_MODE_NORMAL;959974 break;960975 default:961976 return -EINVAL;962977 }963963- scr |= ssi_private->i2s_mode;978978+ scr |= ssi->i2s_net;964979965980 /* DAI clock inversion */966981 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {···9491004 break;9501005 case SND_SOC_DAIFMT_IB_NF:9511006 /* Invert bit clock */952952- strcr ^= CCSR_SSI_STCR_TSCKP;10071007+ strcr ^= SSI_STCR_TSCKP;9531008 break;9541009 case SND_SOC_DAIFMT_NB_IF:9551010 /* Invert frame clock */956956- strcr ^= CCSR_SSI_STCR_TFSI;10111011+ strcr ^= SSI_STCR_TFSI;9571012 break;9581013 case SND_SOC_DAIFMT_IB_IF:9591014 /* Invert both clocks */960960- strcr ^= CCSR_SSI_STCR_TSCKP;961961- strcr ^= CCSR_SSI_STCR_TFSI;10151015+ strcr ^= SSI_STCR_TSCKP;10161016+ strcr ^= SSI_STCR_TFSI;9621017 break;9631018 default:9641019 return -EINVAL;···9671022 /* DAI clock master masks */9681023 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {9691024 case SND_SOC_DAIFMT_CBS_CFS:970970- strcr |= CCSR_SSI_STCR_TFDIR | CCSR_SSI_STCR_TXDIR;971971- scr |= CCSR_SSI_SCR_SYS_CLK_EN;10251025+ /* Output bit and frame sync clocks */10261026+ strcr |= SSI_STCR_TFDIR | SSI_STCR_TXDIR;10271027+ scr |= SSI_SCR_SYS_CLK_EN;9721028 break;9731029 case SND_SOC_DAIFMT_CBM_CFM:974974- scr &= ~CCSR_SSI_SCR_SYS_CLK_EN;10301030+ /* Input bit or frame sync clocks */10311031+ scr &= ~SSI_SCR_SYS_CLK_EN;9751032 break;9761033 case SND_SOC_DAIFMT_CBM_CFS:977977- strcr &= ~CCSR_SSI_STCR_TXDIR;978978- strcr |= CCSR_SSI_STCR_TFDIR;979979- scr &= ~CCSR_SSI_SCR_SYS_CLK_EN;10341034+ /* Input bit clock but output frame sync clock */10351035+ strcr &= ~SSI_STCR_TXDIR;10361036+ strcr |= SSI_STCR_TFDIR;10371037+ scr &= ~SSI_SCR_SYS_CLK_EN;9801038 break;9811039 default:982982- if (!fsl_ssi_is_ac97(ssi_private))10401040+ if (!fsl_ssi_is_ac97(ssi))9831041 return -EINVAL;9841042 }98510439861044 stcr |= strcr;9871045 srcr |= strcr;9881046989989- if (ssi_private->cpu_dai_drv.symmetric_rates990990- || fsl_ssi_is_ac97(ssi_private)) {991991- /* Need to clear RXDIR when using SYNC or AC97 mode */992992- srcr &= ~CCSR_SSI_SRCR_RXDIR;993993- scr |= CCSR_SSI_SCR_SYN;10471047+ /* Set SYN mode and clear RXDIR bit when using SYN or AC97 mode */10481048+ if (ssi->cpu_dai_drv.symmetric_rates || fsl_ssi_is_ac97(ssi)) {10491049+ srcr &= ~SSI_SRCR_RXDIR;10501050+ scr |= SSI_SCR_SYN;9941051 }9951052996996- regmap_write(regs, CCSR_SSI_STCR, stcr);997997- regmap_write(regs, CCSR_SSI_SRCR, srcr);998998- regmap_write(regs, CCSR_SSI_SCR, scr);10531053+ regmap_write(regs, REG_SSI_STCR, stcr);10541054+ regmap_write(regs, REG_SSI_SRCR, srcr);10551055+ regmap_write(regs, REG_SSI_SCR, scr);999105610001000- wm = ssi_private->fifo_watermark;10571057+ wm = ssi->fifo_watermark;1001105810021002- regmap_write(regs, CCSR_SSI_SFCSR,10031003- CCSR_SSI_SFCSR_TFWM0(wm) | CCSR_SSI_SFCSR_RFWM0(wm) |10041004- CCSR_SSI_SFCSR_TFWM1(wm) | CCSR_SSI_SFCSR_RFWM1(wm));10591059+ regmap_write(regs, REG_SSI_SFCSR,10601060+ SSI_SFCSR_TFWM0(wm) | SSI_SFCSR_RFWM0(wm) |10611061+ SSI_SFCSR_TFWM1(wm) | SSI_SFCSR_RFWM1(wm));1005106210061006- if (ssi_private->use_dual_fifo) {10071007- regmap_update_bits(regs, CCSR_SSI_SRCR, CCSR_SSI_SRCR_RFEN1,10081008- CCSR_SSI_SRCR_RFEN1);10091009- regmap_update_bits(regs, CCSR_SSI_STCR, CCSR_SSI_STCR_TFEN1,10101010- CCSR_SSI_STCR_TFEN1);10111011- regmap_update_bits(regs, CCSR_SSI_SCR, CCSR_SSI_SCR_TCH_EN,10121012- CCSR_SSI_SCR_TCH_EN);10631063+ if (ssi->use_dual_fifo) {10641064+ regmap_update_bits(regs, REG_SSI_SRCR,10651065+ SSI_SRCR_RFEN1, SSI_SRCR_RFEN1);10661066+ regmap_update_bits(regs, REG_SSI_STCR,10671067+ SSI_STCR_TFEN1, SSI_STCR_TFEN1);10681068+ regmap_update_bits(regs, REG_SSI_SCR,10691069+ SSI_SCR_TCH_EN, SSI_SCR_TCH_EN);10131070 }1014107110151072 if ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_AC97)10161016- fsl_ssi_setup_ac97(ssi_private);10731073+ fsl_ssi_setup_ac97(ssi);1017107410181075 return 0;10191019-10201076}1021107710221078/**10231023- * fsl_ssi_set_dai_fmt - configure Digital Audio Interface Format.10791079+ * Configure Digital Audio Interface (DAI) Format10241080 */10251025-static int fsl_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)10811081+static int fsl_ssi_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)10261082{10271027- struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai);10831083+ struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);1028108410291029- return _fsl_ssi_set_dai_fmt(cpu_dai->dev, ssi_private, fmt);10851085+ /* AC97 configured DAIFMT earlier in the probe() */10861086+ if (fsl_ssi_is_ac97(ssi))10871087+ return 0;10881088+10891089+ return _fsl_ssi_set_dai_fmt(dai->dev, ssi, fmt);10301090}1031109110321092/**10331033- * fsl_ssi_set_dai_tdm_slot - set TDM slot number10341034- *10351035- * Note: This function can be only called when using SSI as DAI master10931093+ * Set TDM slot number and slot width10361094 */10371037-static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai, u32 tx_mask,10381038- u32 rx_mask, int slots, int slot_width)10951095+static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask,10961096+ u32 rx_mask, int slots, int slot_width)10391097{10401040- struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai);10411041- struct regmap *regs = ssi_private->regs;10981098+ struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);10991099+ struct regmap *regs = ssi->regs;10421100 u32 val;1043110110441102 /* The word length should be 8, 10, 12, 16, 18, 20, 22 or 24 */10451103 if (slot_width & 1 || slot_width < 8 || slot_width > 24) {10461046- dev_err(cpu_dai->dev, "invalid slot width: %d\n", slot_width);11041104+ dev_err(dai->dev, "invalid slot width: %d\n", slot_width);10471105 return -EINVAL;10481106 }1049110710501108 /* The slot number should be >= 2 if using Network mode or I2S mode */10511051- regmap_read(regs, CCSR_SSI_SCR, &val);10521052- val &= CCSR_SSI_SCR_I2S_MODE_MASK | CCSR_SSI_SCR_NET;11091109+ regmap_read(regs, REG_SSI_SCR, &val);11101110+ val &= SSI_SCR_I2S_MODE_MASK | SSI_SCR_NET;10531111 if (val && slots < 2) {10541054- dev_err(cpu_dai->dev, "slot number should be >= 2 in I2S or NET\n");11121112+ dev_err(dai->dev, "slot number should be >= 2 in I2S or NET\n");10551113 return -EINVAL;10561114 }1057111510581058- regmap_update_bits(regs, CCSR_SSI_STCCR, CCSR_SSI_SxCCR_DC_MASK,10591059- CCSR_SSI_SxCCR_DC(slots));10601060- regmap_update_bits(regs, CCSR_SSI_SRCCR, CCSR_SSI_SxCCR_DC_MASK,10611061- CCSR_SSI_SxCCR_DC(slots));11161116+ regmap_update_bits(regs, REG_SSI_STCCR,11171117+ SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(slots));11181118+ regmap_update_bits(regs, REG_SSI_SRCCR,11191119+ SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(slots));1062112010631063- /* The register SxMSKs needs SSI to provide essential clock due to10641064- * hardware design. So we here temporarily enable SSI to set them.10651065- */10661066- regmap_read(regs, CCSR_SSI_SCR, &val);10671067- val &= CCSR_SSI_SCR_SSIEN;10681068- regmap_update_bits(regs, CCSR_SSI_SCR, CCSR_SSI_SCR_SSIEN,10691069- CCSR_SSI_SCR_SSIEN);11211121+ /* Save SSIEN bit of the SCR register */11221122+ regmap_read(regs, REG_SSI_SCR, &val);11231123+ val &= SSI_SCR_SSIEN;11241124+ /* Temporarily enable SSI to allow SxMSKs to be configurable */11251125+ regmap_update_bits(regs, REG_SSI_SCR, SSI_SCR_SSIEN, SSI_SCR_SSIEN);1070112610711071- regmap_write(regs, CCSR_SSI_STMSK, ~tx_mask);10721072- regmap_write(regs, CCSR_SSI_SRMSK, ~rx_mask);11271127+ regmap_write(regs, REG_SSI_STMSK, ~tx_mask);11281128+ regmap_write(regs, REG_SSI_SRMSK, ~rx_mask);1073112910741074- regmap_update_bits(regs, CCSR_SSI_SCR, CCSR_SSI_SCR_SSIEN, val);11301130+ /* Restore the value of SSIEN bit */11311131+ regmap_update_bits(regs, REG_SSI_SCR, SSI_SCR_SSIEN, val);1075113210761076- ssi_private->slot_width = slot_width;10771077- ssi_private->slots = slots;11331133+ ssi->slot_width = slot_width;11341134+ ssi->slots = slots;1078113510791136 return 0;10801137}1081113810821139/**10831083- * fsl_ssi_trigger: start and stop the DMA transfer.10841084- *10851085- * This function is called by ALSA to start, stop, pause, and resume the DMA10861086- * transfer of data.11401140+ * Start or stop SSI and corresponding DMA transaction.10871141 *10881142 * The DMA channel is in external master start and pause mode, which10891143 * means the SSI completely controls the flow of data.···10911147 struct snd_soc_dai *dai)10921148{10931149 struct snd_soc_pcm_runtime *rtd = substream->private_data;10941094- struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(rtd->cpu_dai);10951095- struct regmap *regs = ssi_private->regs;11501150+ struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);11511151+ struct regmap *regs = ssi->regs;1096115210971153 switch (cmd) {10981154 case SNDRV_PCM_TRIGGER_START:10991155 case SNDRV_PCM_TRIGGER_RESUME:11001156 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:11011157 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)11021102- fsl_ssi_tx_config(ssi_private, true);11581158+ fsl_ssi_tx_config(ssi, true);11031159 else11041104- fsl_ssi_rx_config(ssi_private, true);11601160+ fsl_ssi_rx_config(ssi, true);11051161 break;1106116211071163 case SNDRV_PCM_TRIGGER_STOP:11081164 case SNDRV_PCM_TRIGGER_SUSPEND:11091165 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:11101166 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)11111111- fsl_ssi_tx_config(ssi_private, false);11671167+ fsl_ssi_tx_config(ssi, false);11121168 else11131113- fsl_ssi_rx_config(ssi_private, false);11691169+ fsl_ssi_rx_config(ssi, false);11141170 break;1115117111161172 default:11171173 return -EINVAL;11181174 }1119117511201120- if (fsl_ssi_is_ac97(ssi_private)) {11761176+ /* Clear corresponding FIFO */11771177+ if (fsl_ssi_is_ac97(ssi)) {11211178 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)11221122- regmap_write(regs, CCSR_SSI_SOR, CCSR_SSI_SOR_TX_CLR);11791179+ regmap_write(regs, REG_SSI_SOR, SSI_SOR_TX_CLR);11231180 else11241124- regmap_write(regs, CCSR_SSI_SOR, CCSR_SSI_SOR_RX_CLR);11811181+ regmap_write(regs, REG_SSI_SOR, SSI_SOR_RX_CLR);11251182 }1126118311271184 return 0;···1130118511311186static int fsl_ssi_dai_probe(struct snd_soc_dai *dai)11321187{11331133- struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(dai);11881188+ struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);1134118911351135- if (ssi_private->soc->imx && ssi_private->use_dma) {11361136- dai->playback_dma_data = &ssi_private->dma_params_tx;11371137- dai->capture_dma_data = &ssi_private->dma_params_rx;11901190+ if (ssi->soc->imx && ssi->use_dma) {11911191+ dai->playback_dma_data = &ssi->dma_params_tx;11921192+ dai->capture_dma_data = &ssi->dma_params_rx;11381193 }1139119411401195 return 0;11411196}1142119711431198static const struct snd_soc_dai_ops fsl_ssi_dai_ops = {11441144- .startup = fsl_ssi_startup,11451145- .shutdown = fsl_ssi_shutdown,11461146- .hw_params = fsl_ssi_hw_params,11471147- .hw_free = fsl_ssi_hw_free,11481148- .set_fmt = fsl_ssi_set_dai_fmt,11491149- .set_tdm_slot = fsl_ssi_set_dai_tdm_slot,11501150- .trigger = fsl_ssi_trigger,11991199+ .startup = fsl_ssi_startup,12001200+ .shutdown = fsl_ssi_shutdown,12011201+ .hw_params = fsl_ssi_hw_params,12021202+ .hw_free = fsl_ssi_hw_free,12031203+ .set_fmt = fsl_ssi_set_dai_fmt,12041204+ .set_tdm_slot = fsl_ssi_set_dai_tdm_slot,12051205+ .trigger = fsl_ssi_trigger,11511206};1152120711531153-/* Template for the CPU dai driver structure */11541208static struct snd_soc_dai_driver fsl_ssi_dai_template = {11551209 .probe = fsl_ssi_dai_probe,11561210 .playback = {···11701226};1171122711721228static const struct snd_soc_component_driver fsl_ssi_component = {11731173- .name = "fsl-ssi",12291229+ .name = "fsl-ssi",11741230};1175123111761232static struct snd_soc_dai_driver fsl_ssi_ac97_dai = {···11811237 .channels_min = 2,11821238 .channels_max = 2,11831239 .rates = SNDRV_PCM_RATE_8000_48000,11841184- .formats = SNDRV_PCM_FMTBIT_S16_LE,12401240+ .formats = SNDRV_PCM_FMTBIT_S16 | SNDRV_PCM_FMTBIT_S20,11851241 },11861242 .capture = {11871243 .stream_name = "AC97 Capture",11881244 .channels_min = 2,11891245 .channels_max = 2,11901246 .rates = SNDRV_PCM_RATE_48000,11911191- .formats = SNDRV_PCM_FMTBIT_S16_LE,12471247+ /* 16-bit capture is broken (errata ERR003778) */12481248+ .formats = SNDRV_PCM_FMTBIT_S20,11921249 },11931250 .ops = &fsl_ssi_dai_ops,11941251};1195125211961196-11971197-static struct fsl_ssi_private *fsl_ac97_data;12531253+static struct fsl_ssi *fsl_ac97_data;1198125411991255static void fsl_ssi_ac97_write(struct snd_ac97 *ac97, unsigned short reg,12001200- unsigned short val)12561256+ unsigned short val)12011257{12021258 struct regmap *regs = fsl_ac97_data->regs;12031259 unsigned int lreg;···12171273 }1218127412191275 lreg = reg << 12;12201220- regmap_write(regs, CCSR_SSI_SACADD, lreg);12761276+ regmap_write(regs, REG_SSI_SACADD, lreg);1221127712221278 lval = val << 4;12231223- regmap_write(regs, CCSR_SSI_SACDAT, lval);12791279+ regmap_write(regs, REG_SSI_SACDAT, lval);1224128012251225- regmap_update_bits(regs, CCSR_SSI_SACNT, CCSR_SSI_SACNT_RDWR_MASK,12261226- CCSR_SSI_SACNT_WR);12811281+ regmap_update_bits(regs, REG_SSI_SACNT,12821282+ SSI_SACNT_RDWR_MASK, SSI_SACNT_WR);12271283 udelay(100);1228128412291285 clk_disable_unprepare(fsl_ac97_data->clk);···12331289}1234129012351291static unsigned short fsl_ssi_ac97_read(struct snd_ac97 *ac97,12361236- unsigned short reg)12921292+ unsigned short reg)12371293{12381294 struct regmap *regs = fsl_ac97_data->regs;12391239-12401295 unsigned short val = 0;12411296 u32 reg_val;12421297 unsigned int lreg;···1245130212461303 ret = clk_prepare_enable(fsl_ac97_data->clk);12471304 if (ret) {12481248- pr_err("ac97 read clk_prepare_enable failed: %d\n",12491249- ret);13051305+ pr_err("ac97 read clk_prepare_enable failed: %d\n", ret);12501306 goto ret_unlock;12511307 }1252130812531309 lreg = (reg & 0x7f) << 12;12541254- regmap_write(regs, CCSR_SSI_SACADD, lreg);12551255- regmap_update_bits(regs, CCSR_SSI_SACNT, CCSR_SSI_SACNT_RDWR_MASK,12561256- CCSR_SSI_SACNT_RD);13101310+ regmap_write(regs, REG_SSI_SACADD, lreg);13111311+ regmap_update_bits(regs, REG_SSI_SACNT,13121312+ SSI_SACNT_RDWR_MASK, SSI_SACNT_RD);1257131312581314 udelay(100);1259131512601260- regmap_read(regs, CCSR_SSI_SACDAT, ®_val);13161316+ regmap_read(regs, REG_SSI_SACDAT, ®_val);12611317 val = (reg_val >> 4) & 0xffff;1262131812631319 clk_disable_unprepare(fsl_ac97_data->clk);···12671325}1268132612691327static struct snd_ac97_bus_ops fsl_ssi_ac97_ops = {12701270- .read = fsl_ssi_ac97_read,12711271- .write = fsl_ssi_ac97_write,13281328+ .read = fsl_ssi_ac97_read,13291329+ .write = fsl_ssi_ac97_write,12721330};1273133112741332/**···12831341}1284134212851343static int fsl_ssi_imx_probe(struct platform_device *pdev,12861286- struct fsl_ssi_private *ssi_private, void __iomem *iomem)13441344+ struct fsl_ssi *ssi, void __iomem *iomem)12871345{12881346 struct device_node *np = pdev->dev.of_node;13471347+ struct device *dev = &pdev->dev;12891348 u32 dmas[4];12901349 int ret;1291135012921292- if (ssi_private->has_ipg_clk_name)12931293- ssi_private->clk = devm_clk_get(&pdev->dev, "ipg");13511351+ /* Backward compatible for a DT without ipg clock name assigned */13521352+ if (ssi->has_ipg_clk_name)13531353+ ssi->clk = devm_clk_get(dev, "ipg");12941354 else12951295- ssi_private->clk = devm_clk_get(&pdev->dev, NULL);12961296- if (IS_ERR(ssi_private->clk)) {12971297- ret = PTR_ERR(ssi_private->clk);12981298- dev_err(&pdev->dev, "could not get clock: %d\n", ret);13551355+ ssi->clk = devm_clk_get(dev, NULL);13561356+ if (IS_ERR(ssi->clk)) {13571357+ ret = PTR_ERR(ssi->clk);13581358+ dev_err(dev, "failed to get clock: %d\n", ret);12991359 return ret;13001360 }1301136113021302- if (!ssi_private->has_ipg_clk_name) {13031303- ret = clk_prepare_enable(ssi_private->clk);13621362+ /* Enable the clock since regmap will not handle it in this case */13631363+ if (!ssi->has_ipg_clk_name) {13641364+ ret = clk_prepare_enable(ssi->clk);13041365 if (ret) {13051305- dev_err(&pdev->dev, "clk_prepare_enable failed: %d\n", ret);13661366+ dev_err(dev, "clk_prepare_enable failed: %d\n", ret);13061367 return ret;13071368 }13081369 }1309137013101310- /* For those SLAVE implementations, we ignore non-baudclk cases13111311- * and, instead, abandon MASTER mode that needs baud clock.13121312- */13131313- ssi_private->baudclk = devm_clk_get(&pdev->dev, "baud");13141314- if (IS_ERR(ssi_private->baudclk))13151315- dev_dbg(&pdev->dev, "could not get baud clock: %ld\n",13161316- PTR_ERR(ssi_private->baudclk));13711371+ /* Do not error out for slave cases that live without a baud clock */13721372+ ssi->baudclk = devm_clk_get(dev, "baud");13731373+ if (IS_ERR(ssi->baudclk))13741374+ dev_dbg(dev, "failed to get baud clock: %ld\n",13751375+ PTR_ERR(ssi->baudclk));1317137613181318- ssi_private->dma_params_tx.maxburst = ssi_private->dma_maxburst;13191319- ssi_private->dma_params_rx.maxburst = ssi_private->dma_maxburst;13201320- ssi_private->dma_params_tx.addr = ssi_private->ssi_phys + CCSR_SSI_STX0;13211321- ssi_private->dma_params_rx.addr = ssi_private->ssi_phys + CCSR_SSI_SRX0;13771377+ ssi->dma_params_tx.maxburst = ssi->dma_maxburst;13781378+ ssi->dma_params_rx.maxburst = ssi->dma_maxburst;13791379+ ssi->dma_params_tx.addr = ssi->ssi_phys + REG_SSI_STX0;13801380+ ssi->dma_params_rx.addr = ssi->ssi_phys + REG_SSI_SRX0;1322138113821382+ /* Set to dual FIFO mode according to the SDMA sciprt */13231383 ret = of_property_read_u32_array(np, "dmas", dmas, 4);13241324- if (ssi_private->use_dma && !ret && dmas[2] == IMX_DMATYPE_SSI_DUAL) {13251325- ssi_private->use_dual_fifo = true;13261326- /* When using dual fifo mode, we need to keep watermark13271327- * as even numbers due to dma script limitation.13841384+ if (ssi->use_dma && !ret && dmas[2] == IMX_DMATYPE_SSI_DUAL) {13851385+ ssi->use_dual_fifo = true;13861386+ /*13871387+ * Use even numbers to avoid channel swap due to SDMA13881388+ * script design13281389 */13291329- ssi_private->dma_params_tx.maxburst &= ~0x1;13301330- ssi_private->dma_params_rx.maxburst &= ~0x1;13901390+ ssi->dma_params_tx.maxburst &= ~0x1;13911391+ ssi->dma_params_rx.maxburst &= ~0x1;13311392 }1332139313331333- if (!ssi_private->use_dma) {13341334-13941394+ if (!ssi->use_dma) {13351395 /*13361336- * Some boards use an incompatible codec. To get it13371337- * working, we are using imx-fiq-pcm-audio, that13381338- * can handle those codecs. DMA is not possible in this13391339- * situation.13961396+ * Some boards use an incompatible codec. Use imx-fiq-pcm-audio13971397+ * to get it working, as DMA is not possible in this situation.13401398 */13991399+ ssi->fiq_params.irq = ssi->irq;14001400+ ssi->fiq_params.base = iomem;14011401+ ssi->fiq_params.dma_params_rx = &ssi->dma_params_rx;14021402+ ssi->fiq_params.dma_params_tx = &ssi->dma_params_tx;1341140313421342- ssi_private->fiq_params.irq = ssi_private->irq;13431343- ssi_private->fiq_params.base = iomem;13441344- ssi_private->fiq_params.dma_params_rx =13451345- &ssi_private->dma_params_rx;13461346- ssi_private->fiq_params.dma_params_tx =13471347- &ssi_private->dma_params_tx;13481348-13491349- ret = imx_pcm_fiq_init(pdev, &ssi_private->fiq_params);14041404+ ret = imx_pcm_fiq_init(pdev, &ssi->fiq_params);13501405 if (ret)13511406 goto error_pcm;13521407 } else {···13551416 return 0;1356141713571418error_pcm:14191419+ if (!ssi->has_ipg_clk_name)14201420+ clk_disable_unprepare(ssi->clk);1358142113591359- if (!ssi_private->has_ipg_clk_name)13601360- clk_disable_unprepare(ssi_private->clk);13611422 return ret;13621423}1363142413641364-static void fsl_ssi_imx_clean(struct platform_device *pdev,13651365- struct fsl_ssi_private *ssi_private)14251425+static void fsl_ssi_imx_clean(struct platform_device *pdev, struct fsl_ssi *ssi)13661426{13671367- if (!ssi_private->use_dma)14271427+ if (!ssi->use_dma)13681428 imx_pcm_fiq_exit(pdev);13691369- if (!ssi_private->has_ipg_clk_name)13701370- clk_disable_unprepare(ssi_private->clk);14291429+ if (!ssi->has_ipg_clk_name)14301430+ clk_disable_unprepare(ssi->clk);13711431}1372143213731433static int fsl_ssi_probe(struct platform_device *pdev)13741434{13751375- struct fsl_ssi_private *ssi_private;14351435+ struct fsl_ssi *ssi;13761436 int ret = 0;13771437 struct device_node *np = pdev->dev.of_node;14381438+ struct device *dev = &pdev->dev;13781439 const struct of_device_id *of_id;13791440 const char *p, *sprop;13801441 const uint32_t *iprop;···13831444 char name[64];13841445 struct regmap_config regconfig = fsl_ssi_regconfig;1385144613861386- of_id = of_match_device(fsl_ssi_ids, &pdev->dev);14471447+ of_id = of_match_device(fsl_ssi_ids, dev);13871448 if (!of_id || !of_id->data)13881449 return -EINVAL;1389145013901390- ssi_private = devm_kzalloc(&pdev->dev, sizeof(*ssi_private),13911391- GFP_KERNEL);13921392- if (!ssi_private)14511451+ ssi = devm_kzalloc(dev, sizeof(*ssi), GFP_KERNEL);14521452+ if (!ssi)13931453 return -ENOMEM;1394145413951395- ssi_private->soc = of_id->data;13961396- ssi_private->dev = &pdev->dev;14551455+ ssi->soc = of_id->data;14561456+ ssi->dev = dev;1397145714581458+ /* Check if being used in AC97 mode */13981459 sprop = of_get_property(np, "fsl,mode", NULL);13991460 if (sprop) {14001461 if (!strcmp(sprop, "ac97-slave"))14011401- ssi_private->dai_fmt = SND_SOC_DAIFMT_AC97;14621462+ ssi->dai_fmt = SND_SOC_DAIFMT_AC97;14021463 }1403146414041404- ssi_private->use_dma = !of_property_read_bool(np,14051405- "fsl,fiq-stream-filter");14651465+ /* Select DMA or FIQ */14661466+ ssi->use_dma = !of_property_read_bool(np, "fsl,fiq-stream-filter");1406146714071407- if (fsl_ssi_is_ac97(ssi_private)) {14081408- memcpy(&ssi_private->cpu_dai_drv, &fsl_ssi_ac97_dai,14091409- sizeof(fsl_ssi_ac97_dai));14101410-14111411- fsl_ac97_data = ssi_private;14681468+ if (fsl_ssi_is_ac97(ssi)) {14691469+ memcpy(&ssi->cpu_dai_drv, &fsl_ssi_ac97_dai,14701470+ sizeof(fsl_ssi_ac97_dai));14711471+ fsl_ac97_data = ssi;14121472 } else {14131413- /* Initialize this copy of the CPU DAI driver structure */14141414- memcpy(&ssi_private->cpu_dai_drv, &fsl_ssi_dai_template,14731473+ memcpy(&ssi->cpu_dai_drv, &fsl_ssi_dai_template,14151474 sizeof(fsl_ssi_dai_template));14161475 }14171417- ssi_private->cpu_dai_drv.name = dev_name(&pdev->dev);14761476+ ssi->cpu_dai_drv.name = dev_name(dev);1418147714191478 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);14201420- iomem = devm_ioremap_resource(&pdev->dev, res);14791479+ iomem = devm_ioremap_resource(dev, res);14211480 if (IS_ERR(iomem))14221481 return PTR_ERR(iomem);14231423- ssi_private->ssi_phys = res->start;14821482+ ssi->ssi_phys = res->start;1424148314251425- if (ssi_private->soc->imx21regs) {14261426- /*14271427- * According to datasheet imx21-class SSI14281428- * don't have SACC{ST,EN,DIS} regs.14291429- */14301430- regconfig.max_register = CCSR_SSI_SRMSK;14841484+ if (ssi->soc->imx21regs) {14851485+ /* No SACC{ST,EN,DIS} regs in imx21-class SSI */14861486+ regconfig.max_register = REG_SSI_SRMSK;14311487 regconfig.num_reg_defaults_raw =14321432- CCSR_SSI_SRMSK / sizeof(uint32_t) + 1;14881488+ REG_SSI_SRMSK / sizeof(uint32_t) + 1;14331489 }1434149014351491 ret = of_property_match_string(np, "clock-names", "ipg");14361492 if (ret < 0) {14371437- ssi_private->has_ipg_clk_name = false;14381438- ssi_private->regs = devm_regmap_init_mmio(&pdev->dev, iomem,14391439- ®config);14931493+ ssi->has_ipg_clk_name = false;14941494+ ssi->regs = devm_regmap_init_mmio(dev, iomem, ®config);14401495 } else {14411441- ssi_private->has_ipg_clk_name = true;14421442- ssi_private->regs = devm_regmap_init_mmio_clk(&pdev->dev,14431443- "ipg", iomem, ®config);14961496+ ssi->has_ipg_clk_name = true;14971497+ ssi->regs = devm_regmap_init_mmio_clk(dev, "ipg", iomem,14981498+ ®config);14441499 }14451445- if (IS_ERR(ssi_private->regs)) {14461446- dev_err(&pdev->dev, "Failed to init register map\n");14471447- return PTR_ERR(ssi_private->regs);14481448- }14491449-14501450- ssi_private->irq = platform_get_irq(pdev, 0);14511451- if (ssi_private->irq < 0) {14521452- dev_err(&pdev->dev, "no irq for node %s\n", pdev->name);14531453- return ssi_private->irq;15001500+ if (IS_ERR(ssi->regs)) {15011501+ dev_err(dev, "failed to init register map\n");15021502+ return PTR_ERR(ssi->regs);14541503 }1455150414561456- /* Are the RX and the TX clocks locked? */15051505+ ssi->irq = platform_get_irq(pdev, 0);15061506+ if (ssi->irq < 0) {15071507+ dev_err(dev, "no irq for node %s\n", pdev->name);15081508+ return ssi->irq;15091509+ }15101510+15111511+ /* Set software limitations for synchronous mode */14571512 if (!of_find_property(np, "fsl,ssi-asynchronous", NULL)) {14581458- if (!fsl_ssi_is_ac97(ssi_private))14591459- ssi_private->cpu_dai_drv.symmetric_rates = 1;15131513+ if (!fsl_ssi_is_ac97(ssi)) {15141514+ ssi->cpu_dai_drv.symmetric_rates = 1;15151515+ ssi->cpu_dai_drv.symmetric_samplebits = 1;15161516+ }1460151714611461- ssi_private->cpu_dai_drv.symmetric_channels = 1;14621462- ssi_private->cpu_dai_drv.symmetric_samplebits = 1;15181518+ ssi->cpu_dai_drv.symmetric_channels = 1;14631519 }1464152014651465- /* Determine the FIFO depth. */15211521+ /* Fetch FIFO depth; Set to 8 for older DT without this property */14661522 iprop = of_get_property(np, "fsl,fifo-depth", NULL);14671523 if (iprop)14681468- ssi_private->fifo_depth = be32_to_cpup(iprop);15241524+ ssi->fifo_depth = be32_to_cpup(iprop);14691525 else14701470- /* Older 8610 DTs didn't have the fifo-depth property */14711471- ssi_private->fifo_depth = 8;15261526+ ssi->fifo_depth = 8;1472152714731528 /*14741474- * Set the watermark for transmit FIFO 0 and receive FIFO 0. We don't14751475- * use FIFO 1 but set the watermark appropriately nontheless.14761476- * We program the transmit water to signal a DMA transfer14771477- * if there are N elements left in the FIFO. For chips with 15-deep14781478- * FIFOs, set watermark to 8. This allows the SSI to operate at a14791479- * high data rate without channel slipping. Behavior is unchanged14801480- * for the older chips with a fifo depth of only 8. A value of 414811481- * might be appropriate for the older chips, but is left at14821482- * fifo_depth-2 until sombody has a chance to test.15291529+ * Configure TX and RX DMA watermarks -- when to send a DMA request14831530 *14841484- * We set the watermark on the same level as the DMA burstsize. For14851485- * fiq it is probably better to use the biggest possible watermark14861486- * size.15311531+ * Values should be tested to avoid FIFO under/over run. Set maxburst15321532+ * to fifo_watermark to maxiumize DMA transaction to reduce overhead.14871533 */14881488- switch (ssi_private->fifo_depth) {15341534+ switch (ssi->fifo_depth) {14891535 case 15:14901536 /*14911491- * 2 samples is not enough when running at high data14921492- * rates (like 48kHz @ 16 bits/channel, 16 channels)14931493- * 8 seems to split things evenly and leave enough time14941494- * for the DMA to fill the FIFO before it's over/under14951495- * run.15371537+ * Set to 8 as a balanced configuration -- When TX FIFO has 815381538+ * empty slots, send a DMA request to fill these 8 slots. The15391539+ * remaining 7 slots should be able to allow DMA to finish the15401540+ * transaction before TX FIFO underruns; Same applies to RX.15411541+ *15421542+ * Tested with cases running at 48kHz @ 16 bits x 16 channels14961543 */14971497- ssi_private->fifo_watermark = 8;14981498- ssi_private->dma_maxburst = 8;15441544+ ssi->fifo_watermark = 8;15451545+ ssi->dma_maxburst = 8;14991546 break;15001547 case 8:15011548 default:15021502- /*15031503- * maintain old behavior for older chips.15041504- * Keeping it the same because I don't have an older15051505- * board to test with.15061506- * I suspect this could be changed to be something to15071507- * leave some more space in the fifo.15081508- */15091509- ssi_private->fifo_watermark = ssi_private->fifo_depth - 2;15101510- ssi_private->dma_maxburst = ssi_private->fifo_depth - 2;15491549+ /* Safely use old watermark configurations for older chips */15501550+ ssi->fifo_watermark = ssi->fifo_depth - 2;15511551+ ssi->dma_maxburst = ssi->fifo_depth - 2;15111552 break;15121553 }1513155415141514- dev_set_drvdata(&pdev->dev, ssi_private);15551555+ dev_set_drvdata(dev, ssi);1515155615161516- if (ssi_private->soc->imx) {15171517- ret = fsl_ssi_imx_probe(pdev, ssi_private, iomem);15571557+ if (ssi->soc->imx) {15581558+ ret = fsl_ssi_imx_probe(pdev, ssi, iomem);15181559 if (ret)15191560 return ret;15201561 }1521156215221522- if (fsl_ssi_is_ac97(ssi_private)) {15231523- mutex_init(&ssi_private->ac97_reg_lock);15631563+ if (fsl_ssi_is_ac97(ssi)) {15641564+ mutex_init(&ssi->ac97_reg_lock);15241565 ret = snd_soc_set_ac97_ops_of_reset(&fsl_ssi_ac97_ops, pdev);15251566 if (ret) {15261526- dev_err(&pdev->dev, "could not set AC'97 ops\n");15671567+ dev_err(dev, "failed to set AC'97 ops\n");15271568 goto error_ac97_ops;15281569 }15291570 }1530157115311531- ret = devm_snd_soc_register_component(&pdev->dev, &fsl_ssi_component,15321532- &ssi_private->cpu_dai_drv, 1);15721572+ ret = devm_snd_soc_register_component(dev, &fsl_ssi_component,15731573+ &ssi->cpu_dai_drv, 1);15331574 if (ret) {15341534- dev_err(&pdev->dev, "failed to register DAI: %d\n", ret);15751575+ dev_err(dev, "failed to register DAI: %d\n", ret);15351576 goto error_asoc_register;15361577 }1537157815381538- if (ssi_private->use_dma) {15391539- ret = devm_request_irq(&pdev->dev, ssi_private->irq,15401540- fsl_ssi_isr, 0, dev_name(&pdev->dev),15411541- ssi_private);15791579+ if (ssi->use_dma) {15801580+ ret = devm_request_irq(dev, ssi->irq, fsl_ssi_isr, 0,15811581+ dev_name(dev), ssi);15421582 if (ret < 0) {15431543- dev_err(&pdev->dev, "could not claim irq %u\n",15441544- ssi_private->irq);15831583+ dev_err(dev, "failed to claim irq %u\n", ssi->irq);15451584 goto error_asoc_register;15461585 }15471586 }1548158715491549- ret = fsl_ssi_debugfs_create(&ssi_private->dbg_stats, &pdev->dev);15881588+ ret = fsl_ssi_debugfs_create(&ssi->dbg_stats, dev);15501589 if (ret)15511590 goto error_asoc_register;1552159115531553- /*15541554- * If codec-handle property is missing from SSI node, we assume15551555- * that the machine driver uses new binding which does not require15561556- * SSI driver to trigger machine driver's probe.15571557- */15921592+ /* Bypass it if using newer DT bindings of ASoC machine drivers */15581593 if (!of_get_property(np, "codec-handle", NULL))15591594 goto done;1560159515611561- /* Trigger the machine driver's probe function. The platform driver15621562- * name of the machine driver is taken from /compatible property of the15631563- * device tree. We also pass the address of the CPU DAI driver15641564- * structure.15961596+ /*15971597+ * Backward compatible for older bindings by manually triggering the15981598+ * machine driver's probe(). Use /compatible property, including the15991599+ * address of CPU DAI driver structure, as the name of machine driver.15651600 */15661601 sprop = of_get_property(of_find_node_by_path("/"), "compatible", NULL);15671602 /* Sometimes the compatible name has a "fsl," prefix, so we strip it. */···15451632 snprintf(name, sizeof(name), "snd-soc-%s", sprop);15461633 make_lowercase(name);1547163415481548- ssi_private->pdev =15491549- platform_device_register_data(&pdev->dev, name, 0, NULL, 0);15501550- if (IS_ERR(ssi_private->pdev)) {15511551- ret = PTR_ERR(ssi_private->pdev);15521552- dev_err(&pdev->dev, "failed to register platform: %d\n", ret);16351635+ ssi->pdev = platform_device_register_data(dev, name, 0, NULL, 0);16361636+ if (IS_ERR(ssi->pdev)) {16371637+ ret = PTR_ERR(ssi->pdev);16381638+ dev_err(dev, "failed to register platform: %d\n", ret);15531639 goto error_sound_card;15541640 }1555164115561642done:15571557- if (ssi_private->dai_fmt)15581558- _fsl_ssi_set_dai_fmt(&pdev->dev, ssi_private,15591559- ssi_private->dai_fmt);16431643+ if (ssi->dai_fmt)16441644+ _fsl_ssi_set_dai_fmt(dev, ssi, ssi->dai_fmt);1560164515611561- if (fsl_ssi_is_ac97(ssi_private)) {16461646+ if (fsl_ssi_is_ac97(ssi)) {15621647 u32 ssi_idx;1563164815641649 ret = of_property_read_u32(np, "cell-index", &ssi_idx);15651650 if (ret) {15661566- dev_err(&pdev->dev, "cannot get SSI index property\n");16511651+ dev_err(dev, "failed to get SSI index property\n");15671652 goto error_sound_card;15681653 }1569165415701570- ssi_private->pdev =15711571- platform_device_register_data(NULL,15721572- "ac97-codec", ssi_idx, NULL, 0);15731573- if (IS_ERR(ssi_private->pdev)) {15741574- ret = PTR_ERR(ssi_private->pdev);15751575- dev_err(&pdev->dev,16551655+ ssi->pdev = platform_device_register_data(NULL, "ac97-codec",16561656+ ssi_idx, NULL, 0);16571657+ if (IS_ERR(ssi->pdev)) {16581658+ ret = PTR_ERR(ssi->pdev);16591659+ dev_err(dev,15761660 "failed to register AC97 codec platform: %d\n",15771661 ret);15781662 goto error_sound_card;···15791669 return 0;1580167015811671error_sound_card:15821582- fsl_ssi_debugfs_remove(&ssi_private->dbg_stats);15831583-16721672+ fsl_ssi_debugfs_remove(&ssi->dbg_stats);15841673error_asoc_register:15851585- if (fsl_ssi_is_ac97(ssi_private))16741674+ if (fsl_ssi_is_ac97(ssi))15861675 snd_soc_set_ac97_ops(NULL);15871587-15881676error_ac97_ops:15891589- if (fsl_ssi_is_ac97(ssi_private))15901590- mutex_destroy(&ssi_private->ac97_reg_lock);16771677+ if (fsl_ssi_is_ac97(ssi))16781678+ mutex_destroy(&ssi->ac97_reg_lock);1591167915921592- if (ssi_private->soc->imx)15931593- fsl_ssi_imx_clean(pdev, ssi_private);16801680+ if (ssi->soc->imx)16811681+ fsl_ssi_imx_clean(pdev, ssi);1594168215951683 return ret;15961684}1597168515981686static int fsl_ssi_remove(struct platform_device *pdev)15991687{16001600- struct fsl_ssi_private *ssi_private = dev_get_drvdata(&pdev->dev);16881688+ struct fsl_ssi *ssi = dev_get_drvdata(&pdev->dev);1601168916021602- fsl_ssi_debugfs_remove(&ssi_private->dbg_stats);16901690+ fsl_ssi_debugfs_remove(&ssi->dbg_stats);1603169116041604- if (ssi_private->pdev)16051605- platform_device_unregister(ssi_private->pdev);16921692+ if (ssi->pdev)16931693+ platform_device_unregister(ssi->pdev);1606169416071607- if (ssi_private->soc->imx)16081608- fsl_ssi_imx_clean(pdev, ssi_private);16951695+ if (ssi->soc->imx)16961696+ fsl_ssi_imx_clean(pdev, ssi);1609169716101610- if (fsl_ssi_is_ac97(ssi_private)) {16981698+ if (fsl_ssi_is_ac97(ssi)) {16111699 snd_soc_set_ac97_ops(NULL);16121612- mutex_destroy(&ssi_private->ac97_reg_lock);17001700+ mutex_destroy(&ssi->ac97_reg_lock);16131701 }1614170216151703 return 0;···16161708#ifdef CONFIG_PM_SLEEP16171709static int fsl_ssi_suspend(struct device *dev)16181710{16191619- struct fsl_ssi_private *ssi_private = dev_get_drvdata(dev);16201620- struct regmap *regs = ssi_private->regs;17111711+ struct fsl_ssi *ssi = dev_get_drvdata(dev);17121712+ struct regmap *regs = ssi->regs;1621171316221622- regmap_read(regs, CCSR_SSI_SFCSR,16231623- &ssi_private->regcache_sfcsr);16241624- regmap_read(regs, CCSR_SSI_SACNT,16251625- &ssi_private->regcache_sacnt);17141714+ regmap_read(regs, REG_SSI_SFCSR, &ssi->regcache_sfcsr);17151715+ regmap_read(regs, REG_SSI_SACNT, &ssi->regcache_sacnt);1626171616271717 regcache_cache_only(regs, true);16281718 regcache_mark_dirty(regs);···1630172416311725static int fsl_ssi_resume(struct device *dev)16321726{16331633- struct fsl_ssi_private *ssi_private = dev_get_drvdata(dev);16341634- struct regmap *regs = ssi_private->regs;17271727+ struct fsl_ssi *ssi = dev_get_drvdata(dev);17281728+ struct regmap *regs = ssi->regs;1635172916361730 regcache_cache_only(regs, false);1637173116381638- regmap_update_bits(regs, CCSR_SSI_SFCSR,16391639- CCSR_SSI_SFCSR_RFWM1_MASK | CCSR_SSI_SFCSR_TFWM1_MASK |16401640- CCSR_SSI_SFCSR_RFWM0_MASK | CCSR_SSI_SFCSR_TFWM0_MASK,16411641- ssi_private->regcache_sfcsr);16421642- regmap_write(regs, CCSR_SSI_SACNT,16431643- ssi_private->regcache_sacnt);17321732+ regmap_update_bits(regs, REG_SSI_SFCSR,17331733+ SSI_SFCSR_RFWM1_MASK | SSI_SFCSR_TFWM1_MASK |17341734+ SSI_SFCSR_RFWM0_MASK | SSI_SFCSR_TFWM0_MASK,17351735+ ssi->regcache_sfcsr);17361736+ regmap_write(regs, REG_SSI_SACNT, ssi->regcache_sacnt);1644173716451738 return regcache_sync(regs);16461739}
···18181919void fsl_ssi_dbg_isr(struct fsl_ssi_dbg *dbg, u32 sisr)2020{2121- if (sisr & CCSR_SSI_SISR_RFRC)2121+ if (sisr & SSI_SISR_RFRC)2222 dbg->stats.rfrc++;23232424- if (sisr & CCSR_SSI_SISR_TFRC)2424+ if (sisr & SSI_SISR_TFRC)2525 dbg->stats.tfrc++;26262727- if (sisr & CCSR_SSI_SISR_CMDAU)2727+ if (sisr & SSI_SISR_CMDAU)2828 dbg->stats.cmdau++;29293030- if (sisr & CCSR_SSI_SISR_CMDDU)3030+ if (sisr & SSI_SISR_CMDDU)3131 dbg->stats.cmddu++;32323333- if (sisr & CCSR_SSI_SISR_RXT)3333+ if (sisr & SSI_SISR_RXT)3434 dbg->stats.rxt++;35353636- if (sisr & CCSR_SSI_SISR_RDR1)3636+ if (sisr & SSI_SISR_RDR1)3737 dbg->stats.rdr1++;38383939- if (sisr & CCSR_SSI_SISR_RDR0)3939+ if (sisr & SSI_SISR_RDR0)4040 dbg->stats.rdr0++;41414242- if (sisr & CCSR_SSI_SISR_TDE1)4242+ if (sisr & SSI_SISR_TDE1)4343 dbg->stats.tde1++;44444545- if (sisr & CCSR_SSI_SISR_TDE0)4545+ if (sisr & SSI_SISR_TDE0)4646 dbg->stats.tde0++;47474848- if (sisr & CCSR_SSI_SISR_ROE1)4848+ if (sisr & SSI_SISR_ROE1)4949 dbg->stats.roe1++;50505151- if (sisr & CCSR_SSI_SISR_ROE0)5151+ if (sisr & SSI_SISR_ROE0)5252 dbg->stats.roe0++;53535454- if (sisr & CCSR_SSI_SISR_TUE1)5454+ if (sisr & SSI_SISR_TUE1)5555 dbg->stats.tue1++;56565757- if (sisr & CCSR_SSI_SISR_TUE0)5757+ if (sisr & SSI_SISR_TUE0)5858 dbg->stats.tue0++;59596060- if (sisr & CCSR_SSI_SISR_TFS)6060+ if (sisr & SSI_SISR_TFS)6161 dbg->stats.tfs++;62626363- if (sisr & CCSR_SSI_SISR_RFS)6363+ if (sisr & SSI_SISR_RFS)6464 dbg->stats.rfs++;65656666- if (sisr & CCSR_SSI_SISR_TLS)6666+ if (sisr & SSI_SISR_TLS)6767 dbg->stats.tls++;68686969- if (sisr & CCSR_SSI_SISR_RLS)6969+ if (sisr & SSI_SISR_RLS)7070 dbg->stats.rls++;71717272- if (sisr & CCSR_SSI_SISR_RFF1)7272+ if (sisr & SSI_SISR_RFF1)7373 dbg->stats.rff1++;74747575- if (sisr & CCSR_SSI_SISR_RFF0)7575+ if (sisr & SSI_SISR_RFF0)7676 dbg->stats.rff0++;77777878- if (sisr & CCSR_SSI_SISR_TFE1)7878+ if (sisr & SSI_SISR_TFE1)7979 dbg->stats.tfe1++;80808181- if (sisr & CCSR_SSI_SISR_TFE0)8181+ if (sisr & SSI_SISR_TFE0)8282 dbg->stats.tfe0++;8383}84848585-/* Show the statistics of a flag only if its interrupt is enabled. The8686- * compiler will optimze this code to a no-op if the interrupt is not8787- * enabled.8585+/**8686+ * Show the statistics of a flag only if its interrupt is enabled8787+ *8888+ * Compilers will optimize it to a no-op if the interrupt is disabled8889 */8990#define SIER_SHOW(flag, name) \9091 do { \9191- if (CCSR_SSI_SIER_##flag) \9292+ if (SSI_SIER_##flag) \9293 seq_printf(s, #name "=%u\n", ssi_dbg->stats.name); \9394 } while (0)949595969697/**9797- * fsl_sysfs_ssi_show: display SSI statistics9898+ * Display the statistics for the current SSI device9899 *9999- * Display the statistics for the current SSI device. To avoid confusion,100100- * we only show those counts that are enabled.100100+ * To avoid confusion, only show those counts that are enabled101101 */102102static int fsl_ssi_stats_show(struct seq_file *s, void *unused)103103{···147147 return -ENOMEM;148148149149 ssi_dbg->dbg_stats = debugfs_create_file("stats", S_IRUGO,150150- ssi_dbg->dbg_dir, ssi_dbg, &fsl_ssi_stats_ops);150150+ ssi_dbg->dbg_dir, ssi_dbg,151151+ &fsl_ssi_stats_ops);151152 if (!ssi_dbg->dbg_stats) {152153 debugfs_remove(ssi_dbg->dbg_dir);153154 return -ENOMEM;