spi/fsl-espi: Make sure pm is within 2..32
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Thu, 15 Mar 2012 17:42:32 +0000 (18:42 +0100)
committerGrant Likely <grant.likely@secretlab.ca>
Thu, 15 Mar 2012 21:14:24 +0000 (15:14 -0600)
The reference manual says that pm has to stay within 2 and 32. So the
lowest frequency is 32 and DIV16 set, the highest is 2 and DIV16 unset.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
drivers/spi/spi-fsl-espi.c

index 43350f99931418655852357d7640ee93ec14c9ab..7523a2429d09507c448199db38d319f25145212f 100644 (file)
@@ -182,16 +182,18 @@ static int fsl_espi_setup_transfer(struct spi_device *spi,
                cs->hw_mode |= CSMODE_DIV16;
                pm = DIV_ROUND_UP(mpc8xxx_spi->spibrg, hz * 16 * 4);
 
-               WARN_ONCE(pm > 16, "%s: Requested speed is too low: %d Hz. "
+               WARN_ONCE(pm > 33, "%s: Requested speed is too low: %d Hz. "
                          "Will use %d Hz instead.\n", dev_name(&spi->dev),
-                         hz, mpc8xxx_spi->spibrg / 1024);
-               if (pm > 16)
-                       pm = 16;
+                               hz, mpc8xxx_spi->spibrg / (4 * 16 * (32 + 1)));
+               if (pm > 33)
+                       pm = 33;
        } else {
                pm = DIV_ROUND_UP(mpc8xxx_spi->spibrg, hz * 4);
        }
        if (pm)
                pm--;
+       if (pm < 2)
+               pm = 2;
 
        cs->hw_mode |= CSMODE_PM(pm);