[dif] Clean up dif_spi_device.h to use new-style names

Signed-off-by: Miguel Young de la Sota <mcyoung@google.com>
diff --git a/sw/device/boot_rom/bootstrap.c b/sw/device/boot_rom/bootstrap.c
index 41e507c..8d98d8e 100644
--- a/sw/device/boot_rom/bootstrap.c
+++ b/sw/device/boot_rom/bootstrap.c
@@ -88,15 +88,13 @@
   uint32_t expected_frame_num = 0;
   while (true) {
     size_t bytes_available;
-    CHECK(dif_spi_device_rx_pending(spi, &bytes_available) ==
-              kDifSpiDeviceResultOk,
+    CHECK(dif_spi_device_rx_pending(spi, &bytes_available) == kDifSpiDeviceOk,
           "Failed to check pending bytes.");
     if (bytes_available >= sizeof(spiflash_frame_t)) {
       spiflash_frame_t frame;
-      CHECK(
-          dif_spi_device_recv(spi, &frame, sizeof(spiflash_frame_t),
-                              /*bytes_received=*/NULL) == kDifSpiDeviceResultOk,
-          "Failed to recieve bytes from SPI.");
+      CHECK(dif_spi_device_recv(spi, &frame, sizeof(spiflash_frame_t),
+                                /*bytes_received=*/NULL) == kDifSpiDeviceOk,
+            "Failed to recieve bytes from SPI.");
 
       uint32_t frame_num = SPIFLASH_FRAME_NUM(frame.header.frame_num);
       LOG_INFO("Processing frame #%d, expecting #%d", frame_num,
@@ -106,16 +104,14 @@
         if (!check_frame_hash(&frame)) {
           LOG_ERROR("Detected hash mismatch on frame #%d", frame_num);
           CHECK(dif_spi_device_send(spi, ack, sizeof(ack),
-                                    /*bytes_received=*/NULL) ==
-                    kDifSpiDeviceResultOk,
+                                    /*bytes_received=*/NULL) == kDifSpiDeviceOk,
                 "Failed to send bytes to SPI.");
           continue;
         }
 
         hw_SHA256_hash(&frame, sizeof(spiflash_frame_t), ack);
         CHECK(dif_spi_device_send(spi, ack, sizeof(ack),
-                                  /*bytes_received=*/NULL) ==
-                  kDifSpiDeviceResultOk,
+                                  /*bytes_received=*/NULL) == kDifSpiDeviceOk,
               "Failed to send bytes to SPI.");
 
         if (expected_frame_num == 0) {
@@ -141,8 +137,7 @@
       } else {
         // Send previous ack if unable to verify current frame.
         CHECK(dif_spi_device_send(spi, ack, sizeof(ack),
-                                  /*bytes_received=*/NULL) ==
-                  kDifSpiDeviceResultOk,
+                                  /*bytes_received=*/NULL) == kDifSpiDeviceOk,
               "Failed to send bytes to SPI.");
       }
     }
@@ -158,19 +153,25 @@
   LOG_INFO("Bootstrap requested, initialising HW...");
   flash_init_block();
 
-  mmio_region_t spi_reg = mmio_region_from_addr(0x40020000);
-  dif_spi_device_config_t config = {
-      .clock_polarity = kDifSpiDeviceEdgePositive,
-      .data_phase = kDifSpiDeviceEdgeNegative,
-      .tx_order = kDifSpiDeviceBitOrderMsbToLsb,
-      .rx_order = kDifSpiDeviceBitOrderMsbToLsb,
-      .rx_fifo_timeout = 63,
-      .rx_fifo_len = kDifSpiDeviceBufferLen / 2,
-      .tx_fifo_len = kDifSpiDeviceBufferLen / 2,
-  };
   dif_spi_device_t spi;
-  CHECK(dif_spi_device_init(spi_reg, &config, &spi) == kDifSpiDeviceResultOk,
+  CHECK(dif_spi_device_init(
+            (dif_spi_device_params_t){
+                .base_addr = mmio_region_from_addr(0x40020000),
+            },
+            &spi),
         "Failed to initialize SPI.");
+  CHECK(
+      dif_spi_device_configure(&spi,
+                               (dif_spi_device_config_t){
+                                   .clock_polarity = kDifSpiDeviceEdgePositive,
+                                   .data_phase = kDifSpiDeviceEdgeNegative,
+                                   .tx_order = kDifSpiDeviceBitOrderMsbToLsb,
+                                   .rx_order = kDifSpiDeviceBitOrderMsbToLsb,
+                                   .rx_fifo_timeout = 63,
+                                   .rx_fifo_len = kDifSpiDeviceBufferLen / 2,
+                                   .tx_fifo_len = kDifSpiDeviceBufferLen / 2,
+                               }) == kDifSpiDeviceOk,
+      "Failed to configure SPI.");
 
   LOG_INFO("HW initialisation completed, waiting for SPI input...");
   int error = bootstrap_flash(&spi);
diff --git a/sw/device/examples/demos.c b/sw/device/examples/demos.c
index 61679dc..1506bfe 100644
--- a/sw/device/examples/demos.c
+++ b/sw/device/examples/demos.c
@@ -66,11 +66,11 @@
   uint32_t spi_buf[8];
   size_t spi_len;
   CHECK(dif_spi_device_recv(spi, spi_buf, sizeof(spi_buf), &spi_len) ==
-        kDifSpiDeviceResultOk);
+        kDifSpiDeviceOk);
   if (spi_len > 0) {
     uint32_t echo_word = spi_buf[0] ^ 0x01010101;
     CHECK(dif_spi_device_send(spi, &echo_word, sizeof(uint32_t),
-                              /*bytes_sent=*/NULL) == kDifSpiDeviceResultOk);
+                              /*bytes_sent=*/NULL) == kDifSpiDeviceOk);
     LOG_INFO("SPI: %z", spi_len, spi_buf);
   }
 }
diff --git a/sw/device/examples/hello_usbdev/hello_usbdev.c b/sw/device/examples/hello_usbdev/hello_usbdev.c
index 49c8e7a..37b3580 100644
--- a/sw/device/examples/hello_usbdev/hello_usbdev.c
+++ b/sw/device/examples/hello_usbdev/hello_usbdev.c
@@ -104,18 +104,21 @@
 
   pinmux_init();
 
-  mmio_region_t spi_reg = mmio_region_from_addr(0x40020000);
-  dif_spi_device_config_t spi_config = {
-      .clock_polarity = kDifSpiDeviceEdgePositive,
-      .data_phase = kDifSpiDeviceEdgeNegative,
-      .tx_order = kDifSpiDeviceBitOrderMsbToLsb,
-      .rx_order = kDifSpiDeviceBitOrderMsbToLsb,
-      .rx_fifo_timeout = 63,
-      .rx_fifo_len = kDifSpiDeviceBufferLen / 2,
-      .tx_fifo_len = kDifSpiDeviceBufferLen / 2,
-  };
-  CHECK(dif_spi_device_init(spi_reg, &spi_config, &spi) ==
-        kDifSpiDeviceResultOk);
+  CHECK(dif_spi_device_init(
+      (dif_spi_device_params_t){
+          .base_addr = mmio_region_from_addr(0x40020000),
+      },
+      &spi));
+  CHECK(dif_spi_device_configure(
+            &spi, (dif_spi_device_config_t){
+                      .clock_polarity = kDifSpiDeviceEdgePositive,
+                      .data_phase = kDifSpiDeviceEdgeNegative,
+                      .tx_order = kDifSpiDeviceBitOrderMsbToLsb,
+                      .rx_order = kDifSpiDeviceBitOrderMsbToLsb,
+                      .rx_fifo_timeout = 63,
+                      .rx_fifo_len = kDifSpiDeviceBufferLen / 2,
+                      .tx_fifo_len = kDifSpiDeviceBufferLen / 2,
+                  }) == kDifSpiDeviceOk);
 
   dif_gpio_params_t gpio_params = {
       .base_addr = mmio_region_from_addr(0x40010000),
@@ -145,7 +148,7 @@
   usb_simpleserial_init(&simple_serial1, &usbdev, 2, usb_receipt_callback_1);
 
   CHECK(dif_spi_device_send(&spi, "SPI!", 4, /*bytes_sent=*/NULL) ==
-        kDifSpiDeviceResultOk);
+        kDifSpiDeviceOk);
 
   bool say_hello = true;
   bool pass_signaled = false;
diff --git a/sw/device/examples/hello_world/hello_world.c b/sw/device/examples/hello_world/hello_world.c
index 9a37ae0..903fbfb 100644
--- a/sw/device/examples/hello_world/hello_world.c
+++ b/sw/device/examples/hello_world/hello_world.c
@@ -22,18 +22,21 @@
 
   pinmux_init();
 
