168 lines
		
	
	
	
		
			6.4 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			168 lines
		
	
	
	
		
			6.4 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
|   | How to instantiate I2C devices | ||
|  | ============================== | ||
|  | 
 | ||
|  | Unlike PCI or USB devices, I2C devices are not enumerated at the hardware | ||
|  | level. Instead, the software must know which devices are connected on each | ||
|  | I2C bus segment, and what address these devices are using. For this | ||
|  | reason, the kernel code must instantiate I2C devices explicitly. There are | ||
|  | several ways to achieve this, depending on the context and requirements. | ||
|  | 
 | ||
|  | 
 | ||
|  | Method 1: Declare the I2C devices by bus number | ||
|  | ----------------------------------------------- | ||
|  | 
 | ||
|  | This method is appropriate when the I2C bus is a system bus as is the case | ||
|  | for many embedded systems. On such systems, each I2C bus has a number | ||
|  | which is known in advance. It is thus possible to pre-declare the I2C | ||
|  | devices which live on this bus. This is done with an array of struct | ||
|  | i2c_board_info which is registered by calling i2c_register_board_info(). | ||
|  | 
 | ||
|  | Example (from omap2 h4): | ||
|  | 
 | ||
|  | static struct i2c_board_info __initdata h4_i2c_board_info[] = { | ||
|  | 	{ | ||
|  | 		I2C_BOARD_INFO("isp1301_omap", 0x2d), | ||
|  | 		.irq		= OMAP_GPIO_IRQ(125), | ||
|  | 	}, | ||
|  | 	{	/* EEPROM on mainboard */ | ||
|  | 		I2C_BOARD_INFO("24c01", 0x52), | ||
|  | 		.platform_data	= &m24c01, | ||
|  | 	}, | ||
|  | 	{	/* EEPROM on cpu card */ | ||
|  | 		I2C_BOARD_INFO("24c01", 0x57), | ||
|  | 		.platform_data	= &m24c01, | ||
|  | 	}, | ||
|  | }; | ||
|  | 
 | ||
|  | static void __init omap_h4_init(void) | ||
|  | { | ||
|  | 	(...) | ||
|  | 	i2c_register_board_info(1, h4_i2c_board_info, | ||
|  | 			ARRAY_SIZE(h4_i2c_board_info)); | ||
|  | 	(...) | ||
|  | } | ||
|  | 
 | ||
|  | The above code declares 3 devices on I2C bus 1, including their respective | ||
|  | addresses and custom data needed by their drivers. When the I2C bus in | ||
|  | question is registered, the I2C devices will be instantiated automatically | ||
|  | by i2c-core. | ||
|  | 
 | ||
|  | The devices will be automatically unbound and destroyed when the I2C bus | ||
|  | they sit on goes away (if ever.) | ||
|  | 
 | ||
|  | 
 | ||
|  | Method 2: Instantiate the devices explicitly | ||
|  | -------------------------------------------- | ||
|  | 
 | ||
|  | This method is appropriate when a larger device uses an I2C bus for | ||
|  | internal communication. A typical case is TV adapters. These can have a | ||
|  | tuner, a video decoder, an audio decoder, etc. usually connected to the | ||
|  | main chip by the means of an I2C bus. You won't know the number of the I2C | ||
|  | bus in advance, so the method 1 described above can't be used. Instead, | ||
|  | you can instantiate your I2C devices explicitly. This is done by filling | ||
|  | a struct i2c_board_info and calling i2c_new_device(). | ||
|  | 
 | ||
|  | Example (from the sfe4001 network driver): | ||
|  | 
 | ||
|  | static struct i2c_board_info sfe4001_hwmon_info = { | ||
|  | 	I2C_BOARD_INFO("max6647", 0x4e), | ||
|  | }; | ||
|  | 
 | ||
|  | int sfe4001_init(struct efx_nic *efx) | ||
|  | { | ||
|  | 	(...) | ||
|  | 	efx->board_info.hwmon_client = | ||
|  | 		i2c_new_device(&efx->i2c_adap, &sfe4001_hwmon_info); | ||
|  | 
 | ||
|  | 	(...) | ||
|  | } | ||
|  | 
 | ||
|  | The above code instantiates 1 I2C device on the I2C bus which is on the | ||
|  | network adapter in question. | ||
|  | 
 | ||
|  | A variant of this is when you don't know for sure if an I2C device is | ||
|  | present or not (for example for an optional feature which is not present | ||
|  | on cheap variants of a board but you have no way to tell them apart), or | ||
|  | it may have different addresses from one board to the next (manufacturer | ||
|  | changing its design without notice). In this case, you can call | ||
|  | i2c_new_probed_device() instead of i2c_new_device(). | ||
|  | 
 | ||
