]> err.no Git - linux-2.6/blobdiff - drivers/spi/spi_mpc83xx.c
Lguest support for Virtio
[linux-2.6] / drivers / spi / spi_mpc83xx.c
index fe69e94043e1fad93779d1d167ef48a300e57a5e..4580b9cf625d159585793d05d848c5781e9a9f2b 100644 (file)
@@ -148,6 +148,8 @@ static void mpc83xx_spi_chipselect(struct spi_device *spi, int value)
        if (value == BITBANG_CS_ACTIVE) {
                u32 regval = mpc83xx_spi_read_reg(&mpc83xx_spi->base->mode);
                u32 len = spi->bits_per_word;
+               u8 pm;
+
                if (len == 32)
                        len = 0;
                else
@@ -170,7 +172,7 @@ static void mpc83xx_spi_chipselect(struct spi_device *spi, int value)
                regval |= SPMODE_LEN(len);
 
                if ((mpc83xx_spi->spibrg / spi->max_speed_hz) >= 64) {
-                       u8 pm = mpc83xx_spi->spibrg / (spi->max_speed_hz * 64);
+                       pm = mpc83xx_spi->spibrg / (spi->max_speed_hz * 64) - 1;
                        if (pm > 0x0f) {
                                dev_err(&spi->dev, "Requested speed is too "
                                        "low: %d Hz. Will use %d Hz instead.\n",
@@ -180,7 +182,9 @@ static void mpc83xx_spi_chipselect(struct spi_device *spi, int value)
                        }
                        regval |= SPMODE_PM(pm) | SPMODE_DIV16;
                } else {
-                       u8 pm = mpc83xx_spi->spibrg / (spi->max_speed_hz * 4);
+                       pm = mpc83xx_spi->spibrg / (spi->max_speed_hz * 4);
+                       if (pm)
+                               pm--;
                        regval |= SPMODE_PM(pm);
                }
 
@@ -380,11 +384,8 @@ irqreturn_t mpc83xx_spi_irq(s32 irq, void *context_data)
 
        mpc83xx_spi->count -= 1;
        if (mpc83xx_spi->count) {
-               if (mpc83xx_spi->tx) {
-                       u32 word = mpc83xx_spi->get_tx(mpc83xx_spi);
-                       mpc83xx_spi_write_reg(&mpc83xx_spi->base->transmit,
-                                             word);
-               }
+               u32 word = mpc83xx_spi->get_tx(mpc83xx_spi);
+               mpc83xx_spi_write_reg(&mpc83xx_spi->base->transmit, word);
        } else {
                complete(&mpc83xx_spi->done);
        }
@@ -510,7 +511,7 @@ err:
        return ret;
 }
 
-static int __devexit mpc83xx_spi_remove(struct platform_device *dev)
+static int __exit mpc83xx_spi_remove(struct platform_device *dev)
 {
        struct mpc83xx_spi *mpc83xx_spi;
        struct spi_master *master;
@@ -526,9 +527,9 @@ static int __devexit mpc83xx_spi_remove(struct platform_device *dev)
        return 0;
 }
 
+MODULE_ALIAS("mpc83xx_spi");                   /* for platform bus hotplug */
 static struct platform_driver mpc83xx_spi_driver = {
-       .probe = mpc83xx_spi_probe,
-       .remove = __devexit_p(mpc83xx_spi_remove),
+       .remove = __exit_p(mpc83xx_spi_remove),
        .driver = {
                   .name = "mpc83xx_spi",
        },
@@ -536,7 +537,7 @@ static struct platform_driver mpc83xx_spi_driver = {
 
 static int __init mpc83xx_spi_init(void)
 {
-       return platform_driver_register(&mpc83xx_spi_driver);
+       return platform_driver_probe(&mpc83xx_spi_driver, mpc83xx_spi_probe);
 }
 
 static void __exit mpc83xx_spi_exit(void)