-  mmio_region_t spi_reg = mmio_region_from_addr(0x40020000);
-  dif_spi_device_config_t spi_config = {
-      .clock_polarity = kDifSpiDeviceEdgePositive,
-      .data_phase = kDifSpiDeviceEdgeNegative,
-      .tx_order = kDifSpiDeviceBitOrderMsbToLsb,
-      .rx_order = kDifSpiDeviceBitOrderMsbToLsb,
-      .rx_fifo_timeout = 63,
-      .rx_fifo_len = kDifSpiDeviceBufferLen / 2,
-      .tx_fifo_len = kDifSpiDeviceBufferLen / 2,
-  };
-  CHECK(dif_spi_device_init(spi_reg, &spi_config, &spi) ==
-        kDifSpiDeviceResultOk);
+  CHECK(dif_spi_device_init(
+      (dif_spi_device_params_t){
+          .base_addr = mmio_region_from_addr(0x40020000),
+      },
+      &spi));
+  CHECK(dif_spi_device_configure(
+            &spi, (dif_spi_device_config_t){
+                      .clock_polarity = kDifSpiDeviceEdgePositive,
+                      .data_phase = kDifSpiDeviceEdgeNegative,
+                      .tx_order = kDifSpiDeviceBitOrderMsbToLsb,
+                      .rx_order = kDifSpiDeviceBitOrderMsbToLsb,
+                      .rx_fifo_timeout = 63,
+                      .rx_fifo_len = kDifSpiDeviceBufferLen / 2,
+                      .tx_fifo_len = kDifSpiDeviceBufferLen / 2,
+                  }) == kDifSpiDeviceOk);
 
   dif_gpio_params_t gpio_params = {
       .base_addr = mmio_region_from_addr(0x40010000),
@@ -56,7 +59,7 @@
   LOG_INFO("The LEDs show the ASCII code of the last character.");
 
   CHECK(dif_spi_device_send(&spi, "SPI!", 4, /*bytes_sent=*/NULL) ==
-        kDifSpiDeviceResultOk);
+        kDifSpiDeviceOk);
 
   uint32_t gpio_state = 0;
   while (true) {
diff --git a/sw/device/lib/dif/dif_spi_device.c b/sw/device/lib/dif/dif_spi_device.c
index c97ba8a..c29e412 100644
--- a/sw/device/lib/dif/dif_spi_device.c
+++ b/sw/device/lib/dif/dif_spi_device.c
@@ -10,32 +10,44 @@
 
 const uint16_t kDifSpiDeviceBufferLen = SPI_DEVICE_BUFFER_SIZE_BYTES;
 
+dif_spi_device_result_t dif_spi_device_init(dif_spi_device_params_t params,
+                                            dif_spi_device_t *spi) {
+  if (spi == NULL) {
+    return kDifSpiDeviceBadArg;
+  }
+
+  // This ensures all other fields are zeroed.
+  *spi = (dif_spi_device_t){.params = params};
+
+  return kDifSpiDeviceOk;
+}
+
 /**
  * Computes the required value of the control register from a given
  * configuration.
  */
 DIF_WARN_UNUSED_RESULT
 static dif_spi_device_result_t build_control_word(
-    const dif_spi_device_config_t *config, uint32_t *control_word) {
+    dif_spi_device_config_t config, uint32_t *control_word) {
   *control_word = 0;
 
   // Default polarity is positive.
-  if (config->clock_polarity == kDifSpiDeviceEdgeNegative) {
+  if (config.clock_polarity == kDifSpiDeviceEdgeNegative) {
     *control_word |= 0x1 << SPI_DEVICE_CFG_CPOL;
   }
 
   // Default phase is negative.
-  if (config->data_phase == kDifSpiDeviceEdgePositive) {
+  if (config.data_phase == kDifSpiDeviceEdgePositive) {
     *control_word |= 0x1 << SPI_DEVICE_CFG_CPHA;
   }
 
   // Default order is msb to lsb.
-  if (config->tx_order == kDifSpiDeviceBitOrderLsbToMsb) {
+  if (config.tx_order == kDifSpiDeviceBitOrderLsbToMsb) {
     *control_word |= 0x1 << SPI_DEVICE_CFG_TX_ORDER;
   }
 
   // Default order is msb to lsb.
-  if (config->rx_order == kDifSpiDeviceBitOrderLsbToMsb) {
+  if (config.rx_order == kDifSpiDeviceBitOrderLsbToMsb) {
     *control_word |= 0x1 << SPI_DEVICE_CFG_RX_ORDER;
   }
 
@@ -45,18 +57,16 @@
                                  .mask = SPI_DEVICE_CFG_TIMER_V_MASK,
                                  .index = SPI_DEVICE_CFG_TIMER_V_OFFSET,
                              },
-                             config->rx_fifo_timeout);
+                             config.rx_fifo_timeout);
 
-  return kDifSpiDeviceResultOk;
+  return kDifSpiDeviceOk;
 }
 
-dif_spi_device_result_t dif_spi_device_init(
-    mmio_region_t base_addr, const dif_spi_device_config_t *config,
-    dif_spi_device_t *spi) {
-  if (config == NULL || spi == NULL) {
-    return kDifSpiDeviceResultBadArg;
+dif_spi_device_result_t dif_spi_device_configure(
+    dif_spi_device_t *spi, dif_spi_device_config_t config) {
+  if (spi == NULL) {
+    return kDifSpiDeviceBadArg;
   }
-  spi->base_addr = base_addr;
 
   // NOTE: we do not write to any registers until performing all
   // function argument checks, to avoid a halfway-configured SPI.
@@ -64,17 +74,17 @@
   uint32_t device_config;
   dif_spi_device_result_t control_error =
       build_control_word(config, &device_config);
-  if (control_error != kDifSpiDeviceResultOk) {
+  if (control_error != kDifSpiDeviceOk) {
     return control_error;
   }
 
   uint16_t rx_fifo_start = 0x0;
-  uint16_t rx_fifo_end = config->rx_fifo_len - 1;
+  uint16_t rx_fifo_end = config.rx_fifo_len - 1;
   uint16_t tx_fifo_start = rx_fifo_end + 1;
-  uint16_t tx_fifo_end = tx_fifo_start + config->tx_fifo_len - 1;
+  uint16_t tx_fifo_end = tx_fifo_start + config.tx_fifo_len - 1;
   if (tx_fifo_end >= kDifSpiDeviceBufferLen) {
     // We've overflown the SRAM region...
-    return kDifSpiDeviceResultBadArg;
+    return kDifSpiDeviceBadArg;
   }
 
   uint32_t rx_fifo_bounds = 0;
@@ -109,198 +119,251 @@
                              },
                              tx_fifo_end);
 
-  spi->rx_fifo_base = rx_fifo_start;
-  spi->rx_fifo_len = config->rx_fifo_len;
-  spi->tx_fifo_base = tx_fifo_start;
-  spi->tx_fifo_len = config->tx_fifo_len;
+  spi->rx_fifo_len = config.rx_fifo_len;
+  spi->tx_fifo_len = config.tx_fifo_len;
 
-  // Now that we know that all function arguments are valid, we can abort
-  // all current transactions and begin reconfiguring the device.
-  dif_spi_device_result_t err;
-  err = dif_spi_device_abort(spi);
-  if (err != kDifSpiDeviceResultOk) {
-    return err;
-  }
-  err = dif_spi_device_irq_reset(spi);
-  if (err != kDifSpiDeviceResultOk) {
-    return err;
-  }
-
-  mmio_region_write32(spi->base_addr, SPI_DEVICE_CFG_REG_OFFSET, device_config);
-  mmio_region_write32(spi->base_addr, SPI_DEVICE_RXF_ADDR_REG_OFFSET,
+  mmio_region_write32(spi->params.base_addr, SPI_DEVICE_CFG_REG_OFFSET,
+                      device_config);
+  mmio_region_write32(spi->params.base_addr, SPI_DEVICE_RXF_ADDR_REG_OFFSET,
                       rx_fifo_bounds);
-  mmio_region_write32(spi->base_addr, SPI_DEVICE_TXF_ADDR_REG_OFFSET,
+  mmio_region_write32(spi->params.base_addr, SPI_DEVICE_TXF_ADDR_REG_OFFSET,
                       tx_fifo_bounds);
 
-  return kDifSpiDeviceResultOk;
+  return kDifSpiDeviceOk;
 }
 
 dif_spi_device_result_t dif_spi_device_abort(const dif_spi_device_t *spi) {
   if (spi == NULL) {
-    return kDifSpiDeviceResultBadArg;
+    return kDifSpiDeviceBadArg;
   }
 
   // Set the `abort` bit, and then spin until `abort_done` is asserted.
-  mmio_region_nonatomic_set_bit32(spi->base_addr, SPI_DEVICE_CONTROL_REG_OFFSET,
+  mmio_region_nonatomic_set_bit32(spi->params.base_addr,
+                                  SPI_DEVICE_CONTROL_REG_OFFSET,
                                   SPI_DEVICE_CONTROL_ABORT);
-  while (!mmio_region_get_bit32(spi->base_addr, SPI_DEVICE_STATUS_REG_OFFSET,
+  while (!mmio_region_get_bit32(spi->params.base_addr,
+                                SPI_DEVICE_STATUS_REG_OFFSET,
                                 SPI_DEVICE_STATUS_ABORT_DONE)) {
   }
 
-  return kDifSpiDeviceResultOk;
+  return kDifSpiDeviceOk;
 }
 
-dif_spi_device_result_t dif_spi_device_irq_reset(const dif_spi_device_t *spi) {
-  if (spi == NULL) {
-    return kDifSpiDeviceResultBadArg;
-  }
-
-  dif_spi_device_result_t err;
-
-  err = dif_spi_device_irq_clear_all(spi);
-  if (err != kDifSpiDeviceResultOk) {
-    return err;
-  }
-  err = dif_spi_device_set_irq_levels(spi, 0x80, 0x00);
-  if (err != kDifSpiDeviceResultOk) {
-    return err;
-  }
-
-  // Disable interrupts manually, since the relevant DIF only allows for single
-  // bit flips.
-  mmio_region_write32(spi->base_addr, SPI_DEVICE_INTR_ENABLE_REG_OFFSET, 0);
-
-  return kDifSpiDeviceResultOk;
-}
-
-dif_spi_device_result_t dif_spi_device_irq_get(const dif_spi_device_t *spi,
-                                               dif_spi_device_irq_type_t type,
-                                               bool *flag_out) {
-  if (spi == NULL || flag_out == NULL) {
-    return kDifSpiDeviceResultBadArg;
+dif_spi_device_result_t dif_spi_device_irq_is_pending(
+    const dif_spi_device_t *spi, dif_spi_device_irq_t irq, bool *is_pending) {
+  if (spi == NULL || is_pending == NULL) {
+    return kDifSpiDeviceBadArg;
   }
 
   uint32_t bit_index = 0;
-  switch (type) {
-    case kDifSpiDeviceIrqTypeRxFull:
+  switch (irq) {
+    case kDifSpiDeviceIrqRxFull:
       bit_index = SPI_DEVICE_INTR_STATE_RXF;
       break;
-    case kDifSpiDeviceIrqTypeRxAboveLevel:
+    case kDifSpiDeviceIrqRxAboveLevel:
       bit_index = SPI_DEVICE_INTR_STATE_RXLVL;
       break;
-    case kDifSpiDeviceIrqTypeTxBelowLevel:
+    case kDifSpiDeviceIrqTxBelowLevel:
       bit_index = SPI_DEVICE_INTR_STATE_TXLVL;
       break;
-    case kDifSpiDeviceIrqTypeRxError:
+    case kDifSpiDeviceIrqRxError:
       bit_index = SPI_DEVICE_INTR_STATE_RXERR;
       break;
-    case kDifSpiDeviceIrqTypeRxOverflow:
+    case kDifSpiDeviceIrqRxOverflow:
       bit_index = SPI_DEVICE_INTR_STATE_RXOVERFLOW;
       break;
-    case kDifSpiDeviceIrqTypeTxUnderflow:
+    case kDifSpiDeviceIrqTxUnderflow:
       bit_index = SPI_DEVICE_INTR_STATE_TXUNDERFLOW;
       break;
   }
 
-  *flag_out = mmio_region_get_bit32(
-      spi->base_addr, SPI_DEVICE_INTR_STATE_REG_OFFSET, bit_index);
-  return kDifSpiDeviceResultOk;
+  *is_pending = mmio_region_get_bit32(
+      spi->params.base_addr, SPI_DEVICE_INTR_STATE_REG_OFFSET, bit_index);
+  return kDifSpiDeviceOk;
 }
 
-dif_spi_device_result_t dif_spi_device_irq_clear_all(
-    const dif_spi_device_t *spi) {
+dif_spi_device_result_t dif_spi_device_irq_acknowledge(
+    const dif_spi_device_t *spi, dif_spi_device_irq_t irq) {
   if (spi == NULL) {
-    return kDifSpiDeviceResultBadArg;
-  }
-
-  // The state register is a write-one-clear register.
-  mmio_region_write32(spi->base_addr, SPI_DEVICE_INTR_STATE_REG_OFFSET,
-                      UINT32_MAX);
-
-  return kDifSpiDeviceResultOk;
-}
-
-dif_spi_device_result_t dif_spi_device_irq_enable(
-    const dif_spi_device_t *spi, dif_spi_device_irq_type_t type,
-    dif_spi_device_irq_state_t state) {
-  if (spi == NULL) {
-    return kDifSpiDeviceResultBadArg;
+    return kDifSpiDeviceBadArg;
   }
 
   uint32_t bit_index = 0;
-  switch (type) {
-    case kDifSpiDeviceIrqTypeRxFull:
+  switch (irq) {
+    case kDifSpiDeviceIrqRxFull:
+      bit_index = SPI_DEVICE_INTR_STATE_RXF;
+      break;
+    case kDifSpiDeviceIrqRxAboveLevel:
+      bit_index = SPI_DEVICE_INTR_STATE_RXLVL;
+      break;
+    case kDifSpiDeviceIrqTxBelowLevel:
+      bit_index = SPI_DEVICE_INTR_STATE_TXLVL;
+      break;
+    case kDifSpiDeviceIrqRxError:
+      bit_index = SPI_DEVICE_INTR_STATE_RXERR;
+      break;
+    case kDifSpiDeviceIrqRxOverflow:
+      bit_index = SPI_DEVICE_INTR_STATE_RXOVERFLOW;
+      break;
+    case kDifSpiDeviceIrqTxUnderflow:
+      bit_index = SPI_DEVICE_INTR_STATE_TXUNDERFLOW;
+      break;
+  }
+
+  mmio_region_write32(spi->params.base_addr, SPI_DEVICE_INTR_STATE_REG_OFFSET,
+                      1 << bit_index);
+  return kDifSpiDeviceOk;
+}
+
+dif_spi_device_result_t dif_spi_device_irq_get_enabled(
+    const dif_spi_device_t *spi, dif_spi_device_irq_t irq,
+    dif_spi_device_toggle_t *state) {
+  if (spi == NULL || state == NULL) {
+    return kDifSpiDeviceBadArg;
+  }
+
+  uint32_t bit_index = 0;
+  switch (irq) {
+    case kDifSpiDeviceIrqRxFull:
       bit_index = SPI_DEVICE_INTR_ENABLE_RXF;
       break;
-    case kDifSpiDeviceIrqTypeRxAboveLevel:
+    case kDifSpiDeviceIrqRxAboveLevel:
       bit_index = SPI_DEVICE_INTR_ENABLE_RXLVL;
       break;
-    case kDifSpiDeviceIrqTypeTxBelowLevel:
+    case kDifSpiDeviceIrqTxBelowLevel:
       bit_index = SPI_DEVICE_INTR_ENABLE_TXLVL;
       break;
-    case kDifSpiDeviceIrqTypeRxError:
+    case kDifSpiDeviceIrqRxError:
       bit_index = SPI_DEVICE_INTR_ENABLE_RXERR;
       break;
-    case kDifSpiDeviceIrqTypeRxOverflow:
+    case kDifSpiDeviceIrqRxOverflow:
       bit_index = SPI_DEVICE_INTR_ENABLE_RXOVERFLOW;
       break;
-    case kDifSpiDeviceIrqTypeTxUnderflow:
+    case kDifSpiDeviceIrqTxUnderflow:
+      bit_index = SPI_DEVICE_INTR_ENABLE_TXUNDERFLOW;
+      break;
+  }
+
+  bool is_enabled = mmio_region_get_bit32(
+      spi->params.base_addr, SPI_DEVICE_INTR_ENABLE_REG_OFFSET, bit_index);
+  *state =
+      is_enabled ? kDifSpiDeviceToggleEnabled : kDifSpiDeviceToggleDisabled;
+
+  return kDifSpiDeviceOk;
+}
+
+dif_spi_device_result_t dif_spi_device_irq_set_enabled(
+    const dif_spi_device_t *spi, dif_spi_device_irq_t irq,
+    dif_spi_device_toggle_t state) {
+  if (spi == NULL) {
+    return kDifSpiDeviceBadArg;
+  }
+
+  uint32_t bit_index = 0;
+  switch (irq) {
+    case kDifSpiDeviceIrqRxFull:
+      bit_index = SPI_DEVICE_INTR_ENABLE_RXF;
+      break;
+    case kDifSpiDeviceIrqRxAboveLevel:
+      bit_index = SPI_DEVICE_INTR_ENABLE_RXLVL;
+      break;
+    case kDifSpiDeviceIrqTxBelowLevel:
+      bit_index = SPI_DEVICE_INTR_ENABLE_TXLVL;
+      break;
+    case kDifSpiDeviceIrqRxError:
+      bit_index = SPI_DEVICE_INTR_ENABLE_RXERR;
+      break;
+    case kDifSpiDeviceIrqRxOverflow:
+      bit_index = SPI_DEVICE_INTR_ENABLE_RXOVERFLOW;
+      break;
+    case kDifSpiDeviceIrqTxUnderflow:
       bit_index = SPI_DEVICE_INTR_ENABLE_TXUNDERFLOW;
       break;
   }
 
   switch (state) {
-    case kDifSpiDeviceIrqStateEnabled:
+    case kDifSpiDeviceToggleEnabled:
       mmio_region_nonatomic_set_bit32(
-          spi->base_addr, SPI_DEVICE_INTR_ENABLE_REG_OFFSET, bit_index);
+          spi->params.base_addr, SPI_DEVICE_INTR_ENABLE_REG_OFFSET, bit_index);
       break;
-    case kDifSpiDeviceIrqStateDisabled:
+    case kDifSpiDeviceToggleDisabled:
       mmio_region_nonatomic_clear_bit32(
-          spi->base_addr, SPI_DEVICE_INTR_ENABLE_REG_OFFSET, bit_index);
+          spi->params.base_addr, SPI_DEVICE_INTR_ENABLE_REG_OFFSET, bit_index);
       break;
   }
 
-  return kDifSpiDeviceResultOk;
+  return kDifSpiDeviceOk;
 }
 
-dif_spi_device_result_t dif_spi_device_irq_force(
-    const dif_spi_device_t *spi, dif_spi_device_irq_type_t type) {
+dif_spi_device_result_t dif_spi_device_irq_force(const dif_spi_device_t *spi,
+                                                 dif_spi_device_irq_t irq) {
   if (spi == NULL) {
-    return kDifSpiDeviceResultBadArg;
+    return kDifSpiDeviceBadArg;
   }
 
   uint32_t bit_index = 0;
-  switch (type) {
-    case kDifSpiDeviceIrqTypeRxFull:
+  switch (irq) {
+    case kDifSpiDeviceIrqRxFull:
       bit_index = SPI_DEVICE_INTR_TEST_RXF;
       break;
-    case kDifSpiDeviceIrqTypeRxAboveLevel:
+    case kDifSpiDeviceIrqRxAboveLevel:
       bit_index = SPI_DEVICE_INTR_TEST_RXLVL;
       break;
-    case kDifSpiDeviceIrqTypeTxBelowLevel:
+    case kDifSpiDeviceIrqTxBelowLevel:
       bit_index = SPI_DEVICE_INTR_TEST_TXLVL;
       break;
-    case kDifSpiDeviceIrqTypeRxError:
+    case kDifSpiDeviceIrqRxError:
       bit_index = SPI_DEVICE_INTR_TEST_RXERR;
       break;
-    case kDifSpiDeviceIrqTypeRxOverflow:
+    case kDifSpiDeviceIrqRxOverflow:
       bit_index = SPI_DEVICE_INTR_TEST_RXOVERFLOW;
       break;
-    case kDifSpiDeviceIrqTypeTxUnderflow:
+    case kDifSpiDeviceIrqTxUnderflow:
       bit_index = SPI_DEVICE_INTR_TEST_TXUNDERFLOW;
       break;
   }
 
   uint32_t mask = 1 << bit_index;
-  mmio_region_write32(spi->base_addr, SPI_DEVICE_INTR_TEST_REG_OFFSET, mask);
+  mmio_region_write32(spi->params.base_addr, SPI_DEVICE_INTR_TEST_REG_OFFSET,
+                      mask);
 
-  return kDifSpiDeviceResultOk;
+  return kDifSpiDeviceOk;
+}
+
+dif_spi_device_result_t dif_spi_device_irq_disable_all(
+    const dif_spi_device_t *spi, dif_spi_device_irq_snapshot_t *snapshot) {
+  if (spi == NULL) {
+    return kDifSpiDeviceBadArg;
+  }
+
+  if (snapshot != NULL) {
+    *snapshot = mmio_region_read32(spi->params.base_addr,
+                                   SPI_DEVICE_INTR_ENABLE_REG_OFFSET);
+  }
+
+  mmio_region_write32(spi->params.base_addr, SPI_DEVICE_INTR_ENABLE_REG_OFFSET,
+                      0);
+
+  return kDifSpiDeviceOk;
+}
+
+dif_spi_device_result_t dif_spi_device_irq_restore_all(
+    const dif_spi_device_t *spi,
+    const dif_spi_device_irq_snapshot_t *snapshot) {
+  if (spi == NULL || snapshot == NULL) {
+    return kDifSpiDeviceBadArg;
+  }
+
+  mmio_region_write32(spi->params.base_addr, SPI_DEVICE_INTR_ENABLE_REG_OFFSET,
+                      *snapshot);
+
+  return kDifSpiDeviceOk;
 }
 
 dif_spi_device_result_t dif_spi_device_set_irq_levels(
     const dif_spi_device_t *spi, uint16_t rx_level, uint16_t tx_level) {
   if (spi == NULL) {
-    return kDifSpiDeviceResultBadArg;
+    return kDifSpiDeviceBadArg;
   }
 
   uint32_t compressed_limit = 0;
@@ -318,10 +381,10 @@
                                  .index = SPI_DEVICE_FIFO_LEVEL_TXLVL_OFFSET,
                              },
                              tx_level);
-  mmio_region_write32(spi->base_addr, SPI_DEVICE_FIFO_LEVEL_REG_OFFSET,
+  mmio_region_write32(spi->params.base_addr, SPI_DEVICE_FIFO_LEVEL_REG_OFFSET,
                       compressed_limit);
 
-  return kDifSpiDeviceResultOk;
+  return kDifSpiDeviceOk;
 }
 
 /**
@@ -418,7 +481,7 @@
  */
 static fifo_ptrs_t decompress_ptrs(const dif_spi_device_t *spi,
                                    fifo_ptr_params_t params) {
-  uint32_t ptr = mmio_region_read32(spi->base_addr, params.reg_offset);
+  uint32_t ptr = mmio_region_read32(spi->params.base_addr, params.reg_offset);
   uint16_t write_val =
       (uint16_t)((ptr >> params.write_offset) & params.write_mask);
   uint16_t read_val =
@@ -469,7 +532,7 @@
           .mask = params.read_mask, .index = params.read_offset,
       },
       read_val);
-  mmio_region_write32(spi->base_addr, params.reg_offset, ptr);
+  mmio_region_write32(spi->params.base_addr, params.reg_offset, ptr);
 }
 
 /**
@@ -505,25 +568,25 @@
 dif_spi_device_result_t dif_spi_device_rx_pending(const dif_spi_device_t *spi,
                                                   size_t *bytes_pending) {
   if (spi == NULL || bytes_pending == NULL) {
-    return kDifSpiDeviceResultBadArg;
+    return kDifSpiDeviceBadArg;
   }
 
   fifo_ptrs_t ptrs = decompress_ptrs(spi, kRxFifoParams);
   *bytes_pending = fifo_bytes_in_use(ptrs, spi->rx_fifo_len);
 
-  return kDifSpiDeviceResultOk;
+  return kDifSpiDeviceOk;
 }
 
 dif_spi_device_result_t dif_spi_device_tx_pending(const dif_spi_device_t *spi,
                                                   size_t *bytes_pending) {
   if (spi == NULL || bytes_pending == NULL) {
-    return kDifSpiDeviceResultBadArg;
+    return kDifSpiDeviceBadArg;
   }
 
   fifo_ptrs_t ptrs = decompress_ptrs(spi, kTxFifoParams);
   *bytes_pending = fifo_bytes_in_use(ptrs, spi->tx_fifo_len);
 
-  return kDifSpiDeviceResultOk;
+  return kDifSpiDeviceOk;
 }
 
 /**
@@ -582,11 +645,11 @@
     }
     if (is_recv) {
       // SPI device buffer -> `byte_buf`
-      mmio_region_memcpy_from_mmio32(spi->base_addr, mmio_offset, byte_buf,
-                                     bytes_to_copy);
+      mmio_region_memcpy_from_mmio32(spi->params.base_addr, mmio_offset,
+                                     byte_buf, bytes_to_copy);
     } else {
       // `byte_buf` -> SPI device buffer
-      mmio_region_memcpy_to_mmio32(spi->base_addr, mmio_offset, byte_buf,
+      mmio_region_memcpy_to_mmio32(spi->params.base_addr, mmio_offset, byte_buf,
                                    bytes_to_copy);
     }
     fifo_ptr_increment(ptr, bytes_to_copy, fifo_len);
@@ -601,10 +664,10 @@
                                             void *buf, size_t buf_len,
                                             size_t *bytes_received) {
   if (spi == NULL || buf == NULL) {
-    return kDifSpiDeviceResultBadArg;
+    return kDifSpiDeviceBadArg;
   }
 
-  uint16_t fifo_base = spi->rx_fifo_base;
+  uint16_t fifo_base = 0;
   uint16_t fifo_len = spi->rx_fifo_len;
   fifo_ptrs_t fifo = decompress_ptrs(spi, kRxFifoParams);
 
@@ -617,17 +680,18 @@
     // Commit the new RX FIFO pointers.
     compress_ptrs(spi, kRxFifoParams, fifo);
   }
-  return kDifSpiDeviceResultOk;
+  return kDifSpiDeviceOk;
 }
 
 dif_spi_device_result_t dif_spi_device_send(const dif_spi_device_t *spi,
                                             const void *buf, size_t buf_len,
                                             size_t *bytes_sent) {
   if (spi == NULL || buf == NULL) {
-    return kDifSpiDeviceResultBadArg;
+    return kDifSpiDeviceBadArg;
   }
 
-  uint16_t fifo_base = spi->tx_fifo_base;
+  // Start of the TX FIFO is the end of the RX FIFO.
+  uint16_t fifo_base = spi->rx_fifo_len;
   uint16_t fifo_len = spi->tx_fifo_len;
   fifo_ptrs_t fifo = decompress_ptrs(spi, kTxFifoParams);
 
@@ -640,5 +704,5 @@
     // Commit the new TX FIFO pointers.
     compress_ptrs(spi, kTxFifoParams, fifo);
   }
-  return kDifSpiDeviceResultOk;
+  return kDifSpiDeviceOk;
 }
diff --git a/sw/device/lib/dif/dif_spi_device.h b/sw/device/lib/dif/dif_spi_device.h
index 8c7b176..d2e7490 100644
--- a/sw/device/lib/dif/dif_spi_device.h
+++ b/sw/device/lib/dif/dif_spi_device.h
@@ -23,54 +23,108 @@
 #endif  // __cplusplus
 
 /**
- * Represents a signal edge type.
+ * A signal edge type: positive or negative.
  */
 typedef enum dif_spi_device_edge {
+  /**
+   * Represents a positive edge (i.e., from low to high).
+   */
   kDifSpiDeviceEdgePositive,
+  /**
+   * Represents a negative edge (i.e., from high to low).
+   */
   kDifSpiDeviceEdgeNegative,
 } dif_spi_device_edge_t;
 
 /**
- * Represents a bit ordering.
+ * A bit ordering within a byte.
  */
 typedef enum dif_spi_device_bit_order {
+  /**
+   * Represents the most-significant-bit to least-significant-bit order.
+   */
   kDifSpiDeviceBitOrderMsbToLsb,
+  /**
+   * Represents the least-significant-bit to most-significant-bit order.
+   */
   kDifSpiDeviceBitOrderLsbToMsb,
 } dif_spi_device_bit_order_t;
 
 /**
- * Represents the enablement state of a particular SPI IRQ.
+ * A toggle state: enabled, or disabled.
+ *
+ * This enum may be used instead of a `bool` when describing an enabled/disabled
+ * state.
  */
-typedef enum dif_spi_device_irq_state {
-  kDifSpiDeviceIrqStateEnabled = true,
-  kDifSpiDeviceIrqStateDisabled = false,
-} dif_spi_device_irq_state_t;
+typedef enum dif_spi_device_toggle {
+  /*
+   * The "enabled" state.
+   */
+  kDifSpiDeviceToggleEnabled,
+  /**
+   * The "disabled" state.
+   */
+  kDifSpiDeviceToggleDisabled,
+} dif_spi_device_toggle_t;
 
 /**
- * Represents the types of interrupts that the SPI device will
- * fire to signal state.
+ * A SPI interrupt request type.
  */
-typedef enum dif_spi_device_irq_type {
-  kDifSpiDeviceIrqTypeRxFull,
-  kDifSpiDeviceIrqTypeRxAboveLevel,
-  kDifSpiDeviceIrqTypeTxBelowLevel,
-  kDifSpiDeviceIrqTypeRxError,
-  kDifSpiDeviceIrqTypeRxOverflow,
-  kDifSpiDeviceIrqTypeTxUnderflow,
-} dif_spi_device_irq_type_t;
+typedef enum dif_spi_device_irq {
+  /**
+   * Indicates that the RX FIFO is full.
+   */
+  kDifSpiDeviceIrqRxFull,
+  /**
+   * Indicates that the RX FIFO is above the configured level.
+   */
+  kDifSpiDeviceIrqRxAboveLevel,
+  /**
+   * Indicates that the TX FIFO is below the configured level.
+   */
+  kDifSpiDeviceIrqTxBelowLevel,
+  /**
+   * Indicates an error in the RX FIFO.
+   */
+  kDifSpiDeviceIrqRxError,
+  /**
+   * Indicates that overflow has occured in the RX FIFO.
+   */
+  kDifSpiDeviceIrqRxOverflow,
+  /**
+   * Indicates that underflow has occured in the RX FIFO.
+   */
+  kDifSpiDeviceIrqTxUnderflow,
+} dif_spi_device_irq_t;
 
 /**
- * Errors returned by SPI DIF functions.
+ * A snapshot of the enablement state of the interrupts for SPI.
+ *
+ * This is an opaque type, to be used with the
+ * `dif_spi_device_irq_disable_all()` and
+ * `dif_spi_device_irq_restore_all()` functions.
+ */
+typedef uint32_t dif_spi_device_irq_snapshot_t;
+
+/**
+ * The result of a SPI operation.
  */
 typedef enum dif_spi_device_result {
   /**
-   * Indicates a successful operation.
+   * Indicates that the operation succeeded.
    */
-  kDifSpiDeviceResultOk = 0,
+  kDifSpiDeviceOk = 0,
   /**
-   * Indicates a failed precondition on the function arguments.
+   * Indicates some unspecified failure.
    */
-  kDifSpiDeviceResultBadArg,
+  kDifSpiDeviceError = 1,
+  /**
+   * Indicates that some parameter passed into a function failed a
+   * precondition.
+   *
+   * When this value is returned, no hardware operations occured.
+   */
+  kDifSpiDeviceBadArg = 2,
 } dif_spi_device_result_t;
 
 /**
@@ -82,7 +136,24 @@
 extern const uint16_t kDifSpiDeviceBufferLen;
 
 /**
- * Configuration for initializing a SPI device.
+ * Hardware instantiation parameters for SPI.
+ *
+ * This struct describes information about the underlying hardware that is
+ * not determined until the hardware design is used as part of a top-level
+ * design.
+ */
+typedef struct dif_spi_device_params {
+  /**
+   * The base address for the SPI hardware registers.
+   */
+  mmio_region_t base_addr;
+} dif_spi_device_params_t;
+
+/**
+ * Runtime configuration for SPI.
+ *
+ * This struct describes runtime information for one-time configuration of the
+ * hardware.
  */
 typedef struct dif_spi_device_config {
   dif_spi_device_edge_t clock_polarity;
@@ -90,103 +161,155 @@
   dif_spi_device_bit_order_t tx_order;
   dif_spi_device_bit_order_t rx_order;
   uint8_t rx_fifo_timeout;
+  /**
+   * The length, in bytes, that should be reserved for the RX FIFO.
+   *
+   * `kDifSpiDeviceBufferLen / 2` is a good default for this value.
+   */
   uint16_t rx_fifo_len;
+  /**
+   * The length, in bytes, that should be reserved for the TX FIFO.
+   *
+   * `kDifSpiDeviceBufferLen / 2` is a good default for this value.
+   */
   uint16_t tx_fifo_len;
 } dif_spi_device_config_t;
 
 /**
- * State for a particular SPI device.
+ * A handle to a SPI device.
  *
- * Its member variables should be considered private, and are only provided so
- * that callers can allocate it.
+ * This type should be treated as opaque by users.
  */
 typedef struct dif_spi_device {
-  mmio_region_t base_addr;
-  uint16_t rx_fifo_base;
+  dif_spi_device_params_t params;
   uint16_t rx_fifo_len;
-  uint16_t tx_fifo_base;
   uint16_t tx_fifo_len;
 } dif_spi_device_t;
 
 /**
- * Initializes a SPI device with the given configuration.
+ * Creates a new handle for SPI.
  *
- * @param base_addr The start of the SPI device register.
- * @param config The configuration to initialize with.
- * @param[out] spi The initialized device.
+ * This function does not actuate the hardware.
+ *
+ * @param params Hardware instantiation parameters.
+ * @param[out] spi Out param for the initialized handle.
  * @return The result of the operation.
  */
 DIF_WARN_UNUSED_RESULT
-dif_spi_device_result_t dif_spi_device_init(
-    mmio_region_t base_addr, const dif_spi_device_config_t *config,
-    dif_spi_device_t *spi);
+dif_spi_device_result_t dif_spi_device_init(dif_spi_device_params_t params,
+                                            dif_spi_device_t *spi);
+
+/**
+ * Configures SPI with runtime information.
+ *
+ * This function should need to be called once for the lifetime of `handle`.
+ *
+ * @param spi A SPI handle.
+ * @param config Runtime configuration parameters.
+ * @return The result of the operation.
+ */
+DIF_WARN_UNUSED_RESULT
+dif_spi_device_result_t dif_spi_device_configure(
+    dif_spi_device_t *spi, dif_spi_device_config_t config);
 
 /**
  * Issues an "abort" to the given SPI device, causing all in-progress IO to
  * halt.
  *
- * @param spi An SPI device.
+ * @param spi A SPI handle.
  * @return The result of the operation.
  */
 DIF_WARN_UNUSED_RESULT
 dif_spi_device_result_t dif_spi_device_abort(const dif_spi_device_t *spi);
 
 /**
- * Resets all interrupt-related state on the given SPI device, such as enabled
- * interrupts and set RX/TX levels.
+ * Returns whether a particular interrupt is currently pending.
  *
- * @param spi An SPI device.
+ * @param spi A SPI handle.
+ * @param irq An interrupt type.
+ * @param[out] is_pending Out-param for whether the interrupt is pending.
  * @return The result of the operation.
  */
 DIF_WARN_UNUSED_RESULT
-dif_spi_device_result_t dif_spi_device_irq_reset(const dif_spi_device_t *spi);
+dif_spi_device_result_t dif_spi_device_irq_is_pending(
+    const dif_spi_device_t *spi, dif_spi_device_irq_t irq, bool *is_pending);
 
 /**
- * Returns whether the given IRQ is currently being serviced.
+ * Acknowledges a particular interrupt, indicating to the hardware that it has
+ * been successfully serviced.
  *
- * @param spi An SPI device.
- * @param type Which IRQ type to check.
- * @param[out] flag Whether the IRQ is active.
+ * @param spi A SPI handle.
+ * @param irq An interrupt type.
  * @return The result of the operation.
  */
 DIF_WARN_UNUSED_RESULT
-dif_spi_device_result_t dif_spi_device_irq_get(const dif_spi_device_t *spi,
-                                               dif_spi_device_irq_type_t type,
-                                               bool *flag_out);
+dif_spi_device_result_t dif_spi_device_irq_acknowledge(
+    const dif_spi_device_t *spi, dif_spi_device_irq_t irq);
 
 /**
- * Clears all active interrupt bits.
+ * Checks whether a particular interrupt is currently enabled or disabled.
  *
- * @param spi An SPI device.
+ * @param spi A SPI handle.
+ * @param irq An interrupt type.
+ * @param[out] state Out-param toggle state of the interrupt.
  * @return The result of the operation.
  */
 DIF_WARN_UNUSED_RESULT
-dif_spi_device_result_t dif_spi_device_irq_clear_all(
-    const dif_spi_device_t *spi);
+dif_spi_device_result_t dif_spi_device_irq_get_enabled(
+    const dif_spi_device_t *spi, dif_spi_device_irq_t irq,
+    dif_spi_device_toggle_t *state);
 
 /**
- * Enable or disable a particular interrupt.
+ * Sets whether a particular interrupt is currently enabled or disabled.
  *
- * @param spi An SPI device.
- * @param type Which IRQ type to toggle.
- * @param state The state to update the bit to.
+ * @param spi A SPI handle.
+ * @param irq An interrupt type.
+ * @param state The new toggle state for the interrupt.
  * @return The result of the operation.
  */
 DIF_WARN_UNUSED_RESULT
-dif_spi_device_result_t dif_spi_device_irq_enable(
-    const dif_spi_device_t *spi, dif_spi_device_irq_type_t type,
-    dif_spi_device_irq_state_t state);
+dif_spi_device_result_t dif_spi_device_irq_set_enabled(
+    const dif_spi_device_t *spi, dif_spi_device_irq_t irq,
+    dif_spi_device_toggle_t state);
 
 /**
- * Forces a particular IRQ type to fire.
+ * Forces a particular interrupt, causing it to be serviced as if hardware had
+ * asserted it.
  *
- * @param spi An SPI device.
- * @param type Which IRQ type to fire.
+ * @param spi A SPI handle.
+ * @param irq An interrupt type.
  * @return The result of the operation.
  */
 DIF_WARN_UNUSED_RESULT
-dif_spi_device_result_t dif_spi_device_irq_force(
-    const dif_spi_device_t *spi, dif_spi_device_irq_type_t type);
+dif_spi_device_result_t dif_spi_device_irq_force(const dif_spi_device_t *spi,
+                                                 dif_spi_device_irq_t irq);
+
+/**
+ * Disables all interrupts, optionally snapshotting all toggle state for later
+ * restoration.
+ *
+ * @param spi A SPI handle.
+ * @param[out] snapshot Out-param for the snapshot; may be `NULL`.
+ * @return The result of the operation.
+ */
+DIF_WARN_UNUSED_RESULT
+dif_spi_device_result_t dif_spi_device_irq_disable_all(
+    const dif_spi_device_t *spi, dif_spi_device_irq_snapshot_t *snapshot);
+
+/**
+ * Restores interrupts from the given snapshot.
+ *
+ * This function can be used with `dif_spi_device_irq_disable_all()` to
+ * temporary
+ * interrupt save-and-restore.
+ *
+ * @param spi A SPI handle.
+ * @param snapshot A snapshot to restore from.
+ * @return The result of the operation.
+ */
+DIF_WARN_UNUSED_RESULT
+dif_spi_device_result_t dif_spi_device_irq_restore_all(
+    const dif_spi_device_t *spi, const dif_spi_device_irq_snapshot_t *snapshot);
 
 /**
  * Sets up the "FIFO level" (that is, number of bytes present in a particular
@@ -202,7 +325,7 @@
  * to detect that there is free space to write more data to the TX FIFO.
  * This is the `Main Memory -> Spi Buffer` case.
  *
- * @param spi An SPI device.
+ * @param spi A SPI handle.
  * @param rx_level The new RX level, as described above.
  * @param tx_level The new TX level, as described above.
  * @return The result of the operation.
@@ -214,7 +337,7 @@
 /**
  * Returns the number of bytes still pending receipt by software in the RX FIFO.
  *
- * @param spi An SPI device.
+ * @param spi A SPI handle.
  * @param[out] bytes_pending The number of bytes pending
  * @return The result of the operation.
  */
@@ -226,7 +349,7 @@
  * Returns the number of bytes still pending transmission by hardware in the TX
  * FIFO.
  *
- * @param spi An SPI device.
+ * @param spi A SPI handle.
  * @param[out] bytes_pending The number of bytes pending
  * @return The result of the operation.
  */
diff --git a/sw/device/tests/dif/dif_spi_device_unittest.cc b/sw/device/tests/dif/dif_spi_device_unittest.cc
index f86207e..dea6ab2 100644
--- a/sw/device/tests/dif/dif_spi_device_unittest.cc
+++ b/sw/device/tests/dif/dif_spi_device_unittest.cc
@@ -40,11 +40,9 @@
   static const uint16_t kFifoLen = 0x400;
 
   dif_spi_device_t spi_ = {
-      /*base_addr=*/dev().region(),
-      /*rx_fifo_base=*/0x0000,
-      /*rx_fifo_len=*/kFifoLen,
-      /*tx_fifo_base=*/kFifoLen,
-      /*tx_fifo_len=*/kFifoLen,
+      .params = {.base_addr = dev().region()},
+      .rx_fifo_len = kFifoLen,
+      .tx_fifo_len = kFifoLen,
   };
 
   dif_spi_device_config_t config_ = {
@@ -66,7 +64,7 @@
   EXPECT_READ32(SPI_DEVICE_STATUS_REG_OFFSET,
                 {{SPI_DEVICE_STATUS_ABORT_DONE, 0x1}});
 
-  EXPECT_EQ(dif_spi_device_abort(&spi_), kDifSpiDeviceResultOk);
+  EXPECT_EQ(dif_spi_device_abort(&spi_), kDifSpiDeviceOk);
 }
 
 TEST_F(AbortTest, Delayed) {
@@ -81,30 +79,16 @@
   EXPECT_READ32(SPI_DEVICE_STATUS_REG_OFFSET,
                 {{SPI_DEVICE_STATUS_ABORT_DONE, 0x1}});
 
-  EXPECT_EQ(dif_spi_device_abort(&spi_), kDifSpiDeviceResultOk);
+  EXPECT_EQ(dif_spi_device_abort(&spi_), kDifSpiDeviceOk);
 }
 
 TEST_F(AbortTest, NullArgs) {
-  EXPECT_EQ(dif_spi_device_abort(nullptr), kDifSpiDeviceResultBadArg);
+  EXPECT_EQ(dif_spi_device_abort(nullptr), kDifSpiDeviceBadArg);
 }
 
-class InitTest : public SpiTest {};
+class ConfigTest : public SpiTest {};
 
-TEST_F(InitTest, BasicInit) {
-  EXPECT_MASK32(SPI_DEVICE_CONTROL_REG_OFFSET,
-                {{SPI_DEVICE_CONTROL_ABORT, 0x1, 0x1}});
-  EXPECT_READ32(SPI_DEVICE_STATUS_REG_OFFSET,
-                {{SPI_DEVICE_STATUS_ABORT_DONE, 0x1}});
-
-  EXPECT_WRITE32(SPI_DEVICE_INTR_STATE_REG_OFFSET,
-                 std::numeric_limits<uint32_t>::max());
-
-  EXPECT_WRITE32(SPI_DEVICE_FIFO_LEVEL_REG_OFFSET,
-                 {{SPI_DEVICE_FIFO_LEVEL_RXLVL_OFFSET, 0x80},
-                  {SPI_DEVICE_FIFO_LEVEL_TXLVL_OFFSET, 0x00}});
-
-  EXPECT_WRITE32(SPI_DEVICE_INTR_ENABLE_REG_OFFSET, 0x0);
-
+TEST_F(ConfigTest, BasicInit) {
   EXPECT_WRITE32(SPI_DEVICE_CFG_REG_OFFSET,
                  {
                      {SPI_DEVICE_CFG_CPOL, 0},
@@ -124,31 +108,16 @@
                      {SPI_DEVICE_TXF_ADDR_LIMIT_OFFSET, 0x800 - 1},
                  });
 
-  EXPECT_EQ(dif_spi_device_init(dev().region(), &config_, &spi_),
-            kDifSpiDeviceResultOk);
+  EXPECT_EQ(dif_spi_device_configure(&spi_, config_), kDifSpiDeviceOk);
 }
 
-TEST_F(InitTest, ComplexInit) {
+TEST_F(ConfigTest, ComplexInit) {
   config_.clock_polarity = kDifSpiDeviceEdgeNegative;
   config_.data_phase = kDifSpiDeviceEdgePositive;
   config_.tx_order = kDifSpiDeviceBitOrderLsbToMsb;
   config_.rx_fifo_timeout = 42;
   config_.rx_fifo_len = 0x24;
 
-  EXPECT_MASK32(SPI_DEVICE_CONTROL_REG_OFFSET,
-                {{SPI_DEVICE_CONTROL_ABORT, 0x1, 0x1}});
-  EXPECT_READ32(SPI_DEVICE_STATUS_REG_OFFSET,
-                {{SPI_DEVICE_STATUS_ABORT_DONE, 0x1}});
-
-  EXPECT_WRITE32(SPI_DEVICE_INTR_STATE_REG_OFFSET,
-                 std::numeric_limits<uint32_t>::max());
-
-  EXPECT_WRITE32(SPI_DEVICE_FIFO_LEVEL_REG_OFFSET,
-                 {{SPI_DEVICE_FIFO_LEVEL_RXLVL_OFFSET, 0x80},
-                  {SPI_DEVICE_FIFO_LEVEL_TXLVL_OFFSET, 0x00}});
-
-  EXPECT_WRITE32(SPI_DEVICE_INTR_ENABLE_REG_OFFSET, 0x0);
-
   EXPECT_WRITE32(SPI_DEVICE_CFG_REG_OFFSET,
                  {
                      {SPI_DEVICE_CFG_CPOL, 1},
@@ -168,21 +137,16 @@
                      {SPI_DEVICE_TXF_ADDR_LIMIT_OFFSET, 0x423},
                  });
 
-  EXPECT_EQ(dif_spi_device_init(dev().region(), &config_, &spi_),
-            kDifSpiDeviceResultOk);
+  EXPECT_EQ(dif_spi_device_configure(&spi_, config_), kDifSpiDeviceOk);
 }
 
-TEST_F(InitTest, NullArgs) {
-  EXPECT_EQ(dif_spi_device_init(dev().region(), &config_, nullptr),
-            kDifSpiDeviceResultBadArg);
-  EXPECT_EQ(dif_spi_device_init(dev().region(), nullptr, &spi_),
-            kDifSpiDeviceResultBadArg);
+TEST_F(ConfigTest, NullArgs) {
+  EXPECT_EQ(dif_spi_device_configure(nullptr, config_), kDifSpiDeviceBadArg);
 }
 
-TEST_F(InitTest, InitSramOverflow) {
+TEST_F(ConfigTest, InitSramOverflow) {
   config_.rx_fifo_len = 0x1000;
-  EXPECT_EQ(dif_spi_device_init(dev().region(), &config_, &spi_),
-            kDifSpiDeviceResultBadArg);
+  EXPECT_EQ(dif_spi_device_configure(&spi_, config_), kDifSpiDeviceBadArg);
 }
 
 class IrqTest : public SpiTest {};
@@ -192,110 +156,111 @@
 
   EXPECT_READ32(SPI_DEVICE_INTR_STATE_REG_OFFSET,
                 {{SPI_DEVICE_INTR_STATE_RXF, 1}});
-  EXPECT_EQ(dif_spi_device_irq_get(&spi_, kDifSpiDeviceIrqTypeRxFull, &out),
-            kDifSpiDeviceResultOk);
+  EXPECT_EQ(dif_spi_device_irq_is_pending(&spi_, kDifSpiDeviceIrqRxFull, &out),
+            kDifSpiDeviceOk);
   EXPECT_TRUE(out);
 
   EXPECT_READ32(
       SPI_DEVICE_INTR_STATE_REG_OFFSET,
       {{SPI_DEVICE_INTR_STATE_RXERR, 0}, {SPI_DEVICE_INTR_STATE_RXF, 1}});
-  EXPECT_EQ(dif_spi_device_irq_get(&spi_, kDifSpiDeviceIrqTypeRxError, &out),
-            kDifSpiDeviceResultOk);
+  EXPECT_EQ(dif_spi_device_irq_is_pending(&spi_, kDifSpiDeviceIrqRxError, &out),
+            kDifSpiDeviceOk);
   EXPECT_FALSE(out);
 
   EXPECT_READ32(SPI_DEVICE_INTR_STATE_REG_OFFSET,
                 {{SPI_DEVICE_INTR_STATE_TXUNDERFLOW, 1}});
   EXPECT_EQ(
-      dif_spi_device_irq_get(&spi_, kDifSpiDeviceIrqTypeTxUnderflow, &out),
-      kDifSpiDeviceResultOk);
+      dif_spi_device_irq_is_pending(&spi_, kDifSpiDeviceIrqTxUnderflow, &out),
+      kDifSpiDeviceOk);
   EXPECT_TRUE(out);
 
   EXPECT_READ32(SPI_DEVICE_INTR_STATE_REG_OFFSET,
                 {{SPI_DEVICE_INTR_STATE_TXLVL, 0}});
   EXPECT_EQ(
-      dif_spi_device_irq_get(&spi_, kDifSpiDeviceIrqTypeTxBelowLevel, &out),
-      kDifSpiDeviceResultOk);
+      dif_spi_device_irq_is_pending(&spi_, kDifSpiDeviceIrqTxBelowLevel, &out),
+      kDifSpiDeviceOk);
   EXPECT_FALSE(out);
 }
 
 TEST_F(IrqTest, GetNull) {
   bool out;
-  EXPECT_EQ(dif_spi_device_irq_get(nullptr, kDifSpiDeviceIrqTypeRxFull, &out),
-            kDifSpiDeviceResultBadArg);
-  EXPECT_EQ(dif_spi_device_irq_get(&spi_, kDifSpiDeviceIrqTypeRxFull, nullptr),
-            kDifSpiDeviceResultBadArg);
+  EXPECT_EQ(
+      dif_spi_device_irq_is_pending(nullptr, kDifSpiDeviceIrqRxFull, &out),
+      kDifSpiDeviceBadArg);
+  EXPECT_EQ(
+      dif_spi_device_irq_is_pending(&spi_, kDifSpiDeviceIrqRxFull, nullptr),
+      kDifSpiDeviceBadArg);
 }
 
 TEST_F(IrqTest, Enable) {
   EXPECT_MASK32(SPI_DEVICE_INTR_ENABLE_REG_OFFSET,
                 {{SPI_DEVICE_INTR_ENABLE_RXF, 0x1, 1}});
-  EXPECT_EQ(dif_spi_device_irq_enable(&spi_, kDifSpiDeviceIrqTypeRxFull,
-                                      kDifSpiDeviceIrqStateEnabled),
-            kDifSpiDeviceResultOk);
+  EXPECT_EQ(dif_spi_device_irq_set_enabled(&spi_, kDifSpiDeviceIrqRxFull,
+                                           kDifSpiDeviceToggleEnabled),
+            kDifSpiDeviceOk);
 
   EXPECT_MASK32(SPI_DEVICE_INTR_ENABLE_REG_OFFSET,
                 {{SPI_DEVICE_INTR_ENABLE_RXERR, 0x1, 0}});
-  EXPECT_EQ(dif_spi_device_irq_enable(&spi_, kDifSpiDeviceIrqTypeRxError,
-                                      kDifSpiDeviceIrqStateDisabled),
-            kDifSpiDeviceResultOk);
+  EXPECT_EQ(dif_spi_device_irq_set_enabled(&spi_, kDifSpiDeviceIrqRxError,
+                                           kDifSpiDeviceToggleDisabled),
+            kDifSpiDeviceOk);
 
   EXPECT_MASK32(SPI_DEVICE_INTR_ENABLE_REG_OFFSET,
                 {{SPI_DEVICE_INTR_ENABLE_TXUNDERFLOW, 0x1, 1}});
-  EXPECT_EQ(dif_spi_device_irq_enable(&spi_, kDifSpiDeviceIrqTypeTxUnderflow,
-                                      kDifSpiDeviceIrqStateEnabled),
-            kDifSpiDeviceResultOk);
+  EXPECT_EQ(dif_spi_device_irq_set_enabled(&spi_, kDifSpiDeviceIrqTxUnderflow,
+                                           kDifSpiDeviceToggleEnabled),
+            kDifSpiDeviceOk);
 
   EXPECT_MASK32(SPI_DEVICE_INTR_ENABLE_REG_OFFSET,
                 {{SPI_DEVICE_INTR_ENABLE_TXLVL, 0x1, 0}});
-  EXPECT_EQ(dif_spi_device_irq_enable(&spi_, kDifSpiDeviceIrqTypeTxBelowLevel,
-                                      kDifSpiDeviceIrqStateDisabled),
-            kDifSpiDeviceResultOk);
+  EXPECT_EQ(dif_spi_device_irq_set_enabled(&spi_, kDifSpiDeviceIrqTxBelowLevel,
+                                           kDifSpiDeviceToggleDisabled),
+            kDifSpiDeviceOk);
 }
 
 TEST_F(IrqTest, EnableNull) {
-  EXPECT_EQ(dif_spi_device_irq_enable(nullptr, kDifSpiDeviceIrqTypeRxFull,
-                                      kDifSpiDeviceIrqStateEnabled),
-            kDifSpiDeviceResultBadArg);
+  EXPECT_EQ(dif_spi_device_irq_set_enabled(nullptr, kDifSpiDeviceIrqRxFull,
+                                           kDifSpiDeviceToggleEnabled),
+            kDifSpiDeviceBadArg);
 }
 
 TEST_F(IrqTest, Force) {
   EXPECT_WRITE32(SPI_DEVICE_INTR_TEST_REG_OFFSET,
                  {{SPI_DEVICE_INTR_TEST_RXF, 1}});
-  EXPECT_EQ(dif_spi_device_irq_force(&spi_, kDifSpiDeviceIrqTypeRxFull),
-            kDifSpiDeviceResultOk);
+  EXPECT_EQ(dif_spi_device_irq_force(&spi_, kDifSpiDeviceIrqRxFull),
+            kDifSpiDeviceOk);
 
   EXPECT_WRITE32(SPI_DEVICE_INTR_TEST_REG_OFFSET,
                  {{SPI_DEVICE_INTR_TEST_RXERR, 1}});
-  EXPECT_EQ(dif_spi_device_irq_force(&spi_, kDifSpiDeviceIrqTypeRxError),
-            kDifSpiDeviceResultOk);
+  EXPECT_EQ(dif_spi_device_irq_force(&spi_, kDifSpiDeviceIrqRxError),
+            kDifSpiDeviceOk);
 
   EXPECT_WRITE32(SPI_DEVICE_INTR_TEST_REG_OFFSET,
                  {{SPI_DEVICE_INTR_TEST_TXUNDERFLOW, 1}});
-  EXPECT_EQ(dif_spi_device_irq_force(&spi_, kDifSpiDeviceIrqTypeTxUnderflow),
-            kDifSpiDeviceResultOk);
+  EXPECT_EQ(dif_spi_device_irq_force(&spi_, kDifSpiDeviceIrqTxUnderflow),
+            kDifSpiDeviceOk);
 
   EXPECT_WRITE32(SPI_DEVICE_INTR_TEST_REG_OFFSET,
                  {{SPI_DEVICE_INTR_TEST_TXLVL, 1}});
-  EXPECT_EQ(dif_spi_device_irq_force(&spi_, kDifSpiDeviceIrqTypeTxBelowLevel),
-            kDifSpiDeviceResultOk);
+  EXPECT_EQ(dif_spi_device_irq_force(&spi_, kDifSpiDeviceIrqTxBelowLevel),
+            kDifSpiDeviceOk);
 }
 
 TEST_F(IrqTest, ForceNull) {
-  EXPECT_EQ(dif_spi_device_irq_force(nullptr, kDifSpiDeviceIrqTypeRxFull),
-            kDifSpiDeviceResultBadArg);
+  EXPECT_EQ(dif_spi_device_irq_force(nullptr, kDifSpiDeviceIrqRxFull),
+            kDifSpiDeviceBadArg);
 }
 
 TEST_F(IrqTest, Levels) {
   EXPECT_WRITE32(SPI_DEVICE_FIFO_LEVEL_REG_OFFSET,
                  {{SPI_DEVICE_FIFO_LEVEL_RXLVL_OFFSET, 42},
                   {SPI_DEVICE_FIFO_LEVEL_TXLVL_OFFSET, 123}});
-  EXPECT_EQ(dif_spi_device_set_irq_levels(&spi_, 42, 123),
-            kDifSpiDeviceResultOk);
+  EXPECT_EQ(dif_spi_device_set_irq_levels(&spi_, 42, 123), kDifSpiDeviceOk);
 }
 
 TEST_F(IrqTest, LevelsNull) {
   EXPECT_EQ(dif_spi_device_set_irq_levels(nullptr, 123, 456),
-            kDifSpiDeviceResultBadArg);
+            kDifSpiDeviceBadArg);
 }
 
 class RxPendingTest : public SpiTest {};
@@ -306,7 +271,7 @@
                  {SPI_DEVICE_RXF_PTR_RPTR_OFFSET, 0x0}});
   size_t bytes_remaining;
   EXPECT_EQ(dif_spi_device_rx_pending(&spi_, &bytes_remaining),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(bytes_remaining, 0);
 }
 
@@ -316,7 +281,7 @@
                  {SPI_DEVICE_RXF_PTR_RPTR_OFFSET, FifoPtr(0x42, true)}});
   size_t bytes_remaining;
   EXPECT_EQ(dif_spi_device_rx_pending(&spi_, &bytes_remaining),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(bytes_remaining, 0);
 }
 
@@ -326,7 +291,7 @@
                  {SPI_DEVICE_RXF_PTR_RPTR_OFFSET, FifoPtr(0x42, true)}});
   size_t bytes_remaining;
   EXPECT_EQ(dif_spi_device_rx_pending(&spi_, &bytes_remaining),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(bytes_remaining, 0x15);
 }
 
@@ -336,7 +301,7 @@
                  {SPI_DEVICE_RXF_PTR_RPTR_OFFSET, FifoPtr(0x42, true)}});
   size_t bytes_remaining;
   EXPECT_EQ(dif_spi_device_rx_pending(&spi_, &bytes_remaining),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(bytes_remaining, 0x400);
 }
 
@@ -346,16 +311,15 @@
                  {SPI_DEVICE_RXF_PTR_RPTR_OFFSET, FifoPtr(0x57, true)}});
   size_t bytes_remaining;
   EXPECT_EQ(dif_spi_device_rx_pending(&spi_, &bytes_remaining),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(bytes_remaining, 0x3eb);
 }
 
 TEST_F(RxPendingTest, NullArgs) {
   size_t bytes_remaining;
   EXPECT_EQ(dif_spi_device_rx_pending(nullptr, &bytes_remaining),
-            kDifSpiDeviceResultBadArg);
-  EXPECT_EQ(dif_spi_device_rx_pending(&spi_, nullptr),
-            kDifSpiDeviceResultBadArg);
+            kDifSpiDeviceBadArg);
+  EXPECT_EQ(dif_spi_device_rx_pending(&spi_, nullptr), kDifSpiDeviceBadArg);
 }
 
 class TxPendingTest : public SpiTest {};
