common: convert compulab splash load code to common code
authorNikita Kiryanov <nikita@compulab.co.il>
Wed, 14 Jan 2015 08:42:54 +0000 (10:42 +0200)
committerStefano Babic <sbabic@denx.de>
Thu, 29 Jan 2015 16:44:08 +0000 (17:44 +0100)
Move board/compulab/common/splash.c code to
common/splash_source.c to make it available for everybody. This move
renames cl_splash_screen_prepare() to splash_source_load(), and
the compilation of this code is conditional on CONFIG_SPLASH_SOURCE.

splash_source features:
* Provide a standardized way for declaring board specific splash screen
  locations
* Provide existing routines for auto loading the splash image from the
  locations as declared by the board
* Introduce the "splashsource" environment variable, which makes it
  possible to select the splash image source.

cm-t35 and cm-fx6 are updated to use the modified version.

Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il>
Cc: Stefano Babic <sbabic@denx.de>
Cc: Tom Rini <trini@ti.com>
Cc: Igor Grinberg <grinberg@compulab.co.il>
Cc: Anatolij Gustschin <agust@denx.de>
Reviewed-by: Tom Rini <trini@ti.com>
Acked-by: Igor Grinberg <grinberg@compulab.co.il>
board/compulab/cm_fx6/cm_fx6.c
board/compulab/cm_t35/cm_t35.c
board/compulab/common/Makefile
board/compulab/common/common.h
board/compulab/common/splash.c [deleted file]
common/Makefile
common/splash_source.c [new file with mode: 0644]
doc/README.splashprepare
include/configs/cm_fx6.h
include/configs/cm_t35.h
include/splash.h

index b5c3ea19d362dc2280b88910f9b6209e9392ae2a..ae6945ba9c9ca2b7f5f86f7f61bee3f310634eb0 100644 (file)
@@ -15,6 +15,7 @@
 #include <netdev.h>
 #include <fdt_support.h>
 #include <sata.h>
+#include <splash.h>
 #include <asm/arch/crm_regs.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/arch/iomux.h>
