[RFC 1/1] Device Tree Schema Source format description

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




/*
 * schema.dtss - Sample Device Tree schema file.
 *
 * Copyright (C) 2013 Samsung Electronics Co., Ltd.
 * Author: Tomasz Figa <t.figa@xxxxxxxxxxx>
 *
 * 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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]
  Powered by Linux