/* Update total bytes transferred */
        msg->actual_length += pl022->cur_transfer->len;
-       if (pl022->cur_transfer->cs_change)
-               pl022_cs_control(pl022, SSP_CHIP_DESELECT);
-
        /* Move to next transfer */
        msg->state = next_transfer(pl022);
+       if (msg->state != STATE_DONE && pl022->cur_transfer->cs_change)
+               pl022_cs_control(pl022, SSP_CHIP_DESELECT);
        tasklet_schedule(&pl022->pump_transfers);
 }
 
                }
                /* Update total bytes transferred */
                msg->actual_length += pl022->cur_transfer->len;
-               if (pl022->cur_transfer->cs_change)
-                       pl022_cs_control(pl022, SSP_CHIP_DESELECT);
                /* Move to next transfer */
                msg->state = next_transfer(pl022);
+               if (msg->state != STATE_DONE && pl022->cur_transfer->cs_change)
+                       pl022_cs_control(pl022, SSP_CHIP_DESELECT);
                tasklet_schedule(&pl022->pump_transfers);
                return IRQ_HANDLED;
        }
 
                /* Update total byte transferred */
                message->actual_length += pl022->cur_transfer->len;
-               if (pl022->cur_transfer->cs_change)
-                       pl022_cs_control(pl022, SSP_CHIP_DESELECT);
                /* Move to next transfer */
                message->state = next_transfer(pl022);
+               if (message->state != STATE_DONE
+                   && pl022->cur_transfer->cs_change)
+                       pl022_cs_control(pl022, SSP_CHIP_DESELECT);
        }
 out:
        /* Handle end of message */