diff options
Diffstat (limited to 'drivers/spi/spi-slave-mt27xx.c')
| -rw-r--r-- | drivers/spi/spi-slave-mt27xx.c | 36 | 
1 files changed, 32 insertions, 4 deletions
| diff --git a/drivers/spi/spi-slave-mt27xx.c b/drivers/spi/spi-slave-mt27xx.c index 44edaa360405..f199a6c4738a 100644 --- a/drivers/spi/spi-slave-mt27xx.c +++ b/drivers/spi/spi-slave-mt27xx.c @@ -10,6 +10,8 @@  #include <linux/platform_device.h>  #include <linux/pm_runtime.h>  #include <linux/spi/spi.h> +#include <linux/of.h> +  #define SPIS_IRQ_EN_REG		0x0  #define SPIS_IRQ_CLR_REG	0x4 @@ -61,8 +63,6 @@  #define SPIS_DMA_ADDR_EN	BIT(1)  #define SPIS_SOFT_RST		BIT(0) -#define MTK_SPI_SLAVE_MAX_FIFO_SIZE 512U -  struct mtk_spi_slave {  	struct device *dev;  	void __iomem *base; @@ -70,10 +70,27 @@ struct mtk_spi_slave {  	struct completion xfer_done;  	struct spi_transfer *cur_transfer;  	bool slave_aborted; +	const struct mtk_spi_compatible *dev_comp; +}; + +struct mtk_spi_compatible { +	const u32 max_fifo_size; +	bool must_rx; +}; + +static const struct mtk_spi_compatible mt2712_compat = { +	.max_fifo_size = 512, +}; +static const struct mtk_spi_compatible mt8195_compat = { +	.max_fifo_size = 128, +	.must_rx = true,  };  static const struct of_device_id mtk_spi_slave_of_match[] = { -	{ .compatible = "mediatek,mt2712-spi-slave", }, +	{ .compatible = "mediatek,mt2712-spi-slave", +	  .data = (void *)&mt2712_compat,}, +	{ .compatible = "mediatek,mt8195-spi-slave", +	  .data = (void *)&mt8195_compat,},  	{}  };  MODULE_DEVICE_TABLE(of, mtk_spi_slave_of_match); @@ -272,7 +289,7 @@ static int mtk_spi_slave_transfer_one(struct spi_controller *ctlr,  	mdata->slave_aborted = false;  	mdata->cur_transfer = xfer; -	if (xfer->len > MTK_SPI_SLAVE_MAX_FIFO_SIZE) +	if (xfer->len > mdata->dev_comp->max_fifo_size)  		return mtk_spi_slave_dma_transfer(ctlr, spi, xfer);  	else  		return mtk_spi_slave_fifo_transfer(ctlr, spi, xfer); @@ -369,6 +386,7 @@ static int mtk_spi_slave_probe(struct platform_device *pdev)  	struct spi_controller *ctlr;  	struct mtk_spi_slave *mdata;  	int irq, ret; +	const struct of_device_id *of_id;  	ctlr = spi_alloc_slave(&pdev->dev, sizeof(*mdata));  	if (!ctlr) { @@ -386,7 +404,17 @@ static int mtk_spi_slave_probe(struct platform_device *pdev)  	ctlr->setup = mtk_spi_slave_setup;  	ctlr->slave_abort = mtk_slave_abort; +	of_id = of_match_node(mtk_spi_slave_of_match, pdev->dev.of_node); +	if (!of_id) { +		dev_err(&pdev->dev, "failed to probe of_node\n"); +		ret = -EINVAL; +		goto err_put_ctlr; +	}  	mdata = spi_controller_get_devdata(ctlr); +	mdata->dev_comp = of_id->data; + +	if (mdata->dev_comp->must_rx) +		ctlr->flags = SPI_MASTER_MUST_RX;  	platform_set_drvdata(pdev, ctlr); | 
