Lines Matching refs:aio
254 static int audio_ssp_init_portregs(struct cygnus_aio_port *aio)
259 switch (aio->port_type) {
261 value = readl(aio->cygaud->audio + aio->regs.i2s_stream_cfg);
265 writel(aio->portnum,
266 aio->cygaud->audio + aio->regs.bf_sourcech_grp);
269 value |= aio->portnum << I2S_OUT_STREAM_CFG_GROUP_ID;
270 value |= aio->portnum; /* FCI ID is the port num */
272 writel(value, aio->cygaud->audio + aio->regs.i2s_stream_cfg);
275 value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
279 writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
282 value = readl(aio->cygaud->i2s_in +
283 aio->regs.i2s_cap_stream_cfg);
285 value |= aio->portnum << I2S_IN_STREAM_CFG_0_GROUP_ID;
286 writel(value, aio->cygaud->i2s_in +
287 aio->regs.i2s_cap_stream_cfg);
290 fci_id = CAPTURE_FCI_ID_BASE + aio->portnum;
292 value = readl(aio->cygaud->audio + aio->regs.bf_destch_cfg);
297 writel(value, aio->cygaud->audio + aio->regs.bf_destch_cfg);
300 value = readl(aio->cygaud->audio + AUD_MISC_SEROUT_OE_REG_BASE);
301 value &= ~BIT((aio->portnum * 4) + AUD_MISC_SEROUT_SDAT_OE);
302 writel(value, aio->cygaud->audio + AUD_MISC_SEROUT_OE_REG_BASE);
305 writel(aio->portnum, aio->cygaud->audio + BF_SRC_GRP3_OFFSET);
307 value = readl(aio->cygaud->audio + SPDIF_CTRL_OFFSET);
309 writel(value, aio->cygaud->audio + SPDIF_CTRL_OFFSET);
312 value = readl(aio->cygaud->audio + SPDIF_STREAM_CFG_OFFSET);
314 value |= aio->portnum; /* FCI ID is the port num */
316 writel(value, aio->cygaud->audio + SPDIF_STREAM_CFG_OFFSET);
318 value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
322 writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
325 value = readl(aio->cygaud->audio + AUD_MISC_SEROUT_OE_REG_BASE);
327 writel(value, aio->cygaud->audio + AUD_MISC_SEROUT_OE_REG_BASE);
330 dev_err(aio->cygaud->dev, "Port not supported\n");
337 static void audio_ssp_in_enable(struct cygnus_aio_port *aio)
341 value = readl(aio->cygaud->audio + aio->regs.bf_destch_cfg);
343 writel(value, aio->cygaud->audio + aio->regs.bf_destch_cfg);
345 writel(0x1, aio->cygaud->audio + aio->regs.bf_destch_ctrl);
347 value = readl(aio->cygaud->audio + aio->regs.i2s_cfg);
350 writel(value, aio->cygaud->audio + aio->regs.i2s_cfg);
352 value = readl(aio->cygaud->i2s_in + aio->regs.i2s_cap_stream_cfg);
354 writel(value, aio->cygaud->i2s_in + aio->regs.i2s_cap_stream_cfg);
356 aio->streams_on |= CAPTURE_STREAM_MASK;
359 static void audio_ssp_in_disable(struct cygnus_aio_port *aio)
363 value = readl(aio->cygaud->i2s_in + aio->regs.i2s_cap_stream_cfg);
365 writel(value, aio->cygaud->i2s_in + aio->regs.i2s_cap_stream_cfg);
367 aio->streams_on &= ~CAPTURE_STREAM_MASK;
370 if (!aio->streams_on) {
371 value = readl(aio->cygaud->audio + aio->regs.i2s_cfg);
374 writel(value, aio->cygaud->audio + aio->regs.i2s_cfg);
377 writel(0x0, aio->cygaud->audio + aio->regs.bf_destch_ctrl);
379 value = readl(aio->cygaud->audio + aio->regs.bf_destch_cfg);
381 writel(value, aio->cygaud->audio + aio->regs.bf_destch_cfg);
384 static int audio_ssp_out_enable(struct cygnus_aio_port *aio)
389 switch (aio->port_type) {
391 value = readl(aio->cygaud->audio + aio->regs.i2s_stream_cfg);
393 writel(value, aio->cygaud->audio + aio->regs.i2s_stream_cfg);
395 writel(1, aio->cygaud->audio + aio->regs.bf_sourcech_ctrl);
397 value = readl(aio->cygaud->audio + aio->regs.i2s_cfg);
400 writel(value, aio->cygaud->audio + aio->regs.i2s_cfg);
402 value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
404 writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
406 aio->streams_on |= PLAYBACK_STREAM_MASK;
409 value = readl(aio->cygaud->audio + SPDIF_FORMAT_CFG_OFFSET);
411 writel(value, aio->cygaud->audio + SPDIF_FORMAT_CFG_OFFSET);
413 writel(1, aio->cygaud->audio + aio->regs.bf_sourcech_ctrl);
415 value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
417 writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
420 dev_err(aio->cygaud->dev,
421 "Port not supported %d\n", aio->portnum);
428 static int audio_ssp_out_disable(struct cygnus_aio_port *aio)
433 switch (aio->port_type) {
435 aio->streams_on &= ~PLAYBACK_STREAM_MASK;
438 if (!aio->streams_on) {
439 value = readl(aio->cygaud->audio + aio->regs.i2s_cfg);
442 writel(value, aio->cygaud->audio + aio->regs.i2s_cfg);
446 value = readl(aio->cygaud->audio + BF_SRC_GRP_SYNC_DIS_OFFSET);
447 value |= BIT(aio->portnum);
448 writel(value, aio->cygaud->audio + BF_SRC_GRP_SYNC_DIS_OFFSET);
450 writel(0, aio->cygaud->audio + aio->regs.bf_sourcech_ctrl);
452 value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
454 writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
457 value = readl(aio->cygaud->audio + BF_SRC_GRP_SYNC_DIS_OFFSET);
458 value &= ~BIT(aio->portnum);
459 writel(value, aio->cygaud->audio + BF_SRC_GRP_SYNC_DIS_OFFSET);
461 value = readl(aio->cygaud->audio + aio->regs.i2s_stream_cfg);
463 writel(value, aio->cygaud->audio + aio->regs.i2s_stream_cfg);
466 value = readl(aio->cygaud->i2s_in + IOP_SW_INIT_LOGIC);
467 value |= BIT(aio->portnum);
468 writel(value, aio->cygaud->i2s_in + IOP_SW_INIT_LOGIC);
469 value &= ~BIT(aio->portnum);
470 writel(value, aio->cygaud->i2s_in + IOP_SW_INIT_LOGIC);
473 value = readl(aio->cygaud->audio + SPDIF_FORMAT_CFG_OFFSET);
475 writel(value, aio->cygaud->audio + SPDIF_FORMAT_CFG_OFFSET);
476 writel(0, aio->cygaud->audio + aio->regs.bf_sourcech_ctrl);
478 value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
480 writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
483 dev_err(aio->cygaud->dev,
484 "Port not supported %d\n", aio->portnum);
492 struct cygnus_aio_port *aio)
514 if ((aio->clk_trace.cap_en) && (!aio->clk_trace.cap_clk_en)) {
521 aio->clk_trace.cap_clk_en = true;
524 if ((aio->clk_trace.play_en) && (!aio->clk_trace.play_clk_en)) {
531 aio->clk_trace.play_clk_en = true;
544 static int cygnus_ssp_set_clocks(struct cygnus_aio_port *aio)
553 bit_rate = aio->bit_per_frame * aio->lrclk;
560 if ((aio->mclk % bit_rate) != 0)
563 ratio = aio->mclk / bit_rate;
576 dev_err(aio->cygaud->dev,
578 dev_err(aio->cygaud->dev, "lrclk = %u, bits/frame = %u, mclk = %u\n",
579 aio->lrclk, aio->bit_per_frame, aio->mclk);
584 switch (aio->port_type) {
586 sclk = aio->bit_per_frame;
594 value = readl(aio->cygaud->audio + aio->regs.i2s_cfg);
597 writel(value, aio->cygaud->audio + aio->regs.i2s_cfg);
598 dev_dbg(aio->cygaud->dev,
604 dev_err(aio->cygaud->dev, "Unknown port type\n");
609 value = readl(aio->cygaud->audio + aio->regs.i2s_mclk_cfg);
612 writel(value, aio->cygaud->audio + aio->regs.i2s_mclk_cfg);
614 dev_dbg(aio->cygaud->dev, "mclk cfg reg = 0x%x\n", value);
615 dev_dbg(aio->cygaud->dev, "bits per frame = %u, mclk = %u Hz, lrclk = %u Hz\n",
616 aio->bit_per_frame, aio->mclk, aio->lrclk);
624 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(dai);
630 dev_dbg(aio->cygaud->dev, "%s port = %d\n", __func__, aio->portnum);
631 dev_dbg(aio->cygaud->dev, "params_channels %d\n",
633 dev_dbg(aio->cygaud->dev, "rate %d\n", params_rate(params));
634 dev_dbg(aio->cygaud->dev, "format %d\n", params_format(params));
638 switch (aio->mode) {
641 dev_err(aio->cygaud->dev, "Cannot run %d channels at %dHz\n",
647 aio->bit_per_frame = 64; /* I2S must be 64 bit per frame */
650 dev_err(aio->cygaud->dev,
656 value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
659 writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
675 value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
678 writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
684 value = readl(aio->cygaud->audio +
685 aio->regs.bf_destch_cfg);
687 writel(value, aio->cygaud->audio +
688 aio->regs.bf_destch_cfg);
692 value = readl(aio->cygaud->audio +
693 aio->regs.bf_destch_cfg);
695 writel(value, aio->cygaud->audio +
696 aio->regs.bf_destch_cfg);
704 aio->lrclk = rate;
706 if (!aio->is_slave)
707 ret = cygnus_ssp_set_clocks(aio);
720 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(dai);
723 dev_dbg(aio->cygaud->dev,
724 "%s Enter port = %d\n", __func__, aio->portnum);
725 sel = pll_configure_mclk(cygaud, freq, aio);
727 dev_err(aio->cygaud->dev,
732 aio->mclk = freq;
734 dev_dbg(aio->cygaud->dev, "%s Setting MCLKSEL to %d\n", __func__, sel);
735 value = readl(aio->cygaud->audio + aio->regs.i2s_mclk_cfg);
738 writel(value, aio->cygaud->audio + aio->regs.i2s_mclk_cfg);
746 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(dai);
748 snd_soc_dai_set_dma_data(dai, substream, aio);
750 aio->clk_trace.play_en = true;
752 aio->clk_trace.cap_en = true;
765 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(dai);
768 aio->clk_trace.play_en = false;
770 aio->clk_trace.cap_en = false;
772 if (!aio->is_slave) {
775 val = readl(aio->cygaud->audio + aio->regs.i2s_mclk_cfg);
777 if (val >= ARRAY_SIZE(aio->cygaud->audio_clk)) {
778 dev_err(aio->cygaud->dev, "Clk index %u is out of bounds\n",
784 if (aio->clk_trace.play_clk_en) {
785 clk_disable_unprepare(aio->cygaud->
787 aio->clk_trace.play_clk_en = false;
790 if (aio->clk_trace.cap_clk_en) {
791 clk_disable_unprepare(aio->cygaud->
793 aio->clk_trace.cap_clk_en = false;
823 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(cpu_dai);
826 aio->fsync_width = len;
836 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(cpu_dai);
844 dev_dbg(aio->cygaud->dev, "%s Enter fmt: %x\n", __func__, fmt);
846 if (aio->port_type == PORT_SPDIF)
854 aio->is_slave = 1;
858 aio->is_slave = 0;
868 aio->mode = CYGNUS_SSPMODE_I2S;
879 if ((aio->fsync_width > 0) && (aio->fsync_width < 256))
881 (aio->fsync_width << I2S_OUT_CFGX_FSYNC_WIDTH);
885 aio->mode = CYGNUS_SSPMODE_TDM;
896 ssp_curcfg = readl(aio->cygaud->audio + aio->regs.i2s_cfg);
898 writel(ssp_outcfg, aio->cygaud->audio + aio->regs.i2s_cfg);
904 ssp_curcfg = readl(aio->cygaud->i2s_in + aio->regs.i2s_cap_cfg);
906 writel(ssp_incfg, aio->cygaud->i2s_in + aio->regs.i2s_cap_cfg);
908 val = readl(aio->cygaud->audio + AUD_MISC_SEROUT_OE_REG_BASE);
918 mask = mask << (aio->portnum * 4);
919 if (aio->is_slave)
926 dev_dbg(aio->cygaud->dev, "%s Set OE bits 0x%x\n", __func__, val);
927 writel(val, aio->cygaud->audio + AUD_MISC_SEROUT_OE_REG_BASE);
935 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(dai);
938 dev_dbg(aio->cygaud->dev,
939 "%s cmd %d at port = %d\n", __func__, cmd, aio->portnum);
946 audio_ssp_out_enable(aio);
948 audio_ssp_in_enable(aio);
957 audio_ssp_out_disable(aio);
959 audio_ssp_in_disable(aio);
973 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(cpu_dai);
982 dev_err(aio->cygaud->dev,
1010 dev_warn(aio->cygaud->dev,
1024 dev_err(aio->cygaud->dev,
1030 aio->bit_per_frame = frame_bits;
1032 dev_dbg(aio->cygaud->dev, "%s active_slots %u, bits per frame %d\n",
1036 value = readl(aio->cygaud->i2s_in + aio->regs.i2s_cap_cfg);
1041 writel(value, aio->cygaud->i2s_in + aio->regs.i2s_cap_cfg);
1044 value = readl(aio->cygaud->audio + aio->regs.i2s_cfg);
1049 writel(value, aio->cygaud->audio + aio->regs.i2s_cfg);
1057 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(cpu_dai);
1062 if (!aio->is_slave) {
1065 val = readl(aio->cygaud->audio + aio->regs.i2s_mclk_cfg);
1067 if (val >= ARRAY_SIZE(aio->cygaud->audio_clk)) {
1068 dev_err(aio->cygaud->dev, "Clk index %u is out of bounds\n",
1073 if (aio->clk_trace.cap_clk_en)
1074 clk_disable_unprepare(aio->cygaud->audio_clk[val]);
1075 if (aio->clk_trace.play_clk_en)
1076 clk_disable_unprepare(aio->cygaud->audio_clk[val]);
1078 aio->pll_clk_num = val;
1097 struct cygnus_aio_port *aio = cygnus_dai_get_portinfo(cpu_dai);
1103 if (!aio->is_slave) {
1104 if (aio->clk_trace.cap_clk_en) {
1105 error = clk_prepare_enable(aio->cygaud->
1106 audio_clk[aio->pll_clk_num]);
1108 dev_err(aio->cygaud->dev, "%s clk_prepare_enable failed\n",
1113 if (aio->clk_trace.play_clk_en) {
1114 error = clk_prepare_enable(aio->cygaud->
1115 audio_clk[aio->pll_clk_num]);
1117 if (aio->clk_trace.cap_clk_en)
1118 clk_disable_unprepare(aio->cygaud->
1119 audio_clk[aio->pll_clk_num]);
1120 dev_err(aio->cygaud->dev, "%s clk_prepare_enable failed\n",
1219 struct cygnus_aio_port *aio;
1252 aio = &cygaud->portinfo[portnum];
1253 aio->cygaud = cygaud;
1254 aio->portnum = portnum;
1255 aio->port_type = port_type;
1256 aio->fsync_width = -1;
1260 aio->regs = ssp_regs[portnum];
1262 aio->mode = CYGNUS_SSPMODE_UNKNOWN;
1266 aio->regs.bf_sourcech_cfg = BF_SRC_CFG3_OFFSET;
1267 aio->regs.bf_sourcech_ctrl = BF_SRC_CTRL3_OFFSET;
1268 aio->regs.i2s_mclk_cfg = SPDIF_MCLK_CFG_OFFSET;
1269 aio->regs.i2s_stream_cfg = SPDIF_STREAM_CFG_OFFSET;
1273 aio->mode = CYGNUS_SSPMODE_I2S;
1280 dev_dbg(&pdev->dev, "%s portnum = %d\n", __func__, aio->portnum);
1281 aio->streams_on = 0;
1282 aio->cygaud->dev = &pdev->dev;
1283 aio->clk_trace.play_en = false;
1284 aio->clk_trace.cap_en = false;
1286 audio_ssp_init_portregs(aio);