[sherlock][spi] Use interrupts and 64-bit transfers for Thread
64-bit transfers are required for getting Thread working at the new
SPI clock frequency.
Test: ot driver tests pass
Change-Id: I34cab22642508e245ab528380fb1d779563d6221
diff --git a/src/devices/board/drivers/sherlock/sherlock-registers.cc b/src/devices/board/drivers/sherlock/sherlock-registers.cc
index 0de7590..e562467 100644
--- a/src/devices/board/drivers/sherlock/sherlock-registers.cc
+++ b/src/devices/board/drivers/sherlock/sherlock-registers.cc
@@ -111,6 +111,16 @@
},
});
+ register_entries[aml_registers::REGISTER_SPICC0_RESET] =
+ registers::BuildMetadata(allocator, aml_registers::REGISTER_SPICC0_RESET, RESET_MMIO,
+ std::vector<registers::MaskEntryBuilder<uint32_t>>{
+ {
+ .mask = aml_registers::SPICC0_RESET_MASK,
+ .mmio_offset = T931_RESET6_REGISTER,
+ .reg_count = 1,
+ },
+ });
+
#ifdef FACTORY_BUILD
mmio_entries[USB_FACTORY_MMIO] = registers::BuildMetadata(allocator, USB_FACTORY_MMIO);
diff --git a/src/devices/board/drivers/sherlock/sherlock-spi.cc b/src/devices/board/drivers/sherlock/sherlock-spi.cc
index a551796..69e9ac2 100644
--- a/src/devices/board/drivers/sherlock/sherlock-spi.cc
+++ b/src/devices/board/drivers/sherlock/sherlock-spi.cc
@@ -32,6 +32,13 @@
},
};
+static const pbus_irq_t spi_irqs[] = {
+ {
+ .irq = T931_SPICC0_IRQ,
+ .mode = ZX_INTERRUPT_MODE_EDGE_HIGH,
+ },
+};
+
static const spi_channel_t spi_channels[] = {
// Thread SPI
{
@@ -61,6 +68,8 @@
dev.did = PDEV_DID_AMLOGIC_SPI;
dev.mmio_list = spi_mmios;
dev.mmio_count = countof(spi_mmios);
+ dev.irq_list = spi_irqs;
+ dev.irq_count = countof(spi_irqs);
return dev;
}();
@@ -74,8 +83,17 @@
{std::size(gpio_spicc0_ss0_match), gpio_spicc0_ss0_match},
};
+static const zx_bind_inst_t spi0_reset_register_match[] = {
+ BI_ABORT_IF(NE, BIND_PROTOCOL, ZX_PROTOCOL_REGISTERS),
+ BI_MATCH_IF(EQ, BIND_REGISTER_ID, aml_registers::REGISTER_SPICC0_RESET),
+};
+static const device_fragment_part_t spi0_reset_register_fragment[] = {
+ {std::size(spi0_reset_register_match), spi0_reset_register_match},
+};
+
static constexpr device_fragment_t fragments[] = {
{"gpio-cs-0", std::size(gpio_spicc0_ss0_fragment), gpio_spicc0_ss0_fragment},
+ {"reset", std::size(spi0_reset_register_fragment), spi0_reset_register_fragment},
};
zx_status_t Sherlock::SpiInit() {