// SPDX-License-Identifier: GPL-2.0

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/err.h>
#include <linux/spi/spi.h>

/* alsa sound header */
#include <sound/soc.h>
#include <sound/pcm_params.h>

#include "si3218x/si3218x.h"

enum si3218x_spi_type {
	MTK_EXT_PROSLIC = 0,
	MTK_EXT_TYPE_NUM
};

struct mtk_ext_spi_ctrl {
	int (*spi_probe)(struct spi_device *spi, struct spi_driver *spi_drv);
	int (*spi_remove)(struct spi_device *spi);
	const char *stream_name;
	const char *codec_dai_name;
	const char *codec_name;
};

static struct mtk_ext_spi_ctrl mtk_ext_list[MTK_EXT_TYPE_NUM] = {
	[MTK_EXT_PROSLIC] = {
		.spi_probe = si3218x_spi_probe,
		.spi_remove = si3218x_spi_remove,
	},
};

static unsigned int mtk_ext_type;

static int mtk_ext_spi_probe(struct spi_device *spi);
static int mtk_ext_spi_remove(struct spi_device *spi)
{
	dev_info(&spi->dev, "%s()\n", __func__);

	if (mtk_ext_list[mtk_ext_type].spi_remove)
		mtk_ext_list[mtk_ext_type].spi_remove(spi);

	return 0;
}

static const struct of_device_id mtk_ext_match_table[] = {
	{.compatible = "silabs,proslic_spi",},
	{},
};
MODULE_DEVICE_TABLE(of, mtk_ext_match_table);

static struct spi_driver mtk_ext_spi_driver = {
	.driver = {
		.name = "proslic_spi",
		.owner = THIS_MODULE,
		.of_match_table = of_match_ptr(mtk_ext_match_table),
	},
	.probe = mtk_ext_spi_probe,
	.remove = mtk_ext_spi_remove,
};

module_spi_driver(mtk_ext_spi_driver);

static int mtk_ext_spi_probe(struct spi_device *spi)
{
	int i, ret = 0;

	dev_err(&spi->dev, "%s()\n", __func__);

	mtk_ext_type = MTK_EXT_PROSLIC;
	for (i = 0; i < MTK_EXT_TYPE_NUM; i++) {
		if (!mtk_ext_list[i].spi_probe)
			continue;

		ret = mtk_ext_list[i].spi_probe(spi, &mtk_ext_spi_driver);
		if (ret)
			continue;

		mtk_ext_type = i;
		break;
	}

	return ret;
}