|  | Example (from the pnx4008 OHCI driver): | ||
|  | 
 | ||
|  | static const unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END }; | ||
|  | 
 | ||
|  | static int __devinit usb_hcd_pnx4008_probe(struct platform_device *pdev) | ||
|  | { | ||
|  | 	(...) | ||
|  | 	struct i2c_adapter *i2c_adap; | ||
|  | 	struct i2c_board_info i2c_info; | ||
|  | 
 | ||
|  | 	(...) | ||
|  | 	i2c_adap = i2c_get_adapter(2); | ||
|  | 	memset(&i2c_info, 0, sizeof(struct i2c_board_info)); | ||
|  | 	strlcpy(i2c_info.name, "isp1301_pnx", I2C_NAME_SIZE); | ||
|  | 	isp1301_i2c_client = i2c_new_probed_device(i2c_adap, &i2c_info, | ||
|  | 						   normal_i2c); | ||
|  | 	i2c_put_adapter(i2c_adap); | ||
|  | 	(...) | ||
|  | } | ||
|  | 
 | ||
|  | The above code instantiates up to 1 I2C device on the I2C bus which is on | ||
|  | the OHCI adapter in question. It first tries at address 0x2c, if nothing | ||
|  | is found there it tries address 0x2d, and if still nothing is found, it | ||
|  | simply gives up. | ||
|  | 
 | ||
|  | The driver which instantiated the I2C device is responsible for destroying | ||
|  | it on cleanup. This is done by calling i2c_unregister_device() on the | ||
|  | pointer that was earlier returned by i2c_new_device() or | ||
|  | i2c_new_probed_device(). | ||
|  | 
 | ||
|  | 
 | ||
|  | Method 3: Probe an I2C bus for certain devices | ||
|  | ---------------------------------------------- | ||
|  | 
 | ||
|  | Sometimes you do not have enough information about an I2C device, not even | ||
|  | to call i2c_new_probed_device(). The typical case is hardware monitoring | ||
|  | chips on PC mainboards. There are several dozen models, which can live | ||
|  | at 25 different addresses. Given the huge number of mainboards out there, | ||
|  | it is next to impossible to build an exhaustive list of the hardware | ||
|  | monitoring chips being used. Fortunately, most of these chips have | ||
|  | manufacturer and device ID registers, so they can be identified by | ||
|  | probing. | ||
|  | 
 | ||
|  | In that case, I2C devices are neither declared nor instantiated | ||
|  | explicitly. Instead, i2c-core will probe for such devices as soon as their | ||
|  | drivers are loaded, and if any is found, an I2C device will be | ||
|  | instantiated automatically. In order to prevent any misbehavior of this | ||
|  | mechanism, the following restrictions apply: | ||
|  | * The I2C device driver must implement the detect() method, which | ||
|  |   identifies a supported device by reading from arbitrary registers. | ||
|  | * Only buses which are likely to have a supported device and agree to be | ||
|  |   probed, will be probed. For example this avoids probing for hardware | ||
|  |   monitoring chips on a TV adapter. | ||
|  | 
 | ||
|  | Example: | ||
|  | See lm90_driver and lm90_detect() in drivers/hwmon/lm90.c | ||
|  | 
 | ||
|  | I2C devices instantiated as a result of such a successful probe will be | ||
|  | destroyed automatically when the driver which detected them is removed, | ||
|  | or when the underlying I2C bus is itself destroyed, whichever happens | ||
|  | first. | ||
|  | 
 | ||
|  | Those of you familiar with the i2c subsystem of 2.4 kernels and early 2.6 | ||
|  | kernels will find out that this method 3 is essentially similar to what | ||
|  | was done there. Two significant differences are: | ||
|  | * Probing is only one way to instantiate I2C devices now, while it was the | ||
|  |   only way back then. Where possible, methods 1 and 2 should be preferred. | ||
|  |   Method 3 should only be used when there is no other way, as it can have | ||
|  |   undesirable side effects. | ||
|  | * I2C buses must now explicitly say which I2C driver classes can probe | ||
|  |   them (by the means of the class bitfield), while all I2C buses were | ||
|  |   probed by default back then. The default is an empty class which means | ||
|  |   that no probing happens. The purpose of the class bitfield is to limit | ||
|  |   the aforementioned undesirable side effects. | ||
|  | 
 | ||
|  | Once again, method 3 should be avoided wherever possible. Explicit device | ||
|  | instantiation (methods 1 and 2) is much preferred for it is safer and | ||
|  | faster. |