@@ -42,8 +43,8 @@ static struct splash_location cm_fx6_splash_locations[] = {
 
 int splash_screen_prepare(void)
 {
-       return cl_splash_screen_prepare(cm_fx6_splash_locations,
-                                       ARRAY_SIZE(cm_fx6_splash_locations));
+       return splash_source_load(cm_fx6_splash_locations,
+                                 ARRAY_SIZE(cm_fx6_splash_locations));
 }
 #endif
 
index 8143c05353cc615a2802e33619b555ea314cfd34..c4ea8ea875f533f21a4d0bec13bf8795026658b9 100644 (file)
@@ -19,6 +19,7 @@
 #include <i2c.h>
 #include <usb.h>
 #include <mmc.h>
+#include <splash.h>
 #include <twl4030.h>
 #include <linux/compiler.h>
 
@@ -69,8 +70,8 @@ struct splash_location splash_locations[] = {
 
 int splash_screen_prepare(void)
 {
-       return cl_splash_screen_prepare(splash_locations,
-                                       ARRAY_SIZE(splash_locations));
+       return splash_source_load(splash_locations,
+                                 ARRAY_SIZE(splash_locations));
 }
 
 /*
index dbf0009652a69263b48a15e19c8dc338f3068102..286f32731da28e0f81ff811600f8ee6da215b67e 100644 (file)
@@ -9,5 +9,4 @@
 obj-y                          += common.o
 obj-$(CONFIG_SYS_I2C)          += eeprom.o
 obj-$(CONFIG_LCD)              += omap3_display.o
-obj-$(CONFIG_SPLASH_SCREEN)    += splash.o
 obj-$(CONFIG_SMC911X)          += omap3_smc911x.o
index b992965457d82fe09e5cc8042ca1363d2c1a2426..8f38b79fb0543042f2f8599df22fd3d26cc2d65b 100644 (file)
@@ -24,27 +24,6 @@ static inline int cl_usb_hub_init(int gpio, const char *label)
 static inline void cl_usb_hub_deinit(int gpio) {}
 #endif /* CONFIG_CMD_USB */
 
-enum splash_storage {
-       SPLASH_STORAGE_NAND,
-       SPLASH_STORAGE_SF,
-};
-
-struct splash_location {
-       char *name;
-       enum splash_storage storage;
-       u32 offset;     /* offset from start of storage */
-};
-
-#ifdef CONFIG_SPLASH_SCREEN
-int cl_splash_screen_prepare(struct splash_location *locations, uint size);
-#else /* !CONFIG_SPLASH_SCREEN */
-static inline int cl_splash_screen_prepare(struct splash_location *locations,
-                                          uint size)
-{
-       return -ENOSYS;
-}
-#endif /* CONFIG_SPLASH_SCREEN */
-
 #ifdef CONFIG_SMC911X
 int cl_omap3_smc911x_init(int id, int cs, u32 base_addr,
                          int (*reset)(int), int rst_gpio);
diff --git a/board/compulab/common/splash.c b/board/compulab/common/splash.c
deleted file mode 100644 (file)
index 16c315c..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * (C) Copyright 2014 CompuLab, Ltd. <www.compulab.co.il>
- *
- * Authors: Igor Grinberg <grinberg@compulab.co.il>
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-#include <common.h>
-#include <nand.h>
-#include <errno.h>
-#include <spi_flash.h>
-#include <spi.h>
-#include <bmp_layout.h>
-#include "common.h"
-
-DECLARE_GLOBAL_DATA_PTR;
-
-#ifdef CONFIG_SPI_FLASH
-static struct spi_flash *sf;
-static int splash_sf_read(u32 bmp_load_addr, int offset, size_t read_size)
-{
-       if (!sf) {
-               sf = spi_flash_probe(CONFIG_SF_DEFAULT_BUS,
-                                    CONFIG_SF_DEFAULT_CS,
-                                    CONFIG_SF_DEFAULT_SPEED,
-                                    CONFIG_SF_DEFAULT_MODE);
-               if (!sf)
-                       return -ENODEV;
-       }
-
-       return spi_flash_read(sf, offset, read_size, (void *)bmp_load_addr);
-}
-#else
-static int splash_sf_read(u32 bmp_load_addr, int offset, size_t read_size)
-{
-       debug("%s: sf support not available\n", __func__);
-       return -ENOSYS;
-}
-#endif
-
-#ifdef CONFIG_CMD_NAND
-static int splash_nand_read(u32 bmp_load_addr, int offset, size_t read_size)
-{
-       return nand_read_skip_bad(&nand_info[nand_curr_device], offset,
-                                 &read_size, NULL,
-                                 nand_info[nand_curr_device].size,
-                                 (u_char *)bmp_load_addr);
-}
-#else
-static int splash_nand_read(u32 bmp_load_addr, int offset, size_t read_size)
-{
-       debug("%s: nand support not available\n", __func__);
-       return -ENOSYS;
-}
-#endif
-
-static int splash_storage_read(struct splash_location *location,
-                              u32 bmp_load_addr, size_t read_size)
-{
-       u32 offset;
-
-       if (!location)
-               return -EINVAL;
-
-       offset = location->offset;
-       switch (location->storage) {
-       case SPLASH_STORAGE_NAND:
-               return splash_nand_read(bmp_load_addr, offset, read_size);
-       case SPLASH_STORAGE_SF:
-               return splash_sf_read(bmp_load_addr, offset, read_size);
-       default:
-               printf("Unknown splash location\n");
-       }
-
-       return -EINVAL;
-}
-
-static int splash_load_raw(struct splash_location *location, u32 bmp_load_addr)
-{
-       struct bmp_header *bmp_hdr;
-       int res;
-       size_t bmp_size, bmp_header_size = sizeof(struct bmp_header);
-
-       if (bmp_load_addr + bmp_header_size >= gd->start_addr_sp)
-               goto splash_address_too_high;
-
-       res = splash_storage_read(location, bmp_load_addr, bmp_header_size);
-       if (res < 0)
-               return res;
-
-       bmp_hdr = (struct bmp_header *)bmp_load_addr;
-       bmp_size = le32_to_cpu(bmp_hdr->file_size);
-
-       if (bmp_load_addr + bmp_size >= gd->start_addr_sp)
-               goto splash_address_too_high;
-
-       return splash_storage_read(location, bmp_load_addr, bmp_size);
-
-splash_address_too_high:
-       printf("Error: splashimage address too high. Data overwrites U-Boot "
-               "and/or placed beyond DRAM boundaries.\n");
-
-       return -EFAULT;
-}
-
-/**
- * select_splash_location - return the splash location based on board support
- *                         and env variable "splashsource".
- *
- * @locations:         An array of supported splash locations.
- * @size:              Size of splash_locations array.
- *
- * @return: If a null set of splash locations is given, or
- *         splashsource env variable is set to unsupported value
- *                     return NULL.
- *         If splashsource env variable is not defined
- *                     return the first entry in splash_locations as default.
- *         If splashsource env variable contains a supported value
- *                     return the location selected by splashsource.
- */
-static struct splash_location *select_splash_location(
-                           struct splash_location *locations, uint size)
-{
-       int i;
-       char *env_splashsource;
-
-       if (!locations || size == 0)
-               return NULL;
-
-       env_splashsource = getenv("splashsource");
-       if (env_splashsource == NULL)
-               return &locations[0];
-
-       for (i = 0; i < size; i++) {
-               if (!strcmp(locations[i].name, env_splashsource))
-                       return &locations[i];
-       }
-
-       printf("splashsource env variable set to unsupported value\n");
-       return NULL;
-}
-
-int cl_splash_screen_prepare(struct splash_location *locations, uint size)
-{
-       struct splash_location *splash_location;
-       char *env_splashimage_value;
-       u32 bmp_load_addr;
-
-       env_splashimage_value = getenv("splashimage");
-       if (env_splashimage_value == NULL)
-               return -ENOENT;
-
-       bmp_load_addr = simple_strtoul(env_splashimage_value, 0, 16);
-       if (bmp_load_addr == 0) {
-               printf("Error: bad splashimage address specified\n");
-               return -EFAULT;
-       }
-
-       splash_location = select_splash_location(locations, size);
-       if (!splash_location)
-               return -EINVAL;
-
-       return splash_load_raw(splash_location, bmp_load_addr);
-}
index 94554f2939e5361179842fef3777d7ee6c06165d..0f1416d1e8a3d01cdf9632d9bdb4b8b0f5e724e2 100644 (file)
@@ -196,6 +196,7 @@ obj-$(CONFIG_CMD_KGDB) += kgdb.o kgdb_stubs.o
 obj-$(CONFIG_I2C_EDID) += edid.o
 obj-$(CONFIG_KALLSYMS) += kallsyms.o
 obj-y += splash.o
+obj-$(CONFIG_SPLASH_SOURCE) += splash_source.o
 obj-$(CONFIG_LCD) += lcd.o lcd_console.o
 obj-$(CONFIG_LYNXKDI) += lynxkdi.o
 obj-$(CONFIG_MENU) += menu.o
diff --git a/common/splash_source.c b/common/splash_source.c
new file mode 100644 (file)
index 0000000..d1bb5a4
--- /dev/null
@@ -0,0 +1,176 @@
+/*
+ * (C) Copyright 2014 CompuLab, Ltd. <www.compulab.co.il>
+ *
+ * Authors: Igor Grinberg <grinberg@compulab.co.il>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <nand.h>
+#include <errno.h>
+#include <splash.h>
+#include <spi_flash.h>
+#include <spi.h>
+#include <bmp_layout.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_SPI_FLASH
+static struct spi_flash *sf;
+static int splash_sf_read(u32 bmp_load_addr, int offset, size_t read_size)
+{
+       if (!sf) {
+               sf = spi_flash_probe(CONFIG_SF_DEFAULT_BUS,
+                                    CONFIG_SF_DEFAULT_CS,
+                                    CONFIG_SF_DEFAULT_SPEED,
+                                    CONFIG_SF_DEFAULT_MODE);
+               if (!sf)
+                       return -ENODEV;
+       }
+
+       return spi_flash_read(sf, offset, read_size, (void *)bmp_load_addr);
+}
+#else
+static int splash_sf_read(u32 bmp_load_addr, int offset, size_t read_size)
+{
+       debug("%s: sf support not available\n", __func__);
+       return -ENOSYS;
+}
+#endif
+
+#ifdef CONFIG_CMD_NAND
+static int splash_nand_read(u32 bmp_load_addr, int offset, size_t read_size)
+{
+       return nand_read_skip_bad(&nand_info[nand_curr_device], offset,
+                                 &read_size, NULL,
+                                 nand_info[nand_curr_device].size,
+                                 (u_char *)bmp_load_addr);
+}
+#else
+static int splash_nand_read(u32 bmp_load_addr, int offset, size_t read_size)
+{
+       debug("%s: nand support not available\n", __func__);
+       return -ENOSYS;
+}
+#endif
+
+static int splash_storage_read(struct splash_location *location,
+                              u32 bmp_load_addr, size_t read_size)
+{
+       u32 offset;
+
+       if (!location)
+               return -EINVAL;
+
+       offset = location->offset;
+       switch (location->storage) {
+       case SPLASH_STORAGE_NAND:
+               return splash_nand_read(bmp_load_addr, offset, read_size);
+       case SPLASH_STORAGE_SF:
+               return splash_sf_read(bmp_load_addr, offset, read_size);
+       default:
+               printf("Unknown splash location\n");
+       }
+
+       return -EINVAL;
+}
+
+static int splash_load_raw(struct splash_location *location, u32 bmp_load_addr)
+{
+       struct bmp_header *bmp_hdr;
+       int res;
+       size_t bmp_size, bmp_header_size = sizeof(struct bmp_header);
+
+       if (bmp_load_addr + bmp_header_size >= gd->start_addr_sp)
+               goto splash_address_too_high;
+
+       res = splash_storage_read(location, bmp_load_addr, bmp_header_size);
+       if (res < 0)
+               return res;
+
+       bmp_hdr = (struct bmp_header *)bmp_load_addr;
+       bmp_size = le32_to_cpu(bmp_hdr->file_size);
+
+       if (bmp_load_addr + bmp_size >= gd->start_addr_sp)
+               goto splash_address_too_high;
+
+       return splash_storage_read(location, bmp_load_addr, bmp_size);
+
+splash_address_too_high:
+       printf("Error: splashimage address too high. Data overwrites U-Boot and/or placed beyond DRAM boundaries.\n");
+
+       return -EFAULT;
+}
+
+/**
+ * select_splash_location - return the splash location based on board support
+ *                         and env variable "splashsource".
+ *
+ * @locations:         An array of supported splash locations.
+ * @size:              Size of splash_locations array.
+ *
+ * @return: If a null set of splash locations is given, or
+ *         splashsource env variable is set to unsupported value
+ *                     return NULL.
+ *         If splashsource env variable is not defined
+ *                     return the first entry in splash_locations as default.
+ *         If splashsource env variable contains a supported value
+ *                     return the location selected by splashsource.
+ */
+static struct splash_location *select_splash_location(
+                           struct splash_location *locations, uint size)
+{
+       int i;
+       char *env_splashsource;
+
+       if (!locations || size == 0)
+               return NULL;
+
+       env_splashsource = getenv("splashsource");
+       if (env_splashsource == NULL)
+               return &locations[0];
+
+       for (i = 0; i < size; i++) {
+               if (!strcmp(locations[i].name, env_splashsource))
+                       return &locations[i];
+       }
+
+       printf("splashsource env variable set to unsupported value\n");
+       return NULL;
+}
+
+/**
+ * splash_source_load - load splash image from a supported location.
+ *
+ * Select a splash image location based on the value of splashsource environment
+ * variable and the board supported splash source locations, and load a
+ * splashimage to the address pointed to by splashimage environment variable.
+ *
+ * @locations:         An array of supported splash locations.
+ * @size:              Size of splash_locations array.
+ *
+ * @return: 0 on success, negative value on failure.
+ */
+int splash_source_load(struct splash_location *locations, uint size)
+{
+       struct splash_location *splash_location;
+       char *env_splashimage_value;
+       u32 bmp_load_addr;
+
+       env_splashimage_value = getenv("splashimage");
+       if (env_splashimage_value == NULL)
+               return -ENOENT;
+
+       bmp_load_addr = simple_strtoul(env_splashimage_value, 0, 16);
+       if (bmp_load_addr == 0) {
+               printf("Error: bad splashimage address specified\n");
+               return -EFAULT;
+       }
+
+       splash_location = select_splash_location(locations, size);
+       if (!splash_location)
+               return -EINVAL;
+
+       return splash_load_raw(splash_location, bmp_load_addr);
+}
index 61b4ec53ecaddee676e0c6c2ec1dac65efe544d4..a0f0f3ca51f794630f3f398f40dae0c567c1ad1a 100644 (file)
@@ -6,3 +6,16 @@ common/splash.c. It is called as part of the splash screen display
 sequence. It gives the board an opportunity to prepare the splash
 image data before it is processed and sent to the frame buffer by
 U-Boot.  Define your own version to use this feature.
+
+CONFIG_SPLASH_SOURCE
+
+Use the splash_source.c library. This library provides facilities to declare
+board specific splash image locations, routines for loading splash image from
+supported locations, and a way of controlling the selected splash location
+using the "splashsource" environment variable.
+
+splashsource works as follows:
+- If splashsource is set to a supported location name as defined by board code,
+  use that splash location.
+- If splashsource is undefined, use the first splash location as default.
+- If splashsource is set to an unsupported value, do not load a splash screen.
index b92ba976e91999ebed586bc3c5d6d332fea9dd6d..1f6449505511c1f6001a8d5bbe846e8d827145cc 100644 (file)
 #define CONFIG_VIDEO_SW_CURSOR
 
 #define CONFIG_SPLASH_SCREEN
+#define CONFIG_SPLASH_SOURCE
 #define CONFIG_CMD_BMP
 #define CONFIG_VIDEO_BMP_RLE8
 
index 9767512a5cf03771a5008932433b417cdacfbe56..b2a9f35797093a7698b6e4db9464849962d51dbe 100644 (file)
 
 #define CONFIG_LCD
 #define CONFIG_SPLASH_SCREEN
+#define CONFIG_SPLASH_SOURCE
 #define CONFIG_CMD_BMP
 #define CONFIG_BMP_16BPP
 #define CONFIG_SCF0403_LCD
index 89ee7b22ec2b324f4c29f37018242a91a42259a7..a60e89542343532b2356d86f0215f30d53e228c6 100644 (file)
 #ifndef _SPLASH_H_
 #define _SPLASH_H_
 
+enum splash_storage {
+       SPLASH_STORAGE_NAND,
+       SPLASH_STORAGE_SF,
+};
 
+struct splash_location {
+       char *name;
+       enum splash_storage storage;
+       u32 offset;     /* offset from start of storage */
+};
+
+int splash_source_load(struct splash_location *locations, uint size);
 int splash_screen_prepare(void);
 
 #ifdef CONFIG_SPLASH_SCREEN_ALIGN