aboutsummaryrefslogtreecommitdiff
path: root/src/drivers/spi/spi-generic.c
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2018-01-29 11:30:17 -0700
committerAaron Durbin <adurbin@chromium.org>2018-01-30 05:37:47 +0000
commit1fcc9f3125f88595a89392e9736ebb01e7788842 (patch)
tree998555b6275b5b22e6e73f14ff2baab99841b32c /src/drivers/spi/spi-generic.c
parent3c0d7cfb947d12bdadc5d1898d23d29c93e0ec03 (diff)
drivers/spi: support cmd opcode deduction for spi_crop_chunk()
spi_crop_chunk() currently supports deducting the command length when determining maximum payload size in a transaction. Add support for deducting just the opcode part of the command by replacing deduct_cmd_len field to generic flags field. The two enums supported drive the logic within spi_crop_chunk(): SPI_CNTRLR_DEDUCT_CMD_LEN SPI_CNTRLR_DEDUCT_OPCODE_LEN All existing users of deduct_cmd_len were converted to using the flags field. BUG=b:65485690 Change-Id: I771fba684f0ed76ffdc8573aa10f775070edc691 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: https://review.coreboot.org/23491 Reviewed-by: Furquan Shaikh <furquan@google.com> Reviewed-by: Justin TerAvest <teravest@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/drivers/spi/spi-generic.c')
-rw-r--r--src/drivers/spi/spi-generic.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/drivers/spi/spi-generic.c b/src/drivers/spi/spi-generic.c
index 31a6bc3155..1fcc05d4f3 100644
--- a/src/drivers/spi/spi-generic.c
+++ b/src/drivers/spi/spi-generic.c
@@ -93,15 +93,24 @@ unsigned int spi_crop_chunk(const struct spi_slave *slave, unsigned int cmd_len,
{
const struct spi_ctrlr *ctrlr = slave->ctrlr;
unsigned int ctrlr_max;
+ bool deduct_cmd_len;
+ bool deduct_opcode_len;
if (!ctrlr)
return 0;
+ deduct_cmd_len = !!(ctrlr->flags & SPI_CNTRLR_DEDUCT_CMD_LEN);
+ deduct_opcode_len = !!(ctrlr->flags & SPI_CNTRLR_DEDUCT_OPCODE_LEN);
ctrlr_max = ctrlr->max_xfer_size;
assert (ctrlr_max != 0);
- if (ctrlr->deduct_cmd_len && (ctrlr_max > cmd_len))
+ /* Assume opcode is always one byte and deduct it from the cmd_len
+ as the hardware has a separate register for the opcode. */
+ if (deduct_opcode_len)
+ cmd_len--;
+
+ if (deduct_cmd_len && (ctrlr_max > cmd_len))
ctrlr_max -= cmd_len;
return min(ctrlr_max, buf_len);