blob: 0708def9a351ff0341d17b705d23e12038614623 [file] [log] [blame]
// 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;
}