@@ -366,7 +330,7 @@
                  {SPI_DEVICE_TXF_PTR_RPTR_OFFSET, 0x0}});
   size_t bytes_remaining;
   EXPECT_EQ(dif_spi_device_tx_pending(&spi_, &bytes_remaining),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(bytes_remaining, 0);
 }
 
@@ -376,7 +340,7 @@
                  {SPI_DEVICE_TXF_PTR_RPTR_OFFSET, FifoPtr(0x42, true)}});
   size_t bytes_remaining;
   EXPECT_EQ(dif_spi_device_tx_pending(&spi_, &bytes_remaining),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(bytes_remaining, 0);
 }
 
@@ -386,7 +350,7 @@
                  {SPI_DEVICE_TXF_PTR_RPTR_OFFSET, FifoPtr(0x42, true)}});
   size_t bytes_remaining;
   EXPECT_EQ(dif_spi_device_tx_pending(&spi_, &bytes_remaining),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(bytes_remaining, 0x15);
 }
 
@@ -396,7 +360,7 @@
                  {SPI_DEVICE_TXF_PTR_RPTR_OFFSET, FifoPtr(0x42, true)}});
   size_t bytes_remaining;
   EXPECT_EQ(dif_spi_device_tx_pending(&spi_, &bytes_remaining),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(bytes_remaining, 0x400);
 }
 
