From 127a55e91d46623f700ba39f2679e3606ed0b2fb Mon Sep 17 00:00:00 2001 From: Julius Werner Date: Thu, 6 Jun 2019 17:09:58 -0700 Subject: sdm845: qspi: Add Dual SPI support This patch adds support for the Dual SPI feature (SDR 2-bit in Qualcomm terminology) to the QSPI controller. Change-Id: I7aed2ccd9627f5de5dd760b418f74d56d2c031d3 Signed-off-by: Julius Werner Reviewed-on: https://review.coreboot.org/c/coreboot/+/33284 Reviewed-by: Furquan Shaikh Reviewed-by: Aaron Durbin Tested-by: build bot (Jenkins) --- src/soc/qualcomm/sdm845/include/soc/qspi.h | 2 ++ src/soc/qualcomm/sdm845/qspi.c | 18 ++++++++++++++---- src/soc/qualcomm/sdm845/spi.c | 1 + 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/soc/qualcomm/sdm845/include/soc/qspi.h b/src/soc/qualcomm/sdm845/include/soc/qspi.h index ac9fd50f1b..3f83421e72 100644 --- a/src/soc/qualcomm/sdm845/include/soc/qspi.h +++ b/src/soc/qualcomm/sdm845/include/soc/qspi.h @@ -116,4 +116,6 @@ int sdm845_setup_bus(const struct spi_slave *slave); void sdm845_release_bus(const struct spi_slave *slave); int sdm845_xfer(const struct spi_slave *slave, const void *dout, size_t out_bytes, void *din, size_t in_bytes); +int sdm845_xfer_dual(const struct spi_slave *slave, const void *dout, + size_t out_bytes, void *din, size_t in_bytes); #endif /* __SOC_QUALCOMM_SDM845_QSPI_H__ */ diff --git a/src/soc/qualcomm/sdm845/qspi.c b/src/soc/qualcomm/sdm845/qspi.c index b9a5194a10..cced567a87 100644 --- a/src/soc/qualcomm/sdm845/qspi.c +++ b/src/soc/qualcomm/sdm845/qspi.c @@ -277,11 +277,9 @@ void sdm845_release_bus(const struct spi_slave *slave) cs_change(CS_DEASSERT); } -int sdm845_xfer(const struct spi_slave *slave, const void *dout, - size_t out_bytes, void *din, size_t in_bytes) +static int xfer(enum qspi_mode mode, const void *dout, size_t out_bytes, + void *din, size_t in_bytes) { - enum qspi_mode mode = SDR_1BIT; - if ((out_bytes && !dout) || (in_bytes && !din) || (in_bytes && out_bytes)) { return -1; @@ -294,3 +292,15 @@ int sdm845_xfer(const struct spi_slave *slave, const void *dout, return 0; } + +int sdm845_xfer(const struct spi_slave *slave, const void *dout, + size_t out_bytes, void *din, size_t in_bytes) +{ + return xfer(SDR_1BIT, dout, out_bytes, din, in_bytes); +} + +int sdm845_xfer_dual(const struct spi_slave *slave, const void *dout, + size_t out_bytes, void *din, size_t in_bytes) +{ + return xfer(SDR_2BIT, dout, out_bytes, din, in_bytes); +} diff --git a/src/soc/qualcomm/sdm845/spi.c b/src/soc/qualcomm/sdm845/spi.c index e276e1d214..27aafa7b72 100644 --- a/src/soc/qualcomm/sdm845/spi.c +++ b/src/soc/qualcomm/sdm845/spi.c @@ -21,6 +21,7 @@ static const struct spi_ctrlr spi_ctrlr = { .claim_bus = sdm845_claim_bus, .release_bus = sdm845_release_bus, .xfer = sdm845_xfer, + .xfer_dual = sdm845_xfer_dual, .max_xfer_size = QSPI_MAX_PACKET_COUNT, }; -- cgit v1.2.3