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