* [PATCH v3 00/11] dtc: dt-check-style: Improvements for false positives
@ 2026-08-03 9:03 Krzysztof Kozlowski
2026-08-03 9:03 ` [PATCH v3 01/11] dtc: dt-check-style: Add missing /dts-v1/ to few test cases Krzysztof Kozlowski
` (10 more replies)
0 siblings, 11 replies; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-03 9:03 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan, Test User, Krzysztof Kozlowski,
Conor Dooley
Cc: devicetree, linux-kernel, Krzysztof Kozlowski
Changes in v3:
- Responded to Sashiko and implemented its comments
- Properly handle root node with more than one space "/ {"
- Add more unit tests for DTSO whether properties and nodes are properly
detected as top-level
- Link to v2: https://patch.msgid.link/20260802-n-dts-style-checker-continued-v2-0-6c5dbd1ccfe4@oss.qualcomm.com
Changes in v2:
- Trailing slash to maintainers path
- New patches:
- Patch #9: dtc: dt-check-style: Add test for trailing white-space in DTS
- Patch #10: dtc: dt-check-style: Add warning for redundant white-spaces
- Several fixes based on Sashiko's report (I responded to these on the
lists)
- _walk_bodies(): Fix setting up proper parent to each node after
exiting node parsing. This wasn't working correctly.
- check_child_name_order(): Properly sort top-level nodes by names,
even if it comes with unit address like memory@1000
- Add rest of property_bucket sorting for top-level properties,
even though no properties are expected there, except few vendor
ones
- check_continuation_alignment(): Improve error msg for
continuned-lines alignment warnings
- Link to v1: https://patch.msgid.link/20260726-n-dts-style-checker-continued-v1-0-b05b8f897670@oss.qualcomm.com
Few improvements and proper handling of top-level node (name, not unit
address sorting) and property (model before compatible) sorting.
Best regards,
Krzysztof
---
Krzysztof Kozlowski (11):
dtc: dt-check-style: Add missing /dts-v1/ to few test cases
dtc: dt-check-style: Simplify setting depth of DtsLine
dtc: dt-check-style: Handle root node in overlays
dtc: dt-check-style: Handle sorting of top-level nodes and properties
dtc: dt-check-style: Drop stray backslash before quote for continuation-alignment
dtc: dt-check-style: Fix alignment of values in continued property lines
dtc: dt-check-style: Consistently call 'kind' as 'file_type'
dtc: dt-check-style: Introduce 'stricter' mode
dtc: dt-check-style: Add test for trailing white-space in DTS
dtc: dt-check-style: Add warning for redundant white-spaces
MAINTAINERS: dt-bindings: Include dt-check-style in DT binding entry
MAINTAINERS | 2 +
scripts/dtc/dt-check-style | 210 +++++++++++++++------
.../dt-style-selftest/bad/dts-child-name-order.dts | 2 +
.../dts-child-name-order.dtso} | 23 ++-
.../dtc/dt-style-selftest/bad/dts-cont-align.dts | 23 +++
.../{good => bad}/dts-digit-node-order.dts | 15 +-
.../dts-digit-node-order.dtso} | 18 +-
.../bad/dts-extend-node-child-name-order.dts | 2 +
.../bad/dts-extend-node-digit-node-order.dts | 2 +
.../dtc/dt-style-selftest/bad/dts-line-length.dts | 21 +++
.../dt-style-selftest/bad/dts-property-order.dts | 7 +-
...-property-order.dts => dts-property-order.dtso} | 8 +-
.../bad/dts-redundant-ws-strict.dts | 27 +++
...e-digit-node-order.dts => dts-redundant-ws.dts} | 30 ++-
.../dtc/dt-style-selftest/bad/dts-trailing-ws.dts | 8 +
.../dtc/dt-style-selftest/bad/dts-unused-label.dts | 21 +++
.../dtc/dt-style-selftest/bad/yaml-cont-align.yaml | 4 +-
.../bad/yaml-redundant-ws-strict.yaml | 29 +++
.../dt-style-selftest/bad/yaml-redundant-ws.yaml | 29 +++
.../expected/dts-child-name-order.dts.txt | 3 +-
.../expected/dts-child-name-order.dtso.txt | 3 +
.../expected/dts-cont-align.dts.txt | 8 +
.../expected/dts-digit-node-order.dts.txt | 2 +
.../expected/dts-digit-node-order.dtso.txt | 2 +
.../dts-extend-node-child-name-order.dts.txt | 2 +-
.../dts-extend-node-digit-node-order.dts.txt | 2 +-
.../expected/dts-line-length.dts.txt | 2 +
.../expected/dts-property-order.dts.txt | 13 +-
.../expected/dts-property-order.dtso.txt | 8 +
.../expected/dts-redundant-ws-strict.dts.txt | 13 ++
.../expected/dts-redundant-ws.dts.txt | 9 +
.../expected/dts-trailing-ws.dts.txt | 2 +
.../expected/dts-unused-label.dts.txt | 2 +
.../expected/yaml-cont-align.yaml.txt | 3 +-
.../expected/yaml-redundant-ws-strict.yaml.txt | 5 +
.../expected/yaml-redundant-ws.yaml.txt | 3 +
.../expected/yaml-value-ws-multiline.yaml.txt | 1 +
.../good/dts-child-name-order.dts | 2 +
...ld-name-order.dts => dts-child-name-order.dtso} | 5 +-
.../dtc/dt-style-selftest/good/dts-cont-align.dts | 11 +-
.../good/dts-digit-node-order.dts | 5 +-
...it-node-order.dts => dts-digit-node-order.dtso} | 8 +-
.../good/dts-extend-node-child-name-order.dts | 2 +
.../good/dts-extend-node-digit-node-order.dts | 2 +
.../dt-style-selftest/good/dts-property-order.dts | 5 +
...-property-order.dts => dts-property-order.dtso} | 8 +-
scripts/dtc/dt-style-selftest/good/soc.dtsi | 2 +
.../{bad => good}/yaml-cont-align.yaml | 8 +-
scripts/dtc/dt-style-selftest/run.sh | 2 +-
49 files changed, 494 insertions(+), 130 deletions(-)
---
base-commit: 1c8869cfe9534aa9c3179ff0ad36f2b17e1347f5
change-id: 20260726-n-dts-style-checker-continued-b6a05e278891
Best regards,
--
Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v3 01/11] dtc: dt-check-style: Add missing /dts-v1/ to few test cases
2026-08-03 9:03 [PATCH v3 00/11] dtc: dt-check-style: Improvements for false positives Krzysztof Kozlowski
@ 2026-08-03 9:03 ` Krzysztof Kozlowski
2026-08-03 22:30 ` Rob Herring (Arm)
2026-08-03 9:03 ` [PATCH v3 02/11] dtc: dt-check-style: Simplify setting depth of DtsLine Krzysztof Kozlowski
` (9 subsequent siblings)
10 siblings, 1 reply; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-03 9:03 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan, Test User, Krzysztof Kozlowski,
Conor Dooley
Cc: devicetree, linux-kernel, Krzysztof Kozlowski
The selftest DTS should still look like a real DTS, so it needs
'/dts-v1/' marking.
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
---
scripts/dtc/dt-style-selftest/bad/dts-child-name-order.dts | 2 ++
scripts/dtc/dt-style-selftest/bad/dts-extend-node-child-name-order.dts | 2 ++
scripts/dtc/dt-style-selftest/bad/dts-extend-node-digit-node-order.dts | 2 ++
scripts/dtc/dt-style-selftest/expected/dts-child-name-order.dts.txt | 2 +-
.../dt-style-selftest/expected/dts-extend-node-child-name-order.dts.txt | 2 +-
.../dt-style-selftest/expected/dts-extend-node-digit-node-order.dts.txt | 2 +-
scripts/dtc/dt-style-selftest/good/dts-child-name-order.dts | 2 ++
scripts/dtc/dt-style-selftest/good/dts-digit-node-order.dts | 2 ++
scripts/dtc/dt-style-selftest/good/dts-extend-node-child-name-order.dts | 2 ++
scripts/dtc/dt-style-selftest/good/dts-extend-node-digit-node-order.dts | 2 ++
scripts/dtc/dt-style-selftest/good/soc.dtsi | 2 ++
11 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/scripts/dtc/dt-style-selftest/bad/dts-child-name-order.dts b/scripts/dtc/dt-style-selftest/bad/dts-child-name-order.dts
index 49c5c10c92d7..54be9f07b680 100644
--- a/scripts/dtc/dt-style-selftest/bad/dts-child-name-order.dts
+++ b/scripts/dtc/dt-style-selftest/bad/dts-child-name-order.dts
@@ -1,4 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/dts-v1/;
+
/ {
#address-cells = <1>;
#size-cells = <1>;
diff --git a/scripts/dtc/dt-style-selftest/bad/dts-extend-node-child-name-order.dts b/scripts/dtc/dt-style-selftest/bad/dts-extend-node-child-name-order.dts
index 575dadd03c38..296c58a545d5 100644
--- a/scripts/dtc/dt-style-selftest/bad/dts-extend-node-child-name-order.dts
+++ b/scripts/dtc/dt-style-selftest/bad/dts-extend-node-child-name-order.dts
@@ -1,4 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/dts-v1/;
+
/ {
#address-cells = <1>;
#size-cells = <1>;
diff --git a/scripts/dtc/dt-style-selftest/bad/dts-extend-node-digit-node-order.dts b/scripts/dtc/dt-style-selftest/bad/dts-extend-node-digit-node-order.dts
index f3ffc47365a3..813900e3393c 100644
--- a/scripts/dtc/dt-style-selftest/bad/dts-extend-node-digit-node-order.dts
+++ b/scripts/dtc/dt-style-selftest/bad/dts-extend-node-digit-node-order.dts
@@ -1,4 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/dts-v1/;
+
/ {
#address-cells = <1>;
#size-cells = <1>;
diff --git a/scripts/dtc/dt-style-selftest/expected/dts-child-name-order.dts.txt b/scripts/dtc/dt-style-selftest/expected/dts-child-name-order.dts.txt
index 86b1de9bd654..e2eea0862102 100644
--- a/scripts/dtc/dt-style-selftest/expected/dts-child-name-order.dts.txt
+++ b/scripts/dtc/dt-style-selftest/expected/dts-child-name-order.dts.txt
@@ -1,2 +1,2 @@
# mode=strict
-bad/dts-child-name-order.dts:14: [child-name-order] child node 'bar' out of name order
+bad/dts-child-name-order.dts:16: [child-name-order] child node 'bar' out of name order
diff --git a/scripts/dtc/dt-style-selftest/expected/dts-extend-node-child-name-order.dts.txt b/scripts/dtc/dt-style-selftest/expected/dts-extend-node-child-name-order.dts.txt
index e3d8fd367e09..b6e74e6f923e 100644
--- a/scripts/dtc/dt-style-selftest/expected/dts-extend-node-child-name-order.dts.txt
+++ b/scripts/dtc/dt-style-selftest/expected/dts-extend-node-child-name-order.dts.txt
@@ -1,2 +1,2 @@
# mode=strict
-bad/dts-extend-node-child-name-order.dts:20: [child-name-order] child node 'bar' out of name order
+bad/dts-extend-node-child-name-order.dts:22: [child-name-order] child node 'bar' out of name order
diff --git a/scripts/dtc/dt-style-selftest/expected/dts-extend-node-digit-node-order.dts.txt b/scripts/dtc/dt-style-selftest/expected/dts-extend-node-digit-node-order.dts.txt
index 525081867bf7..bf252e4d9815 100644
--- a/scripts/dtc/dt-style-selftest/expected/dts-extend-node-digit-node-order.dts.txt
+++ b/scripts/dtc/dt-style-selftest/expected/dts-extend-node-digit-node-order.dts.txt
@@ -1,2 +1,2 @@
# mode=strict
-bad/dts-extend-node-digit-node-order.dts:21: [child-address-order] child node @10000 out of address order
+bad/dts-extend-node-digit-node-order.dts:23: [child-address-order] child node @10000 out of address order
diff --git a/scripts/dtc/dt-style-selftest/good/dts-child-name-order.dts b/scripts/dtc/dt-style-selftest/good/dts-child-name-order.dts
index d2a278763c3c..af0adf5abf70 100644
--- a/scripts/dtc/dt-style-selftest/good/dts-child-name-order.dts
+++ b/scripts/dtc/dt-style-selftest/good/dts-child-name-order.dts
@@ -1,4 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/dts-v1/;
+
/ {
#address-cells = <1>;
#size-cells = <1>;
diff --git a/scripts/dtc/dt-style-selftest/good/dts-digit-node-order.dts b/scripts/dtc/dt-style-selftest/good/dts-digit-node-order.dts
index d2bf5861c3ee..cdf3f91ebe01 100644
--- a/scripts/dtc/dt-style-selftest/good/dts-digit-node-order.dts
+++ b/scripts/dtc/dt-style-selftest/good/dts-digit-node-order.dts
@@ -1,4 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/dts-v1/;
+
/ {
#address-cells = <1>;
#size-cells = <1>;
diff --git a/scripts/dtc/dt-style-selftest/good/dts-extend-node-child-name-order.dts b/scripts/dtc/dt-style-selftest/good/dts-extend-node-child-name-order.dts
index 47fe5455edfa..97d468051f25 100644
--- a/scripts/dtc/dt-style-selftest/good/dts-extend-node-child-name-order.dts
+++ b/scripts/dtc/dt-style-selftest/good/dts-extend-node-child-name-order.dts
@@ -1,4 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/dts-v1/;
+
/ {
#address-cells = <1>;
#size-cells = <1>;
diff --git a/scripts/dtc/dt-style-selftest/good/dts-extend-node-digit-node-order.dts b/scripts/dtc/dt-style-selftest/good/dts-extend-node-digit-node-order.dts
index 0c292fefa52a..faf49962faf2 100644
--- a/scripts/dtc/dt-style-selftest/good/dts-extend-node-digit-node-order.dts
+++ b/scripts/dtc/dt-style-selftest/good/dts-extend-node-digit-node-order.dts
@@ -1,4 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/dts-v1/;
+
/ {
#address-cells = <1>;
#size-cells = <1>;
diff --git a/scripts/dtc/dt-style-selftest/good/soc.dtsi b/scripts/dtc/dt-style-selftest/good/soc.dtsi
index c60274469555..deec1a973c92 100644
--- a/scripts/dtc/dt-style-selftest/good/soc.dtsi
+++ b/scripts/dtc/dt-style-selftest/good/soc.dtsi
@@ -1,4 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/dts-v1/;
+
/ {
#address-cells = <1>;
#size-cells = <1>;
--
2.53.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 02/11] dtc: dt-check-style: Simplify setting depth of DtsLine
2026-08-03 9:03 [PATCH v3 00/11] dtc: dt-check-style: Improvements for false positives Krzysztof Kozlowski
2026-08-03 9:03 ` [PATCH v3 01/11] dtc: dt-check-style: Add missing /dts-v1/ to few test cases Krzysztof Kozlowski
@ 2026-08-03 9:03 ` Krzysztof Kozlowski
2026-08-03 22:31 ` Rob Herring (Arm)
2026-08-03 9:03 ` [PATCH v3 03/11] dtc: dt-check-style: Handle root node in overlays Krzysztof Kozlowski
` (8 subsequent siblings)
10 siblings, 1 reply; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-03 9:03 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan, Test User, Krzysztof Kozlowski,
Conor Dooley
Cc: devicetree, linux-kernel, Krzysztof Kozlowski
When creating new DtsLine object, pass expected indentation depth as
constructor, instead of assigning it immediately after, so the code will
be easier to read and explicit (depth is not supposed to change during
DtsLine lifetime).
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
---
scripts/dtc/dt-check-style | 31 +++++++++++--------------------
1 file changed, 11 insertions(+), 20 deletions(-)
diff --git a/scripts/dtc/dt-check-style b/scripts/dtc/dt-check-style
index 3985923622e8..96deffc0d8a7 100755
--- a/scripts/dtc/dt-check-style
+++ b/scripts/dtc/dt-check-style
@@ -82,11 +82,12 @@ class DtsLine:
'node_name', 'node_addr', 'label', 'ref_name', 'depth',
'closures')
- def __init__(self, lineno, raw, linetype, indent_str, stripped):
+ def __init__(self, lineno, raw, linetype, depth, indent_str, stripped):
self.lineno = lineno # 1-based within the block
self.raw = raw
self.linetype = linetype
self.indent_str = indent_str # leading whitespace as-is
+ self.depth = depth
self.stripped = stripped
self.prop_name = None
self.continuations = []
@@ -94,7 +95,6 @@ class DtsLine:
self.node_addr = None
self.label = None
self.ref_name = None
- self.depth = 0 # filled in by classify_lines
self.closures = 1 # count of '}' on a NODE_CLOSE line
@@ -162,16 +162,14 @@ def classify_lines(text):
# or a blank line).
if in_cpp_macro:
dl = DtsLine(i, raw, LineType.PREPROCESSOR,
- indent_str, stripped)
- dl.depth = depth
+ depth, indent_str, stripped)
out.append(dl)
in_cpp_macro = (bool(stripped) and
stripped.rstrip().endswith('\\'))
continue
if not stripped:
- dl = DtsLine(i, raw, LineType.BLANK, '', '')
- dl.depth = depth
+ dl = DtsLine(i, raw, LineType.BLANK, depth, '', '')
out.append(dl)
continue
@@ -180,15 +178,13 @@ def classify_lines(text):
else LineType.COMMENT_BODY)
if ltype == LineType.COMMENT_END:
in_block_comment = False
- dl = DtsLine(i, raw, ltype, indent_str, stripped)
- dl.depth = depth
+ dl = DtsLine(i, raw, ltype, depth, indent_str, stripped)
out.append(dl)
continue
if (stripped.startswith('#') or stripped.startswith('/')) and is_preprocessor(stripped):
- dl = DtsLine(i, raw, LineType.PREPROCESSOR,
+ dl = DtsLine(i, raw, LineType.PREPROCESSOR, depth,
indent_str, stripped)
- dl.depth = depth
out.append(dl)
prev_complete = True
in_cpp_macro = stripped.rstrip().endswith('\\')
@@ -205,14 +201,12 @@ def classify_lines(text):
# structural classification entirely.
if not code:
ltype = LineType.COMMENT_START if opens_block else LineType.COMMENT
- dl = DtsLine(i, raw, ltype, indent_str, stripped)
- dl.depth = depth
+ dl = DtsLine(i, raw, ltype, depth, indent_str, stripped)
out.append(dl)
continue
if not prev_complete:
- dl = DtsLine(i, raw, LineType.CONTINUATION, indent_str, code)
- dl.depth = depth
+ dl = DtsLine(i, raw, LineType.CONTINUATION, depth, indent_str, code)
out.append(dl)
prev_complete = (code.endswith(';') or
code.endswith('{') or
@@ -227,26 +221,23 @@ def classify_lines(text):
if re_only_closures.match(code):
closures = code.count('}')
depth = max(depth - closures, 0)
- dl = DtsLine(i, raw, LineType.NODE_CLOSE, indent_str, code)
- dl.depth = depth
+ dl = DtsLine(i, raw, LineType.NODE_CLOSE, depth, indent_str, code)
dl.closures = closures
out.append(dl)
prev_complete = True
continue
if code.endswith('{'):
- dl = DtsLine(i, raw, LineType.NODE_OPEN, indent_str, code)
+ dl = DtsLine(i, raw, LineType.NODE_OPEN, depth, indent_str, code)
parse_node_header(dl)
- dl.depth = depth
out.append(dl)
depth += 1
prev_complete = True
continue
# Property (or first line of a multi-line property).
- dl = DtsLine(i, raw, LineType.PROPERTY, indent_str, code)
+ dl = DtsLine(i, raw, LineType.PROPERTY, depth, indent_str, code)
parse_property_name(dl)
- dl.depth = depth
out.append(dl)
prev_complete = code.endswith(';')
--
2.53.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 03/11] dtc: dt-check-style: Handle root node in overlays
2026-08-03 9:03 [PATCH v3 00/11] dtc: dt-check-style: Improvements for false positives Krzysztof Kozlowski
2026-08-03 9:03 ` [PATCH v3 01/11] dtc: dt-check-style: Add missing /dts-v1/ to few test cases Krzysztof Kozlowski
2026-08-03 9:03 ` [PATCH v3 02/11] dtc: dt-check-style: Simplify setting depth of DtsLine Krzysztof Kozlowski
@ 2026-08-03 9:03 ` Krzysztof Kozlowski
2026-08-03 9:18 ` sashiko-bot
2026-08-03 9:03 ` [PATCH v3 04/11] dtc: dt-check-style: Handle sorting of top-level nodes and properties Krzysztof Kozlowski
` (7 subsequent siblings)
10 siblings, 1 reply; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-03 9:03 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan, Test User, Krzysztof Kozlowski,
Conor Dooley
Cc: devicetree, linux-kernel, Krzysztof Kozlowski
Detection of overriding/extending a root node should be a bit more
complex than comparing node name from regex, because overlays use often
'&{/} {' notation. Check for expected syntax before creating DtsLine
and store it as 'is_root' attribute for further logic.
This fixes false positives for property order for root nodes in overlays.
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
---
scripts/dtc/dt-check-style | 14 +++++--
.../dt-style-selftest/bad/dts-property-order.dts | 2 +-
.../dt-style-selftest/bad/dts-property-order.dtso | 49 ++++++++++++++++++++++
.../expected/dts-property-order.dtso.txt | 7 ++++
4 files changed, 67 insertions(+), 5 deletions(-)
diff --git a/scripts/dtc/dt-check-style b/scripts/dtc/dt-check-style
index 96deffc0d8a7..d9f76d6d9179 100755
--- a/scripts/dtc/dt-check-style
+++ b/scripts/dtc/dt-check-style
@@ -77,18 +77,19 @@ def is_preprocessor(stripped):
class DtsLine:
- __slots__ = ('lineno', 'raw', 'linetype', 'indent_str', 'stripped',
+ __slots__ = ('lineno', 'raw', 'linetype', 'indent_str', 'stripped', 'is_root',
'prop_name', 'continuations',
'node_name', 'node_addr', 'label', 'ref_name', 'depth',
'closures')
- def __init__(self, lineno, raw, linetype, depth, indent_str, stripped):
+ def __init__(self, lineno, raw, linetype, depth, indent_str, stripped, is_root = False):
self.lineno = lineno # 1-based within the block
self.raw = raw
self.linetype = linetype
self.indent_str = indent_str # leading whitespace as-is
self.depth = depth
self.stripped = stripped
+ self.is_root = is_root
self.prop_name = None
self.continuations = []
self.node_name = None
@@ -228,7 +229,10 @@ def classify_lines(text):
continue
if code.endswith('{'):
- dl = DtsLine(i, raw, LineType.NODE_OPEN, depth, indent_str, code)
+ is_root = False
+ if code == '&{/} {' or re.search(r'^/\s+\{$', code):
+ is_root = True
+ dl = DtsLine(i, raw, LineType.NODE_OPEN, depth, indent_str, code, is_root=is_root)
parse_node_header(dl)
out.append(dl)
depth += 1
@@ -550,7 +554,9 @@ def check_child_name_order(ctx):
for c in children:
if c.node_addr is not None:
continue
- if c.node_name in (None, '/'):
+ if c.node_name is None:
+ continue
+ if c.is_root:
continue
if c.ref_name is not None:
continue
diff --git a/scripts/dtc/dt-style-selftest/bad/dts-property-order.dts b/scripts/dtc/dt-style-selftest/bad/dts-property-order.dts
index f31abb6ceae4..782cd55ec283 100644
--- a/scripts/dtc/dt-style-selftest/bad/dts-property-order.dts
+++ b/scripts/dtc/dt-style-selftest/bad/dts-property-order.dts
@@ -5,7 +5,7 @@
/dts-v1/;
-/ {
+/ {
cpus {
#address-cells = <1>;
#size-cells = <0>;
diff --git a/scripts/dtc/dt-style-selftest/bad/dts-property-order.dtso b/scripts/dtc/dt-style-selftest/bad/dts-property-order.dtso
new file mode 100644
index 000000000000..81ac2b092b96
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/bad/dts-property-order.dtso
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/*
+ * Test fixture: Incorrect property order
+ */
+
+/dts-v1/;
+/plugin/;
+
+&{/} {
+ compatible = "example,test-board", "example,test-soc";
+ model = "DT style selftest";
+ qcom,board-id = <8 0>;
+ chassis-type = "handset";
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ cpu@0 {
+ reg = <0x0 0x0>;
+ compatible = "arm,cortex-a57";
+ device_type = "cpu";
+ enable-method = "psci";
+ };
+ };
+
+ pmu {
+ compatible = "example,pmu";
+
+ status = "disabled";
+ dma-coherent;
+ };
+
+ soc@0 {
+ ranges = <0 0 0 0xc0000000>;
+ compatible = "simple-bus";
+
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ interrupt-controller@10000 {
+ reg = <0x10000 0x1000>;
+ interrupts = <1 2 3>,
+ <4 5 6>,
+ <7 8 9>;
+ compatible = "example,intc";
+ };
+ };
+};
diff --git a/scripts/dtc/dt-style-selftest/expected/dts-property-order.dtso.txt b/scripts/dtc/dt-style-selftest/expected/dts-property-order.dtso.txt
new file mode 100644
index 000000000000..a78b8c042aa5
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/expected/dts-property-order.dtso.txt
@@ -0,0 +1,7 @@
+# mode=strict
+bad/dts-property-order.dtso:13: [property-order] property 'chassis-type' out of canonical order (should sort before 'qcom,board-id')
+bad/dts-property-order.dtso:21: [property-order] property 'compatible' out of canonical order (should sort before 'reg')
+bad/dts-property-order.dtso:22: [property-order] property 'device_type' out of canonical order (should sort before 'compatible')
+bad/dts-property-order.dtso:31: [property-order] property 'dma-coherent' out of canonical order (should sort before 'status')
+bad/dts-property-order.dtso:36: [property-order] property 'compatible' out of canonical order (should sort before 'ranges')
+bad/dts-property-order.dtso:46: [property-order] property 'compatible' out of canonical order (should sort before 'interrupts')
--
2.53.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 04/11] dtc: dt-check-style: Handle sorting of top-level nodes and properties
2026-08-03 9:03 [PATCH v3 00/11] dtc: dt-check-style: Improvements for false positives Krzysztof Kozlowski
` (2 preceding siblings ...)
2026-08-03 9:03 ` [PATCH v3 03/11] dtc: dt-check-style: Handle root node in overlays Krzysztof Kozlowski
@ 2026-08-03 9:03 ` Krzysztof Kozlowski
2026-08-03 9:20 ` sashiko-bot
2026-08-03 9:03 ` [PATCH v3 05/11] dtc: dt-check-style: Drop stray backslash before quote for continuation-alignment Krzysztof Kozlowski
` (6 subsequent siblings)
10 siblings, 1 reply; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-03 9:03 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan, Test User, Krzysztof Kozlowski,
Conor Dooley
Cc: devicetree, linux-kernel, Krzysztof Kozlowski
Top-level DTS (but not example in the bindings) has only two nodes with
unit-addresses: memory@ and soc@. There are two special cases here, in
terms of coding style:
1. The unit-address of memory is often not known thus set to @0, because
it is filled up by bootloader.
2. There is mixture of non-unit-address and unit-address nodes.
Therefore usually the DTS chooses for the top-level part sorting by the
node name, not the unit address.
Also the properties have one exception: 'model' property is supposed to
be before the 'compatible'. This cannot be applied to the entire DTS,
because sound cards have also 'model' where it is supposed to follow
standard rules (after the 'compatible'). Root node is just special.
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
---
scripts/dtc/dt-check-style | 60 +++++++++++++++++++---
.../bad/dts-child-name-order.dtso | 33 ++++++++++++
.../dt-style-selftest/bad/dts-digit-node-order.dts | 40 +++++++++++++++
.../bad/dts-digit-node-order.dtso | 41 +++++++++++++++
.../dt-style-selftest/bad/dts-property-order.dts | 5 ++
.../expected/dts-child-name-order.dts.txt | 1 +
.../expected/dts-child-name-order.dtso.txt | 3 ++
.../expected/dts-digit-node-order.dts.txt | 2 +
.../expected/dts-digit-node-order.dtso.txt | 2 +
.../expected/dts-property-order.dts.txt | 13 +++--
.../expected/dts-property-order.dtso.txt | 1 +
.../good/dts-child-name-order.dtso | 33 ++++++++++++
.../good/dts-digit-node-order.dts | 3 --
.../good/dts-digit-node-order.dtso | 41 +++++++++++++++
.../dt-style-selftest/good/dts-property-order.dts | 5 ++
.../dt-style-selftest/good/dts-property-order.dtso | 47 +++++++++++++++++
16 files changed, 315 insertions(+), 15 deletions(-)
diff --git a/scripts/dtc/dt-check-style b/scripts/dtc/dt-check-style
index d9f76d6d9179..f9e5762862a5 100755
--- a/scripts/dtc/dt-check-style
+++ b/scripts/dtc/dt-check-style
@@ -79,7 +79,7 @@ def is_preprocessor(stripped):
class DtsLine:
__slots__ = ('lineno', 'raw', 'linetype', 'indent_str', 'stripped', 'is_root',
'prop_name', 'continuations',
- 'node_name', 'node_addr', 'label', 'ref_name', 'depth',
+ 'node_name', 'node_addr', 'label', 'ref_name', 'parent', 'depth',
'closures')
def __init__(self, lineno, raw, linetype, depth, indent_str, stripped, is_root = False):
@@ -96,6 +96,7 @@ class DtsLine:
self.node_addr = None
self.label = None
self.ref_name = None
+ self.parent = None # DtsLine of parent node
self.closures = 1 # count of '}' on a NODE_CLOSE line
@@ -495,16 +496,24 @@ def _walk_bodies(lines):
"""Yield lists of immediate-child NODE_OPEN lines for each node body
in the input. Skips ref-nodes (&label) since those don't have an
intrinsic ordering."""
+ # Array of stacked nodes (parent/child)
body_stack = [[]]
+ # Current stack of nodes, purely to track parent relationship for each node
+ node_stack = []
+ parent_dl = None
for dl in lines:
if dl.linetype == LineType.NODE_OPEN:
+ dl.parent = parent_dl
+ node_stack.append(dl)
body_stack[-1].append(dl)
body_stack.append([])
+ parent_dl = dl
continue
if dl.linetype == LineType.NODE_CLOSE:
if len(body_stack) <= 1:
# Unbalanced; ignore to avoid crashing on malformed input
continue
+ parent_dl = node_stack.pop().parent
yield body_stack.pop()
continue
while body_stack:
@@ -525,12 +534,18 @@ def _natural_sort_key(s):
def check_child_address_order(ctx):
"""Addressed siblings (foo@N) must appear in ascending address
- order within their parent node body."""
+ order within their parent node body.
+ Exception: Top-level in DTS follows name order, regardless of unit address
+ in memory@N and soc@N nodes
+ """
for children in _walk_bodies(ctx.lines):
addressed = []
for c in children:
if c.node_addr is None:
continue
+ if c.parent and c.parent.is_root:
+ # Top-level does not use unit address sorting usually
+ continue
try:
parts = tuple(int(p, 16) for p in c.node_addr.split(','))
except ValueError:
@@ -548,12 +563,16 @@ def check_child_name_order(ctx):
"""Unaddressed siblings must appear in natural-sort order by node
name within their parent node body. Addressed children are scoped
by check_child_address_order; reference nodes (&label { ... }) and
- the root node are skipped."""
+ the root node are skipped.
+ However root node has children with and without unit address, and
+ sorting should be only by name."""
for children in _walk_bodies(ctx.lines):
unaddressed = []
for c in children:
if c.node_addr is not None:
- continue
+ # Skip nodes with unit address, except when sorting top-level
+ if not c.parent or not c.parent.is_root:
+ continue
if c.node_name is None:
continue
if c.is_root:
@@ -597,6 +616,30 @@ def _property_bucket(name):
return (5 if ',' in stripped else 4, None)
+def _property_bucket_root(name):
+ """Return the canonical bucket index for a property:
+ 0 model (for root nodes only)
+ 1 compatible
+ Plus a sub-key inside the bucket for fixed slots (device_type, compatible,
+ reg, reg-names, ranges, status). 'standard' and 'vendor' return None for
+ the sub-key, signalling that the within-bucket key is computed by
+ the pairing rules."""
+ stripped = name.lstrip('#')
+ if name == 'model':
+ return (0, 0)
+ if name == 'compatible':
+ return (1, 0)
+ if name == 'reg':
+ return (2, 0)
+ if name == 'reg-names':
+ return (2, 1)
+ if name == 'ranges':
+ return (3, 0)
+ if name == 'status':
+ return (6, 0)
+ return (5 if ',' in stripped else 4, None)
+
+
# Declarative pairing rules: each is a callable
# (name, all_names) -> anchor_name_or_None
# If a rule returns an anchor, the property sorts immediately after the
@@ -633,13 +676,16 @@ def _pair_x_names(name, all_names):
PAIRING_RULES = (_pair_pinctrl_names, _pair_x_names)
-def _property_sort_key(name, all_names):
+def _property_sort_key(dl, name, all_names):
"""Sort key for a property among its node-body siblings.
Format: (bucket, within_key, tiebreak). 'within_key' for
standard/vendor buckets follows pairing rules: a property paired
with anchor X sorts as if it were X with a higher tiebreak."""
- bucket, fixed_sub = _property_bucket(name)
+ if dl.is_root:
+ bucket, fixed_sub = _property_bucket_root(name)
+ else:
+ bucket, fixed_sub = _property_bucket(name)
if fixed_sub is not None:
return (bucket, (), fixed_sub)
@@ -674,7 +720,7 @@ def check_property_order(ctx):
if len(props) < 2:
continue
all_names = [p.prop_name for p in props]
- keyed = [(p, _property_sort_key(p.prop_name, all_names))
+ keyed = [(p, _property_sort_key(dl, p.prop_name, all_names))
for p in props]
for k in range(1, len(keyed)):
if keyed[k][1] < keyed[k - 1][1]:
diff --git a/scripts/dtc/dt-style-selftest/bad/dts-child-name-order.dtso b/scripts/dtc/dt-style-selftest/bad/dts-child-name-order.dtso
new file mode 100644
index 000000000000..74b49be69e98
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/bad/dts-child-name-order.dtso
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/dts-v1/;
+/plugin/;
+
+&{/} {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ pmu {
+ compatible = "example,pmu";
+
+ /* Include labels to be sure they do not affect sorting */
+ foo: foo {
+ label = "foo";
+ };
+
+ label_bar: bar {
+ label = "bar";
+ };
+ };
+
+ memory@a0000000 {
+ device_type = "memory";
+ reg = <0x0 0xa0000000 0x0 0x0>;
+ };
+
+ pmu-2 {
+ compatible = "example,pmu";
+
+ /* Just reference labels to avoid strict warnings */
+ example,foo = <&foo>, <&label_bar>;
+ };
+};
diff --git a/scripts/dtc/dt-style-selftest/bad/dts-digit-node-order.dts b/scripts/dtc/dt-style-selftest/bad/dts-digit-node-order.dts
new file mode 100644
index 000000000000..74c956398324
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/bad/dts-digit-node-order.dts
@@ -0,0 +1,40 @@
+// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/dts-v1/;
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ memory@a0000000 {
+ device_type = "memory";
+ reg = <0x0 0xa0000000 0x0 0x0>;
+ };
+
+ pmu {
+ compatible = "example,pmu";
+ };
+
+ soc@0 {
+ compatible = "simple-bus";
+ ranges = <0 0 0 0xc0000000>;
+
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ serial@20000 {
+ compatible = "example,serial";
+ reg = <0x20000 0x1000>;
+ };
+
+ interrupt-controller@10000 {
+ compatible = "example,intc";
+ reg = <0x10000 0x1000>;
+ interrupts = <1 2 3>;
+ };
+
+ serial@30000 {
+ compatible = "example,serial";
+ reg = <0x30000 0x1000>;
+ };
+ };
+};
diff --git a/scripts/dtc/dt-style-selftest/bad/dts-digit-node-order.dtso b/scripts/dtc/dt-style-selftest/bad/dts-digit-node-order.dtso
new file mode 100644
index 000000000000..052c02935a45
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/bad/dts-digit-node-order.dtso
@@ -0,0 +1,41 @@
+// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/dts-v1/;
+/plugin/;
+
+&{/} {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ memory@a0000000 {
+ device_type = "memory";
+ reg = <0x0 0xa0000000 0x0 0x0>;
+ };
+
+ pmu {
+ compatible = "example,pmu";
+ };
+
+ soc@0 {
+ compatible = "simple-bus";
+ ranges = <0 0 0 0xc0000000>;
+
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ serial@20000 {
+ compatible = "example,serial";
+ reg = <0x20000 0x1000>;
+ };
+
+ interrupt-controller@10000 {
+ compatible = "example,intc";
+ reg = <0x10000 0x1000>;
+ interrupts = <1 2 3>;
+ };
+
+ serial@30000 {
+ compatible = "example,serial";
+ reg = <0x30000 0x1000>;
+ };
+ };
+};
diff --git a/scripts/dtc/dt-style-selftest/bad/dts-property-order.dts b/scripts/dtc/dt-style-selftest/bad/dts-property-order.dts
index 782cd55ec283..e675e5e05a46 100644
--- a/scripts/dtc/dt-style-selftest/bad/dts-property-order.dts
+++ b/scripts/dtc/dt-style-selftest/bad/dts-property-order.dts
@@ -6,6 +6,11 @@
/dts-v1/;
/ {
+ compatible = "example,test-board", "example,test-soc";
+ model = "DT style selftest";
+ qcom,board-id = <8 0>;
+ chassis-type = "handset";
+
cpus {
#address-cells = <1>;
#size-cells = <0>;
diff --git a/scripts/dtc/dt-style-selftest/expected/dts-child-name-order.dts.txt b/scripts/dtc/dt-style-selftest/expected/dts-child-name-order.dts.txt
index e2eea0862102..312a45ed913a 100644
--- a/scripts/dtc/dt-style-selftest/expected/dts-child-name-order.dts.txt
+++ b/scripts/dtc/dt-style-selftest/expected/dts-child-name-order.dts.txt
@@ -1,2 +1,3 @@
# mode=strict
bad/dts-child-name-order.dts:16: [child-name-order] child node 'bar' out of name order
+bad/dts-child-name-order.dts:21: [child-name-order] child node 'memory' out of name order
diff --git a/scripts/dtc/dt-style-selftest/expected/dts-child-name-order.dtso.txt b/scripts/dtc/dt-style-selftest/expected/dts-child-name-order.dtso.txt
new file mode 100644
index 000000000000..e44ceb24ece8
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/expected/dts-child-name-order.dtso.txt
@@ -0,0 +1,3 @@
+# mode=strict
+bad/dts-child-name-order.dtso:17: [child-name-order] child node 'bar' out of name order
+bad/dts-child-name-order.dtso:22: [child-name-order] child node 'memory' out of name order
diff --git a/scripts/dtc/dt-style-selftest/expected/dts-digit-node-order.dts.txt b/scripts/dtc/dt-style-selftest/expected/dts-digit-node-order.dts.txt
new file mode 100644
index 000000000000..1f41acdea0b0
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/expected/dts-digit-node-order.dts.txt
@@ -0,0 +1,2 @@
+# mode=strict
+bad/dts-digit-node-order.dts:29: [child-address-order] child node @10000 out of address order
diff --git a/scripts/dtc/dt-style-selftest/expected/dts-digit-node-order.dtso.txt b/scripts/dtc/dt-style-selftest/expected/dts-digit-node-order.dtso.txt
new file mode 100644
index 000000000000..21db32f6e639
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/expected/dts-digit-node-order.dtso.txt
@@ -0,0 +1,2 @@
+# mode=strict
+bad/dts-digit-node-order.dtso:30: [child-address-order] child node @10000 out of address order
diff --git a/scripts/dtc/dt-style-selftest/expected/dts-property-order.dts.txt b/scripts/dtc/dt-style-selftest/expected/dts-property-order.dts.txt
index 4bc21328625f..29283f3451c7 100644
--- a/scripts/dtc/dt-style-selftest/expected/dts-property-order.dts.txt
+++ b/scripts/dtc/dt-style-selftest/expected/dts-property-order.dts.txt
@@ -1,6 +1,9 @@
# mode=strict
-bad/dts-property-order.dts:15: [property-order] property 'compatible' out of canonical order (should sort before 'reg')
-bad/dts-property-order.dts:16: [property-order] property 'device_type' out of canonical order (should sort before 'compatible')
-bad/dts-property-order.dts:25: [property-order] property 'dma-coherent' out of canonical order (should sort before 'status')
-bad/dts-property-order.dts:30: [property-order] property 'compatible' out of canonical order (should sort before 'ranges')
-bad/dts-property-order.dts:40: [property-order] property 'compatible' out of canonical order (should sort before 'interrupts')
+bad/dts-property-order.dts:8: [redundant-whitespace] extra whitespace before {
+bad/dts-property-order.dts:10: [property-order] property 'model' out of canonical order (should sort before 'compatible')
+bad/dts-property-order.dts:12: [property-order] property 'chassis-type' out of canonical order (should sort before 'qcom,board-id')
+bad/dts-property-order.dts:20: [property-order] property 'compatible' out of canonical order (should sort before 'reg')
+bad/dts-property-order.dts:21: [property-order] property 'device_type' out of canonical order (should sort before 'compatible')
+bad/dts-property-order.dts:30: [property-order] property 'dma-coherent' out of canonical order (should sort before 'status')
+bad/dts-property-order.dts:35: [property-order] property 'compatible' out of canonical order (should sort before 'ranges')
+bad/dts-property-order.dts:45: [property-order] property 'compatible' out of canonical order (should sort before 'interrupts')
diff --git a/scripts/dtc/dt-style-selftest/expected/dts-property-order.dtso.txt b/scripts/dtc/dt-style-selftest/expected/dts-property-order.dtso.txt
index a78b8c042aa5..124183fab2ad 100644
--- a/scripts/dtc/dt-style-selftest/expected/dts-property-order.dtso.txt
+++ b/scripts/dtc/dt-style-selftest/expected/dts-property-order.dtso.txt
@@ -1,4 +1,5 @@
# mode=strict
+bad/dts-property-order.dtso:11: [property-order] property 'model' out of canonical order (should sort before 'compatible')
bad/dts-property-order.dtso:13: [property-order] property 'chassis-type' out of canonical order (should sort before 'qcom,board-id')
bad/dts-property-order.dtso:21: [property-order] property 'compatible' out of canonical order (should sort before 'reg')
bad/dts-property-order.dtso:22: [property-order] property 'device_type' out of canonical order (should sort before 'compatible')
diff --git a/scripts/dtc/dt-style-selftest/good/dts-child-name-order.dtso b/scripts/dtc/dt-style-selftest/good/dts-child-name-order.dtso
new file mode 100644
index 000000000000..477b13b1ac2e
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/good/dts-child-name-order.dtso
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/dts-v1/;
+/plugin/;
+
+&{/} {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ memory@a0000000 {
+ device_type = "memory";
+ reg = <0x0 0xa0000000 0x0 0x0>;
+ };
+
+ pmu {
+ compatible = "example,pmu";
+
+ /* Include labels to be sure they do not affect sorting */
+ label_bar: bar {
+ label = "bar";
+ };
+
+ foo: foo {
+ label = "foo";
+ };
+ };
+
+ pmu-2 {
+ compatible = "example,pmu";
+
+ /* Just reference labels to avoid strict warnings */
+ example,foo = <&foo>, <&label_bar>;
+ };
+};
diff --git a/scripts/dtc/dt-style-selftest/good/dts-digit-node-order.dts b/scripts/dtc/dt-style-selftest/good/dts-digit-node-order.dts
index cdf3f91ebe01..2b21dde7f3c8 100644
--- a/scripts/dtc/dt-style-selftest/good/dts-digit-node-order.dts
+++ b/scripts/dtc/dt-style-selftest/good/dts-digit-node-order.dts
@@ -5,13 +5,10 @@ / {
#address-cells = <1>;
#size-cells = <1>;
- /* TODO: uncomment when child-address-order is fixed for top-level */
- /*
memory@a0000000 {
device_type = "memory";
reg = <0x0 0xa0000000 0x0 0x0>;
};
- */
pmu {
compatible = "example,pmu";
diff --git a/scripts/dtc/dt-style-selftest/good/dts-digit-node-order.dtso b/scripts/dtc/dt-style-selftest/good/dts-digit-node-order.dtso
new file mode 100644
index 000000000000..79ea2deec789
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/good/dts-digit-node-order.dtso
@@ -0,0 +1,41 @@
+// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/dts-v1/;
+/plugin/;
+
+&{/} {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ memory@a0000000 {
+ device_type = "memory";
+ reg = <0x0 0xa0000000 0x0 0x0>;
+ };
+
+ pmu {
+ compatible = "example,pmu";
+ };
+
+ soc@0 {
+ compatible = "simple-bus";
+ ranges = <0 0 0 0xc0000000>;
+
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ interrupt-controller@10000 {
+ compatible = "example,intc";
+ reg = <0x10000 0x1000>;
+ interrupts = <1 2 3>;
+ };
+
+ serial@20000 {
+ compatible = "example,serial";
+ reg = <0x20000 0x1000>;
+ };
+
+ serial@30000 {
+ compatible = "example,serial";
+ reg = <0x30000 0x1000>;
+ };
+ };
+};
diff --git a/scripts/dtc/dt-style-selftest/good/dts-property-order.dts b/scripts/dtc/dt-style-selftest/good/dts-property-order.dts
index 0e183e3459cd..3d847cc9fa3e 100644
--- a/scripts/dtc/dt-style-selftest/good/dts-property-order.dts
+++ b/scripts/dtc/dt-style-selftest/good/dts-property-order.dts
@@ -6,6 +6,11 @@
/dts-v1/;
/ {
+ model = "DT style selftest";
+ compatible = "example,test-board", "example,test-soc";
+ chassis-type = "handset";
+ qcom,board-id = <8 0>;
+
cpus {
#address-cells = <1>;
#size-cells = <0>;
diff --git a/scripts/dtc/dt-style-selftest/good/dts-property-order.dtso b/scripts/dtc/dt-style-selftest/good/dts-property-order.dtso
new file mode 100644
index 000000000000..5ae78541f68b
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/good/dts-property-order.dtso
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/*
+ * Test fixture: Incorrect property order
+ */
+
+/dts-v1/;
+/plugin/;
+
+&{/} {
+ model = "DT style selftest";
+ compatible = "example,test-board", "example,test-soc";
+ chassis-type = "handset";
+ qcom,board-id = <8 0>;
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ cpu@0 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a57";
+ reg = <0x0 0x0>;
+ enable-method = "psci";
+ };
+ };
+
+ pmu {
+ compatible = "example,pmu";
+ dma-coherent;
+
+ status = "disabled";
+ };
+
+ soc@0 {
+ compatible = "simple-bus";
+ ranges = <0 0 0 0xc0000000>;
+
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ interrupt-controller@10000 {
+ compatible = "example,intc";
+ reg = <0x10000 0x1000>;
+ interrupts = <1 2 3>;
+ };
+ };
+};
--
2.53.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 05/11] dtc: dt-check-style: Drop stray backslash before quote for continuation-alignment
2026-08-03 9:03 [PATCH v3 00/11] dtc: dt-check-style: Improvements for false positives Krzysztof Kozlowski
` (3 preceding siblings ...)
2026-08-03 9:03 ` [PATCH v3 04/11] dtc: dt-check-style: Handle sorting of top-level nodes and properties Krzysztof Kozlowski
@ 2026-08-03 9:03 ` Krzysztof Kozlowski
2026-08-03 9:09 ` sashiko-bot
2026-08-03 9:03 ` [PATCH v3 06/11] dtc: dt-check-style: Fix alignment of values in continued property lines Krzysztof Kozlowski
` (5 subsequent siblings)
10 siblings, 1 reply; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-03 9:03 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan, Test User, Krzysztof Kozlowski,
Conor Dooley
Cc: devicetree, linux-kernel, Krzysztof Kozlowski
Drop stray backslash before the quote character in a warning for
continuation-alignment rule: (under "<" or \"). Since the '"' character
has no quotes, drop the quotes also from '<'.
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
---
scripts/dtc/dt-check-style | 2 +-
scripts/dtc/dt-style-selftest/expected/yaml-cont-align.yaml.txt | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/scripts/dtc/dt-check-style b/scripts/dtc/dt-check-style
index f9e5762862a5..bdf36ba9e274 100755
--- a/scripts/dtc/dt-check-style
+++ b/scripts/dtc/dt-check-style
@@ -950,7 +950,7 @@ def check_continuation_alignment(ctx):
if _display_col(cont.indent_str) != target_col:
yield (cont.lineno,
'continuation should align to column %d '
- '(under "<" or \\")' % (target_col + 1))
+ '(under < or ")' % (target_col + 1))
def check_unclosed_block_comment(ctx):
diff --git a/scripts/dtc/dt-style-selftest/expected/yaml-cont-align.yaml.txt b/scripts/dtc/dt-style-selftest/expected/yaml-cont-align.yaml.txt
index b5576dd0f6b1..c0801c56d5db 100644
--- a/scripts/dtc/dt-style-selftest/expected/yaml-cont-align.yaml.txt
+++ b/scripts/dtc/dt-style-selftest/expected/yaml-cont-align.yaml.txt
@@ -1,2 +1,2 @@
# mode=strict
-bad/yaml-cont-align.yaml:29: example 0 [continuation-alignment] continuation should align to column 11 (under "<" or \")
+bad/yaml-cont-align.yaml:29: example 0 [continuation-alignment] continuation should align to column 11 (under < or ")
--
2.53.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 06/11] dtc: dt-check-style: Fix alignment of values in continued property lines
2026-08-03 9:03 [PATCH v3 00/11] dtc: dt-check-style: Improvements for false positives Krzysztof Kozlowski
` (4 preceding siblings ...)
2026-08-03 9:03 ` [PATCH v3 05/11] dtc: dt-check-style: Drop stray backslash before quote for continuation-alignment Krzysztof Kozlowski
@ 2026-08-03 9:03 ` Krzysztof Kozlowski
2026-08-03 9:21 ` sashiko-bot
2026-08-03 9:03 ` [PATCH v3 07/11] dtc: dt-check-style: Consistently call 'kind' as 'file_type' Krzysztof Kozlowski
` (4 subsequent siblings)
10 siblings, 1 reply; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-03 9:03 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan, Test User, Krzysztof Kozlowski,
Conor Dooley
Cc: devicetree, linux-kernel, Krzysztof Kozlowski
Continued lines in property assignments should be indented to opening
'<' or '"' if they also start with that character, e.g.:
reg = <0x1000 0x100>,
<0x2000 0x100>;
If the continued line is part of previous phandle, then alignment should
be to inner values to make it more readable, e.g.:
reg = <0x1000 0x100
0x2000 0x100>;
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
---
scripts/dtc/dt-check-style | 22 +++++++++------
.../dtc/dt-style-selftest/bad/dts-cont-align.dts | 23 ++++++++++++++++
.../dtc/dt-style-selftest/bad/yaml-cont-align.yaml | 4 ++-
.../expected/dts-cont-align.dts.txt | 8 ++++++
.../expected/yaml-cont-align.yaml.txt | 3 +-
.../expected/yaml-value-ws-multiline.yaml.txt | 1 +
.../dtc/dt-style-selftest/good/dts-cont-align.dts | 11 +++++---
.../dt-style-selftest/good/yaml-cont-align.yaml | 32 ++++++++++++++++++++++
8 files changed, 90 insertions(+), 14 deletions(-)
diff --git a/scripts/dtc/dt-check-style b/scripts/dtc/dt-check-style
index bdf36ba9e274..1c67348fb526 100755
--- a/scripts/dtc/dt-check-style
+++ b/scripts/dtc/dt-check-style
@@ -928,10 +928,11 @@ def check_line_length(ctx):
def check_continuation_alignment(ctx):
"""A multi-line property's continuation lines must align their
- first non-whitespace character to the display column of the first
- '<' or '"' after the '=' in the leading line. Display columns are
- used so tab-indented .dts files (where a continuation aligns with
- tabs plus spaces) are compared correctly."""
+ first non-whitespace character to the display column of:
+ 1. the first '<' or '"' after the '=' in the leading line, if continuation is with '<' or '"'
+ 2. the first value, if the continuation is still the same phandle.
+ Display columns are used so tab-indented .dts files (where a continuation
+ aligns with tabs plus spaces) are compared correctly."""
for dl in ctx.lines:
if dl.linetype != LineType.PROPERTY:
continue
@@ -942,15 +943,20 @@ def check_continuation_alignment(ctx):
continue
# First '<' or '"' after '='
rest = dl.raw[eq + 1:]
- m = re.search(r'[<"]', rest)
+ m = re.search(r'\s*([<"])', rest)
if not m:
continue
- target_col = _display_col(dl.raw[:eq + 1 + m.start()])
+ target_col = _display_col(dl.raw[:eq + 1 + m.start(1)])
for cont in dl.continuations:
- if _display_col(cont.indent_str) != target_col:
+ target_offset = 0
+ err_msg_explanation = 'to < or "'
+ if not re.match(r'[<"]', cont.stripped):
+ target_offset = 1
+ err_msg_explanation = 'to the value under <'
+ if _display_col(cont.indent_str) != target_col + target_offset:
yield (cont.lineno,
'continuation should align to column %d '
- '(under < or ")' % (target_col + 1))
+ '(%s)' % (target_col + target_offset + 1, err_msg_explanation))
def check_unclosed_block_comment(ctx):
diff --git a/scripts/dtc/dt-style-selftest/bad/dts-cont-align.dts b/scripts/dtc/dt-style-selftest/bad/dts-cont-align.dts
new file mode 100644
index 000000000000..2087dac23d96
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/bad/dts-cont-align.dts
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/dts-v1/;
+
+/ {
+ compatible = "example,test-board";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ interrupt-controller@10000 {
+ compatible = "example,intc";
+ reg = <0x10000 0x1000>;
+ interrupts = <1 2 3>,
+ <4 5 6>,
+ <7 8 9>;
+ pinmux = <0x01
+ 0x02>,
+ <0x03
+ 0x04>;
+ power-domain-names = "foo",
+ "bar",
+ "baz";
+ };
+};
diff --git a/scripts/dtc/dt-style-selftest/bad/yaml-cont-align.yaml b/scripts/dtc/dt-style-selftest/bad/yaml-cont-align.yaml
index 92778540b056..d4662acc7b8f 100644
--- a/scripts/dtc/dt-style-selftest/bad/yaml-cont-align.yaml
+++ b/scripts/dtc/dt-style-selftest/bad/yaml-cont-align.yaml
@@ -26,5 +26,7 @@ examples:
foo@1000 {
compatible = "example,test-cont-align";
reg = <0x1000 0x100>,
- <0x2000 0x100>;
+ <0x2000 0x100>,
+ <0x3000
+ 0x100>;
};
diff --git a/scripts/dtc/dt-style-selftest/expected/dts-cont-align.dts.txt b/scripts/dtc/dt-style-selftest/expected/dts-cont-align.dts.txt
new file mode 100644
index 000000000000..a4672206859c
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/expected/dts-cont-align.dts.txt
@@ -0,0 +1,8 @@
+# mode=strict
+bad/dts-cont-align.dts:13: [continuation-alignment] continuation should align to column 30 (to < or ")
+bad/dts-cont-align.dts:14: [continuation-alignment] continuation should align to column 30 (to < or ")
+bad/dts-cont-align.dts:16: [continuation-alignment] continuation should align to column 27 (to the value under <)
+bad/dts-cont-align.dts:17: [continuation-alignment] continuation should align to column 26 (to < or ")
+bad/dts-cont-align.dts:18: [continuation-alignment] continuation should align to column 27 (to the value under <)
+bad/dts-cont-align.dts:20: [continuation-alignment] continuation should align to column 38 (to < or ")
+bad/dts-cont-align.dts:21: [continuation-alignment] continuation should align to column 38 (to < or ")
diff --git a/scripts/dtc/dt-style-selftest/expected/yaml-cont-align.yaml.txt b/scripts/dtc/dt-style-selftest/expected/yaml-cont-align.yaml.txt
index c0801c56d5db..eb9a84d5c222 100644
--- a/scripts/dtc/dt-style-selftest/expected/yaml-cont-align.yaml.txt
+++ b/scripts/dtc/dt-style-selftest/expected/yaml-cont-align.yaml.txt
@@ -1,2 +1,3 @@
# mode=strict
-bad/yaml-cont-align.yaml:29: example 0 [continuation-alignment] continuation should align to column 11 (under < or ")
+bad/yaml-cont-align.yaml:29: example 0 [continuation-alignment] continuation should align to column 11 (to < or ")
+bad/yaml-cont-align.yaml:31: example 0 [continuation-alignment] continuation should align to column 12 (to the value under <)
diff --git a/scripts/dtc/dt-style-selftest/expected/yaml-value-ws-multiline.yaml.txt b/scripts/dtc/dt-style-selftest/expected/yaml-value-ws-multiline.yaml.txt
index 3df55b1762d0..d25b5b425e3f 100644
--- a/scripts/dtc/dt-style-selftest/expected/yaml-value-ws-multiline.yaml.txt
+++ b/scripts/dtc/dt-style-selftest/expected/yaml-value-ws-multiline.yaml.txt
@@ -1,2 +1,3 @@
# mode=strict
bad/yaml-value-ws-multiline.yaml:25: example 0 [value-whitespace] extra whitespace inside <...>
+bad/yaml-value-ws-multiline.yaml:26: example 0 [continuation-alignment] continuation should align to column 12 (to the value under <)
diff --git a/scripts/dtc/dt-style-selftest/good/dts-cont-align.dts b/scripts/dtc/dt-style-selftest/good/dts-cont-align.dts
index 36fb4eefcd83..1a1c07c09a41 100644
--- a/scripts/dtc/dt-style-selftest/good/dts-cont-align.dts
+++ b/scripts/dtc/dt-style-selftest/good/dts-cont-align.dts
@@ -18,9 +18,12 @@ interrupt-controller@10000 {
interrupts = <1 2 3>,
<4 5 6>,
<7 8 9>;
- pinmux = <
- 0x01
- 0x02
- >;
+ pinmux = <0x01
+ 0x02>,
+ <0x03
+ 0x04>;
+ power-domain-names = "foo",
+ "bar",
+ "baz";
};
};
diff --git a/scripts/dtc/dt-style-selftest/good/yaml-cont-align.yaml b/scripts/dtc/dt-style-selftest/good/yaml-cont-align.yaml
new file mode 100644
index 000000000000..2e7b8582bb7c
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/good/yaml-cont-align.yaml
@@ -0,0 +1,32 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/test-good-cont-align.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Test fixture with aligned multi-line property
+
+maintainers:
+ - Test User <test@example.com>
+
+properties:
+ compatible:
+ const: example,test-cont-align
+ reg:
+ maxItems: 2
+
+required:
+ - compatible
+ - reg
+
+additionalProperties: false
+
+examples:
+ - |
+ foo@1000 {
+ compatible = "example,test-cont-align";
+ reg = <0x1000 0x100>,
+ <0x2000 0x100>,
+ <0x3000
+ 0x100>;
+ };
--
2.53.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 07/11] dtc: dt-check-style: Consistently call 'kind' as 'file_type'
2026-08-03 9:03 [PATCH v3 00/11] dtc: dt-check-style: Improvements for false positives Krzysztof Kozlowski
` (5 preceding siblings ...)
2026-08-03 9:03 ` [PATCH v3 06/11] dtc: dt-check-style: Fix alignment of values in continued property lines Krzysztof Kozlowski
@ 2026-08-03 9:03 ` Krzysztof Kozlowski
2026-08-03 9:03 ` [PATCH v3 08/11] dtc: dt-check-style: Introduce 'stricter' mode Krzysztof Kozlowski
` (3 subsequent siblings)
10 siblings, 0 replies; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-03 9:03 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan, Test User, Krzysztof Kozlowski,
Conor Dooley
Cc: devicetree, linux-kernel, Krzysztof Kozlowski
Script was using different names for variables or attributes with the
same meaning: the type of file (YAML, DTS, DTSI, DTSO). Unify 'kind',
'input_kind' and function input_kind() to consistent 'file_type'.
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
---
scripts/dtc/dt-check-style | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/scripts/dtc/dt-check-style b/scripts/dtc/dt-check-style
index 1c67348fb526..e3adaad1be63 100755
--- a/scripts/dtc/dt-check-style
+++ b/scripts/dtc/dt-check-style
@@ -314,13 +314,13 @@ def collect_labels_and_refs(text):
class Ctx:
"""Context passed to each rule check. Carries the parsed lines,
- raw text, mode and kind."""
+ raw text, mode and file_type."""
- def __init__(self, lines, text, mode, kind):
+ def __init__(self, lines, text, mode, file_type):
self.lines = lines
self.text = text
self.mode = mode # 'relaxed' or 'strict'
- if kind in DTS_FAMILY:
+ if file_type in DTS_FAMILY:
self.file_type = 'dts'
else:
self.file_type = 'yaml'
@@ -1069,14 +1069,14 @@ RULES = [
]
-def select_rules(mode, input_kind):
+def select_rules(mode, file_type):
"""Return rules that apply to the given mode and input type."""
rank = {'relaxed': 0, 'strict': 1}
out = []
for r in RULES:
if rank[r.mode] > rank[mode]:
continue
- if input_kind not in r.applies_to:
+ if file_type not in r.applies_to:
continue
out.append(r)
return out
@@ -1086,12 +1086,12 @@ def select_rules(mode, input_kind):
# Block runner
# ---------------------------------------------------------------------------
-def check_block(text, mode, input_type):
+def check_block(text, mode, file_type):
"""Run all selected rules on a single block of DTS text. Returns a
list of (lineno, rule_name, message) tuples."""
lines = classify_lines(text)
- ctx = Ctx(lines, text, mode, input_type)
- rules = select_rules(mode, input_type)
+ ctx = Ctx(lines, text, mode, file_type)
+ rules = select_rules(mode, file_type)
findings = []
for r in rules:
for lineno, msg in r.check(ctx):
@@ -1148,7 +1148,7 @@ def iter_dts_file(filepath):
# Top-level processing
# ---------------------------------------------------------------------------
-def input_kind(filepath):
+def get_file_type(filepath):
p = filepath.lower()
if p.endswith('.yaml') or p.endswith('.yml'):
return 'yaml'
@@ -1168,17 +1168,17 @@ DTS_FAMILY = ('dts', 'dtsi', 'dtso')
def collect_findings(filepath, mode):
"""Return a (lines, count) pair for filepath. lines is a list of
formatted output strings; count is the number of findings."""
- kind = input_kind(filepath)
- if kind == 'yaml':
+ file_type = get_file_type(filepath)
+ if file_type == 'yaml':
iterator = iter_yaml_examples(filepath)
- elif kind in DTS_FAMILY:
+ elif file_type in DTS_FAMILY:
iterator = iter_dts_file(filepath)
else:
return (['%s: unknown file type, skipping' % filepath], 0)
out = []
for text, base, idx in iterator:
- for lineno, rule, msg in check_block(text, mode, kind):
+ for lineno, rule, msg in check_block(text, mode, file_type):
abs_line = base + lineno - 1
ex_tag = '' if idx is None else ' example %d' % idx
out.append('%s:%d:%s [%s] %s' %
--
2.53.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 08/11] dtc: dt-check-style: Introduce 'stricter' mode
2026-08-03 9:03 [PATCH v3 00/11] dtc: dt-check-style: Improvements for false positives Krzysztof Kozlowski
` (6 preceding siblings ...)
2026-08-03 9:03 ` [PATCH v3 07/11] dtc: dt-check-style: Consistently call 'kind' as 'file_type' Krzysztof Kozlowski
@ 2026-08-03 9:03 ` Krzysztof Kozlowski
2026-08-03 9:16 ` sashiko-bot
2026-08-03 9:03 ` [PATCH v3 09/11] dtc: dt-check-style: Add test for trailing white-space in DTS Krzysztof Kozlowski
` (2 subsequent siblings)
10 siblings, 1 reply; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-03 9:03 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan, Test User, Krzysztof Kozlowski,
Conor Dooley
Cc: devicetree, linux-kernel, Krzysztof Kozlowski
Two rules, which are enabled in 'strict' mode make little sense for DTS:
1. line-length, limiting length of line to 80 characters: DTS often has
a bit longer lines, especially for interconnects or heavily nested
opp-level. Checkpatch already does not warn for exceeding 80
characters.
2. unused-labels, discouraging unused labels in DTS or YAML (not DTSI or
DTSO): while not harming this leads to many false positives, e.g.
unused PMIC regulators in DTS.
Introduce another 'mode' of running beside existing relaxed and strict:
a 'stricter' one where these two rules are moved for DTS. Intention is
to have in-tree DTS passing 'strict' mode.
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
---
scripts/dtc/dt-check-style | 25 +++++++++++++++-------
.../dtc/dt-style-selftest/bad/dts-line-length.dts | 21 ++++++++++++++++++
.../dtc/dt-style-selftest/bad/dts-unused-label.dts | 21 ++++++++++++++++++
.../expected/dts-line-length.dts.txt | 2 ++
.../expected/dts-unused-label.dts.txt | 2 ++
scripts/dtc/dt-style-selftest/run.sh | 2 +-
6 files changed, 64 insertions(+), 9 deletions(-)
diff --git a/scripts/dtc/dt-check-style b/scripts/dtc/dt-check-style
index e3adaad1be63..1430c675bd95 100755
--- a/scripts/dtc/dt-check-style
+++ b/scripts/dtc/dt-check-style
@@ -5,12 +5,14 @@
# .dts/.dtsi/.dtso source files. Enforces rules from
# Documentation/devicetree/bindings/dts-coding-style.rst.
#
-# Two modes:
+# Three modes:
# --mode=relaxed (default)
# Only rules that produce zero warnings on the current tree.
# Suitable for dt_binding_check.
# --mode=strict
-# All rules. Required for new submissions.
+# Most of the rules. Required for new submissions.
+# --mode=stricter
+# All rules, including ones having false positives.
#
# Two input types (auto-detected by file extension):
# *.yaml -- DT binding; check each example block
@@ -319,7 +321,7 @@ class Ctx:
def __init__(self, lines, text, mode, file_type):
self.lines = lines
self.text = text
- self.mode = mode # 'relaxed' or 'strict'
+ self.mode = mode # 'relaxed', 'strict' or 'stricter'
if file_type in DTS_FAMILY:
self.file_type = 'dts'
else:
@@ -332,7 +334,7 @@ class Rule:
def __init__(self, name, mode, description, check,
applies_to=('yaml', 'dts', 'dtsi', 'dtso')):
self.name = name
- self.mode = mode # 'relaxed' or 'strict'
+ self.mode = mode # 'relaxed', 'strict' or 'stricter'
self.description = description
self.check = check
self.applies_to = applies_to # input types this rule covers
@@ -1058,20 +1060,27 @@ RULES = [
check_node_close_alone),
Rule('line-length', 'strict',
'lines must not exceed 80 columns',
- check_line_length),
+ check_line_length, applies_to=('yaml',)),
+ Rule('line-length-dts', 'stricter',
+ 'lines must not exceed 80 columns',
+ check_line_length, applies_to=('dts', 'dtsi', 'dtso')),
Rule('continuation-alignment', 'strict',
'multi-line property continuations align under "<" or "\\""',
check_continuation_alignment),
Rule('unused-labels', 'strict',
'every label must be &-referenced in the same example/file '
'(skipped for .dtsi/.dtso since labels there are exported)',
- check_unused_labels, applies_to=('yaml', 'dts')),
+ check_unused_labels, applies_to=('yaml',)),
+ Rule('unused-labels-dts', 'stricter',
+ 'every label must be &-referenced in the same example/file '
+ '(skipped for .dtsi/.dtso since labels there are exported)',
+ check_unused_labels, applies_to=('dts',)),
]
def select_rules(mode, file_type):
"""Return rules that apply to the given mode and input type."""
- rank = {'relaxed': 0, 'strict': 1}
+ rank = {'relaxed': 0, 'strict': 1, 'stricter': 2}
out = []
for r in RULES:
if rank[r.mode] > rank[mode]:
@@ -1199,7 +1208,7 @@ def main():
description='Check DTS coding style on YAML examples and '
'.dts/.dtsi/.dtso files.',
fromfile_prefix_chars='@')
- ap.add_argument('--mode', choices=('relaxed', 'strict'),
+ ap.add_argument('--mode', choices=('relaxed', 'strict', 'stricter'),
default='relaxed',
help='which rule set to apply (default: relaxed)')
ap.add_argument('-j', '--jobs', type=int, default=0,
diff --git a/scripts/dtc/dt-style-selftest/bad/dts-line-length.dts b/scripts/dtc/dt-style-selftest/bad/dts-line-length.dts
new file mode 100644
index 000000000000..bde91a922477
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/bad/dts-line-length.dts
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/*
+ * Test fixture: Line length in DTS
+ */
+
+/dts-v1/;
+
+/ {
+ soc@0 {
+ compatible = "simple-bus";
+ ranges = <0 0 0 0xc0000000>;
+
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ foo@1000 {
+ compatible = "example,test-line-length-this-is-a-very-long-name-indeed-yeah";
+ reg = <0x1000 0x100>;
+ };
+ };
+};
diff --git a/scripts/dtc/dt-style-selftest/bad/dts-unused-label.dts b/scripts/dtc/dt-style-selftest/bad/dts-unused-label.dts
new file mode 100644
index 000000000000..90802ae107e1
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/bad/dts-unused-label.dts
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/*
+ * Test fixture: Unused label in DTS
+ */
+
+/dts-v1/;
+
+/ {
+ soc@0 {
+ compatible = "simple-bus";
+ ranges = <0 0 0 0xc0000000>;
+
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ dev: device@1000 {
+ compatible = "example,test-unused-label";
+ reg = <0x1000 0x100>;
+ };
+ };
+};
diff --git a/scripts/dtc/dt-style-selftest/expected/dts-line-length.dts.txt b/scripts/dtc/dt-style-selftest/expected/dts-line-length.dts.txt
new file mode 100644
index 000000000000..8ed08c309632
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/expected/dts-line-length.dts.txt
@@ -0,0 +1,2 @@
+# mode=stricter
+bad/dts-line-length.dts:17: [line-length-dts] line exceeds 80 columns (101)
diff --git a/scripts/dtc/dt-style-selftest/expected/dts-unused-label.dts.txt b/scripts/dtc/dt-style-selftest/expected/dts-unused-label.dts.txt
new file mode 100644
index 000000000000..4cdcaba3ba2f
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/expected/dts-unused-label.dts.txt
@@ -0,0 +1,2 @@
+# mode=stricter
+bad/dts-unused-label.dts:16: [unused-labels-dts] label 'dev' defined but never &-referenced
diff --git a/scripts/dtc/dt-style-selftest/run.sh b/scripts/dtc/dt-style-selftest/run.sh
index 8117dd9be90a..5691301d6a4a 100755
--- a/scripts/dtc/dt-style-selftest/run.sh
+++ b/scripts/dtc/dt-style-selftest/run.sh
@@ -26,7 +26,7 @@ run() {
# good/ -- must exit 0 and produce no output in both modes
for f in "$here"/good/*; do
[ -e "$f" ] || continue
- for mode in relaxed strict; do
+ for mode in relaxed strict stricter; do
out=$(run "$f" "$mode")
rc=$?
if [ -n "$out" ] || [ "$rc" -ne 0 ]; then
--
2.53.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 09/11] dtc: dt-check-style: Add test for trailing white-space in DTS
2026-08-03 9:03 [PATCH v3 00/11] dtc: dt-check-style: Improvements for false positives Krzysztof Kozlowski
` (7 preceding siblings ...)
2026-08-03 9:03 ` [PATCH v3 08/11] dtc: dt-check-style: Introduce 'stricter' mode Krzysztof Kozlowski
@ 2026-08-03 9:03 ` Krzysztof Kozlowski
2026-08-03 9:11 ` sashiko-bot
2026-08-03 9:03 ` [PATCH v3 10/11] dtc: dt-check-style: Add warning for redundant white-spaces Krzysztof Kozlowski
2026-08-03 9:03 ` [PATCH v3 11/11] MAINTAINERS: dt-bindings: Include dt-check-style in DT binding entry Krzysztof Kozlowski
10 siblings, 1 reply; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-03 9:03 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan, Test User, Krzysztof Kozlowski,
Conor Dooley
Cc: devicetree, linux-kernel, Krzysztof Kozlowski
Add unit tests for expected warnings for trailing white-spaces in DTS
(there is only one for YAML files).
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
---
scripts/dtc/dt-style-selftest/bad/dts-trailing-ws.dts | 8 ++++++++
scripts/dtc/dt-style-selftest/expected/dts-trailing-ws.dts.txt | 2 ++
2 files changed, 10 insertions(+)
diff --git a/scripts/dtc/dt-style-selftest/bad/dts-trailing-ws.dts b/scripts/dtc/dt-style-selftest/bad/dts-trailing-ws.dts
new file mode 100644
index 000000000000..1eb24d91c640
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/bad/dts-trailing-ws.dts
@@ -0,0 +1,8 @@
+// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/dts-v1/;
+
+/ {
+ compatible = "example,test-board";
+ #address-cells = <1>;
+ #size-cells = <1>;
+};
diff --git a/scripts/dtc/dt-style-selftest/expected/dts-trailing-ws.dts.txt b/scripts/dtc/dt-style-selftest/expected/dts-trailing-ws.dts.txt
new file mode 100644
index 000000000000..94d9ae9d616c
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/expected/dts-trailing-ws.dts.txt
@@ -0,0 +1,2 @@
+# mode=relaxed
+bad/dts-trailing-ws.dts:5: [trailing-whitespace] trailing whitespace
--
2.53.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 10/11] dtc: dt-check-style: Add warning for redundant white-spaces
2026-08-03 9:03 [PATCH v3 00/11] dtc: dt-check-style: Improvements for false positives Krzysztof Kozlowski
` (8 preceding siblings ...)
2026-08-03 9:03 ` [PATCH v3 09/11] dtc: dt-check-style: Add test for trailing white-space in DTS Krzysztof Kozlowski
@ 2026-08-03 9:03 ` Krzysztof Kozlowski
2026-08-03 9:13 ` sashiko-bot
2026-08-03 9:03 ` [PATCH v3 11/11] MAINTAINERS: dt-bindings: Include dt-check-style in DT binding entry Krzysztof Kozlowski
10 siblings, 1 reply; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-03 9:03 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan, Test User, Krzysztof Kozlowski,
Conor Dooley
Cc: devicetree, linux-kernel, Krzysztof Kozlowski
Show warnings of too many spaces around '=', before '{' and ';'
characters, or using tabs for these. Both in-tree DTS and DT bindings
have many warnings for the first case (too mant spaces around '='), thus
keep this one only for 'strict' mode.
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
---
scripts/dtc/dt-check-style | 38 ++++++++++++++++++++++
.../bad/dts-redundant-ws-strict.dts | 27 +++++++++++++++
.../dtc/dt-style-selftest/bad/dts-redundant-ws.dts | 27 +++++++++++++++
.../bad/yaml-redundant-ws-strict.yaml | 29 +++++++++++++++++
.../dt-style-selftest/bad/yaml-redundant-ws.yaml | 29 +++++++++++++++++
.../expected/dts-redundant-ws-strict.dts.txt | 13 ++++++++
.../expected/dts-redundant-ws.dts.txt | 9 +++++
.../expected/yaml-redundant-ws-strict.yaml.txt | 5 +++
.../expected/yaml-redundant-ws.yaml.txt | 3 ++
9 files changed, 180 insertions(+)
diff --git a/scripts/dtc/dt-check-style b/scripts/dtc/dt-check-style
index 1430c675bd95..aa2072957a1a 100755
--- a/scripts/dtc/dt-check-style
+++ b/scripts/dtc/dt-check-style
@@ -348,6 +348,36 @@ def check_trailing_whitespace(ctx):
yield (dl.lineno, 'trailing whitespace')
+def check_redundant_whitespace(ctx):
+ """No whitespace between brackets or other code elements.
+ See also check_value_whitespace() for more checks."""
+ for dl in ctx.lines:
+ if dl.linetype in (LineType.COMMENT, LineType.COMMENT_BODY,
+ LineType.COMMENT_END, LineType.COMMENT_START,
+ LineType.PREPROCESSOR):
+ continue
+ if re.search(r'(\s\s+|\t){', dl.raw):
+ yield (dl.lineno, 'extra whitespace before {')
+ if re.search(r':(\s\s+|\t)', dl.raw):
+ yield (dl.lineno, 'extra whitespace after :')
+ if re.search(r'\s+;', dl.raw):
+ yield (dl.lineno, 'extra whitespace before ;')
+
+
+def check_redundant_whitespace_strict(ctx):
+ """No whitespace between brackets or other code elements.
+ See also check_value_whitespace() for more checks."""
+ for dl in ctx.lines:
+ if dl.linetype in (LineType.COMMENT, LineType.COMMENT_BODY,
+ LineType.COMMENT_END, LineType.COMMENT_START,
+ LineType.PREPROCESSOR):
+ continue
+ if re.search(r'(\s\s+|\t)=', dl.raw):
+ yield (dl.lineno, 'extra whitespace before =')
+ if re.search(r'=(\s\s+|\t)', dl.raw):
+ yield (dl.lineno, 'extra whitespace after =')
+
+
def check_tab_in_yaml_example(ctx):
"""Reject literal tabs in DTS lines when input is YAML.
@@ -1002,6 +1032,10 @@ RULES = [
Rule('trailing-whitespace', 'relaxed',
'no trailing whitespace on any line',
check_trailing_whitespace),
+ # See also check_redundant_whitespace_strict() and check_value_whitespace()
+ Rule('redundant-whitespace', 'relaxed',
+ 'no redundant whitespace within code',
+ check_redundant_whitespace),
Rule('tab-in-yaml', 'relaxed',
'YAML (also DTS examples) may not contain tab characters',
check_tab_in_yaml_example, applies_to=('yaml',)),
@@ -1052,6 +1086,10 @@ RULES = [
Rule('unit-address-format', 'strict',
'unit addresses must be lowercase hex without leading zeros',
check_unit_address_format),
+ # See also check_redundant_whitespace() and check_value_whitespace()
+ Rule('redundant-whitespace-strict', 'strict',
+ 'no redundant whitespace within code',
+ check_redundant_whitespace_strict),
Rule('value-whitespace', 'strict',
'no whitespace directly inside <...> brackets',
check_value_whitespace),
diff --git a/scripts/dtc/dt-style-selftest/bad/dts-redundant-ws-strict.dts b/scripts/dtc/dt-style-selftest/bad/dts-redundant-ws-strict.dts
new file mode 100644
index 000000000000..d73908b2ab0f
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/bad/dts-redundant-ws-strict.dts
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/dts-v1/;
+
+#define SOME_MACRO(foo) \
+ (foo) ? <1> : <2> ;
+
+/ {
+ compatible = "example,test-board";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ /* comments { are okay = though ; */
+ soc: soc@0 {
+ compatible = "simple-bus";
+ ranges = <0 0 0 0xc0000000>;
+
+ #address-cells = <1>;
+ #size-cells = <1>;
+ } ;
+};
+
+&soc {
+ serial: serial@20000 {
+ compatible = "example,serial";
+ reg = <0x20000 0x1000>;
+ } ;
+};
diff --git a/scripts/dtc/dt-style-selftest/bad/dts-redundant-ws.dts b/scripts/dtc/dt-style-selftest/bad/dts-redundant-ws.dts
new file mode 100644
index 000000000000..2fedf462ca56
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/bad/dts-redundant-ws.dts
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+/dts-v1/;
+
+#define SOME_MACRO(foo) \
+ (foo) ? <1> : <2> ;
+
+/ {
+ compatible = "example,test-board";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ /* comments { are okay = though ; */
+ soc: soc@0 {
+ compatible = "simple-bus";
+ ranges = <0 0 0 0xc0000000>;
+
+ #address-cells = <1>;
+ #size-cells = <1>;
+ } ;
+};
+
+&soc {
+ serial: serial@20000 {
+ compatible = "example,serial";
+ reg = <0x20000 0x1000>;
+ } ;
+};
diff --git a/scripts/dtc/dt-style-selftest/bad/yaml-redundant-ws-strict.yaml b/scripts/dtc/dt-style-selftest/bad/yaml-redundant-ws-strict.yaml
new file mode 100644
index 000000000000..14c2346d7658
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/bad/yaml-redundant-ws-strict.yaml
@@ -0,0 +1,29 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/yaml-redundant-ws-strict.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Test fixture with redundant whitespace
+
+maintainers:
+ - Test User <test@example.com>
+
+properties:
+ compatible:
+ const: example,test-redundant
+ reg:
+ maxItems: 1
+
+required:
+ - compatible
+ - reg
+
+additionalProperties: false
+
+examples:
+ - |
+ device@1000 {
+ compatible = "example,test-trailing";
+ reg = <0x1000 0x100>;
+ } ;
diff --git a/scripts/dtc/dt-style-selftest/bad/yaml-redundant-ws.yaml b/scripts/dtc/dt-style-selftest/bad/yaml-redundant-ws.yaml
new file mode 100644
index 000000000000..db265402d0e8
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/bad/yaml-redundant-ws.yaml
@@ -0,0 +1,29 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/yaml-redundant-ws.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Test fixture with redundant whitespace
+
+maintainers:
+ - Test User <test@example.com>
+
+properties:
+ compatible:
+ const: example,test-redundant
+ reg:
+ maxItems: 1
+
+required:
+ - compatible
+ - reg
+
+additionalProperties: false
+
+examples:
+ - |
+ device@1000 {
+ compatible = "example,test-trailing";
+ reg = <0x1000 0x100>;
+ } ;
diff --git a/scripts/dtc/dt-style-selftest/expected/dts-redundant-ws-strict.dts.txt b/scripts/dtc/dt-style-selftest/expected/dts-redundant-ws-strict.dts.txt
new file mode 100644
index 000000000000..ac0d57bdecdf
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/expected/dts-redundant-ws-strict.dts.txt
@@ -0,0 +1,13 @@
+# mode=strict
+bad/dts-redundant-ws-strict.dts:7: [redundant-whitespace] extra whitespace before {
+bad/dts-redundant-ws-strict.dts:13: [redundant-whitespace] extra whitespace before {
+bad/dts-redundant-ws-strict.dts:13: [redundant-whitespace] extra whitespace after :
+bad/dts-redundant-ws-strict.dts:17: [redundant-whitespace-strict] extra whitespace before =
+bad/dts-redundant-ws-strict.dts:18: [redundant-whitespace-strict] extra whitespace after =
+bad/dts-redundant-ws-strict.dts:19: [redundant-whitespace] extra whitespace before ;
+bad/dts-redundant-ws-strict.dts:22: [redundant-whitespace] extra whitespace before {
+bad/dts-redundant-ws-strict.dts:23: [redundant-whitespace] extra whitespace before {
+bad/dts-redundant-ws-strict.dts:23: [redundant-whitespace] extra whitespace after :
+bad/dts-redundant-ws-strict.dts:24: [redundant-whitespace-strict] extra whitespace before =
+bad/dts-redundant-ws-strict.dts:25: [redundant-whitespace-strict] extra whitespace after =
+bad/dts-redundant-ws-strict.dts:26: [redundant-whitespace] extra whitespace before ;
diff --git a/scripts/dtc/dt-style-selftest/expected/dts-redundant-ws.dts.txt b/scripts/dtc/dt-style-selftest/expected/dts-redundant-ws.dts.txt
new file mode 100644
index 000000000000..c18c1972bb47
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/expected/dts-redundant-ws.dts.txt
@@ -0,0 +1,9 @@
+# mode=relaxed
+bad/dts-redundant-ws.dts:7: [redundant-whitespace] extra whitespace before {
+bad/dts-redundant-ws.dts:13: [redundant-whitespace] extra whitespace before {
+bad/dts-redundant-ws.dts:13: [redundant-whitespace] extra whitespace after :
+bad/dts-redundant-ws.dts:19: [redundant-whitespace] extra whitespace before ;
+bad/dts-redundant-ws.dts:22: [redundant-whitespace] extra whitespace before {
+bad/dts-redundant-ws.dts:23: [redundant-whitespace] extra whitespace before {
+bad/dts-redundant-ws.dts:23: [redundant-whitespace] extra whitespace after :
+bad/dts-redundant-ws.dts:26: [redundant-whitespace] extra whitespace before ;
diff --git a/scripts/dtc/dt-style-selftest/expected/yaml-redundant-ws-strict.yaml.txt b/scripts/dtc/dt-style-selftest/expected/yaml-redundant-ws-strict.yaml.txt
new file mode 100644
index 000000000000..a70b365b6cf5
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/expected/yaml-redundant-ws-strict.yaml.txt
@@ -0,0 +1,5 @@
+# mode=strict
+bad/yaml-redundant-ws-strict.yaml:26: example 0 [redundant-whitespace] extra whitespace before {
+bad/yaml-redundant-ws-strict.yaml:27: example 0 [redundant-whitespace-strict] extra whitespace before =
+bad/yaml-redundant-ws-strict.yaml:28: example 0 [redundant-whitespace-strict] extra whitespace after =
+bad/yaml-redundant-ws-strict.yaml:29: example 0 [redundant-whitespace] extra whitespace before ;
diff --git a/scripts/dtc/dt-style-selftest/expected/yaml-redundant-ws.yaml.txt b/scripts/dtc/dt-style-selftest/expected/yaml-redundant-ws.yaml.txt
new file mode 100644
index 000000000000..c85e80ed272a
--- /dev/null
+++ b/scripts/dtc/dt-style-selftest/expected/yaml-redundant-ws.yaml.txt
@@ -0,0 +1,3 @@
+# mode=relaxed
+bad/yaml-redundant-ws.yaml:26: example 0 [redundant-whitespace] extra whitespace before {
+bad/yaml-redundant-ws.yaml:29: example 0 [redundant-whitespace] extra whitespace before ;
--
2.53.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v3 11/11] MAINTAINERS: dt-bindings: Include dt-check-style in DT binding entry
2026-08-03 9:03 [PATCH v3 00/11] dtc: dt-check-style: Improvements for false positives Krzysztof Kozlowski
` (9 preceding siblings ...)
2026-08-03 9:03 ` [PATCH v3 10/11] dtc: dt-check-style: Add warning for redundant white-spaces Krzysztof Kozlowski
@ 2026-08-03 9:03 ` Krzysztof Kozlowski
10 siblings, 0 replies; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-03 9:03 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan, Test User, Krzysztof Kozlowski,
Conor Dooley
Cc: devicetree, linux-kernel, Krzysztof Kozlowski
The dt-check-style tool is in interest of Devicetree bindings
maintainers, not only the driver OF-core (where it is covered through
"F: scripts/dtc/"), because it covers the DTS and the bindings. Add it
to the DT bindings maintainers entry.
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
---
MAINTAINERS | 2 ++
1 file changed, 2 insertions(+)
diff --git a/MAINTAINERS b/MAINTAINERS
index cc3c01eecfa2..2d0cd7602a05 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -20374,6 +20374,8 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git
F: Documentation/devicetree/
F: arch/*/boot/dts/
F: include/dt-bindings/
+F: scripts/dtc/dt-check-style
+F: scripts/dtc/dt-style-selftest/
OPENCOMPUTE PTP CLOCK DRIVER
M: Vadim Fedorenko <vadim.fedorenko@linux.dev>
--
2.53.0
^ permalink raw reply related [flat|nested] 27+ messages in thread
* Re: [PATCH v3 05/11] dtc: dt-check-style: Drop stray backslash before quote for continuation-alignment
2026-08-03 9:03 ` [PATCH v3 05/11] dtc: dt-check-style: Drop stray backslash before quote for continuation-alignment Krzysztof Kozlowski
@ 2026-08-03 9:09 ` sashiko-bot
2026-08-05 7:09 ` Krzysztof Kozlowski
0 siblings, 1 reply; 27+ messages in thread
From: sashiko-bot @ 2026-08-03 9:09 UTC (permalink / raw)
To: Krzysztof Kozlowski; +Cc: robh, conor+dt, devicetree
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] Incomplete fix introduces inconsistency: The rule description for 'continuation-alignment' in the RULES array was not updated to match the new warning message.
--
--- Patch [5]: [PATCH v3 05/11] dtc: dt-check-style: Drop stray backslash before quote for continuation-alignment ---
commit cc9a0068ab7c4a58265d453026c1b235168a19bd
Author: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
dtc: dt-check-style: Drop stray backslash before quote for continuation-alignment
This commit updates the continuation-alignment rule warning to drop the stray
backslash and quotes around the character matching rules. It removes the
quotes around '<' and the escaped quote inside the parenthesis.
> diff --git a/scripts/dtc/dt-check-style b/scripts/dtc/dt-check-style
> index f9e5762862a51..bdf36ba9e2744 100755
> --- a/scripts/dtc/dt-check-style
> +++ b/scripts/dtc/dt-check-style
> @@ -950,7 +950,7 @@ def check_continuation_alignment(ctx):
> if _display_col(cont.indent_str) != target_col:
> yield (cont.lineno,
> 'continuation should align to column %d '
> - '(under "<" or \\")' % (target_col + 1))
> + '(under < or ")' % (target_col + 1))
[Severity: Low]
Does the RULES array description need to be updated to match this new text?
Looking further down in scripts/dtc/dt-check-style in the RULES array, the
rule description still has the old escaping and quotes:
Rule('continuation-alignment', 'strict',
'multi-line property continuations align under "<" or "\\""',
check_continuation_alignment),
This will cause dt-check-style --list-rules to display the old style text
while the actual warning output uses the new style.
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260803-n-dts-style-checker-continued-v3-0-6c9776928cea@oss.qualcomm.com?part=5
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v3 09/11] dtc: dt-check-style: Add test for trailing white-space in DTS
2026-08-03 9:03 ` [PATCH v3 09/11] dtc: dt-check-style: Add test for trailing white-space in DTS Krzysztof Kozlowski
@ 2026-08-03 9:11 ` sashiko-bot
2026-08-05 7:03 ` Krzysztof Kozlowski
0 siblings, 1 reply; 27+ messages in thread
From: sashiko-bot @ 2026-08-03 9:11 UTC (permalink / raw)
To: Krzysztof Kozlowski; +Cc: robh, conor+dt, devicetree
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] The test file `bad/dts-trailing-ws.dts` is intended to trigger a trailing whitespace warning, but it does not actually contain any trailing whitespace. As a result, the style checker will not emit the expected warning, and the unit test will fail.
--
--- Patch [9]: [PATCH v3 09/11] dtc: dt-check-style: Add test for trailing white-space in DTS ---
commit a9f7c5c65b57ce006736994c5d872356aea7725f
Author: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
dtc: dt-check-style: Add test for trailing white-space in DTS
Add unit tests for expected warnings for trailing white-spaces in DTS
(there is only one for YAML files).
> diff --git a/scripts/dtc/dt-style-selftest/bad/dts-trailing-ws.dts b/scripts/dtc/dt-style-selftest/bad/dts-trailing-ws.dts
> new file mode 100644
> index 0000000000000..ade160a443411
> --- /dev/null
> +++ b/scripts/dtc/dt-style-selftest/bad/dts-trailing-ws.dts
> @@ -0,0 +1,8 @@
> +// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
> +/dts-v1/;
> +
> +/ {
> + compatible = "example,test-board";
[Severity: Medium]
Since this test file is intended to trigger a trailing whitespace warning on
this line, should it contain actual trailing whitespace? It appears to end
exactly with a semicolon, which will cause the unit test to fail because
the style checker won't emit the expected warning.
Could the required whitespace have been inadvertently stripped by an editor or
commit hook?
> + #address-cells = <1>;
> + #size-cells = <1>;
> +};
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260803-n-dts-style-checker-continued-v3-0-6c9776928cea@oss.qualcomm.com?part=9
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v3 10/11] dtc: dt-check-style: Add warning for redundant white-spaces
2026-08-03 9:03 ` [PATCH v3 10/11] dtc: dt-check-style: Add warning for redundant white-spaces Krzysztof Kozlowski
@ 2026-08-03 9:13 ` sashiko-bot
2026-08-05 7:12 ` Krzysztof Kozlowski
0 siblings, 1 reply; 27+ messages in thread
From: sashiko-bot @ 2026-08-03 9:13 UTC (permalink / raw)
To: Krzysztof Kozlowski; +Cc: conor+dt, devicetree, robh
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] False positives in dt-check-style whitespace checks due to unstripped strings and inline comments.
--
--- Patch [10]: [PATCH v3 10/11] dtc: dt-check-style: Add warning for redundant white-spaces ---
commit f5a3cbd31bda433ce990bca1b2244f3a3da27d87
Author: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
dtc: dt-check-style: Add warning for redundant white-spaces
This commit adds a warning in dt-check-style to catch excessive spaces or
tabs around '=', before '{', and before ';'. The checking is split between
relaxed and strict modes to accommodate existing in-tree usage.
> diff --git a/scripts/dtc/dt-check-style b/scripts/dtc/dt-check-style
> index 1430c675bd951..aa2072957a1a0 100755
> --- a/scripts/dtc/dt-check-style
> +++ b/scripts/dtc/dt-check-style
> @@ -348,6 +348,36 @@ def check_trailing_whitespace(ctx):
> yield (dl.lineno, 'trailing whitespace')
>
>
> +def check_redundant_whitespace(ctx):
> + """No whitespace between brackets or other code elements.
> + See also check_value_whitespace() for more checks."""
> + for dl in ctx.lines:
> + if dl.linetype in (LineType.COMMENT, LineType.COMMENT_BODY,
> + LineType.COMMENT_END, LineType.COMMENT_START,
> + LineType.PREPROCESSOR):
> + continue
> + if re.search(r'(\s\s+|\t){', dl.raw):
> + yield (dl.lineno, 'extra whitespace before {')
> + if re.search(r':(\s\s+|\t)', dl.raw):
> + yield (dl.lineno, 'extra whitespace after :')
> + if re.search(r'\s+;', dl.raw):
[Severity: Medium]
Does using dl.raw directly here cause false positives for inline comments or
string literals?
For example, if a line has bootargs = "console=ttyS0 rdinit=/init"; or
reg = <1>; /* my comment ; */, since re.search evaluates dl.raw directly,
it looks like it will match the whitespace inside the string or the inline
comment.
Would it be safer to strip comments or strings via
_strip_strings_and_comments(dl.raw) before evaluating the regular expressions?
> + yield (dl.lineno, 'extra whitespace before ;')
> +
> +
> +def check_redundant_whitespace_strict(ctx):
> + """No whitespace between brackets or other code elements.
> + See also check_value_whitespace() for more checks."""
> + for dl in ctx.lines:
> + if dl.linetype in (LineType.COMMENT, LineType.COMMENT_BODY,
> + LineType.COMMENT_END, LineType.COMMENT_START,
> + LineType.PREPROCESSOR):
> + continue
> + if re.search(r'(\s\s+|\t)=', dl.raw):
> + yield (dl.lineno, 'extra whitespace before =')
> + if re.search(r'=(\s\s+|\t)', dl.raw):
[Severity: Medium]
Similarly, will this strict check also trigger false positives on strings
that intentionally contain multiple spaces, such as
compatible = "vendor,device v2";, because dl.raw retains the unstripped
string content?
> + yield (dl.lineno, 'extra whitespace after =')
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260803-n-dts-style-checker-continued-v3-0-6c9776928cea@oss.qualcomm.com?part=10
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v3 08/11] dtc: dt-check-style: Introduce 'stricter' mode
2026-08-03 9:03 ` [PATCH v3 08/11] dtc: dt-check-style: Introduce 'stricter' mode Krzysztof Kozlowski
@ 2026-08-03 9:16 ` sashiko-bot
2026-08-05 7:06 ` Krzysztof Kozlowski
0 siblings, 1 reply; 27+ messages in thread
From: sashiko-bot @ 2026-08-03 9:16 UTC (permalink / raw)
To: Krzysztof Kozlowski; +Cc: devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] Top-level nodes with the same name but different unit addresses are no longer validated for correct ordering.
--
--- Patch [8]: [PATCH v3 08/11] dtc: dt-check-style: Introduce 'stricter' mode ---
commit 3fa51567db6be5159b622c7ba7a9c229f630ccc8
Author: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
dtc: dt-check-style: Introduce 'stricter' mode
This commit introduces a 'stricter' mode to the dt-check-style script. It
moves the line-length and unused-labels rules for DTS files from 'strict' to
'stricter' to reduce false positives.
> diff --git a/scripts/dtc/dt-check-style b/scripts/dtc/dt-check-style
> index e3adaad1be633..1430c675bd951 100755
> --- a/scripts/dtc/dt-check-style
> +++ b/scripts/dtc/dt-check-style
> @@ -5,12 +5,14 @@
> # .dts/.dtsi/.dtso source files. Enforces rules from
> # Documentation/devicetree/bindings/dts-coding-style.rst.
[ ... ]
[Severity: Medium]
Are top-level nodes with the same name but different unit addresses still
validated for correct ordering?
Looking at check_child_name_order() in scripts/dtc/dt-check-style, top-level
addressed nodes are mapped solely to their node_name, completely discarding
their unit address as a secondary sorting key:
scripts/dtc/dt-check-style:check_child_name_order() {
...
unaddressed.append((_natural_sort_key(c.node_name), c))
...
}
Because the strict less-than comparison against identically evaluated name keys
evaluates to False, the script silently ignores out-of-order nodes with the
same name:
scripts/dtc/dt-check-style:check_child_name_order() {
...
for i in range(1, len(unaddressed)):
if unaddressed[i][0] < unaddressed[i - 1][0]:
...
}
Does this allow malformed DTS files with out-of-order top-level nodes of the
same name to bypass validation?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260803-n-dts-style-checker-continued-v3-0-6c9776928cea@oss.qualcomm.com?part=8
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v3 03/11] dtc: dt-check-style: Handle root node in overlays
2026-08-03 9:03 ` [PATCH v3 03/11] dtc: dt-check-style: Handle root node in overlays Krzysztof Kozlowski
@ 2026-08-03 9:18 ` sashiko-bot
0 siblings, 0 replies; 27+ messages in thread
From: sashiko-bot @ 2026-08-03 9:18 UTC (permalink / raw)
To: Krzysztof Kozlowski; +Cc: devicetree, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] The patch fails to address the issue claimed in the commit message, introduces dead logic for overlay root nodes, and causes a regression for standard unspaced root nodes.
--
--- Patch [3]: [PATCH v3 03/11] dtc: dt-check-style: Handle root node in overlays ---
commit 099936d5537a0ed41e9b6886979ab1b9de2421d1
Author: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
dtc: dt-check-style: Handle root node in overlays
This patch aims to handle root nodes in overlays correctly by detecting
them and storing an is_root attribute in DtsLine, intending to fix false
positives for property order.
> This fixes false positives for property order for root nodes in overlays.
[Severity: Medium]
Does this patch actually update check_property_order()?
The diff modifies check_child_name_order() instead, leaving the
check_property_order() function completely unchanged.
> diff --git a/scripts/dtc/dt-check-style b/scripts/dtc/dt-check-style
> index 96deffc0d8a7c..d9f76d6d9179e 100755
> --- a/scripts/dtc/dt-check-style
> +++ b/scripts/dtc/dt-check-style
[ ... ]
> @@ -228,7 +229,10 @@ def classify_lines(text):
> continue
>
> if code.endswith('{'):
> - dl = DtsLine(i, raw, LineType.NODE_OPEN, depth, indent_str, code)
> + is_root = False
> + if code == '&{/} {' or re.search(r'^/\s+\{$', code):
> + is_root = True
> + dl = DtsLine(i, raw, LineType.NODE_OPEN, depth, indent_str, code, is_root=is_root)
[Severity: Medium]
Will this regex handle standard unspaced root nodes like "/{"?
The regex pattern ^/\s+\{$ strictly requires whitespace. Valid unspaced
root nodes or labelled root nodes might bypass this logic and incorrectly
evaluate to is_root = False.
[ ... ]
> @@ -550,7 +554,9 @@ def check_child_name_order(ctx):
> for c in children:
> if c.node_addr is not None:
> continue
> - if c.node_name in (None, '/'):
> + if c.node_name is None:
> + continue
> + if c.is_root:
> continue
[Severity: Medium]
Is the c.is_root check reachable for overlay root nodes?
Overlay root nodes like "&{/} {" typically have c.node_name as None. Since
the check for c.node_name is None happens just before c.is_root, the loop
will already continue and the c.is_root check becomes dead code for them.
Also, since standard root nodes ("/") were previously skipped by the removed
c.node_name in (None, '/') check, and unspaced root nodes bypass the is_root
regex above, will they now be incorrectly subjected to the child-name
sorting logic?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260803-n-dts-style-checker-continued-v3-0-6c9776928cea@oss.qualcomm.com?part=3
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v3 04/11] dtc: dt-check-style: Handle sorting of top-level nodes and properties
2026-08-03 9:03 ` [PATCH v3 04/11] dtc: dt-check-style: Handle sorting of top-level nodes and properties Krzysztof Kozlowski
@ 2026-08-03 9:20 ` sashiko-bot
2026-08-05 7:07 ` Krzysztof Kozlowski
0 siblings, 1 reply; 27+ messages in thread
From: sashiko-bot @ 2026-08-03 9:20 UTC (permalink / raw)
To: Krzysztof Kozlowski; +Cc: robh, conor+dt, devicetree
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] Spurious expected error line in a test output file will cause the selftest suite to fail.
--
--- Patch [4]: [PATCH v3 04/11] dtc: dt-check-style: Handle sorting of top-level nodes and properties ---
commit e2a1efff1b6b0ed83316a48d24047cc58103d45d
Author: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
dtc: dt-check-style: Handle sorting of top-level nodes and properties
This patch updates dt-check-style to handle special sorting rules for
top-level nodes and properties. It modifies the tool to sort root-level
nodes by name rather than unit address, and requires the 'model' property
to precede 'compatible' at the root level. Test fixtures and expected
outputs are updated accordingly.
> diff --git a/scripts/dtc/dt-style-selftest/expected/dts-property-order.dts.txt b/scripts/dtc/dt-style-selftest/expected/dts-property-order.dts.txt
> index 4bc21328625f9..29283f3451c78 100644
> --- a/scripts/dtc/dt-style-selftest/expected/dts-property-order.dts.txt
> +++ b/scripts/dtc/dt-style-selftest/expected/dts-property-order.dts.txt
> @@ -1,6 +1,9 @@
> # mode=strict
> -bad/dts-property-order.dts:15: [property-order] property 'compatible' out of canonical order (should sort before 'reg')
> -bad/dts-property-order.dts:16: [property-order] property 'device_type' out of canonical order (should sort before 'compatible')
> -bad/dts-property-order.dts:25: [property-order] property 'dma-coherent' out of canonical order (should sort before 'status')
> -bad/dts-property-order.dts:30: [property-order] property 'compatible' out of canonical order (should sort before 'ranges')
> -bad/dts-property-order.dts:40: [property-order] property 'compatible' out of canonical order (should sort before 'interrupts')
> +bad/dts-property-order.dts:8: [redundant-whitespace] extra whitespace before {
[Severity: Medium]
Will this cause the selftest suite to fail unconditionally?
The expected output file now looks for a [redundant-whitespace] error, but
the dt-check-style script does not appear to implement a redundant-whitespace
rule or emit this string.
Since the test runner requires an exact match between the tool's output and
this expected text file, does this spurious expected line break the test
suite?
> +bad/dts-property-order.dts:10: [property-order] property 'model' out of canonical order (should sort before 'compatible')
> +bad/dts-property-order.dts:12: [property-order] property 'chassis-type' out of canonical order (should sort before 'qcom,board-id')
> +bad/dts-property-order.dts:20: [property-order] property 'compatible' out of canonical order (should sort before 'reg')
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260803-n-dts-style-checker-continued-v3-0-6c9776928cea@oss.qualcomm.com?part=4
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v3 06/11] dtc: dt-check-style: Fix alignment of values in continued property lines
2026-08-03 9:03 ` [PATCH v3 06/11] dtc: dt-check-style: Fix alignment of values in continued property lines Krzysztof Kozlowski
@ 2026-08-03 9:21 ` sashiko-bot
2026-08-05 7:12 ` Krzysztof Kozlowski
0 siblings, 1 reply; 27+ messages in thread
From: sashiko-bot @ 2026-08-03 9:21 UTC (permalink / raw)
To: Krzysztof Kozlowski; +Cc: devicetree, conor+dt, robh
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] The dt-check-style continuation alignment heuristic misaligns C preprocessor macros
--
--- Patch [6]: [PATCH v3 06/11] dtc: dt-check-style: Fix alignment of values in continued property lines ---
commit 2e7f6260952152a0c0c19383e03e859b1a3c8092
Author: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
dtc: dt-check-style: Fix alignment of values in continued property lines
This commit updates the dt-check-style script to enforce proper alignment
for continued property lines. If a continued line is part of a previous
phandle, it requires alignment to inner values rather than the opening
bracket to improve readability.
> diff --git a/scripts/dtc/dt-check-style b/scripts/dtc/dt-check-style
> index bdf36ba9e2744..1c67348fb5269 100755
> --- a/scripts/dtc/dt-check-style
> +++ b/scripts/dtc/dt-check-style
[ ... ]
> @@ -942,15 +943,20 @@ def check_continuation_alignment(ctx):
> continue
> # First '<' or '"' after '='
> rest = dl.raw[eq + 1:]
> - m = re.search(r'[<"]', rest)
> + m = re.search(r'\s*([<"])', rest)
> if not m:
> continue
> - target_col = _display_col(dl.raw[:eq + 1 + m.start()])
> + target_col = _display_col(dl.raw[:eq + 1 + m.start(1)])
> for cont in dl.continuations:
> - if _display_col(cont.indent_str) != target_col:
> + target_offset = 0
> + err_msg_explanation = 'to < or "'
> + if not re.match(r'[<"]', cont.stripped):
> + target_offset = 1
[Severity: Low]
Does this heuristic unintentionally force misalignment for C preprocessor macros
when they appear as top-level elements in comma-separated property lists?
Looking at check_continuation_alignment() in scripts/dtc/dt-check-style, if a
macro is used in a list alongside <...> elements:
clocks = <&foo>,
CLOCK_MACRO;
The macro does not start with < or ". As a result, this check treats the macro
as an inner value and applies the target_offset = 1. This would mandate an
extra column of indentation, forcing the macro to misalign from the opening <
of the previous line.
> + err_msg_explanation = 'to the value under <'
> + if _display_col(cont.indent_str) != target_col + target_offset:
> yield (cont.lineno,
> 'continuation should align to column %d '
> - '(under < or ")' % (target_col + 1))
> + '(%s)' % (target_col + target_offset + 1, err_msg_explanation))
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260803-n-dts-style-checker-continued-v3-0-6c9776928cea@oss.qualcomm.com?part=6
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v3 01/11] dtc: dt-check-style: Add missing /dts-v1/ to few test cases
2026-08-03 9:03 ` [PATCH v3 01/11] dtc: dt-check-style: Add missing /dts-v1/ to few test cases Krzysztof Kozlowski
@ 2026-08-03 22:30 ` Rob Herring (Arm)
0 siblings, 0 replies; 27+ messages in thread
From: Rob Herring (Arm) @ 2026-08-03 22:30 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Saravana Kannan, linux-kernel, devicetree, Krzysztof Kozlowski,
Conor Dooley, Test User
On Mon, 03 Aug 2026 11:03:04 +0200, Krzysztof Kozlowski wrote:
> The selftest DTS should still look like a real DTS, so it needs
> '/dts-v1/' marking.
>
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
> ---
> scripts/dtc/dt-style-selftest/bad/dts-child-name-order.dts | 2 ++
> scripts/dtc/dt-style-selftest/bad/dts-extend-node-child-name-order.dts | 2 ++
> scripts/dtc/dt-style-selftest/bad/dts-extend-node-digit-node-order.dts | 2 ++
> scripts/dtc/dt-style-selftest/expected/dts-child-name-order.dts.txt | 2 +-
> .../dt-style-selftest/expected/dts-extend-node-child-name-order.dts.txt | 2 +-
> .../dt-style-selftest/expected/dts-extend-node-digit-node-order.dts.txt | 2 +-
> scripts/dtc/dt-style-selftest/good/dts-child-name-order.dts | 2 ++
> scripts/dtc/dt-style-selftest/good/dts-digit-node-order.dts | 2 ++
> scripts/dtc/dt-style-selftest/good/dts-extend-node-child-name-order.dts | 2 ++
> scripts/dtc/dt-style-selftest/good/dts-extend-node-digit-node-order.dts | 2 ++
> scripts/dtc/dt-style-selftest/good/soc.dtsi | 2 ++
> 11 files changed, 19 insertions(+), 3 deletions(-)
>
Applied, thanks!
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v3 02/11] dtc: dt-check-style: Simplify setting depth of DtsLine
2026-08-03 9:03 ` [PATCH v3 02/11] dtc: dt-check-style: Simplify setting depth of DtsLine Krzysztof Kozlowski
@ 2026-08-03 22:31 ` Rob Herring (Arm)
0 siblings, 0 replies; 27+ messages in thread
From: Rob Herring (Arm) @ 2026-08-03 22:31 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Saravana Kannan, devicetree, Krzysztof Kozlowski, Test User,
Conor Dooley, linux-kernel
On Mon, 03 Aug 2026 11:03:05 +0200, Krzysztof Kozlowski wrote:
> When creating new DtsLine object, pass expected indentation depth as
> constructor, instead of assigning it immediately after, so the code will
> be easier to read and explicit (depth is not supposed to change during
> DtsLine lifetime).
>
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
> ---
> scripts/dtc/dt-check-style | 31 +++++++++++--------------------
> 1 file changed, 11 insertions(+), 20 deletions(-)
>
Applied, thanks!
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v3 09/11] dtc: dt-check-style: Add test for trailing white-space in DTS
2026-08-03 9:11 ` sashiko-bot
@ 2026-08-05 7:03 ` Krzysztof Kozlowski
0 siblings, 0 replies; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-05 7:03 UTC (permalink / raw)
To: sashiko-reviews; +Cc: Krzysztof Kozlowski, robh, conor+dt, devicetree
On Mon, Aug 03, 2026 at 09:11:23AM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Medium] The test file `bad/dts-trailing-ws.dts` is intended to trigger a trailing whitespace warning, but it does not actually contain any trailing whitespace. As a result, the style checker will not emit the expected warning, and the unit test will fail.
Same false positive.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v3 08/11] dtc: dt-check-style: Introduce 'stricter' mode
2026-08-03 9:16 ` sashiko-bot
@ 2026-08-05 7:06 ` Krzysztof Kozlowski
0 siblings, 0 replies; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-05 7:06 UTC (permalink / raw)
To: sashiko-reviews; +Cc: Krzysztof Kozlowski, devicetree, robh, conor+dt
On Mon, Aug 03, 2026 at 09:16:19AM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Medium] Top-level nodes with the same name but different unit addresses are no longer validated for correct ordering.
> --
That's a proper idea, although not a regression. Not relevant to this
patch.
I will add it to my TODO list for later.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v3 04/11] dtc: dt-check-style: Handle sorting of top-level nodes and properties
2026-08-03 9:20 ` sashiko-bot
@ 2026-08-05 7:07 ` Krzysztof Kozlowski
0 siblings, 0 replies; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-05 7:07 UTC (permalink / raw)
To: sashiko-reviews; +Cc: Krzysztof Kozlowski, robh, conor+dt, devicetree
On Mon, Aug 03, 2026 at 09:20:03AM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Medium] Spurious expected error line in a test output file will cause the selftest suite to fail.
Ack, rebasing issue.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v3 05/11] dtc: dt-check-style: Drop stray backslash before quote for continuation-alignment
2026-08-03 9:09 ` sashiko-bot
@ 2026-08-05 7:09 ` Krzysztof Kozlowski
0 siblings, 0 replies; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-05 7:09 UTC (permalink / raw)
To: sashiko-reviews; +Cc: Krzysztof Kozlowski, robh, conor+dt, devicetree
On Mon, Aug 03, 2026 at 09:09:06AM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Low] Incomplete fix introduces inconsistency: The rule description for 'continuation-alignment' in the RULES array was not updated to match the new warning message.
Ack
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v3 06/11] dtc: dt-check-style: Fix alignment of values in continued property lines
2026-08-03 9:21 ` sashiko-bot
@ 2026-08-05 7:12 ` Krzysztof Kozlowski
0 siblings, 0 replies; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-05 7:12 UTC (permalink / raw)
To: sashiko-reviews; +Cc: Krzysztof Kozlowski, devicetree, conor+dt, robh
On Mon, Aug 03, 2026 at 09:21:40AM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Low] The dt-check-style continuation alignment heuristic misaligns C preprocessor macros
> --
>
> --- Patch [6]: [PATCH v3 06/11] dtc: dt-check-style: Fix alignment of values in continued property lines ---
> commit 2e7f6260952152a0c0c19383e03e859b1a3c8092
> Author: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
>
> dtc: dt-check-style: Fix alignment of values in continued property lines
>
> This commit updates the dt-check-style script to enforce proper alignment
> for continued property lines. If a continued line is part of a previous
> phandle, it requires alignment to inner values rather than the opening
> bracket to improve readability.
>
> > diff --git a/scripts/dtc/dt-check-style b/scripts/dtc/dt-check-style
> > index bdf36ba9e2744..1c67348fb5269 100755
> > --- a/scripts/dtc/dt-check-style
> > +++ b/scripts/dtc/dt-check-style
>
> [ ... ]
>
> > @@ -942,15 +943,20 @@ def check_continuation_alignment(ctx):
> > continue
> > # First '<' or '"' after '='
> > rest = dl.raw[eq + 1:]
> > - m = re.search(r'[<"]', rest)
> > + m = re.search(r'\s*([<"])', rest)
> > if not m:
> > continue
> > - target_col = _display_col(dl.raw[:eq + 1 + m.start()])
> > + target_col = _display_col(dl.raw[:eq + 1 + m.start(1)])
> > for cont in dl.continuations:
> > - if _display_col(cont.indent_str) != target_col:
> > + target_offset = 0
> > + err_msg_explanation = 'to < or "'
> > + if not re.match(r'[<"]', cont.stripped):
> > + target_offset = 1
>
> [Severity: Low]
> Does this heuristic unintentionally force misalignment for C preprocessor macros
> when they appear as top-level elements in comma-separated property lists?
>
> Looking at check_continuation_alignment() in scripts/dtc/dt-check-style, if a
> macro is used in a list alongside <...> elements:
>
> clocks = <&foo>,
> CLOCK_MACRO;
We don't want code like this... but comment is valid. The check should
rather rely on ending of the previous phandle.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v3 10/11] dtc: dt-check-style: Add warning for redundant white-spaces
2026-08-03 9:13 ` sashiko-bot
@ 2026-08-05 7:12 ` Krzysztof Kozlowski
0 siblings, 0 replies; 27+ messages in thread
From: Krzysztof Kozlowski @ 2026-08-05 7:12 UTC (permalink / raw)
To: sashiko-reviews; +Cc: Krzysztof Kozlowski, conor+dt, devicetree, robh
On Mon, Aug 03, 2026 at 09:13:31AM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Medium] False positives in dt-check-style whitespace checks due to unstripped strings and inline comments.
> --
>
> --- Patch [10]: [PATCH v3 10/11] dtc: dt-check-style: Add warning for redundant white-spaces ---
> commit f5a3cbd31bda433ce990bca1b2244f3a3da27d87
> Author: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
>
> dtc: dt-check-style: Add warning for redundant white-spaces
>
> This commit adds a warning in dt-check-style to catch excessive spaces or
> tabs around '=', before '{', and before ';'. The checking is split between
> relaxed and strict modes to accommodate existing in-tree usage.
>
> > diff --git a/scripts/dtc/dt-check-style b/scripts/dtc/dt-check-style
> > index 1430c675bd951..aa2072957a1a0 100755
> > --- a/scripts/dtc/dt-check-style
> > +++ b/scripts/dtc/dt-check-style
> > @@ -348,6 +348,36 @@ def check_trailing_whitespace(ctx):
> > yield (dl.lineno, 'trailing whitespace')
> >
> >
> > +def check_redundant_whitespace(ctx):
> > + """No whitespace between brackets or other code elements.
> > + See also check_value_whitespace() for more checks."""
> > + for dl in ctx.lines:
> > + if dl.linetype in (LineType.COMMENT, LineType.COMMENT_BODY,
> > + LineType.COMMENT_END, LineType.COMMENT_START,
> > + LineType.PREPROCESSOR):
> > + continue
> > + if re.search(r'(\s\s+|\t){', dl.raw):
> > + yield (dl.lineno, 'extra whitespace before {')
> > + if re.search(r':(\s\s+|\t)', dl.raw):
> > + yield (dl.lineno, 'extra whitespace after :')
> > + if re.search(r'\s+;', dl.raw):
>
> [Severity: Medium]
> Does using dl.raw directly here cause false positives for inline comments or
> string literals?
Ack
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 27+ messages in thread
end of thread, other threads:[~2026-08-05 7:12 UTC | newest]
Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-03 9:03 [PATCH v3 00/11] dtc: dt-check-style: Improvements for false positives Krzysztof Kozlowski
2026-08-03 9:03 ` [PATCH v3 01/11] dtc: dt-check-style: Add missing /dts-v1/ to few test cases Krzysztof Kozlowski
2026-08-03 22:30 ` Rob Herring (Arm)
2026-08-03 9:03 ` [PATCH v3 02/11] dtc: dt-check-style: Simplify setting depth of DtsLine Krzysztof Kozlowski
2026-08-03 22:31 ` Rob Herring (Arm)
2026-08-03 9:03 ` [PATCH v3 03/11] dtc: dt-check-style: Handle root node in overlays Krzysztof Kozlowski
2026-08-03 9:18 ` sashiko-bot
2026-08-03 9:03 ` [PATCH v3 04/11] dtc: dt-check-style: Handle sorting of top-level nodes and properties Krzysztof Kozlowski
2026-08-03 9:20 ` sashiko-bot
2026-08-05 7:07 ` Krzysztof Kozlowski
2026-08-03 9:03 ` [PATCH v3 05/11] dtc: dt-check-style: Drop stray backslash before quote for continuation-alignment Krzysztof Kozlowski
2026-08-03 9:09 ` sashiko-bot
2026-08-05 7:09 ` Krzysztof Kozlowski
2026-08-03 9:03 ` [PATCH v3 06/11] dtc: dt-check-style: Fix alignment of values in continued property lines Krzysztof Kozlowski
2026-08-03 9:21 ` sashiko-bot
2026-08-05 7:12 ` Krzysztof Kozlowski
2026-08-03 9:03 ` [PATCH v3 07/11] dtc: dt-check-style: Consistently call 'kind' as 'file_type' Krzysztof Kozlowski
2026-08-03 9:03 ` [PATCH v3 08/11] dtc: dt-check-style: Introduce 'stricter' mode Krzysztof Kozlowski
2026-08-03 9:16 ` sashiko-bot
2026-08-05 7:06 ` Krzysztof Kozlowski
2026-08-03 9:03 ` [PATCH v3 09/11] dtc: dt-check-style: Add test for trailing white-space in DTS Krzysztof Kozlowski
2026-08-03 9:11 ` sashiko-bot
2026-08-05 7:03 ` Krzysztof Kozlowski
2026-08-03 9:03 ` [PATCH v3 10/11] dtc: dt-check-style: Add warning for redundant white-spaces Krzysztof Kozlowski
2026-08-03 9:13 ` sashiko-bot
2026-08-05 7:12 ` Krzysztof Kozlowski
2026-08-03 9:03 ` [PATCH v3 11/11] MAINTAINERS: dt-bindings: Include dt-check-style in DT binding entry Krzysztof Kozlowski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox