Implement spi_set_wordlen for driver model devices.

Not all drivers support this interface, so we will assume the default
wordlen is safe and allow setting that unconditionally.

Signed-off-by: John Watts <cont...@jookia.org>
---
 drivers/spi/spi-uclass.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/drivers/spi/spi-uclass.c b/drivers/spi/spi-uclass.c
index f4795e6867..c2baf9a262 100644
--- a/drivers/spi/spi-uclass.c
+++ b/drivers/spi/spi-uclass.c
@@ -130,6 +130,35 @@ void spi_release_bus(struct spi_slave *slave)
        dm_spi_release_bus(slave->dev);
 }
 
+static int spi_try_set_wordlen(struct spi_slave *slave, unsigned int wordlen)
+{
+       struct dm_spi_ops *ops;
+
+       ops = spi_get_ops(slave->dev->parent);
+       if (ops->set_wordlen)
+               return ops->set_wordlen(slave->dev->parent, wordlen);
+       else if (wordlen == SPI_DEFAULT_WORDLEN)
+               return 0;
+       else
+               return -EINVAL;
+}
+
+int spi_set_wordlen(struct spi_slave *slave, unsigned int wordlen)
+{
+       int oldwordlen = slave->wordlen;
+       int ret;
+
+       ret = spi_try_set_wordlen(slave, wordlen);
+       if (ret < 0) {
+               dev_err(slave->dev, "Cannot set wordlen (err=%d)\n", ret);
+               return ret;
+       }
+
+       slave->wordlen = wordlen;
+
+       return oldwordlen;
+}
+
 int spi_set_speed(struct spi_slave *slave, uint hz)
 {
        struct dm_spi_ops *ops;

-- 
2.45.2

Reply via email to