mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-25 06:00:43 +00:00
sf: Add spi_flash_alloc() to create a new SPI flash struct
At present it is difficult to extend the SPI flash structure since all devices allocate it themselves, and few of them zero all fields. Add a new function spi_flash_alloc() which can be used by SPI devices to perform this allocation, and thus ensure that all devices can better cope with SPI structure changes. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
d3504fee73
commit
b5aec1424d
2 changed files with 63 additions and 0 deletions
|
@ -401,6 +401,31 @@ err_claim_bus:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
void *spi_flash_do_alloc(int offset, int size, struct spi_slave *spi,
|
||||
const char *name)
|
||||
{
|
||||
struct spi_flash *flash;
|
||||
void *ptr;
|
||||
|
||||
ptr = malloc(size);
|
||||
if (!ptr) {
|
||||
debug("SF: Failed to allocate memory\n");
|
||||
return NULL;
|
||||
}
|
||||
memset(ptr, '\0', size);
|
||||
flash = (struct spi_flash *)(ptr + offset);
|
||||
|
||||
/* Set up some basic fields - caller will sort out sizes */
|
||||
flash->spi = spi;
|
||||
flash->name = name;
|
||||
|
||||
flash->read = spi_flash_cmd_read_fast;
|
||||
flash->write = spi_flash_cmd_write_multi;
|
||||
flash->erase = spi_flash_cmd_erase;
|
||||
|
||||
return flash;
|
||||
}
|
||||
|
||||
void spi_flash_free(struct spi_flash *flash)
|
||||
{
|
||||
spi_free_slave(flash->spi);
|
||||
|
|
|
@ -47,6 +47,44 @@ struct spi_flash {
|
|||
size_t len);
|
||||
};
|
||||
|
||||
/**
|
||||
* spi_flash_do_alloc - Allocate a new spi flash structure
|
||||
*
|
||||
* The structure is allocated and cleared with default values for
|
||||
* read, write and erase, which the caller can modify. The caller must set
|
||||
* up size, page_size and sector_size.
|
||||
*
|
||||
* Use the helper macro spi_flash_alloc() to call this.
|
||||
*
|
||||
* @offset: Offset of struct spi_slave within slave structure
|
||||
* @size: Size of slave structure
|
||||
* @spi: SPI slave
|
||||
* @name: Name of SPI flash device
|
||||
*/
|
||||
void *spi_flash_do_alloc(int offset, int size, struct spi_slave *spi,
|
||||
const char *name);
|
||||
|
||||
/**
|
||||
* spi_flash_alloc - Allocate a new SPI flash structure
|
||||
*
|
||||
* @_struct: Name of structure to allocate (e.g. struct ramtron_spi_fram). This
|
||||
* structure must contain a member 'struct spi_flash *flash'.
|
||||
* @spi: SPI slave
|
||||
* @name: Name of SPI flash device
|
||||
*/
|
||||
#define spi_flash_alloc(_struct, spi, name) \
|
||||
spi_flash_do_alloc(offsetof(_struct, flash), sizeof(_struct), \
|
||||
spi, name)
|
||||
|
||||
/**
|
||||
* spi_flash_alloc_base - Allocate a new SPI flash structure with no private data
|
||||
*
|
||||
* @spi: SPI slave
|
||||
* @name: Name of SPI flash device
|
||||
*/
|
||||
#define spi_flash_alloc_base(spi, name) \
|
||||
spi_flash_do_alloc(0, sizeof(struct spi_flash), spi, name)
|
||||
|
||||
struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
|
||||
unsigned int max_hz, unsigned int spi_mode);
|
||||
void spi_flash_free(struct spi_flash *flash);
|
||||
|
|
Loading…
Reference in a new issue