xref: /rk3399_ARM-atf/drivers/brcm/spi_sf.c (revision 926cd70a0cc3a0cbf209a87765a8dc0b869798e3)
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 
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*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 
spi_flash_cmd_read(const uint8_t * cmd,size_t cmd_len,void * data,size_t data_len)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 
spi_flash_cmd(uint8_t cmd,void * response,size_t len)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 
spi_flash_cmd_write(const uint8_t * cmd,size_t cmd_len,const void * data,size_t data_len)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