xref: /openbmc/u-boot/common/lcd_simplefb.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2033167c4SNikita Kiryanov /*
3033167c4SNikita Kiryanov  * Simplefb device tree support
4033167c4SNikita Kiryanov  *
5033167c4SNikita Kiryanov  * (C) Copyright 2015
6033167c4SNikita Kiryanov  * Stephen Warren <swarren@wwwdotorg.org>
7033167c4SNikita Kiryanov  */
8033167c4SNikita Kiryanov 
9033167c4SNikita Kiryanov #include <common.h>
10d08e42a8SSimon Glass #include <dm.h>
11033167c4SNikita Kiryanov #include <lcd.h>
12033167c4SNikita Kiryanov #include <fdt_support.h>
13b08c8c48SMasahiro Yamada #include <linux/libfdt.h>
14d08e42a8SSimon Glass #include <video.h>
15033167c4SNikita Kiryanov 
16033167c4SNikita Kiryanov DECLARE_GLOBAL_DATA_PTR;
17033167c4SNikita Kiryanov 
lcd_dt_simplefb_configure_node(void * blob,int off)18033167c4SNikita Kiryanov static int lcd_dt_simplefb_configure_node(void *blob, int off)
19033167c4SNikita Kiryanov {
2045261455SSimon Glass 	int xsize, ysize;
2145261455SSimon Glass 	int bpix; /* log2 of bits per pixel */
2245261455SSimon Glass 	const char *name;
2345261455SSimon Glass 	ulong fb_base;
24d08e42a8SSimon Glass #ifdef CONFIG_DM_VIDEO
25d08e42a8SSimon Glass 	struct video_uc_platdata *plat;
26d08e42a8SSimon Glass 	struct video_priv *uc_priv;
27d08e42a8SSimon Glass 	struct udevice *dev;
28d08e42a8SSimon Glass 	int ret;
2945261455SSimon Glass 
30d08e42a8SSimon Glass 	ret = uclass_first_device_err(UCLASS_VIDEO, &dev);
31d08e42a8SSimon Glass 	if (ret)
32d08e42a8SSimon Glass 		return ret;
33d08e42a8SSimon Glass 	uc_priv = dev_get_uclass_priv(dev);
34d08e42a8SSimon Glass 	plat = dev_get_uclass_platdata(dev);
35d08e42a8SSimon Glass 	xsize = uc_priv->xsize;
36d08e42a8SSimon Glass 	ysize = uc_priv->ysize;
37d08e42a8SSimon Glass 	bpix = uc_priv->bpix;
38d08e42a8SSimon Glass 	fb_base = plat->base;
39d08e42a8SSimon Glass #else
4045261455SSimon Glass 	xsize = lcd_get_pixel_width();
4145261455SSimon Glass 	ysize = lcd_get_pixel_height();
4245261455SSimon Glass 	bpix = LCD_BPP;
4345261455SSimon Glass 	fb_base = gd->fb_base;
44d08e42a8SSimon Glass #endif
4545261455SSimon Glass 	switch (bpix) {
4645261455SSimon Glass 	case 4: /* VIDEO_BPP16 */
4745261455SSimon Glass 		name = "r5g6b5";
4845261455SSimon Glass 		break;
4945261455SSimon Glass 	case 5: /* VIDEO_BPP32 */
5045261455SSimon Glass 		name = "a8r8g8b8";
5145261455SSimon Glass 		break;
5245261455SSimon Glass 	default:
5345261455SSimon Glass 		return -EINVAL;
5445261455SSimon Glass 	}
5545261455SSimon Glass 
5645261455SSimon Glass 	return fdt_setup_simplefb_node(blob, off, fb_base, xsize, ysize,
5745261455SSimon Glass 				       xsize * (1 << bpix) / 8, name);
58033167c4SNikita Kiryanov }
59033167c4SNikita Kiryanov 
lcd_dt_simplefb_add_node(void * blob)60033167c4SNikita Kiryanov int lcd_dt_simplefb_add_node(void *blob)
61033167c4SNikita Kiryanov {
62033167c4SNikita Kiryanov 	static const char compat[] = "simple-framebuffer";
63033167c4SNikita Kiryanov 	static const char disabled[] = "disabled";
64033167c4SNikita Kiryanov 	int off, ret;
65033167c4SNikita Kiryanov 
66033167c4SNikita Kiryanov 	off = fdt_add_subnode(blob, 0, "framebuffer");
67033167c4SNikita Kiryanov 	if (off < 0)
68033167c4SNikita Kiryanov 		return -1;
69033167c4SNikita Kiryanov 
70033167c4SNikita Kiryanov 	ret = fdt_setprop(blob, off, "status", disabled, sizeof(disabled));
71033167c4SNikita Kiryanov 	if (ret < 0)
72033167c4SNikita Kiryanov 		return -1;
73033167c4SNikita Kiryanov 
74033167c4SNikita Kiryanov 	ret = fdt_setprop(blob, off, "compatible", compat, sizeof(compat));
75033167c4SNikita Kiryanov 	if (ret < 0)
76033167c4SNikita Kiryanov 		return -1;
77033167c4SNikita Kiryanov 
78033167c4SNikita Kiryanov 	return lcd_dt_simplefb_configure_node(blob, off);
79033167c4SNikita Kiryanov }
80033167c4SNikita Kiryanov 
lcd_dt_simplefb_enable_existing_node(void * blob)81033167c4SNikita Kiryanov int lcd_dt_simplefb_enable_existing_node(void *blob)
82033167c4SNikita Kiryanov {
83033167c4SNikita Kiryanov 	int off;
84033167c4SNikita Kiryanov 
85033167c4SNikita Kiryanov 	off = fdt_node_offset_by_compatible(blob, -1, "simple-framebuffer");
86033167c4SNikita Kiryanov 	if (off < 0)
87033167c4SNikita Kiryanov 		return -1;
88033167c4SNikita Kiryanov 
89033167c4SNikita Kiryanov 	return lcd_dt_simplefb_configure_node(blob, off);
90033167c4SNikita Kiryanov }
91