From 78f23081e11821cc62e7f1ca56c53fbd165f01fa Mon Sep 17 00:00:00 2001 From: Jianqun Xu Date: Fri, 13 Mar 2020 10:43:45 +0800 Subject: [PATCH] scripts/dtc: Support delete unused nodes Delete nodes in case of: * node is null, without any property and children node * node with 'status' property but not "okay" or "ok" Change-Id: Ic7d2ba1cb60350c21fa6a46222c20870c74359d4 Signed-off-by: Jianqun Xu --- drivers/of/Kconfig | 12 ++++++++++++ scripts/Makefile.lib | 8 ++++++++ scripts/dtc/checks.c | 23 +++++++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig index 5e1315900562..6953974e9d96 100644 --- a/drivers/of/Kconfig +++ b/drivers/of/Kconfig @@ -12,6 +12,18 @@ menuconfig OF if OF +config DTC_OMIT_DISABLED + bool "Fixup dtb by removing nodes with disabled status" + depends on DTC + help + This option used for dtc to delete nodes with disabled status. + +config DTC_OMIT_EMPTY + bool "Fixup dtb by removing empty nodes" + depends on DTC + help + This option used for dtc to delete empty nodes. + config OF_UNITTEST bool "Device Tree runtime unit tests" depends on !SPARC diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index f7988649dc25..47a24a6863ad 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -249,6 +249,14 @@ ifeq ($(CONFIG_ANDROID),y) DTC_FLAGS += -@ endif +ifeq ($(CONFIG_DTC_OMIT_DISABLED),y) +DTC_FLAGS += -Wnode_disabled +endif + +ifeq ($(CONFIG_DTC_OMIT_EMPTY),y) +DTC_FLAGS += -Wnode_empty +endif + # Disable noisy checks by default ifeq ($(findstring 1,$(KBUILD_ENABLE_EXTRA_GCC_CHECKS)),) DTC_FLAGS += -Wno-unit_address_vs_reg \ diff --git a/scripts/dtc/checks.c b/scripts/dtc/checks.c index a2cc1036c915..6302fa143331 100644 --- a/scripts/dtc/checks.c +++ b/scripts/dtc/checks.c @@ -623,6 +623,28 @@ static void fixup_path_references(struct check *c, struct dt_info *dti, } ERROR(path_references, fixup_path_references, NULL, &duplicate_node_names); +static void fixup_node_disabled(struct check *c, struct dt_info *dti, + struct node *node) +{ + struct property *prop = get_property(node, "status"); + + if (prop) { + const char *status = prop->val.val; + + if (strcmp(status, "ok") && strcmp(status, "okay")) + omit_node_if_unused(node); + } +} +CHECK(node_disabled, fixup_node_disabled, NULL); + +static void fixup_node_empty(struct check *c, struct dt_info *dti, + struct node *node) +{ + if (!node->proplist && !node->children) + omit_node_if_unused(node); +} +CHECK(node_empty, fixup_node_empty, NULL); + static void fixup_omit_unused_nodes(struct check *c, struct dt_info *dti, struct node *node) { @@ -1559,6 +1581,7 @@ static struct check *check_table[] = { &explicit_phandles, &phandle_references, &path_references, + &node_disabled, &node_empty, &omit_unused_nodes, &address_cells_is_cell, &size_cells_is_cell, &interrupt_cells_is_cell,