
Dne nedelja, 07. marec 2021 ob 02:32:52 CET je Andre Przywara napisal(a):
On Sat, 6 Mar 2021 20:54:27 +0100
Jernej Skrabec jernej.skrabec@siol.net wrote:
Currently DE2 driver uses functions which are defined in internal headers. They are not meant to be used outside of uclass framework. Switch DE2 driver to public ones. This has additional benefit that device_probe doesn't need to be called manually.
Indeed, good solution: for the calls in _probe(), we call de2_init() right afterwards, which would explicitly call probe for the display, so this both saves this call and the usage of the internal function. For the calls in simplefb_setup: the DM framework checks if a device has already been activated, so there is no problem with double probes.
However, actually testing this on a Pine64-LTS revealed that this breaks on the A64: I only get a black screen (bisecting down to this commit).
I didn't investigate any further yet, just wanted to give a heads up.
Thanks! I'll check what's going on.
Best regards, Jernej
Cheers, Andre
Signed-off-by: Jernej Skrabec jernej.skrabec@siol.net
drivers/video/sunxi/sunxi_de2.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-)
diff --git a/drivers/video/sunxi/sunxi_de2.c b/drivers/video/sunxi/sunxi_de2.c index 6b836a011944..e02d359cd259 100644 --- a/drivers/video/sunxi/sunxi_de2.c +++ b/drivers/video/sunxi/sunxi_de2.c @@ -19,8 +19,6 @@
#include <asm/io.h> #include <asm/arch/clock.h> #include <asm/arch/display2.h>
-#include <dm/device-internal.h> -#include <dm/uclass-internal.h>
#include <linux/bitops.h> #include "simplefb_common.h"
@@ -198,13 +196,6 @@ static int sunxi_de2_init(struct udevice *dev, ulong fbbase,> disp_uc_plat->source_id = mux;
ret = device_probe(disp);
if (ret) {
debug("%s: device '%s' display won't probe (ret=%d)\n",
__func__, dev->name, ret);
return ret;
}
ret = display_read_timing(disp, &timing); if (ret) {
debug("%s: Failed to read timings\n", __func__);
@@ -245,8 +236,8 @@ static int sunxi_de2_probe(struct udevice *dev)
if (!(gd->flags & GD_FLG_RELOC))
return 0;
- ret = uclass_find_device_by_name(UCLASS_DISPLAY,
"sunxi_lcd", &disp);
- ret = uclass_get_device_by_driver(UCLASS_DISPLAY,
DM_DRIVER_GET(sunxi_lcd), &disp);
if (!ret) {
int mux;
@@ -262,8 +253,8 @@ static int sunxi_de2_probe(struct udevice *dev)
debug("%s: lcd display not found (ret=%d)\n", __func__, ret);
- ret = uclass_find_device_by_name(UCLASS_DISPLAY,
"sunxi_dw_hdmi",
&disp);
- ret = uclass_get_device_by_driver(UCLASS_DISPLAY,
DM_DRIVER_GET(sunxi_dw_hdmi), &disp);
if (!ret) {
int mux; if (IS_ENABLED(CONFIG_MACH_SUNXI_H3_H5))
@@ -332,8 +323,8 @@ int sunxi_simplefb_setup(void *blob)
mux = 1;
/* Skip simplefb setting if DE2 / HDMI is not present */
- ret = uclass_find_device_by_name(UCLASS_VIDEO,
"sunxi_de2", &de2);
- ret = uclass_get_device_by_driver(UCLASS_VIDEO,
DM_DRIVER_GET(sunxi_de2), &de2);
if (ret) {
debug("DE2 not present\n"); return 0;
@@ -342,8 +333,8 @@ int sunxi_simplefb_setup(void *blob)
return 0;
}
- ret = uclass_find_device_by_name(UCLASS_DISPLAY,
"sunxi_dw_hdmi",
&hdmi);
- ret = uclass_get_device_by_driver(UCLASS_DISPLAY,
DM_DRIVER_GET(sunxi_dw_hdmi), &hdmi);
if (ret) {
debug("HDMI not present\n");
} else if (device_active(hdmi)) {
@@ -355,8 +346,8 @@ int sunxi_simplefb_setup(void *blob)
debug("HDMI present but not probed\n");
}
- ret = uclass_find_device_by_name(UCLASS_DISPLAY,
"sunxi_lcd", &lcd);
- ret = uclass_get_device_by_driver(UCLASS_DISPLAY,
DM_DRIVER_GET(sunxi_lcd), &lcd);
if (ret)
debug("LCD not present\n");
else if (device_active(lcd))