From: Chen Gong <[EMAIL PROTECTED]>
Subject: [PATCH] fix spi_mpc83xx prescale

This updates the SPI clock rate calculations for the spi_mpc83xx
driver.  Some boundary conditions were wrong, and in several cases
divide-by-16 wasn't always needed

Signed-off-by: Chen Gong <[EMAIL PROTECTED]>
Signed-off-by: David Brownell <[EMAIL PROTECTED]>
---
 drivers/spi/spi_mpc83xx.c |   29 ++++++++++++++++-------------
 1 file changed, 16 insertions(+), 13 deletions(-)

--- a/drivers/spi/spi_mpc83xx.c 2008-05-13 15:17:37.000000000 -0700
+++ b/drivers/spi/spi_mpc83xx.c 2008-06-27 18:17:17.000000000 -0700
@@ -266,21 +266,24 @@ int mpc83xx_spi_setup_transfer(struct sp
 
        cs->hw_mode |= SPMODE_LEN(bits_per_word);
 
-       if ((mpc83xx_spi->spibrg / hz) >= 64) {
-               pm = mpc83xx_spi->spibrg / (hz * 64) - 1;
-               if (pm > 0x0f) {
-                       dev_err(&spi->dev, "Requested speed is too "
-                               "low: %d Hz. Will use %d Hz instead.\n",
-                               hz, mpc83xx_spi->spibrg / 1024);
-                       pm = 0x0f;
+       if ((mpc83xx_spi->spibrg / hz) > 64) {
+               pm = mpc83xx_spi->spibrg / (hz * 64);
+               if (pm > 16) {
+                       cs->hw_mode |= SPMODE_DIV16;
+                       pm /= 16;
+                       if (pm > 16) {
+                               dev_err(&spi->dev, "Requested speed is too "
+                                       "low: %d Hz. Will use %d Hz instead.\n",
+                                       hz, mpc83xx_spi->spibrg / 1024);
+                               pm = 16;
+                       }
                }
-               cs->hw_mode |= SPMODE_PM(pm) | SPMODE_DIV16;
-       } else {
+       } else
                pm = mpc83xx_spi->spibrg / (hz * 4);
-               if (pm)
-                       pm--;
-               cs->hw_mode |= SPMODE_PM(pm);
-       }
+       if (pm)
+               pm--;
+
+       cs->hw_mode |= SPMODE_PM(pm);
        regval =  mpc83xx_spi_read_reg(&mpc83xx_spi->base->mode);
        if (cs->hw_mode != regval) {
                unsigned long flags;

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general

Reply via email to