spi: dw: Convert CS-override to DW SPI capabilities
There are several vendor-specific versions of the DW SPI controllers, each of which may have some peculiarities with respect to the original IP-core. Seeing it has already caused adding flags and a callback into the DW SPI private data, let's introduce a generic capabilities interface to tune the generic DW SPI controller driver up in accordance with the particular controller specifics. It's done by converting a simple Alpine-specific CS-override capability into the DW SPI controller capability activated by setting the DW_SPI_CAP_CS_OVERRIDE flag. Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru> Link: https://lore.kernel.org/r/20200920112914.26501-10-Sergey.Semin@baikalelectronics.ru Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
675e7c9d71
commit
cc760f3143
|
@ -104,7 +104,7 @@ void dw_spi_set_cs(struct spi_device *spi, bool enable)
|
|||
*/
|
||||
if (cs_high == enable)
|
||||
dw_writel(dws, DW_SPI_SER, BIT(spi->chip_select));
|
||||
else if (dws->cs_override)
|
||||
else if (dws->caps & DW_SPI_CAP_CS_OVERRIDE)
|
||||
dw_writel(dws, DW_SPI_SER, 0);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dw_spi_set_cs);
|
||||
|
@ -444,7 +444,7 @@ static void spi_hw_init(struct device *dev, struct dw_spi *dws)
|
|||
}
|
||||
|
||||
/* enable HW fixup for explicit CS deselect for Amazon's alpine chip */
|
||||
if (dws->cs_override)
|
||||
if (dws->caps & DW_SPI_CAP_CS_OVERRIDE)
|
||||
dw_writel(dws, DW_SPI_CS_OVERRIDE, 0xF);
|
||||
}
|
||||
|
||||
|
|
|
@ -204,7 +204,7 @@ static int dw_spi_mscc_sparx5_init(struct platform_device *pdev,
|
|||
static int dw_spi_alpine_init(struct platform_device *pdev,
|
||||
struct dw_spi_mmio *dwsmmio)
|
||||
{
|
||||
dwsmmio->dws.cs_override = 1;
|
||||
dwsmmio->dws.caps = DW_SPI_CAP_CS_OVERRIDE;
|
||||
|
||||
/* Register hook to configure CTRLR0 */
|
||||
dwsmmio->dws.update_cr0 = dw_spi_update_cr0;
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#ifndef DW_SPI_HEADER_H
|
||||
#define DW_SPI_HEADER_H
|
||||
|
||||
#include <linux/bits.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/irqreturn.h>
|
||||
|
@ -98,6 +99,9 @@ enum dw_ssi_type {
|
|||
SSI_NS_MICROWIRE,
|
||||
};
|
||||
|
||||
/* DW SPI capabilities */
|
||||
#define DW_SPI_CAP_CS_OVERRIDE BIT(0)
|
||||
|
||||
struct dw_spi;
|
||||
struct dw_spi_dma_ops {
|
||||
int (*dma_init)(struct device *dev, struct dw_spi *dws);
|
||||
|
@ -118,7 +122,8 @@ struct dw_spi {
|
|||
u32 fifo_len; /* depth of the FIFO buffer */
|
||||
u32 max_freq; /* max bus freq supported */
|
||||
|
||||
int cs_override;
|
||||
u32 caps; /* DW SPI capabilities */
|
||||
|
||||
u32 reg_io_width; /* DR I/O width in bytes */
|
||||
u16 bus_num;
|
||||
u16 num_cs; /* supported slave numbers */
|
||||
|
|
Loading…
Reference in New Issue