u32 m_cmd = 0;
        u32 spi_tx_cfg, len;
        struct geni_se *se = &mas->se;
 +      int ret;
  
+       /*
+        * Ensure that our interrupt handler isn't still running from some
+        * prior command before we start messing with the hardware behind
+        * its back.  We don't need to _keep_ the lock here since we're only
+        * worried about racing with out interrupt handler.  The SPI core
+        * already handles making sure that we're not trying to do two
+        * transfers at once or setting a chip select and doing a transfer
+        * concurrently.
+        *
+        * NOTE: we actually _can't_ hold the lock here because possibly we
+        * might call clk_set_rate() which needs to be able to sleep.
+        */
+       spin_lock_irq(&mas->lock);
+       spin_unlock_irq(&mas->lock);
+ 
        spi_tx_cfg = readl(se->base + SE_SPI_TRANS_CFG);
        if (xfer->bits_per_word != mas->cur_bits_per_word) {
                spi_setup_word_len(mas, mode, xfer->bits_per_word);
        spi->handle_err = handle_fifo_timeout;
        spi->set_cs = spi_geni_set_cs;
  
-       init_completion(&mas->xfer_done);
+       init_completion(&mas->cs_done);
+       init_completion(&mas->cancel_done);
+       init_completion(&mas->abort_done);
        spin_lock_init(&mas->lock);
+       pm_runtime_use_autosuspend(&pdev->dev);
+       pm_runtime_set_autosuspend_delay(&pdev->dev, 250);
        pm_runtime_enable(dev);
  
 +      ret = geni_icc_get(&mas->se, NULL);
 +      if (ret)
 +              goto spi_geni_probe_runtime_disable;
 +      /* Set the bus quota to a reasonable value for register access */
 +      mas->se.icc_paths[GENI_TO_CORE].avg_bw = Bps_to_icc(CORE_2X_50_MHZ);
 +      mas->se.icc_paths[CPU_TO_GENI].avg_bw = GENI_DEFAULT_BW;
 +
 +      ret = geni_icc_set_bw(&mas->se);
 +      if (ret)
 +              goto spi_geni_probe_runtime_disable;
 +
        ret = spi_geni_init(mas);
        if (ret)
                goto spi_geni_probe_runtime_disable;