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