Lines Matching full:i2s
159 /* Register fields for i2s */
183 /* Register fields for i2s */
225 static int sun4i_i2s_get_bclk_div(struct sun4i_i2s *i2s, in sun4i_i2s_get_bclk_div() argument
243 static int sun4i_i2s_get_mclk_div(struct sun4i_i2s *i2s, in sun4i_i2s_get_mclk_div() argument
277 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); in sun4i_i2s_set_clk_rate() local
309 ret = clk_set_rate(i2s->mod_clk, clk_rate); in sun4i_i2s_set_clk_rate()
313 oversample_rate = i2s->mclk_freq / rate; in sun4i_i2s_set_clk_rate()
320 bclk_div = sun4i_i2s_get_bclk_div(i2s, i2s->mclk_freq, in sun4i_i2s_set_clk_rate()
327 mclk_div = sun4i_i2s_get_mclk_div(i2s, oversample_rate, in sun4i_i2s_set_clk_rate()
335 bclk_div += i2s->variant->bclk_offset; in sun4i_i2s_set_clk_rate()
336 mclk_div += i2s->variant->mclk_offset; in sun4i_i2s_set_clk_rate()
338 regmap_write(i2s->regmap, SUN4I_I2S_CLK_DIV_REG, in sun4i_i2s_set_clk_rate()
342 regmap_field_write(i2s->field_clkdiv_mclk_en, 1); in sun4i_i2s_set_clk_rate()
345 if (i2s->variant->has_fmt_set_lrck_period) in sun4i_i2s_set_clk_rate()
346 regmap_update_bits(i2s->regmap, SUN4I_I2S_FMT0_REG, in sun4i_i2s_set_clk_rate()
357 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); in sun4i_i2s_hw_params() local
368 if (i2s->variant->has_chcfg) { in sun4i_i2s_hw_params()
369 regmap_update_bits(i2s->regmap, SUN8I_I2S_CHAN_CFG_REG, in sun4i_i2s_hw_params()
372 regmap_update_bits(i2s->regmap, SUN8I_I2S_CHAN_CFG_REG, in sun4i_i2s_hw_params()
378 regmap_field_write(i2s->field_txchanmap, 0x76543210); in sun4i_i2s_hw_params()
379 regmap_field_write(i2s->field_rxchanmap, 0x00003210); in sun4i_i2s_hw_params()
382 regmap_field_write(i2s->field_txchansel, in sun4i_i2s_hw_params()
385 regmap_field_write(i2s->field_rxchansel, in sun4i_i2s_hw_params()
388 if (i2s->variant->has_chsel_tx_chen) in sun4i_i2s_hw_params()
389 regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG, in sun4i_i2s_hw_params()
402 i2s->playback_dma_data.addr_width = width; in sun4i_i2s_hw_params()
416 regmap_field_write(i2s->field_fmt_wss, in sun4i_i2s_hw_params()
417 wss + i2s->variant->fmt_offset); in sun4i_i2s_hw_params()
418 regmap_field_write(i2s->field_fmt_sr, in sun4i_i2s_hw_params()
419 sr + i2s->variant->fmt_offset); in sun4i_i2s_hw_params()
427 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); in sun4i_i2s_set_fmt() local
451 if (i2s->variant->has_chsel_offset) { in sun4i_i2s_set_fmt()
453 * offset being set indicates that we're connected to an i2s in sun4i_i2s_set_fmt()
455 * i2s shares the same setting with the LJ format. Increment in sun4i_i2s_set_fmt()
460 /* blck offset determines whether i2s or LJ */ in sun4i_i2s_set_fmt()
461 regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG, in sun4i_i2s_set_fmt()
465 regmap_update_bits(i2s->regmap, SUN8I_I2S_RX_CHAN_SEL_REG, in sun4i_i2s_set_fmt()
470 regmap_field_write(i2s->field_fmt_mode, val); in sun4i_i2s_set_fmt()
495 regmap_field_write(i2s->field_fmt_bclk, bclk_polarity); in sun4i_i2s_set_fmt()
496 regmap_field_write(i2s->field_fmt_lrclk, lrclk_polarity); in sun4i_i2s_set_fmt()
498 if (i2s->variant->has_slave_select_bit) { in sun4i_i2s_set_fmt()
514 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_set_fmt()
519 * The newer i2s block does not have a slave select bit, in sun4i_i2s_set_fmt()
538 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_set_fmt()
545 regmap_update_bits(i2s->regmap, SUN4I_I2S_FIFO_CTRL_REG, in sun4i_i2s_set_fmt()
553 static void sun4i_i2s_start_capture(struct sun4i_i2s *i2s) in sun4i_i2s_start_capture() argument
556 regmap_update_bits(i2s->regmap, SUN4I_I2S_FIFO_CTRL_REG, in sun4i_i2s_start_capture()
561 regmap_write(i2s->regmap, SUN4I_I2S_RX_CNT_REG, 0); in sun4i_i2s_start_capture()
564 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_start_capture()
569 regmap_update_bits(i2s->regmap, SUN4I_I2S_DMA_INT_CTRL_REG, in sun4i_i2s_start_capture()
574 static void sun4i_i2s_start_playback(struct sun4i_i2s *i2s) in sun4i_i2s_start_playback() argument
577 regmap_update_bits(i2s->regmap, SUN4I_I2S_FIFO_CTRL_REG, in sun4i_i2s_start_playback()
582 regmap_write(i2s->regmap, SUN4I_I2S_TX_CNT_REG, 0); in sun4i_i2s_start_playback()
585 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_start_playback()
590 regmap_update_bits(i2s->regmap, SUN4I_I2S_DMA_INT_CTRL_REG, in sun4i_i2s_start_playback()
595 static void sun4i_i2s_stop_capture(struct sun4i_i2s *i2s) in sun4i_i2s_stop_capture() argument
598 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_stop_capture()
603 regmap_update_bits(i2s->regmap, SUN4I_I2S_DMA_INT_CTRL_REG, in sun4i_i2s_stop_capture()
608 static void sun4i_i2s_stop_playback(struct sun4i_i2s *i2s) in sun4i_i2s_stop_playback() argument
611 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_stop_playback()
616 regmap_update_bits(i2s->regmap, SUN4I_I2S_DMA_INT_CTRL_REG, in sun4i_i2s_stop_playback()
624 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); in sun4i_i2s_trigger() local
631 sun4i_i2s_start_playback(i2s); in sun4i_i2s_trigger()
633 sun4i_i2s_start_capture(i2s); in sun4i_i2s_trigger()
640 sun4i_i2s_stop_playback(i2s); in sun4i_i2s_trigger()
642 sun4i_i2s_stop_capture(i2s); in sun4i_i2s_trigger()
655 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); in sun4i_i2s_startup() local
658 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_startup()
662 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_startup()
667 return clk_prepare_enable(i2s->mod_clk); in sun4i_i2s_startup()
673 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); in sun4i_i2s_shutdown() local
675 clk_disable_unprepare(i2s->mod_clk); in sun4i_i2s_shutdown()
678 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_shutdown()
682 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_shutdown()
689 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); in sun4i_i2s_set_sysclk() local
694 i2s->mclk_freq = freq; in sun4i_i2s_set_sysclk()
710 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); in sun4i_i2s_dai_probe() local
713 &i2s->playback_dma_data, in sun4i_i2s_dai_probe()
714 &i2s->capture_dma_data); in sun4i_i2s_dai_probe()
716 snd_soc_dai_set_drvdata(dai, i2s); in sun4i_i2s_dai_probe()
859 struct sun4i_i2s *i2s = dev_get_drvdata(dev); in sun4i_i2s_runtime_resume() local
862 ret = clk_prepare_enable(i2s->bus_clk); in sun4i_i2s_runtime_resume()
868 regcache_cache_only(i2s->regmap, false); in sun4i_i2s_runtime_resume()
869 regcache_mark_dirty(i2s->regmap); in sun4i_i2s_runtime_resume()
871 ret = regcache_sync(i2s->regmap); in sun4i_i2s_runtime_resume()
880 clk_disable_unprepare(i2s->bus_clk); in sun4i_i2s_runtime_resume()
886 struct sun4i_i2s *i2s = dev_get_drvdata(dev); in sun4i_i2s_runtime_suspend() local
888 regcache_cache_only(i2s->regmap, true); in sun4i_i2s_runtime_suspend()
890 clk_disable_unprepare(i2s->bus_clk); in sun4i_i2s_runtime_suspend()
970 struct sun4i_i2s *i2s) in sun4i_i2s_init_regmap_fields() argument
972 i2s->field_clkdiv_mclk_en = in sun4i_i2s_init_regmap_fields()
973 devm_regmap_field_alloc(dev, i2s->regmap, in sun4i_i2s_init_regmap_fields()
974 i2s->variant->field_clkdiv_mclk_en); in sun4i_i2s_init_regmap_fields()
975 if (IS_ERR(i2s->field_clkdiv_mclk_en)) in sun4i_i2s_init_regmap_fields()
976 return PTR_ERR(i2s->field_clkdiv_mclk_en); in sun4i_i2s_init_regmap_fields()
978 i2s->field_fmt_wss = in sun4i_i2s_init_regmap_fields()
979 devm_regmap_field_alloc(dev, i2s->regmap, in sun4i_i2s_init_regmap_fields()
980 i2s->variant->field_fmt_wss); in sun4i_i2s_init_regmap_fields()
981 if (IS_ERR(i2s->field_fmt_wss)) in sun4i_i2s_init_regmap_fields()
982 return PTR_ERR(i2s->field_fmt_wss); in sun4i_i2s_init_regmap_fields()
984 i2s->field_fmt_sr = in sun4i_i2s_init_regmap_fields()
985 devm_regmap_field_alloc(dev, i2s->regmap, in sun4i_i2s_init_regmap_fields()
986 i2s->variant->field_fmt_sr); in sun4i_i2s_init_regmap_fields()
987 if (IS_ERR(i2s->field_fmt_sr)) in sun4i_i2s_init_regmap_fields()
988 return PTR_ERR(i2s->field_fmt_sr); in sun4i_i2s_init_regmap_fields()
990 i2s->field_fmt_bclk = in sun4i_i2s_init_regmap_fields()
991 devm_regmap_field_alloc(dev, i2s->regmap, in sun4i_i2s_init_regmap_fields()
992 i2s->variant->field_fmt_bclk); in sun4i_i2s_init_regmap_fields()
993 if (IS_ERR(i2s->field_fmt_bclk)) in sun4i_i2s_init_regmap_fields()
994 return PTR_ERR(i2s->field_fmt_bclk); in sun4i_i2s_init_regmap_fields()
996 i2s->field_fmt_lrclk = in sun4i_i2s_init_regmap_fields()
997 devm_regmap_field_alloc(dev, i2s->regmap, in sun4i_i2s_init_regmap_fields()
998 i2s->variant->field_fmt_lrclk); in sun4i_i2s_init_regmap_fields()
999 if (IS_ERR(i2s->field_fmt_lrclk)) in sun4i_i2s_init_regmap_fields()
1000 return PTR_ERR(i2s->field_fmt_lrclk); in sun4i_i2s_init_regmap_fields()
1002 i2s->field_fmt_mode = in sun4i_i2s_init_regmap_fields()
1003 devm_regmap_field_alloc(dev, i2s->regmap, in sun4i_i2s_init_regmap_fields()
1004 i2s->variant->field_fmt_mode); in sun4i_i2s_init_regmap_fields()
1005 if (IS_ERR(i2s->field_fmt_mode)) in sun4i_i2s_init_regmap_fields()
1006 return PTR_ERR(i2s->field_fmt_mode); in sun4i_i2s_init_regmap_fields()
1008 i2s->field_txchanmap = in sun4i_i2s_init_regmap_fields()
1009 devm_regmap_field_alloc(dev, i2s->regmap, in sun4i_i2s_init_regmap_fields()
1010 i2s->variant->field_txchanmap); in sun4i_i2s_init_regmap_fields()
1011 if (IS_ERR(i2s->field_txchanmap)) in sun4i_i2s_init_regmap_fields()
1012 return PTR_ERR(i2s->field_txchanmap); in sun4i_i2s_init_regmap_fields()
1014 i2s->field_rxchanmap = in sun4i_i2s_init_regmap_fields()
1015 devm_regmap_field_alloc(dev, i2s->regmap, in sun4i_i2s_init_regmap_fields()
1016 i2s->variant->field_rxchanmap); in sun4i_i2s_init_regmap_fields()
1017 if (IS_ERR(i2s->field_rxchanmap)) in sun4i_i2s_init_regmap_fields()
1018 return PTR_ERR(i2s->field_rxchanmap); in sun4i_i2s_init_regmap_fields()
1020 i2s->field_txchansel = in sun4i_i2s_init_regmap_fields()
1021 devm_regmap_field_alloc(dev, i2s->regmap, in sun4i_i2s_init_regmap_fields()
1022 i2s->variant->field_txchansel); in sun4i_i2s_init_regmap_fields()
1023 if (IS_ERR(i2s->field_txchansel)) in sun4i_i2s_init_regmap_fields()
1024 return PTR_ERR(i2s->field_txchansel); in sun4i_i2s_init_regmap_fields()
1026 i2s->field_rxchansel = in sun4i_i2s_init_regmap_fields()
1027 devm_regmap_field_alloc(dev, i2s->regmap, in sun4i_i2s_init_regmap_fields()
1028 i2s->variant->field_rxchansel); in sun4i_i2s_init_regmap_fields()
1029 return PTR_ERR_OR_ZERO(i2s->field_rxchansel); in sun4i_i2s_init_regmap_fields()
1034 struct sun4i_i2s *i2s; in sun4i_i2s_probe() local
1039 i2s = devm_kzalloc(&pdev->dev, sizeof(*i2s), GFP_KERNEL); in sun4i_i2s_probe()
1040 if (!i2s) in sun4i_i2s_probe()
1042 platform_set_drvdata(pdev, i2s); in sun4i_i2s_probe()
1055 i2s->variant = of_device_get_match_data(&pdev->dev); in sun4i_i2s_probe()
1056 if (!i2s->variant) { in sun4i_i2s_probe()
1061 i2s->bus_clk = devm_clk_get(&pdev->dev, "apb"); in sun4i_i2s_probe()
1062 if (IS_ERR(i2s->bus_clk)) { in sun4i_i2s_probe()
1064 return PTR_ERR(i2s->bus_clk); in sun4i_i2s_probe()
1067 i2s->regmap = devm_regmap_init_mmio(&pdev->dev, regs, in sun4i_i2s_probe()
1068 i2s->variant->sun4i_i2s_regmap); in sun4i_i2s_probe()
1069 if (IS_ERR(i2s->regmap)) { in sun4i_i2s_probe()
1071 return PTR_ERR(i2s->regmap); in sun4i_i2s_probe()
1074 i2s->mod_clk = devm_clk_get(&pdev->dev, "mod"); in sun4i_i2s_probe()
1075 if (IS_ERR(i2s->mod_clk)) { in sun4i_i2s_probe()
1077 return PTR_ERR(i2s->mod_clk); in sun4i_i2s_probe()
1080 if (i2s->variant->has_reset) { in sun4i_i2s_probe()
1081 i2s->rst = devm_reset_control_get_exclusive(&pdev->dev, NULL); in sun4i_i2s_probe()
1082 if (IS_ERR(i2s->rst)) { in sun4i_i2s_probe()
1084 return PTR_ERR(i2s->rst); in sun4i_i2s_probe()
1088 if (!IS_ERR(i2s->rst)) { in sun4i_i2s_probe()
1089 ret = reset_control_deassert(i2s->rst); in sun4i_i2s_probe()
1097 i2s->playback_dma_data.addr = res->start + in sun4i_i2s_probe()
1098 i2s->variant->reg_offset_txdata; in sun4i_i2s_probe()
1099 i2s->playback_dma_data.maxburst = 8; in sun4i_i2s_probe()
1101 i2s->capture_dma_data.addr = res->start + SUN4I_I2S_FIFO_RX_REG; in sun4i_i2s_probe()
1102 i2s->capture_dma_data.maxburst = 8; in sun4i_i2s_probe()
1125 ret = sun4i_i2s_init_regmap_fields(&pdev->dev, i2s); in sun4i_i2s_probe()
1138 if (!IS_ERR(i2s->rst)) in sun4i_i2s_probe()
1139 reset_control_assert(i2s->rst); in sun4i_i2s_probe()
1146 struct sun4i_i2s *i2s = dev_get_drvdata(&pdev->dev); in sun4i_i2s_remove() local
1154 if (!IS_ERR(i2s->rst)) in sun4i_i2s_remove()
1155 reset_control_assert(i2s->rst); in sun4i_i2s_remove()
1162 .compatible = "allwinner,sun4i-a10-i2s",
1166 .compatible = "allwinner,sun6i-a31-i2s",
1170 .compatible = "allwinner,sun8i-a83t-i2s",
1174 .compatible = "allwinner,sun8i-h3-i2s",
1190 .name = "sun4i-i2s",
1199 MODULE_DESCRIPTION("Allwinner A10 I2S driver");