spi/pl022: disable the PL022 block when unused
authorVirupax Sadashivpetimath <virupax.sadashivpetimath@stericsson.com>
Mon, 17 Oct 2011 12:52:47 +0000 (14:52 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 1 Dec 2011 16:16:08 +0000 (17:16 +0100)
Make sure we clear the enable bit when the block is not used.
This will save some energy in certain hardware versions.

Reviewed-by: Viresh Kumar <viresh.kumar@st.com>
Signed-off-by: Virupax Sadashivpetimath <virupax.sadashivpetimath@stericsson.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/spi/spi-pl022.c

index d165c0bfcab523bdf55bf1f08bd10a76d6631df3..82a929f916fd7250c1c6c3f884214181ddf63825 100644 (file)
@@ -1512,8 +1512,12 @@ static void pump_messages(struct work_struct *work)
        /* Lock queue and check for queue work */
        spin_lock_irqsave(&pl022->queue_lock, flags);
        if (list_empty(&pl022->queue) || !pl022->running) {
-               if (pl022->busy)
+               if (pl022->busy) {
+                       /* nothing more to do - disable spi/ssp and power off */
+                       writew((readw(SSP_CR1(pl022->virtbase)) &
+                               (~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase));
                        pm_runtime_put(&pl022->adev->dev);
+               }
                pl022->busy = false;
                spin_unlock_irqrestore(&pl022->queue_lock, flags);
                return;