@@ -406,16 +370,15 @@
                  {SPI_DEVICE_TXF_PTR_RPTR_OFFSET, FifoPtr(0x57, true)}});
   size_t bytes_remaining;
   EXPECT_EQ(dif_spi_device_tx_pending(&spi_, &bytes_remaining),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(bytes_remaining, 0x3eb);
 }
 
 TEST_F(TxPendingTest, NullArgs) {
   size_t bytes_remaining;
   EXPECT_EQ(dif_spi_device_tx_pending(nullptr, &bytes_remaining),
-            kDifSpiDeviceResultBadArg);
-  EXPECT_EQ(dif_spi_device_tx_pending(&spi_, nullptr),
-            kDifSpiDeviceResultBadArg);
+            kDifSpiDeviceBadArg);
+  EXPECT_EQ(dif_spi_device_tx_pending(&spi_, nullptr), kDifSpiDeviceBadArg);
 }
 
 class RecvTest : public SpiTest {};
@@ -429,7 +392,7 @@
   size_t recv_len = 0;
   EXPECT_EQ(dif_spi_device_recv(&spi_, const_cast<char *>(buf.data()),
                                 buf.size(), &recv_len),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(recv_len, 0);
   buf.resize(recv_len);
   EXPECT_EQ(buf, "");
@@ -441,7 +404,7 @@
                  {SPI_DEVICE_RXF_PTR_RPTR_OFFSET, FifoPtr(0x50, false)}});
 
   auto message = MakeBlob(kFifoLen);
