return count - c;
 }
 
+static u32 omap2_mcspi_calc_divisor(u32 speed_hz)
+{
+       u32 div;
+
+       for (div = 0; div < 15; div++)
+               if (speed_hz >= (OMAP2_MCSPI_MAX_FREQ >> div))
+                       return div;
+
+       return 15;
+}
+
 /* called only when no transfer is active to this device */
 static int omap2_mcspi_setup_transfer(struct spi_device *spi,
                struct spi_transfer *t)
        if (t && t->speed_hz)
                speed_hz = t->speed_hz;
 
-       if (speed_hz) {
-               while (div <= 15 && (OMAP2_MCSPI_MAX_FREQ / (1 << div))
-                                       > speed_hz)
-                       div++;
-       } else
-               div = 15;
+       speed_hz = min_t(u32, speed_hz, OMAP2_MCSPI_MAX_FREQ);
+       div = omap2_mcspi_calc_divisor(speed_hz);
 
        l = mcspi_cached_chconf0(spi);
 
        mcspi_write_chconf0(spi, l);
 
        dev_dbg(&spi->dev, "setup: speed %d, sample %s edge, clk %s\n",
-                       OMAP2_MCSPI_MAX_FREQ / (1 << div),
+                       OMAP2_MCSPI_MAX_FREQ >> div,
                        (spi->mode & SPI_CPHA) ? "trailing" : "leading",
                        (spi->mode & SPI_CPOL) ? "inverted" : "normal");
 
                                        t->bits_per_word);
                        return -EINVAL;
                }
-               if (t->speed_hz && t->speed_hz < OMAP2_MCSPI_MAX_FREQ/(1<<16)) {
-                       dev_dbg(&spi->dev, "%d Hz max exceeds %d\n",
-                                       t->speed_hz,
-                                       OMAP2_MCSPI_MAX_FREQ/(1<<16));
+               if (t->speed_hz && t->speed_hz < (OMAP2_MCSPI_MAX_FREQ >> 15)) {
+                       dev_dbg(&spi->dev, "speed_hz %d below minimum %d Hz\n",
+                               t->speed_hz,
+                               OMAP2_MCSPI_MAX_FREQ >> 15);
                        return -EINVAL;
                }