Commit feeedc6c authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'i2c-for-linus' of git://jdelvare.pck.nerim.net/jdelvare-2.6

* 'i2c-for-linus' of git://jdelvare.pck.nerim.net/jdelvare-2.6:
  i2c: Add info->archdata field
  i2c: Inform about deprecated chips directory
  i2c: Use pci_ioremap_bar()
  Schedule removal of the legacy i2c device driver binding model
  i2c: Clean up <linux/i2c.h>
  i2c: Update and clean up writing-clients document
  i2c: Drop 2-byte address block transfer defines
  i2c: Delete legacy model documentation
  i2c: Constify i2c_get_clientdata's parameter
  i2c: Delete outdated client porting guide
  i2c: Make clear what the class field of i2c_adapter is good for
  i2c-algo-pcf: Fix typo in debugging log message
  i2c-algo-pcf: Add adapter hooks around xfer begin and end
  i2c-algo-pcf: Pass adapter data into ->waitforpin() method
  i2c-i801: Add support for Intel Ibex Peak
parents a2702834 11f1f2af
...@@ -359,3 +359,11 @@ Why: The 2.6 kernel supports direct writing to ide CD drives, which ...@@ -359,3 +359,11 @@ Why: The 2.6 kernel supports direct writing to ide CD drives, which
eliminates the need for ide-scsi. The new method is more eliminates the need for ide-scsi. The new method is more
efficient in every way. efficient in every way.
Who: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> Who: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
---------------------------
What: i2c_attach_client(), i2c_detach_client(), i2c_driver->detach_client()
When: 2.6.29 (ideally) or 2.6.30 (more likely)
Why: Deprecated by the new (standard) device driver binding model. Use
i2c_driver->probe() and ->remove() instead.
Who: Jean Delvare <khali@linux-fr.org>
...@@ -13,8 +13,9 @@ Supported adapters: ...@@ -13,8 +13,9 @@ Supported adapters:
* Intel 631xESB/632xESB (ESB2) * Intel 631xESB/632xESB (ESB2)
* Intel 82801H (ICH8) * Intel 82801H (ICH8)
* Intel 82801I (ICH9) * Intel 82801I (ICH9)
* Intel Tolapai * Intel EP80579 (Tolapai)
* Intel ICH10 * Intel 82801JI (ICH10)
* Intel PCH
Datasheets: Publicly available at the Intel website Datasheets: Publicly available at the Intel website
Authors: Authors:
...@@ -32,7 +33,7 @@ Description ...@@ -32,7 +33,7 @@ Description
----------- -----------
The ICH (properly known as the 82801AA), ICH0 (82801AB), ICH2 (82801BA), The ICH (properly known as the 82801AA), ICH0 (82801AB), ICH2 (82801BA),
ICH3 (82801CA/CAM) and later devices are Intel chips that are a part of ICH3 (82801CA/CAM) and later devices (PCH) are Intel chips that are a part of
Intel's '810' chipset for Celeron-based PCs, '810E' chipset for Intel's '810' chipset for Celeron-based PCs, '810E' chipset for
Pentium-based PCs, '815E' chipset, and others. Pentium-based PCs, '815E' chipset, and others.
......
Revision 7, 2007-04-19
Jean Delvare <khali@linux-fr.org>
Greg KH <greg@kroah.com>
This is a guide on how to convert I2C chip drivers from Linux 2.4 to
Linux 2.6. I have been using existing drivers (lm75, lm78) as examples.
Then I converted a driver myself (lm83) and updated this document.
Note that this guide is strongly oriented towards hardware monitoring
drivers. Many points are still valid for other type of drivers, but
others may be irrelevant.
There are two sets of points below. The first set concerns technical
changes. The second set concerns coding policy. Both are mandatory.
Although reading this guide will help you porting drivers, I suggest
you keep an eye on an already ported driver while porting your own
driver. This will help you a lot understanding what this guide
exactly means. Choose the chip driver that is the more similar to
yours for best results.
Technical changes:
* [Driver type] Any driver that was relying on i2c-isa has to be
converted to a proper isa, platform or pci driver. This is not
covered by this guide.
* [Includes] Get rid of "version.h" and <linux/i2c-proc.h>.
Includes typically look like that:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/jiffies.h>
#include <linux/i2c.h>
#include <linux/hwmon.h> /* for hardware monitoring drivers */
#include <linux/hwmon-sysfs.h>
#include <linux/hwmon-vid.h> /* if you need VRM support */
#include <linux/err.h> /* for class registration */
Please respect this inclusion order. Some extra headers may be
required for a given driver (e.g. "lm75.h").
* [Addresses] SENSORS_I2C_END becomes I2C_CLIENT_END, ISA addresses
are no more handled by the i2c core. Address ranges are no more
supported either, define each individual address separately.
SENSORS_INSMOD_<n> becomes I2C_CLIENT_INSMOD_<n>.
* [Client data] Get rid of sysctl_id. Try using standard names for
register values (for example, temp_os becomes temp_max). You're
still relatively free here, but you *have* to follow the standard
names for sysfs files (see the Sysctl section below).
* [Function prototypes] The detect functions loses its flags
parameter. Sysctl (e.g. lm75_temp) and miscellaneous functions
are off the list of prototypes. This usually leaves five
prototypes:
static int lm75_attach_adapter(struct i2c_adapter *adapter);
static int lm75_detect(struct i2c_adapter *adapter, int address,
int kind);
static void lm75_init_client(struct i2c_client *client);
static int lm75_detach_client(struct i2c_client *client);
static struct lm75_data lm75_update_device(struct device *dev);
* [Sysctl] All sysctl stuff is of course gone (defines, ctl_table
and functions). Instead, you have to define show and set functions for
each sysfs file. Only define set for writable values. Take a look at an
existing 2.6 driver for details (it87 for example). Don't forget
to define the attributes for each file (this is that step that
links callback functions). Use the file names specified in
Documentation/hwmon/sysfs-interface for the individual files. Also
convert the units these files read and write to the specified ones.
If you need to add a new type of file, please discuss it on the
sensors mailing list <lm-sensors@lm-sensors.org> by providing a
patch to the Documentation/hwmon/sysfs-interface file.
* [Attach] The attach function should make sure that the adapter's
class has I2C_CLASS_HWMON (or whatever class is suitable for your
driver), using the following construct:
if (!(adapter->class & I2C_CLASS_HWMON))
return 0;
Call i2c_probe() instead of i2c_detect().
* [Detect] As mentioned earlier, the flags parameter is gone.
The type_name and client_name strings are replaced by a single
name string, which will be filled with a lowercase, short string.
The labels used for error paths are reduced to the number needed.
It is advised that the labels are given descriptive names such as
exit and exit_free. Don't forget to properly set err before
jumping to error labels. By the way, labels should be left-aligned.
Use kzalloc instead of kmalloc.
Use i2c_set_clientdata to set the client data (as opposed to
a direct access to client->data).
Use strlcpy instead of strcpy or snprintf to copy the client name.
Replace the sysctl directory registration by calls to
device_create_file. Move the driver initialization before any
sysfs file creation.
Register the client with the hwmon class (using hwmon_device_register)
if applicable.
Drop client->id.
Drop any 24RF08 corruption prevention you find, as this is now done
at the i2c-core level, and doing it twice voids it.
Don't add I2C_CLIENT_ALLOW_USE to client->flags, it's the default now.
* [Init] Limits must not be set by the driver (can be done later in
user-space). Chip should not be reset default (although a module
parameter may be used to force it), and initialization should be
limited to the strictly necessary steps.
* [Detach] Remove the call to i2c_deregister_entry. Do not log an
error message if i2c_detach_client fails, as i2c-core will now do
it for you.
Unregister from the hwmon class if applicable.
* [Update] The function prototype changed, it is now
passed a device structure, which you have to convert to a client
using to_i2c_client(dev). The update function should return a
pointer to the client data.
Don't access client->data directly, use i2c_get_clientdata(client)
instead.
Use time_after() instead of direct jiffies comparison.
* [Interface] Make sure there is a MODULE_LICENSE() line, at the bottom
of the file (after MODULE_AUTHOR() and MODULE_DESCRIPTION(), in this
order).
* [Driver] The flags field of the i2c_driver structure is gone.
I2C_DF_NOTIFY is now the default behavior.
The i2c_driver structure has a driver member, which is itself a
structure, those name member should be initialized to a driver name
string. i2c_driver itself has no name member anymore.
* [Driver model] Instead of shutdown or reboot notifiers, provide a
shutdown() method in your driver.
* [Power management] Use the driver model suspend() and resume()
callbacks instead of the obsolete pm_register() calls.
Coding policy:
* [Copyright] Use (C), not (c), for copyright.
* [Debug/log] Get rid of #ifdef DEBUG/#endif constructs whenever you
can. Calls to printk for debugging purposes are replaced by calls to
dev_dbg where possible, else to pr_debug. Here is an example of how
to call it (taken from lm75_detect):
dev_dbg(&client->dev, "Starting lm75 update\n");
Replace other printk calls with the dev_info, dev_err or dev_warn
function, as appropriate.
* [Constants] Constants defines (registers, conversions) should be
aligned. This greatly improves readability.
Alignments are achieved by the means of tabs, not spaces. Remember
that tabs are set to 8 in the Linux kernel code.
* [Layout] Avoid extra empty lines between comments and what they
comment. Respect the coding style (see Documentation/CodingStyle),
in particular when it comes to placing curly braces.
* [Comments] Make sure that no comment refers to a file that isn't
part of the Linux source tree (typically doc/chips/<chip name>),
and that remaining comments still match the code. Merging comment
lines when possible is encouraged.
This diff is collapsed.
...@@ -135,7 +135,7 @@ static int wait_for_pin(struct i2c_algo_pcf_data *adap, int *status) { ...@@ -135,7 +135,7 @@ static int wait_for_pin(struct i2c_algo_pcf_data *adap, int *status) {
*status = get_pcf(adap, 1); *status = get_pcf(adap, 1);
#ifndef STUB_I2C #ifndef STUB_I2C
while (timeout-- && (*status & I2C_PCF_PIN)) { while (timeout-- && (*status & I2C_PCF_PIN)) {
adap->waitforpin(); adap->waitforpin(adap->data);
*status = get_pcf(adap, 1); *status = get_pcf(adap, 1);
} }
if (*status & I2C_PCF_LAB) { if (*status & I2C_PCF_LAB) {
...@@ -208,7 +208,7 @@ static int pcf_init_8584 (struct i2c_algo_pcf_data *adap) ...@@ -208,7 +208,7 @@ static int pcf_init_8584 (struct i2c_algo_pcf_data *adap)
return -ENXIO; return -ENXIO;
} }
printk(KERN_DEBUG "i2c-algo-pcf.o: deteted and initialized PCF8584.\n"); printk(KERN_DEBUG "i2c-algo-pcf.o: detected and initialized PCF8584.\n");
return 0; return 0;
} }
...@@ -331,13 +331,16 @@ static int pcf_xfer(struct i2c_adapter *i2c_adap, ...@@ -331,13 +331,16 @@ static int pcf_xfer(struct i2c_adapter *i2c_adap,
int i; int i;
int ret=0, timeout, status; int ret=0, timeout, status;
if (adap->xfer_begin)
adap->xfer_begin(adap->data);
/* Check for bus busy */ /* Check for bus busy */
timeout = wait_for_bb(adap); timeout = wait_for_bb(adap);
if (timeout) { if (timeout) {
DEB2(printk(KERN_ERR "i2c-algo-pcf.o: " DEB2(printk(KERN_ERR "i2c-algo-pcf.o: "
"Timeout waiting for BB in pcf_xfer\n");) "Timeout waiting for BB in pcf_xfer\n");)
return -EIO; i = -EIO;
goto out;
} }
for (i = 0;ret >= 0 && i < num; i++) { for (i = 0;ret >= 0 && i < num; i++) {
...@@ -359,12 +362,14 @@ static int pcf_xfer(struct i2c_adapter *i2c_adap, ...@@ -359,12 +362,14 @@ static int pcf_xfer(struct i2c_adapter *i2c_adap,
if (timeout) { if (timeout) {
if (timeout == -EINTR) { if (timeout == -EINTR) {
/* arbitration lost */ /* arbitration lost */
return (-EINTR); i = -EINTR;
goto out;
} }
i2c_stop(adap); i2c_stop(adap);
DEB2(printk(KERN_ERR "i2c-algo-pcf.o: Timeout waiting " DEB2(printk(KERN_ERR "i2c-algo-pcf.o: Timeout waiting "
"for PIN(1) in pcf_xfer\n");) "for PIN(1) in pcf_xfer\n");)
return (-EREMOTEIO); i = -EREMOTEIO;
goto out;
} }
#ifndef STUB_I2C #ifndef STUB_I2C
...@@ -372,7 +377,8 @@ static int pcf_xfer(struct i2c_adapter *i2c_adap, ...@@ -372,7 +377,8 @@ static int pcf_xfer(struct i2c_adapter *i2c_adap,
if (status & I2C_PCF_LRB) { if (status & I2C_PCF_LRB) {
i2c_stop(adap); i2c_stop(adap);
DEB2(printk(KERN_ERR "i2c-algo-pcf.o: No LRB(1) in pcf_xfer\n");) DEB2(printk(KERN_ERR "i2c-algo-pcf.o: No LRB(1) in pcf_xfer\n");)
return (-EREMOTEIO); i = -EREMOTEIO;
goto out;
} }
#endif #endif
...@@ -404,6 +410,9 @@ static int pcf_xfer(struct i2c_adapter *i2c_adap, ...@@ -404,6 +410,9 @@ static int pcf_xfer(struct i2c_adapter *i2c_adap,
} }
} }
out:
if (adap->xfer_end)
adap->xfer_end(adap->data);
return (i); return (i);
} }
......
...@@ -97,6 +97,7 @@ config I2C_I801 ...@@ -97,6 +97,7 @@ config I2C_I801
ICH9 ICH9
Tolapai Tolapai
ICH10 ICH10
PCH
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called i2c-i801. will be called i2c-i801.
......
...@@ -104,7 +104,8 @@ static int pcf_isa_getclock(void *data) ...@@ -104,7 +104,8 @@ static int pcf_isa_getclock(void *data)
return (clock); return (clock);
} }
static void pcf_isa_waitforpin(void) { static void pcf_isa_waitforpin(void *data)
{
DEFINE_WAIT(wait); DEFINE_WAIT(wait);
int timeout = 2; int timeout = 2;
unsigned long flags; unsigned long flags;
......
...@@ -123,7 +123,7 @@ static int __devinit hydra_probe(struct pci_dev *dev, ...@@ -123,7 +123,7 @@ static int __devinit hydra_probe(struct pci_dev *dev,
hydra_adap.name)) hydra_adap.name))
return -EBUSY; return -EBUSY;
hydra_bit_data.data = ioremap(base, pci_resource_len(dev, 0)); hydra_bit_data.data = pci_ioremap_bar(dev, 0);
if (hydra_bit_data.data == NULL) { if (hydra_bit_data.data == NULL) {
release_mem_region(base+offsetof(struct Hydra, CachePD), 4); release_mem_region(base+offsetof(struct Hydra, CachePD), 4);
return -ENODEV; return -ENODEV;
......
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
Tolapai 0x5032 32 hard yes yes yes Tolapai 0x5032 32 hard yes yes yes
ICH10 0x3a30 32 hard yes yes yes ICH10 0x3a30 32 hard yes yes yes
ICH10 0x3a60 32 hard yes yes yes ICH10 0x3a60 32 hard yes yes yes
PCH 0x3b30 32 hard yes yes yes
Features supported by this driver: Features supported by this driver:
Software PEC no Software PEC no
...@@ -576,6 +577,7 @@ static struct pci_device_id i801_ids[] = { ...@@ -576,6 +577,7 @@ static struct pci_device_id i801_ids[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TOLAPAI_1) }, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TOLAPAI_1) },
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_4) }, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_4) },
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_5) }, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_5) },
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PCH_SMBUS) },
{ 0, } { 0, }
}; };
...@@ -599,6 +601,7 @@ static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id ...@@ -599,6 +601,7 @@ static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id
case PCI_DEVICE_ID_INTEL_TOLAPAI_1: case PCI_DEVICE_ID_INTEL_TOLAPAI_1:
case PCI_DEVICE_ID_INTEL_ICH10_4: case PCI_DEVICE_ID_INTEL_ICH10_4:
case PCI_DEVICE_ID_INTEL_ICH10_5: case PCI_DEVICE_ID_INTEL_ICH10_5:
case PCI_DEVICE_ID_INTEL_PCH_SMBUS:
i801_features |= FEATURE_I2C_BLOCK_READ; i801_features |= FEATURE_I2C_BLOCK_READ;
/* fall through */ /* fall through */
case PCI_DEVICE_ID_INTEL_82801DB_3: case PCI_DEVICE_ID_INTEL_82801DB_3:
......
# #
# Miscellaneous I2C chip drivers configuration # Miscellaneous I2C chip drivers configuration
# #
# *** DEPRECATED! Do not add new entries! See Makefile ***
#
menu "Miscellaneous I2C Chip support" menu "Miscellaneous I2C Chip support"
......
# #
# Makefile for miscellaneous I2C chip drivers. # Makefile for miscellaneous I2C chip drivers.
# #
# Think twice before you add a new driver to this directory. # Do not add new drivers to this directory! It is DEPRECATED.
#
# Device drivers are better grouped according to the functionality they # Device drivers are better grouped according to the functionality they
# implement rather than to the bus they are connected to. In particular: # implement rather than to the bus they are connected to. In particular:
# * Hardware monitoring chip drivers go to drivers/hwmon # * Hardware monitoring chip drivers go to drivers/hwmon
......
...@@ -266,6 +266,9 @@ i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info) ...@@ -266,6 +266,9 @@ i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
client->dev.platform_data = info->platform_data; client->dev.platform_data = info->platform_data;
if (info->archdata)
client->dev.archdata = *info->archdata;
client->flags = info->flags; client->flags = info->flags;
client->addr = info->addr; client->addr = info->addr;
client->irq = info->irq; client->irq = info->irq;
......
...@@ -450,7 +450,7 @@ static inline void set_dev_node(struct device *dev, int node) ...@@ -450,7 +450,7 @@ static inline void set_dev_node(struct device *dev, int node)
} }
#endif #endif
static inline void *dev_get_drvdata(struct device *dev) static inline void *dev_get_drvdata(const struct device *dev)
{ {
return dev->driver_data; return dev->driver_data;
} }
......
...@@ -31,7 +31,10 @@ struct i2c_algo_pcf_data { ...@@ -31,7 +31,10 @@ struct i2c_algo_pcf_data {
int (*getpcf) (void *data, int ctl); int (*getpcf) (void *data, int ctl);
int (*getown) (void *data); int (*getown) (void *data);
int (*getclock) (void *data); int (*getclock) (void *data);
void (*waitforpin) (void); void (*waitforpin) (void *data);
void (*xfer_begin) (void *data);
void (*xfer_end) (void *data);
/* Multi-master lost arbitration back-off delay (msecs) /* Multi-master lost arbitration back-off delay (msecs)
* This should be set by the bus adapter or knowledgable client * This should be set by the bus adapter or knowledgable client
......
...@@ -53,45 +53,44 @@ struct i2c_board_info; ...@@ -53,45 +53,44 @@ struct i2c_board_info;
* transmit one message at a time, a more complex version can be used to * transmit one message at a time, a more complex version can be used to
* transmit an arbitrary number of messages without interruption. * transmit an arbitrary number of messages without interruption.
*/ */
extern int i2c_master_send(struct i2c_client *,const char* ,int); extern int i2c_master_send(struct i2c_client *client, const char *buf,
extern int i2c_master_recv(struct i2c_client *,char* ,int); int count);
extern int i2c_master_recv(struct i2c_client *client, char *buf, int count);
/* Transfer num messages. /* Transfer num messages.
*/ */
extern int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num); extern int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
int num);
/* This is the very generalized SMBus access routine. You probably do not /* This is the very generalized SMBus access routine. You probably do not
want to use this, though; one of the functions below may be much easier, want to use this, though; one of the functions below may be much easier,
and probably just as fast. and probably just as fast.
Note that we use i2c_adapter here, because you do not need a specific Note that we use i2c_adapter here, because you do not need a specific
smbus adapter to call this function. */ smbus adapter to call this function. */
extern s32 i2c_smbus_xfer (struct i2c_adapter * adapter, u16 addr, extern s32 i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
unsigned short flags, unsigned short flags, char read_write, u8 command,
char read_write, u8 command, int size, int size, union i2c_smbus_data *data);
union i2c_smbus_data * data);
/* Now follow the 'nice' access routines. These also document the calling /* Now follow the 'nice' access routines. These also document the calling
conventions of i2c_smbus_xfer. */ conventions of i2c_smbus_xfer. */
extern s32 i2c_smbus_read_byte(struct i2c_client * client); extern s32 i2c_smbus_read_byte(struct i2c_client *client);
extern s32 i2c_smbus_write_byte(struct i2c_client * client, u8 value); extern s32 i2c_smbus_write_byte(struct i2c_client *client, u8 value);
extern s32 i2c_smbus_read_byte_data(struct i2c_client * client, u8 command); extern s32 i2c_smbus_read_byte_data(struct i2c_client *client, u8 command);
extern s32 i2c_smbus_write_byte_data(struct i2c_client * client, extern s32 i2c_smbus_write_byte_data(struct i2c_client *client,
u8 command, u8 value); u8 command, u8 value);
extern s32 i2c_smbus_read_word_data(struct i2c_client * client, u8 command); extern s32 i2c_smbus_read_word_data(struct i2c_client *client, u8 command);
extern s32 i2c_smbus_write_word_data(struct i2c_client * client, extern s32 i2c_smbus_write_word_data(struct i2c_client *client,
u8 command, u16 value); u8 command, u16 value);
/* Returns the number of read bytes */ /* Returns the number of read bytes */
extern s32 i2c_smbus_read_block_data(struct i2c_client *client, extern s32 i2c_smbus_read_block_data(struct i2c_client *client,
u8 command, u8 *values); u8 command, u8 *values);
extern s32 i2c_smbus_write_block_data(struct i2c_client * client, extern s32 i2c_smbus_write_block_data(struct i2c_client *client,
u8 command, u8 length, u8 command, u8 length, const u8 *values);
const u8 *values);
/* Returns the number of read bytes */ /* Returns the number of read bytes */
extern s32 i2c_smbus_read_i2c_block_data(struct i2c_client * client, extern s32 i2c_smbus_read_i2c_block_data(struct i2c_client *client,
u8 command, u8 length, u8 *values); u8 command, u8 length, u8 *values);
extern s32 i2c_smbus_write_i2c_block_data(struct i2c_client * client, extern s32 i2c_smbus_write_i2c_block_data(struct i2c_client *client,
u8 command, u8 length, u8 command, u8 length,
const u8 *values); const u8 *values);
...@@ -169,7 +168,7 @@ struct i2c_driver { ...@@ -169,7 +168,7 @@ struct i2c_driver {
/* a ioctl like command that can be used to perform specific functions /* a ioctl like command that can be used to perform specific functions
* with the device. * with the device.
*/ */
int (*command)(struct i2c_client *client,unsigned int cmd, void *arg); int (*command)(struct i2c_client *client, unsigned int cmd, void *arg);
struct device_driver driver; struct device_driver driver;
const struct i2c_device_id *id_table; const struct i2c_device_id *id_table;
...@@ -224,14 +223,14 @@ static inline struct i2c_client *kobj_to_i2c_client(struct kobject *kobj) ...@@ -224,14 +223,14 @@ static inline struct i2c_client *kobj_to_i2c_client(struct kobject *kobj)
return to_i2c_client(dev); return to_i2c_client(dev);
} }
static inline void *i2c_get_clientdata (struct i2c_client *dev) static inline void *i2c_get_clientdata(const struct i2c_client *dev)
{ {
return dev_get_drvdata (&dev->dev); return dev_get_drvdata(&dev->dev);
} }
static inline void i2c_set_clientdata (struct i2c_client *dev, void *data) static inline void i2c_set_clientdata(struct i2c_client *dev, void *data)
{ {
dev_set_drvdata (&dev->dev, data); dev_set_drvdata(&dev->dev, data);
} }
/** /**
...@@ -240,6 +239,7 @@ static inline void i2c_set_clientdata (struct i2c_client *dev, void *data) ...@@ -240,6 +239,7 @@ static inline void i2c_set_clientdata (struct i2c_client *dev, void *data)
* @flags: to initialize i2c_client.flags * @flags: to initialize i2c_client.flags
* @addr: stored in i2c_client.addr * @addr: stored in i2c_client.addr
* @platform_data: stored in i2c_client.dev.platform_data * @platform_data: stored in i2c_client.dev.platform_data
* @archdata: copied into i2c_client.dev.archdata
* @irq: stored in i2c_client.irq * @irq: stored in i2c_client.irq
* *
* I2C doesn't actually support hardware probing, although controllers and * I2C doesn't actually support hardware probing, although controllers and
...@@ -259,6 +259,7 @@ struct i2c_board_info { ...@@ -259,6 +259,7 @@ struct i2c_board_info {
unsigned short flags; unsigned short flags;
unsigned short addr; unsigned short addr;
void *platform_data; void *platform_data;
struct dev_archdata *archdata;
int irq; int irq;
}; };
...@@ -272,7 +273,7 @@ struct i2c_board_info { ...@@ -272,7 +273,7 @@ struct i2c_board_info {
* fields (such as associated irq, or device-specific platform_data) * fields (such as associated irq, or device-specific platform_data)
* are provided using conventional syntax. * are provided using conventional syntax.
*/ */
#define I2C_BOARD_INFO(dev_type,dev_addr) \ #define I2C_BOARD_INFO(dev_type, dev_addr) \
.type = (dev_type), .addr = (dev_addr) .type = (dev_type), .addr = (dev_addr)
...@@ -306,10 +307,12 @@ extern void i2c_unregister_device(struct i2c_client *); ...@@ -306,10 +307,12 @@ extern void i2c_unregister_device(struct i2c_client *);
*/ */
#ifdef CONFIG_I2C_BOARDINFO #ifdef CONFIG_I2C_BOARDINFO
extern int extern int
i2c_register_board_info(int busnum, struct i2c_board_info const *info, unsigned n); i2c_register_board_info(int busnum, struct i2c_board_info const *info,
unsigned n);
#else #else
static inline int static inline int
i2c_register_board_info(int busnum, struct i2c_board_info const *info, unsigned n) i2c_register_board_info(int busnum, struct i2c_board_info const *info,
unsigned n)
{ {
return 0; return 0;
} }
...@@ -328,11 +331,11 @@ struct i2c_algorithm { ...@@ -328,11 +331,11 @@ struct i2c_algorithm {
using common I2C messages */ using common I2C messages */
/* master_xfer should return the number of messages successfully /* master_xfer should return the number of messages successfully
processed, or a negative value on error */ processed, or a negative value on error */
int (*master_xfer)(struct i2c_adapter *adap,struct i2c_msg *msgs, int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,
int num); int num);
int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr, int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr,
unsigned short flags, char read_write, unsigned short flags, char read_write,
u8 command, int size, union i2c_smbus_data * data); u8 command, int size, union i2c_smbus_data *data);
/* To determine what the adapter supports */ /* To determine what the adapter supports */
u32 (*functionality) (struct i2c_adapter *); u32 (*functionality) (struct i2c_adapter *);
...@@ -345,7 +348,7 @@ struct i2c_algorithm { ...@@ -345,7 +348,7 @@ struct i2c_algorithm {
struct i2c_adapter { struct i2c_adapter {
struct module *owner; struct module *owner;
unsigned int id; unsigned int id;
unsigned int class; unsigned int class; /* classes to allow probing for */
const struct i2c_algorithm *algo; /* the algorithm to access the bus */ const struct i2c_algorithm *algo; /* the algorithm to access the bus */
void *algo_data; void *algo_data;
...@@ -369,14 +372,14 @@ struct i2c_adapter { ...@@ -369,14 +372,14 @@ struct i2c_adapter {
}; };
#define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev) #define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev)
static inline void *i2c_get_adapdata (struct i2c_adapter *dev) static inline void *i2c_get_adapdata(const struct i2c_adapter *dev)
{ {
return dev_get_drvdata (&dev->dev); return dev_get_drvdata(&dev->dev);
} }
static inline void i2c_set_adapdata (struct i2c_adapter *dev, void *data) static inline void i2c_set_adapdata(struct i2c_adapter *dev, void *data)
{ {
dev_set_drvdata (&dev->dev, data); dev_set_drvdata(&dev->dev, data);
} }
/*flags for the client struct: */ /*flags for the client struct: */
...@@ -449,7 +452,7 @@ extern int i2c_probe(struct i2c_adapter *adapter, ...@@ -449,7 +452,7 @@ extern int i2c_probe(struct i2c_adapter *adapter,
const struct i2c_client_address_data *address_data, const struct i2c_client_address_data *address_data,
int (*found_proc) (struct i2c_adapter *, int, int)); int (*found_proc) (struct i2c_adapter *, int, int));
extern struct i2c_adapter* i2c_get_adapter(int id); extern struct i2c_adapter *i2c_get_adapter(int id);
extern void i2c_put_adapter(struct i2c_adapter *adap); extern void i2c_put_adapter(struct i2c_adapter *adap);
...@@ -465,7 +468,7 @@ static inline int i2c_check_functionality(struct i2c_adapter *adap, u32 func) ...@@ -465,7 +468,7 @@ static inline int i2c_check_functionality(struct i2c_adapter *adap, u32 func)
return (func & i2c_get_functionality(adap)) == func; return (func & i2c_get_functionality(adap)) == func;
} }
/* Return id number for a specific adapter */ /* Return the adapter number for a specific adapter */
static inline int i2c_adapter_id(struct i2c_adapter *adap) static inline int i2c_adapter_id(struct i2c_adapter *adap)
{ {
return adap->nr; return adap->nr;
...@@ -526,7 +529,7 @@ struct i2c_msg { ...@@ -526,7 +529,7 @@ struct i2c_msg {
#define I2C_FUNC_I2C 0x00000001 #define I2C_FUNC_I2C 0x00000001
#define I2C_FUNC_10BIT_ADDR 0x00000002 #define I2C_FUNC_10BIT_ADDR 0x00000002
#define I2C_FUNC_PROTOCOL_MANGLING 0x00000004 /* I2C_M_{REV_DIR_ADDR,NOSTART,..} */ #define I2C_FUNC_PROTOCOL_MANGLING 0x00000004 /* I2C_M_NOSTART etc. */
#define I2C_FUNC_SMBUS_PEC 0x00000008 #define I2C_FUNC_SMBUS_PEC 0x00000008
#define I2C_FUNC_SMBUS_BLOCK_PROC_CALL 0x00008000 /* SMBus 2.0 */ #define I2C_FUNC_SMBUS_BLOCK_PROC_CALL 0x00008000 /* SMBus 2.0 */
#define I2C_FUNC_SMBUS_QUICK 0x00010000 #define I2C_FUNC_SMBUS_QUICK 0x00010000
...@@ -541,8 +544,6 @@ struct i2c_msg { ...@@ -541,8 +544,6 @@ struct i2c_msg {
#define I2C_FUNC_SMBUS_WRITE_BLOCK_DATA 0x02000000 #define I2C_FUNC_SMBUS_WRITE_BLOCK_DATA 0x02000000
#define I2C_FUNC_SMBUS_READ_I2C_BLOCK 0x04000000 /* I2C-like block xfer */ #define I2C_FUNC_SMBUS_READ_I2C_BLOCK 0x04000000 /* I2C-like block xfer */
#define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK 0x08000000 /* w/ 1-byte reg. addr. */ #define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK 0x08000000 /* w/ 1-byte reg. addr. */
#define I2C_FUNC_SMBUS_READ_I2C_BLOCK_2 0x10000000 /* I2C-like block xfer */
#define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK_2 0x20000000 /* w/ 2-byte reg. addr. */
#define I2C_FUNC_SMBUS_BYTE (I2C_FUNC_SMBUS_READ_BYTE | \ #define I2C_FUNC_SMBUS_BYTE (I2C_FUNC_SMBUS_READ_BYTE | \
I2C_FUNC_SMBUS_WRITE_BYTE) I2C_FUNC_SMBUS_WRITE_BYTE)
...@@ -554,8 +555,6 @@ struct i2c_msg { ...@@ -554,8 +555,6 @@ struct i2c_msg {
I2C_FUNC_SMBUS_WRITE_BLOCK_DATA) I2C_FUNC_SMBUS_WRITE_BLOCK_DATA)
#define I2C_FUNC_SMBUS_I2C_BLOCK (I2C_FUNC_SMBUS_READ_I2C_BLOCK | \ #define I2C_FUNC_SMBUS_I2C_BLOCK (I2C_FUNC_SMBUS_READ_I2C_BLOCK | \
I2C_FUNC_SMBUS_WRITE_I2C_BLOCK) I2C_FUNC_SMBUS_WRITE_I2C_BLOCK)
#define I2C_FUNC_SMBUS_I2C_BLOCK_2 (I2C_FUNC_SMBUS_READ_I2C_BLOCK_2 | \
I2C_FUNC_SMBUS_WRITE_I2C_BLOCK_2)
#define I2C_FUNC_SMBUS_EMUL (I2C_FUNC_SMBUS_QUICK | \ #define I2C_FUNC_SMBUS_EMUL (I2C_FUNC_SMBUS_QUICK | \
I2C_FUNC_SMBUS_BYTE | \ I2C_FUNC_SMBUS_BYTE | \
...@@ -625,7 +624,7 @@ union i2c_smbus_data { ...@@ -625,7 +624,7 @@ union i2c_smbus_data {
static unsigned short var[I2C_CLIENT_MAX_OPTS] = I2C_CLIENT_DEFAULTS; \ static unsigned short var[I2C_CLIENT_MAX_OPTS] = I2C_CLIENT_DEFAULTS; \
static unsigned int var##_num; \ static unsigned int var##_num; \
module_param_array(var, short, &var##_num, 0); \ module_param_array(var, short, &var##_num, 0); \
MODULE_PARM_DESC(var,desc) MODULE_PARM_DESC(var, desc)
#define I2C_CLIENT_MODULE_PARM_FORCE(name) \ #define I2C_CLIENT_MODULE_PARM_FORCE(name) \
I2C_CLIENT_MODULE_PARM(force_##name, \ I2C_CLIENT_MODULE_PARM(force_##name, \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment