mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-14 08:57:58 +00:00
dm: core: of_access: fix return value in of_property_match_string
of_property_match_string calls of_find_property to search for the string property. If the device node does not exist, of_find_property returns NULL, and of_property_match_string returns -EINVAL, which is correct. However, if the device node exists, but the property is not found, of_find_property still returns NULL, but it will place -FDT_ERR_NOTFOUND in the *lenp variable. of_property_match_string does not use the lenp parameter, thus this error case is being lost, and treated as if the node is NULL, and returns -EINVAL, which is incorrect. The callers of of_property_match_string treat the error differently if the return value is -EINVAL or -ENOENT, e.g. in dwc3 driver: ret = generic_phy_get_by_name(dev, "usb3-phy", &phy); if (!ret) { ret = generic_phy_init(&phy); if (ret) return ret; } else if (ret != -ENOENT && ret != -ENODATA) { debug("could not get phy (err %d)\n", ret); return ret; } else { phy.dev = NULL; } So the caller drivers will just consider the property missing if -ENOENT is returned, versus the case of -EINVAL, which means something else. To fix this situation, changed the code to call the of_find_property with the right third argument to catch this error code and treat it accordingly. Signed-off-by: Eugen Hristev <eugen.hristev@collabora.com>
This commit is contained in:
parent
0274eb61e1
commit
15a2865515
1 changed files with 4 additions and 1 deletions
|
@ -593,11 +593,14 @@ int of_read_u64(const struct device_node *np, const char *propname, u64 *outp)
|
||||||
int of_property_match_string(const struct device_node *np, const char *propname,
|
int of_property_match_string(const struct device_node *np, const char *propname,
|
||||||
const char *string)
|
const char *string)
|
||||||
{
|
{
|
||||||
const struct property *prop = of_find_property(np, propname, NULL);
|
int len = 0;
|
||||||
|
const struct property *prop = of_find_property(np, propname, &len);
|
||||||
size_t l;
|
size_t l;
|
||||||
int i;
|
int i;
|
||||||
const char *p, *end;
|
const char *p, *end;
|
||||||
|
|
||||||
|
if (!prop && len == -FDT_ERR_NOTFOUND)
|
||||||
|
return -ENOENT;
|
||||||
if (!prop)
|
if (!prop)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (!prop->value)
|
if (!prop->value)
|
||||||
|
|
Loading…
Reference in a new issue