From patchwork Thu Feb 19 17:51:17 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dario Binacchi X-Patchwork-Id: 4469 Return-Path: X-Original-To: linux-amarula@patchwork.amarulasolutions.com Delivered-To: linux-amarula@patchwork.amarulasolutions.com Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by ganimede.amarulasolutions.com (Postfix) with ESMTPS id 6D77F3F150 for ; Thu, 19 Feb 2026 18:52:16 +0100 (CET) Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-4836e35292csf11773395e9.1 for ; Thu, 19 Feb 2026 09:52:16 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1771523536; cv=pass; d=google.com; s=arc-20240605; b=cfdwMWJki5RjI+dRgOvj7u8dz1YYuj/+H9BLz2aKNDmv/Zog9ZKrdxp6tOVVfrSnxb AGP+XMuHXT6cJdWEGJG4lHEMV6FIziHT8Do5P8zyGkpM2B6GDrgeIJnASpkQhC63xYKi muBbrLXQhAF1FmOm+j5uEaht6JzNv9dNLr4NO9fvA3ChjTbpFhFWNDt/+SqFmcI2dBLH ecnzSFy2cXc5q2QhqInkgMXa7pGABsK3vmBLQ6zuWLYuMeGNwPjvwH6MI+Gy+dX/p6h9 7uEPQ22FXbso5iB8v3IvIK1I2gnQM50huTnPEhFelBaiS1it4eTgQfUNFQtLXbAblC3L iQ+A== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=list-unsubscribe:list-archive:list-help:list-post:list-id :mailing-list:precedence:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=2eNm9YDck1fJ8ClJOyNYoqs2t8ZM62zXtCqIjn66aVA=; fh=38Jrk03GIdO4ePjDaoDHX7qv5uVlHUh+xjmOit5jaZs=; b=lhDAb1dWzzvTD2BpgUUDDoIWxnw/v/RKtjZ1fXD4+jeyU02ZNmZIRM9hEuusTjDSX/ zR1+J6mLJJnUyxwYVof+d+t+wLDzhpzO7xI52HcuPuENm4BZf0Cekqcm40M7CYAy4s9V d2XE7FhpgQqj4Bfk3LVKbIKfv5jE72IMUnIh3xHvJqjcrCagRm2ZCQWEyGn+spZRlE83 j+ccFDCRAdzupumQ//f7f0LtaVLFdIWt9JWMXA9GmTr5frCF5OnCxmzEv6FvMcoK7UFt pQL12Jquf3j7mj/aiKfBpy8+RzJBNDsHCSqhwBCemxnDdPcQ3hbWk6c8CjCAo+hQ4Pcj 71qg==; darn=patchwork.amarulasolutions.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=U6a2M4eF; spf=pass (google.com: domain of dario.binacchi@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=dario.binacchi@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com; dara=neutral header.i=@amarulasolutions.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1771523536; x=1772128336; darn=patchwork.amarulasolutions.com; h=list-unsubscribe:list-archive:list-help:list-post:list-id :mailing-list:precedence:x-original-authentication-results :x-original-sender:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=2eNm9YDck1fJ8ClJOyNYoqs2t8ZM62zXtCqIjn66aVA=; b=WrvLaPNNYRD6N77Js8d6y7e5xk2oIpek+qBpy5OBpiTOleqHTfIk4hH2TpkR1m2Uhu quxfEnQPTrwFFETRm7RQ1m3AKFDl+ntNB9uI5ByqH5udtA7Extr3xFZfxvNIpwRFApxY vJAg002xK2qm4j8TGdW6RRTlwELG603G/Elws= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771523536; x=1772128336; h=list-unsubscribe:list-archive:list-help:list-post :x-spam-checked-in-group:list-id:mailing-list:precedence :x-original-authentication-results:x-original-sender:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-beenthere:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=2eNm9YDck1fJ8ClJOyNYoqs2t8ZM62zXtCqIjn66aVA=; b=vVULoWTNv6FBHLEqpjZ6Hqz0I1QEW3LOFk4POc1Rn8ZIBgujA1ik83unhuYCjafLip kTeeVAGuJ/Kyx7Zkbc/9O7pnBImQDA5/zuGHJfHBM2Zvpt1UI4U+xDXXCKhXNmQFH34C ZIoyNIYSPCXRfMFo2pbirUjIDnYVS/LY+2zekGWP/MU4HJql1CRg/Rlhg6rXFByBMxXZ WRQ3lR9rmzu7x2u4xV/gtc2JNa6YSFy8yl4D1KswjGcpBWI1NcFTl6Mi4h7Vd3/jpHMJ cXcTUuNFbpO42jwB9X05gcJabTpe9JcjWMtQ3E9AmBslaoTQ3LxV0onMqDzJwLqGtzae 85tQ== X-Forwarded-Encrypted: i=2; AJvYcCXoXevudAVSakNWKmAi9DRPVNOCmm5PinykmFNT28WkgVwvuyD9tbIQ/clgduobXe37Qy8W1JghuA+qIGsb@patchwork.amarulasolutions.com X-Gm-Message-State: AOJu0YyFTLzfQOmxpOLajO6z3GdVljlpo7i69Sq85lD8raahHGp0nM6U Yosn8h5Y3AsO6ICf6gmoYI22FUfsBIahJgam7FUADfXK772KE9QDJ84KG4vJwF3f2s6uYw== X-Received: by 2002:a05:600c:5248:b0:477:a54a:acba with SMTP id 5b1f17b1804b1-48373a3e98fmr391243165e9.17.1771523536015; Thu, 19 Feb 2026 09:52:16 -0800 (PST) X-BeenThere: linux-amarula@amarulasolutions.com; h="AV1CL+FbEu4IzjrLxuaQROgD3LJqXfI1PbPCfjFfNtREOkidQg==" Received: by 2002:a05:600c:350d:b0:477:a036:8e60 with SMTP id 5b1f17b1804b1-483670260a0ls52721145e9.0.-pod-prod-02-eu; Thu, 19 Feb 2026 09:52:14 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCURBNVl5Hnb8gxDJ4JL/yUJjHkkhuIQsgHdDzcUEnYSYAaL0BEPEM8t+Neg74PzmXvl+iYUsCQB0YUKJmmB@amarulasolutions.com X-Received: by 2002:a05:600c:1986:b0:483:71f9:37f3 with SMTP id 5b1f17b1804b1-483739ff8cdmr389797945e9.1.1771523534181; Thu, 19 Feb 2026 09:52:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1771523534; cv=none; d=google.com; s=arc-20240605; b=eHkCUdt0KVgPH0ooQ1H+DtwjcZx3oNRBv25m38xehH6IghRGLaxGPgbSSpLbtpX4S3 Pj5e5EzP4YzW4RpoDgBCQgUVvAQBrDc4ORptazDFK+1+vSDx+faUk77OZgkuJ7bgWTEa q2muJaV5+1V2PazHeBf55G+NjGAh68FZG3K94l84TanDYV8HD4ONKPimnLaj7PpzRTDD mXb03qRUnnaIZ2BZbbA0lgjGnGvfNHgUlBT3lE+EtjE2LLarz+fZFGiThdz5JyjzsQAv CI/U4CyUqHE7XlwB6w+pGTq7fhZ+ruu4jn6mOQ9ARXZVHH23ZKjobqna2CyM8gMvg7N2 C9Dw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=533B30VEdaP+E4Na1aeGiCFVM50K9If5sXJTZgVBYao=; fh=nKdsvc+CPv7CULELixTU4rjGwshUUt3a2mORzxHLcwQ=; b=iX42oMdKbniLbP2kf1rt0hkcUUag7FUUgZI8v135med4oAqUgk0k4hWT2UlsMwAKIi s+XfpXDHDdIBwFiflor0shYE+COx9yOi6tQ2GGj2rqixBKa385NKpFdDOFCCSD3nTG+G t+2oyE6cogBNnogmjj0K0MBJb7AeMhKAyv4g1PJgrkykOlLjWZVjuE3rwsQl5iLNjQSZ USt9p1yG8cuJJpAS3CSA2ygzJ11fnHfwZSgdgTsPhGRl12PnLLKEA0PKqREmjDK7AeKR kVy5GefRbNzl7wWltvabG2Pr+dLySDLBsHSzCaCLgAJUpSjBs64QMhFyu+odz++UtLFL UyFw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=U6a2M4eF; spf=pass (google.com: domain of dario.binacchi@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=dario.binacchi@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com; dara=neutral header.i=@amarulasolutions.com Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) by mx.google.com with SMTPS id 5b1f17b1804b1-483703d96c4sor21932475e9.23.2026.02.19.09.52.14 for (Google Transport Security); Thu, 19 Feb 2026 09:52:14 -0800 (PST) Received-SPF: pass (google.com: domain of dario.binacchi@amarulasolutions.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; X-Forwarded-Encrypted: i=1; AJvYcCW2FPp3s80+6avERia1GQGgJJq9lvfREJmHwEwmNdrgdBrdqp3LDr8aHbqiGs6VhrrOyORQlXyr6vm/BAbt@amarulasolutions.com X-Gm-Gg: AZuq6aICoYSya9WvAPwjlN3Ck0vK2Wpsdi5u1vyixUkQAARw49+RNf8DJ0yPtqJ/mTz z5CHYDTZPxiGCZv3NlVM/fD1FNntoGLJa6Ays4sllX/4zRC7al4GSw1zLRY1I2IB4HkU+f/YUs/ PacQAT6a9coDjZGM2R/lyts6guPwomAc6VQVfr6TPnt5PiFgP7SzHl1INIHaUh5ooaG0Tpb07zP lbl6MtGAOF+6tMwuJgoSBrT7Jvx8ewnnzKN4yOxOmr6p9ooCPq30DRZ+98/+lg9CLDqXB5y7dST +8oyh2VyKcerBJCD+uLG+O6HZK/sLxny4TU4SjNqGKeM597xjNemqMw9kd6kwuQazEsVIbeXu11 Q2k2EMvulWDAgXPuCjvftgqnhHkVuFQeCecuOIV2NSc0zWNPDG4VRvJO1hiNZNyN9sahCQCHeNp pf/4AYCJe9gZcTIto3jmIhoVHEdDgaMHlnwc4eoNjRU5nQeyueCLMTrnALoywF1aESLDtSPO8cl /53JjbX1KODuWVvnMvGXz0NJvnn5lAFc6tMzw3usZa3iLYMEzPT/t8QYosL8+C2zsls85/U45jh xwjU/6ie7Zb1G7svcSu+H+Q1 X-Received: by 2002:a05:600c:6990:b0:483:8f38:a928 with SMTP id 5b1f17b1804b1-4838f38a961mr158805545e9.34.1771523533689; Thu, 19 Feb 2026 09:52:13 -0800 (PST) Received: from dario-ThinkPad-P14s-Gen-5.homenet.telecomitalia.it (host-95-248-31-95.retail.telecomitalia.it. [95.248.31.95]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483a31b0e63sm35485005e9.2.2026.02.19.09.52.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Feb 2026 09:52:13 -0800 (PST) From: Dario Binacchi To: u-boot@lists.denx.de Cc: Patrice Chotard , linux-amarula@amarulasolutions.com, Patrick Delaunay , Dario Binacchi , Jagan Teki , Tom Rini , 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 X-Original-Sender: dario.binacchi@amarulasolutions.com X-Original-Authentication-Results: mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=U6a2M4eF; spf=pass (google.com: domain of dario.binacchi@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=dario.binacchi@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com; dara=neutral header.i=@amarulasolutions.com Content-Type: text/plain; charset="UTF-8" Precedence: list Mailing-list: list linux-amarula@amarulasolutions.com; contact linux-amarula+owners@amarulasolutions.com List-ID: X-Spam-Checked-In-Group: linux-amarula@amarulasolutions.com X-Google-Group-Id: 476853432473 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , Implement the set_wordlen operation to allow dynamic bus width configuration. This is required for peripherals with non-standard requirements, such as display panels that need 9-bit word transfers during the initialization and setup phase. Signed-off-by: Dario Binacchi --- drivers/spi/stm32_spi.c | 62 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/drivers/spi/stm32_spi.c b/drivers/spi/stm32_spi.c index adba97915cd3..39ea69c68174 100644 --- a/drivers/spi/stm32_spi.c +++ b/drivers/spi/stm32_spi.c @@ -192,6 +192,11 @@ static void stm32_spi_read_rxfifo(struct udevice *bus) log_debug("%d bytes left\n", priv->rx_len); } +static bool stm32_spi_is_enabled(void __iomem *base) +{ + return !!(readl(base + STM32_SPI_CR1) & SPI_CR1_SPE); +} + static int stm32_spi_enable(void __iomem *base) { log_debug("\n"); @@ -381,6 +386,44 @@ static int stm32_spi_set_speed(struct udevice *bus, uint hz) return 0; } +static int _stm32_spi_set_wordlen(struct udevice *bus, unsigned int wordlen) +{ + struct stm32_spi_priv *priv = dev_get_priv(bus); + struct stm32_spi_plat *plat = dev_get_plat(bus); + void __iomem *base = plat->base; + bool spi_enabled; + + if ((wordlen - 1) < SPI_CFG1_DSIZE_MIN || + (wordlen - 1) > SPI_CFG1_DSIZE) { + dev_err(bus, "Cannot set wordlen to %u [%d - %d]\n", + wordlen, SPI_CFG1_DSIZE_MIN + 1, + SPI_CFG1_DSIZE + 1); + return -EINVAL; + } + + spi_enabled = stm32_spi_is_enabled(plat->base); + if (spi_enabled) + stm32_spi_disable(plat->base); + + dev_dbg(bus, "bits_per_word=%d\n", wordlen); + + priv->cur_bpw = wordlen; + clrsetbits_le32(base + STM32_SPI_CFG1, SPI_CFG1_DSIZE, + priv->cur_bpw - 1); + + if (spi_enabled) + stm32_spi_enable(plat->base); + + return 0; +} + +static int stm32_spi_set_wordlen(struct udevice *slave, unsigned int wordlen) +{ + struct udevice *bus = dev_get_parent(slave); + + return _stm32_spi_set_wordlen(bus, wordlen); +} + static int stm32_spi_xfer(struct udevice *slave, unsigned int bitlen, const void *dout, void *din, unsigned long flags) { @@ -394,11 +437,19 @@ static int stm32_spi_xfer(struct udevice *slave, unsigned int bitlen, u32 xferlen; u32 mode; int xfer_status = 0; + int nb_words; xferlen = bitlen / 8; - if (xferlen <= SPI_CR2_TSIZE) - writel(xferlen, base + STM32_SPI_CR2); + if (priv->cur_bpw <= 8) + nb_words = xferlen; + else if (priv->cur_bpw <= 16) + nb_words = DIV_ROUND_UP(xferlen * 8, 16); + else + nb_words = DIV_ROUND_UP(xferlen * 8, 32); + + if (nb_words <= SPI_CR2_TSIZE) + writel(nb_words, base + STM32_SPI_CR2); else return -EMSGSIZE; @@ -406,6 +457,8 @@ static int stm32_spi_xfer(struct udevice *slave, unsigned int bitlen, priv->rx_buf = din; priv->tx_len = priv->tx_buf ? xferlen : 0; priv->rx_len = priv->rx_buf ? xferlen : 0; + dev_dbg(bus, "bitlen: %d, xferlen: %d, nb_words: %d\n", + bitlen, xferlen, nb_words); mode = SPI_FULL_DUPLEX; if (!priv->tx_buf) @@ -567,9 +620,7 @@ static int stm32_spi_probe(struct udevice *dev) priv->fifo_size = stm32_spi_get_fifo_size(dev); priv->cur_mode = SPI_FULL_DUPLEX; priv->cur_xferlen = 0; - priv->cur_bpw = SPI_DEFAULT_WORDLEN; - clrsetbits_le32(base + STM32_SPI_CFG1, SPI_CFG1_DSIZE, - priv->cur_bpw - 1); + _stm32_spi_set_wordlen(dev, SPI_DEFAULT_WORDLEN); for (i = 0; i < ARRAY_SIZE(plat->cs_gpios); i++) { if (!dm_gpio_is_valid(&plat->cs_gpios[i])) @@ -630,6 +681,7 @@ static const struct dm_spi_ops stm32_spi_ops = { .release_bus = stm32_spi_release_bus, .set_mode = stm32_spi_set_mode, .set_speed = stm32_spi_set_speed, + .set_wordlen = stm32_spi_set_wordlen, .xfer = stm32_spi_xfer, };