[PATCH 4/5] fb: Add DCU framebuffer driver for Vybrid VF610 platform
flat view
DORMANTno replies
From: Wang Huan-B18965 <hidden>
Date: 2013-08-07 08:07:34
Also in:
linux-fbdev
Am Freitag, den 12.07.2013, 14:07 +0800 schrieb Alison Wang:quoted
The Display Controller Unit (DCU) module is a system master that fetches graphics stored in internal or external memory and displays them on a TFT LCD panel. A wide range of panel sizes is supported and the timing of the interface signals is highly configurable. Graphics are read directly from memory and then blended in real-time, which allows for dynamic content creation with minimal CPUintervention.quoted
The features: (1) Full RGB888 output to TFT LCD panel. (2) For the current LCD panel, WQVGA "480x272" is tested. (3) Blending of each pixel using up to 4 source layers dependent onsize of panel.quoted
(4) Each graphic layer can be placed with one pixel resolution ineither axis.quoted
(5) Each graphic layer support RGB565 and RGB888 direct colorswithoutquoted
alpha channel and BGRA8888 direct colors with an alpha channel. (6) Each graphic layer support alpha blending with 8-bit resolution. This driver has been tested on Vybrid VF610 TOWER board. Signed-off-by: Alison Wang <redacted> --- Changes in v2: None drivers/video/Kconfig | 9 + drivers/video/Makefile | 1 + drivers/video/fsl-dcu-fb.c | 1091 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1101 insertions(+) create mode 100644 drivers/video/fsl-dcu-fb.c[...]quoted
+enum mfb_index { + LAYER0 = 0, + LAYER1, + LAYER2, + LAYER3, +};Why are there only 4 layers here? I thought the controller supports at least 6 simultaneous layers?
[Alison Wang] I used 4 layers for the customer's requirement before. Anyway, I will change it to 6 in next version. BTW, according to the RM, it said "Blending of each pixel using up to 6 source layers dependent on size of panel". So I think the most simultaneous layers is 6.
quoted
+ +static struct mfb_info mfb_template[] = { + { + .index = LAYER0, + .id = "Layer0", + .alpha = 0xff, + .blend = 0, + .count = 0, + .x_layer_d = 0, + .y_layer_d = 0, + }, + { + .index = LAYER1, + .id = "Layer1", + .alpha = 0xff, + .blend = 0, + .count = 0, + .x_layer_d = 50, + .y_layer_d = 50, + }, + { + .index = LAYER2, + .id = "Layer2", + .alpha = 0xff, + .blend = 0, + .count = 0, + .x_layer_d = 100, + .y_layer_d = 100, + }, + { + .index = LAYER3, + .id = "Layer3", + .alpha = 0xff, + .blend = 0, + .count = 0, + .x_layer_d = 150, + .y_layer_d = 150, + }, +};[...]quoted
+static int fsl_dcu_release(struct fb_info *info, int user) { + struct mfb_info *mfbi = info->par; + int ret = 0; + + mfbi->count--; + if (mfbi->count == 0) { + ret = disable_panel(info); + if (ret < 0) + mfbi->count++; + } + + return ret; +}Could this be replaced by runtime pm?
[Alison Wang] Yes, I will use runtime pm.
[...]quoted
+static int bypass_tcon(struct device_node *np) { + struct device_node *tcon_np; + struct platform_device *tcon_pdev; + struct clk *tcon_clk; + void __iomem *tcon_reg; + int ret = 0; + + tcon_np = of_parse_phandle(np, "tcon-controller", 0); + if (!tcon_np) + return -EINVAL; + + tcon_pdev = of_find_device_by_node(tcon_np); + if (!tcon_pdev) + return -EINVAL; + + tcon_clk = devm_clk_get(&tcon_pdev->dev, "tcon"); + if (IS_ERR(tcon_clk)) { + ret = PTR_ERR(tcon_clk); + goto failed_getclock; + } + clk_prepare_enable(tcon_clk); + + tcon_reg = of_iomap(tcon_np, 0); + if (!tcon_reg) { + ret = -ENOMEM; + goto failed_ioremap; + } + writel(TCON_BYPASS_ENABLE, tcon_reg + TCON_CTRL1); + + return 0; + +failed_ioremap: + clk_disable_unprepare(tcon_clk); +failed_getclock: + of_node_put(tcon_np); + return ret; +} +Is the framebuffer driver the only user of tcon? If not you should not map the memory here, but rather use something like regmap syscon.
[Alison Wang] Yes, the fb driver is the only user of tcon. Thanks for your comments! Best Regards, Alison Wang