| * Mediatek/Ralink RT3883 PCI controller | 
 |  | 
 | 1) Main node | 
 |  | 
 |    Required properties: | 
 |  | 
 |    - compatible: must be "ralink,rt3883-pci" | 
 |  | 
 |    - reg: specifies the physical base address of the controller and | 
 |      the length of the memory mapped region. | 
 |  | 
 |    - #address-cells: specifies the number of cells needed to encode an | 
 |      address. The value must be 1. | 
 |  | 
 |    - #size-cells: specifies the number of cells used to represent the size | 
 |      of an address. The value must be 1. | 
 |  | 
 |    - ranges: specifies the translation between child address space and parent | 
 |      address space | 
 |  | 
 |   Optional properties: | 
 |  | 
 |    - status: indicates the operational status of the device. | 
 |      Value must be either "disabled" or "okay". | 
 |  | 
 | 2) Child nodes | 
 |  | 
 |    The main node must have two child nodes which describes the built-in | 
 |    interrupt controller and the PCI host bridge. | 
 |  | 
 |    a) Interrupt controller: | 
 |  | 
 |    Required properties: | 
 |  | 
 |    - interrupt-controller: identifies the node as an interrupt controller | 
 |  | 
 |    - #address-cells: specifies the number of cells needed to encode an | 
 |      address. The value must be 0. As such, 'interrupt-map' nodes do not | 
 |      have to specify a parent unit address. | 
 |  | 
 |    - #interrupt-cells: specifies the number of cells needed to encode an | 
 |      interrupt source. The value must be 1. | 
 |  | 
 |    - interrupt-parent: the phandle for the interrupt controller that | 
 |      services interrupts for this device. | 
 |  | 
 |    - interrupts: specifies the interrupt source of the parent interrupt | 
 |      controller. The format of the interrupt specifier depends on the | 
 |      parent interrupt controller. | 
 |  | 
 |    b) PCI host bridge: | 
 |  | 
 |    Required properties: | 
 |  | 
 |    - #address-cells: specifies the number of cells needed to encode an | 
 |      address. The value must be 0. | 
 |  | 
 |    - #size-cells: specifies the number of cells used to represent the size | 
 |      of an address. The value must be 2. | 
 |  | 
 |    - #interrupt-cells: specifies the number of cells needed to encode an | 
 |      interrupt source. The value must be 1. | 
 |  | 
 |    - device_type: must be "pci" | 
 |  | 
 |    - bus-range: PCI bus numbers covered | 
 |  | 
 |    - ranges: specifies the ranges for the PCI memory and I/O regions | 
 |  | 
 |    - interrupt-map-mask, | 
 |    - interrupt-map: standard PCI properties to define the mapping of the | 
 |      PCI interface to interrupt numbers. | 
 |  | 
 |    The PCI host bridge node migh have additional sub-nodes representing | 
 |    the onboard PCI devices/PCI slots. Each such sub-node must have the | 
 |    following mandatory properties: | 
 |  | 
 |      - reg: used only for interrupt mapping, so only the first four bytes | 
 |        are used to refer to the correct bus number and device number. | 
 |  | 
 |      - device_type: must be "pci" | 
 |  | 
 |    If a given sub-node represents a PCI bridge it must have following | 
 |    mandatory properties as well: | 
 |  | 
 |      - #address-cells: must be set to <3> | 
 |  | 
 |      - #size-cells: must set to <2> | 
 |  | 
 |      - #interrupt-cells: must be set to <1> | 
 |  | 
 |      - interrupt-map-mask, | 
 |      - interrupt-map: standard PCI properties to define the mapping of the | 
 |        PCI interface to interrupt numbers. | 
 |  | 
 |    Besides the required properties the sub-nodes may have these optional | 
 |    properties: | 
 |  | 
 |      - status: indicates the operational status of the sub-node. | 
 |        Value must be either "disabled" or "okay". | 
 |  | 
 | 3) Example: | 
 |  | 
 |    a) SoC specific dtsi file: | 
 |  | 
 | 	pci@10140000 { | 
 | 		compatible = "ralink,rt3883-pci"; | 
 | 		reg = <0x10140000 0x20000>; | 
 | 		#address-cells = <1>; | 
 | 		#size-cells = <1>; | 
 | 		ranges; /* direct mapping */ | 
 |  | 
 | 		status = "disabled"; | 
 |  | 
 | 		pciintc: interrupt-controller { | 
 | 			interrupt-controller; | 
 | 			#address-cells = <0>; | 
 | 			#interrupt-cells = <1>; | 
 |  | 
 | 			interrupt-parent = <&cpuintc>; | 
 | 			interrupts = <4>; | 
 | 		}; | 
 |  | 
 | 		host-bridge { | 
 | 			#address-cells = <3>; | 
 | 			#size-cells = <2>; | 
 | 			#interrupt-cells = <1>; | 
 |  | 
 | 			device_type = "pci"; | 
 |  | 
 | 			bus-range = <0 255>; | 
 | 			ranges = < | 
 | 				0x02000000 0 0x00000000 0x20000000 0 0x10000000 /* pci memory */ | 
 | 				0x01000000 0 0x00000000 0x10160000 0 0x00010000 /* io space */ | 
 | 			>; | 
 |  | 
 | 			interrupt-map-mask = <0xf800 0 0 7>; | 
 | 			interrupt-map = < | 
 | 				/* IDSEL 17 */ | 
 | 				0x8800 0 0 1 &pciintc 18 | 
 | 				0x8800 0 0 2 &pciintc 18 | 
 | 				0x8800 0 0 3 &pciintc 18 | 
 | 				0x8800 0 0 4 &pciintc 18 | 
 | 				/* IDSEL 18 */ | 
 | 				0x9000 0 0 1 &pciintc 19 | 
 | 				0x9000 0 0 2 &pciintc 19 | 
 | 				0x9000 0 0 3 &pciintc 19 | 
 | 				0x9000 0 0 4 &pciintc 19 | 
 | 			>; | 
 |  | 
 | 			pci-bridge@1 { | 
 | 				reg = <0x0800 0 0 0 0>; | 
 | 				device_type = "pci"; | 
 | 				#interrupt-cells = <1>; | 
 | 				#address-cells = <3>; | 
 | 				#size-cells = <2>; | 
 |  | 
 | 				interrupt-map-mask = <0x0 0 0 0>; | 
 | 				interrupt-map = <0x0 0 0 0 &pciintc 20>; | 
 |  | 
 | 				status = "disabled"; | 
 | 			}; | 
 |  | 
 | 			pci-slot@17 { | 
 | 				reg = <0x8800 0 0 0 0>; | 
 | 				device_type = "pci"; | 
 |  | 
 | 				status = "disabled"; | 
 | 			}; | 
 |  | 
 | 			pci-slot@18 { | 
 | 				reg = <0x9000 0 0 0 0>; | 
 | 				device_type = "pci"; | 
 |  | 
 | 				status = "disabled"; | 
 | 			}; | 
 | 		}; | 
 | 	}; | 
 |  | 
 |    b) Board specific dts file: | 
 |  | 
 | 	pci@10140000 { | 
 | 		status = "okay"; | 
 |  | 
 | 		host-bridge { | 
 | 			pci-bridge@1 { | 
 | 				status = "okay"; | 
 | 			}; | 
 | 		}; | 
 | 	}; |