94 lines
2.7 KiB
Text
94 lines
2.7 KiB
Text
|
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;
|
||
|
};
|
||
|
};
|
||
|
};
|