[U-Boot] [PATCH] sunxi: setup simplefb for Allwinner DE2

Maxime Ripard maxime.ripard at free-electrons.com
Tue May 9 20:29:20 UTC 2017


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?

What is changing between the two, the compatible to check for?

Thanks!
Maxime

-- 
Maxime Ripard, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20170509/0ccec67f/attachment.sig>


More information about the U-Boot mailing list