xref: /arm-trusted-firmware/drivers/brcm/spi_sf.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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