mirror of
				https://github.com/AetherDroid/android_kernel_samsung_on5xelte.git
				synced 2025-10-30 23:58:51 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			93 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			93 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;
 | |
| 			};
 | |
| 		};
 | |
| 	};
 | 
