/** * fwnode_property_present - check if a property of a firmware node is present * @fwnode: Firmware node whose property to check * @propname: Name of the property */ bool fwnode_property_present(struct fwnode_handle *fwnode, const char *propname) { if (is_of_node(fwnode)) return of_property_read_bool(to_of_node(fwnode), propname); else if (is_acpi_node(fwnode)) return !acpi_dev_prop_get(to_acpi_node(fwnode), propname, NULL); return !!pset_prop_get(to_pset(fwnode), propname); }
static int pset_prop_count_elems_of_size(struct property_set *pset, const char *propname, size_t length) { struct property_entry *prop; prop = pset_prop_get(pset, propname); if (!prop) return -EINVAL; return prop->length / length; }
static void *pset_prop_find(struct property_set *pset, const char *propname, size_t length) { struct property_entry *prop; void *pointer; prop = pset_prop_get(pset, propname); if (!prop) return ERR_PTR(-EINVAL); if (prop->is_array) pointer = prop->pointer.raw_data; else pointer = &prop->value.raw_data; if (!pointer) return ERR_PTR(-ENODATA); if (length > prop->length) return ERR_PTR(-EOVERFLOW); return pointer; }
static int pset_prop_read_array(struct property_set *pset, const char *name, enum dev_prop_type type, void *val, size_t nval) { struct property_entry *prop; unsigned int item_size; prop = pset_prop_get(pset, name); if (!prop) return -ENODATA; if (prop->type != type) return -EPROTO; if (!val) return prop->nval; if (prop->nval < nval) return -EOVERFLOW; switch (type) { case DEV_PROP_U8: item_size = sizeof(u8); break; case DEV_PROP_U16: item_size = sizeof(u16); break; case DEV_PROP_U32: item_size = sizeof(u32); break; case DEV_PROP_U64: item_size = sizeof(u64); break; case DEV_PROP_STRING: item_size = sizeof(const char *); break; default: return -EINVAL; } memcpy(val, prop->value.raw_data, nval * item_size); return 0; }
static int pset_prop_read_string(struct property_set *pset, const char *propname, const char **strings) { struct property_entry *prop; const char **pointer; prop = pset_prop_get(pset, propname); if (!prop) return -EINVAL; if (!prop->is_string) return -EILSEQ; if (prop->is_array) { pointer = prop->pointer.str; if (!pointer) return -ENODATA; } else { pointer = &prop->value.str; if (*pointer && strnlen(*pointer, prop->length) >= prop->length) return -EILSEQ; } *strings = *pointer; return 0; }