i2c: cm5200: Drop use of CONFIG_I2C_HARD
[platform/kernel/u-boot.git] / common / env_sf.c
index e928f57..9944602 100644 (file)
 #include <spi_flash.h>
 #include <search.h>
 #include <errno.h>
+#include <dm/device-internal.h>
 
 #ifndef CONFIG_ENV_SPI_BUS
-# define CONFIG_ENV_SPI_BUS    0
+# define CONFIG_ENV_SPI_BUS    CONFIG_SF_DEFAULT_BUS
 #endif
 #ifndef CONFIG_ENV_SPI_CS
-# define CONFIG_ENV_SPI_CS     0
+# define CONFIG_ENV_SPI_CS     CONFIG_SF_DEFAULT_CS
 #endif
 #ifndef CONFIG_ENV_SPI_MAX_HZ
-# define CONFIG_ENV_SPI_MAX_HZ 1000000
+# define CONFIG_ENV_SPI_MAX_HZ CONFIG_SF_DEFAULT_SPEED
 #endif
 #ifndef CONFIG_ENV_SPI_MODE
-# define CONFIG_ENV_SPI_MODE   SPI_MODE_3
+# define CONFIG_ENV_SPI_MODE   CONFIG_SF_DEFAULT_MODE
 #endif
 
 #ifdef CONFIG_ENV_OFFSET_REDUND
@@ -44,14 +45,23 @@ char *env_name_spec = "SPI Flash";
 
 static struct spi_flash *env_flash;
 
