diff options
author | Talel Shenhar <talel@amazon.com> | 2018-10-11 07:20:07 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2018-10-11 10:11:04 -0400 |
commit | f2d704794864a4bb486f2a0eaed40f25dd87303f (patch) | |
tree | 9b0b39d17cd6cec53a7e3196b025a2668cf1abe7 | |
parent | d49a30366793210cd64759edcdf7099a2e32efd6 (diff) |
dw: spi: add support for Amazon's Alpine spi controller
Add support for a new devicetree compatible string called
'amazon,alpine-apb-ssi', which is necessary for the Amazon Alpine spi
controller. 'amazon,alpine-dw-apb-ssi' is used in the dw spi driver if
specified in the devicetree. Otherwise, fall back to driver default
behavior, i.e. original dw IP hw driver behavior.
Signed-off-by: Talel Shenhar <talel@amazon.com>
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | drivers/spi/spi-dw-mmio.c | 9 | ||||
-rw-r--r-- | drivers/spi/spi-dw.c | 6 | ||||
-rw-r--r-- | drivers/spi/spi-dw.h | 2 |
3 files changed, 17 insertions, 0 deletions
diff --git a/drivers/spi/spi-dw-mmio.c b/drivers/spi/spi-dw-mmio.c index a768461614a0..3ffb6a40fe0c 100644 --- a/drivers/spi/spi-dw-mmio.c +++ b/drivers/spi/spi-dw-mmio.c | |||
@@ -126,6 +126,14 @@ static int dw_spi_mscc_jaguar2_init(struct platform_device *pdev, | |||
126 | JAGUAR2_IF_SI_OWNER_OFFSET); | 126 | JAGUAR2_IF_SI_OWNER_OFFSET); |
127 | } | 127 | } |
128 | 128 | ||
129 | static int dw_spi_alpine_init(struct platform_device *pdev, | ||
130 | struct dw_spi_mmio *dwsmmio) | ||
131 | { | ||
132 | dwsmmio->dws.cs_override = 1; | ||
133 | |||
134 | return 0; | ||
135 | } | ||
136 | |||
129 | static int dw_spi_mmio_probe(struct platform_device *pdev) | 137 | static int dw_spi_mmio_probe(struct platform_device *pdev) |
130 | { | 138 | { |
131 | int (*init_func)(struct platform_device *pdev, | 139 | int (*init_func)(struct platform_device *pdev, |
@@ -230,6 +238,7 @@ static const struct of_device_id dw_spi_mmio_of_match[] = { | |||
230 | { .compatible = "snps,dw-apb-ssi", }, | 238 | { .compatible = "snps,dw-apb-ssi", }, |
231 | { .compatible = "mscc,ocelot-spi", .data = dw_spi_mscc_ocelot_init}, | 239 | { .compatible = "mscc,ocelot-spi", .data = dw_spi_mscc_ocelot_init}, |
232 | { .compatible = "mscc,jaguar2-spi", .data = dw_spi_mscc_jaguar2_init}, | 240 | { .compatible = "mscc,jaguar2-spi", .data = dw_spi_mscc_jaguar2_init}, |
241 | { .compatible = "amazon,alpine-dw-apb-ssi", .data = dw_spi_alpine_init}, | ||
233 | { /* end of table */} | 242 | { /* end of table */} |
234 | }; | 243 | }; |
235 | MODULE_DEVICE_TABLE(of, dw_spi_mmio_of_match); | 244 | MODULE_DEVICE_TABLE(of, dw_spi_mmio_of_match); |
diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c index 3e205ab60cd4..b705f2bdb8b9 100644 --- a/drivers/spi/spi-dw.c +++ b/drivers/spi/spi-dw.c | |||
@@ -144,6 +144,8 @@ void dw_spi_set_cs(struct spi_device *spi, bool enable) | |||
144 | 144 | ||
145 | if (!enable) | 145 | if (!enable) |
146 | dw_writel(dws, DW_SPI_SER, BIT(spi->chip_select)); | 146 | dw_writel(dws, DW_SPI_SER, BIT(spi->chip_select)); |
147 | else if (dws->cs_override) | ||
148 | dw_writel(dws, DW_SPI_SER, 0); | ||
147 | } | 149 | } |
148 | EXPORT_SYMBOL_GPL(dw_spi_set_cs); | 150 | EXPORT_SYMBOL_GPL(dw_spi_set_cs); |
149 | 151 | ||
@@ -463,6 +465,10 @@ static void spi_hw_init(struct device *dev, struct dw_spi *dws) | |||
463 | dws->fifo_len = (fifo == 1) ? 0 : fifo; | 465 | dws->fifo_len = (fifo == 1) ? 0 : fifo; |
464 | dev_dbg(dev, "Detected FIFO size: %u bytes\n", dws->fifo_len); | 466 | dev_dbg(dev, "Detected FIFO size: %u bytes\n", dws->fifo_len); |
465 | } | 467 | } |
468 | |||
469 | /* enable HW fixup for explicit CS deselect for Amazon's alpine chip */ | ||
470 | if (dws->cs_override) | ||
471 | dw_writel(dws, DW_SPI_CS_OVERRIDE, 0xF); | ||
466 | } | 472 | } |
467 | 473 | ||
468 | int dw_spi_add_host(struct device *dev, struct dw_spi *dws) | 474 | int dw_spi_add_host(struct device *dev, struct dw_spi *dws) |
diff --git a/drivers/spi/spi-dw.h b/drivers/spi/spi-dw.h index 0168b08364d5..c9c15881e982 100644 --- a/drivers/spi/spi-dw.h +++ b/drivers/spi/spi-dw.h | |||
@@ -32,6 +32,7 @@ | |||
32 | #define DW_SPI_IDR 0x58 | 32 | #define DW_SPI_IDR 0x58 |
33 | #define DW_SPI_VERSION 0x5c | 33 | #define DW_SPI_VERSION 0x5c |
34 | #define DW_SPI_DR 0x60 | 34 | #define DW_SPI_DR 0x60 |
35 | #define DW_SPI_CS_OVERRIDE 0xf4 | ||
35 | 36 | ||
36 | /* Bit fields in CTRLR0 */ | 37 | /* Bit fields in CTRLR0 */ |
37 | #define SPI_DFS_OFFSET 0 | 38 | #define SPI_DFS_OFFSET 0 |
@@ -109,6 +110,7 @@ struct dw_spi { | |||
109 | u32 fifo_len; /* depth of the FIFO buffer */ | 110 | u32 fifo_len; /* depth of the FIFO buffer */ |
110 | u32 max_freq; /* max bus freq supported */ | 111 | u32 max_freq; /* max bus freq supported */ |
111 | 112 | ||
113 | int cs_override; | ||
112 | u32 reg_io_width; /* DR I/O width in bytes */ | 114 | u32 reg_io_width; /* DR I/O width in bytes */ |
113 | u16 bus_num; | 115 | u16 bus_num; |
114 | u16 num_cs; /* supported slave numbers */ | 116 | u16 num_cs; /* supported slave numbers */ |