0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #include <linux/init.h>
0029 #include <linux/io.h>
0030 #include <linux/module.h>
0031 #include <linux/interrupt.h>
0032 #include <linux/clk.h>
0033 #include <linux/ctype.h>
0034 #include <linux/device.h>
0035 #include <linux/delay.h>
0036 #include <linux/mutex.h>
0037 #include <linux/slab.h>
0038 #include <linux/spinlock.h>
0039 #include <linux/of.h>
0040 #include <linux/of_address.h>
0041 #include <linux/of_irq.h>
0042 #include <linux/of_platform.h>
0043 #include <linux/dma/imx-dma.h>
0044
0045 #include <sound/core.h>
0046 #include <sound/pcm.h>
0047 #include <sound/pcm_params.h>
0048 #include <sound/initval.h>
0049 #include <sound/soc.h>
0050 #include <sound/dmaengine_pcm.h>
0051
0052 #include "fsl_ssi.h"
0053 #include "imx-pcm.h"
0054
0055
0056 #define RX 0
0057 #define TX 1
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071 #ifdef __BIG_ENDIAN
0072 #define FSLSSI_I2S_FORMATS \
0073 (SNDRV_PCM_FMTBIT_S8 | \
0074 SNDRV_PCM_FMTBIT_S16_BE | \
0075 SNDRV_PCM_FMTBIT_S18_3BE | \
0076 SNDRV_PCM_FMTBIT_S20_3BE | \
0077 SNDRV_PCM_FMTBIT_S24_3BE | \
0078 SNDRV_PCM_FMTBIT_S24_BE)
0079 #else
0080 #define FSLSSI_I2S_FORMATS \
0081 (SNDRV_PCM_FMTBIT_S8 | \
0082 SNDRV_PCM_FMTBIT_S16_LE | \
0083 SNDRV_PCM_FMTBIT_S18_3LE | \
0084 SNDRV_PCM_FMTBIT_S20_3LE | \
0085 SNDRV_PCM_FMTBIT_S24_3LE | \
0086 SNDRV_PCM_FMTBIT_S24_LE)
0087 #endif
0088
0089
0090
0091
0092
0093
0094 #define FSLSSI_AC97_DAIFMT \
0095 (SND_SOC_DAIFMT_AC97 | \
0096 SND_SOC_DAIFMT_BC_FP | \
0097 SND_SOC_DAIFMT_NB_NF)
0098
0099 #define FSLSSI_SIER_DBG_RX_FLAGS \
0100 (SSI_SIER_RFF0_EN | \
0101 SSI_SIER_RLS_EN | \
0102 SSI_SIER_RFS_EN | \
0103 SSI_SIER_ROE0_EN | \
0104 SSI_SIER_RFRC_EN)
0105 #define FSLSSI_SIER_DBG_TX_FLAGS \
0106 (SSI_SIER_TFE0_EN | \
0107 SSI_SIER_TLS_EN | \
0108 SSI_SIER_TFS_EN | \
0109 SSI_SIER_TUE0_EN | \
0110 SSI_SIER_TFRC_EN)
0111
0112 enum fsl_ssi_type {
0113 FSL_SSI_MCP8610,
0114 FSL_SSI_MX21,
0115 FSL_SSI_MX35,
0116 FSL_SSI_MX51,
0117 };
0118
0119 struct fsl_ssi_regvals {
0120 u32 sier;
0121 u32 srcr;
0122 u32 stcr;
0123 u32 scr;
0124 };
0125
0126 static bool fsl_ssi_readable_reg(struct device *dev, unsigned int reg)
0127 {
0128 switch (reg) {
0129 case REG_SSI_SACCEN:
0130 case REG_SSI_SACCDIS:
0131 return false;
0132 default:
0133 return true;
0134 }
0135 }
0136
0137 static bool fsl_ssi_volatile_reg(struct device *dev, unsigned int reg)
0138 {
0139 switch (reg) {
0140 case REG_SSI_STX0:
0141 case REG_SSI_STX1:
0142 case REG_SSI_SRX0:
0143 case REG_SSI_SRX1:
0144 case REG_SSI_SISR:
0145 case REG_SSI_SFCSR:
0146 case REG_SSI_SACNT:
0147 case REG_SSI_SACADD:
0148 case REG_SSI_SACDAT:
0149 case REG_SSI_SATAG:
0150 case REG_SSI_SACCST:
0151 case REG_SSI_SOR:
0152 return true;
0153 default:
0154 return false;
0155 }
0156 }
0157
0158 static bool fsl_ssi_precious_reg(struct device *dev, unsigned int reg)
0159 {
0160 switch (reg) {
0161 case REG_SSI_SRX0:
0162 case REG_SSI_SRX1:
0163 case REG_SSI_SISR:
0164 case REG_SSI_SACADD:
0165 case REG_SSI_SACDAT:
0166 case REG_SSI_SATAG:
0167 return true;
0168 default:
0169 return false;
0170 }
0171 }
0172
0173 static bool fsl_ssi_writeable_reg(struct device *dev, unsigned int reg)
0174 {
0175 switch (reg) {
0176 case REG_SSI_SRX0:
0177 case REG_SSI_SRX1:
0178 case REG_SSI_SACCST:
0179 return false;
0180 default:
0181 return true;
0182 }
0183 }
0184
0185 static const struct regmap_config fsl_ssi_regconfig = {
0186 .max_register = REG_SSI_SACCDIS,
0187 .reg_bits = 32,
0188 .val_bits = 32,
0189 .reg_stride = 4,
0190 .val_format_endian = REGMAP_ENDIAN_NATIVE,
0191 .num_reg_defaults_raw = REG_SSI_SACCDIS / sizeof(uint32_t) + 1,
0192 .readable_reg = fsl_ssi_readable_reg,
0193 .volatile_reg = fsl_ssi_volatile_reg,
0194 .precious_reg = fsl_ssi_precious_reg,
0195 .writeable_reg = fsl_ssi_writeable_reg,
0196 .cache_type = REGCACHE_FLAT,
0197 };
0198
0199 struct fsl_ssi_soc_data {
0200 bool imx;
0201 bool imx21regs;
0202 bool offline_config;
0203 u32 sisr_write_mask;
0204 };
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250 struct fsl_ssi {
0251 struct regmap *regs;
0252 int irq;
0253 struct snd_soc_dai_driver cpu_dai_drv;
0254
0255 unsigned int dai_fmt;
0256 u8 streams;
0257 u8 i2s_net;
0258 bool synchronous;
0259 bool use_dma;
0260 bool use_dual_fifo;
0261 bool use_dyna_fifo;
0262 bool has_ipg_clk_name;
0263 unsigned int fifo_depth;
0264 unsigned int slot_width;
0265 unsigned int slots;
0266 struct fsl_ssi_regvals regvals[2];
0267
0268 struct clk *clk;
0269 struct clk *baudclk;
0270 unsigned int baudclk_streams;
0271
0272 u32 regcache_sfcsr;
0273 u32 regcache_sacnt;
0274
0275 struct snd_dmaengine_dai_dma_data dma_params_tx;
0276 struct snd_dmaengine_dai_dma_data dma_params_rx;
0277 dma_addr_t ssi_phys;
0278
0279 struct imx_pcm_fiq_params fiq_params;
0280
0281 struct platform_device *card_pdev;
0282 char card_name[32];
0283 u32 card_idx;
0284
0285 struct fsl_ssi_dbg dbg_stats;
0286
0287 const struct fsl_ssi_soc_data *soc;
0288 struct device *dev;
0289
0290 u32 fifo_watermark;
0291 u32 dma_maxburst;
0292
0293 struct mutex ac97_reg_lock;
0294 struct sdma_peripheral_config audio_config[2];
0295 };
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313 static struct fsl_ssi_soc_data fsl_ssi_mpc8610 = {
0314 .imx = false,
0315 .offline_config = true,
0316 .sisr_write_mask = SSI_SISR_RFRC | SSI_SISR_TFRC |
0317 SSI_SISR_ROE0 | SSI_SISR_ROE1 |
0318 SSI_SISR_TUE0 | SSI_SISR_TUE1,
0319 };
0320
0321 static struct fsl_ssi_soc_data fsl_ssi_imx21 = {
0322 .imx = true,
0323 .imx21regs = true,
0324 .offline_config = true,
0325 .sisr_write_mask = 0,
0326 };
0327
0328 static struct fsl_ssi_soc_data fsl_ssi_imx35 = {
0329 .imx = true,
0330 .offline_config = true,
0331 .sisr_write_mask = SSI_SISR_RFRC | SSI_SISR_TFRC |
0332 SSI_SISR_ROE0 | SSI_SISR_ROE1 |
0333 SSI_SISR_TUE0 | SSI_SISR_TUE1,
0334 };
0335
0336 static struct fsl_ssi_soc_data fsl_ssi_imx51 = {
0337 .imx = true,
0338 .offline_config = false,
0339 .sisr_write_mask = SSI_SISR_ROE0 | SSI_SISR_ROE1 |
0340 SSI_SISR_TUE0 | SSI_SISR_TUE1,
0341 };
0342
0343 static const struct of_device_id fsl_ssi_ids[] = {
0344 { .compatible = "fsl,mpc8610-ssi", .data = &fsl_ssi_mpc8610 },
0345 { .compatible = "fsl,imx51-ssi", .data = &fsl_ssi_imx51 },
0346 { .compatible = "fsl,imx35-ssi", .data = &fsl_ssi_imx35 },
0347 { .compatible = "fsl,imx21-ssi", .data = &fsl_ssi_imx21 },
0348 {}
0349 };
0350 MODULE_DEVICE_TABLE(of, fsl_ssi_ids);
0351
0352 static bool fsl_ssi_is_ac97(struct fsl_ssi *ssi)
0353 {
0354 return (ssi->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK) ==
0355 SND_SOC_DAIFMT_AC97;
0356 }
0357
0358 static bool fsl_ssi_is_i2s_clock_provider(struct fsl_ssi *ssi)
0359 {
0360 return (ssi->dai_fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) ==
0361 SND_SOC_DAIFMT_BP_FP;
0362 }
0363
0364 static bool fsl_ssi_is_i2s_bc_fp(struct fsl_ssi *ssi)
0365 {
0366 return (ssi->dai_fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) ==
0367 SND_SOC_DAIFMT_BC_FP;
0368 }
0369
0370
0371
0372
0373
0374
0375 static irqreturn_t fsl_ssi_isr(int irq, void *dev_id)
0376 {
0377 struct fsl_ssi *ssi = dev_id;
0378 struct regmap *regs = ssi->regs;
0379 u32 sisr, sisr2;
0380
0381 regmap_read(regs, REG_SSI_SISR, &sisr);
0382
0383 sisr2 = sisr & ssi->soc->sisr_write_mask;
0384
0385 if (sisr2)
0386 regmap_write(regs, REG_SSI_SISR, sisr2);
0387
0388 fsl_ssi_dbg_isr(&ssi->dbg_stats, sisr);
0389
0390 return IRQ_HANDLED;
0391 }
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404 static void fsl_ssi_config_enable(struct fsl_ssi *ssi, bool tx)
0405 {
0406 struct fsl_ssi_regvals *vals = ssi->regvals;
0407 int dir = tx ? TX : RX;
0408 u32 sier, srcr, stcr;
0409
0410
0411 regmap_update_bits(ssi->regs, REG_SSI_SOR,
0412 SSI_SOR_xX_CLR(tx), SSI_SOR_xX_CLR(tx));
0413
0414
0415
0416
0417
0418
0419 if (ssi->soc->offline_config && ssi->streams)
0420 goto enable_scr;
0421
0422 if (ssi->soc->offline_config) {
0423
0424
0425
0426
0427 srcr = vals[RX].srcr | vals[TX].srcr;
0428 stcr = vals[RX].stcr | vals[TX].stcr;
0429 sier = vals[RX].sier | vals[TX].sier;
0430 } else {
0431
0432 srcr = vals[dir].srcr;
0433 stcr = vals[dir].stcr;
0434 sier = vals[dir].sier;
0435 }
0436
0437
0438 regmap_update_bits(ssi->regs, REG_SSI_SRCR, srcr, srcr);
0439 regmap_update_bits(ssi->regs, REG_SSI_STCR, stcr, stcr);
0440 regmap_update_bits(ssi->regs, REG_SSI_SIER, sier, sier);
0441
0442 enable_scr:
0443
0444
0445
0446
0447
0448
0449 if (ssi->use_dma && tx) {
0450 int try = 100;
0451 u32 sfcsr;
0452
0453
0454 regmap_update_bits(ssi->regs, REG_SSI_SCR,
0455 SSI_SCR_SSIEN, SSI_SCR_SSIEN);
0456
0457
0458 do {
0459 regmap_read(ssi->regs, REG_SSI_SFCSR, &sfcsr);
0460 if (SSI_SFCSR_TFCNT0(sfcsr))
0461 break;
0462 } while (--try);
0463
0464
0465 if (!SSI_SFCSR_TFCNT0(sfcsr))
0466 dev_warn(ssi->dev, "Timeout waiting TX FIFO filling\n");
0467 }
0468
0469 regmap_update_bits(ssi->regs, REG_SSI_SCR,
0470 vals[dir].scr, vals[dir].scr);
0471
0472
0473 ssi->streams |= BIT(dir);
0474 }
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490 #define _ssi_xor_shared_bits(vals, avals, aactive) \
0491 ((vals) ^ ((avals) * (aactive)))
0492
0493 #define ssi_excl_shared_bits(vals, avals, aactive) \
0494 ((vals) & _ssi_xor_shared_bits(vals, avals, aactive))
0495
0496
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507 static void fsl_ssi_config_disable(struct fsl_ssi *ssi, bool tx)
0508 {
0509 struct fsl_ssi_regvals *vals, *avals;
0510 u32 sier, srcr, stcr, scr;
0511 int adir = tx ? RX : TX;
0512 int dir = tx ? TX : RX;
0513 bool aactive;
0514
0515
0516 aactive = ssi->streams & BIT(adir);
0517
0518 vals = &ssi->regvals[dir];
0519
0520
0521 avals = &ssi->regvals[adir];
0522
0523
0524
0525
0526
0527 scr = ssi_excl_shared_bits(vals->scr, avals->scr, aactive);
0528
0529
0530 regmap_update_bits(ssi->regs, REG_SSI_SCR, scr, 0);
0531
0532
0533 ssi->streams &= ~BIT(dir);
0534
0535
0536
0537
0538
0539 if (ssi->soc->offline_config && aactive)
0540 goto fifo_clear;
0541
0542 if (ssi->soc->offline_config) {
0543
0544 srcr = vals->srcr | avals->srcr;
0545 stcr = vals->stcr | avals->stcr;
0546 sier = vals->sier | avals->sier;
0547 } else {
0548
0549
0550
0551
0552 sier = ssi_excl_shared_bits(vals->sier, avals->sier, aactive);
0553 srcr = ssi_excl_shared_bits(vals->srcr, avals->srcr, aactive);
0554 stcr = ssi_excl_shared_bits(vals->stcr, avals->stcr, aactive);
0555 }
0556
0557
0558 regmap_update_bits(ssi->regs, REG_SSI_SRCR, srcr, 0);
0559 regmap_update_bits(ssi->regs, REG_SSI_STCR, stcr, 0);
0560 regmap_update_bits(ssi->regs, REG_SSI_SIER, sier, 0);
0561
0562 fifo_clear:
0563
0564 regmap_update_bits(ssi->regs, REG_SSI_SOR,
0565 SSI_SOR_xX_CLR(tx), SSI_SOR_xX_CLR(tx));
0566 }
0567
0568 static void fsl_ssi_tx_ac97_saccst_setup(struct fsl_ssi *ssi)
0569 {
0570 struct regmap *regs = ssi->regs;
0571
0572
0573 if (!ssi->soc->imx21regs) {
0574
0575 regmap_write(regs, REG_SSI_SACCDIS, 0xff);
0576
0577 regmap_write(regs, REG_SSI_SACCEN, 0x300);
0578 }
0579 }
0580
0581
0582
0583
0584
0585
0586 static void fsl_ssi_setup_regvals(struct fsl_ssi *ssi)
0587 {
0588 struct fsl_ssi_regvals *vals = ssi->regvals;
0589
0590 vals[RX].sier = SSI_SIER_RFF0_EN | FSLSSI_SIER_DBG_RX_FLAGS;
0591 vals[RX].srcr = SSI_SRCR_RFEN0;
0592 vals[RX].scr = SSI_SCR_SSIEN | SSI_SCR_RE;
0593 vals[TX].sier = SSI_SIER_TFE0_EN | FSLSSI_SIER_DBG_TX_FLAGS;
0594 vals[TX].stcr = SSI_STCR_TFEN0;
0595 vals[TX].scr = SSI_SCR_SSIEN | SSI_SCR_TE;
0596
0597
0598 if (fsl_ssi_is_ac97(ssi))
0599 vals[RX].scr = vals[TX].scr = 0;
0600
0601 if (ssi->use_dual_fifo) {
0602 vals[RX].srcr |= SSI_SRCR_RFEN1;
0603 vals[TX].stcr |= SSI_STCR_TFEN1;
0604 }
0605
0606 if (ssi->use_dma) {
0607 vals[RX].sier |= SSI_SIER_RDMAE;
0608 vals[TX].sier |= SSI_SIER_TDMAE;
0609 } else {
0610 vals[RX].sier |= SSI_SIER_RIE;
0611 vals[TX].sier |= SSI_SIER_TIE;
0612 }
0613 }
0614
0615 static void fsl_ssi_setup_ac97(struct fsl_ssi *ssi)
0616 {
0617 struct regmap *regs = ssi->regs;
0618
0619
0620 regmap_write(regs, REG_SSI_STCCR, SSI_SxCCR_WL(17) | SSI_SxCCR_DC(13));
0621 regmap_write(regs, REG_SSI_SRCCR, SSI_SxCCR_WL(17) | SSI_SxCCR_DC(13));
0622
0623
0624 regmap_write(regs, REG_SSI_SACNT, SSI_SACNT_AC97EN | SSI_SACNT_FV);
0625
0626
0627 regmap_update_bits(regs, REG_SSI_SCR,
0628 SSI_SCR_SSIEN | SSI_SCR_TE | SSI_SCR_RE,
0629 SSI_SCR_SSIEN | SSI_SCR_TE | SSI_SCR_RE);
0630
0631 regmap_write(regs, REG_SSI_SOR, SSI_SOR_WAIT(3));
0632 }
0633
0634 static int fsl_ssi_startup(struct snd_pcm_substream *substream,
0635 struct snd_soc_dai *dai)
0636 {
0637 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
0638 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
0639 int ret;
0640
0641 ret = clk_prepare_enable(ssi->clk);
0642 if (ret)
0643 return ret;
0644
0645
0646
0647
0648
0649
0650
0651 if (ssi->use_dual_fifo || ssi->use_dyna_fifo)
0652 snd_pcm_hw_constraint_step(substream->runtime, 0,
0653 SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 2);
0654
0655 return 0;
0656 }
0657
0658 static void fsl_ssi_shutdown(struct snd_pcm_substream *substream,
0659 struct snd_soc_dai *dai)
0660 {
0661 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
0662 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
0663
0664 clk_disable_unprepare(ssi->clk);
0665 }
0666
0667
0668
0669
0670
0671
0672
0673
0674
0675
0676
0677
0678
0679 static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream,
0680 struct snd_soc_dai *dai,
0681 struct snd_pcm_hw_params *hw_params)
0682 {
0683 bool tx2, tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
0684 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
0685 struct regmap *regs = ssi->regs;
0686 u32 pm = 999, div2, psr, stccr, mask, afreq, factor, i;
0687 unsigned long clkrate, baudrate, tmprate;
0688 unsigned int channels = params_channels(hw_params);
0689 unsigned int slot_width = params_width(hw_params);
0690 unsigned int slots = 2;
0691 u64 sub, savesub = 100000;
0692 unsigned int freq;
0693 bool baudclk_is_used;
0694 int ret;
0695
0696
0697 if (ssi->slots)
0698 slots = ssi->slots;
0699 if (ssi->slot_width)
0700 slot_width = ssi->slot_width;
0701
0702
0703 if (channels == 2 &&
0704 (ssi->i2s_net & SSI_SCR_I2S_MODE_MASK) == SSI_SCR_I2S_MODE_MASTER)
0705 slot_width = 32;
0706
0707
0708 freq = slots * slot_width * params_rate(hw_params);
0709
0710
0711 if (IS_ERR(ssi->baudclk))
0712 return -EINVAL;
0713
0714
0715
0716
0717
0718 if (freq * 5 > clk_get_rate(ssi->clk)) {
0719 dev_err(dai->dev, "bitclk > ipgclk / 5\n");
0720 return -EINVAL;
0721 }
0722
0723 baudclk_is_used = ssi->baudclk_streams & ~(BIT(substream->stream));
0724
0725
0726 psr = 0;
0727 div2 = 0;
0728
0729 factor = (div2 + 1) * (7 * psr + 1) * 2;
0730
0731 for (i = 0; i < 255; i++) {
0732 tmprate = freq * factor * (i + 1);
0733
0734 if (baudclk_is_used)
0735 clkrate = clk_get_rate(ssi->baudclk);
0736 else
0737 clkrate = clk_round_rate(ssi->baudclk, tmprate);
0738
0739 clkrate /= factor;
0740 afreq = clkrate / (i + 1);
0741
0742 if (freq == afreq)
0743 sub = 0;
0744 else if (freq / afreq == 1)
0745 sub = freq - afreq;
0746 else if (afreq / freq == 1)
0747 sub = afreq - freq;
0748 else
0749 continue;
0750
0751
0752 sub *= 100000;
0753 do_div(sub, freq);
0754
0755 if (sub < savesub && !(i == 0)) {
0756 baudrate = tmprate;
0757 savesub = sub;
0758 pm = i;
0759 }
0760
0761
0762 if (savesub == 0)
0763 break;
0764 }
0765
0766
0767 if (pm == 999) {
0768 dev_err(dai->dev, "failed to handle the required sysclk\n");
0769 return -EINVAL;
0770 }
0771
0772 stccr = SSI_SxCCR_PM(pm + 1);
0773 mask = SSI_SxCCR_PM_MASK | SSI_SxCCR_DIV2 | SSI_SxCCR_PSR;
0774
0775
0776 tx2 = tx || ssi->synchronous;
0777 regmap_update_bits(regs, REG_SSI_SxCCR(tx2), mask, stccr);
0778
0779 if (!baudclk_is_used) {
0780 ret = clk_set_rate(ssi->baudclk, baudrate);
0781 if (ret) {
0782 dev_err(dai->dev, "failed to set baudclk rate\n");
0783 return -EINVAL;
0784 }
0785 }
0786
0787 return 0;
0788 }
0789
0790
0791
0792
0793
0794
0795
0796
0797
0798
0799
0800
0801
0802
0803
0804 static int fsl_ssi_hw_params(struct snd_pcm_substream *substream,
0805 struct snd_pcm_hw_params *hw_params,
0806 struct snd_soc_dai *dai)
0807 {
0808 bool tx2, tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
0809 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
0810 struct fsl_ssi_regvals *vals = ssi->regvals;
0811 struct regmap *regs = ssi->regs;
0812 unsigned int channels = params_channels(hw_params);
0813 unsigned int sample_size = params_width(hw_params);
0814 u32 wl = SSI_SxCCR_WL(sample_size);
0815 int ret;
0816
0817 if (fsl_ssi_is_i2s_clock_provider(ssi)) {
0818 ret = fsl_ssi_set_bclk(substream, dai, hw_params);
0819 if (ret)
0820 return ret;
0821
0822
0823 if (!(ssi->baudclk_streams & BIT(substream->stream))) {
0824 ret = clk_prepare_enable(ssi->baudclk);
0825 if (ret)
0826 return ret;
0827
0828 ssi->baudclk_streams |= BIT(substream->stream);
0829 }
0830 }
0831
0832
0833
0834
0835
0836
0837
0838 if (ssi->streams && ssi->synchronous)
0839 return 0;
0840
0841 if (!fsl_ssi_is_ac97(ssi)) {
0842
0843
0844
0845
0846
0847 u8 i2s_net = ssi->i2s_net;
0848
0849
0850 if (fsl_ssi_is_i2s_bc_fp(ssi) && sample_size == 16)
0851 i2s_net = SSI_SCR_I2S_MODE_NORMAL | SSI_SCR_NET;
0852
0853
0854 if (channels == 1)
0855 i2s_net = SSI_SCR_I2S_MODE_NORMAL;
0856
0857 regmap_update_bits(regs, REG_SSI_SCR,
0858 SSI_SCR_I2S_NET_MASK, i2s_net);
0859 }
0860
0861
0862 tx2 = tx || ssi->synchronous;
0863 regmap_update_bits(regs, REG_SSI_SxCCR(tx2), SSI_SxCCR_WL_MASK, wl);
0864
0865 if (ssi->use_dyna_fifo) {
0866 if (channels == 1) {
0867 ssi->audio_config[0].n_fifos_dst = 1;
0868 ssi->audio_config[1].n_fifos_src = 1;
0869 vals[RX].srcr &= ~SSI_SRCR_RFEN1;
0870 vals[TX].stcr &= ~SSI_STCR_TFEN1;
0871 vals[RX].scr &= ~SSI_SCR_TCH_EN;
0872 vals[TX].scr &= ~SSI_SCR_TCH_EN;
0873 } else {
0874 ssi->audio_config[0].n_fifos_dst = 2;
0875 ssi->audio_config[1].n_fifos_src = 2;
0876 vals[RX].srcr |= SSI_SRCR_RFEN1;
0877 vals[TX].stcr |= SSI_STCR_TFEN1;
0878 vals[RX].scr |= SSI_SCR_TCH_EN;
0879 vals[TX].scr |= SSI_SCR_TCH_EN;
0880 }
0881 ssi->dma_params_tx.peripheral_config = &ssi->audio_config[0];
0882 ssi->dma_params_tx.peripheral_size = sizeof(ssi->audio_config[0]);
0883 ssi->dma_params_rx.peripheral_config = &ssi->audio_config[1];
0884 ssi->dma_params_rx.peripheral_size = sizeof(ssi->audio_config[1]);
0885 }
0886
0887 return 0;
0888 }
0889
0890 static int fsl_ssi_hw_free(struct snd_pcm_substream *substream,
0891 struct snd_soc_dai *dai)
0892 {
0893 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
0894 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
0895
0896 if (fsl_ssi_is_i2s_clock_provider(ssi) &&
0897 ssi->baudclk_streams & BIT(substream->stream)) {
0898 clk_disable_unprepare(ssi->baudclk);
0899 ssi->baudclk_streams &= ~BIT(substream->stream);
0900 }
0901
0902 return 0;
0903 }
0904
0905 static int _fsl_ssi_set_dai_fmt(struct fsl_ssi *ssi, unsigned int fmt)
0906 {
0907 u32 strcr = 0, scr = 0, stcr, srcr, mask;
0908 unsigned int slots;
0909
0910 ssi->dai_fmt = fmt;
0911
0912
0913 scr |= SSI_SCR_SYNC_TX_FS;
0914
0915
0916 strcr |= SSI_STCR_TXBIT0;
0917
0918
0919 ssi->i2s_net = SSI_SCR_NET;
0920 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
0921 case SND_SOC_DAIFMT_I2S:
0922 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
0923 case SND_SOC_DAIFMT_BP_FP:
0924 if (IS_ERR(ssi->baudclk)) {
0925 dev_err(ssi->dev,
0926 "missing baudclk for master mode\n");
0927 return -EINVAL;
0928 }
0929 fallthrough;
0930 case SND_SOC_DAIFMT_BC_FP:
0931 ssi->i2s_net |= SSI_SCR_I2S_MODE_MASTER;
0932 break;
0933 case SND_SOC_DAIFMT_BC_FC:
0934 ssi->i2s_net |= SSI_SCR_I2S_MODE_SLAVE;
0935 break;
0936 default:
0937 return -EINVAL;
0938 }
0939
0940 slots = ssi->slots ? : 2;
0941 regmap_update_bits(ssi->regs, REG_SSI_STCCR,
0942 SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(slots));
0943 regmap_update_bits(ssi->regs, REG_SSI_SRCCR,
0944 SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(slots));
0945
0946
0947 strcr |= SSI_STCR_TFSI | SSI_STCR_TSCKP | SSI_STCR_TEFS;
0948 break;
0949 case SND_SOC_DAIFMT_LEFT_J:
0950
0951 strcr |= SSI_STCR_TSCKP;
0952 break;
0953 case SND_SOC_DAIFMT_DSP_A:
0954
0955 strcr |= SSI_STCR_TFSL | SSI_STCR_TSCKP | SSI_STCR_TEFS;
0956 break;
0957 case SND_SOC_DAIFMT_DSP_B:
0958
0959 strcr |= SSI_STCR_TFSL | SSI_STCR_TSCKP;
0960 break;
0961 case SND_SOC_DAIFMT_AC97:
0962
0963 strcr |= SSI_STCR_TEFS;
0964 break;
0965 default:
0966 return -EINVAL;
0967 }
0968
0969 scr |= ssi->i2s_net;
0970
0971
0972 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
0973 case SND_SOC_DAIFMT_NB_NF:
0974
0975 break;
0976 case SND_SOC_DAIFMT_IB_NF:
0977
0978 strcr ^= SSI_STCR_TSCKP;
0979 break;
0980 case SND_SOC_DAIFMT_NB_IF:
0981
0982 strcr ^= SSI_STCR_TFSI;
0983 break;
0984 case SND_SOC_DAIFMT_IB_IF:
0985
0986 strcr ^= SSI_STCR_TSCKP;
0987 strcr ^= SSI_STCR_TFSI;
0988 break;
0989 default:
0990 return -EINVAL;
0991 }
0992
0993
0994 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
0995 case SND_SOC_DAIFMT_BP_FP:
0996
0997 strcr |= SSI_STCR_TFDIR | SSI_STCR_TXDIR;
0998 scr |= SSI_SCR_SYS_CLK_EN;
0999 break;
1000 case SND_SOC_DAIFMT_BC_FC:
1001
1002 break;
1003 case SND_SOC_DAIFMT_BC_FP:
1004
1005 strcr |= SSI_STCR_TFDIR;
1006 break;
1007 default:
1008 return -EINVAL;
1009 }
1010
1011 stcr = strcr;
1012 srcr = strcr;
1013
1014
1015 if (ssi->synchronous || fsl_ssi_is_ac97(ssi)) {
1016 srcr &= ~SSI_SRCR_RXDIR;
1017 scr |= SSI_SCR_SYN;
1018 }
1019
1020 mask = SSI_STCR_TFDIR | SSI_STCR_TXDIR | SSI_STCR_TSCKP |
1021 SSI_STCR_TFSL | SSI_STCR_TFSI | SSI_STCR_TEFS | SSI_STCR_TXBIT0;
1022
1023 regmap_update_bits(ssi->regs, REG_SSI_STCR, mask, stcr);
1024 regmap_update_bits(ssi->regs, REG_SSI_SRCR, mask, srcr);
1025
1026 mask = SSI_SCR_SYNC_TX_FS | SSI_SCR_I2S_MODE_MASK |
1027 SSI_SCR_SYS_CLK_EN | SSI_SCR_SYN;
1028 regmap_update_bits(ssi->regs, REG_SSI_SCR, mask, scr);
1029
1030 return 0;
1031 }
1032
1033
1034
1035
1036
1037
1038 static int fsl_ssi_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
1039 {
1040 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
1041
1042
1043 if (fsl_ssi_is_ac97(ssi))
1044 return 0;
1045
1046 return _fsl_ssi_set_dai_fmt(ssi, fmt);
1047 }
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057 static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask,
1058 u32 rx_mask, int slots, int slot_width)
1059 {
1060 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
1061 struct regmap *regs = ssi->regs;
1062 u32 val;
1063
1064
1065 if (slot_width & 1 || slot_width < 8 || slot_width > 24) {
1066 dev_err(dai->dev, "invalid slot width: %d\n", slot_width);
1067 return -EINVAL;
1068 }
1069
1070
1071 if (ssi->i2s_net && slots < 2) {
1072 dev_err(dai->dev, "slot number should be >= 2 in I2S or NET\n");
1073 return -EINVAL;
1074 }
1075
1076 regmap_update_bits(regs, REG_SSI_STCCR,
1077 SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(slots));
1078 regmap_update_bits(regs, REG_SSI_SRCCR,
1079 SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(slots));
1080
1081
1082 regmap_read(regs, REG_SSI_SCR, &val);
1083
1084 regmap_update_bits(regs, REG_SSI_SCR, SSI_SCR_SSIEN, SSI_SCR_SSIEN);
1085
1086 regmap_write(regs, REG_SSI_STMSK, ~tx_mask);
1087 regmap_write(regs, REG_SSI_SRMSK, ~rx_mask);
1088
1089
1090 regmap_update_bits(regs, REG_SSI_SCR, SSI_SCR_SSIEN, val);
1091
1092 ssi->slot_width = slot_width;
1093 ssi->slots = slots;
1094
1095 return 0;
1096 }
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107 static int fsl_ssi_trigger(struct snd_pcm_substream *substream, int cmd,
1108 struct snd_soc_dai *dai)
1109 {
1110 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
1111 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0));
1112 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
1113
1114 switch (cmd) {
1115 case SNDRV_PCM_TRIGGER_START:
1116 case SNDRV_PCM_TRIGGER_RESUME:
1117 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1118
1119
1120
1121
1122
1123
1124
1125 if (tx && fsl_ssi_is_ac97(ssi))
1126 fsl_ssi_tx_ac97_saccst_setup(ssi);
1127 fsl_ssi_config_enable(ssi, tx);
1128 break;
1129
1130 case SNDRV_PCM_TRIGGER_STOP:
1131 case SNDRV_PCM_TRIGGER_SUSPEND:
1132 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1133 fsl_ssi_config_disable(ssi, tx);
1134 break;
1135
1136 default:
1137 return -EINVAL;
1138 }
1139
1140 return 0;
1141 }
1142
1143 static int fsl_ssi_dai_probe(struct snd_soc_dai *dai)
1144 {
1145 struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
1146
1147 if (ssi->soc->imx && ssi->use_dma)
1148 snd_soc_dai_init_dma_data(dai, &ssi->dma_params_tx,
1149 &ssi->dma_params_rx);
1150
1151 return 0;
1152 }
1153
1154 static const struct snd_soc_dai_ops fsl_ssi_dai_ops = {
1155 .startup = fsl_ssi_startup,
1156 .shutdown = fsl_ssi_shutdown,
1157 .hw_params = fsl_ssi_hw_params,
1158 .hw_free = fsl_ssi_hw_free,
1159 .set_fmt = fsl_ssi_set_dai_fmt,
1160 .set_tdm_slot = fsl_ssi_set_dai_tdm_slot,
1161 .trigger = fsl_ssi_trigger,
1162 };
1163
1164 static struct snd_soc_dai_driver fsl_ssi_dai_template = {
1165 .probe = fsl_ssi_dai_probe,
1166 .playback = {
1167 .stream_name = "CPU-Playback",
1168 .channels_min = 1,
1169 .channels_max = 32,
1170 .rates = SNDRV_PCM_RATE_CONTINUOUS,
1171 .formats = FSLSSI_I2S_FORMATS,
1172 },
1173 .capture = {
1174 .stream_name = "CPU-Capture",
1175 .channels_min = 1,
1176 .channels_max = 32,
1177 .rates = SNDRV_PCM_RATE_CONTINUOUS,
1178 .formats = FSLSSI_I2S_FORMATS,
1179 },
1180 .ops = &fsl_ssi_dai_ops,
1181 };
1182
1183 static const struct snd_soc_component_driver fsl_ssi_component = {
1184 .name = "fsl-ssi",
1185 .legacy_dai_naming = 1,
1186 };
1187
1188 static struct snd_soc_dai_driver fsl_ssi_ac97_dai = {
1189 .symmetric_channels = 1,
1190 .probe = fsl_ssi_dai_probe,
1191 .playback = {
1192 .stream_name = "AC97 Playback",
1193 .channels_min = 2,
1194 .channels_max = 2,
1195 .rates = SNDRV_PCM_RATE_8000_48000,
1196 .formats = SNDRV_PCM_FMTBIT_S16 | SNDRV_PCM_FMTBIT_S20,
1197 },
1198 .capture = {
1199 .stream_name = "AC97 Capture",
1200 .channels_min = 2,
1201 .channels_max = 2,
1202 .rates = SNDRV_PCM_RATE_48000,
1203
1204 .formats = SNDRV_PCM_FMTBIT_S20,
1205 },
1206 .ops = &fsl_ssi_dai_ops,
1207 };
1208
1209 static struct fsl_ssi *fsl_ac97_data;
1210
1211 static void fsl_ssi_ac97_write(struct snd_ac97 *ac97, unsigned short reg,
1212 unsigned short val)
1213 {
1214 struct regmap *regs = fsl_ac97_data->regs;
1215 unsigned int lreg;
1216 unsigned int lval;
1217 int ret;
1218
1219 if (reg > 0x7f)
1220 return;
1221
1222 mutex_lock(&fsl_ac97_data->ac97_reg_lock);
1223
1224 ret = clk_prepare_enable(fsl_ac97_data->clk);
1225 if (ret) {
1226 pr_err("ac97 write clk_prepare_enable failed: %d\n",
1227 ret);
1228 goto ret_unlock;
1229 }
1230
1231 lreg = reg << 12;
1232 regmap_write(regs, REG_SSI_SACADD, lreg);
1233
1234 lval = val << 4;
1235 regmap_write(regs, REG_SSI_SACDAT, lval);
1236
1237 regmap_update_bits(regs, REG_SSI_SACNT,
1238 SSI_SACNT_RDWR_MASK, SSI_SACNT_WR);
1239 udelay(100);
1240
1241 clk_disable_unprepare(fsl_ac97_data->clk);
1242
1243 ret_unlock:
1244 mutex_unlock(&fsl_ac97_data->ac97_reg_lock);
1245 }
1246
1247 static unsigned short fsl_ssi_ac97_read(struct snd_ac97 *ac97,
1248 unsigned short reg)
1249 {
1250 struct regmap *regs = fsl_ac97_data->regs;
1251 unsigned short val = 0;
1252 u32 reg_val;
1253 unsigned int lreg;
1254 int ret;
1255
1256 mutex_lock(&fsl_ac97_data->ac97_reg_lock);
1257
1258 ret = clk_prepare_enable(fsl_ac97_data->clk);
1259 if (ret) {
1260 pr_err("ac97 read clk_prepare_enable failed: %d\n", ret);
1261 goto ret_unlock;
1262 }
1263
1264 lreg = (reg & 0x7f) << 12;
1265 regmap_write(regs, REG_SSI_SACADD, lreg);
1266 regmap_update_bits(regs, REG_SSI_SACNT,
1267 SSI_SACNT_RDWR_MASK, SSI_SACNT_RD);
1268
1269 udelay(100);
1270
1271 regmap_read(regs, REG_SSI_SACDAT, ®_val);
1272 val = (reg_val >> 4) & 0xffff;
1273
1274 clk_disable_unprepare(fsl_ac97_data->clk);
1275
1276 ret_unlock:
1277 mutex_unlock(&fsl_ac97_data->ac97_reg_lock);
1278 return val;
1279 }
1280
1281 static struct snd_ac97_bus_ops fsl_ssi_ac97_ops = {
1282 .read = fsl_ssi_ac97_read,
1283 .write = fsl_ssi_ac97_write,
1284 };
1285
1286
1287
1288
1289
1290 static int fsl_ssi_hw_init(struct fsl_ssi *ssi)
1291 {
1292 u32 wm = ssi->fifo_watermark;
1293
1294
1295 fsl_ssi_setup_regvals(ssi);
1296
1297
1298 regmap_write(ssi->regs, REG_SSI_SFCSR,
1299 SSI_SFCSR_TFWM0(wm) | SSI_SFCSR_RFWM0(wm) |
1300 SSI_SFCSR_TFWM1(wm) | SSI_SFCSR_RFWM1(wm));
1301
1302
1303 if (ssi->use_dual_fifo)
1304 regmap_update_bits(ssi->regs, REG_SSI_SCR,
1305 SSI_SCR_TCH_EN, SSI_SCR_TCH_EN);
1306
1307
1308 if (fsl_ssi_is_ac97(ssi)) {
1309 _fsl_ssi_set_dai_fmt(ssi, ssi->dai_fmt);
1310 fsl_ssi_setup_ac97(ssi);
1311 }
1312
1313 return 0;
1314 }
1315
1316
1317
1318
1319
1320 static void fsl_ssi_hw_clean(struct fsl_ssi *ssi)
1321 {
1322
1323 if (fsl_ssi_is_ac97(ssi)) {
1324
1325 regmap_update_bits(ssi->regs, REG_SSI_SCR,
1326 SSI_SCR_TE | SSI_SCR_RE, 0);
1327
1328 regmap_write(ssi->regs, REG_SSI_SACNT, 0);
1329
1330 regmap_write(ssi->regs, REG_SSI_SOR, 0);
1331
1332 regmap_update_bits(ssi->regs, REG_SSI_SCR, SSI_SCR_SSIEN, 0);
1333 }
1334 }
1335
1336
1337
1338
1339 static void make_lowercase(char *s)
1340 {
1341 if (!s)
1342 return;
1343 for (; *s; s++)
1344 *s = tolower(*s);
1345 }
1346
1347 static int fsl_ssi_imx_probe(struct platform_device *pdev,
1348 struct fsl_ssi *ssi, void __iomem *iomem)
1349 {
1350 struct device *dev = &pdev->dev;
1351 int ret;
1352
1353
1354 if (ssi->has_ipg_clk_name)
1355 ssi->clk = devm_clk_get(dev, "ipg");
1356 else
1357 ssi->clk = devm_clk_get(dev, NULL);
1358 if (IS_ERR(ssi->clk)) {
1359 ret = PTR_ERR(ssi->clk);
1360 dev_err(dev, "failed to get clock: %d\n", ret);
1361 return ret;
1362 }
1363
1364
1365 if (!ssi->has_ipg_clk_name) {
1366 ret = clk_prepare_enable(ssi->clk);
1367 if (ret) {
1368 dev_err(dev, "clk_prepare_enable failed: %d\n", ret);
1369 return ret;
1370 }
1371 }
1372
1373
1374 ssi->baudclk = devm_clk_get(dev, "baud");
1375 if (IS_ERR(ssi->baudclk))
1376 dev_dbg(dev, "failed to get baud clock: %ld\n",
1377 PTR_ERR(ssi->baudclk));
1378
1379 ssi->dma_params_tx.maxburst = ssi->dma_maxburst;
1380 ssi->dma_params_rx.maxburst = ssi->dma_maxburst;
1381 ssi->dma_params_tx.addr = ssi->ssi_phys + REG_SSI_STX0;
1382 ssi->dma_params_rx.addr = ssi->ssi_phys + REG_SSI_SRX0;
1383
1384
1385 if (ssi->use_dual_fifo || ssi->use_dyna_fifo) {
1386 ssi->dma_params_tx.maxburst &= ~0x1;
1387 ssi->dma_params_rx.maxburst &= ~0x1;
1388 }
1389
1390 if (!ssi->use_dma) {
1391
1392
1393
1394
1395 ssi->fiq_params.irq = ssi->irq;
1396 ssi->fiq_params.base = iomem;
1397 ssi->fiq_params.dma_params_rx = &ssi->dma_params_rx;
1398 ssi->fiq_params.dma_params_tx = &ssi->dma_params_tx;
1399
1400 ret = imx_pcm_fiq_init(pdev, &ssi->fiq_params);
1401 if (ret)
1402 goto error_pcm;
1403 } else {
1404 ret = imx_pcm_dma_init(pdev);
1405 if (ret)
1406 goto error_pcm;
1407 }
1408
1409 return 0;
1410
1411 error_pcm:
1412 if (!ssi->has_ipg_clk_name)
1413 clk_disable_unprepare(ssi->clk);
1414
1415 return ret;
1416 }
1417
1418 static void fsl_ssi_imx_clean(struct platform_device *pdev, struct fsl_ssi *ssi)
1419 {
1420 if (!ssi->use_dma)
1421 imx_pcm_fiq_exit(pdev);
1422 if (!ssi->has_ipg_clk_name)
1423 clk_disable_unprepare(ssi->clk);
1424 }
1425
1426 static int fsl_ssi_probe_from_dt(struct fsl_ssi *ssi)
1427 {
1428 struct device *dev = ssi->dev;
1429 struct device_node *np = dev->of_node;
1430 const char *p, *sprop;
1431 const __be32 *iprop;
1432 u32 dmas[4];
1433 int ret;
1434
1435 ret = of_property_match_string(np, "clock-names", "ipg");
1436
1437 ssi->has_ipg_clk_name = ret >= 0;
1438
1439
1440 sprop = of_get_property(np, "fsl,mode", NULL);
1441 if (sprop && !strcmp(sprop, "ac97-slave")) {
1442 ssi->dai_fmt = FSLSSI_AC97_DAIFMT;
1443
1444 ret = of_property_read_u32(np, "cell-index", &ssi->card_idx);
1445 if (ret) {
1446 dev_err(dev, "failed to get SSI index property\n");
1447 return -EINVAL;
1448 }
1449 strcpy(ssi->card_name, "ac97-codec");
1450 } else if (!of_find_property(np, "fsl,ssi-asynchronous", NULL)) {
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460 ssi->synchronous = true;
1461 }
1462
1463
1464 ssi->use_dma = !of_property_read_bool(np, "fsl,fiq-stream-filter");
1465
1466
1467 iprop = of_get_property(np, "fsl,fifo-depth", NULL);
1468 if (iprop)
1469 ssi->fifo_depth = be32_to_cpup(iprop);
1470 else
1471 ssi->fifo_depth = 8;
1472
1473
1474 ret = of_property_read_u32_array(np, "dmas", dmas, 4);
1475 if (ssi->use_dma && !ret && dmas[2] == IMX_DMATYPE_SSI_DUAL)
1476 ssi->use_dual_fifo = true;
1477
1478 if (ssi->use_dma && !ret && dmas[2] == IMX_DMATYPE_MULTI_SAI)
1479 ssi->use_dyna_fifo = true;
1480
1481
1482
1483
1484
1485
1486
1487
1488 if (!ssi->card_name[0] && of_get_property(np, "codec-handle", NULL)) {
1489 struct device_node *root = of_find_node_by_path("/");
1490
1491 sprop = of_get_property(root, "compatible", NULL);
1492 of_node_put(root);
1493
1494 p = strrchr(sprop, ',');
1495 if (p)
1496 sprop = p + 1;
1497 snprintf(ssi->card_name, sizeof(ssi->card_name),
1498 "snd-soc-%s", sprop);
1499 make_lowercase(ssi->card_name);
1500 ssi->card_idx = 0;
1501 }
1502
1503 return 0;
1504 }
1505
1506 static int fsl_ssi_probe(struct platform_device *pdev)
1507 {
1508 struct regmap_config regconfig = fsl_ssi_regconfig;
1509 struct device *dev = &pdev->dev;
1510 struct fsl_ssi *ssi;
1511 struct resource *res;
1512 void __iomem *iomem;
1513 int ret = 0;
1514
1515 ssi = devm_kzalloc(dev, sizeof(*ssi), GFP_KERNEL);
1516 if (!ssi)
1517 return -ENOMEM;
1518
1519 ssi->dev = dev;
1520 ssi->soc = of_device_get_match_data(&pdev->dev);
1521
1522
1523 ret = fsl_ssi_probe_from_dt(ssi);
1524 if (ret)
1525 return ret;
1526
1527 if (fsl_ssi_is_ac97(ssi)) {
1528 memcpy(&ssi->cpu_dai_drv, &fsl_ssi_ac97_dai,
1529 sizeof(fsl_ssi_ac97_dai));
1530 fsl_ac97_data = ssi;
1531 } else {
1532 memcpy(&ssi->cpu_dai_drv, &fsl_ssi_dai_template,
1533 sizeof(fsl_ssi_dai_template));
1534 }
1535 ssi->cpu_dai_drv.name = dev_name(dev);
1536
1537 iomem = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
1538 if (IS_ERR(iomem))
1539 return PTR_ERR(iomem);
1540 ssi->ssi_phys = res->start;
1541
1542 if (ssi->soc->imx21regs) {
1543
1544 regconfig.max_register = REG_SSI_SRMSK;
1545 regconfig.num_reg_defaults_raw =
1546 REG_SSI_SRMSK / sizeof(uint32_t) + 1;
1547 }
1548
1549 if (ssi->has_ipg_clk_name)
1550 ssi->regs = devm_regmap_init_mmio_clk(dev, "ipg", iomem,
1551 ®config);
1552 else
1553 ssi->regs = devm_regmap_init_mmio(dev, iomem, ®config);
1554 if (IS_ERR(ssi->regs)) {
1555 dev_err(dev, "failed to init register map\n");
1556 return PTR_ERR(ssi->regs);
1557 }
1558
1559 ssi->irq = platform_get_irq(pdev, 0);
1560 if (ssi->irq < 0)
1561 return ssi->irq;
1562
1563
1564 if (ssi->synchronous && !fsl_ssi_is_ac97(ssi)) {
1565 ssi->cpu_dai_drv.symmetric_rate = 1;
1566 ssi->cpu_dai_drv.symmetric_channels = 1;
1567 ssi->cpu_dai_drv.symmetric_sample_bits = 1;
1568 }
1569
1570
1571
1572
1573
1574
1575
1576 switch (ssi->fifo_depth) {
1577 case 15:
1578
1579
1580
1581
1582
1583
1584
1585
1586 ssi->fifo_watermark = 8;
1587 ssi->dma_maxburst = 8;
1588 break;
1589 case 8:
1590 default:
1591
1592 ssi->fifo_watermark = ssi->fifo_depth - 2;
1593 ssi->dma_maxburst = ssi->fifo_depth - 2;
1594 break;
1595 }
1596
1597 dev_set_drvdata(dev, ssi);
1598
1599 if (ssi->soc->imx) {
1600 ret = fsl_ssi_imx_probe(pdev, ssi, iomem);
1601 if (ret)
1602 return ret;
1603 }
1604
1605 if (fsl_ssi_is_ac97(ssi)) {
1606 mutex_init(&ssi->ac97_reg_lock);
1607 ret = snd_soc_set_ac97_ops_of_reset(&fsl_ssi_ac97_ops, pdev);
1608 if (ret) {
1609 dev_err(dev, "failed to set AC'97 ops\n");
1610 goto error_ac97_ops;
1611 }
1612 }
1613
1614 ret = devm_snd_soc_register_component(dev, &fsl_ssi_component,
1615 &ssi->cpu_dai_drv, 1);
1616 if (ret) {
1617 dev_err(dev, "failed to register DAI: %d\n", ret);
1618 goto error_asoc_register;
1619 }
1620
1621 if (ssi->use_dma) {
1622 ret = devm_request_irq(dev, ssi->irq, fsl_ssi_isr, 0,
1623 dev_name(dev), ssi);
1624 if (ret < 0) {
1625 dev_err(dev, "failed to claim irq %u\n", ssi->irq);
1626 goto error_asoc_register;
1627 }
1628 }
1629
1630 fsl_ssi_debugfs_create(&ssi->dbg_stats, dev);
1631
1632
1633 fsl_ssi_hw_init(ssi);
1634
1635
1636 if (ssi->card_name[0]) {
1637 struct device *parent = dev;
1638
1639
1640
1641
1642
1643
1644 if (fsl_ssi_is_ac97(ssi))
1645 parent = NULL;
1646
1647 ssi->card_pdev = platform_device_register_data(parent,
1648 ssi->card_name, ssi->card_idx, NULL, 0);
1649 if (IS_ERR(ssi->card_pdev)) {
1650 ret = PTR_ERR(ssi->card_pdev);
1651 dev_err(dev, "failed to register %s: %d\n",
1652 ssi->card_name, ret);
1653 goto error_sound_card;
1654 }
1655 }
1656
1657 return 0;
1658
1659 error_sound_card:
1660 fsl_ssi_debugfs_remove(&ssi->dbg_stats);
1661 error_asoc_register:
1662 if (fsl_ssi_is_ac97(ssi))
1663 snd_soc_set_ac97_ops(NULL);
1664 error_ac97_ops:
1665 if (fsl_ssi_is_ac97(ssi))
1666 mutex_destroy(&ssi->ac97_reg_lock);
1667
1668 if (ssi->soc->imx)
1669 fsl_ssi_imx_clean(pdev, ssi);
1670
1671 return ret;
1672 }
1673
1674 static int fsl_ssi_remove(struct platform_device *pdev)
1675 {
1676 struct fsl_ssi *ssi = dev_get_drvdata(&pdev->dev);
1677
1678 fsl_ssi_debugfs_remove(&ssi->dbg_stats);
1679
1680 if (ssi->card_pdev)
1681 platform_device_unregister(ssi->card_pdev);
1682
1683
1684 fsl_ssi_hw_clean(ssi);
1685
1686 if (ssi->soc->imx)
1687 fsl_ssi_imx_clean(pdev, ssi);
1688
1689 if (fsl_ssi_is_ac97(ssi)) {
1690 snd_soc_set_ac97_ops(NULL);
1691 mutex_destroy(&ssi->ac97_reg_lock);
1692 }
1693
1694 return 0;
1695 }
1696
1697 #ifdef CONFIG_PM_SLEEP
1698 static int fsl_ssi_suspend(struct device *dev)
1699 {
1700 struct fsl_ssi *ssi = dev_get_drvdata(dev);
1701 struct regmap *regs = ssi->regs;
1702
1703 regmap_read(regs, REG_SSI_SFCSR, &ssi->regcache_sfcsr);
1704 regmap_read(regs, REG_SSI_SACNT, &ssi->regcache_sacnt);
1705
1706 regcache_cache_only(regs, true);
1707 regcache_mark_dirty(regs);
1708
1709 return 0;
1710 }
1711
1712 static int fsl_ssi_resume(struct device *dev)
1713 {
1714 struct fsl_ssi *ssi = dev_get_drvdata(dev);
1715 struct regmap *regs = ssi->regs;
1716
1717 regcache_cache_only(regs, false);
1718
1719 regmap_update_bits(regs, REG_SSI_SFCSR,
1720 SSI_SFCSR_RFWM1_MASK | SSI_SFCSR_TFWM1_MASK |
1721 SSI_SFCSR_RFWM0_MASK | SSI_SFCSR_TFWM0_MASK,
1722 ssi->regcache_sfcsr);
1723 regmap_write(regs, REG_SSI_SACNT, ssi->regcache_sacnt);
1724
1725 return regcache_sync(regs);
1726 }
1727 #endif
1728
1729 static const struct dev_pm_ops fsl_ssi_pm = {
1730 SET_SYSTEM_SLEEP_PM_OPS(fsl_ssi_suspend, fsl_ssi_resume)
1731 };
1732
1733 static struct platform_driver fsl_ssi_driver = {
1734 .driver = {
1735 .name = "fsl-ssi-dai",
1736 .of_match_table = fsl_ssi_ids,
1737 .pm = &fsl_ssi_pm,
1738 },
1739 .probe = fsl_ssi_probe,
1740 .remove = fsl_ssi_remove,
1741 };
1742
1743 module_platform_driver(fsl_ssi_driver);
1744
1745 MODULE_ALIAS("platform:fsl-ssi-dai");
1746 MODULE_AUTHOR("Timur Tabi <timur@freescale.com>");
1747 MODULE_DESCRIPTION("Freescale Synchronous Serial Interface (SSI) ASoC Driver");
1748 MODULE_LICENSE("GPL v2");