[U-Boot] [PATCH] sunxi: setup simplefb for Allwinner DE2
icenowy at aosc.io
icenowy at aosc.io
Wed May 10 14:25:22 UTC 2017
于 2017年5月10日 GMT+08:00 上午4:29:20, Maxime Ripard
<maxime.ripard at free-electrons.com> 写到:
> Hi Icenowy,
>
> On Tue, May 09, 2017 at 03:23:58PM +0800, Icenowy Zheng wrote:
>> As the support of EFI boot on Allwinner H3 is broken, we still need
> to
>> use simplefb to pass the framebuffer to Linux.
>>
>> Add code to setup simplefb for Allwinner DE2 driver.
>>
>> Signed-off-by: Icenowy Zheng <icenowy at aosc.io>
>> ---
>> drivers/video/sunxi/sunxi_de2.c | 81
> +++++++++++++++++++++++++++++++++++++++++
>> include/configs/sunxi-common.h | 4 ++
>> 2 files changed, 85 insertions(+)
>>
>> diff --git a/drivers/video/sunxi/sunxi_de2.c
> b/drivers/video/sunxi/sunxi_de2.c
>> index 9a32c3a020..97e0513f04 100644
>> --- a/drivers/video/sunxi/sunxi_de2.c
>> +++ b/drivers/video/sunxi/sunxi_de2.c
>> @@ -10,6 +10,8 @@
>> #include <display.h>
>> #include <dm.h>
>> #include <edid.h>
>> +#include <fdtdec.h>
>> +#include <fdt_support.h>
>> #include <video.h>
>> #include <asm/global_data.h>
>> #include <asm/io.h>
>> @@ -256,3 +258,82 @@ U_BOOT_DRIVER(sunxi_de2) = {
>> U_BOOT_DEVICE(sunxi_de2) = {
>> .name = "sunxi_de2"
>> };
>> +
>> +/*
>> + * Simplefb support.
>> + */
>> +#if defined(CONFIG_OF_BOARD_SETUP) &&
> defined(CONFIG_VIDEO_DT_SIMPLEFB)
>> +int sunxi_simplefb_setup(void *blob)
>> +{
>> + struct udevice *de2, *hdmi;
>> + struct video_priv *de2_priv;
>> + struct video_uc_platdata *de2_plat;
>> + int mux;
>> + int offset, ret;
>> + u64 start, size;
>> + const char *pipeline = NULL;
>> +
>> + debug("Setting up simplefb\n");
>> +
>> + if (IS_ENABLED(CONFIG_MACH_SUNXI_H3_H5))
>> + mux = 0;
>> + else
>> + mux = 1;
>> +
>> + /* Skip simplefb setting if DE2 / HDMI is not present */
>> + ret = uclass_find_device_by_name(UCLASS_VIDEO,
>> + "sunxi_de2", &de2);
>> + if (ret) {
>> + debug("DE2 not present\n");
>> + return 0;
>> + }
>> +
>> + ret = uclass_find_device_by_name(UCLASS_DISPLAY,
>> + "sunxi_dw_hdmi", &hdmi);
>> + if (ret) {
>> + debug("HDMI not present\n");
>> + return 0;
>> + }
>> +
>> + if (mux == 0)
>> + pipeline = "mixer0-lcd0-hdmi";
>> + else
>> + pipeline = "mixer1-lcd1-hdmi";
>> +
>> + de2_priv = dev_get_uclass_priv(de2);
>> + de2_plat = dev_get_uclass_platdata(de2);
>> +
>> + /* Find a prefilled simpefb node, matching out pipeline config */
>> + offset = fdt_node_offset_by_compatible(blob, -1,
>> + "allwinner,simple-framebuffer");
>> + while (offset >= 0) {
>> + ret = fdt_stringlist_search(blob, offset, "allwinner,pipeline",
>> + pipeline);
>> + if (ret == 0)
>> + break;
>> + offset = fdt_node_offset_by_compatible(blob, offset,
>> + "allwinner,simple-framebuffer");
>> + }
>> + if (offset < 0) {
>> + eprintf("Cannot setup simplefb: node not found\n");
>> + return 0; /* Keep older kernels working */
>> + }
>> +
>> + start = gd->bd->bi_dram[0].start;
>> + size = de2_plat->base - start;
>> + ret = fdt_fixup_memory_banks(blob, &start, &size, 1);
>> + if (ret) {
>> + eprintf("Cannot setup simplefb: Error reserving memory\n");
>> + return ret;
>> + }
>> +
>> + ret = fdt_setup_simplefb_node(blob, offset, de2_plat->base,
>> + de2_priv->xsize, de2_priv->ysize,
>> + (1 << de2_priv->bpix) / 8 * de2_priv->xsize,
>> + "x8r8g8b8");
>> + if (ret)
>> + eprintf("Cannot setup simplefb: Error setting properties\n");
>> +
>> + return ret;
>
> This looks very similar to sun4i's simplefb setup code. Can't it be
> shared?
only a few code (~ 5 lines).
Many lines have info-retrieving from DM structures, so they cannot
be shared.
>
> What is changing between the two, the compatible to check for?
1. support for Driver Model-based video.
2. pipeline changed.
>
> Thanks!
> Maxime
More information about the U-Boot
mailing list