| 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; |
| }; |
| }; |
| }; |