This source file includes following definitions.
- fsl_ssi_readable_reg
- fsl_ssi_volatile_reg
- fsl_ssi_precious_reg
- fsl_ssi_writeable_reg
- fsl_ssi_is_ac97
- fsl_ssi_is_i2s_master
- fsl_ssi_is_i2s_cbm_cfs
- fsl_ssi_isr
- fsl_ssi_config_enable
- fsl_ssi_config_disable
- fsl_ssi_tx_ac97_saccst_setup
- fsl_ssi_setup_regvals
- fsl_ssi_setup_ac97
- fsl_ssi_startup
- fsl_ssi_shutdown
- fsl_ssi_set_bclk
- fsl_ssi_hw_params
- fsl_ssi_hw_free
- _fsl_ssi_set_dai_fmt
- fsl_ssi_set_dai_fmt
- fsl_ssi_set_dai_tdm_slot
- fsl_ssi_trigger
- fsl_ssi_dai_probe
- fsl_ssi_ac97_write
- fsl_ssi_ac97_read
- fsl_ssi_hw_init
- fsl_ssi_hw_clean
- make_lowercase
- fsl_ssi_imx_probe
- fsl_ssi_imx_clean
- fsl_ssi_probe_from_dt
- fsl_ssi_probe
- fsl_ssi_remove
- fsl_ssi_suspend
- fsl_ssi_resume
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27 
  28 #include <linux/init.h>
  29 #include <linux/io.h>
  30 #include <linux/module.h>
  31 #include <linux/interrupt.h>
  32 #include <linux/clk.h>
  33 #include <linux/ctype.h>
  34 #include <linux/device.h>
  35 #include <linux/delay.h>
  36 #include <linux/mutex.h>
  37 #include <linux/slab.h>
  38 #include <linux/spinlock.h>
  39 #include <linux/of.h>
  40 #include <linux/of_address.h>
  41 #include <linux/of_irq.h>
  42 #include <linux/of_platform.h>
  43 
  44 #include <sound/core.h>
  45 #include <sound/pcm.h>
  46 #include <sound/pcm_params.h>
  47 #include <sound/initval.h>
  48 #include <sound/soc.h>
  49 #include <sound/dmaengine_pcm.h>
  50 
  51 #include "fsl_ssi.h"
  52 #include "imx-pcm.h"
  53 
  54 
  55 #define RX 0
  56 #define TX 1
  57 
  58 
  59 
  60 
  61 
  62 
  63 
  64 
  65 
  66 
  67 
  68 
  69 
  70 #ifdef __BIG_ENDIAN
  71 #define FSLSSI_I2S_FORMATS \
  72         (SNDRV_PCM_FMTBIT_S8 | \
  73          SNDRV_PCM_FMTBIT_S16_BE | \
  74          SNDRV_PCM_FMTBIT_S18_3BE | \
  75          SNDRV_PCM_FMTBIT_S20_3BE | \
  76          SNDRV_PCM_FMTBIT_S24_3BE | \
  77          SNDRV_PCM_FMTBIT_S24_BE)
  78 #else
  79 #define FSLSSI_I2S_FORMATS \
  80         (SNDRV_PCM_FMTBIT_S8 | \
  81          SNDRV_PCM_FMTBIT_S16_LE | \
  82          SNDRV_PCM_FMTBIT_S18_3LE | \
  83          SNDRV_PCM_FMTBIT_S20_3LE | \
  84          SNDRV_PCM_FMTBIT_S24_3LE | \
  85          SNDRV_PCM_FMTBIT_S24_LE)
  86 #endif
  87 
  88 
  89 
  90 
  91 
  92 
  93 #define FSLSSI_AC97_DAIFMT \
  94         (SND_SOC_DAIFMT_AC97 | \
  95          SND_SOC_DAIFMT_CBM_CFS | \
  96          SND_SOC_DAIFMT_NB_NF)
  97 
  98 #define FSLSSI_SIER_DBG_RX_FLAGS \
  99         (SSI_SIER_RFF0_EN | \
 100          SSI_SIER_RLS_EN | \
 101          SSI_SIER_RFS_EN | \
 102          SSI_SIER_ROE0_EN | \
 103          SSI_SIER_RFRC_EN)
 104 #define FSLSSI_SIER_DBG_TX_FLAGS \
 105         (SSI_SIER_TFE0_EN | \
 106          SSI_SIER_TLS_EN | \
 107          SSI_SIER_TFS_EN | \
 108          SSI_SIER_TUE0_EN | \
 109          SSI_SIER_TFRC_EN)
 110 
 111 enum fsl_ssi_type {
 112         FSL_SSI_MCP8610,
 113         FSL_SSI_MX21,
 114         FSL_SSI_MX35,
 115         FSL_SSI_MX51,
 116 };
 117 
 118 struct fsl_ssi_regvals {
 119         u32 sier;
 120         u32 srcr;
 121         u32 stcr;
 122         u32 scr;
 123 };
 124 
 125 static bool fsl_ssi_readable_reg(struct device *dev, unsigned int reg)
 126 {
 127         switch (reg) {
 128         case REG_SSI_SACCEN:
 129         case REG_SSI_SACCDIS:
 130                 return false;
 131         default:
 132                 return true;
 133         }
 134 }
 135 
 136 static bool fsl_ssi_volatile_reg(struct device *dev, unsigned int reg)
 137 {
 138         switch (reg) {
 139         case REG_SSI_STX0:
 140         case REG_SSI_STX1:
 141         case REG_SSI_SRX0:
 142         case REG_SSI_SRX1:
 143         case REG_SSI_SISR:
 144         case REG_SSI_SFCSR:
 145         case REG_SSI_SACNT:
 146         case REG_SSI_SACADD:
 147         case REG_SSI_SACDAT:
 148         case REG_SSI_SATAG:
 149         case REG_SSI_SACCST:
 150         case REG_SSI_SOR:
 151                 return true;
 152         default:
 153                 return false;
 154         }
 155 }
 156 
 157 static bool fsl_ssi_precious_reg(struct device *dev, unsigned int reg)
 158 {
 159         switch (reg) {
 160         case REG_SSI_SRX0:
 161         case REG_SSI_SRX1:
 162         case REG_SSI_SISR:
 163         case REG_SSI_SACADD:
 164         case REG_SSI_SACDAT:
 165         case REG_SSI_SATAG:
 166                 return true;
 167         default:
 168                 return false;
 169         }
 170 }
 171 
 172 static bool fsl_ssi_writeable_reg(struct device *dev, unsigned int reg)
 173 {
 174         switch (reg) {
 175         case REG_SSI_SRX0:
 176         case REG_SSI_SRX1:
 177         case REG_SSI_SACCST:
 178                 return false;
 179         default:
 180                 return true;
 181         }
 182 }
 183 
 184 static const struct regmap_config fsl_ssi_regconfig = {
 185         .max_register = REG_SSI_SACCDIS,
 186         .reg_bits = 32,
 187         .val_bits = 32,
 188         .reg_stride = 4,
 189         .val_format_endian = REGMAP_ENDIAN_NATIVE,
 190         .num_reg_defaults_raw = REG_SSI_SACCDIS / sizeof(uint32_t) + 1,
 191         .readable_reg = fsl_ssi_readable_reg,
 192         .volatile_reg = fsl_ssi_volatile_reg,
 193         .precious_reg = fsl_ssi_precious_reg,
 194         .writeable_reg = fsl_ssi_writeable_reg,
 195         .cache_type = REGCACHE_FLAT,
 196 };
 197 
 198 struct fsl_ssi_soc_data {
 199         bool imx;
 200         bool imx21regs; 
 201         bool offline_config;
 202         u32 sisr_write_mask;
 203 };
 204 
 205 
 206 
 207 
 208 
 209 
 210 
 211 
 212 
 213 
 214 
 215 
 216 
 217 
 218 
 219 
 220 
 221 
 222 
 223 
 224 
 225 
 226 
 227 
 228 
 229 
 230 
 231 
 232 
 233 
 234 
 235 
 236 
 237 
 238 
 239 
 240 
 241 
 242 
 243 
 244 
 245 
 246 
 247 
 248 
 249 
 250 
 251 
 252 
 253 
 254 
 255 
 256 
 257 
 258 struct fsl_ssi {
 259         struct regmap *regs;
 260         int irq;
 261         struct snd_soc_dai_driver cpu_dai_drv;
 262 
 263         unsigned int dai_fmt;
 264         u8 streams;
 265         u8 i2s_net;
 266         bool synchronous;
 267         bool use_dma;
 268         bool use_dual_fifo;
 269         bool has_ipg_clk_name;
 270         unsigned int fifo_depth;
 271         unsigned int slot_width;
 272         unsigned int slots;
 273         struct fsl_ssi_regvals regvals[2];
 274 
 275         struct clk *clk;
 276         struct clk *baudclk;
 277         unsigned int baudclk_streams;
 278 
 279         u32 regcache_sfcsr;
 280         u32 regcache_sacnt;
 281 
 282         struct snd_dmaengine_dai_dma_data dma_params_tx;
 283         struct snd_dmaengine_dai_dma_data dma_params_rx;
 284         dma_addr_t ssi_phys;
 285 
 286         struct imx_pcm_fiq_params fiq_params;
 287 
 288         struct platform_device *card_pdev;
 289         char card_name[32];
 290         u32 card_idx;
 291 
 292         struct fsl_ssi_dbg dbg_stats;
 293 
 294         const struct fsl_ssi_soc_data *soc;
 295         struct device *dev;
 296 
 297         u32 fifo_watermark;
 298         u32 dma_maxburst;
 299 
 300         struct mutex ac97_reg_lock;
 301 };
 302 
 303 
 304 
 305 
 306 
 307 
 308 
 309 
 310 
 311 
 312 
 313 
 314 
 315 
 316 
 317 
 318 
 319 static struct fsl_ssi_soc_data fsl_ssi_mpc8610 = {
 320         .imx = false,
 321         .offline_config = true,
 322         .sisr_write_mask = SSI_SISR_RFRC | SSI_SISR_TFRC |
 323                            SSI_SISR_ROE0 | SSI_SISR_ROE1 |
 324                            SSI_SISR_TUE0 | SSI_SISR_TUE1,
 325 };
 326 
 327 static struct fsl_ssi_soc_data fsl_ssi_imx21 = {
 328         .imx = true,
 329         .imx21regs = true,
 330         .offline_config = true,
 331         .sisr_write_mask = 0,
 332 };
 333 
 334 static struct fsl_ssi_soc_data fsl_ssi_imx35 = {
 335         .imx = true,
 336         .offline_config = true,
 337         .sisr_write_mask = SSI_SISR_RFRC | SSI_SISR_TFRC |
 338                            SSI_SISR_ROE0 | SSI_SISR_ROE1 |
 339                            SSI_SISR_TUE0 | SSI_SISR_TUE1,
 340 };
 341 
 342 static struct fsl_ssi_soc_data fsl_ssi_imx51 = {
 343         .imx = true,
 344         .offline_config = false,
 345         .sisr_write_mask = SSI_SISR_ROE0 | SSI_SISR_ROE1 |
 346                            SSI_SISR_TUE0 | SSI_SISR_TUE1,
 347 };
 348 
 349 static const struct of_device_id fsl_ssi_ids[] = {
 350         { .compatible = "fsl,mpc8610-ssi", .data = &fsl_ssi_mpc8610 },
 351         { .compatible = "fsl,imx51-ssi", .data = &fsl_ssi_imx51 },
 352         { .compatible = "fsl,imx35-ssi", .data = &fsl_ssi_imx35 },
 353         { .compatible = "fsl,imx21-ssi", .data = &fsl_ssi_imx21 },
 354         {}
 355 };
 356 MODULE_DEVICE_TABLE(of, fsl_ssi_ids);
 357 
 358 static bool fsl_ssi_is_ac97(struct fsl_ssi *ssi)
 359 {
 360         return (ssi->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK) ==
 361                 SND_SOC_DAIFMT_AC97;
 362 }
 363 
 364 static bool fsl_ssi_is_i2s_master(struct fsl_ssi *ssi)
 365 {
 366         return (ssi->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) ==
 367                 SND_SOC_DAIFMT_CBS_CFS;
 368 }
 369 
 370 static bool fsl_ssi_is_i2s_cbm_cfs(struct fsl_ssi *ssi)
 371 {
 372         return (ssi->dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) ==
 373                 SND_SOC_DAIFMT_CBM_CFS;
 374 }
 375 
 376 
 377 
 378 
 379 static irqreturn_t fsl_ssi_isr(int irq, void *dev_id)
 380 {
 381         struct fsl_ssi *ssi = dev_id;
 382         struct regmap *regs = ssi->regs;
 383         u32 sisr, sisr2;
 384 
 385         regmap_read(regs, REG_SSI_SISR, &sisr);
 386 
 387         sisr2 = sisr & ssi->soc->sisr_write_mask;
 388         
 389         if (sisr2)
 390                 regmap_write(regs, REG_SSI_SISR, sisr2);
 391 
 392         fsl_ssi_dbg_isr(&ssi->dbg_stats, sisr);
 393 
 394         return IRQ_HANDLED;
 395 }
 396 
 397 
 398 
 399 
 400 
 401 
 402 
 403 
 404 
 405 static void fsl_ssi_config_enable(struct fsl_ssi *ssi, bool tx)
 406 {
 407         struct fsl_ssi_regvals *vals = ssi->regvals;
 408         int dir = tx ? TX : RX;
 409         u32 sier, srcr, stcr;
 410 
 411         
 412         regmap_update_bits(ssi->regs, REG_SSI_SOR,
 413                            SSI_SOR_xX_CLR(tx), SSI_SOR_xX_CLR(tx));
 414 
 415         
 416 
 417 
 418 
 419 
 420         if (ssi->soc->offline_config && ssi->streams)
 421                 goto enable_scr;
 422 
 423         if (ssi->soc->offline_config) {
 424                 
 425 
 426 
 427 
 428                 srcr = vals[RX].srcr | vals[TX].srcr;
 429                 stcr = vals[RX].stcr | vals[TX].stcr;
 430                 sier = vals[RX].sier | vals[TX].sier;
 431         } else {
 432                 
 433                 srcr = vals[dir].srcr;
 434                 stcr = vals[dir].stcr;
 435                 sier = vals[dir].sier;
 436         }
 437 
 438         
 439         regmap_update_bits(ssi->regs, REG_SSI_SRCR, srcr, srcr);
 440         regmap_update_bits(ssi->regs, REG_SSI_STCR, stcr, stcr);
 441         regmap_update_bits(ssi->regs, REG_SSI_SIER, sier, sier);
 442 
 443 enable_scr:
 444         
 445 
 446 
 447 
 448 
 449 
 450         if (ssi->use_dma && tx) {
 451                 int try = 100;
 452                 u32 sfcsr;
 453 
 454                 
 455                 regmap_update_bits(ssi->regs, REG_SSI_SCR,
 456                                    SSI_SCR_SSIEN, SSI_SCR_SSIEN);
 457 
 458                 
 459                 do {
 460                         regmap_read(ssi->regs, REG_SSI_SFCSR, &sfcsr);
 461                         if (SSI_SFCSR_TFCNT0(sfcsr))
 462                                 break;
 463                 } while (--try);
 464 
 465                 
 466                 if (!SSI_SFCSR_TFCNT0(sfcsr))
 467                         dev_warn(ssi->dev, "Timeout waiting TX FIFO filling\n");
 468         }
 469         
 470         regmap_update_bits(ssi->regs, REG_SSI_SCR,
 471                            vals[dir].scr, vals[dir].scr);
 472 
 473         
 474         ssi->streams |= BIT(dir);
 475 }
 476 
 477 
 478 
 479 
 480 
 481 
 482 
 483 
 484 
 485 
 486 
 487 
 488 
 489 
 490 
 491 #define _ssi_xor_shared_bits(vals, avals, aactive) \
 492         ((vals) ^ ((avals) * (aactive)))
 493 
 494 #define ssi_excl_shared_bits(vals, avals, aactive) \
 495         ((vals) & _ssi_xor_shared_bits(vals, avals, aactive))
 496 
 497 
 498 
 499 
 500 
 501 
 502 
 503 
 504 
 505 static void fsl_ssi_config_disable(struct fsl_ssi *ssi, bool tx)
 506 {
 507         struct fsl_ssi_regvals *vals, *avals;
 508         u32 sier, srcr, stcr, scr;
 509         int adir = tx ? RX : TX;
 510         int dir = tx ? TX : RX;
 511         bool aactive;
 512 
 513         
 514         aactive = ssi->streams & BIT(adir);
 515 
 516         vals = &ssi->regvals[dir];
 517 
 518         
 519         avals = &ssi->regvals[adir];
 520 
 521         
 522 
 523 
 524 
 525         scr = ssi_excl_shared_bits(vals->scr, avals->scr, aactive);
 526 
 527         
 528         regmap_update_bits(ssi->regs, REG_SSI_SCR, scr, 0);
 529 
 530         
 531         ssi->streams &= ~BIT(dir);
 532 
 533         
 534 
 535 
 536 
 537         if (ssi->soc->offline_config && aactive)
 538                 goto fifo_clear;
 539 
 540         if (ssi->soc->offline_config) {
 541                 
 542                 srcr = vals->srcr | avals->srcr;
 543                 stcr = vals->stcr | avals->stcr;
 544                 sier = vals->sier | avals->sier;
 545         } else {
 546                 
 547 
 548 
 549 
 550                 sier = ssi_excl_shared_bits(vals->sier, avals->sier, aactive);
 551                 srcr = ssi_excl_shared_bits(vals->srcr, avals->srcr, aactive);
 552                 stcr = ssi_excl_shared_bits(vals->stcr, avals->stcr, aactive);
 553         }
 554 
 555         
 556         regmap_update_bits(ssi->regs, REG_SSI_SRCR, srcr, 0);
 557         regmap_update_bits(ssi->regs, REG_SSI_STCR, stcr, 0);
 558         regmap_update_bits(ssi->regs, REG_SSI_SIER, sier, 0);
 559 
 560 fifo_clear:
 561         
 562         regmap_update_bits(ssi->regs, REG_SSI_SOR,
 563                            SSI_SOR_xX_CLR(tx), SSI_SOR_xX_CLR(tx));
 564 }
 565 
 566 static void fsl_ssi_tx_ac97_saccst_setup(struct fsl_ssi *ssi)
 567 {
 568         struct regmap *regs = ssi->regs;
 569 
 570         
 571         if (!ssi->soc->imx21regs) {
 572                 
 573                 regmap_write(regs, REG_SSI_SACCDIS, 0xff);
 574                 
 575                 regmap_write(regs, REG_SSI_SACCEN, 0x300);
 576         }
 577 }
 578 
 579 
 580 
 581 
 582 static void fsl_ssi_setup_regvals(struct fsl_ssi *ssi)
 583 {
 584         struct fsl_ssi_regvals *vals = ssi->regvals;
 585 
 586         vals[RX].sier = SSI_SIER_RFF0_EN | FSLSSI_SIER_DBG_RX_FLAGS;
 587         vals[RX].srcr = SSI_SRCR_RFEN0;
 588         vals[RX].scr = SSI_SCR_SSIEN | SSI_SCR_RE;
 589         vals[TX].sier = SSI_SIER_TFE0_EN | FSLSSI_SIER_DBG_TX_FLAGS;
 590         vals[TX].stcr = SSI_STCR_TFEN0;
 591         vals[TX].scr = SSI_SCR_SSIEN | SSI_SCR_TE;
 592 
 593         
 594         if (fsl_ssi_is_ac97(ssi))
 595                 vals[RX].scr = vals[TX].scr = 0;
 596 
 597         if (ssi->use_dual_fifo) {
 598                 vals[RX].srcr |= SSI_SRCR_RFEN1;
 599                 vals[TX].stcr |= SSI_STCR_TFEN1;
 600         }
 601 
 602         if (ssi->use_dma) {
 603                 vals[RX].sier |= SSI_SIER_RDMAE;
 604                 vals[TX].sier |= SSI_SIER_TDMAE;
 605         } else {
 606                 vals[RX].sier |= SSI_SIER_RIE;
 607                 vals[TX].sier |= SSI_SIER_TIE;
 608         }
 609 }
 610 
 611 static void fsl_ssi_setup_ac97(struct fsl_ssi *ssi)
 612 {
 613         struct regmap *regs = ssi->regs;
 614 
 615         
 616         regmap_write(regs, REG_SSI_STCCR, SSI_SxCCR_WL(17) | SSI_SxCCR_DC(13));
 617         regmap_write(regs, REG_SSI_SRCCR, SSI_SxCCR_WL(17) | SSI_SxCCR_DC(13));
 618 
 619         
 620         regmap_write(regs, REG_SSI_SACNT, SSI_SACNT_AC97EN | SSI_SACNT_FV);
 621 
 622         
 623         regmap_update_bits(regs, REG_SSI_SCR,
 624                            SSI_SCR_SSIEN | SSI_SCR_TE | SSI_SCR_RE,
 625                            SSI_SCR_SSIEN | SSI_SCR_TE | SSI_SCR_RE);
 626 
 627         regmap_write(regs, REG_SSI_SOR, SSI_SOR_WAIT(3));
 628 }
 629 
 630 static int fsl_ssi_startup(struct snd_pcm_substream *substream,
 631                            struct snd_soc_dai *dai)
 632 {
 633         struct snd_soc_pcm_runtime *rtd = substream->private_data;
 634         struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);
 635         int ret;
 636 
 637         ret = clk_prepare_enable(ssi->clk);
 638         if (ret)
 639                 return ret;
 640 
 641         
 642 
 643 
 644 
 645 
 646 
 647         if (ssi->use_dual_fifo)
 648                 snd_pcm_hw_constraint_step(substream->runtime, 0,
 649                                            SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 2);
 650 
 651         return 0;
 652 }
 653 
 654 static void fsl_ssi_shutdown(struct snd_pcm_substream *substream,
 655                              struct snd_soc_dai *dai)
 656 {
 657         struct snd_soc_pcm_runtime *rtd = substream->private_data;
 658         struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);
 659 
 660         clk_disable_unprepare(ssi->clk);
 661 }
 662 
 663 
 664 
 665 
 666 
 667 
 668 
 669 
 670 
 671 
 672 static int fsl_ssi_set_bclk(struct snd_pcm_substream *substream,
 673                             struct snd_soc_dai *dai,
 674                             struct snd_pcm_hw_params *hw_params)
 675 {
 676         bool tx2, tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
 677         struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
 678         struct regmap *regs = ssi->regs;
 679         u32 pm = 999, div2, psr, stccr, mask, afreq, factor, i;
 680         unsigned long clkrate, baudrate, tmprate;
 681         unsigned int slots = params_channels(hw_params);
 682         unsigned int slot_width = 32;
 683         u64 sub, savesub = 100000;
 684         unsigned int freq;
 685         bool baudclk_is_used;
 686         int ret;
 687 
 688         
 689         if (ssi->slots)
 690                 slots = ssi->slots;
 691         
 692         if (ssi->slot_width && slots != 2)
 693                 slot_width = ssi->slot_width;
 694 
 695         
 696         freq = slots * slot_width * params_rate(hw_params);
 697 
 698         
 699         if (IS_ERR(ssi->baudclk))
 700                 return -EINVAL;
 701 
 702         
 703 
 704 
 705 
 706         if (freq * 5 > clk_get_rate(ssi->clk)) {
 707                 dev_err(dai->dev, "bitclk > ipgclk / 5\n");
 708                 return -EINVAL;
 709         }
 710 
 711         baudclk_is_used = ssi->baudclk_streams & ~(BIT(substream->stream));
 712 
 713         
 714         psr = 0;
 715         div2 = 0;
 716 
 717         factor = (div2 + 1) * (7 * psr + 1) * 2;
 718 
 719         for (i = 0; i < 255; i++) {
 720                 tmprate = freq * factor * (i + 1);
 721 
 722                 if (baudclk_is_used)
 723                         clkrate = clk_get_rate(ssi->baudclk);
 724                 else
 725                         clkrate = clk_round_rate(ssi->baudclk, tmprate);
 726 
 727                 clkrate /= factor;
 728                 afreq = clkrate / (i + 1);
 729 
 730                 if (freq == afreq)
 731                         sub = 0;
 732                 else if (freq / afreq == 1)
 733                         sub = freq - afreq;
 734                 else if (afreq / freq == 1)
 735                         sub = afreq - freq;
 736                 else
 737                         continue;
 738 
 739                 
 740                 sub *= 100000;
 741                 do_div(sub, freq);
 742 
 743                 if (sub < savesub && !(i == 0 && psr == 0 && div2 == 0)) {
 744                         baudrate = tmprate;
 745                         savesub = sub;
 746                         pm = i;
 747                 }
 748 
 749                 
 750                 if (savesub == 0)
 751                         break;
 752         }
 753 
 754         
 755         if (pm == 999) {
 756                 dev_err(dai->dev, "failed to handle the required sysclk\n");
 757                 return -EINVAL;
 758         }
 759 
 760         stccr = SSI_SxCCR_PM(pm + 1) | (div2 ? SSI_SxCCR_DIV2 : 0) |
 761                 (psr ? SSI_SxCCR_PSR : 0);
 762         mask = SSI_SxCCR_PM_MASK | SSI_SxCCR_DIV2 | SSI_SxCCR_PSR;
 763 
 764         
 765         tx2 = tx || ssi->synchronous;
 766         regmap_update_bits(regs, REG_SSI_SxCCR(tx2), mask, stccr);
 767 
 768         if (!baudclk_is_used) {
 769                 ret = clk_set_rate(ssi->baudclk, baudrate);
 770                 if (ret) {
 771                         dev_err(dai->dev, "failed to set baudclk rate\n");
 772                         return -EINVAL;
 773                 }
 774         }
 775 
 776         return 0;
 777 }
 778 
 779 
 780 
 781 
 782 
 783 
 784 
 785 
 786 
 787 
 788 
 789 
 790 static int fsl_ssi_hw_params(struct snd_pcm_substream *substream,
 791                              struct snd_pcm_hw_params *hw_params,
 792                              struct snd_soc_dai *dai)
 793 {
 794         bool tx2, tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
 795         struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
 796         struct regmap *regs = ssi->regs;
 797         unsigned int channels = params_channels(hw_params);
 798         unsigned int sample_size = params_width(hw_params);
 799         u32 wl = SSI_SxCCR_WL(sample_size);
 800         int ret;
 801 
 802         if (fsl_ssi_is_i2s_master(ssi)) {
 803                 ret = fsl_ssi_set_bclk(substream, dai, hw_params);
 804                 if (ret)
 805                         return ret;
 806 
 807                 
 808                 if (!(ssi->baudclk_streams & BIT(substream->stream))) {
 809                         ret = clk_prepare_enable(ssi->baudclk);
 810                         if (ret)
 811                                 return ret;
 812 
 813                         ssi->baudclk_streams |= BIT(substream->stream);
 814                 }
 815         }
 816 
 817         
 818 
 819 
 820 
 821 
 822 
 823         if (ssi->streams && ssi->synchronous)
 824                 return 0;
 825 
 826         if (!fsl_ssi_is_ac97(ssi)) {
 827                 
 828 
 829 
 830 
 831 
 832                 u8 i2s_net = ssi->i2s_net;
 833 
 834                 
 835                 if (fsl_ssi_is_i2s_cbm_cfs(ssi) && sample_size == 16)
 836                         i2s_net = SSI_SCR_I2S_MODE_NORMAL | SSI_SCR_NET;
 837 
 838                 
 839                 if (channels == 1)
 840                         i2s_net = SSI_SCR_I2S_MODE_NORMAL;
 841 
 842                 regmap_update_bits(regs, REG_SSI_SCR,
 843                                    SSI_SCR_I2S_NET_MASK, i2s_net);
 844         }
 845 
 846         
 847         tx2 = tx || ssi->synchronous;
 848         regmap_update_bits(regs, REG_SSI_SxCCR(tx2), SSI_SxCCR_WL_MASK, wl);
 849 
 850         return 0;
 851 }
 852 
 853 static int fsl_ssi_hw_free(struct snd_pcm_substream *substream,
 854                            struct snd_soc_dai *dai)
 855 {
 856         struct snd_soc_pcm_runtime *rtd = substream->private_data;
 857         struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);
 858 
 859         if (fsl_ssi_is_i2s_master(ssi) &&
 860             ssi->baudclk_streams & BIT(substream->stream)) {
 861                 clk_disable_unprepare(ssi->baudclk);
 862                 ssi->baudclk_streams &= ~BIT(substream->stream);
 863         }
 864 
 865         return 0;
 866 }
 867 
 868 static int _fsl_ssi_set_dai_fmt(struct fsl_ssi *ssi, unsigned int fmt)
 869 {
 870         u32 strcr = 0, scr = 0, stcr, srcr, mask;
 871 
 872         ssi->dai_fmt = fmt;
 873 
 874         
 875         scr |= SSI_SCR_SYNC_TX_FS;
 876 
 877         
 878         strcr |= SSI_STCR_TXBIT0;
 879 
 880         
 881         ssi->i2s_net = SSI_SCR_NET;
 882         switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
 883         case SND_SOC_DAIFMT_I2S:
 884                 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
 885                 case SND_SOC_DAIFMT_CBS_CFS:
 886                         if (IS_ERR(ssi->baudclk)) {
 887                                 dev_err(ssi->dev,
 888                                         "missing baudclk for master mode\n");
 889                                 return -EINVAL;
 890                         }
 891                         
 892                 case SND_SOC_DAIFMT_CBM_CFS:
 893                         ssi->i2s_net |= SSI_SCR_I2S_MODE_MASTER;
 894                         break;
 895                 case SND_SOC_DAIFMT_CBM_CFM:
 896                         ssi->i2s_net |= SSI_SCR_I2S_MODE_SLAVE;
 897                         break;
 898                 default:
 899                         return -EINVAL;
 900                 }
 901 
 902                 regmap_update_bits(ssi->regs, REG_SSI_STCCR,
 903                                    SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(2));
 904                 regmap_update_bits(ssi->regs, REG_SSI_SRCCR,
 905                                    SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(2));
 906 
 907                 
 908                 strcr |= SSI_STCR_TFSI | SSI_STCR_TSCKP | SSI_STCR_TEFS;
 909                 break;
 910         case SND_SOC_DAIFMT_LEFT_J:
 911                 
 912                 strcr |= SSI_STCR_TSCKP;
 913                 break;
 914         case SND_SOC_DAIFMT_DSP_A:
 915                 
 916                 strcr |= SSI_STCR_TFSL | SSI_STCR_TSCKP | SSI_STCR_TEFS;
 917                 break;
 918         case SND_SOC_DAIFMT_DSP_B:
 919                 
 920                 strcr |= SSI_STCR_TFSL | SSI_STCR_TSCKP;
 921                 break;
 922         case SND_SOC_DAIFMT_AC97:
 923                 
 924                 strcr |= SSI_STCR_TEFS;
 925                 break;
 926         default:
 927                 return -EINVAL;
 928         }
 929 
 930         scr |= ssi->i2s_net;
 931 
 932         
 933         switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
 934         case SND_SOC_DAIFMT_NB_NF:
 935                 
 936                 break;
 937         case SND_SOC_DAIFMT_IB_NF:
 938                 
 939                 strcr ^= SSI_STCR_TSCKP;
 940                 break;
 941         case SND_SOC_DAIFMT_NB_IF:
 942                 
 943                 strcr ^= SSI_STCR_TFSI;
 944                 break;
 945         case SND_SOC_DAIFMT_IB_IF:
 946                 
 947                 strcr ^= SSI_STCR_TSCKP;
 948                 strcr ^= SSI_STCR_TFSI;
 949                 break;
 950         default:
 951                 return -EINVAL;
 952         }
 953 
 954         
 955         switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
 956         case SND_SOC_DAIFMT_CBS_CFS:
 957                 
 958                 strcr |= SSI_STCR_TFDIR | SSI_STCR_TXDIR;
 959                 scr |= SSI_SCR_SYS_CLK_EN;
 960                 break;
 961         case SND_SOC_DAIFMT_CBM_CFM:
 962                 
 963                 break;
 964         case SND_SOC_DAIFMT_CBM_CFS:
 965                 
 966                 strcr |= SSI_STCR_TFDIR;
 967                 break;
 968         default:
 969                 return -EINVAL;
 970         }
 971 
 972         stcr = strcr;
 973         srcr = strcr;
 974 
 975         
 976         if (ssi->synchronous || fsl_ssi_is_ac97(ssi)) {
 977                 srcr &= ~SSI_SRCR_RXDIR;
 978                 scr |= SSI_SCR_SYN;
 979         }
 980 
 981         mask = SSI_STCR_TFDIR | SSI_STCR_TXDIR | SSI_STCR_TSCKP |
 982                SSI_STCR_TFSL | SSI_STCR_TFSI | SSI_STCR_TEFS | SSI_STCR_TXBIT0;
 983 
 984         regmap_update_bits(ssi->regs, REG_SSI_STCR, mask, stcr);
 985         regmap_update_bits(ssi->regs, REG_SSI_SRCR, mask, srcr);
 986 
 987         mask = SSI_SCR_SYNC_TX_FS | SSI_SCR_I2S_MODE_MASK |
 988                SSI_SCR_SYS_CLK_EN | SSI_SCR_SYN;
 989         regmap_update_bits(ssi->regs, REG_SSI_SCR, mask, scr);
 990 
 991         return 0;
 992 }
 993 
 994 
 995 
 996 
 997 static int fsl_ssi_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
 998 {
 999         struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
1000 
1001         
1002         if (fsl_ssi_is_ac97(ssi))
1003                 return 0;
1004 
1005         return _fsl_ssi_set_dai_fmt(ssi, fmt);
1006 }
1007 
1008 
1009 
1010 
1011 static int fsl_ssi_set_dai_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask,
1012                                     u32 rx_mask, int slots, int slot_width)
1013 {
1014         struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
1015         struct regmap *regs = ssi->regs;
1016         u32 val;
1017 
1018         
1019         if (slot_width & 1 || slot_width < 8 || slot_width > 24) {
1020                 dev_err(dai->dev, "invalid slot width: %d\n", slot_width);
1021                 return -EINVAL;
1022         }
1023 
1024         
1025         if (ssi->i2s_net && slots < 2) {
1026                 dev_err(dai->dev, "slot number should be >= 2 in I2S or NET\n");
1027                 return -EINVAL;
1028         }
1029 
1030         regmap_update_bits(regs, REG_SSI_STCCR,
1031                            SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(slots));
1032         regmap_update_bits(regs, REG_SSI_SRCCR,
1033                            SSI_SxCCR_DC_MASK, SSI_SxCCR_DC(slots));
1034 
1035         
1036         regmap_read(regs, REG_SSI_SCR, &val);
1037         
1038         regmap_update_bits(regs, REG_SSI_SCR, SSI_SCR_SSIEN, SSI_SCR_SSIEN);
1039 
1040         regmap_write(regs, REG_SSI_STMSK, ~tx_mask);
1041         regmap_write(regs, REG_SSI_SRMSK, ~rx_mask);
1042 
1043         
1044         regmap_update_bits(regs, REG_SSI_SCR, SSI_SCR_SSIEN, val);
1045 
1046         ssi->slot_width = slot_width;
1047         ssi->slots = slots;
1048 
1049         return 0;
1050 }
1051 
1052 
1053 
1054 
1055 
1056 
1057 
1058 static int fsl_ssi_trigger(struct snd_pcm_substream *substream, int cmd,
1059                            struct snd_soc_dai *dai)
1060 {
1061         struct snd_soc_pcm_runtime *rtd = substream->private_data;
1062         struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(rtd->cpu_dai);
1063         bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
1064 
1065         switch (cmd) {
1066         case SNDRV_PCM_TRIGGER_START:
1067         case SNDRV_PCM_TRIGGER_RESUME:
1068         case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1069                 
1070 
1071 
1072 
1073 
1074 
1075 
1076                 if (tx && fsl_ssi_is_ac97(ssi))
1077                         fsl_ssi_tx_ac97_saccst_setup(ssi);
1078                 fsl_ssi_config_enable(ssi, tx);
1079                 break;
1080 
1081         case SNDRV_PCM_TRIGGER_STOP:
1082         case SNDRV_PCM_TRIGGER_SUSPEND:
1083         case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1084                 fsl_ssi_config_disable(ssi, tx);
1085                 break;
1086 
1087         default:
1088                 return -EINVAL;
1089         }
1090 
1091         return 0;
1092 }
1093 
1094 static int fsl_ssi_dai_probe(struct snd_soc_dai *dai)
1095 {
1096         struct fsl_ssi *ssi = snd_soc_dai_get_drvdata(dai);
1097 
1098         if (ssi->soc->imx && ssi->use_dma)
1099                 snd_soc_dai_init_dma_data(dai, &ssi->dma_params_tx,
1100                                           &ssi->dma_params_rx);
1101 
1102         return 0;
1103 }
1104 
1105 static const struct snd_soc_dai_ops fsl_ssi_dai_ops = {
1106         .startup = fsl_ssi_startup,
1107         .shutdown = fsl_ssi_shutdown,
1108         .hw_params = fsl_ssi_hw_params,
1109         .hw_free = fsl_ssi_hw_free,
1110         .set_fmt = fsl_ssi_set_dai_fmt,
1111         .set_tdm_slot = fsl_ssi_set_dai_tdm_slot,
1112         .trigger = fsl_ssi_trigger,
1113 };
1114 
1115 static struct snd_soc_dai_driver fsl_ssi_dai_template = {
1116         .probe = fsl_ssi_dai_probe,
1117         .playback = {
1118                 .stream_name = "CPU-Playback",
1119                 .channels_min = 1,
1120                 .channels_max = 32,
1121                 .rates = SNDRV_PCM_RATE_CONTINUOUS,
1122                 .formats = FSLSSI_I2S_FORMATS,
1123         },
1124         .capture = {
1125                 .stream_name = "CPU-Capture",
1126                 .channels_min = 1,
1127                 .channels_max = 32,
1128                 .rates = SNDRV_PCM_RATE_CONTINUOUS,
1129                 .formats = FSLSSI_I2S_FORMATS,
1130         },
1131         .ops = &fsl_ssi_dai_ops,
1132 };
1133 
1134 static const struct snd_soc_component_driver fsl_ssi_component = {
1135         .name = "fsl-ssi",
1136 };
1137 
1138 static struct snd_soc_dai_driver fsl_ssi_ac97_dai = {
1139         .bus_control = true,
1140         .symmetric_channels = 1,
1141         .probe = fsl_ssi_dai_probe,
1142         .playback = {
1143                 .stream_name = "AC97 Playback",
1144                 .channels_min = 2,
1145                 .channels_max = 2,
1146                 .rates = SNDRV_PCM_RATE_8000_48000,
1147                 .formats = SNDRV_PCM_FMTBIT_S16 | SNDRV_PCM_FMTBIT_S20,
1148         },
1149         .capture = {
1150                 .stream_name = "AC97 Capture",
1151                 .channels_min = 2,
1152                 .channels_max = 2,
1153                 .rates = SNDRV_PCM_RATE_48000,
1154                 
1155                 .formats = SNDRV_PCM_FMTBIT_S20,
1156         },
1157         .ops = &fsl_ssi_dai_ops,
1158 };
1159 
1160 static struct fsl_ssi *fsl_ac97_data;
1161 
1162 static void fsl_ssi_ac97_write(struct snd_ac97 *ac97, unsigned short reg,
1163                                unsigned short val)
1164 {
1165         struct regmap *regs = fsl_ac97_data->regs;
1166         unsigned int lreg;
1167         unsigned int lval;
1168         int ret;
1169 
1170         if (reg > 0x7f)
1171                 return;
1172 
1173         mutex_lock(&fsl_ac97_data->ac97_reg_lock);
1174 
1175         ret = clk_prepare_enable(fsl_ac97_data->clk);
1176         if (ret) {
1177                 pr_err("ac97 write clk_prepare_enable failed: %d\n",
1178                         ret);
1179                 goto ret_unlock;
1180         }
1181 
1182         lreg = reg <<  12;
1183         regmap_write(regs, REG_SSI_SACADD, lreg);
1184 
1185         lval = val << 4;
1186         regmap_write(regs, REG_SSI_SACDAT, lval);
1187 
1188         regmap_update_bits(regs, REG_SSI_SACNT,
1189                            SSI_SACNT_RDWR_MASK, SSI_SACNT_WR);
1190         udelay(100);
1191 
1192         clk_disable_unprepare(fsl_ac97_data->clk);
1193 
1194 ret_unlock:
1195         mutex_unlock(&fsl_ac97_data->ac97_reg_lock);
1196 }
1197 
1198 static unsigned short fsl_ssi_ac97_read(struct snd_ac97 *ac97,
1199                                         unsigned short reg)
1200 {
1201         struct regmap *regs = fsl_ac97_data->regs;
1202         unsigned short val = 0;
1203         u32 reg_val;
1204         unsigned int lreg;
1205         int ret;
1206 
1207         mutex_lock(&fsl_ac97_data->ac97_reg_lock);
1208 
1209         ret = clk_prepare_enable(fsl_ac97_data->clk);
1210         if (ret) {
1211                 pr_err("ac97 read clk_prepare_enable failed: %d\n", ret);
1212                 goto ret_unlock;
1213         }
1214 
1215         lreg = (reg & 0x7f) <<  12;
1216         regmap_write(regs, REG_SSI_SACADD, lreg);
1217         regmap_update_bits(regs, REG_SSI_SACNT,
1218                            SSI_SACNT_RDWR_MASK, SSI_SACNT_RD);
1219 
1220         udelay(100);
1221 
1222         regmap_read(regs, REG_SSI_SACDAT, ®_val);
1223         val = (reg_val >> 4) & 0xffff;
1224 
1225         clk_disable_unprepare(fsl_ac97_data->clk);
1226 
1227 ret_unlock:
1228         mutex_unlock(&fsl_ac97_data->ac97_reg_lock);
1229         return val;
1230 }
1231 
1232 static struct snd_ac97_bus_ops fsl_ssi_ac97_ops = {
1233         .read = fsl_ssi_ac97_read,
1234         .write = fsl_ssi_ac97_write,
1235 };
1236 
1237 
1238 
1239 
1240 static int fsl_ssi_hw_init(struct fsl_ssi *ssi)
1241 {
1242         u32 wm = ssi->fifo_watermark;
1243 
1244         
1245         fsl_ssi_setup_regvals(ssi);
1246 
1247         
1248         regmap_write(ssi->regs, REG_SSI_SFCSR,
1249                      SSI_SFCSR_TFWM0(wm) | SSI_SFCSR_RFWM0(wm) |
1250                      SSI_SFCSR_TFWM1(wm) | SSI_SFCSR_RFWM1(wm));
1251 
1252         
1253         if (ssi->use_dual_fifo)
1254                 regmap_update_bits(ssi->regs, REG_SSI_SCR,
1255                                    SSI_SCR_TCH_EN, SSI_SCR_TCH_EN);
1256 
1257         
1258         if (fsl_ssi_is_ac97(ssi)) {
1259                 _fsl_ssi_set_dai_fmt(ssi, ssi->dai_fmt);
1260                 fsl_ssi_setup_ac97(ssi);
1261         }
1262 
1263         return 0;
1264 }
1265 
1266 
1267 
1268 
1269 static void fsl_ssi_hw_clean(struct fsl_ssi *ssi)
1270 {
1271         
1272         if (fsl_ssi_is_ac97(ssi)) {
1273                 
1274                 regmap_update_bits(ssi->regs, REG_SSI_SCR,
1275                                    SSI_SCR_TE | SSI_SCR_RE, 0);
1276                 
1277                 regmap_write(ssi->regs, REG_SSI_SACNT, 0);
1278                 
1279                 regmap_write(ssi->regs, REG_SSI_SOR, 0);
1280                 
1281                 regmap_update_bits(ssi->regs, REG_SSI_SCR, SSI_SCR_SSIEN, 0);
1282         }
1283 }
1284 
1285 
1286 
1287 static void make_lowercase(char *s)
1288 {
1289         if (!s)
1290                 return;
1291         for (; *s; s++)
1292                 *s = tolower(*s);
1293 }
1294 
1295 static int fsl_ssi_imx_probe(struct platform_device *pdev,
1296                              struct fsl_ssi *ssi, void __iomem *iomem)
1297 {
1298         struct device *dev = &pdev->dev;
1299         int ret;
1300 
1301         
1302         if (ssi->has_ipg_clk_name)
1303                 ssi->clk = devm_clk_get(dev, "ipg");
1304         else
1305                 ssi->clk = devm_clk_get(dev, NULL);
1306         if (IS_ERR(ssi->clk)) {
1307                 ret = PTR_ERR(ssi->clk);
1308                 dev_err(dev, "failed to get clock: %d\n", ret);
1309                 return ret;
1310         }
1311 
1312         
1313         if (!ssi->has_ipg_clk_name) {
1314                 ret = clk_prepare_enable(ssi->clk);
1315                 if (ret) {
1316                         dev_err(dev, "clk_prepare_enable failed: %d\n", ret);
1317                         return ret;
1318                 }
1319         }
1320 
1321         
1322         ssi->baudclk = devm_clk_get(dev, "baud");
1323         if (IS_ERR(ssi->baudclk))
1324                 dev_dbg(dev, "failed to get baud clock: %ld\n",
1325                          PTR_ERR(ssi->baudclk));
1326 
1327         ssi->dma_params_tx.maxburst = ssi->dma_maxburst;
1328         ssi->dma_params_rx.maxburst = ssi->dma_maxburst;
1329         ssi->dma_params_tx.addr = ssi->ssi_phys + REG_SSI_STX0;
1330         ssi->dma_params_rx.addr = ssi->ssi_phys + REG_SSI_SRX0;
1331 
1332         
1333         if (ssi->use_dual_fifo) {
1334                 ssi->dma_params_tx.maxburst &= ~0x1;
1335                 ssi->dma_params_rx.maxburst &= ~0x1;
1336         }
1337 
1338         if (!ssi->use_dma) {
1339                 
1340 
1341 
1342 
1343                 ssi->fiq_params.irq = ssi->irq;
1344                 ssi->fiq_params.base = iomem;
1345                 ssi->fiq_params.dma_params_rx = &ssi->dma_params_rx;
1346                 ssi->fiq_params.dma_params_tx = &ssi->dma_params_tx;
1347 
1348                 ret = imx_pcm_fiq_init(pdev, &ssi->fiq_params);
1349                 if (ret)
1350                         goto error_pcm;
1351         } else {
1352                 ret = imx_pcm_dma_init(pdev, IMX_SSI_DMABUF_SIZE);
1353                 if (ret)
1354                         goto error_pcm;
1355         }
1356 
1357         return 0;
1358 
1359 error_pcm:
1360         if (!ssi->has_ipg_clk_name)
1361                 clk_disable_unprepare(ssi->clk);
1362 
1363         return ret;
1364 }
1365 
1366 static void fsl_ssi_imx_clean(struct platform_device *pdev, struct fsl_ssi *ssi)
1367 {
1368         if (!ssi->use_dma)
1369                 imx_pcm_fiq_exit(pdev);
1370         if (!ssi->has_ipg_clk_name)
1371                 clk_disable_unprepare(ssi->clk);
1372 }
1373 
1374 static int fsl_ssi_probe_from_dt(struct fsl_ssi *ssi)
1375 {
1376         struct device *dev = ssi->dev;
1377         struct device_node *np = dev->of_node;
1378         const struct of_device_id *of_id;
1379         const char *p, *sprop;
1380         const __be32 *iprop;
1381         u32 dmas[4];
1382         int ret;
1383 
1384         of_id = of_match_device(fsl_ssi_ids, dev);
1385         if (!of_id || !of_id->data)
1386                 return -EINVAL;
1387 
1388         ssi->soc = of_id->data;
1389 
1390         ret = of_property_match_string(np, "clock-names", "ipg");
1391         
1392         ssi->has_ipg_clk_name = ret >= 0;
1393 
1394         
1395         sprop = of_get_property(np, "fsl,mode", NULL);
1396         if (sprop && !strcmp(sprop, "ac97-slave")) {
1397                 ssi->dai_fmt = FSLSSI_AC97_DAIFMT;
1398 
1399                 ret = of_property_read_u32(np, "cell-index", &ssi->card_idx);
1400                 if (ret) {
1401                         dev_err(dev, "failed to get SSI index property\n");
1402                         return -EINVAL;
1403                 }
1404                 strcpy(ssi->card_name, "ac97-codec");
1405         } else if (!of_find_property(np, "fsl,ssi-asynchronous", NULL)) {
1406                 
1407 
1408 
1409 
1410 
1411 
1412 
1413 
1414 
1415                 ssi->synchronous = true;
1416         }
1417 
1418         
1419         ssi->use_dma = !of_property_read_bool(np, "fsl,fiq-stream-filter");
1420 
1421         
1422         iprop = of_get_property(np, "fsl,fifo-depth", NULL);
1423         if (iprop)
1424                 ssi->fifo_depth = be32_to_cpup(iprop);
1425         else
1426                 ssi->fifo_depth = 8;
1427 
1428         
1429         ret = of_property_read_u32_array(np, "dmas", dmas, 4);
1430         if (ssi->use_dma && !ret && dmas[2] == IMX_DMATYPE_SSI_DUAL)
1431                 ssi->use_dual_fifo = true;
1432 
1433         
1434 
1435 
1436 
1437 
1438 
1439 
1440 
1441         if (!ssi->card_name[0] && of_get_property(np, "codec-handle", NULL)) {
1442                 struct device_node *root = of_find_node_by_path("/");
1443 
1444                 sprop = of_get_property(root, "compatible", NULL);
1445                 of_node_put(root);
1446                 
1447                 p = strrchr(sprop, ',');
1448                 if (p)
1449                         sprop = p + 1;
1450                 snprintf(ssi->card_name, sizeof(ssi->card_name),
1451                          "snd-soc-%s", sprop);
1452                 make_lowercase(ssi->card_name);
1453                 ssi->card_idx = 0;
1454         }
1455 
1456         return 0;
1457 }
1458 
1459 static int fsl_ssi_probe(struct platform_device *pdev)
1460 {
1461         struct regmap_config regconfig = fsl_ssi_regconfig;
1462         struct device *dev = &pdev->dev;
1463         struct fsl_ssi *ssi;
1464         struct resource *res;
1465         void __iomem *iomem;
1466         int ret = 0;
1467 
1468         ssi = devm_kzalloc(dev, sizeof(*ssi), GFP_KERNEL);
1469         if (!ssi)
1470                 return -ENOMEM;
1471 
1472         ssi->dev = dev;
1473 
1474         
1475         ret = fsl_ssi_probe_from_dt(ssi);
1476         if (ret)
1477                 return ret;
1478 
1479         if (fsl_ssi_is_ac97(ssi)) {
1480                 memcpy(&ssi->cpu_dai_drv, &fsl_ssi_ac97_dai,
1481                        sizeof(fsl_ssi_ac97_dai));
1482                 fsl_ac97_data = ssi;
1483         } else {
1484                 memcpy(&ssi->cpu_dai_drv, &fsl_ssi_dai_template,
1485                        sizeof(fsl_ssi_dai_template));
1486         }
1487         ssi->cpu_dai_drv.name = dev_name(dev);
1488 
1489         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1490         iomem = devm_ioremap_resource(dev, res);
1491         if (IS_ERR(iomem))
1492                 return PTR_ERR(iomem);
1493         ssi->ssi_phys = res->start;
1494 
1495         if (ssi->soc->imx21regs) {
1496                 
1497                 regconfig.max_register = REG_SSI_SRMSK;
1498                 regconfig.num_reg_defaults_raw =
1499                         REG_SSI_SRMSK / sizeof(uint32_t) + 1;
1500         }
1501 
1502         if (ssi->has_ipg_clk_name)
1503                 ssi->regs = devm_regmap_init_mmio_clk(dev, "ipg", iomem,
1504                                                       ®config);
1505         else
1506                 ssi->regs = devm_regmap_init_mmio(dev, iomem, ®config);
1507         if (IS_ERR(ssi->regs)) {
1508                 dev_err(dev, "failed to init register map\n");
1509                 return PTR_ERR(ssi->regs);
1510         }
1511 
1512         ssi->irq = platform_get_irq(pdev, 0);
1513         if (ssi->irq < 0)
1514                 return ssi->irq;
1515 
1516         
1517         if (ssi->synchronous && !fsl_ssi_is_ac97(ssi)) {
1518                 ssi->cpu_dai_drv.symmetric_rates = 1;
1519                 ssi->cpu_dai_drv.symmetric_channels = 1;
1520                 ssi->cpu_dai_drv.symmetric_samplebits = 1;
1521         }
1522 
1523         
1524 
1525 
1526 
1527 
1528 
1529         switch (ssi->fifo_depth) {
1530         case 15:
1531                 
1532 
1533 
1534 
1535 
1536 
1537 
1538 
1539                 ssi->fifo_watermark = 8;
1540                 ssi->dma_maxburst = 8;
1541                 break;
1542         case 8:
1543         default:
1544                 
1545                 ssi->fifo_watermark = ssi->fifo_depth - 2;
1546                 ssi->dma_maxburst = ssi->fifo_depth - 2;
1547                 break;
1548         }
1549 
1550         dev_set_drvdata(dev, ssi);
1551 
1552         if (ssi->soc->imx) {
1553                 ret = fsl_ssi_imx_probe(pdev, ssi, iomem);
1554                 if (ret)
1555                         return ret;
1556         }
1557 
1558         if (fsl_ssi_is_ac97(ssi)) {
1559                 mutex_init(&ssi->ac97_reg_lock);
1560                 ret = snd_soc_set_ac97_ops_of_reset(&fsl_ssi_ac97_ops, pdev);
1561                 if (ret) {
1562                         dev_err(dev, "failed to set AC'97 ops\n");
1563                         goto error_ac97_ops;
1564                 }
1565         }
1566 
1567         ret = devm_snd_soc_register_component(dev, &fsl_ssi_component,
1568                                               &ssi->cpu_dai_drv, 1);
1569         if (ret) {
1570                 dev_err(dev, "failed to register DAI: %d\n", ret);
1571                 goto error_asoc_register;
1572         }
1573 
1574         if (ssi->use_dma) {
1575                 ret = devm_request_irq(dev, ssi->irq, fsl_ssi_isr, 0,
1576                                        dev_name(dev), ssi);
1577                 if (ret < 0) {
1578                         dev_err(dev, "failed to claim irq %u\n", ssi->irq);
1579                         goto error_asoc_register;
1580                 }
1581         }
1582 
1583         fsl_ssi_debugfs_create(&ssi->dbg_stats, dev);
1584 
1585         
1586         fsl_ssi_hw_init(ssi);
1587 
1588         
1589         if (ssi->card_name[0]) {
1590                 struct device *parent = dev;
1591                 
1592 
1593 
1594 
1595 
1596 
1597                 if (fsl_ssi_is_ac97(ssi))
1598                         parent = NULL;
1599 
1600                 ssi->card_pdev = platform_device_register_data(parent,
1601                                 ssi->card_name, ssi->card_idx, NULL, 0);
1602                 if (IS_ERR(ssi->card_pdev)) {
1603                         ret = PTR_ERR(ssi->card_pdev);
1604                         dev_err(dev, "failed to register %s: %d\n",
1605                                 ssi->card_name, ret);
1606                         goto error_sound_card;
1607                 }
1608         }
1609 
1610         return 0;
1611 
1612 error_sound_card:
1613         fsl_ssi_debugfs_remove(&ssi->dbg_stats);
1614 error_asoc_register:
1615         if (fsl_ssi_is_ac97(ssi))
1616                 snd_soc_set_ac97_ops(NULL);
1617 error_ac97_ops:
1618         if (fsl_ssi_is_ac97(ssi))
1619                 mutex_destroy(&ssi->ac97_reg_lock);
1620 
1621         if (ssi->soc->imx)
1622                 fsl_ssi_imx_clean(pdev, ssi);
1623 
1624         return ret;
1625 }
1626 
1627 static int fsl_ssi_remove(struct platform_device *pdev)
1628 {
1629         struct fsl_ssi *ssi = dev_get_drvdata(&pdev->dev);
1630 
1631         fsl_ssi_debugfs_remove(&ssi->dbg_stats);
1632 
1633         if (ssi->card_pdev)
1634                 platform_device_unregister(ssi->card_pdev);
1635 
1636         
1637         fsl_ssi_hw_clean(ssi);
1638 
1639         if (ssi->soc->imx)
1640                 fsl_ssi_imx_clean(pdev, ssi);
1641 
1642         if (fsl_ssi_is_ac97(ssi)) {
1643                 snd_soc_set_ac97_ops(NULL);
1644                 mutex_destroy(&ssi->ac97_reg_lock);
1645         }
1646 
1647         return 0;
1648 }
1649 
1650 #ifdef CONFIG_PM_SLEEP
1651 static int fsl_ssi_suspend(struct device *dev)
1652 {
1653         struct fsl_ssi *ssi = dev_get_drvdata(dev);
1654         struct regmap *regs = ssi->regs;
1655 
1656         regmap_read(regs, REG_SSI_SFCSR, &ssi->regcache_sfcsr);
1657         regmap_read(regs, REG_SSI_SACNT, &ssi->regcache_sacnt);
1658 
1659         regcache_cache_only(regs, true);
1660         regcache_mark_dirty(regs);
1661 
1662         return 0;
1663 }
1664 
1665 static int fsl_ssi_resume(struct device *dev)
1666 {
1667         struct fsl_ssi *ssi = dev_get_drvdata(dev);
1668         struct regmap *regs = ssi->regs;
1669 
1670         regcache_cache_only(regs, false);
1671 
1672         regmap_update_bits(regs, REG_SSI_SFCSR,
1673                            SSI_SFCSR_RFWM1_MASK | SSI_SFCSR_TFWM1_MASK |
1674                            SSI_SFCSR_RFWM0_MASK | SSI_SFCSR_TFWM0_MASK,
1675                            ssi->regcache_sfcsr);
1676         regmap_write(regs, REG_SSI_SACNT, ssi->regcache_sacnt);
1677 
1678         return regcache_sync(regs);
1679 }
1680 #endif 
1681 
1682 static const struct dev_pm_ops fsl_ssi_pm = {
1683         SET_SYSTEM_SLEEP_PM_OPS(fsl_ssi_suspend, fsl_ssi_resume)
1684 };
1685 
1686 static struct platform_driver fsl_ssi_driver = {
1687         .driver = {
1688                 .name = "fsl-ssi-dai",
1689                 .of_match_table = fsl_ssi_ids,
1690                 .pm = &fsl_ssi_pm,
1691         },
1692         .probe = fsl_ssi_probe,
1693         .remove = fsl_ssi_remove,
1694 };
1695 
1696 module_platform_driver(fsl_ssi_driver);
1697 
1698 MODULE_ALIAS("platform:fsl-ssi-dai");
1699 MODULE_AUTHOR("Timur Tabi <timur@freescale.com>");
1700 MODULE_DESCRIPTION("Freescale Synchronous Serial Interface (SSI) ASoC Driver");
1701 MODULE_LICENSE("GPL v2");