Lines Matching refs:spdifrx

253 	struct stm32_spdifrx_data *spdifrx = (struct stm32_spdifrx_data *)data;
254 struct platform_device *pdev = spdifrx->pdev;
255 u32 *p_start = (u32 *)spdifrx->dmab->area;
258 u16 *ub_ptr = (short *)spdifrx->ub;
261 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
265 if (!spdifrx->dmab->area)
280 spdifrx->cs[i] = (unsigned char)SPDIFRX_CSR_CSGET(*ptr);
289 complete(&spdifrx->cs_completion);
292 static int stm32_spdifrx_dma_ctrl_start(struct stm32_spdifrx_data *spdifrx)
297 spdifrx->desc = dmaengine_prep_slave_single(spdifrx->ctrl_chan,
298 spdifrx->dmab->addr,
302 if (!spdifrx->desc)
305 spdifrx->desc->callback = stm32_spdifrx_dma_complete;
306 spdifrx->desc->callback_param = spdifrx;
307 cookie = dmaengine_submit(spdifrx->desc);
312 dma_async_issue_pending(spdifrx->ctrl_chan);
317 static void stm32_spdifrx_dma_ctrl_stop(struct stm32_spdifrx_data *spdifrx)
319 dmaengine_terminate_async(spdifrx->ctrl_chan);
322 static int stm32_spdifrx_start_sync(struct stm32_spdifrx_data *spdifrx)
329 ret = regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_IMR, imr, imr);
333 spin_lock_irqsave(&spdifrx->lock, flags);
335 spdifrx->refcount++;
337 regmap_read(spdifrx->regmap, STM32_SPDIFRX_CR, &cr);
344 dev_dbg(&spdifrx->pdev->dev, "start synchronization\n");
361 ret = regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
364 dev_err(&spdifrx->pdev->dev,
368 spin_unlock_irqrestore(&spdifrx->lock, flags);
373 static void stm32_spdifrx_stop(struct stm32_spdifrx_data *spdifrx)
378 spin_lock_irqsave(&spdifrx->lock, flags);
380 if (--spdifrx->refcount) {
381 spin_unlock_irqrestore(&spdifrx->lock, flags);
388 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR, cr_mask, cr);
390 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_IMR,
393 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_IFCR,
397 regmap_read(spdifrx->regmap, STM32_SPDIFRX_DR, &reg);
398 regmap_read(spdifrx->regmap, STM32_SPDIFRX_CSR, &reg);
400 spin_unlock_irqrestore(&spdifrx->lock, flags);
404 struct stm32_spdifrx_data *spdifrx)
408 spdifrx->ctrl_chan = dma_request_chan(dev, "rx-ctrl");
409 if (IS_ERR(spdifrx->ctrl_chan))
410 return dev_err_probe(dev, PTR_ERR(spdifrx->ctrl_chan),
413 spdifrx->dmab = devm_kzalloc(dev, sizeof(struct snd_dma_buffer),
415 if (!spdifrx->dmab)
418 spdifrx->dmab->dev.type = SNDRV_DMA_TYPE_DEV_IRAM;
419 spdifrx->dmab->dev.dev = dev;
420 ret = snd_dma_alloc_pages(spdifrx->dmab->dev.type, dev,
421 SPDIFRX_CSR_BUF_LENGTH, spdifrx->dmab);
427 spdifrx->slave_config.direction = DMA_DEV_TO_MEM;
428 spdifrx->slave_config.src_addr = (dma_addr_t)(spdifrx->phys_addr +
430 spdifrx->slave_config.dst_addr = spdifrx->dmab->addr;
431 spdifrx->slave_config.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
432 spdifrx->slave_config.src_maxburst = 1;
434 ret = dmaengine_slave_config(spdifrx->ctrl_chan,
435 &spdifrx->slave_config);
438 spdifrx->ctrl_chan = NULL;
479 static int stm32_spdifrx_get_ctrl_data(struct stm32_spdifrx_data *spdifrx)
483 memset(spdifrx->cs, 0, SPDIFRX_CS_BYTES_NB);
484 memset(spdifrx->ub, 0, SPDIFRX_UB_BYTES_NB);
486 ret = stm32_spdifrx_dma_ctrl_start(spdifrx);
490 ret = clk_prepare_enable(spdifrx->kclk);
492 dev_err(&spdifrx->pdev->dev, "Enable kclk failed: %d\n", ret);
496 ret = regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
501 ret = stm32_spdifrx_start_sync(spdifrx);
505 if (wait_for_completion_interruptible_timeout(&spdifrx->cs_completion,
508 dev_dbg(&spdifrx->pdev->dev, "Failed to get control data\n");
512 stm32_spdifrx_stop(spdifrx);
513 stm32_spdifrx_dma_ctrl_stop(spdifrx);
516 clk_disable_unprepare(spdifrx->kclk);
525 struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai);
527 stm32_spdifrx_get_ctrl_data(spdifrx);
529 ucontrol->value.iec958.status[0] = spdifrx->cs[0];
530 ucontrol->value.iec958.status[1] = spdifrx->cs[1];
531 ucontrol->value.iec958.status[2] = spdifrx->cs[2];
532 ucontrol->value.iec958.status[3] = spdifrx->cs[3];
533 ucontrol->value.iec958.status[4] = spdifrx->cs[4];
542 struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai);
544 stm32_spdifrx_get_ctrl_data(spdifrx);
546 ucontrol->value.iec958.status[0] = spdifrx->ub[0];
547 ucontrol->value.iec958.status[1] = spdifrx->ub[1];
548 ucontrol->value.iec958.status[2] = spdifrx->ub[2];
549 ucontrol->value.iec958.status[3] = spdifrx->ub[3];
550 ucontrol->value.iec958.status[4] = spdifrx->ub[4];
597 struct stm32_spdifrx_data *spdifrx = dev_get_drvdata(cpu_dai->dev);
599 spdifrx->dma_params.addr = (dma_addr_t)(spdifrx->phys_addr +
601 spdifrx->dma_params.maxburst = 1;
603 snd_soc_dai_init_dma_data(cpu_dai, NULL, &spdifrx->dma_params);
667 struct stm32_spdifrx_data *spdifrx = (struct stm32_spdifrx_data *)devid;
668 struct platform_device *pdev = spdifrx->pdev;
673 regmap_read(spdifrx->regmap, STM32_SPDIFRX_SR, &sr);
674 regmap_read(spdifrx->regmap, STM32_SPDIFRX_IMR, &imr);
689 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_IFCR,
708 /* Enable spdifrx */
710 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
730 regmap_read(spdifrx->regmap, STM32_SPDIFRX_CR, &cr);
736 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
742 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
747 spin_lock(&spdifrx->irq_lock);
748 if (spdifrx->substream)
749 snd_pcm_stop(spdifrx->substream,
751 spin_unlock(&spdifrx->irq_lock);
756 spin_lock(&spdifrx->irq_lock);
757 if (err_xrun && spdifrx->substream)
758 snd_pcm_stop_xrun(spdifrx->substream);
759 spin_unlock(&spdifrx->irq_lock);
767 struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai);
771 spin_lock_irqsave(&spdifrx->irq_lock, flags);
772 spdifrx->substream = substream;
773 spin_unlock_irqrestore(&spdifrx->irq_lock, flags);
775 ret = clk_prepare_enable(spdifrx->kclk);
777 dev_err(&spdifrx->pdev->dev, "Enable kclk failed: %d\n", ret);
786 struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai);
798 dev_err(&spdifrx->pdev->dev, "Unexpected data format\n");
807 spdifrx->dma_params.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
808 snd_soc_dai_init_dma_data(cpu_dai, NULL, &spdifrx->dma_params);
810 return regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
818 struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai);
825 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_IMR,
828 regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
831 ret = stm32_spdifrx_start_sync(spdifrx);
836 stm32_spdifrx_stop(spdifrx);
848 struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai);
851 spin_lock_irqsave(&spdifrx->irq_lock, flags);
852 spdifrx->substream = NULL;
853 spin_unlock_irqrestore(&spdifrx->irq_lock, flags);
855 clk_disable_unprepare(spdifrx->kclk);
890 .name = "stm32-spdifrx",
901 .compatible = "st,stm32h7-spdifrx",
908 struct stm32_spdifrx_data *spdifrx)
916 spdifrx->regmap_conf = device_get_match_data(&pdev->dev);
917 if (!spdifrx->regmap_conf)
920 spdifrx->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
921 if (IS_ERR(spdifrx->base))
922 return PTR_ERR(spdifrx->base);
924 spdifrx->phys_addr = res->start;
926 spdifrx->kclk = devm_clk_get(&pdev->dev, "kclk");
927 if (IS_ERR(spdifrx->kclk))
928 return dev_err_probe(&pdev->dev, PTR_ERR(spdifrx->kclk),
931 spdifrx->irq = platform_get_irq(pdev, 0);
932 if (spdifrx->irq < 0)
933 return spdifrx->irq;
940 struct stm32_spdifrx_data *spdifrx = platform_get_drvdata(pdev);
942 if (spdifrx->ctrl_chan)
943 dma_release_channel(spdifrx->ctrl_chan);
945 if (spdifrx->dmab)
946 snd_dma_free_pages(spdifrx->dmab);
955 struct stm32_spdifrx_data *spdifrx;
961 spdifrx = devm_kzalloc(&pdev->dev, sizeof(*spdifrx), GFP_KERNEL);
962 if (!spdifrx)
965 spdifrx->pdev = pdev;
966 init_completion(&spdifrx->cs_completion);
967 spin_lock_init(&spdifrx->lock);
968 spin_lock_init(&spdifrx->irq_lock);
970 platform_set_drvdata(pdev, spdifrx);
972 ret = stm32_spdifrx_parse_of(pdev, spdifrx);
976 spdifrx->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "kclk",
977 spdifrx->base,
978 spdifrx->regmap_conf);
979 if (IS_ERR(spdifrx->regmap))
980 return dev_err_probe(&pdev->dev, PTR_ERR(spdifrx->regmap),
983 ret = devm_request_irq(&pdev->dev, spdifrx->irq, stm32_spdifrx_isr, 0,
984 dev_name(&pdev->dev), spdifrx);
1013 ret = stm32_spdifrx_dma_ctrl_register(&pdev->dev, spdifrx);
1017 ret = regmap_read(spdifrx->regmap, STM32_SPDIFRX_IDR, &idr);
1022 ret = regmap_read(spdifrx->regmap, STM32_SPDIFRX_VERR, &ver);
1046 struct stm32_spdifrx_data *spdifrx = dev_get_drvdata(dev);
1048 regcache_cache_only(spdifrx->regmap, true);
1049 regcache_mark_dirty(spdifrx->regmap);
1056 struct stm32_spdifrx_data *spdifrx = dev_get_drvdata(dev);
1058 regcache_cache_only(spdifrx->regmap, false);
1060 return regcache_sync(spdifrx->regmap);
1070 .name = "st,stm32-spdifrx",
1080 MODULE_DESCRIPTION("STM32 Soc spdifrx Interface");
1082 MODULE_ALIAS("platform:stm32-spdifrx");