Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 185031
b: refs/heads/master
c: 3585925
h: refs/heads/master
i:
  185029: ceb5577
  185027: b42dfef
  185023: dc5911e
v: v3
  • Loading branch information
Jean Delvare committed Mar 2, 2010
1 parent f872a05 commit 9e5a80c
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e2ca307439fb9df922c3e8891289a2ac05812fb7
refs/heads/master: 35859254483bce479024781885bc02d860552995
3 changes: 3 additions & 0 deletions trunk/Documentation/i2c/busses/i2c-parport
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ can be easily added when needed.
Earlier kernels defaulted to type=0 (Philips). But now, if the type
parameter is missing, the driver will simply fail to initialize.

SMBus alert support is available on adapters which have this line properly
connected to the parallel port's interrupt pin.


Building your own adapter
-------------------------
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/i2c/busses/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -581,6 +581,7 @@ config I2C_PARPORT
tristate "Parallel port adapter"
depends on PARPORT
select I2C_ALGOBIT
select I2C_SMBUS
help
This supports parallel port I2C adapters such as the ones made by
Philips or Velleman, Analog Devices evaluation boards, and more.
Expand Down
37 changes: 35 additions & 2 deletions trunk/drivers/i2c/busses/i2c-parport.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* ------------------------------------------------------------------------ *
* i2c-parport.c I2C bus over parallel port *
* ------------------------------------------------------------------------ *
Copyright (C) 2003-2007 Jean Delvare <khali@linux-fr.org>
Copyright (C) 2003-2010 Jean Delvare <khali@linux-fr.org>
Based on older i2c-philips-par.c driver
Copyright (C) 1995-2000 Simon G. Vogl
Expand Down Expand Up @@ -31,6 +31,7 @@
#include <linux/parport.h>
#include <linux/i2c.h>
#include <linux/i2c-algo-bit.h>
#include <linux/i2c-smbus.h>
#include "i2c-parport.h"

/* ----- Device list ------------------------------------------------------ */
Expand All @@ -39,6 +40,8 @@ struct i2c_par {
struct pardevice *pdev;
struct i2c_adapter adapter;
struct i2c_algo_bit_data algo_data;
struct i2c_smbus_alert_setup alert_data;
struct i2c_client *ara;
struct i2c_par *next;
};

Expand Down Expand Up @@ -144,6 +147,19 @@ static struct i2c_algo_bit_data parport_algo_data = {

/* ----- I2c and parallel port call-back functions and structures --------- */

void i2c_parport_irq(void *data)
{
struct i2c_par *adapter = data;
struct i2c_client *ara = adapter->ara;

if (ara) {
dev_dbg(&ara->dev, "SMBus alert received\n");
i2c_handle_smbus_alert(ara);
} else
dev_dbg(&adapter->adapter.dev,
"SMBus alert received but no ARA client!\n");
}

static void i2c_parport_attach (struct parport *port)
{
struct i2c_par *adapter;
Expand All @@ -155,8 +171,9 @@ static void i2c_parport_attach (struct parport *port)
}

pr_debug("i2c-parport: attaching to %s\n", port->name);
parport_disable_irq(port);
adapter->pdev = parport_register_device(port, "i2c-parport",
NULL, NULL, NULL, PARPORT_FLAG_EXCL, NULL);
NULL, NULL, i2c_parport_irq, PARPORT_FLAG_EXCL, adapter);
if (!adapter->pdev) {
printk(KERN_ERR "i2c-parport: Unable to register with parport\n");
goto ERROR0;
Expand Down Expand Up @@ -197,6 +214,18 @@ static void i2c_parport_attach (struct parport *port)
goto ERROR1;
}

/* Setup SMBus alert if supported */
if (adapter_parm[type].smbus_alert) {
adapter->alert_data.alert_edge_triggered = 1;
adapter->ara = i2c_setup_smbus_alert(&adapter->adapter,
&adapter->alert_data);
if (adapter->ara)
parport_enable_irq(port);
else
printk(KERN_WARNING "i2c-parport: Failed to register "
"ARA client\n");
}

/* Add the new adapter to the list */
adapter->next = adapter_list;
adapter_list = adapter;
Expand All @@ -217,6 +246,10 @@ static void i2c_parport_detach (struct parport *port)
for (prev = NULL, adapter = adapter_list; adapter;
prev = adapter, adapter = adapter->next) {
if (adapter->pdev->port == port) {
if (adapter->ara) {
parport_disable_irq(port);
i2c_unregister_device(adapter->ara);
}
i2c_del_adapter(&adapter->adapter);

/* Un-init if needed (power off...) */
Expand Down
4 changes: 3 additions & 1 deletion trunk/drivers/i2c/busses/i2c-parport.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* ------------------------------------------------------------------------ *
* i2c-parport.h I2C bus over parallel port *
* ------------------------------------------------------------------------ *
Copyright (C) 2003-2004 Jean Delvare <khali@linux-fr.org>
Copyright (C) 2003-2010 Jean Delvare <khali@linux-fr.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -38,6 +38,7 @@ struct adapter_parm {
struct lineop getsda;
struct lineop getscl;
struct lineop init;
unsigned int smbus_alert:1;
};

static struct adapter_parm adapter_parm[] = {
Expand Down Expand Up @@ -73,6 +74,7 @@ static struct adapter_parm adapter_parm[] = {
.setscl = { 0x01, DATA, 1 },
.getsda = { 0x10, STAT, 1 },
.init = { 0xf0, DATA, 0 },
.smbus_alert = 1,
},
/* type 5: ADM1025, ADM1030 and ADM1031 evaluation boards */
{
Expand Down

0 comments on commit 9e5a80c

Please sign in to comment.