xref: /aosp_15_r20/external/arm-trusted-firmware/drivers/brcm/spi_sf.c (revision 54fd6939e177f8ff529b10183254802c76df6d08)
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