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