From: Rob Herring <robh@kernel.org>
To: Daniel Golle <daniel@makrotopia.org>
Cc: "Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Nathan Chancellor" <nathan@kernel.org>,
"Nicolas Schier" <nsc@kernel.org>,
"Saravana Kannan" <saravanak@kernel.org>,
"Ping-Ke Shih" <pkshih@realtek.com>,
"Andy Shevchenko" <andriy.shevchenko@linux.intel.com>,
"David Sterba" <dsterba@suse.com>,
"Bryan O'Donoghue" <bryan.odonoghue@linaro.org>,
"Hariharan Basuthkar" <quic_hbasuthk@quicinc.com>,
"Jeff Hugo" <jeff.hugo@oss.qualcomm.com>,
"Filipe Manana" <fdmanana@suse.com>,
"Bitterblue Smith" <rtl8821cerfe2@gmail.com>,
"Wei Yang" <richard.weiyang@gmail.com>,
"Takashi Iwai" <tiwai@suse.de>,
"Aurabindo Pillai" <aurabindo.pillai@amd.com>,
"Chih-Kang Chang" <gary.chang@realtek.com>,
"David Lechner" <dlechner@baylibre.com>,
"Miguel Ojeda" <ojeda@kernel.org>, "Gary Guo" <gary@garyguo.net>,
"Tamir Duberstein" <tamird@kernel.org>,
"Thomas Weißschuh" <linux@weissschuh.net>,
"Pagadala Yesu Anjaneyulu" <pagadala.yesu.anjaneyulu@intel.com>,
"Bartosz Golaszewski" <brgl@kernel.org>,
"Jorge Ramirez-Ortiz" <jorge.ramirez@oss.qualcomm.com>,
"Masahiro Yamada" <masahiroy@kernel.org>,
"Guenter Roeck" <linux@roeck-us.net>,
"Aleksander Jan Bajkowski" <olek2@wp.pl>,
"Boris Burkov" <boris@bur.io>,
"Blake Jones" <blakejones@google.com>,
"Jonathan Corbet" <corbet@lwn.net>,
"Mauro Carvalho Chehab" <mchehab+huawei@kernel.org>,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-kbuild@vger.kernel.org
Subject: Re: [PATCH v5 0/4] dt-bindings: automated coding style check for DTS examples
Date: Wed, 10 Jun 2026 13:38:08 -0500 [thread overview]
Message-ID: <20260610183808.GA610395-robh@kernel.org> (raw)
In-Reply-To: <cover.1779908995.git.daniel@makrotopia.org>
On Wed, May 27, 2026 at 08:31:59PM +0100, Daniel Golle wrote:
> Documentation/devicetree/bindings/dts-coding-style.rst documents
> the style expected of DT examples and source files, but nothing
> existing actually enforces it. dtc tolerates arbitrary whitespace,
> yamllint only sees the YAML envelope and not the DTS content
> inside literal block scalars, and so reviewers spend cycles
> flagging issues that tooling could catch.
>
> Add scripts/dtc/dt-check-style, a Python tool that checks DTS
> coding style on YAML binding examples and on .dts/.dtsi/.dtso
> source files. Rules live in a small declarative registry; each
> rule is tagged 'relaxed' (default) or 'strict' (opt-in for new
> submissions). Promoting a rule from strict to relaxed is a
> one-line edit once the tree catches up.
>
> Relaxed mode covers trailing whitespace, tab characters in YAML
> examples, mixed tab+space indents, unclosed /* block comments,
> and the per-input-type indent character (1 tab for
> .dts/.dtsi/.dtso). It is zero-violation on the current tree and
> runs as part of dt_binding_check_one, so no new warnings appear
> in `make dt_binding_check`.
>
> Strict mode adds indent unit and depth consistency; blank-line
> policy (no consecutive blanks or blanks at body edges; required
> blank line before each child node and before "status"); property
> ordering by canonical bucket (compatible, reg/reg-names, ranges,
> standard, vendor, status) with declarative within-bucket pairing
> rules (<x>-names follows <x>, pinctrl-names follows the last
> pinctrl-N) and natural-sort fallback; sibling node ordering by
> unit address or natural-sort name; line length (80 columns);
> continuation alignment of multi-line property values under the
> first '<' or '"' after the '='; lowercase hex literals and unit
> addresses; no whitespace padding inside <...>; closing-brace
> placement; and unused-label detection (skipped for .dtsi/.dtso
> since labels there are exported to includers/applies-to).
> Together these constrain a DT structure to a single canonical
> rendering modulo the author's choice of when to wrap properties
> for readability. Comments are intentionally out of scope. Strict
> mode is opt-in, intended for use by checkpatch.pl in a follow-up
> series.
>
> The tool reads file paths from @argfile and parallelises across
> CPUs via -j N. With no -j given it picks up $PARALLELISM (set by
> scripts/jobserver-exec from the GNU make jobserver) and falls
> back to os.cpu_count() otherwise. Running as one Python
> invocation amortises the ruamel.yaml import across the whole
> tree -- ~2s on a 32-CPU host vs ~28s sequential. ruamel.yaml is
> the only non-stdlib dependency, already required by dtschema.
>
> A selftest under scripts/dtc/dt-style-selftest/ pairs good/ and
> bad/ fixtures with expected output so rule behaviour can be
> exercised independently of the full tree via the
> dt_style_selftest top-level make target.
> ---
> v1: https://lore.kernel.org/all/cover.1776700167.git.daniel@makrotopia.org/
> v2: https://lore.kernel.org/all/cover.1777471439.git.daniel@makrotopia.org/
> v3: https://lore.kernel.org/all/cover.1778454442.git.daniel@makrotopia.org/
> v4: https://lore.kernel.org/all/cover.1779472837.git.daniel@makrotopia.org/
>
> Changes since v4:
> - dt-check-style: parser robustness fixes from a sashiko.dev
> AI review (multi-line CPP macros, "/* ... */ code" on one
> line, "}; };" depth tracking, malformed unit addresses,
> labels inside strings and on digit-leading node names,
> unclosed /* on PROPERTY lines)
> - dt-check-style: new relaxed-mode rule unclosed-block-comment
> - new patch: scripts/jobserver-exec propagates child exit
> status (prereq so chk_style errors stay reported)
> - selftest: add fixtures covering the parser fixes
> - selftest: move SPDX header to "// SPDX-..." on line 1 in
> the three .dts fixtures (checkpatch)
>
> Changes since v3:
> - dt-check-style: accept node and property names that begin
> with a digit (the DT spec permits names like 1wire@10)
> - dt-check-style: strip trailing // and /* */ comments before
> line classification, so a trailing comment on a node-open or
> property line no longer causes misclassification
> - dt-check-style: continuation-alignment compares display
> columns (tabs expanded to 8) instead of raw string length,
> removing many false positives on tab-indented .dts files
> - dt-check-style: value-whitespace flags only whitespace directly
> inside the brackets (after '<', before '>'), on single- and
> multi-line cell lists; it no longer flags inter-value spacing,
> which is often deliberate column alignment
> - Makefile: build the @argfile with mktemp and remove it, so no
> stale .tmp_.dt-style.checked is left in the build tree
> - run.sh: drop bash-only process substitution (POSIX sh now)
> and check the checker's exit status
> - selftest: add fixtures for the above (digit-leading nodes,
> trailing comments, multi-line cell arrays, tab+space aligned
> continuations) and update yaml-value-ws for the reworked
> value-whitespace rule
>
> Changes since v2:
> - route findings to stderr so a quiet dt_binding_check produces
> no output (Rob)
> - switch the Makefile recipe from mktemp to Kbuild's
> $(tmp-target) so build output stays inside the build folder
> (Nathan)
> - collapse the recipe's exit-handling tail into the familiar
> "&& touch $@ || true" pattern, matching cmd_chk_bindings;
> keeps future warnings non-fatal (Rob, Nathan)
> - explain in patch 3/4 why the recipe uses an explicit
> $(PYTHON3) prefix where the neighbouring recipes call their
> scripts directly (Rob)
> - append a trailing newline to every expected/*.txt selftest
> fixture (Rob)
> - restore the trailing whitespace inside yaml-trailing-ws.yaml
> that had been silently stripped during re-application, so the
> selftest actually exercises the trailing-whitespace rule
>
> Changes since v1:
> - rules declared in a registry tagged relaxed/strict; default
> relaxed mode is zero-violation on the current tree
> - tool now also accepts .dts/.dtsi/.dtso files directly (with a
> tab-indent variant); unused-labels skipped for .dtsi/.dtso
> where labels are exported to includers/applies-to
> - renamed dt-check-example-style -> dt-check-style
> - added -j N with $PARALLELISM (jobserver) awareness
> - dropped node-name [a-z0-9-] check (Rob: better as a meta-schema)
> - property-order rebuilt around buckets + declarative pairing
> rules plus natural-sort fallback
> - added child-name-order, required-blank-lines, hex-case,
> unit-address-format, value-whitespace, node-close-alone,
> line-length and continuation-alignment to strict mode
> - new selftest patch (Krzysztof: "would be happy to see at
> least a few test cases for it")
>
> Default relaxed mode is zero-violation on the current tree.
>
> Strict-mode violation counts on a current tree (5506 YAML
> bindings, 6530 in-tree .dts/.dtsi/.dtso under arch/):
>
> rule yaml dts
> property-order 14554 245000
> continuation-alignment 1857 93536
> indent-consistent 1562 48720
> required-blank-lines 1876 48563
> line-length 105 26322
> child-name-order 667 16821
> mixed-indent-chars 0 13294
> unused-labels 3611 11628
> child-address-order 63 4076
> blank-lines 82 1866
> node-close-alone 38 774
> value-whitespace 38 715
> hex-case 78 669
> indent-unit-dts -- 190
> unit-address-format 5 39
> trailing-whitespace 0 10
> indent-unit-strict 1492 --
> indent-unit 179 --
>
> (YAML and DTS columns reflect the rules that apply to each input
> type; e.g. indent-unit-strict is YAML-only since .dts files use
> tabs, indent-unit-dts is the equivalent DTS-only check.
> unused-labels is skipped for .dtsi/.dtso since labels there are
> exported to includers/applies-to.)
>
> The script was written with generous help from Claude Opus 4.7,
> since my Python is even worse than my DTS coding style.
>
> Daniel Golle (4):
> dt-bindings: add DTS style checker
> scripts/jobserver-exec: propagate child exit status
> dt-bindings: wire style checker into dt_binding_check
> dt-bindings: add self-test fixtures for style checker
>
> Documentation/devicetree/bindings/Makefile | 19 +-
> Makefile | 6 +
> scripts/dtc/dt-check-style | 1192 +++++++++++++++++
> .../dtc/dt-style-selftest/bad/dts-spaces.dts | 12 +
> .../bad/yaml-child-addr-order.yaml | 41 +
> .../bad/yaml-child-name-order.yaml | 37 +
> .../bad/yaml-cont-align.yaml | 30 +
> .../bad/yaml-digit-node-order.yaml | 37 +
> .../dt-style-selftest/bad/yaml-hex-case.yaml | 29 +
> .../bad/yaml-indent-strict.yaml | 29 +
> .../bad/yaml-label-in-string.yaml | 30 +
> .../bad/yaml-line-length.yaml | 29 +
> .../bad/yaml-mixed-indent.yaml | 29 +
> .../bad/yaml-multi-close.yaml | 35 +
> .../bad/yaml-node-close.yaml | 31 +
> .../bad/yaml-prop-order.yaml | 29 +
> .../bad/yaml-prop-pairing.yaml | 33 +
> .../bad/yaml-required-blank.yaml | 33 +
> .../dtc/dt-style-selftest/bad/yaml-tab.yaml | 29 +
> .../bad/yaml-trailing-comment.yaml | 26 +
> .../bad/yaml-trailing-ws.yaml | 29 +
> .../bad/yaml-unclosed-comment.yaml | 30 +
> .../bad/yaml-unit-addr-prefix.yaml | 29 +
> .../dt-style-selftest/bad/yaml-unit-addr.yaml | 29 +
> .../bad/yaml-unused-label.yaml | 29 +
> .../bad/yaml-value-ws-multiline.yaml | 27 +
> .../dt-style-selftest/bad/yaml-value-ws.yaml | 29 +
> .../expected/dts-spaces.dts.txt | 2 +
> .../expected/yaml-child-addr-order.yaml.txt | 2 +
> .../expected/yaml-child-name-order.yaml.txt | 2 +
> .../expected/yaml-cont-align.yaml.txt | 2 +
> .../expected/yaml-digit-node-order.yaml.txt | 2 +
> .../expected/yaml-hex-case.yaml.txt | 2 +
> .../expected/yaml-indent-strict.yaml.txt | 2 +
> .../expected/yaml-label-in-string.yaml.txt | 2 +
> .../expected/yaml-line-length.yaml.txt | 2 +
> .../expected/yaml-mixed-indent.yaml.txt | 3 +
> .../expected/yaml-multi-close.yaml.txt | 3 +
> .../expected/yaml-node-close.yaml.txt | 2 +
> .../expected/yaml-prop-order.yaml.txt | 2 +
> .../expected/yaml-prop-pairing.yaml.txt | 3 +
> .../expected/yaml-required-blank.yaml.txt | 3 +
> .../expected/yaml-tab.yaml.txt | 2 +
> .../expected/yaml-trailing-comment.yaml.txt | 2 +
> .../expected/yaml-trailing-ws.yaml.txt | 2 +
> .../expected/yaml-unclosed-comment.yaml.txt | 2 +
> .../expected/yaml-unit-addr-prefix.yaml.txt | 2 +
> .../expected/yaml-unit-addr.yaml.txt | 2 +
> .../expected/yaml-unused-label.yaml.txt | 2 +
> .../expected/yaml-value-ws-multiline.yaml.txt | 2 +
> .../expected/yaml-value-ws.yaml.txt | 2 +
> .../dt-style-selftest/good/dts-cont-align.dts | 26 +
> .../dtc/dt-style-selftest/good/dts-tab.dts | 29 +
> .../dt-style-selftest/good/yaml-4space.yaml | 41 +
> .../good/yaml-tricky-parsing.yaml | 57 +
> scripts/dtc/dt-style-selftest/run.sh | 71 +
> scripts/jobserver-exec | 4 +-
> 57 files changed, 2214 insertions(+), 4 deletions(-)
> create mode 100755 scripts/dtc/dt-check-style
> create mode 100644 scripts/dtc/dt-style-selftest/bad/dts-spaces.dts
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-child-addr-order.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-child-name-order.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-cont-align.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-digit-node-order.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-hex-case.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-indent-strict.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-label-in-string.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-line-length.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-mixed-indent.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-multi-close.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-node-close.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-prop-order.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-prop-pairing.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-required-blank.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-tab.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-trailing-comment.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-trailing-ws.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-unclosed-comment.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-unit-addr-prefix.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-unit-addr.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-unused-label.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-value-ws-multiline.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-value-ws.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/expected/dts-spaces.dts.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-child-addr-order.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-child-name-order.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-cont-align.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-digit-node-order.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-hex-case.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-indent-strict.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-label-in-string.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-line-length.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-mixed-indent.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-multi-close.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-node-close.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-prop-order.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-prop-pairing.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-required-blank.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-tab.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-trailing-comment.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-trailing-ws.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-unclosed-comment.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-unit-addr-prefix.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-unit-addr.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-unused-label.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-value-ws-multiline.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-value-ws.yaml.txt
> create mode 100644 scripts/dtc/dt-style-selftest/good/dts-cont-align.dts
> create mode 100644 scripts/dtc/dt-style-selftest/good/dts-tab.dts
> create mode 100644 scripts/dtc/dt-style-selftest/good/yaml-4space.yaml
> create mode 100644 scripts/dtc/dt-style-selftest/good/yaml-tricky-parsing.yaml
> create mode 100755 scripts/dtc/dt-style-selftest/run.sh
Applied, thanks!
Rob
prev parent reply other threads:[~2026-06-10 18:38 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-27 19:31 [PATCH v5 0/4] dt-bindings: automated coding style check for DTS examples Daniel Golle
2026-05-27 19:32 ` [PATCH v5 1/4] dt-bindings: add DTS style checker Daniel Golle
2026-05-27 19:46 ` sashiko-bot
2026-06-09 16:19 ` Krzysztof Kozlowski
2026-05-27 19:32 ` [PATCH v5 2/4] scripts/jobserver-exec: propagate child exit status Daniel Golle
2026-06-09 17:08 ` Krzysztof Kozlowski
2026-05-27 19:32 ` [PATCH v5 3/4] dt-bindings: wire style checker into dt_binding_check Daniel Golle
2026-05-27 20:28 ` sashiko-bot
2026-06-10 18:38 ` Rob Herring [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260610183808.GA610395-robh@kernel.org \
--to=robh@kernel.org \
--cc=andriy.shevchenko@linux.intel.com \
--cc=aurabindo.pillai@amd.com \
--cc=blakejones@google.com \
--cc=boris@bur.io \
--cc=brgl@kernel.org \
--cc=bryan.odonoghue@linaro.org \
--cc=conor+dt@kernel.org \
--cc=corbet@lwn.net \
--cc=daniel@makrotopia.org \
--cc=devicetree@vger.kernel.org \
--cc=dlechner@baylibre.com \
--cc=dsterba@suse.com \
--cc=fdmanana@suse.com \
--cc=gary.chang@realtek.com \
--cc=gary@garyguo.net \
--cc=jeff.hugo@oss.qualcomm.com \
--cc=jorge.ramirez@oss.qualcomm.com \
--cc=krzk+dt@kernel.org \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=linux@weissschuh.net \
--cc=masahiroy@kernel.org \
--cc=mchehab+huawei@kernel.org \
--cc=nathan@kernel.org \
--cc=nsc@kernel.org \
--cc=ojeda@kernel.org \
--cc=olek2@wp.pl \
--cc=pagadala.yesu.anjaneyulu@intel.com \
--cc=pkshih@realtek.com \
--cc=quic_hbasuthk@quicinc.com \
--cc=richard.weiyang@gmail.com \
--cc=rtl8821cerfe2@gmail.com \
--cc=saravanak@kernel.org \
--cc=tamird@kernel.org \
--cc=tiwai@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox