162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * ad73311.c  --  ALSA Soc AD73311 codec support
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright:	Analog Devices Inc.
662306a36Sopenharmony_ci * Author:	Cliff Cai <cliff.cai@analog.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/init.h>
1062306a36Sopenharmony_ci#include <linux/slab.h>
1162306a36Sopenharmony_ci#include <linux/module.h>
1262306a36Sopenharmony_ci#include <linux/kernel.h>
1362306a36Sopenharmony_ci#include <linux/device.h>
1462306a36Sopenharmony_ci#include <sound/core.h>
1562306a36Sopenharmony_ci#include <sound/pcm.h>
1662306a36Sopenharmony_ci#include <sound/ac97_codec.h>
1762306a36Sopenharmony_ci#include <sound/initval.h>
1862306a36Sopenharmony_ci#include <sound/soc.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include "ad73311.h"
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget ad73311_dapm_widgets[] = {
2362306a36Sopenharmony_ciSND_SOC_DAPM_INPUT("VINP"),
2462306a36Sopenharmony_ciSND_SOC_DAPM_INPUT("VINN"),
2562306a36Sopenharmony_ciSND_SOC_DAPM_OUTPUT("VOUTN"),
2662306a36Sopenharmony_ciSND_SOC_DAPM_OUTPUT("VOUTP"),
2762306a36Sopenharmony_ci};
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistatic const struct snd_soc_dapm_route ad73311_dapm_routes[] = {
3062306a36Sopenharmony_ci	{ "Capture", NULL, "VINP" },
3162306a36Sopenharmony_ci	{ "Capture", NULL, "VINN" },
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	{ "VOUTN", NULL, "Playback" },
3462306a36Sopenharmony_ci	{ "VOUTP", NULL, "Playback" },
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistatic struct snd_soc_dai_driver ad73311_dai = {
3862306a36Sopenharmony_ci	.name = "ad73311-hifi",
3962306a36Sopenharmony_ci	.playback = {
4062306a36Sopenharmony_ci		.stream_name = "Playback",
4162306a36Sopenharmony_ci		.channels_min = 1,
4262306a36Sopenharmony_ci		.channels_max = 1,
4362306a36Sopenharmony_ci		.rates = SNDRV_PCM_RATE_8000,
4462306a36Sopenharmony_ci		.formats = SNDRV_PCM_FMTBIT_S16_LE, },
4562306a36Sopenharmony_ci	.capture = {
4662306a36Sopenharmony_ci		.stream_name = "Capture",
4762306a36Sopenharmony_ci		.channels_min = 1,
4862306a36Sopenharmony_ci		.channels_max = 1,
4962306a36Sopenharmony_ci		.rates = SNDRV_PCM_RATE_8000,
5062306a36Sopenharmony_ci		.formats = SNDRV_PCM_FMTBIT_S16_LE, },
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistatic const struct snd_soc_component_driver soc_component_dev_ad73311 = {
5462306a36Sopenharmony_ci	.dapm_widgets		= ad73311_dapm_widgets,
5562306a36Sopenharmony_ci	.num_dapm_widgets	= ARRAY_SIZE(ad73311_dapm_widgets),
5662306a36Sopenharmony_ci	.dapm_routes		= ad73311_dapm_routes,
5762306a36Sopenharmony_ci	.num_dapm_routes	= ARRAY_SIZE(ad73311_dapm_routes),
5862306a36Sopenharmony_ci	.idle_bias_on		= 1,
5962306a36Sopenharmony_ci	.use_pmdown_time	= 1,
6062306a36Sopenharmony_ci	.endianness		= 1,
6162306a36Sopenharmony_ci};
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistatic int ad73311_probe(struct platform_device *pdev)
6462306a36Sopenharmony_ci{
6562306a36Sopenharmony_ci	return devm_snd_soc_register_component(&pdev->dev,
6662306a36Sopenharmony_ci			&soc_component_dev_ad73311, &ad73311_dai, 1);
6762306a36Sopenharmony_ci}
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cistatic struct platform_driver ad73311_codec_driver = {
7062306a36Sopenharmony_ci	.driver = {
7162306a36Sopenharmony_ci			.name = "ad73311",
7262306a36Sopenharmony_ci	},
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	.probe = ad73311_probe,
7562306a36Sopenharmony_ci};
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cimodule_platform_driver(ad73311_codec_driver);
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ciMODULE_DESCRIPTION("ASoC ad73311 driver");
8062306a36Sopenharmony_ciMODULE_AUTHOR("Cliff Cai ");
8162306a36Sopenharmony_ciMODULE_LICENSE("GPL");
82