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:
@@ -104,7 +104,7 @@ void dw_spi_set_cs(struct spi_device *spi, bool enable)
|
|||||||
*/
|
*/
|
||||||
if (cs_high == enable)
|
if (cs_high == enable)
|
||||||
dw_writel(dws, DW_SPI_SER, BIT(spi->chip_select));
|
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);
|
dw_writel(dws, DW_SPI_SER, 0);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(dw_spi_set_cs);
|
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 */
|
/* 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);
|
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,
|
static int dw_spi_alpine_init(struct platform_device *pdev,
|
||||||
struct dw_spi_mmio *dwsmmio)
|
struct dw_spi_mmio *dwsmmio)
|
||||||
{
|
{
|
||||||
dwsmmio->dws.cs_override = 1;
|
dwsmmio->dws.caps = DW_SPI_CAP_CS_OVERRIDE;
|
||||||
|
|
||||||
/* Register hook to configure CTRLR0 */
|
/* Register hook to configure CTRLR0 */
|
||||||
dwsmmio->dws.update_cr0 = dw_spi_update_cr0;
|
dwsmmio->dws.update_cr0 = dw_spi_update_cr0;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#ifndef DW_SPI_HEADER_H
|
#ifndef DW_SPI_HEADER_H
|
||||||
#define DW_SPI_HEADER_H
|
#define DW_SPI_HEADER_H
|
||||||
|
|
||||||
|
#include <linux/bits.h>
|
||||||
#include <linux/completion.h>
|
#include <linux/completion.h>
|
||||||
#include <linux/debugfs.h>
|
#include <linux/debugfs.h>
|
||||||
#include <linux/irqreturn.h>
|
#include <linux/irqreturn.h>
|
||||||
@@ -98,6 +99,9 @@ enum dw_ssi_type {
|
|||||||
SSI_NS_MICROWIRE,
|
SSI_NS_MICROWIRE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* DW SPI capabilities */
|
||||||
|
#define DW_SPI_CAP_CS_OVERRIDE BIT(0)
|
||||||
|
|
||||||
struct dw_spi;
|
struct dw_spi;
|
||||||
struct dw_spi_dma_ops {
|
struct dw_spi_dma_ops {
|
||||||
int (*dma_init)(struct device *dev, struct dw_spi *dws);
|
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 fifo_len; /* depth of the FIFO buffer */
|
||||||
u32 max_freq; /* max bus freq supported */
|
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 */
|
u32 reg_io_width; /* DR I/O width in bytes */
|
||||||
u16 bus_num;
|
u16 bus_num;
|
||||||
u16 num_cs; /* supported slave numbers */
|
u16 num_cs; /* supported slave numbers */
|
||||||
|
|||||||
Reference in New Issue
Block a user