From patchwork Sat Feb 21 09:42:20 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dario Binacchi X-Patchwork-Id: 4478 Return-Path: X-Original-To: linux-amarula@patchwork.amarulasolutions.com Delivered-To: linux-amarula@patchwork.amarulasolutions.com Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by ganimede.amarulasolutions.com (Postfix) with ESMTPS id C79643F184 for ; Sat, 21 Feb 2026 10:43:09 +0100 (CET) Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4837b7903f3sf33067575e9.2 for ; Sat, 21 Feb 2026 01:43:09 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1771666989; cv=pass; d=google.com; s=arc-20240605; b=Le2UtMuGe+diYRT/9x8BzVWLzWiT4/5fQPM4/lN1hQAO8qE+RsomsVb3AFs3s10OBm ymLdgBC+VyUwhCKJF0FHpb/RjYX5x4eBucatqsBhaDyt5w+M29Gr5h+p+RHcV5Lir9IG aJ2XGY5CHrRXBv03vueRkVayLB1mtDbo7xF4enNo3KCqr1NsiUC1Qc7NmDFScO/RzdaE 2EXo3T8ykrQLHbco0eF/rteP+MEz4lSM3jhHZNCPOCol/gVfJHSPW2BRTWMxoRBGiUrm xbzs40XazYxkZtS9OOHiry+Cms40zAJDB8ayxWHh/tcfw7ldBjNV/K+Ka3/NzdGw7v9d o6pA== 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=A/Ph0JLLDlk7ZggAvhNFyEKPIrTsUq+ymQ48Mm9kM5M=; fh=YwfAwZrlqRLyldsO72da5ZgdYfo5CLyMtuvq+xHHt/0=; b=i4XF36gwNObOVSLf7ohqs0/hf41nH5pwcR0udRm3xFZbZXJ0WYaAxKcqm7D6uphPUF BHZiG7+xPzXo/ert6tH70jyxv7msLduUiq28693puj5+7Y0A2aKHV75toLJpLWw5eSER 1n+Y9IFqPEKaAFLM7VEItSN2fPQpz848GWoRqU6JW+UM+hBHK+gJdwKvPwSNf7lZOB+Y X3HuMCYEQeUmsf8zMomqIlCd1ogwkp2I3cJ/R364EOCz3wNE7pa5NFREy3VQzLds0It+ FRzyLdNWoR/dSEot19AOFxIkUe3Rz9K6bCm2o06sqln183QOD0UYDXQ+CGwyl7K8Rw0J 294Q==; darn=patchwork.amarulasolutions.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=kWn5sDfB; 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=1771666989; x=1772271789; 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=A/Ph0JLLDlk7ZggAvhNFyEKPIrTsUq+ymQ48Mm9kM5M=; b=k1BQh0u0/0/knFXq67LlLLlCBplQDSQCiLXPr+BCgcLWjWi54r8caQ1ClI/1/eoI+p ORCZ+A2uEgUGdY25oR6r5/KEK7TxZ2UhkkRFsbodyiZujQc4Qtu1cu37oCs4ln4pY4d/ 0Wib170WJRNRJWqeYRrXEWv2Uw7wlM+9Q/tmk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771666989; x=1772271789; 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=A/Ph0JLLDlk7ZggAvhNFyEKPIrTsUq+ymQ48Mm9kM5M=; b=At2wJayskaAZEfJojMkfNxYB0YxXOXsRheKnusVrwceDkhJcsQmeIDXKPg1l+EXprP vZe3AvATdsmdNXYrDlWJ50Eizr0h16a4kQF6L1CVfHQN/96vIJgEiJ39WluekaEM3vwJ UkxHAT3LvtJr7Ok5KYHMyA04qAh48Yi4bOplQ4SdimkSU5C6ZXJ8Ee5b4vaOM2g9GvS0 s28kgRd9vVKshij4eJOICihbUjKwKGn67r6wByzE1lXjy4teHBc4CyQ7knljJYegZNAg 1LJlZNtYduhro11UfAdOrpsmTQpWWe6p4W4bvfPXLM7n6ESKv8lDOcGk6NdP7833QYVQ A5ug== X-Forwarded-Encrypted: i=2; AJvYcCUiqVrM0wITAf4LeMLO7pARGg35iF592pqm1QkGcuieWyLyZi8M7GXhDshzYJsT7qV62/kX7OIioHuNpDVa@patchwork.amarulasolutions.com X-Gm-Message-State: AOJu0YxTUsvspgpBv1+EhfP1sfPuwzlDFA6hWfR1DIOLuF4aok/INIKm Uwsi/NNaPFydC8jDgvpEGbajUlBpiTEB3to5F1JyklP7m+uhTqJ9yaq1wJqWTJbhplhR/w== X-Received: by 2002:a05:6000:288c:b0:437:75c1:578d with SMTP id ffacd0b85a97d-4396f14cd46mr4986112f8f.11.1771666989363; Sat, 21 Feb 2026 01:43:09 -0800 (PST) X-BeenThere: linux-amarula@amarulasolutions.com; h="AV1CL+GtKKt/OmQro5SVitD/7w4pkB5ehyp3xhla/urEQfzhmg==" Received: by 2002:a05:6000:290d:b0:435:a126:d553 with SMTP id ffacd0b85a97d-4378f1ed796ls6839627f8f.2.-pod-prod-07-eu; Sat, 21 Feb 2026 01:43:07 -0800 (PST) X-Forwarded-Encrypted: i=2; AJvYcCWxaj8YIoFOZjLwdr9F8XZKnQueI4QxCbTRFqnXr2vr7UQBPbTX3oHRJwinSts/M3L6V2mT0/fcQuYeByql@amarulasolutions.com X-Received: by 2002:a05:6000:1a8a:b0:437:6e63:9172 with SMTP id ffacd0b85a97d-4396f14cb2fmr4367724f8f.4.1771666987194; Sat, 21 Feb 2026 01:43:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1771666987; cv=none; d=google.com; s=arc-20240605; b=Gk8VdGZWILz3B280KzkerHD1sDsD2yQgGMXg/KFaDwvyU5Eh5FpBJhqydr0XCpTl1c Pmz3RVHA8qSkO1Y9y1dTXJZvMs0HBGjt6V/Y4Ke3mj0spm4pCNMBBPmDpxa235j3w+oL uCGMi1+5PCAu02KIcQLL7STDAhAHP0a1bOGO2P9OLztUXTi9DqLp715qCYTTaPkNCBo7 bFdRR2JYR/DWmErjd/dnJ8moG0b0bA8J1nhm9BkbHyDULGI0zxySb0bYZEtLIGQmyoVC M3o3utoYgh+UuslBWSVehwifwwTXidyL4psn4rJ4munls175ZVp+z8TabHYJKg7Da+yt 4EDQ== 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=HVJjtEbwe5nCMncteEhAFW8OsYXtxdYRfirYYIp13Nc=; fh=uOB0drQLx/551UWUmOomVVu+1RoF8Oy4+NyCriUFoZU=; b=FEnCH7Jm2y1FEwH5TNsufoq+ZnVJaF32oeo061qHYUJk25HCUdDoekifnzC7RvG78p sfh4LWeCB4ue+CtXlWo9OmqheHtw4Gwh3NOFO0I7+B+RgjYeLd8I/fjVcyLe0q/skfDE lujIvv1V4uWXZ4WKfRecKPj+qU+xrQ2SNJJayXFgN1xliHfUvvwlwCQEjv1xx6ssF9W1 rEU4U+k6mjZxS99xf++RgLN8IzTQssuOZilAiu9BNG9O6y0wIyc+FfZKC0x/GDwxx0AP m9/EpgZq1IR9iLpWZDRKa7q+RjhlzSwn8N6Av2WLZVKidfeEy5VahztPp+5A/1nBoSsn 9Gtg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=kWn5sDfB; 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 ffacd0b85a97d-43970d8718bsor233230f8f.18.2026.02.21.01.43.07 for (Google Transport Security); Sat, 21 Feb 2026 01:43:07 -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; AJvYcCU1rPFKben75tPJXp8RMrPuAjbb8bjm+Tb4TEck20C6uwajKWLgoHAD6GcguWbzFRoMju556/VET5qEndu/@amarulasolutions.com X-Gm-Gg: AZuq6aIhBt9Ke3ZEl71Q74KV6mFVgnVDhWd7hoUG+c+0NCGdjm1+ErdSaM9yMUm/PSu 0104UCxZza0DAjcfwTCeQSpD91xjugGpo/Xo2+ppydvFzgNNCmIXmDro9GjmZPTbpmEksxksEGH 0QBOXOg/jKoZkoJ3nFokjrr+s0ypdoxt0GWgT4mvgDdl+9fxWknrji+hGliX4r2j/vRZFLv9xhu AgJ/kBHhu0WQH4gyU7y1lodA8H6BPHtIsXQsUE0dG29N2HOglumhWjMal5IsecDL8ldLcWTv2Bv 050et8scvbGGF5WTbpkluEv6HwK7TK/gsvh8AFhFe94//+rB43jR7Z2xiQHTJzbqpsf+oKls+nj AnGozVgURyeZ030W8g/Alp+vVDSXHOmhTgt1OtfiuwcbGVHIuVQW0+8Jydo08bUo0OnAm7ewK/T kOuMVN4HG6QP59mzMBR0zUbc91m+uSp9FMuwxL7flT58c0s/FaEYouI0Q08568sHWZsnzSwrPpF MGK3ROVAvA9vJNZ3zUp7nPUPityZ/wUlFT6g8nt0BCguhbW3aH12hYibFxa5adjetoFcfWmsYbU gquqO06YoXIvvJHRa3zL1agp X-Received: by 2002:a05:600c:3553:b0:480:6910:abd1 with SMTP id 5b1f17b1804b1-483a962e49dmr44613365e9.18.1771666986738; Sat, 21 Feb 2026 01:43:06 -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-483a42f3968sm42694225e9.19.2026.02.21.01.43.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Feb 2026 01:43:05 -0800 (PST) From: Dario Binacchi To: u-boot@lists.denx.de Cc: Patrice Chotard , Patrick Delaunay , linux-amarula@amarulasolutions.com, Dario Binacchi , Jagan Teki , Tom Rini , uboot-stm32@st-md-mailman.stormreply.com Subject: [PATCH v2 6/8] spi: stm32: add support for bits-per-word setting Date: Sat, 21 Feb 2026 10:42:20 +0100 Message-ID: <20260221094252.3103034-7-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260221094252.3103034-1-dario.binacchi@amarulasolutions.com> References: <20260221094252.3103034-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=kWn5sDfB; 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 --- (no changes since v1) 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, };