-  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.rx_fifo_base;
+  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET;
   for (int i = 0; i < kFifoLen; i += 4) {
     auto idx = fifo_base + (i + 0x50) % kFifoLen;
     EXPECT_READ32(idx, LeInt(&message[i]));
@@ -455,7 +418,7 @@
   buf.resize(message.size() * 2);
   size_t recv_len = 0;
   EXPECT_EQ(dif_spi_device_recv(&spi_, buf.data(), buf.size(), &recv_len),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(recv_len, message.size());
   buf.resize(recv_len);
   EXPECT_EQ(buf, message);
@@ -469,7 +432,7 @@
                  {SPI_DEVICE_RXF_PTR_RPTR_OFFSET, FifoPtr(0x50, false)}});
 
   auto message = MakeBlob(kFifoLen);
-  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.rx_fifo_base;
+  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET;
   for (size_t i = 0; i < buf_len; i += 4) {
     auto idx = fifo_base + (i + 0x50) % kFifoLen;
     EXPECT_READ32(idx, LeInt(&message[i]));
@@ -484,7 +447,7 @@
   buf.resize(buf_len);
   size_t recv_len = 0;
   EXPECT_EQ(dif_spi_device_recv(&spi_, buf.data(), buf.size(), &recv_len),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(recv_len, buf_len);
   buf.resize(recv_len);
   message.resize(recv_len);
@@ -500,7 +463,7 @@
       {{SPI_DEVICE_RXF_PTR_WPTR_OFFSET, FifoPtr(message.size(), false)},
        {SPI_DEVICE_RXF_PTR_RPTR_OFFSET, FifoPtr(0x00, false)}});
 
-  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.rx_fifo_base;
+  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET;
   EXPECT_READ32(fifo_base + 0x0, LeInt(&message[0x0]));
   EXPECT_READ32(fifo_base + 0x4, LeInt(&message[0x4]));
   EXPECT_READ32(fifo_base + 0x8, LeInt(&message[0x8]));
@@ -514,7 +477,7 @@
   size_t recv_len = 0;
   EXPECT_EQ(dif_spi_device_recv(&spi_, const_cast<char *>(buf.data()),
                                 buf.size(), &recv_len),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(recv_len, message.size());
   buf.resize(recv_len);
   EXPECT_EQ(buf, message);
@@ -529,7 +492,7 @@
                 {{SPI_DEVICE_RXF_PTR_WPTR_OFFSET, FifoPtr(cropped_len, false)},
                  {SPI_DEVICE_RXF_PTR_RPTR_OFFSET, FifoPtr(0x00, false)}});
 
-  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.rx_fifo_base;
+  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET;
   EXPECT_READ32(fifo_base + 0x0, LeInt(&message[0x0]));
   EXPECT_READ32(fifo_base + 0x4, LeInt(&message[0x4]));
   EXPECT_READ32(fifo_base + 0x8, LeInt(&message[0x8]));
@@ -543,7 +506,7 @@
   size_t recv_len = 0;
   EXPECT_EQ(dif_spi_device_recv(&spi_, const_cast<char *>(buf.data()),
                                 buf.size(), &recv_len),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(recv_len, cropped_len);
 
   buf.resize(message.size());
@@ -564,7 +527,7 @@
       {{SPI_DEVICE_RXF_PTR_WPTR_OFFSET, FifoPtr(cropped_len, false)},
        {SPI_DEVICE_RXF_PTR_RPTR_OFFSET, FifoPtr(cropped_start, false)}});
 
-  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.rx_fifo_base;
+  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET;
   EXPECT_READ32(fifo_base + 0x0, LeInt(&message[0x0]));
   EXPECT_READ32(fifo_base + 0x4, LeInt(&message[0x4]));
   EXPECT_READ32(fifo_base + 0x8, LeInt(&message[0x8]));
@@ -578,7 +541,7 @@
   size_t recv_len = 0;
   EXPECT_EQ(dif_spi_device_recv(&spi_, const_cast<char *>(buf.data()),
                                 buf.size(), &recv_len),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(recv_len, cropped_len - cropped_start);
 
   buf.resize(message.size());
@@ -599,7 +562,7 @@
       {{SPI_DEVICE_RXF_PTR_WPTR_OFFSET, FifoPtr(cropped_len, false)},
        {SPI_DEVICE_RXF_PTR_RPTR_OFFSET, FifoPtr(cropped_start, false)}});
 
-  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.rx_fifo_base;
+  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET;
   EXPECT_READ32(fifo_base + 0x0, LeInt(&message[0x0]));
 
   EXPECT_WRITE32(
@@ -611,7 +574,7 @@
   size_t recv_len = 0;
   EXPECT_EQ(dif_spi_device_recv(&spi_, const_cast<char *>(buf.data()),
                                 buf.size(), &recv_len),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(recv_len, cropped_len - cropped_start);
 
   buf.resize(message.size());
@@ -627,16 +590,16 @@
 
   EXPECT_EQ(dif_spi_device_recv(nullptr, const_cast<char *>(buf.data()),
                                 buf.size(), &recv_len),
-            kDifSpiDeviceResultBadArg);
+            kDifSpiDeviceBadArg);
   EXPECT_EQ(dif_spi_device_recv(&spi_, nullptr, buf.size(), &recv_len),
-            kDifSpiDeviceResultBadArg);
+            kDifSpiDeviceBadArg);
 
   EXPECT_READ32(SPI_DEVICE_RXF_PTR_REG_OFFSET,
                 {{SPI_DEVICE_RXF_PTR_WPTR_OFFSET, FifoPtr(0x5a, false)},
                  {SPI_DEVICE_RXF_PTR_RPTR_OFFSET, FifoPtr(0x5a, false)}});
   EXPECT_EQ(dif_spi_device_recv(&spi_, const_cast<char *>(buf.data()),
                                 buf.size(), nullptr),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
 }
 
 class SendTest : public SpiTest {};
@@ -650,7 +613,7 @@
   size_t send_len = 0;
   EXPECT_EQ(
       dif_spi_device_send(&spi_, message.data(), message.size(), &send_len),
-      kDifSpiDeviceResultOk);
+      kDifSpiDeviceOk);
   EXPECT_EQ(send_len, 0);
 }
 
