/*
* schema.dtss - Sample Device Tree schema file.
*
* Copyright (C) 2013 Samsung Electronics Co., Ltd.
* Author: Tomasz Figa <[email protected]>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation version 2.
*
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
* kind, whether express or implied; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
/dtss-v1/;
/*
* Basic introduction to dtss syntax.
*
* The syntax is heavily based on DTS syntax, with some extensions based
* on Perl and POSIX extended regular expressions. See description of
* particular constructs to learn where the extensions can be used. An
* exception from DTS syntax is that there is no overridding of nodes
* and properties, defining a node or property with the same name (or
* other key that identifies it) simply creates a new rule to validate
* such node or property.
*
* Special keywords:
*
* /template/
* Defines schema template that can be used to represent generic bindings
* which may be then included in device bindings by /use/ keyword.
* A template can take a set of required or optional parameters.
* Optional parameters need to have default value specified, which is
* used when the parameter is omited from parameters of /use/ clause.
*
* Template declaration uses following syntax:
* /template/ template-name {
* /arg/ argument-name-1; // Required argument
* /arg/ argument-name-2 = <1>; // Optional argument
* // Here follows binding specification described further
* // in this document.
* };
*
* A template argument is dereferenced by its name prefixed with
* a dollar ($) sign. An arbitrary property specified in parsed
* tree can be dereferenced by its absolute or relative path or
* by a lookup up the tree (interrupt-parent like).
*
* /arg/
* Marks following property declaration as a template argument.
* Can be used only inside a template declaration, to declare template
* arguments, as described above in /template/ keyword description.
*
* /use/
* Instantiates binding template. Causes the specified template to be
* included as a part of the binding specified by current node.
*
* Syntax used to instatiate templates:
* /use/ template-name {
* // List of template arguments and their values, e.g.
* argument-name-1 = <int-value>;
* argument-name-2 = "string-value";
* // etc.
* };
*
* /incomplete/
* Tells the validator that the schema is not complete, i.e.
* only specified properties and subnodes should be validated,
* without complaining about ones not specified in the schema.
*
* Example of use:
* {
* compatible = "simple-bus";
* #address-cells = <1>;
* #size-cells = <1>;
*
* *.* { // Zero or more subnodes
* /incomplete/; // of unspecified contents
* };
* };
*
* /inheritable/
* Marks property as inheritable by subnodes of node in which
* it is defined. An example of such property is interrupt-parent,
* which, if not specified in the same node as interrupts property,
* is assumed to be the same as the closest interrupt-parent property
* found when walking up the tree.
*
* This is purely a helper construct to allow referencing to
* a property from inside of a DTSS, even if it is not specified
* in referred node explicitly.
*
* Example of use:
* {
* /inheritable/ interrupt-parent = phandle;
*
* .* {
* // interrupt-parent is defined for this node
* // implicitly, even if not specified explicitly
* };
* };
*
* /default/
* Specifies default value of the property.
*
* This is purely a helper construct to allow referencing a property
* from inside of a DTSS, even if it is not specified in referred
* node explicitly.
*
* Example of use:
* {
* ?#address-cells = cell;
* /default/ #address-cells = <2>;
*
* // If #address-cells is not specified in device tree
* // in this node, then it is assumed to be 2.
* };
*
* Binding description
*
* A binding starts with a top level node that must be described using at
* least one of the key node attributes specified below. The top level node
* can contains a set of properties and subnodes that describe the binding.
* They can be specified using the DTS Schema syntax, which is basically
* the standard DTS syntax modified to convey information about the schema,
* not contents.
*
* Node description
*
* A node starts with a node-name, then { and ends with matching } and
* a semicolon. It can be described by a set of key attributes, which are:
* - compatible property,
* - device_type property,
* - node name (DEPRECATED for top level nodes of bindings).
*
* Once a node matches all specified key attributes of a defined binding
* it is validated according to description of this binding.
*
* Property specification
*
* Each property inside a node is specified just as in a normal DTS file,
* except that the value specified determines value type and range of
* allowed values, not a particular value itself. In addition, property
* name can be prefixed with an optionality quantifier, marking the property
* as optional (specified 0 or 1 times).
*
* Property type can be specified using type specification syntax. It is
* a regular expression like syntax, but including special type keywords,
* that represent all the defined DTS value types, which is:
* 1) string: a string of characters enclosed by quotation marks,
* 2) cell: a single, unsigned 32-bit value,
* 3) phandle: a valid phandle to any device node,
* 4) binary: a sequence of bytes (NOTE: quantifiers work as byte count here).
* Property types can be mixed inside the property, so the value can consist
* of followed multiple blocks of data of different types.
*
* In addition, string and cell types can be limited to specified set
* of allowed values, discrete or contiguous (cell only), by using
* parentheses after type name. Regular expressions are allowed when
* specifying allowed string values.
*
* Inside property specifiers, other properties and template arguments
* can be dereferenced by preceding their names with dollar "$" sign.
* Element count of a property that is an array can be received by
* preceding its name with at "@" sign. The property name following
* $ or @ sign is interpreted as a path in device tree, either absolute
* if started by a slash "/" or relative otherwise.
*
* Example properties built from strings:
*
* string-property-1 = string; // one string
* string-property-2 = string+; // array of strings
* string-property-3 = string{@clock-names}; // same count as in
* // clock-names property
* string-property-4 = string("one", "two", "three"); // three
* // allowed values
* string-property-5 = string("[a-zA-Z]+[0-9]"); // allowed values
* // defined using a regexp
*
* Example properties built from cells:
*
* cell-property-1 = cell; // one cell
* cell-property-2 = (cell{$#cell-property-2-cells})+; // cell count
* // specified by #cell-property-name-cells property
* cell-property-3 = cell(0, 1, 2, 3, 4); // integers from 0 to 4
* cell-property-4 = cell(0..4); // same as above, but using a range
*
* Example proprerties built from phandles:
*
* phandle-property-1 = phandle; // one phandle
*
* Example properties built from binary data:
*
* binary-property-1 = binary+; // one or more bytes of binary data
* binary-property-2 = binary{6}; // 6 bytes of binary data
*
* Example mixed properties:
*
* mixed-property-1 = ((phandle),cell{$\2/#mixed-property-1-cells})+;
* // typical specifier - phandle of controller node and a set of cells
* // defined by #*-cells property of controller node. Note the use
* // of backreferences here.
* // TODO: How to represent references to properties in a node
* // pointed by a phandle?
*
* Quantifiers
*
* Determines valid iteration count for element after the quantifier
* symbol, which can be a property or a child node. <quantifier> can be
* any valid quantifier according to POSIX extended regular expression
* syntax.
*
* Examples of use:
*
* // For properties
* property-name-1; // Required property
* ?property-name-2; // Optional property
*
* // For subnodes
* node-name-1 {}; // Required node (exactly 1 time)
* ?node-name-2 {}; // Optional node (0 or 1 times)
* +node-name-3 {}; // Required node (1 or more times)
* *node-name-4 {}; // Optional nodes (0 or more times)
* {1,3}node-name-5 {}; // From 1 to 3 subnodes must be present
*
* // For data types
* property-name-1 = cell; // One cell
* property-name-2 = string+; // One or more strings
* property-name-3 = phandle{3,8}; // From three to eight phandles
*
* Real-life examples
*
* Following is a set of examples of DTS Schema syntax use, based on existing
* device tree bindings. All examples are commented to explain used mechanisms.
* Note that all the examples are valid and should compile fine using a DTS
* Schema enabled version of the DTC compiler.
*/
/*
* Utility schema templates.
*/
/template/ reg-property {
/*
* This template takes one argument reg-count, which is optional
* and if omitted, takes the default value of 1.
*/
/arg/ reg-count = <1>;
/*
* The example below defines a mandatory "reg" property, consisting
* of exactly reg-count groups, each consisting of (#address-cells +
* #size-cells) cells each.
*/
reg = (cell{$../#address-cells},cell{$../#size-cells}){$reg-count};
};
/template/ status-property {
/*
* Template without arguments.
*
* Defines a single, optional status property that can take one of
* enumerated values.
*/
?status = string("okay", "disabled");
};
/template/ device {
/* Optional argument, defaulting to 1. */
/* TODO: How to specify variable entry count? */
/arg/ reg-count = <1>;
/* Use a template. */
/use/ reg-property {
/*
* Specify value of template argument.
* Note the reference to argument of this template.
*/
reg-count = $reg-count;
};
/* Use another template. This time without arguments specified. */
/use/ status-property;
};
/template/ bus {
#address-cells = cell;
#size-cells = cell;
/default/ #address-cells = <2>;
/default/ #size-cells = <1>;
};
/*
* Generic SPI bindings.
*/
/template/ spi {
/* Mandatory argument, without default value. */
/arg/ cs-cells = cell;
/* #address-cells property equal to cs-cells argument. */
#address-cells = <$cs-cells>;
/* Fixed value of #size-cells property. */
#size-cells = <0>;
/* A single-cell property num-cs. */
num-cs = cell;
/* From 0 to $num-cs subnodes with any name. */
{0,$num-cs}.* {
/* This node must have a reg property, with one entry. */
/use/ reg-property {
reg-count = <1>;
};
/* This binding does not fully define node contents. */
/incomplete/;
};
};
/*
* Generic interrupt bindings.
*/
/template/ interrupts {
/*
* Optional argument, specifying number of entries in interrupts
* property. Defaults to 1.
* TODO: How to specify optional interrupts or interrupt lists
* that vary with compatible string?
*/
/arg/ interrupt-count = <1>;
/* Optional phandle to interrupt controller. */
/inheritable/ ?interrupt-parent = phandle;
/*
* List of interrupts.
* TODO: variable interrupt count?
*/
interrupts =
(cell{$($interrupt-parent)/#interrupt-cells}){$interrupt-count};
};
/*
* Generic clock bindings.
*/
/template/ clocks {
/*
* Required argument specifying number of clocks.
* TODO: Optional clocks?
*/
/arg/ clock-count = cell;
/*
* List of exactly $count clock specifiers.
* TODO: How to dereference phandles of specifiers properly.
*/
clocks = ((phandle),cell{$\2/#clock-cells}){$count};
};
/*
* Generic pinctrl bindings.
*/
/template/ pinctrl {
/*
* List of pinctrl names.
* TODO: Optional pinctrl states?
*/
/arg/ names = string+;
/* Pinctrl names, as specified in $names. */
pinctrl-names = $names;
/*
* Pinctrl groups for every entry of pinctrl-names property.
* TODO: Find a correct way to define a series of properties.
*/
pinctrl-[0-@names] = phandle+;
};
/template/ pinctrl-default {
/* Fixed value of required pinctrl-names property. */
pinctrl-names = "default";
/*
* List of pinctrl groups for default pinctrl state.
* NOTE that an empty list of groups can be specified too.
*/
pinctrl-0 = phandle*;
};
/*
* Generic video interface (V4L2/media) bindings.
*/
/template/ video-port {
port {
/* Bus with 1-cell addresses and no sizes. */
#address-cells = <1>;
#size-cells = <0>;
/* One or more endpoint nodes. */
+endpoint {
/* Single entry reg property. */
/use/ reg-property;
/*
* Required phandle to remote endpoint.
* TODO: Do we need to check things like bidirectional
* connectivity? I.e. whether the node pointed by
* $remote-endpoint points to this node?
*/
remote-endpoint = phandle;
/* Optional property indicating slave mode operation. */
?slave-mode;
/* Optional bus width */
?bus-width = cell;
/* ... */
};
};
};
/template/ video-ports {
/* Bus with 1-cell addresses and no sizes. */
#address-cells = <1>;
#size-cells = <0>;
/* Include video port template. */
/use/ video-port {
/* Override quantifier of port subnodes. */
+port {
/* Single entry reg property. */
/use/ reg-property;
};
};
};
/*
* Skeleton schema for all DTSes according to ePAPR 1.1.
*
* NOTE explicit node location specified.
*/
&{/} {
/* Human readable board model. */
model = string;
/* Set of board compatible values. */
compatible = string+;
/* Optional version of ePAPR spec this device tree complies to. */
?epapr-version = string;
/* Top level bus */
/use/ bus;
/* Required chosen node. */
chosen {
/* Optional bootargs string. */
?bootargs = string;
/* Optional stdout-path string. */
?stdout-path = string;
/* Optional stdin-path string. */
?stdin-path = string;
};
/* Required aliases node. */
aliases {
/*
* Optional list of aliases with arbitrary names, pointing
* to device nodes either by path...
*/
?[a-z0-9_]+ = string; /* TODO: Should we check path validity? */
/* ...or phandle. */
?[a-z0-9_]+ = phandle;
};
/* Required memory node. */
memory {
/* Required single entry reg property. */
/use/ reg-property {
reg-count = /* TODO: how to specify a range here */;
};
/* Required device_type set to "memory". */
device_type = "memory";
/* Optional property containing multiple reg-like entries. */
?initial-mapped-area =
(cell{../#address-cells},cell{../#size-cells})+;
};
/* Required cpus node. */
cpus {
/* A bus with 1-cell address and 0-cell size specifiers. */
#address-cells = <1>;
#size-cells = <0>;
/* A set of CPU nodes. At least one is required. */
+cpu {
/* 1-entry reg property, for CPU MPIDR. */
/use/ reg-property;
/* This node can have status property. */
/use/ status-property;
/* The device_type property must be set to "cpu". */
device_type = "cpu";
/*
* Optional clock-frequency property, specified
* using 1 or 2 cells, depending on the platform.
*/
?clock-frequency = cell{1,2};
/*
* Additional platform-specific properties might be
* present here, which are out of scope of this
* binding.
*/
/incomplete/;
};
};
/* Any optional device nodes. */
*.* {
/* Out of scope of this binding. */
/incomplete/;
};
};
/*
* Davinci SPI controller device bindings
*/
{
/* Binding is defined for any of following compatible values. */
compatible = string("ti,dm64410-spi", "ti,da830-spi");
/* Use generic device bindings. */
/use/ device;
/* Use generic SPI bindings. */
/use/ spi {
/* Chip select is identified using one cell. */
cs-cells = <1>;
};
/* Use generic interrupt bindings. */
/use/ interrupts {
/* This device has one interrupt signal. */
interrupt-count = <1>;
};
/* Use generic clock bindings. */
/use/ clocks {
/*
* This device consumes one clock, without the need to
* specify its name.
*/
count = <1>;
};
/*
* Device-specific property that defines which IP interrupt signal
* is tied to SoC's interrupt controller.
*
* TODO: Is this correct?
*/
ti,davinci-spi-intr-line = cell(<0>, <1>);
};
/*
* Samsung S5P/EXYNOS SoC Camera Subsystem (FIMC)
*/
{
/* Binding is defined for following compatible value. */
compatible = "samsung,fimc";
/* Use generic clock bindings. */
/use/ clocks {
clock-count = <4>;
};
/* Clocks with following names must be specified. */
clock-names = "sclk_cam0", "sclk_cam1", "pxl_async0", "pxl_async1";
/* Use generic pinctrl bindings. */
/use/ pinctrl {
/*
* At least "default" state must be specified. Remaining
* three states are optional.
* TODO: Revise handling of optional states.
*/
names = "default", ("idle", "active-a", "active-b")?;
};
/* This node can have a status property. */
/use/ status-property;
/* This node represents a bus with 1-cell addresses and sizes. */
#address-cells = <1>;
#size-cells = <1>;
/* Optional node representing parallel camera ports. */
?parallel-ports {
/*
* This node represents a bus with 1-cell addresses and
* no sizes.
*/
#address-cells = <1>;
#size-cells = <0>;
/* Use generic video port bindings. */
/use/ video-port;
};
/* At least one fimc node is required */
+fimc {
/* Compatible should be set to one of following values. */
compatible = string("samsung,s5pv210-fimc",
"samsung,exynos4210-fimc",
"samsung,exynos4212-fimc");
/* This is a device. */
/use/ device;
/* This device has a single interrupt signal. */
/use/ interrupts;
/* Clocks are used. */
/use/ clocks {
clock-count = <2>;
};
/* With following clock names. */
clock-names = "fimc", "sclk_fimc";
/*
* Here follows an example set of properties described
* as in existing binding documentation files.
*
* NOTE: Each property is followed by its description.
*/
/* Required properties: */
samsung,pix-limits = cell{4};
/*
* an array of maximum supported image sizes in pixels, for
* details refer to Table 2-1 in the S5PV210 SoC User Manual;
The meaning of
* each cell is as follows:
* 0 - scaler input horizontal size,
* 1 - input horizontal size for the scaler bypassed,
* 2 - REAL_WIDTH without input rotation,
* 3 - REAL_HEIGHT with input rotation.
*/
samsung,sysreg = phandle;
/* A phandle to the SYSREG node. */
/* Optional properties: */
?clock-frequency = cell;
/* maximum FIMC local clock (LCLK) frequency */
?samsung,min-pix-sizes = cell{2};
/*
* An array specifying minimum image size in pixels at
* the FIMC input and output DMA, in the first and second cell
* respectively. Default value when this property is not
* present is <16 16>
*/
?samsung,min-pix-alignment = cell{2};
/*
* minimum supported image height alignment (first cell)
* and the horizontal image offset (second cell). The values
* are in pixels and default to <2 1> when this property is
* not present
*/
?samsung,mainscaler-ext;
/*
* A boolean property indicating whether the FIMC IP
* supports extended image size and has CIEXTEN register.
*/
?samsung,rotators = cell;
/*
* A bitmask specifying whether this IP has the input and
* the output rotator. Bits 4 and 0 correspond to input and
* output rotator respectively. If a rotator is present its
* corresponding bit should be set. Default value when this
* property is not specified is 0x11.
*/
?samsung,cam-if;
/*
* A bolean property indicating whether the IP block includes
* the camera input interface.
*/
?samsung,isp-wb;
/*
* This property must be present if the IP block has the ISP
* writeback input.
*/
?samsung,lcd-wb;
/*
* This property must be present if the IP block has the LCD
* writeback input.
*/
};
/*
* One or more optional csis node.
* Contents unspecified by this binding.
*/
*csis {
/incomplete/;
};
/*
* One or more optional fimc-lite node.
* Contents unspecified by this binding.
*/
*fimc-lite {
/incomplete/;
};
};
/*
* PCI device binding template (used by PCI bus binding)
*/
/template/ pci-device {
/* Compatible string matching any of listed regular expressions. */
compatible = string("pciclass,([0-9a-f]{4})([0-9a-f]{2})?",
"pci([1-9a-f][0-9a-f]{0,3}|0),([1-9a-f][0-9a-f]{0,3}|0)\.([1-9a-f][0-9a-f]{0,3})\.([1-9a-f][0-9a-f]{0,3}|0)\.([1-9a-f][0-9a-f]?|0)",
"pci([1-9a-f][0-9a-f]{0,3}|0),([1-9a-f][0-9a-f]{0,3}|0)\.([1-9a-f][0-9a-f]{0,3})\.([1-9a-f][0-9a-f]{0,3}|0)",
"pci([1-9a-f][0-9a-f]{0,3}),([1-9a-f][0-9a-f]{0,3}|0)",
"pci([1-9a-f][0-9a-f]{0,3}|0),([1-9a-f][0-9a-f]{0,3}|0)\.([1-9a-f][0-9a-f]?|0)",
"pci([1-9a-f][0-9a-f]{0,3}|0),([1-9a-f][0-9a-f]{0,3}|0)",
"pciclass,([0-9a-f]{4})([0-9a-f]{2})?");
/* Device name string. */
name = string;
/*
* A set of 5-cell reg entries defined accordign to PCI binding
* specification.
*/
reg = (cell{5})+;
/* Optional interrupt specifier. */
/use/ ?interrupts = {
interrupt-count = <1>;
};
/* Optional alternate reg property. */
?alternate-reg = (cell{5})+;
/* Optional single cell property. */
?fcode-rom-offset = cell;
/* Optional list of up to 6 Assigned addresses. */
?assigned-addresses = (cell{5}){0,6};
/* Optional list of power consumption values - from 1 to 10 cells. */
?power-consumption = cell{1,10};
/*
* Simple single cell properties defined in PCI binding
* specification.
*/
vendor-id = cell;
device-id = cell;
revision-id = cell;
class-code = cell;
min-grant = cell;
max-latency = cell;
devsel-speed = cell;
?cache-line-size = cell;
?fast-back-to-back;
?subsystem-id = cell;
?subsystem-vendor-id = cell;
/* Boolean properties. */
?66mhz-capable;
?udf-supported;
/* Extra per-device attributes are allowed. */
/incomplete/;
};
/*
* PCI bus binding template
*/
/template/ pci-bus {
/* PCI bus node must have device_type set to "pci". */
device_type = "pci";
/* Standard bus attributes. */
#address-cells = <3>;
#size-cells = <2>;
ranges;
/* A set of optional properties. */
?bus-range = cell{2};
?clock-frequency = cell;
?slot-names = cell, string+;
?bus-master-capable = cell;
/* PCI devices */
* {
/use/ pci-device;
};
};
/*
* NVIDIA Tegra PCIe controller
*/
{
/* Binding is identified by following compatible list. */
compatible = string("nvidia,tegra20-pcie", "nvidia,tegra30-pcie");
/* It is a PCI bus. */
/use/ pci-bus;
/* Needs 3 reg entries. */
/use/ reg-property {
reg-count = <3>;
};
/* Names of reg entries must be specified as follows. */
reg-names = "pads", "afi", "cs";
/* Neds 2 interrupts. */
/use/ interrupts {
interrupt-count = <2>;
};
/* With names as specified below. */
interrupt-names = "intr", "msi";
/* Needs 5 clocks. */
/use/ clocks {
clock-count = <5>;
};
/* With following input names. */
clock-names = "pex", "afi", "pcie_xclk", "pll_e", "cml";
/* Needs pex-clk regulator. */
/use/ regulator {
supply-name = "pex-clk";
};
/* Needs vdd regulator. */
/use/ regulator {
supply-name = "vdd";
};
/* Needs avdd regulator. */
/use/ regulator {
supply-name = "avdd";
};
/* Root port nodes. */
*pci {
/use/ pci-bus;
nvidia,num-lanes = cell;
};
};
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html