1898e76c9SJagannadha Sutradharudu Teki /*
2898e76c9SJagannadha Sutradharudu Teki * SPI flash interface
3898e76c9SJagannadha Sutradharudu Teki *
4898e76c9SJagannadha Sutradharudu Teki * Copyright (C) 2008 Atmel Corporation
5898e76c9SJagannadha Sutradharudu Teki * Copyright (C) 2010 Reinhard Meyer, EMK Elektronik
6898e76c9SJagannadha Sutradharudu Teki *
7*0c88a84aSJagannadha Sutradharudu Teki * SPDX-License-Identifier: GPL-2.0+
8898e76c9SJagannadha Sutradharudu Teki */
9898e76c9SJagannadha Sutradharudu Teki
10898e76c9SJagannadha Sutradharudu Teki #include <common.h>
11898e76c9SJagannadha Sutradharudu Teki #include <spi.h>
12898e76c9SJagannadha Sutradharudu Teki
spi_flash_read_write(struct spi_slave * spi,const u8 * cmd,size_t cmd_len,const u8 * data_out,u8 * data_in,size_t data_len)13898e76c9SJagannadha Sutradharudu Teki static int spi_flash_read_write(struct spi_slave *spi,
14898e76c9SJagannadha Sutradharudu Teki const u8 *cmd, size_t cmd_len,
15898e76c9SJagannadha Sutradharudu Teki const u8 *data_out, u8 *data_in,
16898e76c9SJagannadha Sutradharudu Teki size_t data_len)
17898e76c9SJagannadha Sutradharudu Teki {
18898e76c9SJagannadha Sutradharudu Teki unsigned long flags = SPI_XFER_BEGIN;
19898e76c9SJagannadha Sutradharudu Teki int ret;
20898e76c9SJagannadha Sutradharudu Teki
21898e76c9SJagannadha Sutradharudu Teki if (data_len == 0)
22898e76c9SJagannadha Sutradharudu Teki flags |= SPI_XFER_END;
23898e76c9SJagannadha Sutradharudu Teki
24898e76c9SJagannadha Sutradharudu Teki ret = spi_xfer(spi, cmd_len * 8, cmd, NULL, flags);
25898e76c9SJagannadha Sutradharudu Teki if (ret) {
26898e76c9SJagannadha Sutradharudu Teki debug("SF: Failed to send command (%zu bytes): %d\n",
27898e76c9SJagannadha Sutradharudu Teki cmd_len, ret);
28898e76c9SJagannadha Sutradharudu Teki } else if (data_len != 0) {
29898e76c9SJagannadha Sutradharudu Teki ret = spi_xfer(spi, data_len * 8, data_out, data_in,
30898e76c9SJagannadha Sutradharudu Teki SPI_XFER_END);
31898e76c9SJagannadha Sutradharudu Teki if (ret)
32898e76c9SJagannadha Sutradharudu Teki debug("SF: Failed to transfer %zu bytes of data: %d\n",
33898e76c9SJagannadha Sutradharudu Teki data_len, ret);
34898e76c9SJagannadha Sutradharudu Teki }
35898e76c9SJagannadha Sutradharudu Teki
36898e76c9SJagannadha Sutradharudu Teki return ret;
37898e76c9SJagannadha Sutradharudu Teki }
38898e76c9SJagannadha Sutradharudu Teki
spi_flash_cmd_read(struct spi_slave * spi,const u8 * cmd,size_t cmd_len,void * data,size_t data_len)39898e76c9SJagannadha Sutradharudu Teki int spi_flash_cmd_read(struct spi_slave *spi, const u8 *cmd,
40898e76c9SJagannadha Sutradharudu Teki size_t cmd_len, void *data, size_t data_len)
41898e76c9SJagannadha Sutradharudu Teki {
42898e76c9SJagannadha Sutradharudu Teki return spi_flash_read_write(spi, cmd, cmd_len, NULL, data, data_len);
43898e76c9SJagannadha Sutradharudu Teki }
44898e76c9SJagannadha Sutradharudu Teki
spi_flash_cmd(struct spi_slave * spi,u8 cmd,void * response,size_t len)45898e76c9SJagannadha Sutradharudu Teki int spi_flash_cmd(struct spi_slave *spi, u8 cmd, void *response, size_t len)
46898e76c9SJagannadha Sutradharudu Teki {
47898e76c9SJagannadha Sutradharudu Teki return spi_flash_cmd_read(spi, &cmd, 1, response, len);
48898e76c9SJagannadha Sutradharudu Teki }
49898e76c9SJagannadha Sutradharudu Teki
spi_flash_cmd_write(struct spi_slave * spi,const u8 * cmd,size_t cmd_len,const void * data,size_t data_len)50898e76c9SJagannadha Sutradharudu Teki int spi_flash_cmd_write(struct spi_slave *spi, const u8 *cmd, size_t cmd_len,
51898e76c9SJagannadha Sutradharudu Teki const void *data, size_t data_len)
52898e76c9SJagannadha Sutradharudu Teki {
53898e76c9SJagannadha Sutradharudu Teki return spi_flash_read_write(spi, cmd, cmd_len, data, NULL, data_len);
54898e76c9SJagannadha Sutradharudu Teki }
55