@@ -91,6 +91,20 @@ void dm_spi_release_bus(struct udevice *dev)
ops->release_bus(dev);
}
+int dm_spi_set_wordlen(struct udevice *dev, unsigned int wordlen)
+{
+ struct udevice *bus = dev->parent;
+ struct dm_spi_ops *ops = spi_get_ops(bus);
+
+ if (bus->uclass->uc_drv->id != UCLASS_SPI)
+ return -EOPNOTSUPP;
+
+ if (!ops->set_wordlen)
+ return -ENOSYS;
+
+ return ops->set_wordlen(dev, wordlen);
+}
+
int dm_spi_xfer(struct udevice *dev, unsigned int bitlen,
const void *dout, void *din, unsigned long flags)
{
@@ -144,6 +158,11 @@ int spi_set_speed(struct spi_slave *slave, uint hz)
return ret;
}
+int spi_set_wordlen(struct spi_slave *slave, unsigned int wordlen)
+{
+ return dm_spi_set_wordlen(slave->dev, wordlen);
+}
+
int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
const void *dout, void *din, unsigned long flags)
{
@@ -729,6 +729,18 @@ int dm_spi_claim_bus(struct udevice *dev);
*/
void dm_spi_release_bus(struct udevice *dev);
+/**
+ * Set the word length for SPI transactions
+ *
+ * Set the word length (number of bits per word) for SPI transactions.
+ *
+ * @slave: The SPI slave
+ * @wordlen: The number of bits in a word
+ *
+ * Returns: 0 on success, -1 on failure.
+ */
+int dm_spi_set_wordlen(struct udevice *dev, unsigned int wordlen);
+
/**
* SPI transfer
*
Allow dynamic configuration of the SPI word length. This is required for controllers and slaves that need to operate with non-standard word lengths, such as 9-bit wide transfers. Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com> --- drivers/spi/spi-uclass.c | 19 +++++++++++++++++++ include/spi.h | 12 ++++++++++++ 2 files changed, 31 insertions(+)