summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2016-01-18 19:52:25 -0700
committerSimon Glass <sjg@chromium.org>2016-01-20 19:10:16 -0700
commit3ade5bc4dc24edf5e1f13f3c43a9e8b7f8c2d853 (patch)
treee276da8f4b751ea7feecf32fa750e71671bfa7f2
parent1e69ad014c68bf375ba2113486c5c0095d3292d0 (diff)
downloadtalos-obmc-uboot-3ade5bc4dc24edf5e1f13f3c43a9e8b7f8c2d853.tar.gz
talos-obmc-uboot-3ade5bc4dc24edf5e1f13f3c43a9e8b7f8c2d853.zip
dm: video: sandbox: Convert sandbox to use driver model for video
Now that driver model support is available, convert sandbox over to use it. We can remove a few of the special hooks that sandbox currently has. Signed-off-by: Simon Glass <sjg@chromium.org> Acked-by: Anatolij Gustschin <agust@denx.de>
-rw-r--r--arch/sandbox/dts/sandbox.dts1
-rw-r--r--board/sandbox/sandbox.c17
-rw-r--r--common/lcd.c11
-rw-r--r--configs/sandbox_defconfig1
-rw-r--r--drivers/serial/sandbox.c5
-rw-r--r--drivers/video/sandbox_sdl.c95
-rw-r--r--include/configs/sandbox.h10
-rw-r--r--include/fdtdec.h1
-rw-r--r--lib/fdtdec.c1
9 files changed, 56 insertions, 86 deletions
diff --git a/arch/sandbox/dts/sandbox.dts b/arch/sandbox/dts/sandbox.dts
index d2addb4cf0..e3f02bf13c 100644
--- a/arch/sandbox/dts/sandbox.dts
+++ b/arch/sandbox/dts/sandbox.dts
@@ -117,6 +117,7 @@
};
lcd {
+ u-boot,dm-pre-reloc;
compatible = "sandbox,lcd-sdl";
xres = <1366>;
yres = <768>;
diff --git a/board/sandbox/sandbox.c b/board/sandbox/sandbox.c
index 592f7728c0..b41e9decb3 100644
--- a/board/sandbox/sandbox.c
+++ b/board/sandbox/sandbox.c
@@ -47,23 +47,6 @@ int dram_init(void)
return 0;
}
-#ifdef CONFIG_BOARD_EARLY_INIT_F
-int board_early_init_f(void)
-{
-#ifdef CONFIG_VIDEO_SANDBOX_SDL
- int ret;
-
- ret = sandbox_lcd_sdl_early_init();
- if (ret) {
- puts("Could not init sandbox LCD emulation\n");
- return ret;
- }
-#endif
-
- return 0;
-}
-#endif
-
#ifdef CONFIG_BOARD_LATE_INIT
int board_late_init(void)
{
diff --git a/common/lcd.c b/common/lcd.c
index d29308aeb6..2f3594a417 100644
--- a/common/lcd.c
+++ b/common/lcd.c
@@ -31,10 +31,6 @@
#endif
#endif
-#ifdef CONFIG_SANDBOX
-#include <asm/sdl.h>
-#endif
-
#ifndef CONFIG_LCD_ALIGNMENT
#define CONFIG_LCD_ALIGNMENT PAGE_SIZE
#endif
@@ -72,13 +68,6 @@ void lcd_sync(void)
if (lcd_flush_dcache)
flush_dcache_range((u32)lcd_base,
(u32)(lcd_base + lcd_get_size(&line_length)));
-#elif defined(CONFIG_SANDBOX) && defined(CONFIG_VIDEO_SANDBOX_SDL)
- static ulong last_sync;
-
- if (get_timer(last_sync) > 10) {
- sandbox_sdl_sync(lcd_base);
- last_sync = get_timer(0);
- }
#endif
}
diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig
index 65184c8e85..898c5f47ac 100644
--- a/configs/sandbox_defconfig
+++ b/configs/sandbox_defconfig
@@ -76,6 +76,7 @@ CONFIG_USB_EMUL=y
CONFIG_USB_STORAGE=y
CONFIG_USB_KEYBOARD=y
CONFIG_SYS_USB_EVENT_POLL=y
+CONFIG_DM_VIDEO=y
CONFIG_VIDEO_SANDBOX_SDL=y
CONFIG_CMD_DHRYSTONE=y
CONFIG_TPM=y
diff --git a/drivers/serial/sandbox.c b/drivers/serial/sandbox.c
index cd2f91e28e..45dff98d9d 100644
--- a/drivers/serial/sandbox.c
+++ b/drivers/serial/sandbox.c
@@ -16,6 +16,7 @@
#include <lcd.h>
#include <os.h>
#include <serial.h>
+#include <video.h>
#include <linux/compiler.h>
#include <asm/state.h>
@@ -114,9 +115,7 @@ static int sandbox_serial_pending(struct udevice *dev, bool input)
return 0;
os_usleep(100);
-#ifdef CONFIG_LCD
- lcd_sync();
-#endif
+ video_sync_all();
if (next_index == serial_buf_read)
return 1; /* buffer full */
diff --git a/drivers/video/sandbox_sdl.c b/drivers/video/sandbox_sdl.c
index ba4578e9d1..450628e07c 100644
--- a/drivers/video/sandbox_sdl.c
+++ b/drivers/video/sandbox_sdl.c
@@ -5,75 +5,76 @@
*/
#include <common.h>
+#include <dm.h>
#include <fdtdec.h>
-#include <lcd.h>
-#include <malloc.h>
+#include <video.h>
#include <asm/sdl.h>
#include <asm/u-boot-sandbox.h>
+#include <dm/test.h>
DECLARE_GLOBAL_DATA_PTR;
enum {
- /* Maximum LCD size we support */
+ /* Default LCD size we support */
LCD_MAX_WIDTH = 1366,
LCD_MAX_HEIGHT = 768,
- LCD_MAX_LOG2_BPP = 4, /* 2^4 = 16 bpp */
};
-vidinfo_t panel_info;
-void lcd_setcolreg(ushort regno, ushort red, ushort green, ushort blue)
-{
-}
+/* This platform data is needed in tests, so declare it here */
+struct sandbox_sdl_plat {
+ int xres;
+ int yres;
+ int bpix;
+ int rot;
+};
-void lcd_ctrl_init(void *lcdbase)
+static int sandbox_sdl_probe(struct udevice *dev)
{
- /*
- * Allocate memory to keep BMP color conversion map. This is required
- * for 8 bit BMPs only (hence 256 colors). If malloc fails - keep
- * going, it is not even clear if displyaing the bitmap will be
- * required on the way up.
- */
- panel_info.cmap = malloc(256 * NBITS(panel_info.vl_bpix) / 8);
-}
+ struct sandbox_sdl_plat *plat = dev_get_platdata(dev);
+ struct video_priv *uc_priv = dev_get_uclass_priv(dev);
+ int ret;
-void lcd_enable(void)
-{
- if (sandbox_sdl_init_display(panel_info.vl_col, panel_info.vl_row,
- panel_info.vl_bpix))
+ ret = sandbox_sdl_init_display(plat->xres, plat->yres, plat->bpix);
+ if (ret) {
puts("LCD init failed\n");
+ return ret;
+ }
+ uc_priv->xsize = plat->xres;
+ uc_priv->ysize = plat->yres;
+ uc_priv->bpix = plat->bpix;
+ uc_priv->rot = plat->rot;
+
+ return 0;
}
-int sandbox_lcd_sdl_early_init(void)
+static int sandbox_sdl_bind(struct udevice *dev)
{
+ struct video_uc_platdata *uc_plat = dev_get_uclass_platdata(dev);
+ struct sandbox_sdl_plat *plat = dev_get_platdata(dev);
const void *blob = gd->fdt_blob;
- int xres = LCD_MAX_WIDTH, yres = LCD_MAX_HEIGHT;
- int node;
+ int node = dev->of_offset;
int ret = 0;
- /*
- * The code in common/lcd.c does not cope with not being able to
- * set up a frame buffer. It will just happily keep writing to
- * invalid memory. So here we make sure that at least some buffer
- * is available even if it actually won't be displayed.
- */
- node = fdtdec_next_compatible(blob, 0, COMPAT_SANDBOX_LCD_SDL);
- if (node >= 0) {
- xres = fdtdec_get_int(blob, node, "xres", LCD_MAX_WIDTH);
- yres = fdtdec_get_int(blob, node, "yres", LCD_MAX_HEIGHT);
- if (xres < 0 || xres > LCD_MAX_WIDTH) {
- xres = LCD_MAX_WIDTH;
- ret = -EINVAL;
- }
- if (yres < 0 || yres > LCD_MAX_HEIGHT) {
- yres = LCD_MAX_HEIGHT;
- ret = -EINVAL;
- }
- }
-
- panel_info.vl_col = xres;
- panel_info.vl_row = yres;
- panel_info.vl_bpix = LCD_COLOR16;
+ plat->xres = fdtdec_get_int(blob, node, "xres", LCD_MAX_WIDTH);
+ plat->yres = fdtdec_get_int(blob, node, "yres", LCD_MAX_HEIGHT);
+ plat->bpix = VIDEO_BPP16;
+ uc_plat->size = plat->xres * plat->yres * (1 << plat->bpix) / 8;
+ debug("%s: Frame buffer size %x\n", __func__, uc_plat->size);
return ret;
}
+
+static const struct udevice_id sandbox_sdl_ids[] = {
+ { .compatible = "sandbox,lcd-sdl" },
+ { }
+};
+
+U_BOOT_DRIVER(sdl_sandbox) = {
+ .name = "sdl_sandbox",
+ .id = UCLASS_VIDEO,
+ .of_match = sandbox_sdl_ids,
+ .bind = sandbox_sdl_bind,
+ .probe = sandbox_sdl_probe,
+ .platdata_auto_alloc_size = sizeof(struct sandbox_sdl_plat),
+};
diff --git a/include/configs/sandbox.h b/include/configs/sandbox.h
index e1be603698..23ae44c8a0 100644
--- a/include/configs/sandbox.h
+++ b/include/configs/sandbox.h
@@ -158,9 +158,7 @@
/* LCD and keyboard require SDL support */
#ifdef CONFIG_SANDBOX_SDL
-#define CONFIG_LCD
#define CONFIG_CMD_BMP
-#define CONFIG_BOARD_EARLY_INIT_F
#define CONFIG_CONSOLE_MUX
#define CONFIG_SYS_CONSOLE_IS_IN_ENV
#define LCD_BPP LCD_COLOR16
@@ -169,12 +167,12 @@
#define CONFIG_KEYBOARD
#define SANDBOX_SERIAL_SETTINGS "stdin=serial,cros-ec-keyb,usbkbd\0" \
- "stdout=serial,lcd\0" \
- "stderr=serial,lcd\0"
+ "stdout=serial,lcd.vidconsole\0" \
+ "stderr=serial,lcd.vidconsole\0"
#else
#define SANDBOX_SERIAL_SETTINGS "stdin=serial\0" \
- "stdout=serial,lcd\0" \
- "stderr=serial,lcd\0"
+ "stdout=serial,lcd.vidconsole\0" \
+ "stderr=serial,lcd.vidconsole\0"
#endif
#define SANDBOX_ETH_SETTINGS "ethaddr=00:00:11:22:33:44\0" \
diff --git a/include/fdtdec.h b/include/fdtdec.h
index 27b350e241..25e98c9c9e 100644
--- a/include/fdtdec.h
+++ b/include/fdtdec.h
@@ -151,7 +151,6 @@ enum fdt_compat_id {
COMPAT_GENERIC_SPI_FLASH, /* Generic SPI Flash chip */
COMPAT_MAXIM_98095_CODEC, /* MAX98095 Codec */
COMPAT_SAMSUNG_EXYNOS5_I2C, /* Exynos5 High Speed I2C Controller */
- COMPAT_SANDBOX_LCD_SDL, /* Sandbox LCD emulation with SDL */
COMPAT_SAMSUNG_EXYNOS_SYSMMU, /* Exynos sysmmu */
COMPAT_INTEL_MICROCODE, /* Intel microcode update */
COMPAT_MEMORY_SPD, /* Memory SPD information */
diff --git a/lib/fdtdec.c b/lib/fdtdec.c
index b50d105161..d56e1b11f0 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -56,7 +56,6 @@ static const char * const compat_names[COMPAT_COUNT] = {
COMPAT(GENERIC_SPI_FLASH, "spi-flash"),
COMPAT(MAXIM_98095_CODEC, "maxim,max98095-codec"),
COMPAT(SAMSUNG_EXYNOS5_I2C, "samsung,exynos5-hsi2c"),
- COMPAT(SANDBOX_LCD_SDL, "sandbox,lcd-sdl"),
COMPAT(SAMSUNG_EXYNOS_SYSMMU, "samsung,sysmmu-v3.3"),
COMPAT(INTEL_MICROCODE, "intel,microcode"),
COMPAT(MEMORY_SPD, "memory-spd"),
OpenPOWER on IntegriCloud