Lines Matching defs:spdifrx
252 struct stm32_spdifrx_data *spdifrx = (struct stm32_spdifrx_data *)data;
253 struct platform_device *pdev = spdifrx->pdev;
254 u32 *p_start = (u32 *)spdifrx->dmab->area;
257 u16 *ub_ptr = (short *)spdifrx->ub;
260 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
264 if (!spdifrx->dmab->area)
279 spdifrx->cs[i] = (unsigned char)SPDIFRX_CSR_CSGET(*ptr);
288 complete(&spdifrx->cs_completion);
291 static int stm32_spdifrx_dma_ctrl_start(struct stm32_spdifrx_data *spdifrx)
296 spdifrx->desc = dmaengine_prep_slave_single(spdifrx->ctrl_chan,
297 spdifrx->dmab->addr,
301 if (!spdifrx->desc)
304 spdifrx->desc->callback = stm32_spdifrx_dma_complete;
305 spdifrx->desc->callback_param = spdifrx;
306 cookie = dmaengine_submit(spdifrx->desc);
311 dma_async_issue_pending(spdifrx->ctrl_chan);
316 static void stm32_spdifrx_dma_ctrl_stop(struct stm32_spdifrx_data *spdifrx)
318 dmaengine_terminate_async(spdifrx->ctrl_chan);
321 static int stm32_spdifrx_start_sync(struct stm32_spdifrx_data *spdifrx)
328 ret = regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_IMR, imr, imr);
332 spin_lock_irqsave(&spdifrx->lock, flags);
334 spdifrx->refcount++;
336 regmap_read(spdifrx->regmap, STM32_SPDIFRX_CR, &cr);
343 dev_dbg(&spdifrx->pdev->dev, "start synchronization\n");
360 ret = regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
363 dev_err(&spdifrx->pdev->dev,
367 spin_unlock_irqrestore(&spdifrx->lock, flags);
372 static void stm32_spdifrx_stop(struct stm32_spdifrx_data *spdifrx)
377 spin_lock_irqsave(&spdifrx->lock, flags);
379 if (--spdifrx->refcount) {
380 spin_unlock_irqrestore(&spdifrx->lock, flags);
387 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR, cr_mask, cr);
389 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_IMR,
392 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_IFCR,
396 regmap_read(spdifrx->regmap, STM32_SPDIFRX_DR, ®);
397 regmap_read(spdifrx->regmap, STM32_SPDIFRX_CSR, ®);
399 spin_unlock_irqrestore(&spdifrx->lock, flags);
403 struct stm32_spdifrx_data *spdifrx)
407 spdifrx->ctrl_chan = dma_request_chan(dev, "rx-ctrl");
408 if (IS_ERR(spdifrx->ctrl_chan)) {
409 if (PTR_ERR(spdifrx->ctrl_chan) != -EPROBE_DEFER)
411 PTR_ERR(spdifrx->ctrl_chan));
412 return PTR_ERR(spdifrx->ctrl_chan);
415 spdifrx->dmab = devm_kzalloc(dev, sizeof(struct snd_dma_buffer),
417 if (!spdifrx->dmab)
420 spdifrx->dmab->dev.type = SNDRV_DMA_TYPE_DEV_IRAM;
421 spdifrx->dmab->dev.dev = dev;
422 ret = snd_dma_alloc_pages(spdifrx->dmab->dev.type, dev,
423 SPDIFRX_CSR_BUF_LENGTH, spdifrx->dmab);
429 spdifrx->slave_config.direction = DMA_DEV_TO_MEM;
430 spdifrx->slave_config.src_addr = (dma_addr_t)(spdifrx->phys_addr +
432 spdifrx->slave_config.dst_addr = spdifrx->dmab->addr;
433 spdifrx->slave_config.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
434 spdifrx->slave_config.src_maxburst = 1;
436 ret = dmaengine_slave_config(spdifrx->ctrl_chan,
437 &spdifrx->slave_config);
440 spdifrx->ctrl_chan = NULL;
481 static int stm32_spdifrx_get_ctrl_data(struct stm32_spdifrx_data *spdifrx)
485 memset(spdifrx->cs, 0, SPDIFRX_CS_BYTES_NB);
486 memset(spdifrx->ub, 0, SPDIFRX_UB_BYTES_NB);
488 ret = stm32_spdifrx_dma_ctrl_start(spdifrx);
492 ret = clk_prepare_enable(spdifrx->kclk);
494 dev_err(&spdifrx->pdev->dev, "Enable kclk failed: %d\n", ret);
498 ret = regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
503 ret = stm32_spdifrx_start_sync(spdifrx);
507 if (wait_for_completion_interruptible_timeout(&spdifrx->cs_completion,
510 dev_dbg(&spdifrx->pdev->dev, "Failed to get control data\n");
514 stm32_spdifrx_stop(spdifrx);
515 stm32_spdifrx_dma_ctrl_stop(spdifrx);
518 clk_disable_unprepare(spdifrx->kclk);
527 struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai);
529 stm32_spdifrx_get_ctrl_data(spdifrx);
531 ucontrol->value.iec958.status[0] = spdifrx->cs[0];
532 ucontrol->value.iec958.status[1] = spdifrx->cs[1];
533 ucontrol->value.iec958.status[2] = spdifrx->cs[2];
534 ucontrol->value.iec958.status[3] = spdifrx->cs[3];
535 ucontrol->value.iec958.status[4] = spdifrx->cs[4];
544 struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai);
546 stm32_spdifrx_get_ctrl_data(spdifrx);
548 ucontrol->value.iec958.status[0] = spdifrx->ub[0];
549 ucontrol->value.iec958.status[1] = spdifrx->ub[1];
550 ucontrol->value.iec958.status[2] = spdifrx->ub[2];
551 ucontrol->value.iec958.status[3] = spdifrx->ub[3];
552 ucontrol->value.iec958.status[4] = spdifrx->ub[4];
599 struct stm32_spdifrx_data *spdifrx = dev_get_drvdata(cpu_dai->dev);
601 spdifrx->dma_params.addr = (dma_addr_t)(spdifrx->phys_addr +
603 spdifrx->dma_params.maxburst = 1;
605 snd_soc_dai_init_dma_data(cpu_dai, NULL, &spdifrx->dma_params);
669 struct stm32_spdifrx_data *spdifrx = (struct stm32_spdifrx_data *)devid;
670 struct platform_device *pdev = spdifrx->pdev;
675 regmap_read(spdifrx->regmap, STM32_SPDIFRX_SR, &sr);
676 regmap_read(spdifrx->regmap, STM32_SPDIFRX_IMR, &imr);
691 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_IFCR,
710 /* Enable spdifrx */
712 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
732 regmap_read(spdifrx->regmap, STM32_SPDIFRX_CR, &cr);
738 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
744 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
749 spin_lock(&spdifrx->irq_lock);
750 if (spdifrx->substream)
751 snd_pcm_stop(spdifrx->substream,
753 spin_unlock(&spdifrx->irq_lock);
758 spin_lock(&spdifrx->irq_lock);
759 if (err_xrun && spdifrx->substream)
760 snd_pcm_stop_xrun(spdifrx->substream);
761 spin_unlock(&spdifrx->irq_lock);
769 struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai);
773 spin_lock_irqsave(&spdifrx->irq_lock, flags);
774 spdifrx->substream = substream;
775 spin_unlock_irqrestore(&spdifrx->irq_lock, flags);
777 ret = clk_prepare_enable(spdifrx->kclk);
779 dev_err(&spdifrx->pdev->dev, "Enable kclk failed: %d\n", ret);
788 struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai);
800 dev_err(&spdifrx->pdev->dev, "Unexpected data format\n");
809 spdifrx->dma_params.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
810 snd_soc_dai_init_dma_data(cpu_dai, NULL, &spdifrx->dma_params);
812 return regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
820 struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai);
827 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_IMR,
830 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
833 ret = stm32_spdifrx_start_sync(spdifrx);
838 stm32_spdifrx_stop(spdifrx);
850 struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai);
853 spin_lock_irqsave(&spdifrx->irq_lock, flags);
854 spdifrx->substream = NULL;
855 spin_unlock_irqrestore(&spdifrx->irq_lock, flags);
857 clk_disable_unprepare(spdifrx->kclk);
892 .name = "stm32-spdifrx",
902 .compatible = "st,stm32h7-spdifrx",
909 struct stm32_spdifrx_data *spdifrx)
920 spdifrx->regmap_conf =
926 spdifrx->base = devm_ioremap_resource(&pdev->dev, res);
927 if (IS_ERR(spdifrx->base))
928 return PTR_ERR(spdifrx->base);
930 spdifrx->phys_addr = res->start;
932 spdifrx->kclk = devm_clk_get(&pdev->dev, "kclk");
933 if (IS_ERR(spdifrx->kclk)) {
934 if (PTR_ERR(spdifrx->kclk) != -EPROBE_DEFER)
936 PTR_ERR(spdifrx->kclk));
937 return PTR_ERR(spdifrx->kclk);
940 spdifrx->irq = platform_get_irq(pdev, 0);
941 if (spdifrx->irq < 0)
942 return spdifrx->irq;
949 struct stm32_spdifrx_data *spdifrx = platform_get_drvdata(pdev);
951 if (spdifrx->ctrl_chan)
952 dma_release_channel(spdifrx->ctrl_chan);
954 if (spdifrx->dmab)
955 snd_dma_free_pages(spdifrx->dmab);
965 struct stm32_spdifrx_data *spdifrx;
971 spdifrx = devm_kzalloc(&pdev->dev, sizeof(*spdifrx), GFP_KERNEL);
972 if (!spdifrx)
975 spdifrx->pdev = pdev;
976 init_completion(&spdifrx->cs_completion);
977 spin_lock_init(&spdifrx->lock);
978 spin_lock_init(&spdifrx->irq_lock);
980 platform_set_drvdata(pdev, spdifrx);
982 ret = stm32_spdifrx_parse_of(pdev, spdifrx);
986 spdifrx->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "kclk",
987 spdifrx->base,
988 spdifrx->regmap_conf);
989 if (IS_ERR(spdifrx->regmap)) {
990 if (PTR_ERR(spdifrx->regmap) != -EPROBE_DEFER)
992 PTR_ERR(spdifrx->regmap));
993 return PTR_ERR(spdifrx->regmap);
996 ret = devm_request_irq(&pdev->dev, spdifrx->irq, stm32_spdifrx_isr, 0,
997 dev_name(&pdev->dev), spdifrx);
1031 ret = stm32_spdifrx_dma_ctrl_register(&pdev->dev, spdifrx);
1035 ret = regmap_read(spdifrx->regmap, STM32_SPDIFRX_IDR, &idr);
1040 ret = regmap_read(spdifrx->regmap, STM32_SPDIFRX_VERR, &ver);
1062 struct stm32_spdifrx_data *spdifrx = dev_get_drvdata(dev);
1064 regcache_cache_only(spdifrx->regmap, true);
1065 regcache_mark_dirty(spdifrx->regmap);
1072 struct stm32_spdifrx_data *spdifrx = dev_get_drvdata(dev);
1074 regcache_cache_only(spdifrx->regmap, false);
1076 return regcache_sync(spdifrx->regmap);
1086 .name = "st,stm32-spdifrx",
1096 MODULE_DESCRIPTION("STM32 Soc spdifrx Interface");
1098 MODULE_ALIAS("platform:stm32-spdifrx");