Message ID | 1539184516-8200-2-git-send-email-talel@amazon.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | None | expand |
On Wed, 2018-10-10 at 18:15 +0300, Talel Shenhar wrote: > Add support for a new devicetree compatible string called > 'al,alpine-apb-ssi', which is necessary for the Amazon Alpine spi > controller. 'al,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> Shouldn't this be "amzn,alpine-apb-ssi"? The convention, and this IS documented, is to the use company's stock ticker symbol as the prefix, so as to have something grounded in the real world. I don't know of anyone else using a product line name as the company name in their dt bindings. Example, "snps,dw-apb-ssi", is named for Synopsis, not the Designware line.
On 10/11/2018 01:08 AM, Trent Piepho wrote: > On Wed, 2018-10-10 at 18:15 +0300, Talel Shenhar wrote: >> Add support for a new devicetree compatible string called >> 'al,alpine-apb-ssi', which is necessary for the Amazon Alpine spi >> controller. 'al,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> > Shouldn't this be "amzn,alpine-apb-ssi"? The convention, and this IS > documented, is to the use company's stock ticker symbol as the prefix, > so as to have something grounded in the real world. I don't know of > anyone else using a product line name as the company name in their dt > bindings. Example, "snps,dw-apb-ssi", is named for Synopsis, not the > Designware line. > updated the vendor prefix to "amazon" as described in bindings/vendor-prefixes.txt.
diff --git a/drivers/spi/spi-dw-mmio.c b/drivers/spi/spi-dw-mmio.c index a768461..88b04d2 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, JAGUAR2_IF_SI_OWNER_OFFSET); } +static int dw_spi_alpine_init(struct platform_device *pdev, + struct dw_spi_mmio *dwsmmio) +{ + dwsmmio->dws.cs_override = 1; + + return 0; +} + static int dw_spi_mmio_probe(struct platform_device *pdev) { int (*init_func)(struct platform_device *pdev, @@ -230,6 +238,7 @@ static const struct of_device_id dw_spi_mmio_of_match[] = { { .compatible = "snps,dw-apb-ssi", }, { .compatible = "mscc,ocelot-spi", .data = dw_spi_mscc_ocelot_init}, { .compatible = "mscc,jaguar2-spi", .data = dw_spi_mscc_jaguar2_init}, + { .compatible = "al,alpine-dw-apb-ssi", .data = dw_spi_alpine_init}, { /* end of table */} }; MODULE_DEVICE_TABLE(of, dw_spi_mmio_of_match); diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c index 3e205ab..b705f2b 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) if (!enable) dw_writel(dws, DW_SPI_SER, BIT(spi->chip_select)); + else if (dws->cs_override) + dw_writel(dws, DW_SPI_SER, 0); } EXPORT_SYMBOL_GPL(dw_spi_set_cs); @@ -463,6 +465,10 @@ static void spi_hw_init(struct device *dev, struct dw_spi *dws) dws->fifo_len = (fifo == 1) ? 0 : fifo; dev_dbg(dev, "Detected FIFO size: %u bytes\n", dws->fifo_len); } + + /* enable HW fixup for explicit CS deselect for Amazon's alpine chip */ + if (dws->cs_override) + dw_writel(dws, DW_SPI_CS_OVERRIDE, 0xF); } 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 0168b08..c9c1588 100644 --- a/drivers/spi/spi-dw.h +++ b/drivers/spi/spi-dw.h @@ -32,6 +32,7 @@ #define DW_SPI_IDR 0x58 #define DW_SPI_VERSION 0x5c #define DW_SPI_DR 0x60 +#define DW_SPI_CS_OVERRIDE 0xf4 /* Bit fields in CTRLR0 */ #define SPI_DFS_OFFSET 0 @@ -109,6 +110,7 @@ struct dw_spi { u32 fifo_len; /* depth of the FIFO buffer */ u32 max_freq; /* max bus freq supported */ + int cs_override; u32 reg_io_width; /* DR I/O width in bytes */ u16 bus_num; u16 num_cs; /* supported slave numbers */