1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2019-2020, Broadcom 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <common/debug.h> 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include <spi.h> 10*91f16700Schasinglulu 11*91f16700Schasinglulu #define BITS_PER_BYTE 8 12*91f16700Schasinglulu #define CMD_LEN1 1 13*91f16700Schasinglulu 14*91f16700Schasinglulu static int spi_flash_read_write(const uint8_t *cmd, 15*91f16700Schasinglulu size_t cmd_len, 16*91f16700Schasinglulu const uint8_t *data_out, 17*91f16700Schasinglulu uint8_t *data_in, 18*91f16700Schasinglulu size_t data_len) 19*91f16700Schasinglulu { 20*91f16700Schasinglulu unsigned long flags = SPI_XFER_BEGIN; 21*91f16700Schasinglulu int ret; 22*91f16700Schasinglulu 23*91f16700Schasinglulu if (data_len == 0) 24*91f16700Schasinglulu flags |= SPI_XFER_END; 25*91f16700Schasinglulu 26*91f16700Schasinglulu ret = spi_xfer(cmd_len * BITS_PER_BYTE, cmd, NULL, flags); 27*91f16700Schasinglulu if (ret) { 28*91f16700Schasinglulu ERROR("SF: Failed to send command (%zu bytes): %d\n", 29*91f16700Schasinglulu cmd_len, ret); 30*91f16700Schasinglulu } else if (data_len != 0) { 31*91f16700Schasinglulu ret = spi_xfer(data_len * BITS_PER_BYTE, data_out, 32*91f16700Schasinglulu data_in, SPI_XFER_END); 33*91f16700Schasinglulu if (ret) 34*91f16700Schasinglulu ERROR("SF: Failed to transfer %zu bytes of data: %d\n", 35*91f16700Schasinglulu data_len, ret); 36*91f16700Schasinglulu } 37*91f16700Schasinglulu 38*91f16700Schasinglulu return ret; 39*91f16700Schasinglulu } 40*91f16700Schasinglulu 41*91f16700Schasinglulu int spi_flash_cmd_read(const uint8_t *cmd, 42*91f16700Schasinglulu size_t cmd_len, 43*91f16700Schasinglulu void *data, 44*91f16700Schasinglulu size_t data_len) 45*91f16700Schasinglulu { 46*91f16700Schasinglulu return spi_flash_read_write(cmd, cmd_len, NULL, data, data_len); 47*91f16700Schasinglulu } 48*91f16700Schasinglulu 49*91f16700Schasinglulu int spi_flash_cmd(uint8_t cmd, void *response, size_t len) 50*91f16700Schasinglulu { 51*91f16700Schasinglulu return spi_flash_cmd_read(&cmd, CMD_LEN1, response, len); 52*91f16700Schasinglulu } 53*91f16700Schasinglulu 54*91f16700Schasinglulu int spi_flash_cmd_write(const uint8_t *cmd, 55*91f16700Schasinglulu size_t cmd_len, 56*91f16700Schasinglulu const void *data, 57*91f16700Schasinglulu size_t data_len) 58*91f16700Schasinglulu { 59*91f16700Schasinglulu return spi_flash_read_write(cmd, cmd_len, data, NULL, data_len); 60*91f16700Schasinglulu } 61