From nobody Tue Nov 14 21:48:35 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4SVKg810Klz50xJk; Tue, 14 Nov 2023 21:48:36 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4SVKg75wBsz3QTg; Tue, 14 Nov 2023 21:48:35 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1699998515; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=WzG31V9VWSh7rANDNa3qJOH6LdOj6HKVsSGVVioIeqY=; b=n7QmbVF/1g9ByE6QGQjADbRswnLYtWHntgG9d4/chyajI/U/mO1s3UaBbGgh2ZFA1iqbyL l/DnkmNgJ9vJZSHYTJomykUzUG1SHplf4GyCdCc2SpHSnLvOZG4MPRdqToSJKPgHrbQs+0 hqMDn1fX4YuBOQJ/irRNjMiWs3sOmq/Sumym5nOEwLMuWVCzoQxMhZHjijydr/ZdXE235Q 5fIvDyVVldI5GvxQ3rqPWlrtg6qMCU/ZPaxLy9nYTK1vZK62BMbldop3iGYszUZllrx6Fi awcJQT+qu+BRw6lDeHTemlNvaOJhmQUVEy4Wgk+xXcrGNkS1PJEqYFcAMZ16KQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1699998515; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=WzG31V9VWSh7rANDNa3qJOH6LdOj6HKVsSGVVioIeqY=; b=fVa20v4QQNoSI2MDCV5L8BFTMvJOErzRw07R1Q4LwTUWocC6tSOVtWru8fBLOuJEG/0eS/ xqJ280nKgXb8s9swnYmAnbV5SHPiv2hQIoE/5iOdzD4nJumxRbPwp+Oj8hevUApHtIjTkR Aiur+n/x15muj0La/7mTZ8VynSFYnyOW30sDmCN7YR+1NCH4jL1Fyc+eSIL4BNaIO/g5J0 t3OmWwZ4wf3lPFBPAzkd/aAL+gVKgQi5+nL/O1Kmmb5V2Isx/c1V5ymtK6xIqHTn6pvMg2 Rui02kSSLBV38v7xki0K+vH98h85bRzEmCFwz57gaJJfDZ6kAumAS/6hX6WFOQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1699998515; a=rsa-sha256; cv=none; b=rJdfUQEMYKrp23nx3hhXQfr9CSZkLNz1nFMkS64wNg127JDgpmnetAc3anjz0tjApvklqj bDt24pdekBcJhkPV8oILvLvCiD9Mb/NYNlG+NiRkxuIq4nb6i3Q/L+78jmuwNB+h4PhA8K EFLFnxULNqyHkLSGxwj7gNw7WMwZQG9iDITYZNru/p+ZpMgnw2gPdOdlxuQ2KJvHN/ZzyZ 9FJj6yiJE2gDZVt2rhEgNWf1oNf64lZePny0LFsuFaw8zELx2zzt9GCxR6bE8gWp25EtNQ FUesEVjfLWBySMygWU9oDicfP5NGZKIItTxlsjQkJvYDFdIq5XYsRSLirMg+9w== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4SVKg751t1z15Jf; Tue, 14 Nov 2023 21:48:35 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 3AELmZwO026248; Tue, 14 Nov 2023 21:48:35 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 3AELmZwa026245; Tue, 14 Nov 2023 21:48:35 GMT (envelope-from git) Date: Tue, 14 Nov 2023 21:48:35 GMT Message-Id: <202311142148.3AELmZwa026245@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Justin Hibbits Subject: git: 8ef8939fd458 - main - bcm2835/spi: Support SPI_FLAG_KEEP_CS List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhibbits X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 8ef8939fd4581572e17860d7089cc6e06fd0221f Auto-Submitted: auto-generated The branch main has been updated by jhibbits: URL: https://cgit.FreeBSD.org/src/commit/?id=8ef8939fd4581572e17860d7089cc6e06fd0221f commit 8ef8939fd4581572e17860d7089cc6e06fd0221f Author: Justin Hibbits AuthorDate: 2023-11-02 20:09:14 +0000 Commit: Justin Hibbits CommitDate: 2023-11-14 21:47:35 +0000 bcm2835/spi: Support SPI_FLAG_KEEP_CS Summary: 3c08673438 brought in SPI_FLAG_KEEP_CS to keep the SPI chip select held post-transfer completion. Add this support to bcm2835 SPI for SPI devices that need it. As part of this, the owner thread needed carried through so that no other thread can take over the SPI bus until the owner releases the chip select. Reviewed by: manu Sponsored by: Juniper Networks, Inc. Differential Revision: https://reviews.freebsd.org/D42599 --- sys/arm/broadcom/bcm2835/bcm2835_spi.c | 33 +++++++++++++++++++++---------- sys/arm/broadcom/bcm2835/bcm2835_spivar.h | 2 ++ 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/sys/arm/broadcom/bcm2835/bcm2835_spi.c b/sys/arm/broadcom/bcm2835/bcm2835_spi.c index 7d11e6aa50f7..b7f53be2da8d 100644 --- a/sys/arm/broadcom/bcm2835/bcm2835_spi.c +++ b/sys/arm/broadcom/bcm2835/bcm2835_spi.c @@ -388,8 +388,10 @@ bcm_spi_intr(void *arg) /* Check for end of transfer. */ if (sc->sc_written == sc->sc_len && sc->sc_read == sc->sc_len) { /* Disable interrupts and the SPI engine. */ - bcm_spi_modifyreg(sc, SPI_CS, - SPI_CS_TA | SPI_CS_INTR | SPI_CS_INTD, 0); + if ((sc->sc_flags & BCM_SPI_KEEP_CS) == 0) { + bcm_spi_modifyreg(sc, SPI_CS, + SPI_CS_TA | SPI_CS_INTR | SPI_CS_INTD, 0); + } wakeup(sc->sc_dev); } @@ -438,16 +440,23 @@ bcm_spi_transfer(device_t dev, device_t child, struct spi_command *cmd) /* If the controller is in use wait until it is available. */ BCM_SPI_LOCK(sc); - while (sc->sc_flags & BCM_SPI_BUSY) - mtx_sleep(dev, &sc->sc_mtx, 0, "bcm_spi", 0); + if (sc->sc_thread != curthread) + while (sc->sc_flags & BCM_SPI_BUSY) + mtx_sleep(dev, &sc->sc_mtx, 0, "bcm_spi", 0); /* Now we have control over SPI controller. */ sc->sc_flags = BCM_SPI_BUSY; + if ((cmd->flags & SPI_FLAG_KEEP_CS) != 0) + sc->sc_flags |= BCM_SPI_KEEP_CS; + /* Clear the FIFO. */ - bcm_spi_modifyreg(sc, SPI_CS, - SPI_CS_CLEAR_RXFIFO | SPI_CS_CLEAR_TXFIFO, - SPI_CS_CLEAR_RXFIFO | SPI_CS_CLEAR_TXFIFO); + if (sc->sc_thread != curthread) + bcm_spi_modifyreg(sc, SPI_CS, + SPI_CS_CLEAR_RXFIFO | SPI_CS_CLEAR_TXFIFO, + SPI_CS_CLEAR_RXFIFO | SPI_CS_CLEAR_TXFIFO); + + sc->sc_thread = curthread; /* Save a pointer to the SPI command. */ sc->sc_cmd = cmd; @@ -517,11 +526,15 @@ bcm_spi_transfer(device_t dev, device_t child, struct spi_command *cmd) err = mtx_sleep(dev, &sc->sc_mtx, 0, "bcm_spi", hz * 2); /* Make sure the SPI engine and interrupts are disabled. */ - bcm_spi_modifyreg(sc, SPI_CS, SPI_CS_TA | SPI_CS_INTR | SPI_CS_INTD, 0); + if (!(cmd->flags & SPI_FLAG_KEEP_CS)) { + bcm_spi_modifyreg(sc, + SPI_CS, SPI_CS_TA | SPI_CS_INTR | SPI_CS_INTD, 0); + sc->sc_thread = 0; + } - /* Release the controller and wakeup the next thread waiting for it. */ - sc->sc_flags = 0; wakeup_one(dev); + sc->sc_flags &= ~BCM_SPI_BUSY; + /* Release the controller and wakeup the next thread waiting for it. */ BCM_SPI_UNLOCK(sc); /* diff --git a/sys/arm/broadcom/bcm2835/bcm2835_spivar.h b/sys/arm/broadcom/bcm2835/bcm2835_spivar.h index 1c9a81edc777..85b13626a026 100644 --- a/sys/arm/broadcom/bcm2835/bcm2835_spivar.h +++ b/sys/arm/broadcom/bcm2835/bcm2835_spivar.h @@ -36,6 +36,7 @@ struct bcm_spi_softc { struct resource * sc_mem_res; struct resource * sc_irq_res; struct spi_command *sc_cmd; + struct thread *sc_thread; bus_space_tag_t sc_bst; bus_space_handle_t sc_bsh; uint32_t sc_len; @@ -46,6 +47,7 @@ struct bcm_spi_softc { }; #define BCM_SPI_BUSY 0x1 +#define BCM_SPI_KEEP_CS 0x2 #define BCM_SPI_WRITE(_sc, _off, _val) \ bus_space_write_4(_sc->sc_bst, _sc->sc_bsh, _off, _val)