Commit 07d43ba9 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-core: Some style cleanups
  i2c-piix4: Add support for the Broadcom HT1100 chipset
  i2c-piix4: Add support to SB800 SMBus changes
  i2c-pca-platform: Use defaults if no platform_data given
  i2c-algo-pca: Use timeout for checking the state machine
  i2c-algo-pca: Rework waiting for a free bus
  i2c-algo-pca: Add PCA9665 support
  i2c: Adapt debug macros for KERN_* constants
  i2c-davinci: Fix timeout handling
  i2c: Adapter timeout is in jiffies
  i2c: Set a default timeout value for all adapters
  i2c: Add missing KERN_* constants to printks
  i2c-algo-pcf: Handle timeout correctly
  i2c-algo-pcf: Style cleanups
  eeprom/at24: Remove EXPERIMENTAL
  i2c-nforce2: Add support for MCP67, MCP73, MCP78S and MCP79
  i2c: Clarify which clients are auto-removed
  i2c: Let checkpatch shout on users of the legacy model
  i2c: Document the different ways to instantiate i2c devices
parents 0fe41b89 09b8ce0a
...@@ -340,7 +340,8 @@ Who: Krzysztof Piotr Oledzki <ole@ans.pl> ...@@ -340,7 +340,8 @@ Who: Krzysztof Piotr Oledzki <ole@ans.pl>
--------------------------- ---------------------------
What: i2c_attach_client(), i2c_detach_client(), i2c_driver->detach_client() What: i2c_attach_client(), i2c_detach_client(), i2c_driver->detach_client()
When: 2.6.29 (ideally) or 2.6.30 (more likely) When: 2.6.30
Check: i2c_attach_client i2c_detach_client
Why: Deprecated by the new (standard) device driver binding model. Use Why: Deprecated by the new (standard) device driver binding model. Use
i2c_driver->probe() and ->remove() instead. i2c_driver->probe() and ->remove() instead.
Who: Jean Delvare <khali@linux-fr.org> Who: Jean Delvare <khali@linux-fr.org>
......
...@@ -7,10 +7,14 @@ Supported adapters: ...@@ -7,10 +7,14 @@ Supported adapters:
* nForce3 250Gb MCP 10de:00E4 * nForce3 250Gb MCP 10de:00E4
* nForce4 MCP 10de:0052 * nForce4 MCP 10de:0052
* nForce4 MCP-04 10de:0034 * nForce4 MCP-04 10de:0034
* nForce4 MCP51 10de:0264 * nForce MCP51 10de:0264
* nForce4 MCP55 10de:0368 * nForce MCP55 10de:0368
* nForce4 MCP61 10de:03EB * nForce MCP61 10de:03EB
* nForce4 MCP65 10de:0446 * nForce MCP65 10de:0446
* nForce MCP67 10de:0542
* nForce MCP73 10de:07D8
* nForce MCP78S 10de:0752
* nForce MCP79 10de:0AA2
Datasheet: not publicly available, but seems to be similar to the Datasheet: not publicly available, but seems to be similar to the
AMD-8111 SMBus 2.0 adapter. AMD-8111 SMBus 2.0 adapter.
......
...@@ -4,7 +4,7 @@ Supported adapters: ...@@ -4,7 +4,7 @@ Supported adapters:
* Intel 82371AB PIIX4 and PIIX4E * Intel 82371AB PIIX4 and PIIX4E
* Intel 82443MX (440MX) * Intel 82443MX (440MX)
Datasheet: Publicly available at the Intel website Datasheet: Publicly available at the Intel website
* ServerWorks OSB4, CSB5, CSB6 and HT-1000 southbridges * ServerWorks OSB4, CSB5, CSB6, HT-1000 and HT-1100 southbridges
Datasheet: Only available via NDA from ServerWorks Datasheet: Only available via NDA from ServerWorks
* ATI IXP200, IXP300, IXP400, SB600, SB700 and SB800 southbridges * ATI IXP200, IXP300, IXP400, SB600, SB700 and SB800 southbridges
Datasheet: Not publicly available Datasheet: Not publicly available
......
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.
...@@ -207,15 +207,26 @@ You simply have to define a detect callback which will attempt to ...@@ -207,15 +207,26 @@ You simply have to define a detect callback which will attempt to
identify supported devices (returning 0 for supported ones and -ENODEV identify supported devices (returning 0 for supported ones and -ENODEV
for unsupported ones), a list of addresses to probe, and a device type for unsupported ones), a list of addresses to probe, and a device type
(or class) so that only I2C buses which may have that type of device (or class) so that only I2C buses which may have that type of device
connected (and not otherwise enumerated) will be probed. The i2c connected (and not otherwise enumerated) will be probed. For example,
core will then call you back as needed and will instantiate a device a driver for a hardware monitoring chip for which auto-detection is
for you for every successful detection. needed would set its class to I2C_CLASS_HWMON, and only I2C adapters
with a class including I2C_CLASS_HWMON would be probed by this driver.
Note that the absence of matching classes does not prevent the use of
a device of that type on the given I2C adapter. All it prevents is
auto-detection; explicit instantiation of devices is still possible.
Note that this mechanism is purely optional and not suitable for all Note that this mechanism is purely optional and not suitable for all
devices. You need some reliable way to identify the supported devices devices. You need some reliable way to identify the supported devices
(typically using device-specific, dedicated identification registers), (typically using device-specific, dedicated identification registers),
otherwise misdetections are likely to occur and things can get wrong otherwise misdetections are likely to occur and things can get wrong
quickly. quickly. Keep in mind that the I2C protocol doesn't include any
standard way to detect the presence of a chip at a given address, let
alone a standard way to identify devices. Even worse is the lack of
semantics associated to bus transfers, which means that the same
transfer can be seen as a read operation by a chip and as a write
operation by another chip. For these reasons, explicit device
instantiation should always be preferred to auto-detection where
possible.
Device Deletion Device Deletion
......
...@@ -229,7 +229,7 @@ static struct resource i2c_resources[] = { ...@@ -229,7 +229,7 @@ static struct resource i2c_resources[] = {
static struct i2c_pca9564_pf_platform_data i2c_platform_data = { static struct i2c_pca9564_pf_platform_data i2c_platform_data = {
.gpio = 0, .gpio = 0,
.i2c_clock_speed = I2C_PCA_CON_330kHz, .i2c_clock_speed = I2C_PCA_CON_330kHz,
.timeout = 100, .timeout = HZ,
}; };
static struct platform_device i2c_device = { static struct platform_device i2c_device = {
......
...@@ -604,9 +604,7 @@ static int i2c_bit_prepare_bus(struct i2c_adapter *adap) ...@@ -604,9 +604,7 @@ static int i2c_bit_prepare_bus(struct i2c_adapter *adap)
/* register new adapter to i2c module... */ /* register new adapter to i2c module... */
adap->algo = &i2c_bit_algo; adap->algo = &i2c_bit_algo;
adap->retries = 3;
adap->timeout = 100; /* default values, should */
adap->retries = 3; /* be replaced by defines */
return 0; return 0;
} }
......
This diff is collapsed.
This diff is collapsed.
...@@ -132,6 +132,7 @@ config I2C_PIIX4 ...@@ -132,6 +132,7 @@ config I2C_PIIX4
Serverworks CSB5 Serverworks CSB5
Serverworks CSB6 Serverworks CSB6
Serverworks HT-1000 Serverworks HT-1000
Serverworks HT-1100
SMSC Victory66 SMSC Victory66
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
...@@ -617,12 +618,12 @@ config I2C_ELEKTOR ...@@ -617,12 +618,12 @@ config I2C_ELEKTOR
will be called i2c-elektor. will be called i2c-elektor.
config I2C_PCA_ISA config I2C_PCA_ISA
tristate "PCA9564 on an ISA bus" tristate "PCA9564/PCA9665 on an ISA bus"
depends on ISA depends on ISA
select I2C_ALGOPCA select I2C_ALGOPCA
default n default n
help help
This driver supports ISA boards using the Philips PCA9564 This driver supports ISA boards using the Philips PCA9564/PCA9665
parallel bus to I2C bus controller. parallel bus to I2C bus controller.
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
...@@ -634,11 +635,11 @@ config I2C_PCA_ISA ...@@ -634,11 +635,11 @@ config I2C_PCA_ISA
time). If unsure, say N. time). If unsure, say N.
config I2C_PCA_PLATFORM config I2C_PCA_PLATFORM
tristate "PCA9564 as platform device" tristate "PCA9564/PCA9665 as platform device"
select I2C_ALGOPCA select I2C_ALGOPCA
default n default n
help help
This driver supports a memory mapped Philips PCA9564 This driver supports a memory mapped Philips PCA9564/PCA9665
parallel bus to I2C bus controller. parallel bus to I2C bus controller.
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
......
...@@ -216,7 +216,7 @@ static int i2c_davinci_wait_bus_not_busy(struct davinci_i2c_dev *dev, ...@@ -216,7 +216,7 @@ static int i2c_davinci_wait_bus_not_busy(struct davinci_i2c_dev *dev,
{ {
unsigned long timeout; unsigned long timeout;
timeout = jiffies + DAVINCI_I2C_TIMEOUT; timeout = jiffies + dev->adapter.timeout;
while (davinci_i2c_read_reg(dev, DAVINCI_I2C_STR_REG) while (davinci_i2c_read_reg(dev, DAVINCI_I2C_STR_REG)
& DAVINCI_I2C_STR_BB) { & DAVINCI_I2C_STR_BB) {
if (time_after(jiffies, timeout)) { if (time_after(jiffies, timeout)) {
...@@ -289,7 +289,7 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop) ...@@ -289,7 +289,7 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop)
davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag); davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag);
r = wait_for_completion_interruptible_timeout(&dev->cmd_complete, r = wait_for_completion_interruptible_timeout(&dev->cmd_complete,
DAVINCI_I2C_TIMEOUT); dev->adapter.timeout);
if (r == 0) { if (r == 0) {
dev_err(dev->dev, "controller timed out\n"); dev_err(dev->dev, "controller timed out\n");
i2c_davinci_init(dev); i2c_davinci_init(dev);
...@@ -546,9 +546,7 @@ static int davinci_i2c_probe(struct platform_device *pdev) ...@@ -546,9 +546,7 @@ static int davinci_i2c_probe(struct platform_device *pdev)
strlcpy(adap->name, "DaVinci I2C adapter", sizeof(adap->name)); strlcpy(adap->name, "DaVinci I2C adapter", sizeof(adap->name));
adap->algo = &i2c_davinci_algo; adap->algo = &i2c_davinci_algo;
adap->dev.parent = &pdev->dev; adap->dev.parent = &pdev->dev;
adap->timeout = DAVINCI_I2C_TIMEOUT;
/* FIXME */
adap->timeout = 1;
adap->nr = pdev->id; adap->nr = pdev->id;
r = i2c_add_numbered_adapter(adap); r = i2c_add_numbered_adapter(adap);
......
...@@ -415,7 +415,7 @@ static int iic_wait_for_tc(struct ibm_iic_private* dev){ ...@@ -415,7 +415,7 @@ static int iic_wait_for_tc(struct ibm_iic_private* dev){
if (dev->irq >= 0){ if (dev->irq >= 0){
/* Interrupt mode */ /* Interrupt mode */
ret = wait_event_interruptible_timeout(dev->wq, ret = wait_event_interruptible_timeout(dev->wq,
!(in_8(&iic->sts) & STS_PT), dev->adap.timeout * HZ); !(in_8(&iic->sts) & STS_PT), dev->adap.timeout);
if (unlikely(ret < 0)) if (unlikely(ret < 0))
DBG("%d: wait interrupted\n", dev->idx); DBG("%d: wait interrupted\n", dev->idx);
...@@ -426,7 +426,7 @@ static int iic_wait_for_tc(struct ibm_iic_private* dev){ ...@@ -426,7 +426,7 @@ static int iic_wait_for_tc(struct ibm_iic_private* dev){
} }
else { else {
/* Polling mode */ /* Polling mode */
unsigned long x = jiffies + dev->adap.timeout * HZ; unsigned long x = jiffies + dev->adap.timeout;
while (in_8(&iic->sts) & STS_PT){ while (in_8(&iic->sts) & STS_PT){
if (unlikely(time_after(jiffies, x))){ if (unlikely(time_after(jiffies, x))){
...@@ -748,7 +748,7 @@ static int __devinit iic_probe(struct of_device *ofdev, ...@@ -748,7 +748,7 @@ static int __devinit iic_probe(struct of_device *ofdev,
i2c_set_adapdata(adap, dev); i2c_set_adapdata(adap, dev);
adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
adap->algo = &iic_algo; adap->algo = &iic_algo;
adap->timeout = 1; adap->timeout = HZ;
ret = i2c_add_adapter(adap); ret = i2c_add_adapter(adap);
if (ret < 0) { if (ret < 0) {
......
...@@ -488,7 +488,7 @@ iop3xx_i2c_probe(struct platform_device *pdev) ...@@ -488,7 +488,7 @@ iop3xx_i2c_probe(struct platform_device *pdev)
/* /*
* Default values...should these come in from board code? * Default values...should these come in from board code?
*/ */
new_adapter->timeout = 100; new_adapter->timeout = HZ;
new_adapter->algo = &iop3xx_i2c_algo; new_adapter->algo = &iop3xx_i2c_algo;
init_waitqueue_head(&adapter_data->waitq); init_waitqueue_head(&adapter_data->waitq);
......
...@@ -116,7 +116,7 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing) ...@@ -116,7 +116,7 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing)
} else { } else {
/* Interrupt mode */ /* Interrupt mode */
result = wait_event_interruptible_timeout(i2c->queue, result = wait_event_interruptible_timeout(i2c->queue,
(i2c->interrupt & CSR_MIF), timeout * HZ); (i2c->interrupt & CSR_MIF), timeout);
if (unlikely(result < 0)) { if (unlikely(result < 0)) {
pr_debug("I2C: wait interrupted\n"); pr_debug("I2C: wait interrupted\n");
...@@ -311,7 +311,7 @@ static struct i2c_adapter mpc_ops = { ...@@ -311,7 +311,7 @@ static struct i2c_adapter mpc_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = "MPC adapter", .name = "MPC adapter",
.algo = &mpc_algo, .algo = &mpc_algo,
.timeout = 1, .timeout = HZ,
}; };
static int __devinit fsl_i2c_probe(struct of_device *op, const struct of_device_id *match) static int __devinit fsl_i2c_probe(struct of_device *op, const struct of_device_id *match)
......
...@@ -358,7 +358,7 @@ mv64xxx_i2c_wait_for_completion(struct mv64xxx_i2c_data *drv_data) ...@@ -358,7 +358,7 @@ mv64xxx_i2c_wait_for_completion(struct mv64xxx_i2c_data *drv_data)
char abort = 0; char abort = 0;
time_left = wait_event_interruptible_timeout(drv_data->waitq, time_left = wait_event_interruptible_timeout(drv_data->waitq,
!drv_data->block, msecs_to_jiffies(drv_data->adapter.timeout)); !drv_data->block, drv_data->adapter.timeout);
spin_lock_irqsave(&drv_data->lock, flags); spin_lock_irqsave(&drv_data->lock, flags);
if (!time_left) { /* Timed out */ if (!time_left) { /* Timed out */
...@@ -374,8 +374,7 @@ mv64xxx_i2c_wait_for_completion(struct mv64xxx_i2c_data *drv_data) ...@@ -374,8 +374,7 @@ mv64xxx_i2c_wait_for_completion(struct mv64xxx_i2c_data *drv_data)
spin_unlock_irqrestore(&drv_data->lock, flags); spin_unlock_irqrestore(&drv_data->lock, flags);
time_left = wait_event_timeout(drv_data->waitq, time_left = wait_event_timeout(drv_data->waitq,
!drv_data->block, !drv_data->block, drv_data->adapter.timeout);
msecs_to_jiffies(drv_data->adapter.timeout));
if ((time_left <= 0) && drv_data->block) { if ((time_left <= 0) && drv_data->block) {
drv_data->state = MV64XXX_I2C_STATE_IDLE; drv_data->state = MV64XXX_I2C_STATE_IDLE;
...@@ -530,7 +529,7 @@ mv64xxx_i2c_probe(struct platform_device *pd) ...@@ -530,7 +529,7 @@ mv64xxx_i2c_probe(struct platform_device *pd)
drv_data->adapter.algo = &mv64xxx_i2c_algo; drv_data->adapter.algo = &mv64xxx_i2c_algo;
drv_data->adapter.owner = THIS_MODULE; drv_data->adapter.owner = THIS_MODULE;
drv_data->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_SPD; drv_data->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
drv_data->adapter.timeout = pdata->timeout; drv_data->adapter.timeout = msecs_to_jiffies(pdata->timeout);
drv_data->adapter.nr = pd->id; drv_data->adapter.nr = pd->id;
platform_set_drvdata(pd, drv_data); platform_set_drvdata(pd, drv_data);
i2c_set_adapdata(&drv_data->adapter, drv_data); i2c_set_adapdata(&drv_data->adapter, drv_data);
......
...@@ -31,10 +31,14 @@ ...@@ -31,10 +31,14 @@
nForce3 250Gb MCP 00E4 nForce3 250Gb MCP 00E4
nForce4 MCP 0052 nForce4 MCP 0052
nForce4 MCP-04 0034 nForce4 MCP-04 0034
nForce4 MCP51 0264 nForce MCP51 0264
nForce4 MCP55 0368 nForce MCP55 0368
nForce MCP61 03EB nForce MCP61 03EB
nForce MCP65 0446 nForce MCP65 0446
nForce MCP67 0542
nForce MCP73 07D8
nForce MCP78S 0752
nForce MCP79 0AA2
This driver supports the 2 SMBuses that are included in the MCP of the This driver supports the 2 SMBuses that are included in the MCP of the
nForce2/3/4/5xx chipsets. nForce2/3/4/5xx chipsets.
...@@ -315,6 +319,10 @@ static struct pci_device_id nforce2_ids[] = { ...@@ -315,6 +319,10 @@ static struct pci_device_id nforce2_ids[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SMBUS) }, { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SMBUS) },
{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SMBUS) }, { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SMBUS) },
{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_SMBUS) }, { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_SMBUS) },
{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_SMBUS) },
{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_SMBUS) },
{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP78S_SMBUS) },
{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP79_SMBUS) },
{ 0 } { 0 }
}; };
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/jiffies.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/wait.h> #include <linux/wait.h>
...@@ -41,15 +42,17 @@ static int irq = -1; ...@@ -41,15 +42,17 @@ static int irq = -1;
/* Data sheet recommends 59kHz for 100kHz operation due to variation /* Data sheet recommends 59kHz for 100kHz operation due to variation
* in the actual clock rate */ * in the actual clock rate */
static int clock = I2C_PCA_CON_59kHz; static int clock = 59000;
static struct i2c_adapter pca_isa_ops;
static wait_queue_head_t pca_wait; static wait_queue_head_t pca_wait;
static void pca_isa_writebyte(void *pd, int reg, int val) static void pca_isa_writebyte(void *pd, int reg, int val)
{ {
#ifdef DEBUG_IO #ifdef DEBUG_IO
static char *names[] = { "T/O", "DAT", "ADR", "CON" }; static char *names[] = { "T/O", "DAT", "ADR", "CON" };
printk("*** write %s at %#lx <= %#04x\n", names[reg], base+reg, val); printk(KERN_DEBUG "*** write %s at %#lx <= %#04x\n", names[reg],
base+reg, val);
#endif #endif
outb(val, base+reg); outb(val, base+reg);
} }
...@@ -60,7 +63,7 @@ static int pca_isa_readbyte(void *pd, int reg) ...@@ -60,7 +63,7 @@ static int pca_isa_readbyte(void *pd, int reg)
#ifdef DEBUG_IO #ifdef DEBUG_IO
{ {
static char *names[] = { "STA", "DAT", "ADR", "CON" }; static char *names[] = { "STA", "DAT", "ADR", "CON" };
printk("*** read %s => %#04x\n", names[reg], res); printk(KERN_DEBUG "*** read %s => %#04x\n", names[reg], res);
} }
#endif #endif
return res; return res;
...@@ -68,16 +71,22 @@ static int pca_isa_readbyte(void *pd, int reg) ...@@ -68,16 +71,22 @@ static int pca_isa_readbyte(void *pd, int reg)
static int pca_isa_waitforcompletion(void *pd) static int pca_isa_waitforcompletion(void *pd)
{ {
int ret = 0; long ret = ~0;
unsigned long timeout;
if (irq > -1) { if (irq > -1) {
ret = wait_event_interruptible(pca_wait, ret = wait_event_interruptible_timeout(pca_wait,
pca_isa_readbyte(pd, I2C_PCA_CON) & I2C_PCA_CON_SI); pca_isa_readbyte(pd, I2C_PCA_CON)
& I2C_PCA_CON_SI, pca_isa_ops.timeout);
} else { } else {
while ((pca_isa_readbyte(pd, I2C_PCA_CON) & I2C_PCA_CON_SI) == 0) /* Do polling */
timeout = jiffies + pca_isa_ops.timeout;
while (((pca_isa_readbyte(pd, I2C_PCA_CON)
& I2C_PCA_CON_SI) == 0)
&& (ret = time_before(jiffies, timeout)))
udelay(100); udelay(100);
} }
return ret; return ret > 0;
} }
static void pca_isa_resetchip(void *pd) static void pca_isa_resetchip(void *pd)
...@@ -102,8 +111,8 @@ static struct i2c_algo_pca_data pca_isa_data = { ...@@ -102,8 +111,8 @@ static struct i2c_algo_pca_data pca_isa_data = {
static struct i2c_adapter pca_isa_ops = { static struct i2c_adapter pca_isa_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.algo_data = &pca_isa_data, .algo_data = &pca_isa_data,
.name = "PCA9564 ISA Adapter", .name = "PCA9564/PCA9665 ISA Adapter",
.timeout = 100, .timeout = HZ,
}; };
static int __devinit pca_isa_match(struct device *dev, unsigned int id) static int __devinit pca_isa_match(struct device *dev, unsigned int id)
...@@ -195,7 +204,7 @@ static void __exit pca_isa_exit(void) ...@@ -195,7 +204,7 @@ static void __exit pca_isa_exit(void)
} }
MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>"); MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>");
MODULE_DESCRIPTION("ISA base PCA9564 driver"); MODULE_DESCRIPTION("ISA base PCA9564/PCA9665 driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
module_param(base, ulong, 0); module_param(base, ulong, 0);
...@@ -204,7 +213,13 @@ MODULE_PARM_DESC(base, "I/O base address"); ...@@ -204,7 +213,13 @@ MODULE_PARM_DESC(base, "I/O base address");
module_param(irq, int, 0); module_param(irq, int, 0);
MODULE_PARM_DESC(irq, "IRQ"); MODULE_PARM_DESC(irq, "IRQ");
module_param(clock, int, 0); module_param(clock, int, 0);
MODULE_PARM_DESC(clock, "Clock rate as described in table 1 of PCA9564 datasheet"); MODULE_PARM_DESC(clock, "Clock rate in hertz.\n\t\t"
"For PCA9564: 330000,288000,217000,146000,"
"88000,59000,44000,36000\n"
"\t\tFor PCA9665:\tStandard: 60300 - 100099\n"
"\t\t\t\tFast: 100100 - 400099\n"
"\t\t\t\tFast+: 400100 - 10000099\n"
"\t\t\t\tTurbo: Up to 1265800");
module_init(pca_isa_init); module_init(pca_isa_init);
module_exit(pca_isa_exit); module_exit(pca_isa_exit);
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/jiffies.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
...@@ -81,24 +82,23 @@ static void i2c_pca_pf_writebyte32(void *pd, int reg, int val) ...@@ -81,24 +82,23 @@ static void i2c_pca_pf_writebyte32(void *pd, int reg, int val)
static int i2c_pca_pf_waitforcompletion(void *pd) static int i2c_pca_pf_waitforcompletion(void *pd)
{ {
struct i2c_pca_pf_data *i2c = pd; struct i2c_pca_pf_data *i2c = pd;
int ret = 0; long ret = ~0;
unsigned long timeout;
if (i2c->irq) { if (i2c->irq) {
ret = wait_event_interruptible(i2c->wait, ret = wait_event_interruptible_timeout(i2c->wait,
i2c->algo_data.read_byte(i2c, I2C_PCA_CON) i2c->algo_data.read_byte(i2c, I2C_PCA_CON)
& I2C_PCA_CON_SI); & I2C_PCA_CON_SI, i2c->adap.timeout);
} else { } else {
/* /* Do polling */
* Do polling... timeout = jiffies + i2c->adap.timeout;
* XXX: Could get stuck in extreme cases! while (((i2c->algo_data.read_byte(i2c, I2C_PCA_CON)
* Maybe add timeout, but using irqs is preferred anyhow.
*/
while ((i2c->algo_data.read_byte(i2c, I2C_PCA_CON)
& I2C_PCA_CON_SI) == 0) & I2C_PCA_CON_SI) == 0)
&& (ret = time_before(jiffies, timeout)))
udelay(100); udelay(100);
} }
return ret; return ret > 0;
} }
static void i2c_pca_pf_dummyreset(void *pd) static void i2c_pca_pf_dummyreset(void *pd)
...@@ -172,14 +172,25 @@ static int __devinit i2c_pca_pf_probe(struct platform_device *pdev) ...@@ -172,14 +172,25 @@ static int __devinit i2c_pca_pf_probe(struct platform_device *pdev)
i2c->adap.nr = pdev->id >= 0 ? pdev->id : 0; i2c->adap.nr = pdev->id >= 0 ? pdev->id : 0;
i2c->adap.owner = THIS_MODULE; i2c->adap.owner = THIS_MODULE;
snprintf(i2c->adap.name, sizeof(i2c->adap.name), "PCA9564 at 0x%08lx", snprintf(i2c->adap.name, sizeof(i2c->adap.name),
"PCA9564/PCA9665 at 0x%08lx",
(unsigned long) res->start); (unsigned long) res->start);
i2c->adap.algo_data = &i2c->algo_data; i2c->adap.algo_data = &i2c->algo_data;
i2c->adap.dev.parent = &pdev->dev; i2c->adap.dev.parent = &pdev->dev;
i2c->adap.timeout = platform_data->timeout;
if (platform_data) {
i2c->adap.timeout = platform_data->timeout;
i2c->algo_data.i2c_clock = platform_data->i2c_clock_speed; i2c->algo_data.i2c_clock = platform_data->i2c_clock_speed;
i2c->gpio = platform_data->gpio;
} else {
i2c->adap.timeout = HZ;
i2c->algo_data.i2c_clock = 59000;
i2c->gpio = -1;
}
i2c->algo_data.data = i2c; i2c->algo_data.data = i2c;
i2c->algo_data.wait_for_completion = i2c_pca_pf_waitforcompletion;
i2c->algo_data.reset_chip = i2c_pca_pf_dummyreset;
switch (res->flags & IORESOURCE_MEM_TYPE_MASK) { switch (res->flags & IORESOURCE_MEM_TYPE_MASK) {
case IORESOURCE_MEM_32BIT: case IORESOURCE_MEM_32BIT:
...@@ -197,11 +208,6 @@ static int __devinit i2c_pca_pf_probe(struct platform_device *pdev) ...@@ -197,11 +208,6 @@ static int __devinit i2c_pca_pf_probe(struct platform_device *pdev)
break; break;
} }
i2c->algo_data.wait_for_completion = i2c_pca_pf_waitforcompletion;
i2c->gpio = platform_data->gpio;
i2c->algo_data.reset_chip = i2c_pca_pf_dummyreset;
/* Use gpio_is_valid() when in mainline */ /* Use gpio_is_valid() when in mainline */
if (i2c->gpio > -1) { if (i2c->gpio > -1) {
ret = gpio_request(i2c->gpio, i2c->adap.name); ret = gpio_request(i2c->gpio, i2c->adap.name);
...@@ -246,7 +252,7 @@ static int __devinit i2c_pca_pf_probe(struct platform_device *pdev) ...@@ -246,7 +252,7 @@ static int __devinit i2c_pca_pf_probe(struct platform_device *pdev)
e_alloc: e_alloc:
release_mem_region(res->start, res_len(res)); release_mem_region(res->start, res_len(res));
e_print: e_print:
printk(KERN_ERR "Registering PCA9564 FAILED! (%d)\n", ret); printk(KERN_ERR "Registering PCA9564/PCA9665 FAILED! (%d)\n", ret);
return ret; return ret;
} }
...@@ -290,7 +296,7 @@ static void __exit i2c_pca_pf_exit(void) ...@@ -290,7 +296,7 @@ static void __exit i2c_pca_pf_exit(void)
} }
MODULE_AUTHOR("Wolfram Sang <w.sang@pengutronix.de>"); MODULE_AUTHOR("Wolfram Sang <w.sang@pengutronix.de>");
MODULE_DESCRIPTION("I2C-PCA9564 platform driver"); MODULE_DESCRIPTION("I2C-PCA9564/PCA9665 platform driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
module_init(i2c_pca_pf_init); module_init(i2c_pca_pf_init);
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
/* /*
Supports: Supports:
Intel PIIX4, 440MX Intel PIIX4, 440MX
Serverworks OSB4, CSB5, CSB6, HT-1000 Serverworks OSB4, CSB5, CSB6, HT-1000, HT-1100
ATI IXP200, IXP300, IXP400, SB600, SB700, SB800 ATI IXP200, IXP300, IXP400, SB600, SB700, SB800
SMSC Victory66 SMSC Victory66
...@@ -226,6 +226,70 @@ static int __devinit piix4_setup(struct pci_dev *PIIX4_dev, ...@@ -226,6 +226,70 @@ static int __devinit piix4_setup(struct pci_dev *PIIX4_dev,
return 0; return 0;
} }
static int __devinit piix4_setup_sb800(struct pci_dev *PIIX4_dev,
const struct pci_device_id *id)
{
unsigned short smba_idx = 0xcd6;
u8 smba_en_lo, smba_en_hi, i2ccfg, i2ccfg_offset = 0x10, smb_en = 0x2c;
/* SB800 SMBus does not support forcing address */
if (force || force_addr) {
dev_err(&PIIX4_dev->dev, "SB800 SMBus does not support "
"forcing address!\n");
return -EINVAL;
}
/* Determine the address of the SMBus areas */
if (!request_region(smba_idx, 2, "smba_idx")) {
dev_err(&PIIX4_dev->dev, "SMBus base address index region "
"0x%x already in use!\n", smba_idx);
return -EBUSY;
}
outb_p(smb_en, smba_idx);
smba_en_lo = inb_p(smba_idx + 1);
outb_p(smb_en + 1, smba_idx);
smba_en_hi = inb_p(smba_idx + 1);
release_region(smba_idx, 2);
if ((smba_en_lo & 1) == 0) {
dev_err(&PIIX4_dev->dev,
"Host SMBus controller not enabled!\n");
return -ENODEV;
}
piix4_smba = ((smba_en_hi << 8) | smba_en_lo) & 0xffe0;
if (acpi_check_region(piix4_smba, SMBIOSIZE, piix4_driver.name))
return -EBUSY;
if (!request_region(piix4_smba, SMBIOSIZE, piix4_driver.name)) {
dev_err(&PIIX4_dev->dev, "SMBus region 0x%x already in use!\n",
piix4_smba);
return -EBUSY;
}
/* Request the SMBus I2C bus config region */
if (!request_region(piix4_smba + i2ccfg_offset, 1, "i2ccfg")) {
dev_err(&PIIX4_dev->dev, "SMBus I2C bus config region "
"0x%x already in use!\n", piix4_smba + i2ccfg_offset);
release_region(piix4_smba, SMBIOSIZE);
piix4_smba = 0;
return -EBUSY;
}
i2ccfg = inb_p(piix4_smba + i2ccfg_offset);
release_region(piix4_smba + i2ccfg_offset, 1);
if (i2ccfg & 1)
dev_dbg(&PIIX4_dev->dev, "Using IRQ for SMBus.\n");
else
dev_dbg(&PIIX4_dev->dev, "Using SMI# for SMBus.\n");
dev_info(&PIIX4_dev->dev,
"SMBus Host Controller at 0x%x, revision %d\n",
piix4_smba, i2ccfg >> 4);
return 0;
}
static int piix4_transaction(void) static int piix4_transaction(void)
{ {
int temp; int temp;
...@@ -423,6 +487,8 @@ static struct pci_device_id piix4_ids[] = { ...@@ -423,6 +487,8 @@ static struct pci_device_id piix4_ids[] = {
PCI_DEVICE_ID_SERVERWORKS_CSB6) }, PCI_DEVICE_ID_SERVERWORKS_CSB6) },
{ PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS,
PCI_DEVICE_ID_SERVERWORKS_HT1000SB) }, PCI_DEVICE_ID_SERVERWORKS_HT1000SB) },
{ PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS,
PCI_DEVICE_ID_SERVERWORKS_HT1100LD) },
{ 0, } { 0, }
}; };
...@@ -433,7 +499,14 @@ static int __devinit piix4_probe(struct pci_dev *dev, ...@@ -433,7 +499,14 @@ static int __devinit piix4_probe(struct pci_dev *dev,
{ {
int retval; int retval;
if ((dev->vendor == PCI_VENDOR_ID_ATI) &&
(dev->device == PCI_DEVICE_ID_ATI_SBX00_SMBUS) &&
(dev->revision >= 0x40))
/* base address location etc changed in SB800 */
retval = piix4_setup_sb800(dev, id);
else
retval = piix4_setup(dev, id); retval = piix4_setup(dev, id);
if (retval) if (retval)
return retval; return retval;
......
...@@ -191,7 +191,8 @@ static int __devexit i2c_powermac_remove(struct platform_device *dev) ...@@ -191,7 +191,8 @@ static int __devexit i2c_powermac_remove(struct platform_device *dev)
i2c_set_adapdata(adapter, NULL); i2c_set_adapdata(adapter, NULL);
/* We aren't that prepared to deal with this... */ /* We aren't that prepared to deal with this... */
if (rc) if (rc)
printk("i2c-powermac.c: Failed to remove bus %s !\n", printk(KERN_WARNING
"i2c-powermac.c: Failed to remove bus %s !\n",
adapter->name); adapter->name);
platform_set_drvdata(dev, NULL); platform_set_drvdata(dev, NULL);
kfree(adapter); kfree(adapter);
......
...@@ -210,11 +210,12 @@ static irqreturn_t i2c_pxa_handler(int this_irq, void *dev_id); ...@@ -210,11 +210,12 @@ static irqreturn_t i2c_pxa_handler(int this_irq, void *dev_id);
static void i2c_pxa_scream_blue_murder(struct pxa_i2c *i2c, const char *why) static void i2c_pxa_scream_blue_murder(struct pxa_i2c *i2c, const char *why)
{ {
unsigned int i; unsigned int i;
printk("i2c: error: %s\n", why); printk(KERN_ERR "i2c: error: %s\n", why);
printk("i2c: msg_num: %d msg_idx: %d msg_ptr: %d\n", printk(KERN_ERR "i2c: msg_num: %d msg_idx: %d msg_ptr: %d\n",
i2c->msg_num, i2c->msg_idx, i2c->msg_ptr); i2c->msg_num, i2c->msg_idx, i2c->msg_ptr);
printk("i2c: ICR: %08x ISR: %08x\n" printk(KERN_ERR "i2c: ICR: %08x ISR: %08x\n",
"i2c: log: ", readl(_ICR(i2c)), readl(_ISR(i2c))); readl(_ICR(i2c)), readl(_ISR(i2c)));
printk(KERN_DEBUG "i2c: log: ");
for (i = 0; i < i2c->irqlogidx; i++) for (i = 0; i < i2c->irqlogidx; i++)
printk("[%08x:%08x] ", i2c->isrlog[i], i2c->icrlog[i]); printk("[%08x:%08x] ", i2c->isrlog[i], i2c->icrlog[i]);
printk("\n"); printk("\n");
......
...@@ -152,7 +152,7 @@ static void i2c_device_shutdown(struct device *dev) ...@@ -152,7 +152,7 @@ static void i2c_device_shutdown(struct device *dev)
driver->shutdown(to_i2c_client(dev)); driver->shutdown(to_i2c_client(dev));
} }
static int i2c_device_suspend(struct device * dev, pm_message_t mesg) static int i2c_device_suspend(struct device *dev, pm_message_t mesg)
{ {
struct i2c_driver *driver; struct i2c_driver *driver;
...@@ -164,7 +164,7 @@ static int i2c_device_suspend(struct device * dev, pm_message_t mesg) ...@@ -164,7 +164,7 @@ static int i2c_device_suspend(struct device * dev, pm_message_t mesg)
return driver->suspend(to_i2c_client(dev), mesg); return driver->suspend(to_i2c_client(dev), mesg);
} }
static int i2c_device_resume(struct device * dev) static int i2c_device_resume(struct device *dev)
{ {
struct i2c_driver *driver; struct i2c_driver *driver;
...@@ -187,13 +187,15 @@ static void i2c_client_dev_release(struct device *dev) ...@@ -187,13 +187,15 @@ static void i2c_client_dev_release(struct device *dev)
kfree(to_i2c_client(dev)); kfree(to_i2c_client(dev));
} }
static ssize_t show_client_name(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t
show_client_name(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
return sprintf(buf, "%s\n", client->name); return sprintf(buf, "%s\n", client->name);
} }
static ssize_t show_modalias(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t
show_modalias(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
return sprintf(buf, "%s%s\n", I2C_MODULE_PREFIX, client->name); return sprintf(buf, "%s%s\n", I2C_MODULE_PREFIX, client->name);
...@@ -365,8 +367,7 @@ static struct i2c_driver dummy_driver = { ...@@ -365,8 +367,7 @@ static struct i2c_driver dummy_driver = {
* This returns the new i2c client, which should be saved for later use with * This returns the new i2c client, which should be saved for later use with
* i2c_unregister_device(); or NULL to indicate an error. * i2c_unregister_device(); or NULL to indicate an error.
*/ */
struct i2c_client * struct i2c_client *i2c_new_dummy(struct i2c_adapter *adapter, u16 address)
i2c_new_dummy(struct i2c_adapter *adapter, u16 address)
{ {
struct i2c_board_info info = { struct i2c_board_info info = {
I2C_BOARD_INFO("dummy", address), I2C_BOARD_INFO("dummy", address),
...@@ -413,8 +414,8 @@ static void i2c_scan_static_board_info(struct i2c_adapter *adapter) ...@@ -413,8 +414,8 @@ static void i2c_scan_static_board_info(struct i2c_adapter *adapter)
if (devinfo->busnum == adapter->nr if (devinfo->busnum == adapter->nr
&& !i2c_new_device(adapter, && !i2c_new_device(adapter,
&devinfo->board_info)) &devinfo->board_info))
printk(KERN_ERR "i2c-core: can't create i2c%d-%04x\n", dev_err(&adapter->dev,
i2c_adapter_id(adapter), "Can't create device at 0x%02x\n",
devinfo->board_info.addr); devinfo->board_info.addr);
} }
mutex_unlock(&__i2c_board_lock); mutex_unlock(&__i2c_board_lock);
...@@ -459,6 +460,11 @@ static int i2c_register_adapter(struct i2c_adapter *adap) ...@@ -459,6 +460,11 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
pr_debug("I2C adapter driver [%s] forgot to specify " pr_debug("I2C adapter driver [%s] forgot to specify "
"physical device\n", adap->name); "physical device\n", adap->name);
} }
/* Set default timeout to 1 second if not already set */
if (adap->timeout == 0)
adap->timeout = HZ;
dev_set_name(&adap->dev, "i2c-%d", adap->nr); dev_set_name(&adap->dev, "i2c-%d", adap->nr);
adap->dev.release = &i2c_adapter_dev_release; adap->dev.release = &i2c_adapter_dev_release;
adap->dev.class = &i2c_adapter_class; adap->dev.class = &i2c_adapter_class;
...@@ -581,7 +587,8 @@ static int i2c_do_del_adapter(struct device_driver *d, void *data) ...@@ -581,7 +587,8 @@ static int i2c_do_del_adapter(struct device_driver *d, void *data)
struct i2c_client *client, *_n; struct i2c_client *client, *_n;
int res; int res;
/* Remove the devices we created ourselves */ /* Remove the devices we created ourselves as the result of hardware
* probing (using a driver's detect method) */
list_for_each_entry_safe(client, _n, &driver->clients, detected) { list_for_each_entry_safe(client, _n, &driver->clients, detected) {
if (client->adapter == adapter) { if (client->adapter == adapter) {
dev_dbg(&adapter->dev, "Removing %s at 0x%x\n", dev_dbg(&adapter->dev, "Removing %s at 0x%x\n",
...@@ -749,6 +756,8 @@ static int __detach_adapter(struct device *dev, void *data) ...@@ -749,6 +756,8 @@ static int __detach_adapter(struct device *dev, void *data)
struct i2c_driver *driver = data; struct i2c_driver *driver = data;
struct i2c_client *client, *_n; struct i2c_client *client, *_n;
/* Remove the devices we created ourselves as the result of hardware
* probing (using a driver's detect method) */
list_for_each_entry_safe(client, _n, &driver->clients, detected) { list_for_each_entry_safe(client, _n, &driver->clients, detected) {
dev_dbg(&adapter->dev, "Removing %s at 0x%x\n", dev_dbg(&adapter->dev, "Removing %s at 0x%x\n",
client->name, client->addr); client->name, client->addr);
...@@ -1012,7 +1021,7 @@ module_exit(i2c_exit); ...@@ -1012,7 +1021,7 @@ module_exit(i2c_exit);
* Note that there is no requirement that each message be sent to * Note that there is no requirement that each message be sent to
* the same slave address, although that is the most common model. * the same slave address, although that is the most common model.
*/ */
int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num) int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
{ {
int ret; int ret;
...@@ -1519,8 +1528,7 @@ EXPORT_SYMBOL(i2c_put_adapter); ...@@ -1519,8 +1528,7 @@ EXPORT_SYMBOL(i2c_put_adapter);
/* The SMBus parts */ /* The SMBus parts */
#define POLY (0x1070U << 3) #define POLY (0x1070U << 3)
static u8 static u8 crc8(u16 data)
crc8(u16 data)
{ {
int i; int i;
...@@ -1984,9 +1992,9 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, ...@@ -1984,9 +1992,9 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr,
* This executes an SMBus protocol operation, and returns a negative * This executes an SMBus protocol operation, and returns a negative
* errno code else zero on success. * errno code else zero on success.
*/ */
s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u16 addr, unsigned short flags, s32 i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr, unsigned short flags,
char read_write, u8 command, int protocol, char read_write, u8 command, int protocol,
union i2c_smbus_data * data) union i2c_smbus_data *data)
{ {
s32 res; s32 res;
......
...@@ -2,7 +2,7 @@ menu "EEPROM support" ...@@ -2,7 +2,7 @@ menu "EEPROM support"
config EEPROM_AT24 config EEPROM_AT24
tristate "I2C EEPROMs from most vendors" tristate "I2C EEPROMs from most vendors"
depends on I2C && SYSFS && EXPERIMENTAL depends on I2C && SYSFS
help help
Enable this driver to get read/write support to most I2C EEPROMs, Enable this driver to get read/write support to most I2C EEPROMs,
after you configure the driver to know about each EEPROM on after you configure the driver to know about each EEPROM on
......
#ifndef _LINUX_I2C_ALGO_PCA_H #ifndef _LINUX_I2C_ALGO_PCA_H
#define _LINUX_I2C_ALGO_PCA_H #define _LINUX_I2C_ALGO_PCA_H
/* Clock speeds for the bus */ /* Chips known to the pca algo */
#define I2C_PCA_CHIP_9564 0x00
#define I2C_PCA_CHIP_9665 0x01
/* Internal period for PCA9665 oscilator */
#define I2C_PCA_OSC_PER 3 /* e10-8s */
/* Clock speeds for the bus for PCA9564*/
#define I2C_PCA_CON_330kHz 0x00 #define I2C_PCA_CON_330kHz 0x00
#define I2C_PCA_CON_288kHz 0x01 #define I2C_PCA_CON_288kHz 0x01
#define I2C_PCA_CON_217kHz 0x02 #define I2C_PCA_CON_217kHz 0x02
...@@ -18,6 +25,26 @@ ...@@ -18,6 +25,26 @@
#define I2C_PCA_ADR 0x02 /* OWN ADR Read/Write */ #define I2C_PCA_ADR 0x02 /* OWN ADR Read/Write */
#define I2C_PCA_CON 0x03 /* CONTROL Read/Write */ #define I2C_PCA_CON 0x03 /* CONTROL Read/Write */
/* PCA9665 registers */
#define I2C_PCA_INDPTR 0x00 /* INDIRECT Pointer Write Only */
#define I2C_PCA_IND 0x02 /* INDIRECT Read/Write */
/* PCA9665 indirect registers */
#define I2C_PCA_ICOUNT 0x00 /* Byte Count for buffered mode */
#define I2C_PCA_IADR 0x01 /* OWN ADR */
#define I2C_PCA_ISCLL 0x02 /* SCL LOW period */
#define I2C_PCA_ISCLH 0x03 /* SCL HIGH period */
#define I2C_PCA_ITO 0x04 /* TIMEOUT */
#define I2C_PCA_IPRESET 0x05 /* Parallel bus reset */
#define I2C_PCA_IMODE 0x06 /* I2C Bus mode */
/* PCA9665 I2C bus mode */
#define I2C_PCA_MODE_STD 0x00 /* Standard mode */
#define I2C_PCA_MODE_FAST 0x01 /* Fast mode */
#define I2C_PCA_MODE_FASTP 0x02 /* Fast Plus mode */
#define I2C_PCA_MODE_TURBO 0x03 /* Turbo mode */
#define I2C_PCA_CON_AA 0x80 /* Assert Acknowledge */ #define I2C_PCA_CON_AA 0x80 /* Assert Acknowledge */
#define I2C_PCA_CON_ENSIO 0x40 /* Enable */ #define I2C_PCA_CON_ENSIO 0x40 /* Enable */
#define I2C_PCA_CON_STA 0x20 /* Start */ #define I2C_PCA_CON_STA 0x20 /* Start */
...@@ -31,7 +58,9 @@ struct i2c_algo_pca_data { ...@@ -31,7 +58,9 @@ struct i2c_algo_pca_data {
int (*read_byte) (void *data, int reg); int (*read_byte) (void *data, int reg);
int (*wait_for_completion) (void *data); int (*wait_for_completion) (void *data);
void (*reset_chip) (void *data); void (*reset_chip) (void *data);
/* i2c_clock values are defined in linux/i2c-algo-pca.h */ /* For PCA9564, use one of the predefined frequencies:
* 330000, 288000, 217000, 146000, 88000, 59000, 44000, 36000
* For PCA9665, use the frequency you want here. */
unsigned int i2c_clock; unsigned int i2c_clock;
}; };
......
...@@ -6,7 +6,7 @@ struct i2c_pca9564_pf_platform_data { ...@@ -6,7 +6,7 @@ struct i2c_pca9564_pf_platform_data {
* not supplied (negative value), but it * not supplied (negative value), but it
* cannot exit some error conditions then */ * cannot exit some error conditions then */
int i2c_clock_speed; /* values are defined in linux/i2c-algo-pca.h */ int i2c_clock_speed; /* values are defined in linux/i2c-algo-pca.h */
int timeout; /* timeout = this value * 10us */ int timeout; /* timeout in jiffies */
}; };
#endif /* I2C_PCA9564_PLATFORM_H */ #endif /* I2C_PCA9564_PLATFORM_H */
...@@ -1237,6 +1237,7 @@ ...@@ -1237,6 +1237,7 @@
#define PCI_DEVICE_ID_NVIDIA_NVENET_21 0x0451 #define PCI_DEVICE_ID_NVIDIA_NVENET_21 0x0451
#define PCI_DEVICE_ID_NVIDIA_NVENET_22 0x0452 #define PCI_DEVICE_ID_NVIDIA_NVENET_22 0x0452
#define PCI_DEVICE_ID_NVIDIA_NVENET_23 0x0453 #define PCI_DEVICE_ID_NVIDIA_NVENET_23 0x0453
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_SMBUS 0x0542
#define PCI_DEVICE_ID_NVIDIA_NVENET_24 0x054C #define PCI_DEVICE_ID_NVIDIA_NVENET_24 0x054C
#define PCI_DEVICE_ID_NVIDIA_NVENET_25 0x054D #define PCI_DEVICE_ID_NVIDIA_NVENET_25 0x054D
#define PCI_DEVICE_ID_NVIDIA_NVENET_26 0x054E #define PCI_DEVICE_ID_NVIDIA_NVENET_26 0x054E
...@@ -1247,11 +1248,14 @@ ...@@ -1247,11 +1248,14 @@
#define PCI_DEVICE_ID_NVIDIA_NVENET_31 0x07DF #define PCI_DEVICE_ID_NVIDIA_NVENET_31 0x07DF
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE 0x0560 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE 0x0560
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE 0x056C #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE 0x056C
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP78S_SMBUS 0x0752
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE 0x0759 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE 0x0759
#define PCI_DEVICE_ID_NVIDIA_NVENET_32 0x0760 #define PCI_DEVICE_ID_NVIDIA_NVENET_32 0x0760
#define PCI_DEVICE_ID_NVIDIA_NVENET_33 0x0761 #define PCI_DEVICE_ID_NVIDIA_NVENET_33 0x0761
#define PCI_DEVICE_ID_NVIDIA_NVENET_34 0x0762 #define PCI_DEVICE_ID_NVIDIA_NVENET_34 0x0762
#define PCI_DEVICE_ID_NVIDIA_NVENET_35 0x0763 #define PCI_DEVICE_ID_NVIDIA_NVENET_35 0x0763
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_SMBUS 0x07D8
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP79_SMBUS 0x0AA2
#define PCI_DEVICE_ID_NVIDIA_NVENET_36 0x0AB0 #define PCI_DEVICE_ID_NVIDIA_NVENET_36 0x0AB0
#define PCI_DEVICE_ID_NVIDIA_NVENET_37 0x0AB1 #define PCI_DEVICE_ID_NVIDIA_NVENET_37 0x0AB1
#define PCI_DEVICE_ID_NVIDIA_NVENET_38 0x0AB2 #define PCI_DEVICE_ID_NVIDIA_NVENET_38 0x0AB2
...@@ -1475,6 +1479,7 @@ ...@@ -1475,6 +1479,7 @@
#define PCI_DEVICE_ID_SERVERWORKS_HT1000IDE 0x0214 #define PCI_DEVICE_ID_SERVERWORKS_HT1000IDE 0x0214
#define PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2 0x0217 #define PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2 0x0217
#define PCI_DEVICE_ID_SERVERWORKS_CSB6LPC 0x0227 #define PCI_DEVICE_ID_SERVERWORKS_CSB6LPC 0x0227
#define PCI_DEVICE_ID_SERVERWORKS_HT1100LD 0x0408
#define PCI_VENDOR_ID_SBE 0x1176 #define PCI_VENDOR_ID_SBE 0x1176
#define PCI_DEVICE_ID_SBE_WANXL100 0x0301 #define PCI_DEVICE_ID_SBE_WANXL100 0x0301
......
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