aboutsummaryrefslogtreecommitdiffstats
path: root/package/boot/uboot-lantiq/patches/0004-sf-add-malloc-free-probe-functions-dedicated-for-SPL.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/boot/uboot-lantiq/patches/0004-sf-add-malloc-free-probe-functions-dedicated-for-SPL.patch')
-rw-r--r--package/boot/uboot-lantiq/patches/0004-sf-add-malloc-free-probe-functions-dedicated-for-SPL.patch131
1 files changed, 131 insertions, 0 deletions
diff --git a/package/boot/uboot-lantiq/patches/0004-sf-add-malloc-free-probe-functions-dedicated-for-SPL.patch b/package/boot/uboot-lantiq/patches/0004-sf-add-malloc-free-probe-functions-dedicated-for-SPL.patch
new file mode 100644
index 0000000..7a1ef3b
--- /dev/null
+++ b/package/boot/uboot-lantiq/patches/0004-sf-add-malloc-free-probe-functions-dedicated-for-SPL.patch
@@ -0,0 +1,131 @@
+From f9ab44c271fbd82a5702b6ba067fa90e33a30089 Mon Sep 17 00:00:00 2001
+From: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
+Date: Wed, 7 Nov 2012 15:29:27 +0100
+Subject: sf: add malloc-free probe functions dedicated for SPL
+
+Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
+
+--- a/drivers/mtd/spi/spi_flash.c
++++ b/drivers/mtd/spi/spi_flash.c
+@@ -339,11 +339,11 @@ static struct {
+ DECLARE_GLOBAL_DATA_PTR;
+ #endif
+
+-struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
+- unsigned int max_hz, unsigned int spi_mode)
++int spi_flash_probe_spl(struct spi_flash *flash, unsigned int bus,
++ unsigned int cs, unsigned int max_hz,
++ unsigned int spi_mode)
+ {
+ struct spi_slave *spi;
+- struct spi_flash *flash;
+ int ret, i, shift;
+ u8 idcode[IDCODE_LEN], *idp;
+ #ifdef CONFIG_NEEDS_MANUAL_RELOC
+@@ -359,8 +359,8 @@ struct spi_flash *spi_flash_probe(unsign
+
+ spi = spi_setup_slave(bus, cs, max_hz, spi_mode);
+ if (!spi) {
+- printf("SF: Failed to set up slave\n");
+- return NULL;
++ debug("SF: Failed to set up slave\n");
++ return -1;
+ }
+
+ ret = spi_claim_bus(spi);
+@@ -379,13 +379,6 @@ struct spi_flash *spi_flash_probe(unsign
+ print_buffer(0, idcode, 1, sizeof(idcode), 0);
+ #endif
+
+- flash = malloc(sizeof(*flash));
+- if (!flash) {
+- debug("SF: failed to alloc memory\n");
+- goto err_malloc;
+- }
+-
+- memset(flash, 0, sizeof(*flash));
+ flash->spi = spi;
+
+ /* count the number of continuation bytes */
+@@ -404,30 +397,58 @@ struct spi_flash *spi_flash_probe(unsign
+ }
+
+ if (ret <= 0) {
+- printf("SF: Unsupported manufacturer %02x\n", *idp);
++ debug("SF: Unsupported manufacturer %02x\n", *idp);
+ goto err_manufacturer_probe;
+ }
+
+- printf("SF: Detected %s with page size ", flash->name);
+- print_size(flash->sector_size, ", total ");
+- print_size(flash->size, "\n");
+-
+ spi_release_bus(spi);
+
+- return flash;
++ return 0;
+
+ err_manufacturer_probe:
+- free(flash);
+-err_malloc:
+ err_read_id:
+ spi_release_bus(spi);
+ err_claim_bus:
+ spi_free_slave(spi);
++
++ return ret;
++}
++
++struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
++ unsigned int max_hz, unsigned int spi_mode)
++{
++ struct spi_flash *flash;
++ int ret;
++
++ flash = malloc(sizeof(*flash));
++ if (!flash) {
++ debug("SF: Failed to malloc spi_flash\n");
++ return NULL;
++ }
++ memset(flash, 0, sizeof(*flash));
++
++ ret = spi_flash_probe_spl(flash, bus, cs, max_hz, spi_mode);
++ if (ret)
++ goto err_probe;
++
++ printf("SF: %s, page size ", flash->name);
++ print_size(flash->sector_size, ", total ");
++ print_size(flash->size, "\n");
++
++ return flash;
++
++err_probe:
++ free(flash);
+ return NULL;
+ }
+
+-void spi_flash_free(struct spi_flash *flash)
++void spi_flash_free_spl(struct spi_flash *flash)
+ {
+ spi_free_slave(flash->spi);
++}
++
++void spi_flash_free(struct spi_flash *flash)
++{
++ spi_flash_free_spl(flash);
+ free(flash);
+ }
+--- a/include/spi_flash.h
++++ b/include/spi_flash.h
+@@ -52,6 +52,11 @@ struct spi_flash *spi_flash_probe(unsign
+ unsigned int max_hz, unsigned int spi_mode);
+ void spi_flash_free(struct spi_flash *flash);
+
++int spi_flash_probe_spl(struct spi_flash *flash, unsigned int bus,
++ unsigned int cs, unsigned int max_hz,
++ unsigned int spi_mode);
++void spi_flash_free_spl(struct spi_flash *flash);
++
+ static inline int spi_flash_read(struct spi_flash *flash, u32 offset,
+ size_t len, void *buf)
+ {