sound/soc/amd/acp/acp-i2s.c

Source file repositories/reference/linux-study-clean/sound/soc/amd/acp/acp-i2s.c

File Facts

System
Linux kernel
Corpus path
sound/soc/amd/acp/acp-i2s.c
Extension
.c
Size
18880 bytes
Lines
702
Domain
Driver Families
Bucket
sound/soc
Inferred role
Driver Families: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

switch (slots) {
		case 1 ... 7:
			no_of_slots = slots;
			break;
		case 8:
			no_of_slots = 0;
			break;
		default:
			dev_err(dev, "Unsupported slots %d\n", slots);
			return -EINVAL;
		}
		break;
	case ACP63_PCI_ID:
	case ACP70_PCI_ID:
	case ACP71_PCI_ID:
	case ACP72_PCI_ID:
		switch (slots) {
		case 1 ... 31:
			no_of_slots = slots;
			break;
		case 32:
			no_of_slots = 0;
			break;
		default:
			dev_err(dev, "Unsupported slots %d\n", slots);
			return -EINVAL;
		}
		break;
	default:
		dev_err(dev, "Unknown chip revision %d\n", chip->acp_rev);
		return -EINVAL;
	}

	slots = no_of_slots;

	spin_lock_irq(&chip->acp_lock);
	list_for_each_entry(stream, &chip->stream_list, list) {
		if (dai->id != stream->dai_id)
			continue;
		switch (chip->acp_rev) {
		case ACP_RN_PCI_ID:
		case ACP_RMB_PCI_ID:
			if (tx_mask && stream->dir == SNDRV_PCM_STREAM_PLAYBACK)
				chip->tdm_tx_fmt[stream->dai_id - 1] =
					FRM_LEN | (slots << 15) | (slot_len << 18);
			else if (rx_mask && stream->dir == SNDRV_PCM_STREAM_CAPTURE)
				chip->tdm_rx_fmt[stream->dai_id - 1] =
					FRM_LEN | (slots << 15) | (slot_len << 18);
			break;
		case ACP63_PCI_ID:
		case ACP70_PCI_ID:
		case ACP71_PCI_ID:
		case ACP72_PCI_ID:
			if (tx_mask && stream->dir == SNDRV_PCM_STREAM_PLAYBACK)
				chip->tdm_tx_fmt[stream->dai_id - 1] =
						FRM_LEN | (slots << 13) | (slot_len << 18);
			else if (rx_mask && stream->dir == SNDRV_PCM_STREAM_CAPTURE)
				chip->tdm_rx_fmt[stream->dai_id - 1] =
						FRM_LEN | (slots << 13) | (slot_len << 18);
			break;
		default:
			dev_err(dev, "Unknown chip revision %d\n", chip->acp_rev);
			spin_unlock_irq(&chip->acp_lock);
			return -EINVAL;
		}
	}
	spin_unlock_irq(&chip->acp_lock);
	return 0;
}

static int acp_i2s_hwparams(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params,
			    struct snd_soc_dai *dai)
{
	struct device *dev = dai->component->dev;
	struct acp_chip_info *chip;
	struct acp_resource *rsrc;
	u32 val;
	u32 xfer_resolution;
	u32 reg_val, fmt_reg, tdm_fmt;
	u32 lrclk_div_val, bclk_div_val;

	chip = dev_get_drvdata(dev->parent);
	rsrc = chip->rsrc;

	/* These values are as per Hardware Spec */
	switch (params_format(params)) {
	case SNDRV_PCM_FORMAT_U8:
	case SNDRV_PCM_FORMAT_S8:
		xfer_resolution = 0x0;
		break;

Annotation

Implementation Notes