Lines Matching refs:aio

244 static int audio_ssp_init_portregs(struct cygnus_aio_port *aio)
249 switch (aio->port_type) {
251 value = readl(aio->cygaud->audio + aio->regs.i2s_stream_cfg);
255 writel(aio->portnum,
256 aio->cygaud->audio + aio->regs.bf_sourcech_grp);
259 value |= aio->portnum << I2S_OUT_STREAM_CFG_GROUP_ID;
260 value |= aio->portnum; /* FCI ID is the port num */
262 writel(value, aio->cygaud->audio + aio->regs.i2s_stream_cfg);
265 value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
269 writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
272 value = readl(aio->cygaud->i2s_in +
273 aio->regs.i2s_cap_stream_cfg);
275 value |= aio->portnum << I2S_IN_STREAM_CFG_0_GROUP_ID;
276 writel(value, aio->cygaud->i2s_in +
277 aio->regs.i2s_cap_stream_cfg);
280 fci_id = CAPTURE_FCI_ID_BASE + aio->portnum;
282 value = readl(aio->cygaud->audio + aio->regs.bf_destch_cfg);
287 writel(value, aio->cygaud->audio + aio->regs.bf_destch_cfg);
290 value = readl(aio->cygaud->audio + AUD_MISC_SEROUT_OE_REG_BASE);
291 value &= ~BIT((aio->portnum * 4) + AUD_MISC_SEROUT_SDAT_OE);
292 writel(value, aio->cygaud->audio + AUD_MISC_SEROUT_OE_REG_BASE);
295 writel(aio->portnum, aio->cygaud->audio + BF_SRC_GRP3_OFFSET);
297 value = readl(aio->cygaud->audio + SPDIF_CTRL_OFFSET);
299 writel(value, aio->cygaud->audio + SPDIF_CTRL_OFFSET);
302 value = readl(aio->cygaud->audio + SPDIF_STREAM_CFG_OFFSET);
304 value |= aio->portnum; /* FCI ID is the port num */
306 writel(value, aio->cygaud->audio + SPDIF_STREAM_CFG_OFFSET);
308 value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
312 writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
315 value = readl(aio->cygaud->audio + AUD_MISC_SEROUT_OE_REG_BASE);
317 writel(value, aio->cygaud->audio + AUD_MISC_SEROUT_OE_REG_BASE);
320 dev_err(aio->cygaud->dev, "Port not supported\n");
327 static void audio_ssp_in_enable(struct cygnus_aio_port *aio)
331 value = readl(aio->cygaud->audio + aio->regs.bf_destch_cfg);
333 writel(value, aio->cygaud->audio + aio->regs.bf_destch_cfg);
335 writel(0x1, aio->cygaud->audio + aio->regs.bf_destch_ctrl);
337 value = readl(aio->cygaud->audio + aio->regs.i2s_cfg);
340 writel(value, aio->cygaud->audio + aio->regs.i2s_cfg);
342 value = readl(aio->cygaud->i2s_in + aio->regs.i2s_cap_stream_cfg);
344 writel(value, aio->cygaud->i2s_in + aio->regs.i2s_cap_stream_cfg);
346 aio->streams_on |= CAPTURE_STREAM_MASK;
349 static void audio_ssp_in_disable(struct cygnus_aio_port *aio)
353 value = readl(aio->cygaud->i2s_in + aio->regs.i2s_cap_stream_cfg);
355 writel(value, aio->cygaud->i2s_in + aio->regs.i2s_cap_stream_cfg);
357 aio->streams_on &= ~CAPTURE_STREAM_MASK;
360 if (!aio->streams_on) {
361 value = readl(aio->cygaud->audio + aio->regs.i2s_cfg);
364 writel(value, aio->cygaud->audio + aio->regs.i2s_cfg);
367 writel(0x0, aio->cygaud->audio + aio->regs.bf_destch_ctrl);
369 value = readl(aio->cygaud->audio + aio->regs.bf_destch_cfg);
371 writel(value, aio->cygaud->audio + aio->regs.bf_destch_cfg);
374 static int audio_ssp_out_enable(struct cygnus_aio_port *aio)
379 switch (aio->port_type) {
381 value = readl(aio->cygaud->audio + aio->regs.i2s_stream_cfg);
383 writel(value, aio->cygaud->audio + aio->regs.i2s_stream_cfg);
385 writel(1, aio->cygaud->audio + aio->regs.bf_sourcech_ctrl);
387 value = readl(aio->cygaud->audio + aio->regs.i2s_cfg);
390 writel(value, aio->cygaud->audio + aio->regs.i2s_cfg);
392 value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
394 writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
396 aio->streams_on |= PLAYBACK_STREAM_MASK;
399 value = readl(aio->cygaud->audio + SPDIF_FORMAT_CFG_OFFSET);
401 writel(value, aio->cygaud->audio + SPDIF_FORMAT_CFG_OFFSET);
403 writel(1, aio->cygaud->audio + aio->regs.bf_sourcech_ctrl);
405 value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
407 writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
410 dev_err(aio->cygaud->dev,
411 "Port not supported %d\n", aio->portnum);
418 static int audio_ssp_out_disable(struct cygnus_aio_port *aio)
423 switch (aio->port_type) {
425 aio->streams_on &= ~PLAYBACK_STREAM_MASK;
428 if (!aio->streams_on) {
429 value = readl(aio->cygaud->audio + aio->regs.i2s_cfg);
432 writel(value, aio->cygaud->audio + aio->regs.i2s_cfg);
436 value = readl(aio->cygaud->audio + BF_SRC_GRP_SYNC_DIS_OFFSET);
437 value |= BIT(aio->portnum);
438 writel(value, aio->cygaud->audio + BF_SRC_GRP_SYNC_DIS_OFFSET);
440 writel(0, aio->cygaud->audio + aio->regs.bf_sourcech_ctrl);
442 value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
444 writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
447 value = readl(aio->cygaud->audio + BF_SRC_GRP_SYNC_DIS_OFFSET);
448 value &= ~BIT(aio->portnum);
449 writel(value, aio->cygaud->audio + BF_SRC_GRP_SYNC_DIS_OFFSET);
451 value = readl(aio->cygaud->audio + aio->regs.i2s_stream_cfg);
453 writel(value, aio->cygaud->audio + aio->regs.i2s_stream_cfg);
456 value = readl(aio->cygaud->i2s_in + IOP_SW_INIT_LOGIC);
457 value |= BIT(aio->portnum);
458 writel(value, aio->cygaud->i2s_in + IOP_SW_INIT_LOGIC);
459 value &= ~BIT(aio->portnum);
460 writel(value, aio->cygaud->i2s_in + IOP_SW_INIT_LOGIC);
463 value = readl(aio->cygaud->audio + SPDIF_FORMAT_CFG_OFFSET);
465 writel(value, aio->cygaud->audio + SPDIF_FORMAT_CFG_OFFSET);
466 writel(0, aio->cygaud->audio + aio->regs.bf_sourcech_ctrl);
468 value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
470 writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
473 dev_err(aio->cygaud->dev,
474 "Port not supported %d\n", aio->portnum);
482 struct cygnus_aio_port *aio)
504 if ((aio->clk_trace.cap_en) && (!aio->clk_trace.cap_clk_en)) {
511 aio->clk_trace.cap_clk_en = true;
514 if ((aio->clk_trace.play_en) && (!aio->clk_trace.play_clk_en)) {
521 aio->clk_trace.play_clk_en = true;
534 static int cygnus_ssp_set_clocks(struct cygnus_aio_port *aio)
543 bit_rate = aio->bit_per_frame * aio->lrclk;
550 if ((aio->mclk % bit_rate) != 0)
553 ratio = aio->mclk / bit_rate;
566 dev_err(aio->cygaud->dev,
568 dev_err(aio->cygaud->dev, "lrclk = %u, bits/frame = %u, mclk = %u\n",
569 aio->lrclk, aio->bit_per_frame, aio->mclk);
574 switch (aio->port_type) {
576 sclk = aio->bit_per_frame;
584 value = readl(aio->cygaud->audio + aio->regs.i2s_cfg);
587 writel(value, aio->cygaud->audio + aio->regs.i2s_cfg);
588 dev_dbg(aio->cygaud->dev,
594 dev_err(aio->cygaud->dev, "Unknown port type\n");
599 value = readl(aio->cygaud->audio + aio->regs.i2s_mclk_cfg);
602 writel(value, aio->cygaud->audio + aio->regs.i2s_mclk_cfg);
604 dev_dbg(aio->cygaud->dev, "mclk cfg reg = 0x%x\n", value);
605 dev_dbg(aio->cygaud->dev, "bits per frame = %u, mclk = %u Hz, lrclk = %u Hz\n",
606 aio->bit_per_frame, aio->mclk, aio->lrclk);
614 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(dai);
620 dev_dbg(aio->cygaud->dev, "%s port = %d\n", __func__, aio->portnum);
621 dev_dbg(aio->cygaud->dev, "params_channels %d\n",
623 dev_dbg(aio->cygaud->dev, "rate %d\n", params_rate(params));
624 dev_dbg(aio->cygaud->dev, "format %d\n", params_format(params));
628 switch (aio->mode) {
631 dev_err(aio->cygaud->dev, "Cannot run %d channels at %dHz\n",
637 aio->bit_per_frame = 64; /* I2S must be 64 bit per frame */
640 dev_err(aio->cygaud->dev,
646 value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
649 writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
665 value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
668 writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
674 value = readl(aio->cygaud->audio +
675 aio->regs.bf_destch_cfg);
677 writel(value, aio->cygaud->audio +
678 aio->regs.bf_destch_cfg);
682 value = readl(aio->cygaud->audio +
683 aio->regs.bf_destch_cfg);
685 writel(value, aio->cygaud->audio +
686 aio->regs.bf_destch_cfg);
694 aio->lrclk = rate;
696 if (!aio->is_slave)
697 ret = cygnus_ssp_set_clocks(aio);
710 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(dai);
713 dev_dbg(aio->cygaud->dev,
714 "%s Enter port = %d\n", __func__, aio->portnum);
715 sel = pll_configure_mclk(cygaud, freq, aio);
717 dev_err(aio->cygaud->dev,
722 aio->mclk = freq;
724 dev_dbg(aio->cygaud->dev, "%s Setting MCLKSEL to %d\n", __func__, sel);
725 value = readl(aio->cygaud->audio + aio->regs.i2s_mclk_cfg);
728 writel(value, aio->cygaud->audio + aio->regs.i2s_mclk_cfg);
736 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(dai);
738 snd_soc_dai_set_dma_data(dai, substream, aio);
740 aio->clk_trace.play_en = true;
742 aio->clk_trace.cap_en = true;
755 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(dai);
758 aio->clk_trace.play_en = false;
760 aio->clk_trace.cap_en = false;
762 if (!aio->is_slave) {
765 val = readl(aio->cygaud->audio + aio->regs.i2s_mclk_cfg);
767 if (val >= ARRAY_SIZE(aio->cygaud->audio_clk)) {
768 dev_err(aio->cygaud->dev, "Clk index %u is out of bounds\n",
774 if (aio->clk_trace.play_clk_en) {
775 clk_disable_unprepare(aio->cygaud->
777 aio->clk_trace.play_clk_en = false;
780 if (aio->clk_trace.cap_clk_en) {
781 clk_disable_unprepare(aio->cygaud->
783 aio->clk_trace.cap_clk_en = false;
813 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(cpu_dai);
816 aio->fsync_width = len;
826 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(cpu_dai);
834 dev_dbg(aio->cygaud->dev, "%s Enter fmt: %x\n", __func__, fmt);
836 if (aio->port_type == PORT_SPDIF)
844 aio->is_slave = 1;
848 aio->is_slave = 0;
858 aio->mode = CYGNUS_SSPMODE_I2S;
869 if ((aio->fsync_width > 0) && (aio->fsync_width < 256))
871 (aio->fsync_width << I2S_OUT_CFGX_FSYNC_WIDTH);
875 aio->mode = CYGNUS_SSPMODE_TDM;
886 ssp_curcfg = readl(aio->cygaud->audio + aio->regs.i2s_cfg);
888 writel(ssp_outcfg, aio->cygaud->audio + aio->regs.i2s_cfg);
894 ssp_curcfg = readl(aio->cygaud->i2s_in + aio->regs.i2s_cap_cfg);
896 writel(ssp_incfg, aio->cygaud->i2s_in + aio->regs.i2s_cap_cfg);
898 val = readl(aio->cygaud->audio + AUD_MISC_SEROUT_OE_REG_BASE);
908 mask = mask << (aio->portnum * 4);
909 if (aio->is_slave)
916 dev_dbg(aio->cygaud->dev, "%s Set OE bits 0x%x\n", __func__, val);
917 writel(val, aio->cygaud->audio + AUD_MISC_SEROUT_OE_REG_BASE);
925 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(dai);
928 dev_dbg(aio->cygaud->dev,
929 "%s cmd %d at port = %d\n", __func__, cmd, aio->portnum);
936 audio_ssp_out_enable(aio);
938 audio_ssp_in_enable(aio);
947 audio_ssp_out_disable(aio);
949 audio_ssp_in_disable(aio);
963 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(cpu_dai);
972 dev_err(aio->cygaud->dev,
1000 dev_warn(aio->cygaud->dev,
1014 dev_err(aio->cygaud->dev,
1020 aio->bit_per_frame = frame_bits;
1022 dev_dbg(aio->cygaud->dev, "%s active_slots %u, bits per frame %d\n",
1026 value = readl(aio->cygaud->i2s_in + aio->regs.i2s_cap_cfg);
1031 writel(value, aio->cygaud->i2s_in + aio->regs.i2s_cap_cfg);
1034 value = readl(aio->cygaud->audio + aio->regs.i2s_cfg);
1039 writel(value, aio->cygaud->audio + aio->regs.i2s_cfg);
1047 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(cpu_dai);
1052 if (!aio->is_slave) {
1055 val = readl(aio->cygaud->audio + aio->regs.i2s_mclk_cfg);
1057 if (val >= ARRAY_SIZE(aio->cygaud->audio_clk)) {
1058 dev_err(aio->cygaud->dev, "Clk index %u is out of bounds\n",
1063 if (aio->clk_trace.cap_clk_en)
1064 clk_disable_unprepare(aio->cygaud->audio_clk[val]);
1065 if (aio->clk_trace.play_clk_en)
1066 clk_disable_unprepare(aio->cygaud->audio_clk[val]);
1068 aio->pll_clk_num = val;
1087 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(cpu_dai);
1093 if (!aio->is_slave) {
1094 if (aio->clk_trace.cap_clk_en) {
1095 error = clk_prepare_enable(aio->cygaud->
1096 audio_clk[aio->pll_clk_num]);
1098 dev_err(aio->cygaud->dev, "%s clk_prepare_enable failed\n",
1103 if (aio->clk_trace.play_clk_en) {
1104 error = clk_prepare_enable(aio->cygaud->
1105 audio_clk[aio->pll_clk_num]);
1107 if (aio->clk_trace.cap_clk_en)
1108 clk_disable_unprepare(aio->cygaud->
1109 audio_clk[aio->pll_clk_num]);
1110 dev_err(aio->cygaud->dev, "%s clk_prepare_enable failed\n",
1210 struct cygnus_aio_port *aio;
1243 aio = &cygaud->portinfo[portnum];
1244 aio->cygaud = cygaud;
1245 aio->portnum = portnum;
1246 aio->port_type = port_type;
1247 aio->fsync_width = -1;
1251 aio->regs = ssp_regs[portnum];
1253 aio->mode = CYGNUS_SSPMODE_UNKNOWN;
1257 aio->regs.bf_sourcech_cfg = BF_SRC_CFG3_OFFSET;
1258 aio->regs.bf_sourcech_ctrl = BF_SRC_CTRL3_OFFSET;
1259 aio->regs.i2s_mclk_cfg = SPDIF_MCLK_CFG_OFFSET;
1260 aio->regs.i2s_stream_cfg = SPDIF_STREAM_CFG_OFFSET;
1264 aio->mode = CYGNUS_SSPMODE_I2S;
1271 dev_dbg(&pdev->dev, "%s portnum = %d\n", __func__, aio->portnum);
1272 aio->streams_on = 0;
1273 aio->cygaud->dev = &pdev->dev;
1274 aio->clk_trace.play_en = false;
1275 aio->clk_trace.cap_en = false;
1277 audio_ssp_init_portregs(aio);