|  | CE4100 I2C | 
|  | ---------- | 
|  |  | 
|  | CE4100 has one PCI device which is described as the I2C-Controller. This | 
|  | PCI device has three PCI-bars, each bar contains a complete I2C | 
|  | controller. So we have a total of three independent I2C-Controllers | 
|  | which share only an interrupt line. | 
|  | The driver is probed via the PCI-ID and is gathering the information of | 
|  | attached devices from the devices tree. | 
|  | Grant Likely recommended to use the ranges property to map the PCI-Bar | 
|  | number to its physical address and to use this to find the child nodes | 
|  | of the specific I2C controller. This were his exact words: | 
|  |  | 
|  | Here's where the magic happens.  Each entry in | 
|  | ranges describes how the parent pci address space | 
|  | (middle group of 3) is translated to the local | 
|  | address space (first group of 2) and the size of | 
|  | each range (last cell).  In this particular case, | 
|  | the first cell of the local address is chosen to be | 
|  | 1:1 mapped to the BARs, and the second is the | 
|  | offset from be base of the BAR (which would be | 
|  | non-zero if you had 2 or more devices mapped off | 
|  | the same BAR) | 
|  |  | 
|  | ranges allows the address mapping to be described | 
|  | in a way that the OS can interpret without | 
|  | requiring custom device driver code. | 
|  |  | 
|  | This is an example which is used on FalconFalls: | 
|  | ------------------------------------------------ | 
|  | i2c-controller@b,2 { | 
|  | #address-cells = <2>; | 
|  | #size-cells = <1>; | 
|  | compatible = "pci8086,2e68.2", | 
|  | "pci8086,2e68", | 
|  | "pciclass,ff0000", | 
|  | "pciclass,ff00"; | 
|  |  | 
|  | reg = <0x15a00 0x0 0x0 0x0 0x0>; | 
|  | interrupts = <16 1>; | 
|  |  | 
|  | /* as described by Grant, the first number in the group of | 
|  | * three is the bar number followed by the 64bit bar address | 
|  | * followed by size of the mapping. The bar address | 
|  | * requires also a valid translation in parents ranges | 
|  | * property. | 
|  | */ | 
|  | ranges = <0 0   0x02000000 0 0xdffe0500 0x100 | 
|  | 1 0   0x02000000 0 0xdffe0600 0x100 | 
|  | 2 0   0x02000000 0 0xdffe0700 0x100>; | 
|  |  | 
|  | i2c@0 { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | compatible = "intel,ce4100-i2c-controller"; | 
|  |  | 
|  | /* The first number in the reg property is the | 
|  | * number of the bar | 
|  | */ | 
|  | reg = <0 0 0x100>; | 
|  |  | 
|  | /* This I2C controller has no devices */ | 
|  | }; | 
|  |  | 
|  | i2c@1 { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | compatible = "intel,ce4100-i2c-controller"; | 
|  | reg = <1 0 0x100>; | 
|  |  | 
|  | /* This I2C controller has one gpio controller */ | 
|  | gpio@26 { | 
|  | #gpio-cells = <2>; | 
|  | compatible = "ti,pcf8575"; | 
|  | reg = <0x26>; | 
|  | gpio-controller; | 
|  | }; | 
|  | }; | 
|  |  | 
|  | i2c@2 { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <0>; | 
|  | compatible = "intel,ce4100-i2c-controller"; | 
|  | reg = <2 0 0x100>; | 
|  |  | 
|  | gpio@26 { | 
|  | #gpio-cells = <2>; | 
|  | compatible = "ti,pcf8575"; | 
|  | reg = <0x26>; | 
|  | gpio-controller; | 
|  | }; | 
|  | }; | 
|  | }; |