video: simplefb: modernise DT parsing
simplefb was using old style FDT parsing which doesn't behave well in
combination with livetree. Update it to use ofnode instead and add a
missing null check for the "format" property.
Standardise the error logging while we're here.
Fixes: 971d7e6424
("video: simplefb")
Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
This commit is contained in:

committed by
Anatolij Gustschin

parent
9970634f83
commit
91e9687b49
@@ -15,14 +15,14 @@ static int simple_video_probe(struct udevice *dev)
|
|||||||
{
|
{
|
||||||
struct video_uc_plat *plat = dev_get_uclass_plat(dev);
|
struct video_uc_plat *plat = dev_get_uclass_plat(dev);
|
||||||
struct video_priv *uc_priv = dev_get_uclass_priv(dev);
|
struct video_priv *uc_priv = dev_get_uclass_priv(dev);
|
||||||
const void *blob = gd->fdt_blob;
|
ofnode node = dev_ofnode(dev);
|
||||||
const int node = dev_of_offset(dev);
|
|
||||||
const char *format;
|
const char *format;
|
||||||
|
int ret;
|
||||||
fdt_addr_t base;
|
fdt_addr_t base;
|
||||||
fdt_size_t size;
|
fdt_size_t size;
|
||||||
|
u32 width, height, rot;
|
||||||
|
|
||||||
base = fdtdec_get_addr_size_auto_parent(blob, dev_of_offset(dev->parent),
|
base = dev_read_addr_size(dev, &size);
|
||||||
node, "reg", 0, &size, false);
|
|
||||||
if (base == FDT_ADDR_T_NONE) {
|
if (base == FDT_ADDR_T_NONE) {
|
||||||
debug("%s: Failed to decode memory region\n", __func__);
|
debug("%s: Failed to decode memory region\n", __func__);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@@ -41,17 +41,25 @@ static int simple_video_probe(struct udevice *dev)
|
|||||||
|
|
||||||
debug("%s: Query resolution...\n", __func__);
|
debug("%s: Query resolution...\n", __func__);
|
||||||
|
|
||||||
uc_priv->xsize = fdtdec_get_uint(blob, node, "width", 0);
|
ret = ofnode_read_u32(node, "width", &width);
|
||||||
uc_priv->ysize = fdtdec_get_uint(blob, node, "height", 0);
|
ret = ret ?: ofnode_read_u32(node, "height", &height);
|
||||||
uc_priv->rot = fdtdec_get_uint(blob, node, "rot", 0);
|
if (ret || !width || !height) {
|
||||||
if (uc_priv->rot > 3) {
|
log_err("%s: invalid width or height: %d\n", __func__, ret);
|
||||||
log_debug("%s: invalid rot\n", __func__);
|
return ret ?: -EINVAL;
|
||||||
return log_msg_ret("rot", -EINVAL);
|
|
||||||
}
|
}
|
||||||
|
ofnode_read_u32(node, "rot", &rot);
|
||||||
|
uc_priv->rot = rot;
|
||||||
|
uc_priv->xsize = width;
|
||||||
|
uc_priv->ysize = height;
|
||||||
|
|
||||||
format = fdt_getprop(blob, node, "format", NULL);
|
format = ofnode_read_string(node, "format");
|
||||||
debug("%s: %dx%d@%s\n", __func__, uc_priv->xsize, uc_priv->ysize, format);
|
debug("%s: %dx%d@%s\n", __func__, uc_priv->xsize, uc_priv->ysize, format);
|
||||||
|
|
||||||
|
if (!format) {
|
||||||
|
log_err("%s: please add required property \"format\"\n", __func__);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (strcmp(format, "r5g6b5") == 0) {
|
if (strcmp(format, "r5g6b5") == 0) {
|
||||||
uc_priv->bpix = VIDEO_BPP16;
|
uc_priv->bpix = VIDEO_BPP16;
|
||||||
} else if (strcmp(format, "a8b8g8r8") == 0 ||
|
} else if (strcmp(format, "a8b8g8r8") == 0 ||
|
||||||
@@ -67,7 +75,7 @@ static int simple_video_probe(struct udevice *dev)
|
|||||||
uc_priv->bpix = VIDEO_BPP32;
|
uc_priv->bpix = VIDEO_BPP32;
|
||||||
uc_priv->format = VIDEO_X2R10G10B10;
|
uc_priv->format = VIDEO_X2R10G10B10;
|
||||||
} else {
|
} else {
|
||||||
printf("%s: invalid format: %s\n", __func__, format);
|
log_err("%s: invalid format: %s\n", __func__, format);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user