sound/soc/tegra/tegra210_sfc.c

Source file repositories/reference/linux-study-clean/sound/soc/tegra/tegra210_sfc.c

File Facts

System
Linux kernel
Corpus path
sound/soc/tegra/tegra210_sfc.c
Extension
.c
Size
89925 bytes
Lines
3644
Domain
Driver Families
Bucket
sound/soc
Inferred role
Driver Families: implementation source
Status
source 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

if (rate == tegra210_sfc_rates[i]) {
			*rate_idx = i;

			return 0;
		}
	}

	dev_err(dev, "Sample rate %d Hz is not supported\n", rate);

	return -EOPNOTSUPP;
}

static int tegra210_sfc_startup(struct snd_pcm_substream *substream,
				struct snd_soc_dai *dai)
{
	struct tegra210_sfc *sfc = snd_soc_dai_get_drvdata(dai);
	int err;

	regmap_update_bits(sfc->regmap, TEGRA210_SFC_COEF_RAM,
			   TEGRA210_SFC_COEF_RAM_EN, 0);

	err = tegra210_sfc_soft_reset(sfc);
	if (err < 0) {
		dev_err(dai->dev, "Failed to reset SFC in %s, err = %d\n",
			__func__, err);

		return err;
	}

	return 0;
}

static int tegra210_sfc_in_hw_params(struct snd_pcm_substream *substream,
				     struct snd_pcm_hw_params *params,
				     struct snd_soc_dai *dai)
{
	struct tegra210_sfc *sfc = snd_soc_dai_get_drvdata(dai);
	struct device *dev = dai->dev;
	int err;

	err = tegra210_sfc_rate_to_idx(dev, params_rate(params),
				       &sfc->srate_in);
	if (err < 0)
		return err;

	err = tegra210_sfc_set_audio_cif(sfc, params, TEGRA210_SFC_RX_CIF_CTRL);
	if (err < 0) {
		dev_err(dev, "Can't set SFC RX CIF: %d\n", err);
		return err;
	}

	regmap_write(sfc->regmap, TEGRA210_SFC_RX_FREQ, sfc->srate_in);

	return err;
}

static int tegra210_sfc_out_hw_params(struct snd_pcm_substream *substream,
				      struct snd_pcm_hw_params *params,
				      struct snd_soc_dai *dai)
{
	struct tegra210_sfc *sfc = snd_soc_dai_get_drvdata(dai);
	struct device *dev = dai->dev;
	int err;

	err = tegra210_sfc_rate_to_idx(dev, params_rate(params),
				       &sfc->srate_out);
	if (err < 0)
		return err;

	err = tegra210_sfc_set_audio_cif(sfc, params, TEGRA210_SFC_TX_CIF_CTRL);
	if (err < 0) {
		dev_err(dev, "Can't set SFC TX CIF: %d\n", err);
		return err;
	}

	regmap_write(sfc->regmap, TEGRA210_SFC_TX_FREQ, sfc->srate_out);

	return 0;
}

static int tegra210_sfc_init(struct snd_soc_dapm_widget *w,
			     struct snd_kcontrol *kcontrol, int event)
{
	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);

	return tegra210_sfc_write_coeff_ram(cmpnt);
}

static int tegra210_sfc_iget_stereo_to_mono(struct snd_kcontrol *kcontrol,
				    struct snd_ctl_elem_value *ucontrol)

Annotation

Implementation Notes