How to convert i2c adapter drivers into good kernel code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Ok, enough people have been asking me for this over the past week, so
here's a rough cut:

How to convert the i2c CVS adapter drivers to the new i2c changes
(or, how do I get that driver that I'm using into the main kernel tree)

Please only do this if you have the hardware for the driver you want to
port.  Or if not, be prepared to handle lots of user email :)

Here's the steps to do this work:

 - Resync with the lm_sensors CVS tree (instructions for how to do this
   is at: http://secure.netroedge.com/~lm78/download.html).  Go into the
   kernel/busses/ directory and copy the i2c-*.c file that you want to
   convert to your up to date kernel tree's drivers/i2c/busses/
   directory.

 - Add the proper drivers/i2c/busses/Makefile and
   drivers/i2c/busses/Kconfig entries for the driver.  Remember to add a
   help section for the configuration entry, and try to keep the
   Makefile in alphabetical order.

 - Test that the Makefile and Kconfig changes work.  Yes, the driver
   will probably blow up on compile time into a lot of little pieces,
   but at least you have added it to the build process properly :)

 - remove the
 	#include "version.h"
   line in the driver, and replace the LM_VERSION and LM_DATE entries
   with I2C_VERSION and I2C_DATE to fix that compile time error.

 - If this is a pci driver:
 	- fill in the pci_device_id table with the proper device ids.
	  These can usually be found in the probe function (or in the
	  function that the probe function calls).
	- add a struct pci_dev * parameter to the probe function if it
	  doesn't have it, and fix up any other pci probe logic errors.
   Examples of this kind of change can be seen here:
  	http://linux.bkbits.net:8080/linux-2.5/patch at 1.889.334.6
		
 - If the driver calls check_region(), replace that with the test to
   request_region.
 
 - Fix all oddly formatted code (comments at the left side of the line,
   no tabs, etc.)

 - Make all functions and variables static.

 - Change all printk() calls to dev_* calls.  In doing this, all
 	#ifdef DEBUG
   lines can be removed.  Delete all instances of the driver's name in
   the printk() calls, as it is redundant with the dev_* calls.
 
 - Change the .name of the driver to use the .dev.name field.

 - When copying the name of the driver into .dev.name, use snprintf()
   and DEVICE_NAME_SIZE.
 
 - Right before calling i2c_add_adapter(), set up the
   i2c_adapter.dev.parent pointer to be the pci device.  This can be
   seen in the following patch:
	http://linux.bkbits.net:8080/linux-2.5/patch at 1.889.334.10
   If this is not a pci driver, do not worry about this step, just make
   sure the parent pointer is NULL, and the driver will get placed onto
   the legacy bus in sysfs.

And that should be about it.  If all of the above works out, the driver
should build, and when loaded, it should show up in the sysfs directory
/sys/bus/pci/drivers.  Go into the device that driver binds to, and you
should see a i2c? directory, which is the start of the i2c bus bound to
that adapter.

Then, make up a patch (read Documentation/SubmittingPatches) and send
it off to me, copying the list.

If there are any questions about any of this, or I forgot any steps,
please let me know.

thanks,

greg k-h



[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux