* SPMI The SPMI Device Tree support interprets up to three levels of Device Tree topology. The first level is required and specifies only a slave address. The second level is optional and allows for the specification of different device nodes within the same 16-bit address space underneath a particular SPMI slave ID. Within the second level, any number of address ranges can be associated with a particular device within that 16-bit range. An additional flag allows for the possiblity to specify that all device nodes should have their resources dedicated to only one spmi_device. This flag can be specified at the second level, or an optional third level. By default without this flag, one spmi_device is created for each device_node. [Root Node] Recommended properties : - interrupt-controller : Used to specify the root node as the interrupt controller for SPMI devices. - #interrupt-cells : The number of cells used to express one interrupt. Notes : - It is considered an error to include either spmi-container-dev or spmi-slave-dev in the Root Node. [First Level Nodes] Required properites : - reg: SPMI Slave ID (0-15) with no size cell. - compatible : "qcom," prefixed string to match against the driver. Recommended properties : - interrupts : where a is the slave ID, b is the peripheral ID, c is the device interrupt number (0-7). Each device supports any arbitrary number of interrupts. - interrupt-parent : the phandle for the interrupt controller that services interrupts for this device. - reg-names : a list of strings that map in order to the list of addresses specified above in the 'reg' property. - interrupt-names : a list of strings that map in order to the list of interrupts specified in the 'interrupts' property. [Second Level Nodes] Required properties : - spmi-slave-container: Used by the parser to understand that this is the second level of the tree that includes device nodes associated with the same slave_id. - reg: where a is < 65536 and b is a size. Each device supports an arbitrary number of address ranges. - compatible : "qcom," prefixed string to match against the driver. Recommended properties : - interrupts : where a is the slave ID, b is the peripheral ID, c is the device interrupt number (0-7). Each device supports any arbitrary number of interrupts. - interrupt-parent : the phandle for the interrupt controller that services interrupts for this device. Optional properties : - spmi-dev-container: This specifies that all the device nodes specified for this slave_id should have their resources coalesced into only one spmi_device. - reg-names : a list of strings that map in order to the list of addresses specified above in the 'reg' property. - interrupt-names : a list of strings that map in order to the list of interrupts specified in the 'interrupts' property. [Third Level Nodes] Required properties : - spmi-dev-container: This specifies that all the device nodes specified for this slave_id should have their resources coalesced into only one spmi_device. - reg: where a is < 65536 and b is a size. Each device supports an arbitrary number of address ranges. - compatible : "qcom," prefixed string to match against the driver. Recommended properties : - interrupts : where a is the slave ID, b is the peripheral ID, c is the device interrupt number (0-7). Each device supports any arbitrary number of interrupts. - interrupt-parent : the phandle for the interrupt controller that services interrupts for this device. - reg-names : a list of strings that map in order to the list of addresses specified above in the 'reg' property. - interrupt-names : a list of strings that map in order to the list of interrupts specified in the 'interrupts' property. - label: A single name that names the device. This name can be looked up with spmi_get_node_byname(). This is mostly useful in spmi-dev-container configurations where multiple device_nodes are associated with one spmi device. Notes : - It is considered an error to include spmi-slave-dev at this level. [Example] / { qpnp: qcom,spmi@fc4c0000 { #address-cells = <1>; #size-cells = <0>; interrupt-controller; #interrupt-cells = <3>; testint@f { interrupt-parent = <&qpnp>; compatible = "qcom,qpnp-testint"; reg = <0xf>; interrupts = <0x3 0x15 0x0 0x3 0x15 0x02 0x1 0x47 0x0>; interrupt-names = "testint_0", "testint_1", "testint_err"; }; pm8941@0 { spmi-slave-container; reg = <0x0>; #address-cells = <1>; #size-cells = <1>; pm8941_gpios: gpios { spmi-dev-container; compatible = "qcom,qpnp-pin"; gpio-controller; #gpio-cells = <1>; #address-cells = <1>; #size-cells = <1>; pm8941_gpio1@0xc000 { compatible = "qcom,qpnp-pin"; reg = <0xc000 0x100>; qcom,qpnp_gpio = <1>; interrupt-parent = <&qpnp>; interrupts = <0x3 0x15 0x02 0x1 0x47 0x0>; label = "foo-dev"; }; pm8941_gpio2@0xc100 { compatible = "qcom,qpnp-pin"; reg = <0xc100 0x100>; qcom,qpnp_gpio = <2>; interrupt-parent = <&qpnp>; interrupts = <0x3 0x15 0x0>; }; }; testgpio@0x1000 { compatible = "qcom,qpnp-testgpio"; reg = <0x1000 0x1000 0x2000 0x1000>; reg-names = "foo", "bar"; qpnp-gpios = <&pm8941_gpios 0x0>; }; }; pm8841@2 { spmi-slave-container; reg = <0x2>; #address-cells = <1>; #size-cells = <1>; spmi-dev-container; compatible = "qcom,qpnp-pin"; pm8841_gpio1@0xc000 { reg = <0xc000 0x100>; qcom,qpnp_gpio = <1>; }; pm8841_gpio2@0xc100 { reg = <0xc100 0x100>; qcom,qpnp_gpio = <2>; }; }; }; };