@@ -660,7 +623,7 @@
                  {SPI_DEVICE_TXF_PTR_RPTR_OFFSET, FifoPtr(0x50, true)}});
 
   auto message = MakeBlob(kFifoLen);
-  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.tx_fifo_base;
+  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.rx_fifo_len;
   for (int i = 0; i < kFifoLen; i += 4) {
     auto idx = fifo_base + (i + 0x50) % kFifoLen;
     EXPECT_WRITE32(idx, LeInt(&message[i]));
@@ -673,7 +636,7 @@
   size_t sent_len = 0;
   EXPECT_EQ(
       dif_spi_device_send(&spi_, message.data(), message.size(), &sent_len),
-      kDifSpiDeviceResultOk);
+      kDifSpiDeviceOk);
   EXPECT_EQ(sent_len, message.size());
 }
 
@@ -686,7 +649,7 @@
   uintptr_t value = 0;
   memcpy(&value, message.data(), 2);
 
-  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.tx_fifo_base;
+  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.rx_fifo_len;
   EXPECT_MASK32(fifo_base + 0x4c, {{0x10, 0xffff, value}});
 
   EXPECT_WRITE32(SPI_DEVICE_TXF_PTR_REG_OFFSET,
@@ -696,7 +659,7 @@
   size_t sent_len = 0;
   EXPECT_EQ(
       dif_spi_device_send(&spi_, message.data(), message.size(), &sent_len),
-      kDifSpiDeviceResultOk);
+      kDifSpiDeviceOk);
   EXPECT_EQ(sent_len, 2);
 }
 
