Blame view

common/lcd_simplefb.c 1.86 KB
033167c4c   Nikita Kiryanov   lcd: dt: extract ...
1
2
3
4
5
6
7
8
9
10
  /*
   * Simplefb device tree support
   *
   * (C) Copyright 2015
   * Stephen Warren <swarren@wwwdotorg.org>
   *
   * SPDX-License-Identifier:	GPL-2.0+
   */
  
  #include <common.h>
d08e42a8c   Simon Glass   dm: video: Add dr...
11
  #include <dm.h>
033167c4c   Nikita Kiryanov   lcd: dt: extract ...
12
13
  #include <lcd.h>
  #include <fdt_support.h>
b08c8c487   Masahiro Yamada   libfdt: move head...
14
  #include <linux/libfdt.h>
d08e42a8c   Simon Glass   dm: video: Add dr...
15
  #include <video.h>
033167c4c   Nikita Kiryanov   lcd: dt: extract ...
16
17
18
19
20
  
  DECLARE_GLOBAL_DATA_PTR;
  
  static int lcd_dt_simplefb_configure_node(void *blob, int off)
  {
452614556   Simon Glass   dm: video: Refact...
21
22
23
24
  	int xsize, ysize;
  	int bpix; /* log2 of bits per pixel */
  	const char *name;
  	ulong fb_base;
d08e42a8c   Simon Glass   dm: video: Add dr...
25
26
27
28
29
  #ifdef CONFIG_DM_VIDEO
  	struct video_uc_platdata *plat;
  	struct video_priv *uc_priv;
  	struct udevice *dev;
  	int ret;
452614556   Simon Glass   dm: video: Refact...
30

d08e42a8c   Simon Glass   dm: video: Add dr...
31
32
33
34
35
36
37
38
39
40
  	ret = uclass_first_device_err(UCLASS_VIDEO, &dev);
  	if (ret)
  		return ret;
  	uc_priv = dev_get_uclass_priv(dev);
  	plat = dev_get_uclass_platdata(dev);
  	xsize = uc_priv->xsize;
  	ysize = uc_priv->ysize;
  	bpix = uc_priv->bpix;
  	fb_base = plat->base;
  #else
452614556   Simon Glass   dm: video: Refact...
41
42
43
44
  	xsize = lcd_get_pixel_width();
  	ysize = lcd_get_pixel_height();
  	bpix = LCD_BPP;
  	fb_base = gd->fb_base;
d08e42a8c   Simon Glass   dm: video: Add dr...
45
  #endif
452614556   Simon Glass   dm: video: Refact...
46
47
48
49
50
51
52
53
54
55
56
57
58
  	switch (bpix) {
  	case 4: /* VIDEO_BPP16 */
  		name = "r5g6b5";
  		break;
  	case 5: /* VIDEO_BPP32 */
  		name = "a8r8g8b8";
  		break;
  	default:
  		return -EINVAL;
  	}
  
  	return fdt_setup_simplefb_node(blob, off, fb_base, xsize, ysize,
  				       xsize * (1 << bpix) / 8, name);
033167c4c   Nikita Kiryanov   lcd: dt: extract ...
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
  }
  
  int lcd_dt_simplefb_add_node(void *blob)
  {
  	static const char compat[] = "simple-framebuffer";
  	static const char disabled[] = "disabled";
  	int off, ret;
  
  	off = fdt_add_subnode(blob, 0, "framebuffer");
  	if (off < 0)
  		return -1;
  
  	ret = fdt_setprop(blob, off, "status", disabled, sizeof(disabled));
  	if (ret < 0)
  		return -1;
  
  	ret = fdt_setprop(blob, off, "compatible", compat, sizeof(compat));
  	if (ret < 0)
  		return -1;
  
  	return lcd_dt_simplefb_configure_node(blob, off);
  }
  
  int lcd_dt_simplefb_enable_existing_node(void *blob)
  {
  	int off;
  
  	off = fdt_node_offset_by_compatible(blob, -1, "simple-framebuffer");
  	if (off < 0)
  		return -1;
  
  	return lcd_dt_simplefb_configure_node(blob, off);
  }