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