1 /* 2 * Simplefb device tree support 3 * 4 * (C) Copyright 2015 5 * Stephen Warren <swarren@wwwdotorg.org> 6 * 7 * SPDX-License-Identifier: GPL-2.0+ 8 */ 9 10 #include <common.h> 11 #include <dm.h> 12 #include <lcd.h> 13 #include <fdt_support.h> 14 #include <linux/libfdt.h> 15 #include <video.h> 16 17 DECLARE_GLOBAL_DATA_PTR; 18 19 static int lcd_dt_simplefb_configure_node(void *blob, int off) 20 { 21 int xsize, ysize; 22 int bpix; /* log2 of bits per pixel */ 23 const char *name; 24 ulong fb_base; 25 #ifdef CONFIG_DM_VIDEO 26 struct video_uc_platdata *plat; 27 struct video_priv *uc_priv; 28 struct udevice *dev; 29 int ret; 30 31 ret = uclass_first_device_err(UCLASS_VIDEO, &dev); 32 if (ret) 33 return ret; 34 uc_priv = dev_get_uclass_priv(dev); 35 plat = dev_get_uclass_platdata(dev); 36 xsize = uc_priv->xsize; 37 ysize = uc_priv->ysize; 38 bpix = uc_priv->bpix; 39 fb_base = plat->base; 40 #else 41 xsize = lcd_get_pixel_width(); 42 ysize = lcd_get_pixel_height(); 43 bpix = LCD_BPP; 44 fb_base = gd->fb_base; 45 #endif 46 switch (bpix) { 47 case 4: /* VIDEO_BPP16 */ 48 name = "r5g6b5"; 49 break; 50 case 5: /* VIDEO_BPP32 */ 51 name = "a8r8g8b8"; 52 break; 53 default: 54 return -EINVAL; 55 } 56 57 return fdt_setup_simplefb_node(blob, off, fb_base, xsize, ysize, 58 xsize * (1 << bpix) / 8, name); 59 } 60 61 int lcd_dt_simplefb_add_node(void *blob) 62 { 63 static const char compat[] = "simple-framebuffer"; 64 static const char disabled[] = "disabled"; 65 int off, ret; 66 67 off = fdt_add_subnode(blob, 0, "framebuffer"); 68 if (off < 0) 69 return -1; 70 71 ret = fdt_setprop(blob, off, "status", disabled, sizeof(disabled)); 72 if (ret < 0) 73 return -1; 74 75 ret = fdt_setprop(blob, off, "compatible", compat, sizeof(compat)); 76 if (ret < 0) 77 return -1; 78 79 return lcd_dt_simplefb_configure_node(blob, off); 80 } 81 82 int lcd_dt_simplefb_enable_existing_node(void *blob) 83 { 84 int off; 85 86 off = fdt_node_offset_by_compatible(blob, -1, "simple-framebuffer"); 87 if (off < 0) 88 return -1; 89 90 return lcd_dt_simplefb_configure_node(blob, off); 91 } 92