spi: dw: Add compatible for Intel Mount Evans SoC
authorAbe Kohandel <abe.kohandel@intel.com>
Tue, 6 Jun 2023 14:54:01 +0000 (07:54 -0700)
committerMark Brown <broonie@kernel.org>
Tue, 6 Jun 2023 14:59:16 +0000 (15:59 +0100)
The Intel Mount Evans SoC's Integrated Management Complex uses the SPI
controller for access to a NOR SPI FLASH. However, the SoC doesn't
provide a mechanism to override the native chip select signal.

This driver doesn't use DMA for memory operations when a chip select
override is not provided due to the native chip select timing behavior.
As a result no DMA configuration is done for the controller and this
configuration is not tested.

The controller also has an errata where a full TX FIFO can result in
data corruption. The suggested workaround is to never completely fill
the FIFO. The TX FIFO has a size of 32 so the fifo_len is set to 31.

Signed-off-by: Abe Kohandel <abe.kohandel@intel.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20230606145402.474866-2-abe.kohandel@intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-dw-mmio.c

index 5f2aee6..c1d1615 100644 (file)
@@ -236,6 +236,31 @@ static int dw_spi_intel_init(struct platform_device *pdev,
        return 0;
 }
 
+/*
+ * The Intel Mount Evans SoC's Integrated Management Complex uses the
+ * SPI controller for access to a NOR SPI FLASH. However, the SoC doesn't
+ * provide a mechanism to override the native chip select signal.
+ *
+ * This driver doesn't use DMA for memory operations when a chip select
+ * override is not provided due to the native chip select timing behavior.
+ * As a result no DMA configuration is done for the controller and this
+ * configuration is not tested.
+ */
+static int dw_spi_mountevans_imc_init(struct platform_device *pdev,
+                                     struct dw_spi_mmio *dwsmmio)
+{
+       /*
+        * The Intel Mount Evans SoC's Integrated Management Complex DW
+        * apb_ssi_v4.02a controller has an errata where a full TX FIFO can
+        * result in data corruption. The suggested workaround is to never
+        * completely fill the FIFO. The TX FIFO has a size of 32 so the
+        * fifo_len is set to 31.
+        */
+       dwsmmio->dws.fifo_len = 31;
+
+       return 0;
+}
+
 static int dw_spi_canaan_k210_init(struct platform_device *pdev,
                                   struct dw_spi_mmio *dwsmmio)
 {
@@ -405,6 +430,10 @@ static const struct of_device_id dw_spi_mmio_of_match[] = {
        { .compatible = "snps,dwc-ssi-1.01a", .data = dw_spi_hssi_init},
        { .compatible = "intel,keembay-ssi", .data = dw_spi_intel_init},
        { .compatible = "intel,thunderbay-ssi", .data = dw_spi_intel_init},
+       {
+               .compatible = "intel,mountevans-imc-ssi",
+               .data = dw_spi_mountevans_imc_init,
+       },
        { .compatible = "microchip,sparx5-spi", dw_spi_mscc_sparx5_init},
        { .compatible = "canaan,k210-spi", dw_spi_canaan_k210_init},
        { .compatible = "amd,pensando-elba-spi", .data = dw_spi_elba_init},