xref: /openbmc/u-boot/drivers/mtd/spi/sf.c (revision 898e76c9)
1*898e76c9SJagannadha Sutradharudu Teki /*
2*898e76c9SJagannadha Sutradharudu Teki  * SPI flash interface
3*898e76c9SJagannadha Sutradharudu Teki  *
4*898e76c9SJagannadha Sutradharudu Teki  * Copyright (C) 2008 Atmel Corporation
5*898e76c9SJagannadha Sutradharudu Teki  * Copyright (C) 2010 Reinhard Meyer, EMK Elektronik
6*898e76c9SJagannadha Sutradharudu Teki  *
7*898e76c9SJagannadha Sutradharudu Teki  * Licensed under the GPL-2 or later.
8*898e76c9SJagannadha Sutradharudu Teki  */
9*898e76c9SJagannadha Sutradharudu Teki 
10*898e76c9SJagannadha Sutradharudu Teki #include <common.h>
11*898e76c9SJagannadha Sutradharudu Teki #include <spi.h>
12*898e76c9SJagannadha Sutradharudu Teki 
13*898e76c9SJagannadha Sutradharudu Teki static int spi_flash_read_write(struct spi_slave *spi,
14*898e76c9SJagannadha Sutradharudu Teki 				const u8 *cmd, size_t cmd_len,
15*898e76c9SJagannadha Sutradharudu Teki 				const u8 *data_out, u8 *data_in,
16*898e76c9SJagannadha Sutradharudu Teki 				size_t data_len)
17*898e76c9SJagannadha Sutradharudu Teki {
18*898e76c9SJagannadha Sutradharudu Teki 	unsigned long flags = SPI_XFER_BEGIN;
19*898e76c9SJagannadha Sutradharudu Teki 	int ret;
20*898e76c9SJagannadha Sutradharudu Teki 
21*898e76c9SJagannadha Sutradharudu Teki 	if (data_len == 0)
22*898e76c9SJagannadha Sutradharudu Teki 		flags |= SPI_XFER_END;
23*898e76c9SJagannadha Sutradharudu Teki 
24*898e76c9SJagannadha Sutradharudu Teki 	ret = spi_xfer(spi, cmd_len * 8, cmd, NULL, flags);
25*898e76c9SJagannadha Sutradharudu Teki 	if (ret) {
26*898e76c9SJagannadha Sutradharudu Teki 		debug("SF: Failed to send command (%zu bytes): %d\n",
27*898e76c9SJagannadha Sutradharudu Teki 		      cmd_len, ret);
28*898e76c9SJagannadha Sutradharudu Teki 	} else if (data_len != 0) {
29*898e76c9SJagannadha Sutradharudu Teki 		ret = spi_xfer(spi, data_len * 8, data_out, data_in,
30*898e76c9SJagannadha Sutradharudu Teki 					SPI_XFER_END);
31*898e76c9SJagannadha Sutradharudu Teki 		if (ret)
32*898e76c9SJagannadha Sutradharudu Teki 			debug("SF: Failed to transfer %zu bytes of data: %d\n",
33*898e76c9SJagannadha Sutradharudu Teki 			      data_len, ret);
34*898e76c9SJagannadha Sutradharudu Teki 	}
35*898e76c9SJagannadha Sutradharudu Teki 
36*898e76c9SJagannadha Sutradharudu Teki 	return ret;
37*898e76c9SJagannadha Sutradharudu Teki }
38*898e76c9SJagannadha Sutradharudu Teki 
39*898e76c9SJagannadha Sutradharudu Teki int spi_flash_cmd_read(struct spi_slave *spi, const u8 *cmd,
40*898e76c9SJagannadha Sutradharudu Teki 		size_t cmd_len, void *data, size_t data_len)
41*898e76c9SJagannadha Sutradharudu Teki {
42*898e76c9SJagannadha Sutradharudu Teki 	return spi_flash_read_write(spi, cmd, cmd_len, NULL, data, data_len);
43*898e76c9SJagannadha Sutradharudu Teki }
44*898e76c9SJagannadha Sutradharudu Teki 
45*898e76c9SJagannadha Sutradharudu Teki int spi_flash_cmd(struct spi_slave *spi, u8 cmd, void *response, size_t len)
46*898e76c9SJagannadha Sutradharudu Teki {
47*898e76c9SJagannadha Sutradharudu Teki 	return spi_flash_cmd_read(spi, &cmd, 1, response, len);
48*898e76c9SJagannadha Sutradharudu Teki }
49*898e76c9SJagannadha Sutradharudu Teki 
50*898e76c9SJagannadha Sutradharudu Teki int spi_flash_cmd_write(struct spi_slave *spi, const u8 *cmd, size_t cmd_len,
51*898e76c9SJagannadha Sutradharudu Teki 		const void *data, size_t data_len)
52*898e76c9SJagannadha Sutradharudu Teki {
53*898e76c9SJagannadha Sutradharudu Teki 	return spi_flash_read_write(spi, cmd, cmd_len, data, NULL, data_len);
54*898e76c9SJagannadha Sutradharudu Teki }
55