device_dt_metadata: handle dt_meta being NULL
Using DEVICE_DEFINE, a device without a corresponding DT node can be defined (for example CRYPTO_MTLS), Z_DEVICE_INIT() does not initialize dt_meta for such devices, leaving the field as NULL. device_get_dt_nodelabels() and functions calling it have to handle dev->dt_meta == NULL to prevent fatal errors. Signed-off-by: Jan Peters <peters@kt-elektronik.de>
This commit is contained in:
parent
086faa56aa
commit
b8bef42add
4 changed files with 7 additions and 4 deletions
|
@ -442,7 +442,7 @@ static int cmd_gpio_devices(const struct shell *sh, size_t argc, char **argv)
|
||||||
#ifdef CONFIG_DEVICE_DT_METADATA
|
#ifdef CONFIG_DEVICE_DT_METADATA
|
||||||
const struct device_dt_nodelabels *nl = device_get_dt_nodelabels(dev);
|
const struct device_dt_nodelabels *nl = device_get_dt_nodelabels(dev);
|
||||||
|
|
||||||
if (nl->num_nodelabels > 0) {
|
if (nl != NULL && nl->num_nodelabels > 0) {
|
||||||
for (size_t j = 0; j < nl->num_nodelabels; j++) {
|
for (size_t j = 0; j < nl->num_nodelabels; j++) {
|
||||||
const char *nodelabel = nl->nodelabels[j];
|
const char *nodelabel = nl->nodelabels[j];
|
||||||
|
|
||||||
|
|
|
@ -923,11 +923,14 @@ __syscall const struct device *device_get_by_dt_nodelabel(const char *nodelabel)
|
||||||
/**
|
/**
|
||||||
* @brief Get the devicetree node labels associated with a device
|
* @brief Get the devicetree node labels associated with a device
|
||||||
* @param dev device whose metadata to look up
|
* @param dev device whose metadata to look up
|
||||||
* @return information about the devicetree node labels
|
* @return information about the devicetree node labels or NULL if not available
|
||||||
*/
|
*/
|
||||||
static inline const struct device_dt_nodelabels *
|
static inline const struct device_dt_nodelabels *
|
||||||
device_get_dt_nodelabels(const struct device *dev)
|
device_get_dt_nodelabels(const struct device *dev)
|
||||||
{
|
{
|
||||||
|
if (dev->dt_meta == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
return dev->dt_meta->nl;
|
return dev->dt_meta->nl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -98,7 +98,7 @@ const struct device *z_impl_device_get_by_dt_nodelabel(const char *nodelabel)
|
||||||
STRUCT_SECTION_FOREACH(device, dev) {
|
STRUCT_SECTION_FOREACH(device, dev) {
|
||||||
const struct device_dt_nodelabels *nl = device_get_dt_nodelabels(dev);
|
const struct device_dt_nodelabels *nl = device_get_dt_nodelabels(dev);
|
||||||
|
|
||||||
if (!z_impl_device_is_ready(dev)) {
|
if (!z_impl_device_is_ready(dev) || nl == NULL) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -102,7 +102,7 @@ static int cmd_device_list(const struct shell *sh,
|
||||||
#ifdef CONFIG_DEVICE_DT_METADATA
|
#ifdef CONFIG_DEVICE_DT_METADATA
|
||||||
const struct device_dt_nodelabels *nl = device_get_dt_nodelabels(dev);
|
const struct device_dt_nodelabels *nl = device_get_dt_nodelabels(dev);
|
||||||
|
|
||||||
if (nl->num_nodelabels > 0) {
|
if (nl != NULL && nl->num_nodelabels > 0) {
|
||||||
shell_fprintf(sh, SHELL_NORMAL, " DT node labels:");
|
shell_fprintf(sh, SHELL_NORMAL, " DT node labels:");
|
||||||
for (size_t j = 0; j < nl->num_nodelabels; j++) {
|
for (size_t j = 0; j < nl->num_nodelabels; j++) {
|
||||||
const char *nodelabel = nl->nodelabels[j];
|
const char *nodelabel = nl->nodelabels[j];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue