sound/soc/codecs/rt1316-sdw.c

Source file repositories/reference/linux-study-clean/sound/soc/codecs/rt1316-sdw.c

File Facts

System
Linux kernel
Corpus path
sound/soc/codecs/rt1316-sdw.c
Extension
.c
Size
20567 bytes
Lines
783
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 (!rt1316->bq_params) {
			dev_err(dev, "%s: Could not allocate bq_params memory\n", __func__);
			ret = -ENOMEM;
		} else {
			ret = device_property_read_u8_array(dev, "realtek,bq-params", rt1316->bq_params, rt1316->bq_params_cnt);
			if (ret < 0)
				dev_err(dev, "%s: Could not read list of realtek,bq-params\n", __func__);
		}
	}

	dev_dbg(dev, "bq_params_cnt=%d\n", rt1316->bq_params_cnt);
	return ret;
}

static int rt1316_sdw_component_probe(struct snd_soc_component *component)
{
	struct rt1316_sdw_priv *rt1316 = snd_soc_component_get_drvdata(component);
	int ret;

	rt1316->component = component;
	rt1316_sdw_parse_dt(rt1316, &rt1316->sdw_slave->dev);

	if (!rt1316->first_hw_init)
		return 0;

	ret = pm_runtime_resume(component->dev);
	if (ret < 0 && ret != -EACCES)
		return ret;

	/* apply BQ params */
	rt1316_apply_bq_params(rt1316);

	return 0;
}

static const struct snd_soc_component_driver soc_component_sdw_rt1316 = {
	.probe = rt1316_sdw_component_probe,
	.controls = rt1316_snd_controls,
	.num_controls = ARRAY_SIZE(rt1316_snd_controls),
	.dapm_widgets = rt1316_dapm_widgets,
	.num_dapm_widgets = ARRAY_SIZE(rt1316_dapm_widgets),
	.dapm_routes = rt1316_dapm_routes,
	.num_dapm_routes = ARRAY_SIZE(rt1316_dapm_routes),
	.endianness = 1,
};

static const struct snd_soc_dai_ops rt1316_aif_dai_ops = {
	.hw_params = rt1316_sdw_hw_params,
	.hw_free	= rt1316_sdw_pcm_hw_free,
	.set_stream	= rt1316_set_sdw_stream,
	.shutdown	= rt1316_sdw_shutdown,
};

#define RT1316_STEREO_RATES SNDRV_PCM_RATE_48000
#define RT1316_FORMATS (SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S16_LE | \
			SNDRV_PCM_FMTBIT_S24_LE)

static struct snd_soc_dai_driver rt1316_sdw_dai[] = {
	{
		.name = "rt1316-aif",
		.playback = {
			.stream_name = "DP1 Playback",
			.channels_min = 1,
			.channels_max = 2,
			.rates = RT1316_STEREO_RATES,
			.formats = RT1316_FORMATS,
		},
		.capture = {
			.stream_name = "DP2 Capture",
			.channels_min = 1,
			.channels_max = 2,
			.rates = RT1316_STEREO_RATES,
			.formats = RT1316_FORMATS,
		},
		.ops = &rt1316_aif_dai_ops,
	},
};

static int rt1316_sdw_init(struct device *dev, struct regmap *regmap,
				struct sdw_slave *slave)
{
	struct rt1316_sdw_priv *rt1316;
	int ret;

	rt1316 = devm_kzalloc(dev, sizeof(*rt1316), GFP_KERNEL);
	if (!rt1316)
		return -ENOMEM;

	dev_set_drvdata(dev, rt1316);
	rt1316->sdw_slave = slave;

Annotation

Implementation Notes