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