1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (c) 2014 Google, Inc
10 #include <spi_flash.h>
11 #include <dm/device-internal.h>
12 #include "sf_internal.h"
14 DECLARE_GLOBAL_DATA_PTR
;
16 int spi_flash_read_dm(struct udevice
*dev
, u32 offset
, size_t len
, void *buf
)
18 return log_ret(sf_get_ops(dev
)->read(dev
, offset
, len
, buf
));
21 int spi_flash_write_dm(struct udevice
*dev
, u32 offset
, size_t len
,
24 return log_ret(sf_get_ops(dev
)->write(dev
, offset
, len
, buf
));
27 int spi_flash_erase_dm(struct udevice
*dev
, u32 offset
, size_t len
)
29 return log_ret(sf_get_ops(dev
)->erase(dev
, offset
, len
));
32 int spl_flash_get_sw_write_prot(struct udevice
*dev
)
34 struct dm_spi_flash_ops
*ops
= sf_get_ops(dev
);
36 if (!ops
->get_sw_write_prot
)
38 return log_ret(ops
->get_sw_write_prot(dev
));
42 * TODO(sjg@chromium.org): This is an old-style function. We should remove
43 * it when all SPI flash drivers use dm
45 struct spi_flash
*spi_flash_probe(unsigned int bus
, unsigned int cs
,
46 unsigned int max_hz
, unsigned int spi_mode
)
50 if (spi_flash_probe_bus_cs(bus
, cs
, max_hz
, spi_mode
, &dev
))
53 return dev_get_uclass_priv(dev
);
56 void spi_flash_free(struct spi_flash
*flash
)
58 device_remove(flash
->spi
->dev
, DM_REMOVE_NORMAL
);
61 int spi_flash_probe_bus_cs(unsigned int busnum
, unsigned int cs
,
62 unsigned int max_hz
, unsigned int spi_mode
,
63 struct udevice
**devp
)
65 struct spi_slave
*slave
;
70 #if defined(CONFIG_SPL_BUILD) && CONFIG_IS_ENABLED(USE_TINY_PRINTF)
75 snprintf(name
, sizeof(name
), "spi_flash@%d:%d", busnum
, cs
);
78 ret
= spi_get_bus_and_cs(busnum
, cs
, max_hz
, spi_mode
,
79 "spi_flash_std", str
, &bus
, &slave
);
87 static int spi_flash_post_bind(struct udevice
*dev
)
89 #if defined(CONFIG_NEEDS_MANUAL_RELOC)
90 struct dm_spi_flash_ops
*ops
= sf_get_ops(dev
);
91 static int reloc_done
;
95 ops
->read
+= gd
->reloc_off
;
97 ops
->write
+= gd
->reloc_off
;
99 ops
->erase
+= gd
->reloc_off
;
107 UCLASS_DRIVER(spi_flash
) = {
108 .id
= UCLASS_SPI_FLASH
,
110 .post_bind
= spi_flash_post_bind
,
111 .per_device_auto_alloc_size
= sizeof(struct spi_flash
),