Lines Matching +full:chip +full:- +full:id
1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
21 #include <sound/soc-dai.h>
22 #include <linux/dma-mapping.h>
34 static inline void acp_set_i2s_clk(struct acp_chip_info *chip, int dai_id) in acp_set_i2s_clk() argument
54 if (chip->tdm_mode) in acp_set_i2s_clk()
57 switch (chip->acp_rev) { in acp_set_i2s_clk()
61 val |= FIELD_PREP(ACP63_LRCLK_DIV_FIELD, chip->lrclk_div); in acp_set_i2s_clk()
62 val |= FIELD_PREP(ACP63_BCLK_DIV_FIELD, chip->bclk_div); in acp_set_i2s_clk()
65 val |= FIELD_PREP(LRCLK_DIV_FIELD, chip->lrclk_div); in acp_set_i2s_clk()
66 val |= FIELD_PREP(BCLK_DIV_FIELD, chip->bclk_div); in acp_set_i2s_clk()
68 writel(val, chip->base + i2s_clk_reg); in acp_set_i2s_clk()
74 struct device *dev = cpu_dai->component->dev; in acp_i2s_set_fmt()
75 struct acp_chip_info *chip = dev_get_platdata(dev); in acp_i2s_set_fmt() local
81 chip->tdm_mode = TDM_DISABLE; in acp_i2s_set_fmt()
84 chip->tdm_mode = TDM_ENABLE; in acp_i2s_set_fmt()
87 return -EINVAL; in acp_i2s_set_fmt()
95 struct device *dev = dai->component->dev; in acp_i2s_set_tdm_slot()
96 struct acp_chip_info *chip; in acp_i2s_set_tdm_slot() local
100 chip = dev_get_drvdata(dev->parent); in acp_i2s_set_tdm_slot()
116 return -EINVAL; in acp_i2s_set_tdm_slot()
119 switch (chip->acp_rev) { in acp_i2s_set_tdm_slot()
131 return -EINVAL; in acp_i2s_set_tdm_slot()
146 return -EINVAL; in acp_i2s_set_tdm_slot()
150 dev_err(dev, "Unknown chip revision %d\n", chip->acp_rev); in acp_i2s_set_tdm_slot()
151 return -EINVAL; in acp_i2s_set_tdm_slot()
156 spin_lock_irq(&chip->acp_lock); in acp_i2s_set_tdm_slot()
157 list_for_each_entry(stream, &chip->stream_list, list) { in acp_i2s_set_tdm_slot()
158 switch (chip->acp_rev) { in acp_i2s_set_tdm_slot()
161 if (tx_mask && stream->dir == SNDRV_PCM_STREAM_PLAYBACK) in acp_i2s_set_tdm_slot()
162 chip->tdm_tx_fmt[stream->dai_id - 1] = in acp_i2s_set_tdm_slot()
164 else if (rx_mask && stream->dir == SNDRV_PCM_STREAM_CAPTURE) in acp_i2s_set_tdm_slot()
165 chip->tdm_rx_fmt[stream->dai_id - 1] = in acp_i2s_set_tdm_slot()
171 if (tx_mask && stream->dir == SNDRV_PCM_STREAM_PLAYBACK) in acp_i2s_set_tdm_slot()
172 chip->tdm_tx_fmt[stream->dai_id - 1] = in acp_i2s_set_tdm_slot()
174 else if (rx_mask && stream->dir == SNDRV_PCM_STREAM_CAPTURE) in acp_i2s_set_tdm_slot()
175 chip->tdm_rx_fmt[stream->dai_id - 1] = in acp_i2s_set_tdm_slot()
179 dev_err(dev, "Unknown chip revision %d\n", chip->acp_rev); in acp_i2s_set_tdm_slot()
180 spin_unlock_irq(&chip->acp_lock); in acp_i2s_set_tdm_slot()
181 return -EINVAL; in acp_i2s_set_tdm_slot()
184 spin_unlock_irq(&chip->acp_lock); in acp_i2s_set_tdm_slot()
191 struct device *dev = dai->component->dev; in acp_i2s_hwparams()
192 struct acp_chip_info *chip; in acp_i2s_hwparams() local
199 chip = dev_get_platdata(dev); in acp_i2s_hwparams()
200 rsrc = chip->rsrc; in acp_i2s_hwparams()
218 return -EINVAL; in acp_i2s_hwparams()
221 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in acp_i2s_hwparams()
222 switch (dai->driver->id) { in acp_i2s_hwparams()
236 dev_err(dev, "Invalid dai id %x\n", dai->driver->id); in acp_i2s_hwparams()
237 return -EINVAL; in acp_i2s_hwparams()
239 chip->xfer_tx_resolution[dai->driver->id - 1] = xfer_resolution; in acp_i2s_hwparams()
241 switch (dai->driver->id) { in acp_i2s_hwparams()
255 dev_err(dev, "Invalid dai id %x\n", dai->driver->id); in acp_i2s_hwparams()
256 return -EINVAL; in acp_i2s_hwparams()
258 chip->xfer_rx_resolution[dai->driver->id - 1] = xfer_resolution; in acp_i2s_hwparams()
261 val = readl(chip->base + reg_val); in acp_i2s_hwparams()
264 writel(val, chip->base + reg_val); in acp_i2s_hwparams()
266 if (chip->tdm_mode) { in acp_i2s_hwparams()
267 val = readl(chip->base + reg_val); in acp_i2s_hwparams()
268 writel(val | BIT(1), chip->base + reg_val); in acp_i2s_hwparams()
269 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in acp_i2s_hwparams()
270 tdm_fmt = chip->tdm_tx_fmt[dai->driver->id - 1]; in acp_i2s_hwparams()
272 tdm_fmt = chip->tdm_rx_fmt[dai->driver->id - 1]; in acp_i2s_hwparams()
273 writel(tdm_fmt, chip->base + fmt_reg); in acp_i2s_hwparams()
276 if (rsrc->soc_mclk) { in acp_i2s_hwparams()
304 return -EINVAL; in acp_i2s_hwparams()
334 return -EINVAL; in acp_i2s_hwparams()
339 return -EINVAL; in acp_i2s_hwparams()
376 chip->lrclk_div = lrclk_div_val; in acp_i2s_hwparams()
377 chip->bclk_div = bclk_div_val; in acp_i2s_hwparams()
384 struct acp_stream *stream = substream->runtime->private_data; in acp_i2s_trigger()
385 struct device *dev = dai->component->dev; in acp_i2s_trigger()
386 struct acp_chip_info *chip = dev_get_platdata(dev); in acp_i2s_trigger() local
387 struct acp_resource *rsrc = chip->rsrc; in acp_i2s_trigger()
390 period_bytes = frames_to_bytes(substream->runtime, substream->runtime->period_size); in acp_i2s_trigger()
391 buf_size = frames_to_bytes(substream->runtime, substream->runtime->buffer_size); in acp_i2s_trigger()
397 stream->bytescount = acp_get_byte_count(chip, stream->dai_id, substream->stream); in acp_i2s_trigger()
398 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in acp_i2s_trigger()
399 switch (dai->driver->id) { in acp_i2s_trigger()
401 water_val = ACP_BT_TX_INTR_WATERMARK_SIZE(chip); in acp_i2s_trigger()
404 buf_reg = ACP_BT_TX_RINGBUFSIZE(chip); in acp_i2s_trigger()
407 water_val = ACP_I2S_TX_INTR_WATERMARK_SIZE(chip); in acp_i2s_trigger()
410 buf_reg = ACP_I2S_TX_RINGBUFSIZE(chip); in acp_i2s_trigger()
419 dev_err(dev, "Invalid dai id %x\n", dai->driver->id); in acp_i2s_trigger()
420 return -EINVAL; in acp_i2s_trigger()
423 switch (dai->driver->id) { in acp_i2s_trigger()
425 water_val = ACP_BT_RX_INTR_WATERMARK_SIZE(chip); in acp_i2s_trigger()
428 buf_reg = ACP_BT_RX_RINGBUFSIZE(chip); in acp_i2s_trigger()
431 water_val = ACP_I2S_RX_INTR_WATERMARK_SIZE(chip); in acp_i2s_trigger()
434 buf_reg = ACP_I2S_RX_RINGBUFSIZE(chip); in acp_i2s_trigger()
443 dev_err(dev, "Invalid dai id %x\n", dai->driver->id); in acp_i2s_trigger()
444 return -EINVAL; in acp_i2s_trigger()
448 writel(period_bytes, chip->base + water_val); in acp_i2s_trigger()
449 writel(buf_size, chip->base + buf_reg); in acp_i2s_trigger()
450 if (rsrc->soc_mclk) in acp_i2s_trigger()
451 acp_set_i2s_clk(chip, dai->driver->id); in acp_i2s_trigger()
452 val = readl(chip->base + reg_val); in acp_i2s_trigger()
454 writel(val, chip->base + reg_val); in acp_i2s_trigger()
455 writel(1, chip->base + ier_val); in acp_i2s_trigger()
460 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in acp_i2s_trigger()
461 switch (dai->driver->id) { in acp_i2s_trigger()
472 dev_err(dev, "Invalid dai id %x\n", dai->driver->id); in acp_i2s_trigger()
473 return -EINVAL; in acp_i2s_trigger()
477 switch (dai->driver->id) { in acp_i2s_trigger()
488 dev_err(dev, "Invalid dai id %x\n", dai->driver->id); in acp_i2s_trigger()
489 return -EINVAL; in acp_i2s_trigger()
492 val = readl(chip->base + reg_val); in acp_i2s_trigger()
494 writel(val, chip->base + reg_val); in acp_i2s_trigger()
496 if (!(readl(chip->base + ACP_BTTDM_ITER) & BIT(0)) && in acp_i2s_trigger()
497 !(readl(chip->base + ACP_BTTDM_IRER) & BIT(0))) in acp_i2s_trigger()
498 writel(0, chip->base + ACP_BTTDM_IER); in acp_i2s_trigger()
499 if (!(readl(chip->base + ACP_I2STDM_ITER) & BIT(0)) && in acp_i2s_trigger()
500 !(readl(chip->base + ACP_I2STDM_IRER) & BIT(0))) in acp_i2s_trigger()
501 writel(0, chip->base + ACP_I2STDM_IER); in acp_i2s_trigger()
502 if (!(readl(chip->base + ACP_HSTDM_ITER) & BIT(0)) && in acp_i2s_trigger()
503 !(readl(chip->base + ACP_HSTDM_IRER) & BIT(0))) in acp_i2s_trigger()
504 writel(0, chip->base + ACP_HSTDM_IER); in acp_i2s_trigger()
507 return -EINVAL; in acp_i2s_trigger()
515 struct device *dev = dai->component->dev; in acp_i2s_prepare()
516 struct acp_chip_info *chip = dev_get_platdata(dev); in acp_i2s_prepare() local
517 struct acp_resource *rsrc = chip->rsrc; in acp_i2s_prepare()
518 struct acp_stream *stream = substream->runtime->private_data; in acp_i2s_prepare()
521 unsigned int dir = substream->stream; in acp_i2s_prepare()
523 chip = dev_get_platdata(dev); in acp_i2s_prepare()
524 switch (dai->driver->id) { in acp_i2s_prepare()
527 reg_dma_size = ACP_I2S_TX_DMA_SIZE(chip); in acp_i2s_prepare()
528 acp_fifo_addr = rsrc->sram_pte_offset + in acp_i2s_prepare()
530 reg_fifo_addr = ACP_I2S_TX_FIFOADDR(chip); in acp_i2s_prepare()
531 reg_fifo_size = ACP_I2S_TX_FIFOSIZE(chip); in acp_i2s_prepare()
533 if (chip->acp_rev >= ACP70_PCI_ID) in acp_i2s_prepare()
536 phy_addr = I2S_SP_TX_MEM_WINDOW_START + stream->reg_offset; in acp_i2s_prepare()
537 writel(phy_addr, chip->base + ACP_I2S_TX_RINGBUFADDR(chip)); in acp_i2s_prepare()
539 reg_dma_size = ACP_I2S_RX_DMA_SIZE(chip); in acp_i2s_prepare()
540 acp_fifo_addr = rsrc->sram_pte_offset + in acp_i2s_prepare()
542 reg_fifo_addr = ACP_I2S_RX_FIFOADDR(chip); in acp_i2s_prepare()
543 reg_fifo_size = ACP_I2S_RX_FIFOSIZE(chip); in acp_i2s_prepare()
545 if (chip->acp_rev >= ACP70_PCI_ID) in acp_i2s_prepare()
548 phy_addr = I2S_SP_RX_MEM_WINDOW_START + stream->reg_offset; in acp_i2s_prepare()
549 writel(phy_addr, chip->base + ACP_I2S_RX_RINGBUFADDR(chip)); in acp_i2s_prepare()
554 reg_dma_size = ACP_BT_TX_DMA_SIZE(chip); in acp_i2s_prepare()
555 acp_fifo_addr = rsrc->sram_pte_offset + in acp_i2s_prepare()
557 reg_fifo_addr = ACP_BT_TX_FIFOADDR(chip); in acp_i2s_prepare()
558 reg_fifo_size = ACP_BT_TX_FIFOSIZE(chip); in acp_i2s_prepare()
560 if (chip->acp_rev >= ACP70_PCI_ID) in acp_i2s_prepare()
563 phy_addr = I2S_BT_TX_MEM_WINDOW_START + stream->reg_offset; in acp_i2s_prepare()
564 writel(phy_addr, chip->base + ACP_BT_TX_RINGBUFADDR(chip)); in acp_i2s_prepare()
566 reg_dma_size = ACP_BT_RX_DMA_SIZE(chip); in acp_i2s_prepare()
567 acp_fifo_addr = rsrc->sram_pte_offset + in acp_i2s_prepare()
569 reg_fifo_addr = ACP_BT_RX_FIFOADDR(chip); in acp_i2s_prepare()
570 reg_fifo_size = ACP_BT_RX_FIFOSIZE(chip); in acp_i2s_prepare()
572 if (chip->acp_rev >= ACP70_PCI_ID) in acp_i2s_prepare()
575 phy_addr = I2S_BT_TX_MEM_WINDOW_START + stream->reg_offset; in acp_i2s_prepare()
576 writel(phy_addr, chip->base + ACP_BT_RX_RINGBUFADDR(chip)); in acp_i2s_prepare()
582 acp_fifo_addr = rsrc->sram_pte_offset + in acp_i2s_prepare()
587 if (chip->acp_rev >= ACP70_PCI_ID) in acp_i2s_prepare()
590 phy_addr = I2S_HS_TX_MEM_WINDOW_START + stream->reg_offset; in acp_i2s_prepare()
591 writel(phy_addr, chip->base + ACP_HS_TX_RINGBUFADDR); in acp_i2s_prepare()
594 acp_fifo_addr = rsrc->sram_pte_offset + in acp_i2s_prepare()
599 if (chip->acp_rev >= ACP70_PCI_ID) in acp_i2s_prepare()
602 phy_addr = I2S_HS_RX_MEM_WINDOW_START + stream->reg_offset; in acp_i2s_prepare()
603 writel(phy_addr, chip->base + ACP_HS_RX_RINGBUFADDR); in acp_i2s_prepare()
607 dev_err(dev, "Invalid dai id %x\n", dai->driver->id); in acp_i2s_prepare()
608 return -EINVAL; in acp_i2s_prepare()
611 writel(DMA_SIZE, chip->base + reg_dma_size); in acp_i2s_prepare()
612 writel(acp_fifo_addr, chip->base + reg_fifo_addr); in acp_i2s_prepare()
613 writel(FIFO_SIZE, chip->base + reg_fifo_size); in acp_i2s_prepare()
615 ext_int_ctrl = readl(ACP_EXTERNAL_INTR_CNTL(chip, rsrc->irqp_used)); in acp_i2s_prepare()
616 ext_int_ctrl |= BIT(I2S_RX_THRESHOLD(rsrc->offset)) | in acp_i2s_prepare()
617 BIT(BT_RX_THRESHOLD(rsrc->offset)) | in acp_i2s_prepare()
618 BIT(I2S_TX_THRESHOLD(rsrc->offset)) | in acp_i2s_prepare()
619 BIT(BT_TX_THRESHOLD(rsrc->offset)) | in acp_i2s_prepare()
620 BIT(HS_RX_THRESHOLD(rsrc->offset)) | in acp_i2s_prepare()
621 BIT(HS_TX_THRESHOLD(rsrc->offset)); in acp_i2s_prepare()
623 writel(ext_int_ctrl, ACP_EXTERNAL_INTR_CNTL(chip, rsrc->irqp_used)); in acp_i2s_prepare()
630 struct acp_stream *stream = substream->runtime->private_data; in acp_i2s_startup()
631 struct device *dev = dai->component->dev; in acp_i2s_startup()
632 struct acp_chip_info *chip = dev_get_platdata(dev); in acp_i2s_startup() local
633 struct acp_resource *rsrc = chip->rsrc; in acp_i2s_startup()
634 unsigned int dir = substream->stream; in acp_i2s_startup()
637 switch (dai->driver->id) { in acp_i2s_startup()
640 irq_bit = BIT(I2S_TX_THRESHOLD(rsrc->offset)); in acp_i2s_startup()
641 stream->pte_offset = ACP_SRAM_SP_PB_PTE_OFFSET; in acp_i2s_startup()
642 stream->fifo_offset = SP_PB_FIFO_ADDR_OFFSET; in acp_i2s_startup()
644 irq_bit = BIT(I2S_RX_THRESHOLD(rsrc->offset)); in acp_i2s_startup()
645 stream->pte_offset = ACP_SRAM_SP_CP_PTE_OFFSET; in acp_i2s_startup()
646 stream->fifo_offset = SP_CAPT_FIFO_ADDR_OFFSET; in acp_i2s_startup()
651 irq_bit = BIT(BT_TX_THRESHOLD(rsrc->offset)); in acp_i2s_startup()
652 stream->pte_offset = ACP_SRAM_BT_PB_PTE_OFFSET; in acp_i2s_startup()
653 stream->fifo_offset = BT_PB_FIFO_ADDR_OFFSET; in acp_i2s_startup()
655 irq_bit = BIT(BT_RX_THRESHOLD(rsrc->offset)); in acp_i2s_startup()
656 stream->pte_offset = ACP_SRAM_BT_CP_PTE_OFFSET; in acp_i2s_startup()
657 stream->fifo_offset = BT_CAPT_FIFO_ADDR_OFFSET; in acp_i2s_startup()
662 irq_bit = BIT(HS_TX_THRESHOLD(rsrc->offset)); in acp_i2s_startup()
663 stream->pte_offset = ACP_SRAM_HS_PB_PTE_OFFSET; in acp_i2s_startup()
664 stream->fifo_offset = HS_PB_FIFO_ADDR_OFFSET; in acp_i2s_startup()
666 irq_bit = BIT(HS_RX_THRESHOLD(rsrc->offset)); in acp_i2s_startup()
667 stream->pte_offset = ACP_SRAM_HS_CP_PTE_OFFSET; in acp_i2s_startup()
668 stream->fifo_offset = HS_CAPT_FIFO_ADDR_OFFSET; in acp_i2s_startup()
672 dev_err(dev, "Invalid dai id %x\n", dai->driver->id); in acp_i2s_startup()
673 return -EINVAL; in acp_i2s_startup()
677 stream->id = dai->driver->id + dir; in acp_i2s_startup()
678 stream->dai_id = dai->driver->id; in acp_i2s_startup()
679 stream->irq_bit = irq_bit; in acp_i2s_startup()
680 stream->dir = substream->stream; in acp_i2s_startup()