{"id":2198276,"url":"http://patchwork.ozlabs.org/api/1.0/patches/2198276/?format=json","project":{"id":18,"url":"http://patchwork.ozlabs.org/api/1.0/projects/18/?format=json","name":"U-Boot","link_name":"uboot","list_id":"u-boot.lists.denx.de","list_email":"u-boot@lists.denx.de","web_url":null,"scm_url":null,"webscm_url":null},"msgid":"<20260219175130.2839234-7-dario.binacchi@amarulasolutions.com>","date":"2026-02-19T17:51:17","name":"[6/8] spi: stm32: add support for bits-per-word setting","commit_ref":null,"pull_url":null,"state":"changes-requested","archived":false,"hash":"36251f52c362a876b49bd871d1bc6b204510976f","submitter":{"id":83038,"url":"http://patchwork.ozlabs.org/api/1.0/people/83038/?format=json","name":"Dario Binacchi","email":"dario.binacchi@amarulasolutions.com"},"delegate":{"id":3651,"url":"http://patchwork.ozlabs.org/api/1.0/users/3651/?format=json","username":"trini","first_name":"Tom","last_name":"Rini","email":"trini@ti.com"},"mbox":"http://patchwork.ozlabs.org/project/uboot/patch/20260219175130.2839234-7-dario.binacchi@amarulasolutions.com/mbox/","series":[{"id":492708,"url":"http://patchwork.ozlabs.org/api/1.0/series/492708/?format=json","date":"2026-02-19T17:51:11","name":"video: support Rocktech RK050HR345-CT106A panel","version":1,"mbox":"http://patchwork.ozlabs.org/series/492708/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2198276/checks/","tags":{},"headers":{"Return-Path":"<u-boot-bounces@lists.denx.de>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=amarulasolutions.com header.i=@amarulasolutions.com\n header.a=rsa-sha256 header.s=google header.b=FvjkqJIk;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de\n (client-ip=85.214.62.61; helo=phobos.denx.de;\n envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org)","phobos.denx.de;\n dmarc=pass (p=none dis=none) header.from=amarulasolutions.com","phobos.denx.de;\n spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de","phobos.denx.de;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=amarulasolutions.com header.i=@amarulasolutions.com\n header.b=\"FvjkqJIk\";\n\tdkim-atps=neutral","phobos.denx.de; dmarc=pass (p=none dis=none)\n header.from=amarulasolutions.com","phobos.denx.de; spf=pass\n smtp.mailfrom=dario.binacchi@amarulasolutions.com"],"Received":["from phobos.denx.de (phobos.denx.de [85.214.62.61])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fH1Dr1D7tz1xpl\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 20 Feb 2026 04:52:44 +1100 (AEDT)","from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id DBCCA83D0B;\n\tThu, 19 Feb 2026 18:52:17 +0100 (CET)","by phobos.denx.de (Postfix, from userid 109)\n id 8760C83D0B; Thu, 19 Feb 2026 18:52:16 +0100 (CET)","from mail-wm1-x335.google.com (mail-wm1-x335.google.com\n [IPv6:2a00:1450:4864:20::335])\n (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits))\n (No client certificate requested)\n by phobos.denx.de (Postfix) with ESMTPS id 8FBE983E21\n for <u-boot@lists.denx.de>; Thu, 19 Feb 2026 18:52:14 +0100 (CET)","by mail-wm1-x335.google.com with SMTP id\n 5b1f17b1804b1-4836d4c26d3so11655905e9.2\n for <u-boot@lists.denx.de>; Thu, 19 Feb 2026 09:52:14 -0800 (PST)","from dario-ThinkPad-P14s-Gen-5.homenet.telecomitalia.it\n (host-95-248-31-95.retail.telecomitalia.it. [95.248.31.95])\n by smtp.gmail.com with ESMTPSA id\n 5b1f17b1804b1-483a31b0e63sm35485005e9.2.2026.02.19.09.52.10\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 19 Feb 2026 09:52:13 -0800 (PST)"],"X-Spam-Checker-Version":"SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de","X-Spam-Level":"","X-Spam-Status":"No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,\n DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED,\n SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=amarulasolutions.com; s=google; t=1771523534; x=1772128334;\n darn=lists.denx.de;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=533B30VEdaP+E4Na1aeGiCFVM50K9If5sXJTZgVBYao=;\n b=FvjkqJIkaNNUSNoBGLk9g9JipXFLo5K8k6HqJsOOm+VcOIwFpVkRcSn34gk0+vrLTA\n SSeGTB2Q2xfE9beRFmPZMp/nprEUzmWBdVMOIUgZjv/y7HAxUDfR6SPk1alXduaQeLBU\n W+tAx12P9FiX4eTTzf0nxtMkwzPqRAPxUwxf8=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1771523534; x=1772128334;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=533B30VEdaP+E4Na1aeGiCFVM50K9If5sXJTZgVBYao=;\n b=R0UfwRElmqewwHeHLTTlhNXlIT5fS51lxzVuVtYa9ThLqtuaELatbQzfz7r2PGsCnU\n NT9HgYhzbjKpoulhcEaWNp8p7YH4gydH6/igVDQZKBBt321tykt8eIqXlXmsODRKiEPa\n t/WCNZGoPzA07PF+IYdKJP28u8XzruJyLigAwL7M5iBp1hHqZeLkW15snpLQYVo8kNqM\n ZlIJj6QGYalQIKmQNY5UOGPe24Fo8i24yZ3xzBgLB0zn5/y5CJWdvhs7HbZPxtRoVvXy\n CwZ86gTcxUXY+3g4RU5vW6HdnRUrKXAll7tyV376rQNH4Zxh1LWGrk5nDoyslT6u1KZd\n wxJA==","X-Gm-Message-State":"AOJu0Yzq0TkXujJPH5HJ034VSPevPW6YDzJZwv4QOWl4QgX63pJJCTMb\n j6lUir+Ztaxe7NChtfRoqzyZ8Fkeq+XOur+xh9uV6F6SYB+0BZHKV1qWFggFE2ahwPVgfAwpTHu\n xRYuB","X-Gm-Gg":"AZuq6aL0imdHawHaW307TXIuoL2oKWS7luIbETalbmfoNQBQ+Ji4PKwklsiVIl9yCaa\n 5cxsVGwHBrtCkGyV0SIhEbZAgFkcfJJQ/VeeLa9zy8RM+OPrxr8gny3zYm6TPIDumvD94U3oWYY\n ODBM04zliJdZh00H4Z5BWyXWeuejl6XvuvqsTMRh3du0SgtPzbP9MDTtlwqvZBqz22ZGrz7/dd7\n cQ8M3WcmF1Am2cM5eTpsP/G4ddya9D4N6s/m8tX5oTFiKzTen+JCgT3JySVDI4aE6j73JL6m0ha\n XLlCf5eXaAe7cbub6rjFKvdqV8mln9+/p0dBUDsK9xqUESE6hDsHpAWXY+3NqSKJ8JOLNx0GiVx\n mAD6ggFKKNGaYOIqDrBQV1DQSNFavJbBrmRfbS94L4EEF9TePu0izzzYjbWFWt1xAW2O/RGIhYl\n BQhfquJNKrj2pRwfZHz/qdn3IaEmFT+gkLzsfwTqQxPByTJGDj5KvBbWwnnUTxxG7zOKhj+myT9\n QQ+JmNzpfUlaUFUCiBHQ6g4SFxMdPcNkTnDR06ESTxY1HmJEuitYXRppPTJCHe9a5LQHRvg8YHC\n UxIXvZgT8zV8CItkKwQ/xWFy","X-Received":"by 2002:a05:600c:6990:b0:483:8f38:a928 with SMTP id\n 5b1f17b1804b1-4838f38a961mr158805545e9.34.1771523533689;\n Thu, 19 Feb 2026 09:52:13 -0800 (PST)","From":"Dario Binacchi <dario.binacchi@amarulasolutions.com>","To":"u-boot@lists.denx.de","Cc":"Patrice Chotard <patrice.chotard@foss.st.com>,\n linux-amarula@amarulasolutions.com,\n Patrick Delaunay <patrick.delaunay@foss.st.com>,\n Dario Binacchi <dario.binacchi@amarulasolutions.com>,\n Jagan Teki <jagan@amarulasolutions.com>, Tom Rini <trini@konsulko.com>,\n uboot-stm32@st-md-mailman.stormreply.com","Subject":"[PATCH 6/8] spi: stm32: add support for bits-per-word setting","Date":"Thu, 19 Feb 2026 18:51:17 +0100","Message-ID":"<20260219175130.2839234-7-dario.binacchi@amarulasolutions.com>","X-Mailer":"git-send-email 2.43.0","In-Reply-To":"<20260219175130.2839234-1-dario.binacchi@amarulasolutions.com>","References":"<20260219175130.2839234-1-dario.binacchi@amarulasolutions.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-BeenThere":"u-boot@lists.denx.de","X-Mailman-Version":"2.1.39","Precedence":"list","List-Id":"U-Boot discussion <u-boot.lists.denx.de>","List-Unsubscribe":"<https://lists.denx.de/options/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=unsubscribe>","List-Archive":"<https://lists.denx.de/pipermail/u-boot/>","List-Post":"<mailto:u-boot@lists.denx.de>","List-Help":"<mailto:u-boot-request@lists.denx.de?subject=help>","List-Subscribe":"<https://lists.denx.de/listinfo/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=subscribe>","Errors-To":"u-boot-bounces@lists.denx.de","Sender":"\"U-Boot\" <u-boot-bounces@lists.denx.de>","X-Virus-Scanned":"clamav-milter 0.103.8 at phobos.denx.de","X-Virus-Status":"Clean"},"content":"Implement the set_wordlen operation to allow dynamic bus width\nconfiguration. This is required for peripherals with non-standard\nrequirements, such as display panels that need 9-bit word transfers\nduring the initialization and setup phase.\n\nSigned-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>\n---\n\n drivers/spi/stm32_spi.c | 62 +++++++++++++++++++++++++++++++++++++----\n 1 file changed, 57 insertions(+), 5 deletions(-)","diff":"diff --git a/drivers/spi/stm32_spi.c b/drivers/spi/stm32_spi.c\nindex adba97915cd3..39ea69c68174 100644\n--- a/drivers/spi/stm32_spi.c\n+++ b/drivers/spi/stm32_spi.c\n@@ -192,6 +192,11 @@ static void stm32_spi_read_rxfifo(struct udevice *bus)\n \tlog_debug(\"%d bytes left\\n\", priv->rx_len);\n }\n \n+static bool stm32_spi_is_enabled(void __iomem *base)\n+{\n+\treturn !!(readl(base + STM32_SPI_CR1) & SPI_CR1_SPE);\n+}\n+\n static int stm32_spi_enable(void __iomem *base)\n {\n \tlog_debug(\"\\n\");\n@@ -381,6 +386,44 @@ static int stm32_spi_set_speed(struct udevice *bus, uint hz)\n \treturn 0;\n }\n \n+static int _stm32_spi_set_wordlen(struct udevice *bus, unsigned int wordlen)\n+{\n+\tstruct stm32_spi_priv *priv = dev_get_priv(bus);\n+\tstruct stm32_spi_plat *plat = dev_get_plat(bus);\n+\tvoid __iomem *base = plat->base;\n+\tbool spi_enabled;\n+\n+\tif ((wordlen - 1) < SPI_CFG1_DSIZE_MIN ||\n+\t    (wordlen - 1) > SPI_CFG1_DSIZE) {\n+\t\tdev_err(bus, \"Cannot set wordlen to %u [%d - %d]\\n\",\n+\t\t\twordlen, SPI_CFG1_DSIZE_MIN + 1,\n+\t\t\tSPI_CFG1_DSIZE + 1);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tspi_enabled = stm32_spi_is_enabled(plat->base);\n+\tif (spi_enabled)\n+\t\tstm32_spi_disable(plat->base);\n+\n+\tdev_dbg(bus, \"bits_per_word=%d\\n\", wordlen);\n+\n+\tpriv->cur_bpw = wordlen;\n+\tclrsetbits_le32(base + STM32_SPI_CFG1, SPI_CFG1_DSIZE,\n+\t\t\tpriv->cur_bpw - 1);\n+\n+\tif (spi_enabled)\n+\t\tstm32_spi_enable(plat->base);\n+\n+\treturn 0;\n+}\n+\n+static int stm32_spi_set_wordlen(struct udevice *slave, unsigned int wordlen)\n+{\n+\tstruct udevice *bus = dev_get_parent(slave);\n+\n+\treturn _stm32_spi_set_wordlen(bus, wordlen);\n+}\n+\n static int stm32_spi_xfer(struct udevice *slave, unsigned int bitlen,\n \t\t\t  const void *dout, void *din, unsigned long flags)\n {\n@@ -394,11 +437,19 @@ static int stm32_spi_xfer(struct udevice *slave, unsigned int bitlen,\n \tu32 xferlen;\n \tu32 mode;\n \tint xfer_status = 0;\n+\tint nb_words;\n \n \txferlen = bitlen / 8;\n \n-\tif (xferlen <= SPI_CR2_TSIZE)\n-\t\twritel(xferlen, base + STM32_SPI_CR2);\n+\tif (priv->cur_bpw <= 8)\n+\t\tnb_words = xferlen;\n+\telse if (priv->cur_bpw <= 16)\n+\t\tnb_words = DIV_ROUND_UP(xferlen * 8, 16);\n+\telse\n+\t\tnb_words = DIV_ROUND_UP(xferlen * 8, 32);\n+\n+\tif (nb_words <= SPI_CR2_TSIZE)\n+\t\twritel(nb_words, base + STM32_SPI_CR2);\n \telse\n \t\treturn -EMSGSIZE;\n \n@@ -406,6 +457,8 @@ static int stm32_spi_xfer(struct udevice *slave, unsigned int bitlen,\n \tpriv->rx_buf = din;\n \tpriv->tx_len = priv->tx_buf ? xferlen : 0;\n \tpriv->rx_len = priv->rx_buf ? xferlen : 0;\n+\tdev_dbg(bus, \"bitlen: %d, xferlen: %d, nb_words: %d\\n\",\n+\t\tbitlen, xferlen, nb_words);\n \n \tmode = SPI_FULL_DUPLEX;\n \tif (!priv->tx_buf)\n@@ -567,9 +620,7 @@ static int stm32_spi_probe(struct udevice *dev)\n \tpriv->fifo_size = stm32_spi_get_fifo_size(dev);\n \tpriv->cur_mode = SPI_FULL_DUPLEX;\n \tpriv->cur_xferlen = 0;\n-\tpriv->cur_bpw = SPI_DEFAULT_WORDLEN;\n-\tclrsetbits_le32(base + STM32_SPI_CFG1, SPI_CFG1_DSIZE,\n-\t\t\tpriv->cur_bpw - 1);\n+\t_stm32_spi_set_wordlen(dev, SPI_DEFAULT_WORDLEN);\n \n \tfor (i = 0; i < ARRAY_SIZE(plat->cs_gpios); i++) {\n \t\tif (!dm_gpio_is_valid(&plat->cs_gpios[i]))\n@@ -630,6 +681,7 @@ static const struct dm_spi_ops stm32_spi_ops = {\n \t.release_bus\t= stm32_spi_release_bus,\n \t.set_mode\t= stm32_spi_set_mode,\n \t.set_speed\t= stm32_spi_set_speed,\n+\t.set_wordlen    = stm32_spi_set_wordlen,\n \t.xfer\t\t= stm32_spi_xfer,\n };\n \n","prefixes":["6/8"]}