Lines Matching refs:i2s

263 static int stm32_i2s_calc_clk_div(struct stm32_i2s_data *i2s,  in stm32_i2s_calc_clk_div()  argument
281 dev_dbg(&i2s->pdev->dev, "Divider: 2*%d(div)+%d(odd) = %d\n", in stm32_i2s_calc_clk_div()
287 dev_err(&i2s->pdev->dev, "Wrong divider setting\n"); in stm32_i2s_calc_clk_div()
292 dev_dbg(&i2s->pdev->dev, in stm32_i2s_calc_clk_div()
296 i2s->div = div; in stm32_i2s_calc_clk_div()
297 i2s->odd = odd; in stm32_i2s_calc_clk_div()
298 i2s->divider = divider; in stm32_i2s_calc_clk_div()
303 static int stm32_i2s_set_clk_div(struct stm32_i2s_data *i2s) in stm32_i2s_set_clk_div() argument
307 cgfr = I2S_CGFR_I2SDIV_SET(i2s->div) | (i2s->odd << I2S_CGFR_ODD_SHIFT); in stm32_i2s_set_clk_div()
310 return regmap_update_bits(i2s->regmap, STM32_I2S_CGFR_REG, in stm32_i2s_set_clk_div()
314 static int stm32_i2s_set_parent_clock(struct stm32_i2s_data *i2s, in stm32_i2s_set_parent_clock() argument
317 struct platform_device *pdev = i2s->pdev; in stm32_i2s_set_parent_clock()
322 parent_clk = i2s->x11kclk; in stm32_i2s_set_parent_clock()
324 parent_clk = i2s->x8kclk; in stm32_i2s_set_parent_clock()
326 ret = clk_set_parent(i2s->i2sclk, parent_clk); in stm32_i2s_set_parent_clock()
338 struct stm32_i2s_data *i2s = mclk->i2s_data; in stm32_i2smclk_round_rate() local
341 ret = stm32_i2s_calc_clk_div(i2s, *prate, rate); in stm32_i2smclk_round_rate()
345 mclk->freq = *prate / i2s->divider; in stm32_i2smclk_round_rate()
362 struct stm32_i2s_data *i2s = mclk->i2s_data; in stm32_i2smclk_set_rate() local
365 ret = stm32_i2s_calc_clk_div(i2s, parent_rate, rate); in stm32_i2smclk_set_rate()
369 ret = stm32_i2s_set_clk_div(i2s); in stm32_i2smclk_set_rate()
381 struct stm32_i2s_data *i2s = mclk->i2s_data; in stm32_i2smclk_enable() local
383 dev_dbg(&i2s->pdev->dev, "Enable master clock\n"); in stm32_i2smclk_enable()
385 return regmap_update_bits(i2s->regmap, STM32_I2S_CGFR_REG, in stm32_i2smclk_enable()
392 struct stm32_i2s_data *i2s = mclk->i2s_data; in stm32_i2smclk_disable() local
394 dev_dbg(&i2s->pdev->dev, "Disable master clock\n"); in stm32_i2smclk_disable()
396 regmap_update_bits(i2s->regmap, STM32_I2S_CGFR_REG, I2S_CGFR_MCKOE, 0); in stm32_i2smclk_disable()
407 static int stm32_i2s_add_mclk_provider(struct stm32_i2s_data *i2s) in stm32_i2s_add_mclk_provider() argument
411 struct device *dev = &i2s->pdev->dev; in stm32_i2s_add_mclk_provider()
412 const char *pname = __clk_get_name(i2s->i2sclk); in stm32_i2s_add_mclk_provider()
437 mclk->i2s_data = i2s; in stm32_i2s_add_mclk_provider()
441 ret = devm_clk_hw_register(&i2s->pdev->dev, hw); in stm32_i2s_add_mclk_provider()
446 i2s->i2smclk = hw->clk; in stm32_i2s_add_mclk_provider()
454 struct stm32_i2s_data *i2s = (struct stm32_i2s_data *)devid; in stm32_i2s_isr() local
455 struct platform_device *pdev = i2s->pdev; in stm32_i2s_isr()
460 regmap_read(i2s->regmap, STM32_I2S_SR_REG, &sr); in stm32_i2s_isr()
461 regmap_read(i2s->regmap, STM32_I2S_IER_REG, &ier); in stm32_i2s_isr()
470 regmap_write_bits(i2s->regmap, STM32_I2S_IFCR_REG, in stm32_i2s_isr()
486 spin_lock(&i2s->irq_lock); in stm32_i2s_isr()
487 if (err && i2s->substream) in stm32_i2s_isr()
488 snd_pcm_stop_xrun(i2s->substream); in stm32_i2s_isr()
489 spin_unlock(&i2s->irq_lock); in stm32_i2s_isr()
543 struct stm32_i2s_data *i2s = snd_soc_dai_get_drvdata(cpu_dai); in stm32_i2s_set_dai_fmt() local
597 i2s->ms_flg = I2S_MS_SLAVE; in stm32_i2s_set_dai_fmt()
600 i2s->ms_flg = I2S_MS_MASTER; in stm32_i2s_set_dai_fmt()
608 i2s->fmt = fmt; in stm32_i2s_set_dai_fmt()
609 return regmap_update_bits(i2s->regmap, STM32_I2S_CGFR_REG, in stm32_i2s_set_dai_fmt()
616 struct stm32_i2s_data *i2s = snd_soc_dai_get_drvdata(cpu_dai); in stm32_i2s_set_sysclk() local
620 freq, STM32_I2S_IS_MASTER(i2s) ? "master" : "slave", in stm32_i2s_set_sysclk()
624 if (dir == SND_SOC_CLOCK_OUT && STM32_I2S_IS_MASTER(i2s)) { in stm32_i2s_set_sysclk()
625 if (!i2s->i2smclk) { in stm32_i2s_set_sysclk()
633 if (i2s->mclk_rate) { in stm32_i2s_set_sysclk()
634 clk_rate_exclusive_put(i2s->i2smclk); in stm32_i2s_set_sysclk()
635 i2s->mclk_rate = 0; in stm32_i2s_set_sysclk()
637 return regmap_update_bits(i2s->regmap, in stm32_i2s_set_sysclk()
642 ret = stm32_i2s_set_parent_clock(i2s, freq); in stm32_i2s_set_sysclk()
645 ret = clk_set_rate_exclusive(i2s->i2smclk, freq); in stm32_i2s_set_sysclk()
650 ret = regmap_update_bits(i2s->regmap, STM32_I2S_CGFR_REG, in stm32_i2s_set_sysclk()
653 i2s->mclk_rate = freq; in stm32_i2s_set_sysclk()
662 struct stm32_i2s_data *i2s = snd_soc_dai_get_drvdata(cpu_dai); in stm32_i2s_configure_clock() local
670 clk_set_parent(i2s->i2sclk, i2s->x11kclk); in stm32_i2s_configure_clock()
672 clk_set_parent(i2s->i2sclk, i2s->x8kclk); in stm32_i2s_configure_clock()
673 i2s_clock_rate = clk_get_rate(i2s->i2sclk); in stm32_i2s_configure_clock()
687 if (i2s->mclk_rate) { in stm32_i2s_configure_clock()
688 ret = stm32_i2s_calc_clk_div(i2s, i2s_clock_rate, in stm32_i2s_configure_clock()
689 i2s->mclk_rate); in stm32_i2s_configure_clock()
694 if ((i2s->fmt & SND_SOC_DAIFMT_FORMAT_MASK) == in stm32_i2s_configure_clock()
699 ret = regmap_read(i2s->regmap, STM32_I2S_CGFR_REG, &cgfr); in stm32_i2s_configure_clock()
704 ret = stm32_i2s_calc_clk_div(i2s, i2s_clock_rate, in stm32_i2s_configure_clock()
710 ret = stm32_i2s_set_clk_div(i2s); in stm32_i2s_configure_clock()
715 return regmap_update_bits(i2s->regmap, STM32_I2S_CFG2_REG, in stm32_i2s_configure_clock()
723 struct stm32_i2s_data *i2s = snd_soc_dai_get_drvdata(cpu_dai); in stm32_i2s_configure() local
744 if (STM32_I2S_IS_SLAVE(i2s)) { in stm32_i2s_configure()
755 ret = regmap_update_bits(i2s->regmap, STM32_I2S_CGFR_REG, in stm32_i2s_configure()
763 return regmap_update_bits(i2s->regmap, STM32_I2S_CFG1_REG, in stm32_i2s_configure()
770 struct stm32_i2s_data *i2s = snd_soc_dai_get_drvdata(cpu_dai); in stm32_i2s_startup() local
774 spin_lock_irqsave(&i2s->irq_lock, flags); in stm32_i2s_startup()
775 i2s->substream = substream; in stm32_i2s_startup()
776 spin_unlock_irqrestore(&i2s->irq_lock, flags); in stm32_i2s_startup()
778 if ((i2s->fmt & SND_SOC_DAIFMT_FORMAT_MASK) != SND_SOC_DAIFMT_DSP_A) in stm32_i2s_startup()
782 ret = clk_prepare_enable(i2s->i2sclk); in stm32_i2s_startup()
788 return regmap_write_bits(i2s->regmap, STM32_I2S_IFCR_REG, in stm32_i2s_startup()
796 struct stm32_i2s_data *i2s = snd_soc_dai_get_drvdata(cpu_dai); in stm32_i2s_hw_params() local
805 if (STM32_I2S_IS_MASTER(i2s)) in stm32_i2s_hw_params()
814 struct stm32_i2s_data *i2s = snd_soc_dai_get_drvdata(cpu_dai); in stm32_i2s_trigger() local
828 regmap_update_bits(i2s->regmap, STM32_I2S_CFG1_REG, in stm32_i2s_trigger()
831 ret = regmap_update_bits(i2s->regmap, STM32_I2S_CR1_REG, in stm32_i2s_trigger()
838 ret = regmap_write_bits(i2s->regmap, STM32_I2S_CR1_REG, in stm32_i2s_trigger()
845 regmap_write_bits(i2s->regmap, STM32_I2S_IFCR_REG, in stm32_i2s_trigger()
848 spin_lock(&i2s->lock_fd); in stm32_i2s_trigger()
849 i2s->refcount++; in stm32_i2s_trigger()
855 if (STM32_I2S_IS_MASTER(i2s) && i2s->refcount == 1) in stm32_i2s_trigger()
857 regmap_write(i2s->regmap, in stm32_i2s_trigger()
860 spin_unlock(&i2s->lock_fd); in stm32_i2s_trigger()
862 if (STM32_I2S_IS_SLAVE(i2s)) in stm32_i2s_trigger()
865 regmap_update_bits(i2s->regmap, STM32_I2S_IER_REG, ier, ier); in stm32_i2s_trigger()
874 regmap_update_bits(i2s->regmap, STM32_I2S_IER_REG, in stm32_i2s_trigger()
878 regmap_update_bits(i2s->regmap, STM32_I2S_IER_REG, in stm32_i2s_trigger()
882 spin_lock(&i2s->lock_fd); in stm32_i2s_trigger()
883 i2s->refcount--; in stm32_i2s_trigger()
884 if (i2s->refcount) { in stm32_i2s_trigger()
885 spin_unlock(&i2s->lock_fd); in stm32_i2s_trigger()
889 ret = regmap_update_bits(i2s->regmap, STM32_I2S_CR1_REG, in stm32_i2s_trigger()
893 spin_unlock(&i2s->lock_fd); in stm32_i2s_trigger()
896 spin_unlock(&i2s->lock_fd); in stm32_i2s_trigger()
899 regmap_update_bits(i2s->regmap, STM32_I2S_CFG1_REG, in stm32_i2s_trigger()
912 struct stm32_i2s_data *i2s = snd_soc_dai_get_drvdata(cpu_dai); in stm32_i2s_shutdown() local
915 clk_disable_unprepare(i2s->i2sclk); in stm32_i2s_shutdown()
917 spin_lock_irqsave(&i2s->irq_lock, flags); in stm32_i2s_shutdown()
918 i2s->substream = NULL; in stm32_i2s_shutdown()
919 spin_unlock_irqrestore(&i2s->irq_lock, flags); in stm32_i2s_shutdown()
924 struct stm32_i2s_data *i2s = dev_get_drvdata(cpu_dai->dev); in stm32_i2s_dai_probe() local
925 struct snd_dmaengine_dai_dma_data *dma_data_tx = &i2s->dma_data_tx; in stm32_i2s_dai_probe()
926 struct snd_dmaengine_dai_dma_data *dma_data_rx = &i2s->dma_data_rx; in stm32_i2s_dai_probe()
930 dma_data_tx->addr = (dma_addr_t)(i2s->phys_addr) + STM32_I2S_TXDR_REG; in stm32_i2s_dai_probe()
933 dma_data_rx->addr = (dma_addr_t)(i2s->phys_addr) + STM32_I2S_RXDR_REG; in stm32_i2s_dai_probe()
994 struct stm32_i2s_data *i2s) in stm32_i2s_dais_init() argument
1008 i2s->dai_drv = dai_ptr; in stm32_i2s_dais_init()
1022 struct stm32_i2s_data *i2s) in stm32_i2s_parse_dt() argument
1035 i2s->regmap_conf = (const struct regmap_config *)of_id->data; in stm32_i2s_parse_dt()
1039 i2s->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in stm32_i2s_parse_dt()
1040 if (IS_ERR(i2s->base)) in stm32_i2s_parse_dt()
1041 return PTR_ERR(i2s->base); in stm32_i2s_parse_dt()
1043 i2s->phys_addr = res->start; in stm32_i2s_parse_dt()
1046 i2s->pclk = devm_clk_get(&pdev->dev, "pclk"); in stm32_i2s_parse_dt()
1047 if (IS_ERR(i2s->pclk)) { in stm32_i2s_parse_dt()
1048 if (PTR_ERR(i2s->pclk) != -EPROBE_DEFER) in stm32_i2s_parse_dt()
1050 PTR_ERR(i2s->pclk)); in stm32_i2s_parse_dt()
1051 return PTR_ERR(i2s->pclk); in stm32_i2s_parse_dt()
1054 i2s->i2sclk = devm_clk_get(&pdev->dev, "i2sclk"); in stm32_i2s_parse_dt()
1055 if (IS_ERR(i2s->i2sclk)) { in stm32_i2s_parse_dt()
1056 if (PTR_ERR(i2s->i2sclk) != -EPROBE_DEFER) in stm32_i2s_parse_dt()
1058 PTR_ERR(i2s->i2sclk)); in stm32_i2s_parse_dt()
1059 return PTR_ERR(i2s->i2sclk); in stm32_i2s_parse_dt()
1062 i2s->x8kclk = devm_clk_get(&pdev->dev, "x8k"); in stm32_i2s_parse_dt()
1063 if (IS_ERR(i2s->x8kclk)) { in stm32_i2s_parse_dt()
1064 if (PTR_ERR(i2s->x8kclk) != -EPROBE_DEFER) in stm32_i2s_parse_dt()
1066 PTR_ERR(i2s->x8kclk)); in stm32_i2s_parse_dt()
1067 return PTR_ERR(i2s->x8kclk); in stm32_i2s_parse_dt()
1070 i2s->x11kclk = devm_clk_get(&pdev->dev, "x11k"); in stm32_i2s_parse_dt()
1071 if (IS_ERR(i2s->x11kclk)) { in stm32_i2s_parse_dt()
1072 if (PTR_ERR(i2s->x11kclk) != -EPROBE_DEFER) in stm32_i2s_parse_dt()
1074 PTR_ERR(i2s->x11kclk)); in stm32_i2s_parse_dt()
1075 return PTR_ERR(i2s->x11kclk); in stm32_i2s_parse_dt()
1080 ret = stm32_i2s_add_mclk_provider(i2s); in stm32_i2s_parse_dt()
1091 dev_name(&pdev->dev), i2s); in stm32_i2s_parse_dt()
1122 struct stm32_i2s_data *i2s; in stm32_i2s_probe() local
1126 i2s = devm_kzalloc(&pdev->dev, sizeof(*i2s), GFP_KERNEL); in stm32_i2s_probe()
1127 if (!i2s) in stm32_i2s_probe()
1130 i2s->pdev = pdev; in stm32_i2s_probe()
1131 i2s->ms_flg = I2S_MS_NOT_SET; in stm32_i2s_probe()
1132 spin_lock_init(&i2s->lock_fd); in stm32_i2s_probe()
1133 spin_lock_init(&i2s->irq_lock); in stm32_i2s_probe()
1134 platform_set_drvdata(pdev, i2s); in stm32_i2s_probe()
1136 ret = stm32_i2s_parse_dt(pdev, i2s); in stm32_i2s_probe()
1140 ret = stm32_i2s_dais_init(pdev, i2s); in stm32_i2s_probe()
1144 i2s->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "pclk", in stm32_i2s_probe()
1145 i2s->base, i2s->regmap_conf); in stm32_i2s_probe()
1146 if (IS_ERR(i2s->regmap)) { in stm32_i2s_probe()
1147 if (PTR_ERR(i2s->regmap) != -EPROBE_DEFER) in stm32_i2s_probe()
1149 PTR_ERR(i2s->regmap)); in stm32_i2s_probe()
1150 return PTR_ERR(i2s->regmap); in stm32_i2s_probe()
1161 i2s->dai_drv, 1); in stm32_i2s_probe()
1168 ret = regmap_update_bits(i2s->regmap, STM32_I2S_CGFR_REG, in stm32_i2s_probe()
1173 ret = regmap_read(i2s->regmap, STM32_I2S_IPIDR_REG, &val); in stm32_i2s_probe()
1178 ret = regmap_read(i2s->regmap, STM32_I2S_HWCFGR_REG, &val); in stm32_i2s_probe()
1189 ret = regmap_read(i2s->regmap, STM32_I2S_VERR_REG, &val); in stm32_i2s_probe()
1211 struct stm32_i2s_data *i2s = dev_get_drvdata(dev); in stm32_i2s_suspend() local
1213 regcache_cache_only(i2s->regmap, true); in stm32_i2s_suspend()
1214 regcache_mark_dirty(i2s->regmap); in stm32_i2s_suspend()
1221 struct stm32_i2s_data *i2s = dev_get_drvdata(dev); in stm32_i2s_resume() local
1223 regcache_cache_only(i2s->regmap, false); in stm32_i2s_resume()
1224 return regcache_sync(i2s->regmap); in stm32_i2s_resume()