// SPDX-License-Identifier: GPL-2.0
/*
 * ALSA SoC dummy codec driver
 *
 * Copyright (C) 2019 Amlogic,inc
 *
 */

#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <sound/core.h>
#include <sound/tlv.h>
#include <sound/soc.h>
#include <sound/soc-dapm.h>
#include <sound/initval.h>
#include <linux/of.h>

#define DRV_NAME "dummy"

struct dummy_codec_private {
	struct snd_soc_component component;
};

#define DUMMY_CODEC_RATES      (SNDRV_PCM_RATE_8000_192000)
#define DUMMY_CODEC_FORMATS    (SNDRV_PCM_FMTBIT_S16_LE |\
	SNDRV_PCM_FMTBIT_S24_LE | \
	SNDRV_PCM_FMTBIT_S32_LE)


static const struct snd_soc_dapm_widget dummy_codec_dapm_widgets[] = {
	/* Output Side */
	/* DACs */
	SND_SOC_DAPM_DAC("Left DAC", "HIFI Playback",
		SND_SOC_NOPM, 0, 0),
	SND_SOC_DAPM_DAC("Right DAC", "HIFI Playback",
		SND_SOC_NOPM, 7, 0),

	/* Output Lines */
	SND_SOC_DAPM_OUTPUT("LOUTL"),
	SND_SOC_DAPM_OUTPUT("LOUTR"),

};

static const struct snd_soc_dapm_route dummy_codec_dapm_routes[] = {
	{"LOUTL", NULL, "Left DAC"},
	{"LOUTR", NULL, "Right DAC"},
};

struct snd_soc_dai_driver dummy_codec_dai = {
	.name     = DRV_NAME,
	.id       = 0,
	.playback = {
		.stream_name  = "HIFI Playback",
		.channels_min = 1,
		.channels_max = 32,
		.rates        = DUMMY_CODEC_RATES,
		.formats      = DUMMY_CODEC_FORMATS,
	},
	.capture  = {
		.stream_name  = "HIFI Capture",
		.channels_min = 1,
		.channels_max = 32,
		.rates        = DUMMY_CODEC_RATES,
		.formats      = DUMMY_CODEC_FORMATS,
	},
};

static const struct snd_soc_component_driver soc_codec_dev_dummy_codec = {
	.name             = DRV_NAME,

	.dapm_widgets     = dummy_codec_dapm_widgets,
	.num_dapm_widgets = ARRAY_SIZE(dummy_codec_dapm_widgets),
	.dapm_routes      = dummy_codec_dapm_routes,
	.num_dapm_routes  = ARRAY_SIZE(dummy_codec_dapm_routes),
};

static const struct of_device_id amlogic_codec_dt_match[] = {
	{.compatible = "amlogic, aml_dummy_codec",
	 },
	{},
};

static int dummy_codec_platform_probe(struct platform_device *pdev)
{
	struct dummy_codec_private *dummy_codec;
	int ret;

	dummy_codec = kzalloc(sizeof(*dummy_codec), GFP_KERNEL);
	if (!dummy_codec)
		return -ENOMEM;

	platform_set_drvdata(pdev, dummy_codec);
	ret = devm_snd_soc_register_component(&pdev->dev,
			&soc_codec_dev_dummy_codec,
			&dummy_codec_dai, 1);

	if (ret < 0)
		kfree(dummy_codec);

	return ret;
}

static int dummy_codec_platform_remove(struct platform_device *pdev)
{
	kfree(platform_get_drvdata(pdev));

	return 0;
}

static struct platform_driver dummy_codec_platform_driver = {
	.driver = {
		   .name           = DRV_NAME,
		   .owner          = THIS_MODULE,
		   .of_match_table = of_match_ptr(amlogic_codec_dt_match),
		   },
	.probe  = dummy_codec_platform_probe,
	.remove = dummy_codec_platform_remove,
};

module_platform_driver(dummy_codec_platform_driver);

MODULE_AUTHOR("AMLogic, Inc.");
MODULE_DESCRIPTION("ASoC dummy_codec driver");
MODULE_LICENSE("GPL");
