return omap_aes_crypt_dma_start(dd);
 }
 
+static void omap_aes_copy_ivout(struct omap_aes_dev *dd, u8 *ivbuf)
+{
+       int i;
+
+       for (i = 0; i < 4; i++)
+               ((u32 *)ivbuf)[i] = omap_aes_read(dd, AES_REG_IV(dd, i));
+}
+
 static void omap_aes_done_task(unsigned long data)
 {
        struct omap_aes_dev *dd = (struct omap_aes_dev *)data;
        omap_crypto_cleanup(&dd->out_sgl, dd->orig_out, 0, dd->total_save,
                            FLAGS_OUT_DATA_ST_SHIFT, dd->flags);
 
+       /* Update IV output */
+       if (dd->flags & (FLAGS_CBC | FLAGS_CTR))
+               omap_aes_copy_ivout(dd, dd->req->iv);
+
        omap_aes_finish_req(dd, 0);
 
        pr_debug("exit\n");