-#if defined(CONFIG_ENV_OFFSET_REDUND)
-int saveenv(void)
+static int setup_flash_device(void)
 {
-       env_t   env_new;
-       char    *saved_buffer = NULL, flag = OBSOLETE_FLAG;
-       u32     saved_size, saved_offset, sector = 1;
+#ifdef CONFIG_DM_SPI_FLASH
+       struct udevice *new;
        int     ret;
 
+       /* speed and mode will be read from DT */
+       ret = spi_flash_probe_bus_cs(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS,
+                                    0, 0, &new);
+       if (ret) {
+               set_default_env("!spi_flash_probe_bus_cs() failed");
+               return 1;
+       }
+
+       env_flash = dev_get_uclass_priv(new);
+#else
+
        if (!env_flash) {
                env_flash = spi_flash_probe(CONFIG_ENV_SPI_BUS,
                        CONFIG_ENV_SPI_CS,
@@ -61,6 +71,21 @@ int saveenv(void)
                        return 1;
                }
        }
+#endif
+       return 0;
+}
+
+#if defined(CONFIG_ENV_OFFSET_REDUND)
+int saveenv(void)
+{
+       env_t   env_new;
+       char    *saved_buffer = NULL, flag = OBSOLETE_FLAG;
+       u32     saved_size, saved_offset, sector;
+       int     ret;
+
+       ret = setup_flash_device();
+       if (ret)
+               return ret;
 
        ret = env_export(&env_new);
        if (ret)
@@ -79,7 +104,7 @@ int saveenv(void)
        if (CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE) {
                saved_size = CONFIG_ENV_SECT_SIZE - CONFIG_ENV_SIZE;
                saved_offset = env_new_offset + CONFIG_ENV_SIZE;
-               saved_buffer = malloc(saved_size);
+               saved_buffer = memalign(ARCH_DMA_MINALIGN, saved_size);
                if (!saved_buffer) {
                        ret = 1;
                        goto done;
@@ -90,11 +115,7 @@ int saveenv(void)
                        goto done;
        }
 
-       if (CONFIG_ENV_SIZE > CONFIG_ENV_SECT_SIZE) {
-               sector = CONFIG_ENV_SIZE / CONFIG_ENV_SECT_SIZE;
-               if (CONFIG_ENV_SIZE % CONFIG_ENV_SECT_SIZE)
-                       sector++;
-       }
+       sector = DIV_ROUND_UP(CONFIG_ENV_SIZE, CONFIG_ENV_SECT_SIZE);
 
        puts("Erasing SPI flash...");
        ret = spi_flash_erase(env_flash, env_new_offset,
@@ -142,20 +163,18 @@ void env_relocate_spec(void)
        env_t *tmp_env2 = NULL;
        env_t *ep = NULL;
 
-       tmp_env1 = (env_t *)malloc(CONFIG_ENV_SIZE);
-       tmp_env2 = (env_t *)malloc(CONFIG_ENV_SIZE);
-
+       tmp_env1 = (env_t *)memalign(ARCH_DMA_MINALIGN,
+                       CONFIG_ENV_SIZE);
+       tmp_env2 = (env_t *)memalign(ARCH_DMA_MINALIGN,
+                       CONFIG_ENV_SIZE);
        if (!tmp_env1 || !tmp_env2) {
                set_default_env("!malloc() failed");
                goto out;
        }
 
-       env_flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS,
-                       CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE);
-       if (!env_flash) {
-               set_default_env("!spi_flash_probe() failed");
+       ret = setup_flash_device();
+       if (ret)
                goto out;
-       }
 
        ret = spi_flash_read(env_flash, CONFIG_ENV_OFFSET,
                                CONFIG_ENV_SIZE, tmp_env1);
@@ -209,7 +228,7 @@ void env_relocate_spec(void)
        ret = env_import((char *)ep, 0);
        if (!ret) {
                error("Cannot import environment: errno = %d\n", errno);
-               set_default_env("env_import failed");
+               set_default_env("!env_import failed");
        }
 
 err_read:
@@ -222,20 +241,14 @@ out:
 #else
 int saveenv(void)
 {
-       u32     saved_size, saved_offset, sector = 1;
+       u32     saved_size, saved_offset, sector;
        char    *saved_buffer = NULL;
        int     ret = 1;
        env_t   env_new;
 
-       if (!env_flash) {
-               env_flash = spi_flash_probe(CONFIG_ENV_SPI_BUS,
-                       CONFIG_ENV_SPI_CS,
-                       CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE);
-               if (!env_flash) {
-                       set_default_env("!spi_flash_probe() failed");
-                       return 1;
-               }
-       }
+       ret = setup_flash_device();
+       if (ret)
+               return ret;
 
        /* Is the sector larger than the env (i.e. embedded) */
        if (CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE) {
@@ -251,16 +264,12 @@ int saveenv(void)
                        goto done;
        }
 
-       if (CONFIG_ENV_SIZE > CONFIG_ENV_SECT_SIZE) {
-               sector = CONFIG_ENV_SIZE / CONFIG_ENV_SECT_SIZE;
-               if (CONFIG_ENV_SIZE % CONFIG_ENV_SECT_SIZE)
-                       sector++;
-       }
-
        ret = env_export(&env_new);
        if (ret)
                goto done;
 
+       sector = DIV_ROUND_UP(CONFIG_ENV_SIZE, CONFIG_ENV_SECT_SIZE);
+
        puts("Erasing SPI flash...");
        ret = spi_flash_erase(env_flash, CONFIG_ENV_OFFSET,
                sector * CONFIG_ENV_SECT_SIZE);
@@ -295,31 +304,32 @@ void env_relocate_spec(void)
        int ret;
        char *buf = NULL;
 
-       buf = (char *)malloc(CONFIG_ENV_SIZE);
-       env_flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS,
-                       CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE);
-       if (!env_flash) {
-               set_default_env("!spi_flash_probe() failed");
-               if (buf)
-                       free(buf);
+       buf = (char *)memalign(ARCH_DMA_MINALIGN, CONFIG_ENV_SIZE);
+       if (!buf) {
+               set_default_env("!malloc() failed");
                return;
        }
 
+       ret = setup_flash_device();
+       if (ret)
+               goto out;
+
        ret = spi_flash_read(env_flash,
                CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE, buf);
        if (ret) {
                set_default_env("!spi_flash_read() failed");
-               goto out;
+               goto err_read;
        }
 
        ret = env_import(buf, 1);
        if (ret)
                gd->env_valid = 1;
-out:
+
+err_read:
        spi_flash_free(env_flash);
-       if (buf)
-               free(buf);
        env_flash = NULL;
+out:
+       free(buf);
 }
 #endif