@@ -708,7 +671,7 @@
                 {{SPI_DEVICE_TXF_PTR_WPTR_OFFSET, FifoPtr(0x00, false)},
                  {SPI_DEVICE_TXF_PTR_RPTR_OFFSET, FifoPtr(0x00, false)}});
 
-  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.tx_fifo_base;
+  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.rx_fifo_len;
   EXPECT_WRITE32(fifo_base + 0x0, LeInt(&message[0x0]));
   EXPECT_WRITE32(fifo_base + 0x4, LeInt(&message[0x4]));
   EXPECT_WRITE32(fifo_base + 0x8, LeInt(&message[0x8]));
@@ -721,7 +684,7 @@
   size_t send_len = 0;
   EXPECT_EQ(
       dif_spi_device_send(&spi_, message.data(), message.size(), &send_len),
-      kDifSpiDeviceResultOk);
+      kDifSpiDeviceOk);
   EXPECT_EQ(send_len, message.size());
 }
 
@@ -734,7 +697,7 @@
                 {{SPI_DEVICE_TXF_PTR_WPTR_OFFSET, FifoPtr(0x00, false)},
                  {SPI_DEVICE_TXF_PTR_RPTR_OFFSET, FifoPtr(0x00, false)}});
 
-  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.tx_fifo_base;
+  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.rx_fifo_len;
   EXPECT_WRITE32(fifo_base + 0x0, LeInt(&message[0x0]));
   EXPECT_WRITE32(fifo_base + 0x4, LeInt(&message[0x4]));
 
