summaryrefslogtreecommitdiff
path: root/src/soc/imgtec/pistachio/spi.c
diff options
context:
space:
mode:
authorFurquan Shaikh <furquan@chromium.org>2016-11-17 16:17:37 -0800
committerFurquan Shaikh <furquan@google.com>2016-11-22 17:33:33 +0100
commitdc34fb60b4151a7fad3882cc85dac4379f2d8dd8 (patch)
treee1ef39bd00fa5c252fb200a231d6e67915db73fa /src/soc/imgtec/pistachio/spi.c
parentc28984d9ea08e7d995ef9fc8064c10ec0c0d9d77 (diff)
downloadcoreboot-dc34fb60b4151a7fad3882cc85dac4379f2d8dd8.tar.xz
spi: Get rid of max_transfer_size parameter in spi_slave structure
max_transfer_size is a property of the SPI controller and not of the spi slave. Also, this is used only on one SoC currently. There is no need to handle this at the spi flash layer. This change moves the handling of max_transfer_size to SoC SPI driver and gets rid of the max_transfer_size parameter. BUG=None BRANCH=None TEST=Compiles successfully. Change-Id: I19a1d0a83395a58c2bc1614b24518a3220945a60 Signed-off-by: Furquan Shaikh <furquan@chromium.org> Reviewed-on: https://review.coreboot.org/17463 Reviewed-by: Aaron Durbin <adurbin@chromium.org> Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Tested-by: build bot (Jenkins)
Diffstat (limited to 'src/soc/imgtec/pistachio/spi.c')
-rw-r--r--src/soc/imgtec/pistachio/spi.c57
1 files changed, 44 insertions, 13 deletions
diff --git a/src/soc/imgtec/pistachio/spi.c b/src/soc/imgtec/pistachio/spi.c
index 87dd66fd59..2b4b01c3a7 100644
--- a/src/soc/imgtec/pistachio/spi.c
+++ b/src/soc/imgtec/pistachio/spi.c
@@ -445,7 +445,6 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs)
img_slave->base = base;
slave->bus = bus;
slave->cs = cs;
- slave->max_transfer_size = IMGTEC_SPI_MAX_TRANSFER_SIZE;
device_parameters->bitrate = 64;
device_parameters->cs_setup = 0;
@@ -509,22 +508,12 @@ void spi_release_bus(struct spi_slave *slave)
}
/* SPI transfer */
-int spi_xfer(struct spi_slave *slave, const void *dout, unsigned int bytesout,
- void *din, unsigned int bytesin)
+static int do_spi_xfer(struct spi_slave *slave, const void *dout,
+ unsigned int bytesout, void *din, unsigned int bytesin)
{
struct spim_buffer buff_0;
struct spim_buffer buff_1;
- if (!slave) {
- printk(BIOS_ERR, "%s: Error: slave was not set up.\n",
- __func__);
- return -SPIM_API_NOT_INITIALISED;
- }
- if (!dout && !din) {
- printk(BIOS_ERR, "%s: Error: both buffers are NULL.\n",
- __func__);
- return -SPIM_INVALID_TRANSFER_DESC;
- }
/* If we only have a read or a write operation
* the parameters for it will be put in the first buffer
*/
@@ -543,6 +532,48 @@ int spi_xfer(struct spi_slave *slave, const void *dout, unsigned int bytesout,
return spim_io(slave, &buff_0, (dout && din) ? &buff_1 : NULL);
}
+int spi_xfer(struct spi_slave *slave, const void *dout, unsigned int bytesout,
+ void *din, unsigned int bytesin)
+{
+ unsigned int in_sz, out_sz;
+ int ret;
+
+ if (!slave) {
+ printk(BIOS_ERR, "%s: Error: slave was not set up.\n",
+ __func__);
+ return -SPIM_API_NOT_INITIALISED;
+ }
+ if (!dout && !din) {
+ printk(BIOS_ERR, "%s: Error: both buffers are NULL.\n",
+ __func__);
+ return -SPIM_INVALID_TRANSFER_DESC;
+ }
+
+ while (bytesin || bytesout) {
+ in_sz = min(IMGTEC_SPI_MAX_TRANSFER_SIZE, bytesin);
+ out_sz = min(IMGTEC_SPI_MAX_TRANSFER_SIZE, bytesout);
+
+ ret = do_spi_xfer(slave, dout, out_sz, din, in_sz);
+ if (ret)
+ return ret;
+
+ bytesin -= in_sz;
+ bytesout -= out_sz;
+
+ if (bytesin)
+ din += in_sz;
+ else
+ din = NULL;
+
+ if (bytesout)
+ dout += out_sz;
+ else
+ dout = NULL;
+ }
+
+ return SPIM_OK;
+}
+
unsigned int spi_crop_chunk(unsigned int cmd_len, unsigned int buf_len)
{
return min(IMGTEC_SPI_MAX_TRANSFER_SIZE, buf_len);