blob: e4c7f00a8656f5e679254a6f7360bba43b2acb8a [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001/*
2 * SPI flash interface
3 *
4 * Copyright (C) 2008 Atmel Corporation
5 * Copyright (C) 2010 Reinhard Meyer, EMK Elektronik
6 *
7 * SPDX-License-Identifier: GPL-2.0+
8 */
9
10#include <common.h>
11#include <spi.h>
12#include <asm/arch/pxa_dma.h>
13#include <asm/arch/pxa2xx_spi.h>
14
15static int spi_flash_read_write(struct spi_slave *spi,
16 const u8 *cmd, size_t cmd_len,
17 const u8 *data_out, u8 *data_in,
18 size_t data_len)
19{
20 unsigned long flags = SPI_XFER_BEGIN;
21 int ret;
22
23#ifdef CONFIG_SF_DUAL_FLASH
24 if (spi->flags & SPI_XFER_U_PAGE)
25 flags |= SPI_XFER_U_PAGE;
26#endif
27 if (data_len == 0)
28 flags |= SPI_XFER_END;
29
30 ret = spi_xfer(spi, cmd_len * 8, cmd, NULL, flags);
31 if (ret) {
32 debug("SF: Failed to send command (%zu bytes): %d\n",
33 cmd_len, ret);
34 } else if (data_len != 0) {
35 ret = spi_xfer(spi, data_len * 8, data_out, data_in,
36 SPI_XFER_END);
37 if (ret)
38 debug("SF: Failed to transfer %zu bytes of data: %d\n",
39 data_len, ret);
40 }
41
42 return ret;
43}
44
45int spi_flash_cmd_read(struct spi_slave *spi, const u8 *cmd,
46 size_t cmd_len, void *data, size_t data_len)
47{
48 return spi_flash_read_write(spi, cmd, cmd_len, NULL, data, data_len);
49}
50
51int spi_flash_cmd(struct spi_slave *spi, u8 cmd, void *response, size_t len)
52{
53 return spi_flash_cmd_read(spi, &cmd, 1, response, len);
54}
55
56int spi_flash_cmd_write(struct spi_slave *spi, const u8 *cmd, size_t cmd_len,
57 const void *data, size_t data_len)
58{
59 return spi_flash_read_write(spi, cmd, cmd_len, data, NULL, data_len);
60}
61
62#ifdef CONFIG_PXA_SPI_NOR
63int spi_flash_dma_read(struct spi_slave *spi, const u8 *cmd,
64 size_t cmd_len, void *data, size_t data_len)
65{
66 return spi_dma_xfer(spi, cmd, cmd_len, NULL, data, data_len);
67}
68
69int spi_flash_dma_write(struct spi_slave *spi, const u8 *cmd, size_t cmd_len,
70 const void *data, size_t data_len)
71{
72 return spi_dma_xfer(spi, cmd, cmd_len, data, NULL, data_len);
73}
74#endif
75
76
77