@@ -748,7 +711,7 @@
 
   size_t send_len = 0;
   EXPECT_EQ(dif_spi_device_send(&spi_, message.data(), cropped_len, &send_len),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(send_len, cropped_len);
 }
 
@@ -763,7 +726,7 @@
       {{SPI_DEVICE_TXF_PTR_WPTR_OFFSET, FifoPtr(cropped_start, false)},
        {SPI_DEVICE_TXF_PTR_RPTR_OFFSET, FifoPtr(cropped_start, false)}});
 
-  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.tx_fifo_base;
+  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.rx_fifo_len;
 
   uintptr_t start_value = 0;
   memcpy(&start_value, &message[0x0], 3);
@@ -782,7 +745,7 @@
 
   size_t send_len = 0;
   EXPECT_EQ(dif_spi_device_send(&spi_, message.data(), cropped_len, &send_len),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(send_len, cropped_len);
 }
 
@@ -797,7 +760,7 @@
       {{SPI_DEVICE_TXF_PTR_WPTR_OFFSET, FifoPtr(cropped_start, false)},
        {SPI_DEVICE_TXF_PTR_RPTR_OFFSET, FifoPtr(cropped_start, false)}});
 
-  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.tx_fifo_base;
+  auto fifo_base = SPI_DEVICE_BUFFER_REG_OFFSET + spi_.rx_fifo_len;
 
   uintptr_t start_value = 0;
   memcpy(&start_value, &message[0x0], 2);
@@ -811,7 +774,7 @@
 
   size_t send_len = 0;
   EXPECT_EQ(dif_spi_device_send(&spi_, message.data(), cropped_len, &send_len),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
   EXPECT_EQ(send_len, cropped_len);
 }
 
@@ -820,15 +783,15 @@
   size_t recv_len;
 
   EXPECT_EQ(dif_spi_device_send(nullptr, buf.data(), buf.size(), &recv_len),
-            kDifSpiDeviceResultBadArg);
+            kDifSpiDeviceBadArg);
   EXPECT_EQ(dif_spi_device_send(&spi_, nullptr, buf.size(), &recv_len),
-            kDifSpiDeviceResultBadArg);
+            kDifSpiDeviceBadArg);
 
   EXPECT_READ32(SPI_DEVICE_TXF_PTR_REG_OFFSET,
                 {{SPI_DEVICE_TXF_PTR_WPTR_OFFSET, FifoPtr(0x5a, true)},
                  {SPI_DEVICE_TXF_PTR_RPTR_OFFSET, FifoPtr(0x5a, false)}});
   EXPECT_EQ(dif_spi_device_send(&spi_, buf.data(), buf.size(), nullptr),
-            kDifSpiDeviceResultOk);
+            kDifSpiDeviceOk);
 }
 }  // namespace
 }  // namespace dif_spi_device_unittest