18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * SiRF Audio port driver
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci#include <linux/module.h>
88c2ecf20Sopenharmony_ci#include <sound/soc.h>
98c2ecf20Sopenharmony_ci#include <sound/dmaengine_pcm.h>
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_cistruct sirf_audio_port {
128c2ecf20Sopenharmony_ci	struct regmap *regmap;
138c2ecf20Sopenharmony_ci	struct snd_dmaengine_dai_dma_data playback_dma_data;
148c2ecf20Sopenharmony_ci	struct snd_dmaengine_dai_dma_data capture_dma_data;
158c2ecf20Sopenharmony_ci};
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_cistatic int sirf_audio_port_dai_probe(struct snd_soc_dai *dai)
198c2ecf20Sopenharmony_ci{
208c2ecf20Sopenharmony_ci	struct sirf_audio_port *port = snd_soc_dai_get_drvdata(dai);
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci	snd_soc_dai_init_dma_data(dai, &port->playback_dma_data,
238c2ecf20Sopenharmony_ci			&port->capture_dma_data);
248c2ecf20Sopenharmony_ci	return 0;
258c2ecf20Sopenharmony_ci}
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_cistatic struct snd_soc_dai_driver sirf_audio_port_dai = {
288c2ecf20Sopenharmony_ci	.probe = sirf_audio_port_dai_probe,
298c2ecf20Sopenharmony_ci	.name = "sirf-audio-port",
308c2ecf20Sopenharmony_ci	.id = 0,
318c2ecf20Sopenharmony_ci	.playback = {
328c2ecf20Sopenharmony_ci		.channels_min = 2,
338c2ecf20Sopenharmony_ci		.channels_max = 2,
348c2ecf20Sopenharmony_ci		.rates = SNDRV_PCM_RATE_48000,
358c2ecf20Sopenharmony_ci		.formats = SNDRV_PCM_FMTBIT_S16_LE,
368c2ecf20Sopenharmony_ci	},
378c2ecf20Sopenharmony_ci	.capture = {
388c2ecf20Sopenharmony_ci		.channels_min = 1,
398c2ecf20Sopenharmony_ci		.channels_max = 2,
408c2ecf20Sopenharmony_ci		.rates = SNDRV_PCM_RATE_48000,
418c2ecf20Sopenharmony_ci		.formats = SNDRV_PCM_FMTBIT_S16_LE,
428c2ecf20Sopenharmony_ci	},
438c2ecf20Sopenharmony_ci};
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_cistatic const struct snd_soc_component_driver sirf_audio_port_component = {
468c2ecf20Sopenharmony_ci	.name       = "sirf-audio-port",
478c2ecf20Sopenharmony_ci};
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_cistatic int sirf_audio_port_probe(struct platform_device *pdev)
508c2ecf20Sopenharmony_ci{
518c2ecf20Sopenharmony_ci	int ret;
528c2ecf20Sopenharmony_ci	struct sirf_audio_port *port;
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci	port = devm_kzalloc(&pdev->dev,
558c2ecf20Sopenharmony_ci			sizeof(struct sirf_audio_port), GFP_KERNEL);
568c2ecf20Sopenharmony_ci	if (!port)
578c2ecf20Sopenharmony_ci		return -ENOMEM;
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci	ret = devm_snd_soc_register_component(&pdev->dev,
608c2ecf20Sopenharmony_ci			&sirf_audio_port_component, &sirf_audio_port_dai, 1);
618c2ecf20Sopenharmony_ci	if (ret)
628c2ecf20Sopenharmony_ci		return ret;
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci	platform_set_drvdata(pdev, port);
658c2ecf20Sopenharmony_ci	return devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
668c2ecf20Sopenharmony_ci}
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_cistatic const struct of_device_id sirf_audio_port_of_match[] = {
698c2ecf20Sopenharmony_ci	{ .compatible = "sirf,audio-port", },
708c2ecf20Sopenharmony_ci	{}
718c2ecf20Sopenharmony_ci};
728c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(of, sirf_audio_port_of_match);
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_cistatic struct platform_driver sirf_audio_port_driver = {
758c2ecf20Sopenharmony_ci	.driver = {
768c2ecf20Sopenharmony_ci		.name = "sirf-audio-port",
778c2ecf20Sopenharmony_ci		.of_match_table = sirf_audio_port_of_match,
788c2ecf20Sopenharmony_ci	},
798c2ecf20Sopenharmony_ci	.probe = sirf_audio_port_probe,
808c2ecf20Sopenharmony_ci};
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_cimodule_platform_driver(sirf_audio_port_driver);
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("SiRF Audio Port driver");
858c2ecf20Sopenharmony_ciMODULE_AUTHOR("RongJun Ying <Rongjun.Ying@csr.com>");
868c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2");
87