Signed-off-by: Jiri Vlasak <[email protected]>
---
 arch/arm/src/kinetis/kinetis_spi.c | 37 +++++++++++++++++++++++++++---
 1 file changed, 34 insertions(+), 3 deletions(-)

diff --git a/arch/arm/src/kinetis/kinetis_spi.c 
b/arch/arm/src/kinetis/kinetis_spi.c
index 9e60f1300b..e66fc7603f 100644
--- a/arch/arm/src/kinetis/kinetis_spi.c
+++ b/arch/arm/src/kinetis/kinetis_spi.c
@@ -732,6 +732,7 @@ static uint32_t spi_setfrequency(struct spi_dev_s *dev,
                                  uint32_t frequency)
 {
   struct kinetis_spidev_s *priv = (struct kinetis_spidev_s *)dev;
+  bool spi_was_halted;
 
   uint32_t prescale;
   uint32_t prescalev;
@@ -747,6 +748,10 @@ static uint32_t spi_setfrequency(struct spi_dev_s *dev,
   uint32_t br  = 0;
   uint32_t min  = UINT32_MAX;
 
+  /* Do not write to the CTAR while the module is Running. */
+
+  spi_was_halted = spi_run(priv, false);
+
   /* Check if requested frequency reasonable */
 
   if (frequency > KINETIS_SPI_CLK_MAX)
@@ -826,6 +831,11 @@ static uint32_t spi_setfrequency(struct spi_dev_s *dev,
 
   priv->frequency = frequency;
 
+  if (!spi_was_halted)
+    {
+      spi_run(priv, true);
+    }
+
   spiinfo("Frequency %" PRId32 "->%" PRId32 "\n", frequency, priv->actual);
   return priv->actual;
 }
@@ -1001,9 +1011,10 @@ static int spi_setdelay(struct spi_dev_s *dev,
 
   spiinfo("PDT set to 0x%02x, DT set to 0x%04x", final_p, final_s);
 
-  if (!spi_was_halted) {
-    spi_run(priv, true);
-  }
+  if (!spi_was_halted)
+    {
+      spi_run(priv, true);
+    }
 
   return 0;
 }
@@ -1088,6 +1099,7 @@ static void spi_setmode(struct spi_dev_s *dev, enum 
spi_mode_e mode)
 static void spi_setbits(struct spi_dev_s *dev, int nbits)
 {
   struct kinetis_spidev_s *priv = (struct kinetis_spidev_s *)dev;
+  bool spi_was_halted;
   uint32_t regval;
 
   if (nbits != priv->nbits)
@@ -1099,6 +1111,10 @@ static void spi_setbits(struct spi_dev_s *dev, int nbits)
           return;
         }
 
+      /* Do not write to the CTAR while the module is Running. */
+
+      spi_was_halted = spi_run(priv, false);
+
       regval = spi_getreg(priv, priv->ctarsel);
       regval &= ~(SPI_CTARM_FMSZ_MASK);
       regval |= SPI_CTARM_FMSZ(nbits - 1);
@@ -1109,6 +1125,11 @@ static void spi_setbits(struct spi_dev_s *dev, int nbits)
        */
 
       priv->nbits = nbits;
+
+      if (!spi_was_halted)
+        {
+          spi_run(priv, true);
+        }
     }
 }
 
@@ -1134,11 +1155,16 @@ static int spi_hwfeatures(struct spi_dev_s *dev,
 {
 #ifdef CONFIG_SPI_BITORDER
   struct kinetis_spidev_s *priv = (struct spi_dev_s *)dev;
+  bool spi_was_halted;
   uint32_t setbits;
   uint32_t clrbits;
 
   spiinfo("features=%08x\n", features);
 
+  /* Do not write to the CTAR while the module is Running. */
+
+  spi_was_halted = spi_run(priv, false);
+
   /* Transfer data LSB first? */
 
   if ((features & HWFEAT_LSBFIRST) != 0)
@@ -1159,6 +1185,11 @@ static int spi_hwfeatures(struct spi_dev_s *dev,
 
   /* Other H/W features are not supported */
 
+  if (!spi_was_halted)
+    {
+      spi_run(priv, true);
+    }
+
   return ((features & ~HWFEAT_LSBFIRST) == 0) ? OK : -ENOSYS;
 #else
   return -ENOSYS;
-- 
2.47.3

Reply via email to