Lines Matching refs:i2s
229 static unsigned long sun4i_i2s_get_bclk_parent_rate(const struct sun4i_i2s *i2s) in sun4i_i2s_get_bclk_parent_rate() argument
231 return i2s->mclk_freq; in sun4i_i2s_get_bclk_parent_rate()
234 static unsigned long sun8i_i2s_get_bclk_parent_rate(const struct sun4i_i2s *i2s) in sun8i_i2s_get_bclk_parent_rate() argument
236 return clk_get_rate(i2s->mod_clk); in sun8i_i2s_get_bclk_parent_rate()
239 static int sun4i_i2s_get_bclk_div(struct sun4i_i2s *i2s, in sun4i_i2s_get_bclk_div() argument
245 const struct sun4i_i2s_clk_div *dividers = i2s->variant->bclk_dividers; in sun4i_i2s_get_bclk_div()
249 for (i = 0; i < i2s->variant->num_bclk_dividers; i++) { in sun4i_i2s_get_bclk_div()
259 static int sun4i_i2s_get_mclk_div(struct sun4i_i2s *i2s, in sun4i_i2s_get_mclk_div() argument
263 const struct sun4i_i2s_clk_div *dividers = i2s->variant->mclk_dividers; in sun4i_i2s_get_mclk_div()
267 for (i = 0; i < i2s->variant->num_mclk_dividers; i++) { in sun4i_i2s_get_mclk_div()
294 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); in sun4i_i2s_set_clk_rate() local
326 ret = clk_set_rate(i2s->mod_clk, clk_rate); in sun4i_i2s_set_clk_rate()
330 oversample_rate = i2s->mclk_freq / rate; in sun4i_i2s_set_clk_rate()
337 bclk_parent_rate = i2s->variant->get_bclk_parent_rate(i2s); in sun4i_i2s_set_clk_rate()
338 bclk_div = sun4i_i2s_get_bclk_div(i2s, bclk_parent_rate, in sun4i_i2s_set_clk_rate()
345 mclk_div = sun4i_i2s_get_mclk_div(i2s, clk_rate, i2s->mclk_freq); in sun4i_i2s_set_clk_rate()
351 regmap_write(i2s->regmap, SUN4I_I2S_CLK_DIV_REG, in sun4i_i2s_set_clk_rate()
355 regmap_field_write(i2s->field_clkdiv_mclk_en, 1); in sun4i_i2s_set_clk_rate()
360 static s8 sun4i_i2s_get_sr(const struct sun4i_i2s *i2s, int width) in sun4i_i2s_get_sr() argument
371 static s8 sun4i_i2s_get_wss(const struct sun4i_i2s *i2s, int width) in sun4i_i2s_get_wss() argument
382 static s8 sun8i_i2s_get_sr_wss(const struct sun4i_i2s *i2s, int width) in sun8i_i2s_get_sr_wss() argument
393 static int sun4i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s, in sun4i_i2s_set_chan_cfg() argument
399 regmap_write(i2s->regmap, SUN4I_I2S_TX_CHAN_MAP_REG, 0x76543210); in sun4i_i2s_set_chan_cfg()
400 regmap_write(i2s->regmap, SUN4I_I2S_RX_CHAN_MAP_REG, 0x00003210); in sun4i_i2s_set_chan_cfg()
403 regmap_update_bits(i2s->regmap, SUN4I_I2S_TX_CHAN_SEL_REG, in sun4i_i2s_set_chan_cfg()
406 regmap_update_bits(i2s->regmap, SUN4I_I2S_RX_CHAN_SEL_REG, in sun4i_i2s_set_chan_cfg()
413 static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s, in sun8i_i2s_set_chan_cfg() argument
420 if (i2s->slots) in sun8i_i2s_set_chan_cfg()
421 slots = i2s->slots; in sun8i_i2s_set_chan_cfg()
424 regmap_write(i2s->regmap, SUN8I_I2S_TX_CHAN_MAP_REG, 0x76543210); in sun8i_i2s_set_chan_cfg()
425 regmap_write(i2s->regmap, SUN8I_I2S_RX_CHAN_MAP_REG, 0x76543210); in sun8i_i2s_set_chan_cfg()
428 regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG, in sun8i_i2s_set_chan_cfg()
431 regmap_update_bits(i2s->regmap, SUN8I_I2S_RX_CHAN_SEL_REG, in sun8i_i2s_set_chan_cfg()
435 regmap_update_bits(i2s->regmap, SUN8I_I2S_CHAN_CFG_REG, in sun8i_i2s_set_chan_cfg()
438 regmap_update_bits(i2s->regmap, SUN8I_I2S_CHAN_CFG_REG, in sun8i_i2s_set_chan_cfg()
442 switch (i2s->format & SND_SOC_DAIFMT_FORMAT_MASK) { in sun8i_i2s_set_chan_cfg()
458 regmap_update_bits(i2s->regmap, SUN4I_I2S_FMT0_REG, in sun8i_i2s_set_chan_cfg()
462 regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG, in sun8i_i2s_set_chan_cfg()
473 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); in sun4i_i2s_hw_params() local
481 if (i2s->slots) in sun4i_i2s_hw_params()
482 slots = i2s->slots; in sun4i_i2s_hw_params()
484 if (i2s->slot_width) in sun4i_i2s_hw_params()
485 slot_width = i2s->slot_width; in sun4i_i2s_hw_params()
487 ret = i2s->variant->set_chan_cfg(i2s, params); in sun4i_i2s_hw_params()
502 i2s->playback_dma_data.addr_width = width; in sun4i_i2s_hw_params()
504 sr = i2s->variant->get_sr(i2s, word_size); in sun4i_i2s_hw_params()
508 wss = i2s->variant->get_wss(i2s, slot_width); in sun4i_i2s_hw_params()
512 regmap_field_write(i2s->field_fmt_wss, wss); in sun4i_i2s_hw_params()
513 regmap_field_write(i2s->field_fmt_sr, sr); in sun4i_i2s_hw_params()
519 static int sun4i_i2s_set_soc_fmt(const struct sun4i_i2s *i2s, in sun4i_i2s_set_soc_fmt() argument
546 regmap_update_bits(i2s->regmap, SUN4I_I2S_FMT0_REG, in sun4i_i2s_set_soc_fmt()
569 regmap_update_bits(i2s->regmap, SUN4I_I2S_FMT0_REG, in sun4i_i2s_set_soc_fmt()
587 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_set_soc_fmt()
592 static int sun8i_i2s_set_soc_fmt(const struct sun4i_i2s *i2s, in sun8i_i2s_set_soc_fmt() argument
626 regmap_update_bits(i2s->regmap, SUN4I_I2S_FMT0_REG, in sun8i_i2s_set_soc_fmt()
662 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun8i_i2s_set_soc_fmt()
664 regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG, in sun8i_i2s_set_soc_fmt()
667 regmap_update_bits(i2s->regmap, SUN8I_I2S_RX_CHAN_SEL_REG, in sun8i_i2s_set_soc_fmt()
687 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun8i_i2s_set_soc_fmt()
696 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); in sun4i_i2s_set_fmt() local
699 ret = i2s->variant->set_fmt(i2s, fmt); in sun4i_i2s_set_fmt()
706 regmap_update_bits(i2s->regmap, SUN4I_I2S_FIFO_CTRL_REG, in sun4i_i2s_set_fmt()
712 i2s->format = fmt; in sun4i_i2s_set_fmt()
717 static void sun4i_i2s_start_capture(struct sun4i_i2s *i2s) in sun4i_i2s_start_capture() argument
720 regmap_update_bits(i2s->regmap, SUN4I_I2S_FIFO_CTRL_REG, in sun4i_i2s_start_capture()
725 regmap_write(i2s->regmap, SUN4I_I2S_RX_CNT_REG, 0); in sun4i_i2s_start_capture()
728 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_start_capture()
733 regmap_update_bits(i2s->regmap, SUN4I_I2S_DMA_INT_CTRL_REG, in sun4i_i2s_start_capture()
738 static void sun4i_i2s_start_playback(struct sun4i_i2s *i2s) in sun4i_i2s_start_playback() argument
741 regmap_update_bits(i2s->regmap, SUN4I_I2S_FIFO_CTRL_REG, in sun4i_i2s_start_playback()
746 regmap_write(i2s->regmap, SUN4I_I2S_TX_CNT_REG, 0); in sun4i_i2s_start_playback()
749 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_start_playback()
754 regmap_update_bits(i2s->regmap, SUN4I_I2S_DMA_INT_CTRL_REG, in sun4i_i2s_start_playback()
759 static void sun4i_i2s_stop_capture(struct sun4i_i2s *i2s) in sun4i_i2s_stop_capture() argument
762 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_stop_capture()
767 regmap_update_bits(i2s->regmap, SUN4I_I2S_DMA_INT_CTRL_REG, in sun4i_i2s_stop_capture()
772 static void sun4i_i2s_stop_playback(struct sun4i_i2s *i2s) in sun4i_i2s_stop_playback() argument
775 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_stop_playback()
780 regmap_update_bits(i2s->regmap, SUN4I_I2S_DMA_INT_CTRL_REG, in sun4i_i2s_stop_playback()
788 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); in sun4i_i2s_trigger() local
795 sun4i_i2s_start_playback(i2s); in sun4i_i2s_trigger()
797 sun4i_i2s_start_capture(i2s); in sun4i_i2s_trigger()
804 sun4i_i2s_stop_playback(i2s); in sun4i_i2s_trigger()
806 sun4i_i2s_stop_capture(i2s); in sun4i_i2s_trigger()
819 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); in sun4i_i2s_set_sysclk() local
824 i2s->mclk_freq = freq; in sun4i_i2s_set_sysclk()
833 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); in sun4i_i2s_set_tdm_slot() local
838 i2s->slots = slots; in sun4i_i2s_set_tdm_slot()
839 i2s->slot_width = slot_width; in sun4i_i2s_set_tdm_slot()
854 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); in sun4i_i2s_dai_probe() local
857 &i2s->playback_dma_data, in sun4i_i2s_dai_probe()
858 &i2s->capture_dma_data); in sun4i_i2s_dai_probe()
860 snd_soc_dai_set_drvdata(dai, i2s); in sun4i_i2s_dai_probe()
1003 struct sun4i_i2s *i2s = dev_get_drvdata(dev); in sun4i_i2s_runtime_resume() local
1006 ret = clk_prepare_enable(i2s->bus_clk); in sun4i_i2s_runtime_resume()
1012 regcache_cache_only(i2s->regmap, false); in sun4i_i2s_runtime_resume()
1013 regcache_mark_dirty(i2s->regmap); in sun4i_i2s_runtime_resume()
1015 ret = regcache_sync(i2s->regmap); in sun4i_i2s_runtime_resume()
1022 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_runtime_resume()
1026 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_runtime_resume()
1030 ret = clk_prepare_enable(i2s->mod_clk); in sun4i_i2s_runtime_resume()
1039 clk_disable_unprepare(i2s->bus_clk); in sun4i_i2s_runtime_resume()
1045 struct sun4i_i2s *i2s = dev_get_drvdata(dev); in sun4i_i2s_runtime_suspend() local
1047 clk_disable_unprepare(i2s->mod_clk); in sun4i_i2s_runtime_suspend()
1050 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_runtime_suspend()
1054 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, in sun4i_i2s_runtime_suspend()
1057 regcache_cache_only(i2s->regmap, true); in sun4i_i2s_runtime_suspend()
1059 clk_disable_unprepare(i2s->bus_clk); in sun4i_i2s_runtime_suspend()
1160 struct sun4i_i2s *i2s) in sun4i_i2s_init_regmap_fields() argument
1162 i2s->field_clkdiv_mclk_en = in sun4i_i2s_init_regmap_fields()
1163 devm_regmap_field_alloc(dev, i2s->regmap, in sun4i_i2s_init_regmap_fields()
1164 i2s->variant->field_clkdiv_mclk_en); in sun4i_i2s_init_regmap_fields()
1165 if (IS_ERR(i2s->field_clkdiv_mclk_en)) in sun4i_i2s_init_regmap_fields()
1166 return PTR_ERR(i2s->field_clkdiv_mclk_en); in sun4i_i2s_init_regmap_fields()
1168 i2s->field_fmt_wss = in sun4i_i2s_init_regmap_fields()
1169 devm_regmap_field_alloc(dev, i2s->regmap, in sun4i_i2s_init_regmap_fields()
1170 i2s->variant->field_fmt_wss); in sun4i_i2s_init_regmap_fields()
1171 if (IS_ERR(i2s->field_fmt_wss)) in sun4i_i2s_init_regmap_fields()
1172 return PTR_ERR(i2s->field_fmt_wss); in sun4i_i2s_init_regmap_fields()
1174 i2s->field_fmt_sr = in sun4i_i2s_init_regmap_fields()
1175 devm_regmap_field_alloc(dev, i2s->regmap, in sun4i_i2s_init_regmap_fields()
1176 i2s->variant->field_fmt_sr); in sun4i_i2s_init_regmap_fields()
1177 if (IS_ERR(i2s->field_fmt_sr)) in sun4i_i2s_init_regmap_fields()
1178 return PTR_ERR(i2s->field_fmt_sr); in sun4i_i2s_init_regmap_fields()
1185 struct sun4i_i2s *i2s; in sun4i_i2s_probe() local
1190 i2s = devm_kzalloc(&pdev->dev, sizeof(*i2s), GFP_KERNEL); in sun4i_i2s_probe()
1191 if (!i2s) in sun4i_i2s_probe()
1193 platform_set_drvdata(pdev, i2s); in sun4i_i2s_probe()
1204 i2s->variant = of_device_get_match_data(&pdev->dev); in sun4i_i2s_probe()
1205 if (!i2s->variant) { in sun4i_i2s_probe()
1210 i2s->bus_clk = devm_clk_get(&pdev->dev, "apb"); in sun4i_i2s_probe()
1211 if (IS_ERR(i2s->bus_clk)) { in sun4i_i2s_probe()
1213 return PTR_ERR(i2s->bus_clk); in sun4i_i2s_probe()
1216 i2s->regmap = devm_regmap_init_mmio(&pdev->dev, regs, in sun4i_i2s_probe()
1217 i2s->variant->sun4i_i2s_regmap); in sun4i_i2s_probe()
1218 if (IS_ERR(i2s->regmap)) { in sun4i_i2s_probe()
1220 return PTR_ERR(i2s->regmap); in sun4i_i2s_probe()
1223 i2s->mod_clk = devm_clk_get(&pdev->dev, "mod"); in sun4i_i2s_probe()
1224 if (IS_ERR(i2s->mod_clk)) { in sun4i_i2s_probe()
1226 return PTR_ERR(i2s->mod_clk); in sun4i_i2s_probe()
1229 if (i2s->variant->has_reset) { in sun4i_i2s_probe()
1230 i2s->rst = devm_reset_control_get_exclusive(&pdev->dev, NULL); in sun4i_i2s_probe()
1231 if (IS_ERR(i2s->rst)) { in sun4i_i2s_probe()
1233 return PTR_ERR(i2s->rst); in sun4i_i2s_probe()
1237 if (!IS_ERR(i2s->rst)) { in sun4i_i2s_probe()
1238 ret = reset_control_deassert(i2s->rst); in sun4i_i2s_probe()
1246 i2s->playback_dma_data.addr = res->start + in sun4i_i2s_probe()
1247 i2s->variant->reg_offset_txdata; in sun4i_i2s_probe()
1248 i2s->playback_dma_data.maxburst = 8; in sun4i_i2s_probe()
1250 i2s->capture_dma_data.addr = res->start + SUN4I_I2S_FIFO_RX_REG; in sun4i_i2s_probe()
1251 i2s->capture_dma_data.maxburst = 8; in sun4i_i2s_probe()
1260 ret = sun4i_i2s_init_regmap_fields(&pdev->dev, i2s); in sun4i_i2s_probe()
1287 if (!IS_ERR(i2s->rst)) in sun4i_i2s_probe()
1288 reset_control_assert(i2s->rst); in sun4i_i2s_probe()
1295 struct sun4i_i2s *i2s = dev_get_drvdata(&pdev->dev); in sun4i_i2s_remove() local
1301 if (!IS_ERR(i2s->rst)) in sun4i_i2s_remove()
1302 reset_control_assert(i2s->rst); in sun4i_i2s_remove()