i2c-parport: Add SMBus alert support

Add support for the SMBus alert mechanism to the i2c-parport driver.
The ADM1032 evaluation board at least is properly wired for this.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Cc: David Brownell <dbrownell@users.sourceforge.net>
Cc: Trent Piepho <tpiepho@freescale.com>
This commit is contained in:
Jean Delvare 2010-03-02 12:23:44 +01:00
Родитель e2ca307439
Коммит 3585925448
4 изменённых файлов: 42 добавлений и 3 удалений

Просмотреть файл

@ -29,6 +29,9 @@ can be easily added when needed.
Earlier kernels defaulted to type=0 (Philips). But now, if the type Earlier kernels defaulted to type=0 (Philips). But now, if the type
parameter is missing, the driver will simply fail to initialize. 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 Building your own adapter
------------------------- -------------------------

Просмотреть файл

@ -581,6 +581,7 @@ config I2C_PARPORT
tristate "Parallel port adapter" tristate "Parallel port adapter"
depends on PARPORT depends on PARPORT
select I2C_ALGOBIT select I2C_ALGOBIT
select I2C_SMBUS
help help
This supports parallel port I2C adapters such as the ones made by This supports parallel port I2C adapters such as the ones made by
Philips or Velleman, Analog Devices evaluation boards, and more. Philips or Velleman, Analog Devices evaluation boards, and more.

Просмотреть файл

@ -1,7 +1,7 @@
/* ------------------------------------------------------------------------ * /* ------------------------------------------------------------------------ *
* i2c-parport.c I2C bus over parallel port * * 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 Based on older i2c-philips-par.c driver
Copyright (C) 1995-2000 Simon G. Vogl Copyright (C) 1995-2000 Simon G. Vogl
@ -31,6 +31,7 @@
#include <linux/parport.h> #include <linux/parport.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/i2c-algo-bit.h> #include <linux/i2c-algo-bit.h>
#include <linux/i2c-smbus.h>
#include "i2c-parport.h" #include "i2c-parport.h"
/* ----- Device list ------------------------------------------------------ */ /* ----- Device list ------------------------------------------------------ */
@ -39,6 +40,8 @@ struct i2c_par {
struct pardevice *pdev; struct pardevice *pdev;
struct i2c_adapter adapter; struct i2c_adapter adapter;
struct i2c_algo_bit_data algo_data; struct i2c_algo_bit_data algo_data;
struct i2c_smbus_alert_setup alert_data;
struct i2c_client *ara;
struct i2c_par *next; struct i2c_par *next;
}; };
@ -144,6 +147,19 @@ static struct i2c_algo_bit_data parport_algo_data = {
/* ----- I2c and parallel port call-back functions and structures --------- */ /* ----- 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) static void i2c_parport_attach (struct parport *port)
{ {
struct i2c_par *adapter; struct i2c_par *adapter;
@ -155,8 +171,9 @@ static void i2c_parport_attach (struct parport *port)
} }
pr_debug("i2c-parport: attaching to %s\n", port->name); pr_debug("i2c-parport: attaching to %s\n", port->name);
parport_disable_irq(port);
adapter->pdev = parport_register_device(port, "i2c-parport", 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) { if (!adapter->pdev) {
printk(KERN_ERR "i2c-parport: Unable to register with parport\n"); printk(KERN_ERR "i2c-parport: Unable to register with parport\n");
goto ERROR0; goto ERROR0;
@ -197,6 +214,18 @@ static void i2c_parport_attach (struct parport *port)
goto ERROR1; 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 */ /* Add the new adapter to the list */
adapter->next = adapter_list; adapter->next = adapter_list;
adapter_list = adapter; adapter_list = adapter;
@ -217,6 +246,10 @@ static void i2c_parport_detach (struct parport *port)
for (prev = NULL, adapter = adapter_list; adapter; for (prev = NULL, adapter = adapter_list; adapter;
prev = adapter, adapter = adapter->next) { prev = adapter, adapter = adapter->next) {
if (adapter->pdev->port == port) { if (adapter->pdev->port == port) {
if (adapter->ara) {
parport_disable_irq(port);
i2c_unregister_device(adapter->ara);
}
i2c_del_adapter(&adapter->adapter); i2c_del_adapter(&adapter->adapter);
/* Un-init if needed (power off...) */ /* Un-init if needed (power off...) */

Просмотреть файл

@ -1,7 +1,7 @@
/* ------------------------------------------------------------------------ * /* ------------------------------------------------------------------------ *
* i2c-parport.h I2C bus over parallel port * * 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 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 it under the terms of the GNU General Public License as published by
@ -38,6 +38,7 @@ struct adapter_parm {
struct lineop getsda; struct lineop getsda;
struct lineop getscl; struct lineop getscl;
struct lineop init; struct lineop init;
unsigned int smbus_alert:1;
}; };
static struct adapter_parm adapter_parm[] = { static struct adapter_parm adapter_parm[] = {
@ -73,6 +74,7 @@ static struct adapter_parm adapter_parm[] = {
.setscl = { 0x01, DATA, 1 }, .setscl = { 0x01, DATA, 1 },
.getsda = { 0x10, STAT, 1 }, .getsda = { 0x10, STAT, 1 },
.init = { 0xf0, DATA, 0 }, .init = { 0xf0, DATA, 0 },
.smbus_alert = 1,
}, },
/* type 5: ADM1025, ADM1030 and ADM1031 evaluation boards */ /* type 5: ADM1025, ADM1030 and ADM1031 evaluation boards */
{ {