1*7d95f2a3SSimon Glass /* 2*7d95f2a3SSimon Glass * Copyright (c) 2013 Google, Inc 3*7d95f2a3SSimon Glass * 4*7d95f2a3SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 5*7d95f2a3SSimon Glass */ 6*7d95f2a3SSimon Glass 7*7d95f2a3SSimon Glass #include <common.h> 8*7d95f2a3SSimon Glass #include <fdtdec.h> 9*7d95f2a3SSimon Glass #include <lcd.h> 10*7d95f2a3SSimon Glass #include <malloc.h> 11*7d95f2a3SSimon Glass #include <asm/sdl.h> 12*7d95f2a3SSimon Glass #include <asm/u-boot-sandbox.h> 13*7d95f2a3SSimon Glass 14*7d95f2a3SSimon Glass DECLARE_GLOBAL_DATA_PTR; 15*7d95f2a3SSimon Glass 16*7d95f2a3SSimon Glass enum { 17*7d95f2a3SSimon Glass /* Maximum LCD size we support */ 18*7d95f2a3SSimon Glass LCD_MAX_WIDTH = 1366, 19*7d95f2a3SSimon Glass LCD_MAX_HEIGHT = 768, 20*7d95f2a3SSimon Glass LCD_MAX_LOG2_BPP = 4, /* 2^4 = 16 bpp */ 21*7d95f2a3SSimon Glass }; 22*7d95f2a3SSimon Glass 23*7d95f2a3SSimon Glass vidinfo_t panel_info; 24*7d95f2a3SSimon Glass 25*7d95f2a3SSimon Glass void lcd_setcolreg(ushort regno, ushort red, ushort green, ushort blue) 26*7d95f2a3SSimon Glass { 27*7d95f2a3SSimon Glass } 28*7d95f2a3SSimon Glass 29*7d95f2a3SSimon Glass void lcd_ctrl_init(void *lcdbase) 30*7d95f2a3SSimon Glass { 31*7d95f2a3SSimon Glass /* 32*7d95f2a3SSimon Glass * Allocate memory to keep BMP color conversion map. This is required 33*7d95f2a3SSimon Glass * for 8 bit BMPs only (hence 256 colors). If malloc fails - keep 34*7d95f2a3SSimon Glass * going, it is not even clear if displyaing the bitmap will be 35*7d95f2a3SSimon Glass * required on the way up. 36*7d95f2a3SSimon Glass */ 37*7d95f2a3SSimon Glass panel_info.cmap = malloc(256 * NBITS(panel_info.vl_bpix) / 8); 38*7d95f2a3SSimon Glass } 39*7d95f2a3SSimon Glass 40*7d95f2a3SSimon Glass void lcd_enable(void) 41*7d95f2a3SSimon Glass { 42*7d95f2a3SSimon Glass if (sandbox_sdl_init_display(panel_info.vl_col, panel_info.vl_row, 43*7d95f2a3SSimon Glass panel_info.vl_bpix)) 44*7d95f2a3SSimon Glass puts("LCD init failed\n"); 45*7d95f2a3SSimon Glass } 46*7d95f2a3SSimon Glass 47*7d95f2a3SSimon Glass int sandbox_lcd_sdl_early_init(void) 48*7d95f2a3SSimon Glass { 49*7d95f2a3SSimon Glass const void *blob = gd->fdt_blob; 50*7d95f2a3SSimon Glass int xres = LCD_MAX_WIDTH, yres = LCD_MAX_HEIGHT; 51*7d95f2a3SSimon Glass int node; 52*7d95f2a3SSimon Glass int ret = 0; 53*7d95f2a3SSimon Glass 54*7d95f2a3SSimon Glass /* 55*7d95f2a3SSimon Glass * The code in common/lcd.c does not cope with not being able to 56*7d95f2a3SSimon Glass * set up a frame buffer. It will just happily keep writing to 57*7d95f2a3SSimon Glass * invalid memory. So here we make sure that at least some buffer 58*7d95f2a3SSimon Glass * is available even if it actually won't be displayed. 59*7d95f2a3SSimon Glass */ 60*7d95f2a3SSimon Glass node = fdtdec_next_compatible(blob, 0, COMPAT_SANDBOX_LCD_SDL); 61*7d95f2a3SSimon Glass if (node >= 0) { 62*7d95f2a3SSimon Glass xres = fdtdec_get_int(blob, node, "xres", LCD_MAX_WIDTH); 63*7d95f2a3SSimon Glass yres = fdtdec_get_int(blob, node, "yres", LCD_MAX_HEIGHT); 64*7d95f2a3SSimon Glass if (xres < 0 || xres > LCD_MAX_WIDTH) { 65*7d95f2a3SSimon Glass xres = LCD_MAX_WIDTH; 66*7d95f2a3SSimon Glass ret = -EINVAL; 67*7d95f2a3SSimon Glass } 68*7d95f2a3SSimon Glass if (yres < 0 || yres > LCD_MAX_HEIGHT) { 69*7d95f2a3SSimon Glass yres = LCD_MAX_HEIGHT; 70*7d95f2a3SSimon Glass ret = -EINVAL; 71*7d95f2a3SSimon Glass } 72*7d95f2a3SSimon Glass } 73*7d95f2a3SSimon Glass 74*7d95f2a3SSimon Glass panel_info.vl_col = xres; 75*7d95f2a3SSimon Glass panel_info.vl_row = yres; 76*7d95f2a3SSimon Glass panel_info.vl_bpix = LCD_COLOR16; 77*7d95f2a3SSimon Glass 78*7d95f2a3SSimon Glass return ret; 79*7d95f2a3SSimon Glass } 80