Lines Matching refs:esai_priv

105 	struct fsl_esai *esai_priv = (struct fsl_esai *)devid;  in esai_isr()  local
106 struct platform_device *pdev = esai_priv->pdev; in esai_isr()
110 regmap_read(esai_priv->regmap, REG_ESAI_ESR, &esr); in esai_isr()
111 regmap_read(esai_priv->regmap, REG_ESAI_SAISR, &saisr); in esai_isr()
114 esai_priv->soc->reset_at_xrun) { in esai_isr()
116 regmap_update_bits(esai_priv->regmap, REG_ESAI_TCR, in esai_isr()
118 regmap_update_bits(esai_priv->regmap, REG_ESAI_RCR, in esai_isr()
120 schedule_work(&esai_priv->work); in esai_isr()
173 struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai); in fsl_esai_divisor_cal() local
239 regmap_update_bits(esai_priv->regmap, REG_ESAI_xCCR(tx), in fsl_esai_divisor_cal()
248 regmap_update_bits(esai_priv->regmap, REG_ESAI_xCCR(tx), in fsl_esai_divisor_cal()
267 struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai); in fsl_esai_set_dai_sysclk() local
268 struct clk *clksrc = esai_priv->extalclk; in fsl_esai_set_dai_sysclk()
269 bool tx = (clk_id <= ESAI_HCKT_EXTAL || esai_priv->synchronous); in fsl_esai_set_dai_sysclk()
282 if (freq == esai_priv->hck_rate[tx] && dir == esai_priv->hck_dir[tx]) in fsl_esai_set_dai_sysclk()
286 esai_priv->sck_div[tx] = true; in fsl_esai_set_dai_sysclk()
289 regmap_update_bits(esai_priv->regmap, REG_ESAI_xCCR(tx), in fsl_esai_set_dai_sysclk()
298 clksrc = esai_priv->fsysclk; in fsl_esai_set_dai_sysclk()
304 ecr |= esai_priv->synchronous ? ESAI_ECR_ETI : ESAI_ECR_ERI; in fsl_esai_set_dai_sysclk()
333 if (ratio == 1 && clksrc == esai_priv->extalclk) { in fsl_esai_set_dai_sysclk()
348 esai_priv->sck_div[tx] = false; in fsl_esai_set_dai_sysclk()
351 esai_priv->hck_dir[tx] = dir; in fsl_esai_set_dai_sysclk()
352 esai_priv->hck_rate[tx] = freq; in fsl_esai_set_dai_sysclk()
354 regmap_update_bits(esai_priv->regmap, REG_ESAI_ECR, in fsl_esai_set_dai_sysclk()
369 struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai); in fsl_esai_set_bclk() local
370 u32 hck_rate = esai_priv->hck_rate[tx]; in fsl_esai_set_bclk()
375 if (esai_priv->slave_mode || esai_priv->sck_rate[tx] == freq) in fsl_esai_set_bclk()
393 if (!esai_priv->sck_div[tx] && (ratio > 16 || ratio == 0)) { in fsl_esai_set_bclk()
399 esai_priv->sck_div[tx] ? 0 : ratio); in fsl_esai_set_bclk()
404 esai_priv->sck_rate[tx] = freq; in fsl_esai_set_bclk()
412 struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai); in fsl_esai_set_dai_tdm_slot() local
414 regmap_update_bits(esai_priv->regmap, REG_ESAI_TCCR, in fsl_esai_set_dai_tdm_slot()
417 regmap_update_bits(esai_priv->regmap, REG_ESAI_RCCR, in fsl_esai_set_dai_tdm_slot()
420 esai_priv->slot_width = slot_width; in fsl_esai_set_dai_tdm_slot()
421 esai_priv->slots = slots; in fsl_esai_set_dai_tdm_slot()
422 esai_priv->tx_mask = tx_mask; in fsl_esai_set_dai_tdm_slot()
423 esai_priv->rx_mask = rx_mask; in fsl_esai_set_dai_tdm_slot()
430 struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai); in fsl_esai_set_dai_fmt() local
484 esai_priv->slave_mode = false; in fsl_esai_set_dai_fmt()
489 esai_priv->slave_mode = true; in fsl_esai_set_dai_fmt()
505 regmap_update_bits(esai_priv->regmap, REG_ESAI_TCR, mask, xcr); in fsl_esai_set_dai_fmt()
506 regmap_update_bits(esai_priv->regmap, REG_ESAI_RCR, mask, xcr); in fsl_esai_set_dai_fmt()
510 regmap_update_bits(esai_priv->regmap, REG_ESAI_TCCR, mask, xccr); in fsl_esai_set_dai_fmt()
511 regmap_update_bits(esai_priv->regmap, REG_ESAI_RCCR, mask, xccr); in fsl_esai_set_dai_fmt()
519 struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai); in fsl_esai_startup() local
523 regmap_update_bits(esai_priv->regmap, REG_ESAI_SAICR, in fsl_esai_startup()
524 ESAI_SAICR_SYNC, esai_priv->synchronous ? in fsl_esai_startup()
528 regmap_update_bits(esai_priv->regmap, REG_ESAI_TCCR, in fsl_esai_startup()
530 ESAI_xCCR_xDC(esai_priv->slots)); in fsl_esai_startup()
531 regmap_update_bits(esai_priv->regmap, REG_ESAI_RCCR, in fsl_esai_startup()
533 ESAI_xCCR_xDC(esai_priv->slots)); in fsl_esai_startup()
544 struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai); in fsl_esai_hw_params() local
548 u32 pins = DIV_ROUND_UP(channels, esai_priv->slots); in fsl_esai_hw_params()
554 if (esai_priv->slot_width) in fsl_esai_hw_params()
555 slot_width = esai_priv->slot_width; in fsl_esai_hw_params()
557 bclk = params_rate(params) * slot_width * esai_priv->slots; in fsl_esai_hw_params()
559 ret = fsl_esai_set_bclk(dai, esai_priv->synchronous || tx, bclk); in fsl_esai_hw_params()
566 regmap_update_bits(esai_priv->regmap, REG_ESAI_xCR(tx), mask, val); in fsl_esai_hw_params()
568 if (!tx && esai_priv->synchronous) in fsl_esai_hw_params()
569 regmap_update_bits(esai_priv->regmap, REG_ESAI_TCR, mask, val); in fsl_esai_hw_params()
572 regmap_update_bits(esai_priv->regmap, REG_ESAI_xCR(tx), in fsl_esai_hw_params()
576 regmap_update_bits(esai_priv->regmap, REG_ESAI_xFCR(tx), in fsl_esai_hw_params()
581 val = ESAI_xFCR_xWA(width) | ESAI_xFCR_xFWM(esai_priv->fifo_depth) | in fsl_esai_hw_params()
584 regmap_update_bits(esai_priv->regmap, REG_ESAI_xFCR(tx), mask, val); in fsl_esai_hw_params()
587 regmap_update_bits(esai_priv->regmap, REG_ESAI_TCR, in fsl_esai_hw_params()
591 regmap_update_bits(esai_priv->regmap, REG_ESAI_PRRC, in fsl_esai_hw_params()
593 regmap_update_bits(esai_priv->regmap, REG_ESAI_PCRC, in fsl_esai_hw_params()
598 static int fsl_esai_hw_init(struct fsl_esai *esai_priv) in fsl_esai_hw_init() argument
600 struct platform_device *pdev = esai_priv->pdev; in fsl_esai_hw_init()
604 ret = regmap_update_bits(esai_priv->regmap, REG_ESAI_ECR, in fsl_esai_hw_init()
616 ret = regmap_update_bits(esai_priv->regmap, REG_ESAI_ECR, in fsl_esai_hw_init()
624 regmap_update_bits(esai_priv->regmap, REG_ESAI_PRRC, in fsl_esai_hw_init()
626 regmap_update_bits(esai_priv->regmap, REG_ESAI_PCRC, in fsl_esai_hw_init()
632 static int fsl_esai_register_restore(struct fsl_esai *esai_priv) in fsl_esai_register_restore() argument
637 regmap_update_bits(esai_priv->regmap, REG_ESAI_TFCR, in fsl_esai_register_restore()
639 regmap_update_bits(esai_priv->regmap, REG_ESAI_RFCR, in fsl_esai_register_restore()
642 regcache_mark_dirty(esai_priv->regmap); in fsl_esai_register_restore()
643 ret = regcache_sync(esai_priv->regmap); in fsl_esai_register_restore()
648 regmap_update_bits(esai_priv->regmap, REG_ESAI_TFCR, ESAI_xFCR_xFR, 0); in fsl_esai_register_restore()
649 regmap_update_bits(esai_priv->regmap, REG_ESAI_RFCR, ESAI_xFCR_xFR, 0); in fsl_esai_register_restore()
654 static void fsl_esai_trigger_start(struct fsl_esai *esai_priv, bool tx) in fsl_esai_trigger_start() argument
656 u8 i, channels = esai_priv->channels[tx]; in fsl_esai_trigger_start()
657 u32 pins = DIV_ROUND_UP(channels, esai_priv->slots); in fsl_esai_trigger_start()
660 regmap_update_bits(esai_priv->regmap, REG_ESAI_xFCR(tx), in fsl_esai_trigger_start()
665 regmap_write(esai_priv->regmap, REG_ESAI_ETDR, 0x0); in fsl_esai_trigger_start()
679 regmap_update_bits(esai_priv->regmap, REG_ESAI_xCR(tx), in fsl_esai_trigger_start()
682 mask = tx ? esai_priv->tx_mask : esai_priv->rx_mask; in fsl_esai_trigger_start()
684 regmap_update_bits(esai_priv->regmap, REG_ESAI_xSMB(tx), in fsl_esai_trigger_start()
686 regmap_update_bits(esai_priv->regmap, REG_ESAI_xSMA(tx), in fsl_esai_trigger_start()
690 regmap_update_bits(esai_priv->regmap, REG_ESAI_xCR(tx), in fsl_esai_trigger_start()
694 static void fsl_esai_trigger_stop(struct fsl_esai *esai_priv, bool tx) in fsl_esai_trigger_stop() argument
696 regmap_update_bits(esai_priv->regmap, REG_ESAI_xCR(tx), in fsl_esai_trigger_stop()
699 regmap_update_bits(esai_priv->regmap, REG_ESAI_xCR(tx), in fsl_esai_trigger_stop()
701 regmap_update_bits(esai_priv->regmap, REG_ESAI_xSMA(tx), in fsl_esai_trigger_stop()
703 regmap_update_bits(esai_priv->regmap, REG_ESAI_xSMB(tx), in fsl_esai_trigger_stop()
707 regmap_update_bits(esai_priv->regmap, REG_ESAI_xFCR(tx), in fsl_esai_trigger_stop()
709 regmap_update_bits(esai_priv->regmap, REG_ESAI_xFCR(tx), in fsl_esai_trigger_stop()
715 struct fsl_esai *esai_priv = container_of(work, struct fsl_esai, work); in fsl_esai_hw_reset() local
720 spin_lock_irqsave(&esai_priv->lock, lock_flags); in fsl_esai_hw_reset()
722 regmap_read(esai_priv->regmap, REG_ESAI_TFCR, &tfcr); in fsl_esai_hw_reset()
723 regmap_read(esai_priv->regmap, REG_ESAI_RFCR, &rfcr); in fsl_esai_hw_reset()
728 fsl_esai_trigger_stop(esai_priv, tx); in fsl_esai_hw_reset()
729 fsl_esai_trigger_stop(esai_priv, rx); in fsl_esai_hw_reset()
732 fsl_esai_hw_init(esai_priv); in fsl_esai_hw_reset()
735 regmap_update_bits(esai_priv->regmap, REG_ESAI_TCR, in fsl_esai_hw_reset()
737 regmap_update_bits(esai_priv->regmap, REG_ESAI_RCR, in fsl_esai_hw_reset()
741 fsl_esai_register_restore(esai_priv); in fsl_esai_hw_reset()
744 regmap_update_bits(esai_priv->regmap, REG_ESAI_TCR, in fsl_esai_hw_reset()
746 regmap_update_bits(esai_priv->regmap, REG_ESAI_RCR, in fsl_esai_hw_reset()
748 regmap_update_bits(esai_priv->regmap, REG_ESAI_PRRC, in fsl_esai_hw_reset()
750 regmap_update_bits(esai_priv->regmap, REG_ESAI_PCRC, in fsl_esai_hw_reset()
755 fsl_esai_trigger_start(esai_priv, tx); in fsl_esai_hw_reset()
757 fsl_esai_trigger_start(esai_priv, rx); in fsl_esai_hw_reset()
759 spin_unlock_irqrestore(&esai_priv->lock, lock_flags); in fsl_esai_hw_reset()
765 struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai); in fsl_esai_trigger() local
769 esai_priv->channels[tx] = substream->runtime->channels; in fsl_esai_trigger()
775 spin_lock_irqsave(&esai_priv->lock, lock_flags); in fsl_esai_trigger()
776 fsl_esai_trigger_start(esai_priv, tx); in fsl_esai_trigger()
777 spin_unlock_irqrestore(&esai_priv->lock, lock_flags); in fsl_esai_trigger()
782 spin_lock_irqsave(&esai_priv->lock, lock_flags); in fsl_esai_trigger()
783 fsl_esai_trigger_stop(esai_priv, tx); in fsl_esai_trigger()
784 spin_unlock_irqrestore(&esai_priv->lock, lock_flags); in fsl_esai_trigger()
804 struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai); in fsl_esai_dai_probe() local
806 snd_soc_dai_init_dma_data(dai, &esai_priv->dma_params_tx, in fsl_esai_dai_probe()
807 &esai_priv->dma_params_rx); in fsl_esai_dai_probe()
958 struct fsl_esai *esai_priv; in fsl_esai_probe() local
964 esai_priv = devm_kzalloc(&pdev->dev, sizeof(*esai_priv), GFP_KERNEL); in fsl_esai_probe()
965 if (!esai_priv) in fsl_esai_probe()
968 esai_priv->pdev = pdev; in fsl_esai_probe()
969 snprintf(esai_priv->name, sizeof(esai_priv->name), "%pOFn", np); in fsl_esai_probe()
971 esai_priv->soc = of_device_get_match_data(&pdev->dev); in fsl_esai_probe()
972 if (!esai_priv->soc) { in fsl_esai_probe()
983 esai_priv->regmap = devm_regmap_init_mmio_clk(&pdev->dev, in fsl_esai_probe()
985 if (IS_ERR(esai_priv->regmap)) { in fsl_esai_probe()
987 PTR_ERR(esai_priv->regmap)); in fsl_esai_probe()
988 return PTR_ERR(esai_priv->regmap); in fsl_esai_probe()
991 esai_priv->coreclk = devm_clk_get(&pdev->dev, "core"); in fsl_esai_probe()
992 if (IS_ERR(esai_priv->coreclk)) { in fsl_esai_probe()
994 PTR_ERR(esai_priv->coreclk)); in fsl_esai_probe()
995 return PTR_ERR(esai_priv->coreclk); in fsl_esai_probe()
998 esai_priv->extalclk = devm_clk_get(&pdev->dev, "extal"); in fsl_esai_probe()
999 if (IS_ERR(esai_priv->extalclk)) in fsl_esai_probe()
1001 PTR_ERR(esai_priv->extalclk)); in fsl_esai_probe()
1003 esai_priv->fsysclk = devm_clk_get(&pdev->dev, "fsys"); in fsl_esai_probe()
1004 if (IS_ERR(esai_priv->fsysclk)) in fsl_esai_probe()
1006 PTR_ERR(esai_priv->fsysclk)); in fsl_esai_probe()
1008 esai_priv->spbaclk = devm_clk_get(&pdev->dev, "spba"); in fsl_esai_probe()
1009 if (IS_ERR(esai_priv->spbaclk)) in fsl_esai_probe()
1011 PTR_ERR(esai_priv->spbaclk)); in fsl_esai_probe()
1018 esai_priv->name, esai_priv); in fsl_esai_probe()
1025 esai_priv->slots = 2; in fsl_esai_probe()
1028 esai_priv->slave_mode = true; in fsl_esai_probe()
1033 esai_priv->fifo_depth = be32_to_cpup(iprop); in fsl_esai_probe()
1035 esai_priv->fifo_depth = 64; in fsl_esai_probe()
1037 esai_priv->dma_params_tx.maxburst = 16; in fsl_esai_probe()
1038 esai_priv->dma_params_rx.maxburst = 16; in fsl_esai_probe()
1039 esai_priv->dma_params_tx.addr = res->start + REG_ESAI_ETDR; in fsl_esai_probe()
1040 esai_priv->dma_params_rx.addr = res->start + REG_ESAI_ERDR; in fsl_esai_probe()
1042 esai_priv->synchronous = in fsl_esai_probe()
1046 if (esai_priv->synchronous) { in fsl_esai_probe()
1052 dev_set_drvdata(&pdev->dev, esai_priv); in fsl_esai_probe()
1054 spin_lock_init(&esai_priv->lock); in fsl_esai_probe()
1055 ret = fsl_esai_hw_init(esai_priv); in fsl_esai_probe()
1059 esai_priv->tx_mask = 0xFFFFFFFF; in fsl_esai_probe()
1060 esai_priv->rx_mask = 0xFFFFFFFF; in fsl_esai_probe()
1063 regmap_write(esai_priv->regmap, REG_ESAI_TSMA, 0); in fsl_esai_probe()
1064 regmap_write(esai_priv->regmap, REG_ESAI_TSMB, 0); in fsl_esai_probe()
1065 regmap_write(esai_priv->regmap, REG_ESAI_RSMA, 0); in fsl_esai_probe()
1066 regmap_write(esai_priv->regmap, REG_ESAI_RSMB, 0); in fsl_esai_probe()
1075 INIT_WORK(&esai_priv->work, fsl_esai_hw_reset); in fsl_esai_probe()
1079 regcache_cache_only(esai_priv->regmap, true); in fsl_esai_probe()
1090 struct fsl_esai *esai_priv = platform_get_drvdata(pdev); in fsl_esai_remove() local
1093 cancel_work_sync(&esai_priv->work); in fsl_esai_remove()