mirror of
https://github.com/armbian/linux.git
synced 2026-01-06 10:13:00 -08:00
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: Fix platform driver hotplug/coldplug i2c: New driver for the SuperH Mobile I2C bus controller i2c/scx200_acb: Don't use 0 as NULL pointer i2c-bfin-twi: Fix mismatch in add timer and delete timer i2c-bfin-twi: Just let i2c-bfin-twi driver depends on BLACKFIN i2c-bfin-twi: Use simpler comment headers and strip out information that is maintained in the scm's log i2c-bfin-twi: Cleanup driver descriptions, versions and some module useful information i2c-bfin-twi: Add missing pin mux operation i2c-bfin-twi: Add platform_resource interface to support multi-port TWI controllers i2c-bfin-twi: Add repeat start feature to avoid break of a bundle of i2c master xfer operation i2c: Remove trailing whitespaces in busses/Kconfig i2c: Replace remaining __FUNCTION__ occurrences i2c: Renesas SH7760 I2C master driver i2c-dev: Split i2cdev_ioctl i2c-ibm_iic: Support building as an of_platform driver i2c-ibm_iic: Change the log levels i2c: Add platform driver on top of the new pca-algorithm i2c-algo-pca: Extend for future drivers i2c-algo-pca: Remove trailing whitespaces and unnecessary UTF i2c: Remove the algorithm drivers from the config menu
This commit is contained in:
@@ -1,45 +1,16 @@
|
||||
#
|
||||
# Character device configuration
|
||||
# I2C algorithm drivers configuration
|
||||
#
|
||||
|
||||
menu "I2C Algorithms"
|
||||
|
||||
config I2C_ALGOBIT
|
||||
tristate "I2C bit-banging interfaces"
|
||||
help
|
||||
This allows you to use a range of I2C adapters called bit-banging
|
||||
adapters. Say Y if you own an I2C adapter belonging to this class
|
||||
and then say Y to the specific driver for you adapter below.
|
||||
|
||||
This support is also available as a module. If so, the module
|
||||
will be called i2c-algo-bit.
|
||||
tristate
|
||||
|
||||
config I2C_ALGOPCF
|
||||
tristate "I2C PCF 8584 interfaces"
|
||||
help
|
||||
This allows you to use a range of I2C adapters called PCF adapters.
|
||||
Say Y if you own an I2C adapter belonging to this class and then say
|
||||
Y to the specific driver for you adapter below.
|
||||
|
||||
This support is also available as a module. If so, the module
|
||||
will be called i2c-algo-pcf.
|
||||
tristate
|
||||
|
||||
config I2C_ALGOPCA
|
||||
tristate "I2C PCA 9564 interfaces"
|
||||
help
|
||||
This allows you to use a range of I2C adapters called PCA adapters.
|
||||
Say Y if you own an I2C adapter belonging to this class and then say
|
||||
Y to the specific driver for you adapter below.
|
||||
|
||||
This support is also available as a module. If so, the module
|
||||
will be called i2c-algo-pca.
|
||||
tristate
|
||||
|
||||
config I2C_ALGO_SGI
|
||||
tristate "I2C SGI interfaces"
|
||||
tristate
|
||||
depends on SGI_IP22 || SGI_IP32 || X86_VISWS
|
||||
help
|
||||
Supports the SGI interfaces like the ones found on SGI Indy VINO
|
||||
or SGI O2 MACE.
|
||||
|
||||
endmenu
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/*
|
||||
* i2c-algo-pca.c i2c driver algorithms for PCA9564 adapters
|
||||
* i2c-algo-pca.c i2c driver algorithms for PCA9564 adapters
|
||||
* Copyright (C) 2004 Arcom Control Systems
|
||||
* Copyright (C) 2008 Pengutronix
|
||||
*
|
||||
* 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
|
||||
@@ -21,14 +22,10 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-algo-pca.h>
|
||||
#include "i2c-algo-pca.h"
|
||||
|
||||
#define DRIVER "i2c-algo-pca"
|
||||
|
||||
#define DEB1(fmt, args...) do { if (i2c_debug>=1) printk(fmt, ## args); } while(0)
|
||||
#define DEB2(fmt, args...) do { if (i2c_debug>=2) printk(fmt, ## args); } while(0)
|
||||
@@ -36,15 +33,15 @@
|
||||
|
||||
static int i2c_debug;
|
||||
|
||||
#define pca_outw(adap, reg, val) adap->write_byte(adap, reg, val)
|
||||
#define pca_inw(adap, reg) adap->read_byte(adap, reg)
|
||||
#define pca_outw(adap, reg, val) adap->write_byte(adap->data, reg, val)
|
||||
#define pca_inw(adap, reg) adap->read_byte(adap->data, reg)
|
||||
|
||||
#define pca_status(adap) pca_inw(adap, I2C_PCA_STA)
|
||||
#define pca_clock(adap) adap->get_clock(adap)
|
||||
#define pca_own(adap) adap->get_own(adap)
|
||||
#define pca_clock(adap) adap->i2c_clock
|
||||
#define pca_set_con(adap, val) pca_outw(adap, I2C_PCA_CON, val)
|
||||
#define pca_get_con(adap) pca_inw(adap, I2C_PCA_CON)
|
||||
#define pca_wait(adap) adap->wait_for_interrupt(adap)
|
||||
#define pca_wait(adap) adap->wait_for_completion(adap->data)
|
||||
#define pca_reset(adap) adap->reset_chip(adap->data)
|
||||
|
||||
/*
|
||||
* Generate a start condition on the i2c bus.
|
||||
@@ -99,7 +96,7 @@ static void pca_stop(struct i2c_algo_pca_data *adap)
|
||||
*
|
||||
* returns after the address has been sent
|
||||
*/
|
||||
static void pca_address(struct i2c_algo_pca_data *adap,
|
||||
static void pca_address(struct i2c_algo_pca_data *adap,
|
||||
struct i2c_msg *msg)
|
||||
{
|
||||
int sta = pca_get_con(adap);
|
||||
@@ -108,9 +105,9 @@ static void pca_address(struct i2c_algo_pca_data *adap,
|
||||
addr = ( (0x7f & msg->addr) << 1 );
|
||||
if (msg->flags & I2C_M_RD )
|
||||
addr |= 1;
|
||||
DEB2("=== SLAVE ADDRESS %#04x+%c=%#04x\n",
|
||||
DEB2("=== SLAVE ADDRESS %#04x+%c=%#04x\n",
|
||||
msg->addr, msg->flags & I2C_M_RD ? 'R' : 'W', addr);
|
||||
|
||||
|
||||
pca_outw(adap, I2C_PCA_DAT, addr);
|
||||
|
||||
sta &= ~(I2C_PCA_CON_STO|I2C_PCA_CON_STA|I2C_PCA_CON_SI);
|
||||
@@ -124,7 +121,7 @@ static void pca_address(struct i2c_algo_pca_data *adap,
|
||||
*
|
||||
* Returns after the byte has been transmitted
|
||||
*/
|
||||
static void pca_tx_byte(struct i2c_algo_pca_data *adap,
|
||||
static void pca_tx_byte(struct i2c_algo_pca_data *adap,
|
||||
__u8 b)
|
||||
{
|
||||
int sta = pca_get_con(adap);
|
||||
@@ -142,19 +139,19 @@ static void pca_tx_byte(struct i2c_algo_pca_data *adap,
|
||||
*
|
||||
* returns immediately.
|
||||
*/
|
||||
static void pca_rx_byte(struct i2c_algo_pca_data *adap,
|
||||
static void pca_rx_byte(struct i2c_algo_pca_data *adap,
|
||||
__u8 *b, int ack)
|
||||
{
|
||||
*b = pca_inw(adap, I2C_PCA_DAT);
|
||||
DEB2("=== READ %#04x %s\n", *b, ack ? "ACK" : "NACK");
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* Setup ACK or NACK for next received byte and wait for it to arrive.
|
||||
*
|
||||
* Returns after next byte has arrived.
|
||||
*/
|
||||
static void pca_rx_ack(struct i2c_algo_pca_data *adap,
|
||||
static void pca_rx_ack(struct i2c_algo_pca_data *adap,
|
||||
int ack)
|
||||
{
|
||||
int sta = pca_get_con(adap);
|
||||
@@ -168,15 +165,6 @@ static void pca_rx_ack(struct i2c_algo_pca_data *adap,
|
||||
pca_wait(adap);
|
||||
}
|
||||
|
||||
/*
|
||||
* Reset the i2c bus / SIO
|
||||
*/
|
||||
static void pca_reset(struct i2c_algo_pca_data *adap)
|
||||
{
|
||||
/* apparently only an external reset will do it. not a lot can be done */
|
||||
printk(KERN_ERR DRIVER ": Haven't figured out how to do a reset yet\n");
|
||||
}
|
||||
|
||||
static int pca_xfer(struct i2c_adapter *i2c_adap,
|
||||
struct i2c_msg *msgs,
|
||||
int num)
|
||||
@@ -187,7 +175,7 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
|
||||
int numbytes = 0;
|
||||
int state;
|
||||
int ret;
|
||||
int timeout = 100;
|
||||
int timeout = i2c_adap->timeout;
|
||||
|
||||
while ((state = pca_status(adap)) != 0xf8 && timeout--) {
|
||||
msleep(10);
|
||||
@@ -203,14 +191,14 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
|
||||
for (curmsg = 0; curmsg < num; curmsg++) {
|
||||
int addr, i;
|
||||
msg = &msgs[curmsg];
|
||||
|
||||
|
||||
addr = (0x7f & msg->addr) ;
|
||||
|
||||
|
||||
if (msg->flags & I2C_M_RD )
|
||||
printk(KERN_INFO " [%02d] RD %d bytes from %#02x [%#02x, ...]\n",
|
||||
printk(KERN_INFO " [%02d] RD %d bytes from %#02x [%#02x, ...]\n",
|
||||
curmsg, msg->len, addr, (addr<<1) | 1);
|
||||
else {
|
||||
printk(KERN_INFO " [%02d] WR %d bytes to %#02x [%#02x%s",
|
||||
printk(KERN_INFO " [%02d] WR %d bytes to %#02x [%#02x%s",
|
||||
curmsg, msg->len, addr, addr<<1,
|
||||
msg->len == 0 ? "" : ", ");
|
||||
for(i=0; i < msg->len; i++)
|
||||
@@ -237,7 +225,7 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
|
||||
case 0x10: /* A repeated start condition has been transmitted */
|
||||
pca_address(adap, msg);
|
||||
break;
|
||||
|
||||
|
||||
case 0x18: /* SLA+W has been transmitted; ACK has been received */
|
||||
case 0x28: /* Data byte in I2CDAT has been transmitted; ACK has been received */
|
||||
if (numbytes < msg->len) {
|
||||
@@ -287,7 +275,7 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
|
||||
case 0x38: /* Arbitration lost during SLA+W, SLA+R or data bytes */
|
||||
DEB2("Arbitration lost\n");
|
||||
goto out;
|
||||
|
||||
|
||||
case 0x58: /* Data byte has been received; NOT ACK has been returned */
|
||||
if ( numbytes == msg->len - 1 ) {
|
||||
pca_rx_byte(adap, &msg->buf[numbytes], 0);
|
||||
@@ -317,16 +305,16 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
|
||||
pca_reset(adap);
|
||||
goto out;
|
||||
default:
|
||||
printk(KERN_ERR DRIVER ": unhandled SIO state 0x%02x\n", state);
|
||||
dev_err(&i2c_adap->dev, "unhandled SIO state 0x%02x\n", state);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
ret = curmsg;
|
||||
out:
|
||||
DEB1(KERN_CRIT "}}} transfered %d/%d messages. "
|
||||
"status is %#04x. control is %#04x\n",
|
||||
"status is %#04x. control is %#04x\n",
|
||||
curmsg, num, pca_status(adap),
|
||||
pca_get_con(adap));
|
||||
return ret;
|
||||
@@ -337,53 +325,65 @@ static u32 pca_func(struct i2c_adapter *adap)
|
||||
return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
|
||||
}
|
||||
|
||||
static int pca_init(struct i2c_algo_pca_data *adap)
|
||||
{
|
||||
static int freqs[] = {330,288,217,146,88,59,44,36};
|
||||
int own, clock;
|
||||
|
||||
own = pca_own(adap);
|
||||
clock = pca_clock(adap);
|
||||
DEB1(KERN_INFO DRIVER ": own address is %#04x\n", own);
|
||||
DEB1(KERN_INFO DRIVER ": clock freqeuncy is %dkHz\n", freqs[clock]);
|
||||
|
||||
pca_outw(adap, I2C_PCA_ADR, own << 1);
|
||||
|
||||
pca_set_con(adap, I2C_PCA_CON_ENSIO | clock);
|
||||
udelay(500); /* 500 µs for oscilator to stabilise */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_algorithm pca_algo = {
|
||||
.master_xfer = pca_xfer,
|
||||
.functionality = pca_func,
|
||||
};
|
||||
|
||||
/*
|
||||
* registering functions to load algorithms at runtime
|
||||
static int pca_init(struct i2c_adapter *adap)
|
||||
{
|
||||
static int freqs[] = {330,288,217,146,88,59,44,36};
|
||||
int clock;
|
||||
struct i2c_algo_pca_data *pca_data = adap->algo_data;
|
||||
|
||||
if (pca_data->i2c_clock > 7) {
|
||||
printk(KERN_WARNING "%s: Invalid I2C clock speed selected. Trying default.\n",
|
||||
adap->name);
|
||||
pca_data->i2c_clock = I2C_PCA_CON_59kHz;
|
||||
}
|
||||
|
||||
adap->algo = &pca_algo;
|
||||
|
||||
pca_reset(pca_data);
|
||||
|
||||
clock = pca_clock(pca_data);
|
||||
DEB1(KERN_INFO "%s: Clock frequency is %dkHz\n", adap->name, freqs[clock]);
|
||||
|
||||
pca_set_con(pca_data, I2C_PCA_CON_ENSIO | clock);
|
||||
udelay(500); /* 500 us for oscilator to stabilise */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* registering functions to load algorithms at runtime
|
||||
*/
|
||||
int i2c_pca_add_bus(struct i2c_adapter *adap)
|
||||
{
|
||||
struct i2c_algo_pca_data *pca_adap = adap->algo_data;
|
||||
int rval;
|
||||
|
||||
/* register new adapter to i2c module... */
|
||||
adap->algo = &pca_algo;
|
||||
|
||||
adap->timeout = 100; /* default values, should */
|
||||
adap->retries = 3; /* be replaced by defines */
|
||||
|
||||
if ((rval = pca_init(pca_adap)))
|
||||
rval = pca_init(adap);
|
||||
if (rval)
|
||||
return rval;
|
||||
|
||||
rval = i2c_add_adapter(adap);
|
||||
|
||||
return rval;
|
||||
return i2c_add_adapter(adap);
|
||||
}
|
||||
EXPORT_SYMBOL(i2c_pca_add_bus);
|
||||
|
||||
MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>");
|
||||
int i2c_pca_add_numbered_bus(struct i2c_adapter *adap)
|
||||
{
|
||||
int rval;
|
||||
|
||||
rval = pca_init(adap);
|
||||
if (rval)
|
||||
return rval;
|
||||
|
||||
return i2c_add_numbered_adapter(adap);
|
||||
}
|
||||
EXPORT_SYMBOL(i2c_pca_add_numbered_bus);
|
||||
|
||||
MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>, "
|
||||
"Wolfram Sang <w.sang@pengutronix.de>");
|
||||
MODULE_DESCRIPTION("I2C-Bus PCA9564 algorithm");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
#ifndef I2C_PCA9564_H
|
||||
#define I2C_PCA9564_H 1
|
||||
|
||||
#define I2C_PCA_STA 0x00 /* STATUS Read Only */
|
||||
#define I2C_PCA_TO 0x00 /* TIMEOUT Write Only */
|
||||
#define I2C_PCA_DAT 0x01 /* DATA Read/Write */
|
||||
#define I2C_PCA_ADR 0x02 /* OWN ADR Read/Write */
|
||||
#define I2C_PCA_CON 0x03 /* CONTROL Read/Write */
|
||||
|
||||
#define I2C_PCA_CON_AA 0x80 /* Assert Acknowledge */
|
||||
#define I2C_PCA_CON_ENSIO 0x40 /* Enable */
|
||||
#define I2C_PCA_CON_STA 0x20 /* Start */
|
||||
#define I2C_PCA_CON_STO 0x10 /* Stop */
|
||||
#define I2C_PCA_CON_SI 0x08 /* Serial Interrupt */
|
||||
#define I2C_PCA_CON_CR 0x07 /* Clock Rate (MASK) */
|
||||
|
||||
#define I2C_PCA_CON_330kHz 0x00
|
||||
#define I2C_PCA_CON_288kHz 0x01
|
||||
#define I2C_PCA_CON_217kHz 0x02
|
||||
#define I2C_PCA_CON_146kHz 0x03
|
||||
#define I2C_PCA_CON_88kHz 0x04
|
||||
#define I2C_PCA_CON_59kHz 0x05
|
||||
#define I2C_PCA_CON_44kHz 0x06
|
||||
#define I2C_PCA_CON_36kHz 0x07
|
||||
|
||||
#endif /* I2C_PCA9564_H */
|
||||
@@ -100,9 +100,12 @@ config I2C_AU1550
|
||||
|
||||
config I2C_BLACKFIN_TWI
|
||||
tristate "Blackfin TWI I2C support"
|
||||
depends on BF534 || BF536 || BF537
|
||||
depends on BLACKFIN
|
||||
help
|
||||
This is the TWI I2C device driver for Blackfin 534/536/537/54x.
|
||||
This is the TWI I2C device driver for Blackfin BF522, BF525,
|
||||
BF527, BF534, BF536, BF537 and BF54x. For other Blackfin processors,
|
||||
please don't use this driver.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called i2c-bfin-twi.
|
||||
|
||||
@@ -135,7 +138,7 @@ config I2C_ELEKTOR
|
||||
This supports the PCF8584 ISA bus I2C adapter. Say Y if you own
|
||||
such an adapter.
|
||||
|
||||
This support is also available as a module. If so, the module
|
||||
This support is also available as a module. If so, the module
|
||||
will be called i2c-elektor.
|
||||
|
||||
config I2C_GPIO
|
||||
@@ -190,7 +193,7 @@ config I2C_I810
|
||||
select I2C_ALGOBIT
|
||||
help
|
||||
If you say yes to this option, support will be included for the Intel
|
||||
810/815 family of mainboard I2C interfaces. Specifically, the
|
||||
810/815 family of mainboard I2C interfaces. Specifically, the
|
||||
following versions of the chipset are supported:
|
||||
i810AA
|
||||
i810AB
|
||||
@@ -246,10 +249,10 @@ config I2C_PIIX4
|
||||
|
||||
config I2C_IBM_IIC
|
||||
tristate "IBM PPC 4xx on-chip I2C interface"
|
||||
depends on IBM_OCP
|
||||
depends on 4xx
|
||||
help
|
||||
Say Y here if you want to use IIC peripheral found on
|
||||
embedded IBM PPC 4xx based systems.
|
||||
Say Y here if you want to use IIC peripheral found on
|
||||
embedded IBM PPC 4xx based systems.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called i2c-ibm_iic.
|
||||
@@ -269,7 +272,7 @@ config I2C_IXP2000
|
||||
depends on ARCH_IXP2000
|
||||
select I2C_ALGOBIT
|
||||
help
|
||||
Say Y here if you have an Intel IXP2000 (2400, 2800, 2850) based
|
||||
Say Y here if you have an Intel IXP2000 (2400, 2800, 2850) based
|
||||
system and are using GPIO lines for an I2C bus.
|
||||
|
||||
This support is also available as a module. If so, the module
|
||||
@@ -354,7 +357,7 @@ config I2C_PARPORT
|
||||
on the parport driver. This is meant for embedded systems. Don't say
|
||||
Y here if you intend to say Y or M there.
|
||||
|
||||
This support is also available as a module. If so, the module
|
||||
This support is also available as a module. If so, the module
|
||||
will be called i2c-parport.
|
||||
|
||||
config I2C_PARPORT_LIGHT
|
||||
@@ -372,12 +375,12 @@ config I2C_PARPORT_LIGHT
|
||||
the clean but heavy parport handling is not an option. The
|
||||
drawback is a reduced portability and the impossibility to
|
||||
daisy-chain other parallel port devices.
|
||||
|
||||
|
||||
Don't say Y here if you said Y or M to i2c-parport. Saying M to
|
||||
both is possible but both modules should not be loaded at the same
|
||||
time.
|
||||
|
||||
This support is also available as a module. If so, the module
|
||||
This support is also available as a module. If so, the module
|
||||
will be called i2c-parport-light.
|
||||
|
||||
config I2C_PASEMI
|
||||
@@ -401,7 +404,7 @@ config I2C_PROSAVAGE
|
||||
|
||||
This driver is deprecated in favor of the savagefb driver.
|
||||
|
||||
This support is also available as a module. If so, the module
|
||||
This support is also available as a module. If so, the module
|
||||
will be called i2c-prosavage.
|
||||
|
||||
config I2C_S3C2410
|
||||
@@ -417,7 +420,7 @@ config I2C_SAVAGE4
|
||||
depends on PCI
|
||||
select I2C_ALGOBIT
|
||||
help
|
||||
If you say yes to this option, support will be included for the
|
||||
If you say yes to this option, support will be included for the
|
||||
S3 Savage 4 I2C interface.
|
||||
|
||||
This driver is deprecated in favor of the savagefb driver.
|
||||
@@ -452,7 +455,7 @@ config SCx200_I2C
|
||||
|
||||
If you don't know what to do here, say N.
|
||||
|
||||
This support is also available as a module. If so, the module
|
||||
This support is also available as a module. If so, the module
|
||||
will be called scx200_i2c.
|
||||
|
||||
This driver is deprecated and will be dropped soon. Use i2c-gpio
|
||||
@@ -483,14 +486,14 @@ config SCx200_ACB
|
||||
|
||||
If you don't know what to do here, say N.
|
||||
|
||||
This support is also available as a module. If so, the module
|
||||
This support is also available as a module. If so, the module
|
||||
will be called scx200_acb.
|
||||
|
||||
config I2C_SIS5595
|
||||
tristate "SiS 5595"
|
||||
depends on PCI
|
||||
help
|
||||
If you say yes to this option, support will be included for the
|
||||
If you say yes to this option, support will be included for the
|
||||
SiS5595 SMBus (a subset of I2C) interface.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
@@ -500,7 +503,7 @@ config I2C_SIS630
|
||||
tristate "SiS 630/730"
|
||||
depends on PCI
|
||||
help
|
||||
If you say yes to this option, support will be included for the
|
||||
If you say yes to this option, support will be included for the
|
||||
SiS630 and SiS730 SMBus (a subset of I2C) interface.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
@@ -632,9 +635,9 @@ config I2C_PCA_ISA
|
||||
select I2C_ALGOPCA
|
||||
default n
|
||||
help
|
||||
This driver supports ISA boards using the Philips PCA 9564
|
||||
Parallel bus to I2C bus controller
|
||||
|
||||
This driver supports ISA boards using the Philips PCA9564
|
||||
parallel bus to I2C bus controller.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called i2c-pca-isa.
|
||||
|
||||
@@ -643,6 +646,17 @@ config I2C_PCA_ISA
|
||||
delays when I2C/SMBus chip drivers are loaded (e.g. at boot
|
||||
time). If unsure, say N.
|
||||
|
||||
config I2C_PCA_PLATFORM
|
||||
tristate "PCA9564 as platform device"
|
||||
select I2C_ALGOPCA
|
||||
default n
|
||||
help
|
||||
This driver supports a memory mapped Philips PCA9564
|
||||
parallel bus to I2C bus controller.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called i2c-pca-platform.
|
||||
|
||||
config I2C_MV64XXX
|
||||
tristate "Marvell mv64xxx I2C Controller"
|
||||
depends on (MV64X60 || PLAT_ORION) && EXPERIMENTAL
|
||||
@@ -672,4 +686,23 @@ config I2C_PMCMSP
|
||||
This driver can also be built as module. If so, the module
|
||||
will be called i2c-pmcmsp.
|
||||
|
||||
config I2C_SH7760
|
||||
tristate "Renesas SH7760 I2C Controller"
|
||||
depends on CPU_SUBTYPE_SH7760
|
||||
help
|
||||
This driver supports the 2 I2C interfaces on the Renesas SH7760.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called i2c-sh7760.
|
||||
|
||||
config I2C_SH_MOBILE
|
||||
tristate "SuperH Mobile I2C Controller"
|
||||
depends on SUPERH
|
||||
help
|
||||
If you say yes to this option, support will be included for the
|
||||
built-in I2C interface on the Renesas SH-Mobile processor.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called i2c-sh_mobile.
|
||||
|
||||
endmenu
|
||||
|
||||
@@ -30,6 +30,7 @@ obj-$(CONFIG_I2C_PARPORT) += i2c-parport.o
|
||||
obj-$(CONFIG_I2C_PARPORT_LIGHT) += i2c-parport-light.o
|
||||
obj-$(CONFIG_I2C_PASEMI) += i2c-pasemi.o
|
||||
obj-$(CONFIG_I2C_PCA_ISA) += i2c-pca-isa.o
|
||||
obj-$(CONFIG_I2C_PCA_PLATFORM) += i2c-pca-platform.o
|
||||
obj-$(CONFIG_I2C_PIIX4) += i2c-piix4.o
|
||||
obj-$(CONFIG_I2C_PMCMSP) += i2c-pmcmsp.o
|
||||
obj-$(CONFIG_I2C_PNX) += i2c-pnx.o
|
||||
@@ -37,6 +38,8 @@ obj-$(CONFIG_I2C_PROSAVAGE) += i2c-prosavage.o
|
||||
obj-$(CONFIG_I2C_PXA) += i2c-pxa.o
|
||||
obj-$(CONFIG_I2C_S3C2410) += i2c-s3c2410.o
|
||||
obj-$(CONFIG_I2C_SAVAGE4) += i2c-savage4.o
|
||||
obj-$(CONFIG_I2C_SH7760) += i2c-sh7760.o
|
||||
obj-$(CONFIG_I2C_SH_MOBILE) += i2c-sh_mobile.o
|
||||
obj-$(CONFIG_I2C_SIBYTE) += i2c-sibyte.o
|
||||
obj-$(CONFIG_I2C_SIMTEC) += i2c-simtec.o
|
||||
obj-$(CONFIG_I2C_SIS5595) += i2c-sis5595.o
|
||||
|
||||
@@ -298,7 +298,7 @@ static int at91_i2c_resume(struct platform_device *pdev)
|
||||
#endif
|
||||
|
||||
/* work with "modprobe at91_i2c" from hotplugging or coldplugging */
|
||||
MODULE_ALIAS("at91_i2c");
|
||||
MODULE_ALIAS("platform:at91_i2c");
|
||||
|
||||
static struct platform_driver at91_i2c_driver = {
|
||||
.probe = at91_i2c_probe,
|
||||
|
||||
@@ -472,6 +472,7 @@ i2c_au1550_exit(void)
|
||||
MODULE_AUTHOR("Dan Malek, Embedded Edge, LLC.");
|
||||
MODULE_DESCRIPTION("SMBus adapter Alchemy pb1550");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:au1xpsc_smbus");
|
||||
|
||||
module_init (i2c_au1550_init);
|
||||
module_exit (i2c_au1550_exit);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -328,7 +328,7 @@ i2c_davinci_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
dev_dbg(dev->dev, "%s: msgs: %d\n", __FUNCTION__, num);
|
||||
dev_dbg(dev->dev, "%s: msgs: %d\n", __func__, num);
|
||||
|
||||
ret = i2c_davinci_wait_bus_not_busy(dev, 1);
|
||||
if (ret < 0) {
|
||||
@@ -342,7 +342,7 @@ i2c_davinci_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
|
||||
return ret;
|
||||
}
|
||||
|
||||
dev_dbg(dev->dev, "%s:%d ret: %d\n", __FUNCTION__, __LINE__, ret);
|
||||
dev_dbg(dev->dev, "%s:%d ret: %d\n", __func__, __LINE__, ret);
|
||||
|
||||
return num;
|
||||
}
|
||||
@@ -364,7 +364,7 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id)
|
||||
u16 w;
|
||||
|
||||
while ((stat = davinci_i2c_read_reg(dev, DAVINCI_I2C_IVR_REG))) {
|
||||
dev_dbg(dev->dev, "%s: stat=0x%x\n", __FUNCTION__, stat);
|
||||
dev_dbg(dev->dev, "%s: stat=0x%x\n", __func__, stat);
|
||||
if (count++ == 100) {
|
||||
dev_warn(dev->dev, "Too much work in one IRQ\n");
|
||||
break;
|
||||
@@ -553,6 +553,9 @@ static int davinci_i2c_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* work with hotplug and coldplug */
|
||||
MODULE_ALIAS("platform:i2c_davinci");
|
||||
|
||||
static struct platform_driver davinci_i2c_driver = {
|
||||
.probe = davinci_i2c_probe,
|
||||
.remove = davinci_i2c_remove,
|
||||
|
||||
@@ -220,3 +220,4 @@ module_exit(i2c_gpio_exit);
|
||||
MODULE_AUTHOR("Haavard Skinnemoen <hskinnemoen@atmel.com>");
|
||||
MODULE_DESCRIPTION("Platform-independent bitbanging I2C driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:i2c-gpio");
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
* Copyright (c) 2003, 2004 Zultys Technologies.
|
||||
* Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net>
|
||||
*
|
||||
* Copyright (c) 2008 PIKA Technologies
|
||||
* Sean MacLennan <smaclennan@pikatech.com>
|
||||
*
|
||||
* Based on original work by
|
||||
* Ian DaSilva <idasilva@mvista.com>
|
||||
* Armin Kuster <akuster@mvista.com>
|
||||
@@ -39,12 +42,17 @@
|
||||
#include <asm/io.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-id.h>
|
||||
|
||||
#ifdef CONFIG_IBM_OCP
|
||||
#include <asm/ocp.h>
|
||||
#include <asm/ibm4xx.h>
|
||||
#else
|
||||
#include <linux/of_platform.h>
|
||||
#endif
|
||||
|
||||
#include "i2c-ibm_iic.h"
|
||||
|
||||
#define DRIVER_VERSION "2.1"
|
||||
#define DRIVER_VERSION "2.2"
|
||||
|
||||
MODULE_DESCRIPTION("IBM IIC driver v" DRIVER_VERSION);
|
||||
MODULE_LICENSE("GPL");
|
||||
@@ -650,13 +658,14 @@ static inline u8 iic_clckdiv(unsigned int opb)
|
||||
opb /= 1000000;
|
||||
|
||||
if (opb < 20 || opb > 150){
|
||||
printk(KERN_CRIT "ibm-iic: invalid OPB clock frequency %u MHz\n",
|
||||
printk(KERN_WARNING "ibm-iic: invalid OPB clock frequency %u MHz\n",
|
||||
opb);
|
||||
opb = opb < 20 ? 20 : 150;
|
||||
}
|
||||
return (u8)((opb + 9) / 10 - 1);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IBM_OCP
|
||||
/*
|
||||
* Register single IIC interface
|
||||
*/
|
||||
@@ -672,7 +681,7 @@ static int __devinit iic_probe(struct ocp_device *ocp){
|
||||
ocp->def->index);
|
||||
|
||||
if (!(dev = kzalloc(sizeof(*dev), GFP_KERNEL))) {
|
||||
printk(KERN_CRIT "ibm-iic%d: failed to allocate device data\n",
|
||||
printk(KERN_ERR "ibm-iic%d: failed to allocate device data\n",
|
||||
ocp->def->index);
|
||||
return -ENOMEM;
|
||||
}
|
||||
@@ -687,7 +696,7 @@ static int __devinit iic_probe(struct ocp_device *ocp){
|
||||
}
|
||||
|
||||
if (!(dev->vaddr = ioremap(ocp->def->paddr, sizeof(struct iic_regs)))){
|
||||
printk(KERN_CRIT "ibm-iic%d: failed to ioremap device registers\n",
|
||||
printk(KERN_ERR "ibm-iic%d: failed to ioremap device registers\n",
|
||||
dev->idx);
|
||||
ret = -ENXIO;
|
||||
goto fail2;
|
||||
@@ -745,7 +754,7 @@ static int __devinit iic_probe(struct ocp_device *ocp){
|
||||
adap->nr = dev->idx >= 0 ? dev->idx : 0;
|
||||
|
||||
if ((ret = i2c_add_numbered_adapter(adap)) < 0) {
|
||||
printk(KERN_CRIT "ibm-iic%d: failed to register i2c adapter\n",
|
||||
printk(KERN_ERR "ibm-iic%d: failed to register i2c adapter\n",
|
||||
dev->idx);
|
||||
goto fail;
|
||||
}
|
||||
@@ -778,7 +787,7 @@ static void __devexit iic_remove(struct ocp_device *ocp)
|
||||
struct ibm_iic_private* dev = (struct ibm_iic_private*)ocp_get_drvdata(ocp);
|
||||
BUG_ON(dev == NULL);
|
||||
if (i2c_del_adapter(&dev->adap)){
|
||||
printk(KERN_CRIT "ibm-iic%d: failed to delete i2c adapter :(\n",
|
||||
printk(KERN_ERR "ibm-iic%d: failed to delete i2c adapter :(\n",
|
||||
dev->idx);
|
||||
/* That's *very* bad, just shutdown IRQ ... */
|
||||
if (dev->irq >= 0){
|
||||
@@ -828,5 +837,181 @@ static void __exit iic_exit(void)
|
||||
ocp_unregister_driver(&ibm_iic_driver);
|
||||
}
|
||||
|
||||
#else /* !CONFIG_IBM_OCP */
|
||||
|
||||
static int __devinit iic_request_irq(struct of_device *ofdev,
|
||||
struct ibm_iic_private *dev)
|
||||
{
|
||||
struct device_node *np = ofdev->node;
|
||||
int irq;
|
||||
|
||||
if (iic_force_poll)
|
||||
return NO_IRQ;
|
||||
|
||||
irq = irq_of_parse_and_map(np, 0);
|
||||
if (irq == NO_IRQ) {
|
||||
dev_err(&ofdev->dev, "irq_of_parse_and_map failed\n");
|
||||
return NO_IRQ;
|
||||
}
|
||||
|
||||
/* Disable interrupts until we finish initialization, assumes
|
||||
* level-sensitive IRQ setup...
|
||||
*/
|
||||
iic_interrupt_mode(dev, 0);
|
||||
if (request_irq(irq, iic_handler, 0, "IBM IIC", dev)) {
|
||||
dev_err(&ofdev->dev, "request_irq %d failed\n", irq);
|
||||
/* Fallback to the polling mode */
|
||||
return NO_IRQ;
|
||||
}
|
||||
|
||||
return irq;
|
||||
}
|
||||
|
||||
/*
|
||||
* Register single IIC interface
|
||||
*/
|
||||
static int __devinit iic_probe(struct of_device *ofdev,
|
||||
const struct of_device_id *match)
|
||||
{
|
||||
struct device_node *np = ofdev->node;
|
||||
struct ibm_iic_private *dev;
|
||||
struct i2c_adapter *adap;
|
||||
const u32 *indexp, *freq;
|
||||
int ret;
|
||||
|
||||
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
||||
if (!dev) {
|
||||
dev_err(&ofdev->dev, "failed to allocate device data\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dev_set_drvdata(&ofdev->dev, dev);
|
||||
|
||||
indexp = of_get_property(np, "index", NULL);
|
||||
if (!indexp) {
|
||||
dev_err(&ofdev->dev, "no index specified\n");
|
||||
ret = -EINVAL;
|
||||
goto error_cleanup;
|
||||
}
|
||||
dev->idx = *indexp;
|
||||
|
||||
dev->vaddr = of_iomap(np, 0);
|
||||
if (dev->vaddr == NULL) {
|
||||
dev_err(&ofdev->dev, "failed to iomap device\n");
|
||||
ret = -ENXIO;
|
||||
goto error_cleanup;
|
||||
}
|
||||
|
||||
init_waitqueue_head(&dev->wq);
|
||||
|
||||
dev->irq = iic_request_irq(ofdev, dev);
|
||||
if (dev->irq == NO_IRQ)
|
||||
dev_warn(&ofdev->dev, "using polling mode\n");
|
||||
|
||||
/* Board specific settings */
|
||||
if (iic_force_fast || of_get_property(np, "fast-mode", NULL))
|
||||
dev->fast_mode = 1;
|
||||
|
||||
freq = of_get_property(np, "clock-frequency", NULL);
|
||||
if (freq == NULL) {
|
||||
freq = of_get_property(np->parent, "clock-frequency", NULL);
|
||||
if (freq == NULL) {
|
||||
dev_err(&ofdev->dev, "Unable to get bus frequency\n");
|
||||
ret = -EINVAL;
|
||||
goto error_cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
dev->clckdiv = iic_clckdiv(*freq);
|
||||
dev_dbg(&ofdev->dev, "clckdiv = %d\n", dev->clckdiv);
|
||||
|
||||
/* Initialize IIC interface */
|
||||
iic_dev_init(dev);
|
||||
|
||||
/* Register it with i2c layer */
|
||||
adap = &dev->adap;
|
||||
adap->dev.parent = &ofdev->dev;
|
||||
strlcpy(adap->name, "IBM IIC", sizeof(adap->name));
|
||||
i2c_set_adapdata(adap, dev);
|
||||
adap->id = I2C_HW_OCP;
|
||||
adap->class = I2C_CLASS_HWMON;
|
||||
adap->algo = &iic_algo;
|
||||
adap->timeout = 1;
|
||||
adap->nr = dev->idx;
|
||||
|
||||
ret = i2c_add_numbered_adapter(adap);
|
||||
if (ret < 0) {
|
||||
dev_err(&ofdev->dev, "failed to register i2c adapter\n");
|
||||
goto error_cleanup;
|
||||
}
|
||||
|
||||
dev_info(&ofdev->dev, "using %s mode\n",
|
||||
dev->fast_mode ? "fast (400 kHz)" : "standard (100 kHz)");
|
||||
|
||||
return 0;
|
||||
|
||||
error_cleanup:
|
||||
if (dev->irq != NO_IRQ) {
|
||||
iic_interrupt_mode(dev, 0);
|
||||
free_irq(dev->irq, dev);
|
||||
}
|
||||
|
||||
if (dev->vaddr)
|
||||
iounmap(dev->vaddr);
|
||||
|
||||
dev_set_drvdata(&ofdev->dev, NULL);
|
||||
kfree(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Cleanup initialized IIC interface
|
||||
*/
|
||||
static int __devexit iic_remove(struct of_device *ofdev)
|
||||
{
|
||||
struct ibm_iic_private *dev = dev_get_drvdata(&ofdev->dev);
|
||||
|
||||
dev_set_drvdata(&ofdev->dev, NULL);
|
||||
|
||||
i2c_del_adapter(&dev->adap);
|
||||
|
||||
if (dev->irq != NO_IRQ) {
|
||||
iic_interrupt_mode(dev, 0);
|
||||
free_irq(dev->irq, dev);
|
||||
}
|
||||
|
||||
iounmap(dev->vaddr);
|
||||
kfree(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id ibm_iic_match[] = {
|
||||
{ .compatible = "ibm,iic-405ex", },
|
||||
{ .compatible = "ibm,iic-405gp", },
|
||||
{ .compatible = "ibm,iic-440gp", },
|
||||
{ .compatible = "ibm,iic-440gpx", },
|
||||
{ .compatible = "ibm,iic-440grx", },
|
||||
{}
|
||||
};
|
||||
|
||||
static struct of_platform_driver ibm_iic_driver = {
|
||||
.name = "ibm-iic",
|
||||
.match_table = ibm_iic_match,
|
||||
.probe = iic_probe,
|
||||
.remove = __devexit_p(iic_remove),
|
||||
};
|
||||
|
||||
static int __init iic_init(void)
|
||||
{
|
||||
return of_register_platform_driver(&ibm_iic_driver);
|
||||
}
|
||||
|
||||
static void __exit iic_exit(void)
|
||||
{
|
||||
of_unregister_platform_driver(&ibm_iic_driver);
|
||||
}
|
||||
#endif /* CONFIG_IBM_OCP */
|
||||
|
||||
module_init(iic_init);
|
||||
module_exit(iic_exit);
|
||||
|
||||
@@ -550,3 +550,4 @@ module_exit (i2c_iop3xx_exit);
|
||||
MODULE_AUTHOR("D-TACQ Solutions Ltd <www.d-tacq.com>");
|
||||
MODULE_DESCRIPTION("IOP3xx iic algorithm and driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:IOP3xx-I2C");
|
||||
|
||||
@@ -164,4 +164,5 @@ module_exit(ixp2000_i2c_exit);
|
||||
MODULE_AUTHOR ("Deepak Saxena <dsaxena@plexity.net>");
|
||||
MODULE_DESCRIPTION("IXP2000 GPIO-based I2C bus driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:IXP2000-I2C");
|
||||
|
||||
|
||||
@@ -392,6 +392,9 @@ static int fsl_i2c_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
};
|
||||
|
||||
/* work with hotplug and coldplug */
|
||||
MODULE_ALIAS("platform:fsl-i2c");
|
||||
|
||||
/* Structure for a device driver */
|
||||
static struct platform_driver fsl_i2c_driver = {
|
||||
.probe = fsl_i2c_probe,
|
||||
|
||||
@@ -312,6 +312,9 @@ static int __devexit ocores_i2c_remove(struct platform_device* pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* work with hotplug and coldplug */
|
||||
MODULE_ALIAS("platform:ocores-i2c");
|
||||
|
||||
static struct platform_driver ocores_i2c_driver = {
|
||||
.probe = ocores_i2c_probe,
|
||||
.remove = __devexit_p(ocores_i2c_remove),
|
||||
|
||||
@@ -693,3 +693,4 @@ module_exit(omap_i2c_exit_driver);
|
||||
MODULE_AUTHOR("MontaVista Software, Inc. (and others)");
|
||||
MODULE_DESCRIPTION("TI OMAP I2C bus adapter");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:i2c_omap");
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/*
|
||||
* i2c-pca-isa.c driver for PCA9564 on ISA boards
|
||||
* Copyright (C) 2004 Arcom Control Systems
|
||||
* Copyright (C) 2008 Pengutronix
|
||||
*
|
||||
* 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
|
||||
@@ -22,11 +23,9 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/wait.h>
|
||||
|
||||
#include <linux/isa.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-algo-pca.h>
|
||||
@@ -34,13 +33,9 @@
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include "../algos/i2c-algo-pca.h"
|
||||
|
||||
#define DRIVER "i2c-pca-isa"
|
||||
#define IO_SIZE 4
|
||||
|
||||
#undef DEBUG_IO
|
||||
//#define DEBUG_IO
|
||||
|
||||
static unsigned long base = 0x330;
|
||||
static int irq = 10;
|
||||
|
||||
@@ -48,22 +43,9 @@ static int irq = 10;
|
||||
* in the actual clock rate */
|
||||
static int clock = I2C_PCA_CON_59kHz;
|
||||
|
||||
static int own = 0x55;
|
||||
|
||||
static wait_queue_head_t pca_wait;
|
||||
|
||||
static int pca_isa_getown(struct i2c_algo_pca_data *adap)
|
||||
{
|
||||
return (own);
|
||||
}
|
||||
|
||||
static int pca_isa_getclock(struct i2c_algo_pca_data *adap)
|
||||
{
|
||||
return (clock);
|
||||
}
|
||||
|
||||
static void
|
||||
pca_isa_writebyte(struct i2c_algo_pca_data *adap, int reg, int val)
|
||||
static void pca_isa_writebyte(void *pd, int reg, int val)
|
||||
{
|
||||
#ifdef DEBUG_IO
|
||||
static char *names[] = { "T/O", "DAT", "ADR", "CON" };
|
||||
@@ -72,44 +54,49 @@ pca_isa_writebyte(struct i2c_algo_pca_data *adap, int reg, int val)
|
||||
outb(val, base+reg);
|
||||
}
|
||||
|
||||
static int
|
||||
pca_isa_readbyte(struct i2c_algo_pca_data *adap, int reg)
|
||||
static int pca_isa_readbyte(void *pd, int reg)
|
||||
{
|
||||
int res = inb(base+reg);
|
||||
#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);
|
||||
}
|
||||
#endif
|
||||
return res;
|
||||
}
|
||||
|
||||
static int pca_isa_waitforinterrupt(struct i2c_algo_pca_data *adap)
|
||||
static int pca_isa_waitforcompletion(void *pd)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (irq > -1) {
|
||||
ret = wait_event_interruptible(pca_wait,
|
||||
pca_isa_readbyte(adap, I2C_PCA_CON) & I2C_PCA_CON_SI);
|
||||
pca_isa_readbyte(pd, I2C_PCA_CON) & I2C_PCA_CON_SI);
|
||||
} else {
|
||||
while ((pca_isa_readbyte(adap, I2C_PCA_CON) & I2C_PCA_CON_SI) == 0)
|
||||
while ((pca_isa_readbyte(pd, I2C_PCA_CON) & I2C_PCA_CON_SI) == 0)
|
||||
udelay(100);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void pca_isa_resetchip(void *pd)
|
||||
{
|
||||
/* apparently only an external reset will do it. not a lot can be done */
|
||||
printk(KERN_WARNING DRIVER ": Haven't figured out how to do a reset yet\n");
|
||||
}
|
||||
|
||||
static irqreturn_t pca_handler(int this_irq, void *dev_id) {
|
||||
wake_up_interruptible(&pca_wait);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static struct i2c_algo_pca_data pca_isa_data = {
|
||||
.get_own = pca_isa_getown,
|
||||
.get_clock = pca_isa_getclock,
|
||||
/* .data intentionally left NULL, not needed with ISA */
|
||||
.write_byte = pca_isa_writebyte,
|
||||
.read_byte = pca_isa_readbyte,
|
||||
.wait_for_interrupt = pca_isa_waitforinterrupt,
|
||||
.wait_for_completion = pca_isa_waitforcompletion,
|
||||
.reset_chip = pca_isa_resetchip,
|
||||
};
|
||||
|
||||
static struct i2c_adapter pca_isa_ops = {
|
||||
@@ -117,6 +104,7 @@ static struct i2c_adapter pca_isa_ops = {
|
||||
.id = I2C_HW_A_ISA,
|
||||
.algo_data = &pca_isa_data,
|
||||
.name = "PCA9564 ISA Adapter",
|
||||
.timeout = 100,
|
||||
};
|
||||
|
||||
static int __devinit pca_isa_probe(struct device *dev, unsigned int id)
|
||||
@@ -144,6 +132,7 @@ static int __devinit pca_isa_probe(struct device *dev, unsigned int id)
|
||||
}
|
||||
}
|
||||
|
||||
pca_isa_data.i2c_clock = clock;
|
||||
if (i2c_pca_add_bus(&pca_isa_ops) < 0) {
|
||||
dev_err(dev, "Failed to add i2c bus\n");
|
||||
goto out_irq;
|
||||
@@ -178,7 +167,7 @@ static struct isa_driver pca_isa_driver = {
|
||||
.remove = __devexit_p(pca_isa_remove),
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "i2c-pca-isa",
|
||||
.name = DRIVER,
|
||||
}
|
||||
};
|
||||
|
||||
@@ -204,7 +193,5 @@ MODULE_PARM_DESC(irq, "IRQ");
|
||||
module_param(clock, int, 0);
|
||||
MODULE_PARM_DESC(clock, "Clock rate as described in table 1 of PCA9564 datasheet");
|
||||
|
||||
module_param(own, int, 0); /* the driver can't do slave mode, so there's no real point in this */
|
||||
|
||||
module_init(pca_isa_init);
|
||||
module_exit(pca_isa_exit);
|
||||
|
||||
298
drivers/i2c/busses/i2c-pca-platform.c
Normal file
298
drivers/i2c/busses/i2c-pca-platform.c
Normal file
@@ -0,0 +1,298 @@
|
||||
/*
|
||||
* i2c_pca_platform.c
|
||||
*
|
||||
* Platform driver for the PCA9564 I2C controller.
|
||||
*
|
||||
* Copyright (C) 2008 Pengutronix
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/i2c-algo-pca.h>
|
||||
#include <linux/i2c-pca-platform.h>
|
||||
#include <linux/gpio.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#define res_len(r) ((r)->end - (r)->start + 1)
|
||||
|
||||
struct i2c_pca_pf_data {
|
||||
void __iomem *reg_base;
|
||||
int irq; /* if 0, use polling */
|
||||
int gpio;
|
||||
wait_queue_head_t wait;
|
||||
struct i2c_adapter adap;
|
||||
struct i2c_algo_pca_data algo_data;
|
||||
unsigned long io_base;
|
||||
unsigned long io_size;
|
||||
};
|
||||
|
||||
/* Read/Write functions for different register alignments */
|
||||
|
||||
static int i2c_pca_pf_readbyte8(void *pd, int reg)
|
||||
{
|
||||
struct i2c_pca_pf_data *i2c = pd;
|
||||
return ioread8(i2c->reg_base + reg);
|
||||
}
|
||||
|
||||
static int i2c_pca_pf_readbyte16(void *pd, int reg)
|
||||
{
|
||||
struct i2c_pca_pf_data *i2c = pd;
|
||||
return ioread8(i2c->reg_base + reg * 2);
|
||||
}
|
||||
|
||||
static int i2c_pca_pf_readbyte32(void *pd, int reg)
|
||||
{
|
||||
struct i2c_pca_pf_data *i2c = pd;
|
||||
return ioread8(i2c->reg_base + reg * 4);
|
||||
}
|
||||
|
||||
static void i2c_pca_pf_writebyte8(void *pd, int reg, int val)
|
||||
{
|
||||
struct i2c_pca_pf_data *i2c = pd;
|
||||
iowrite8(val, i2c->reg_base + reg);
|
||||
}
|
||||
|
||||
static void i2c_pca_pf_writebyte16(void *pd, int reg, int val)
|
||||
{
|
||||
struct i2c_pca_pf_data *i2c = pd;
|
||||
iowrite8(val, i2c->reg_base + reg * 2);
|
||||
}
|
||||
|
||||
static void i2c_pca_pf_writebyte32(void *pd, int reg, int val)
|
||||
{
|
||||
struct i2c_pca_pf_data *i2c = pd;
|
||||
iowrite8(val, i2c->reg_base + reg * 4);
|
||||
}
|
||||
|
||||
|
||||
static int i2c_pca_pf_waitforcompletion(void *pd)
|
||||
{
|
||||
struct i2c_pca_pf_data *i2c = pd;
|
||||
int ret = 0;
|
||||
|
||||
if (i2c->irq) {
|
||||
ret = wait_event_interruptible(i2c->wait,
|
||||
i2c->algo_data.read_byte(i2c, I2C_PCA_CON)
|
||||
& I2C_PCA_CON_SI);
|
||||
} else {
|
||||
/*
|
||||
* Do polling...
|
||||
* XXX: Could get stuck in extreme cases!
|
||||
* Maybe add timeout, but using irqs is preferred anyhow.
|
||||
*/
|
||||
while ((i2c->algo_data.read_byte(i2c, I2C_PCA_CON)
|
||||
& I2C_PCA_CON_SI) == 0)
|
||||
udelay(100);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void i2c_pca_pf_dummyreset(void *pd)
|
||||
{
|
||||
struct i2c_pca_pf_data *i2c = pd;
|
||||
printk(KERN_WARNING "%s: No reset-pin found. Chip may get stuck!\n",
|
||||
i2c->adap.name);
|
||||
}
|
||||
|
||||
static void i2c_pca_pf_resetchip(void *pd)
|
||||
{
|
||||
struct i2c_pca_pf_data *i2c = pd;
|
||||
|
||||
gpio_set_value(i2c->gpio, 0);
|
||||
ndelay(100);
|
||||
gpio_set_value(i2c->gpio, 1);
|
||||
}
|
||||
|
||||
static irqreturn_t i2c_pca_pf_handler(int this_irq, void *dev_id)
|
||||
{
|
||||
struct i2c_pca_pf_data *i2c = dev_id;
|
||||
|
||||
if ((i2c->algo_data.read_byte(i2c, I2C_PCA_CON) & I2C_PCA_CON_SI) == 0)
|
||||
return IRQ_NONE;
|
||||
|
||||
wake_up_interruptible(&i2c->wait);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
||||
static int __devinit i2c_pca_pf_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct i2c_pca_pf_data *i2c;
|
||||
struct resource *res;
|
||||
struct i2c_pca9564_pf_platform_data *platform_data =
|
||||
pdev->dev.platform_data;
|
||||
int ret = 0;
|
||||
int irq;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
/* If irq is 0, we do polling. */
|
||||
|
||||
if (res == NULL) {
|
||||
ret = -ENODEV;
|
||||
goto e_print;
|
||||
}
|
||||
|
||||
if (!request_mem_region(res->start, res_len(res), res->name)) {
|
||||
ret = -ENOMEM;
|
||||
goto e_print;
|
||||
}
|
||||
|
||||
i2c = kzalloc(sizeof(struct i2c_pca_pf_data), GFP_KERNEL);
|
||||
if (!i2c) {
|
||||
ret = -ENOMEM;
|
||||
goto e_alloc;
|
||||
}
|
||||
|
||||
init_waitqueue_head(&i2c->wait);
|
||||
|
||||
i2c->reg_base = ioremap(res->start, res_len(res));
|
||||
if (!i2c->reg_base) {
|
||||
ret = -EIO;
|
||||
goto e_remap;
|
||||
}
|
||||
i2c->io_base = res->start;
|
||||
i2c->io_size = res_len(res);
|
||||
i2c->irq = irq;
|
||||
|
||||
i2c->adap.nr = pdev->id >= 0 ? pdev->id : 0;
|
||||
i2c->adap.owner = THIS_MODULE;
|
||||
snprintf(i2c->adap.name, sizeof(i2c->adap.name), "PCA9564 at 0x%08lx",
|
||||
(unsigned long) res->start);
|
||||
i2c->adap.algo_data = &i2c->algo_data;
|
||||
i2c->adap.dev.parent = &pdev->dev;
|
||||
i2c->adap.timeout = platform_data->timeout;
|
||||
|
||||
i2c->algo_data.i2c_clock = platform_data->i2c_clock_speed;
|
||||
i2c->algo_data.data = i2c;
|
||||
|
||||
switch (res->flags & IORESOURCE_MEM_TYPE_MASK) {
|
||||
case IORESOURCE_MEM_32BIT:
|
||||
i2c->algo_data.write_byte = i2c_pca_pf_writebyte32;
|
||||
i2c->algo_data.read_byte = i2c_pca_pf_readbyte32;
|
||||
break;
|
||||
case IORESOURCE_MEM_16BIT:
|
||||
i2c->algo_data.write_byte = i2c_pca_pf_writebyte16;
|
||||
i2c->algo_data.read_byte = i2c_pca_pf_readbyte16;
|
||||
break;
|
||||
case IORESOURCE_MEM_8BIT:
|
||||
default:
|
||||
i2c->algo_data.write_byte = i2c_pca_pf_writebyte8;
|
||||
i2c->algo_data.read_byte = i2c_pca_pf_readbyte8;
|
||||
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 */
|
||||
if (i2c->gpio > -1) {
|
||||
ret = gpio_request(i2c->gpio, i2c->adap.name);
|
||||
if (ret == 0) {
|
||||
gpio_direction_output(i2c->gpio, 1);
|
||||
i2c->algo_data.reset_chip = i2c_pca_pf_resetchip;
|
||||
} else {
|
||||
printk(KERN_WARNING "%s: Registering gpio failed!\n",
|
||||
i2c->adap.name);
|
||||
i2c->gpio = ret;
|
||||
}
|
||||
}
|
||||
|
||||
if (irq) {
|
||||
ret = request_irq(irq, i2c_pca_pf_handler,
|
||||
IRQF_TRIGGER_FALLING, i2c->adap.name, i2c);
|
||||
if (ret)
|
||||
goto e_reqirq;
|
||||
}
|
||||
|
||||
if (i2c_pca_add_numbered_bus(&i2c->adap) < 0) {
|
||||
ret = -ENODEV;
|
||||
goto e_adapt;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, i2c);
|
||||
|
||||
printk(KERN_INFO "%s registered.\n", i2c->adap.name);
|
||||
|
||||
return 0;
|
||||
|
||||
e_adapt:
|
||||
if (irq)
|
||||
free_irq(irq, i2c);
|
||||
e_reqirq:
|
||||
if (i2c->gpio > -1)
|
||||
gpio_free(i2c->gpio);
|
||||
|
||||
iounmap(i2c->reg_base);
|
||||
e_remap:
|
||||
kfree(i2c);
|
||||
e_alloc:
|
||||
release_mem_region(res->start, res_len(res));
|
||||
e_print:
|
||||
printk(KERN_ERR "Registering PCA9564 FAILED! (%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devexit i2c_pca_pf_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct i2c_pca_pf_data *i2c = platform_get_drvdata(pdev);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
i2c_del_adapter(&i2c->adap);
|
||||
|
||||
if (i2c->irq)
|
||||
free_irq(i2c->irq, i2c);
|
||||
|
||||
if (i2c->gpio > -1)
|
||||
gpio_free(i2c->gpio);
|
||||
|
||||
iounmap(i2c->reg_base);
|
||||
release_mem_region(i2c->io_base, i2c->io_size);
|
||||
kfree(i2c);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver i2c_pca_pf_driver = {
|
||||
.probe = i2c_pca_pf_probe,
|
||||
.remove = __devexit_p(i2c_pca_pf_remove),
|
||||
.driver = {
|
||||
.name = "i2c-pca-platform",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init i2c_pca_pf_init(void)
|
||||
{
|
||||
return platform_driver_register(&i2c_pca_pf_driver);
|
||||
}
|
||||
|
||||
static void __exit i2c_pca_pf_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&i2c_pca_pf_driver);
|
||||
}
|
||||
|
||||
MODULE_AUTHOR("Wolfram Sang <w.sang@pengutronix.de>");
|
||||
MODULE_DESCRIPTION("I2C-PCA9564 platform driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
module_init(i2c_pca_pf_init);
|
||||
module_exit(i2c_pca_pf_exit);
|
||||
|
||||
@@ -467,7 +467,7 @@ static enum pmcmsptwi_xfer_result pmcmsptwi_xfer_cmd(
|
||||
(cmd->read_len == 0 || cmd->write_len == 0))) {
|
||||
dev_err(&pmcmsptwi_adapter.dev,
|
||||
"%s: Cannot transfer less than 1 byte\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -475,7 +475,7 @@ static enum pmcmsptwi_xfer_result pmcmsptwi_xfer_cmd(
|
||||
cmd->write_len > MSP_MAX_BYTES_PER_RW) {
|
||||
dev_err(&pmcmsptwi_adapter.dev,
|
||||
"%s: Cannot transfer more than %d bytes\n",
|
||||
__FUNCTION__, MSP_MAX_BYTES_PER_RW);
|
||||
__func__, MSP_MAX_BYTES_PER_RW);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -627,6 +627,9 @@ static struct i2c_adapter pmcmsptwi_adapter = {
|
||||
.name = DRV_NAME,
|
||||
};
|
||||
|
||||
/* work with hotplug and coldplug */
|
||||
MODULE_ALIAS("platform:" DRV_NAME);
|
||||
|
||||
static struct platform_driver pmcmsptwi_driver = {
|
||||
.probe = pmcmsptwi_probe,
|
||||
.remove = __devexit_p(pmcmsptwi_remove),
|
||||
|
||||
@@ -76,7 +76,7 @@ static int i2c_pnx_start(unsigned char slave_addr, struct i2c_adapter *adap)
|
||||
{
|
||||
struct i2c_pnx_algo_data *alg_data = adap->algo_data;
|
||||
|
||||
dev_dbg(&adap->dev, "%s(): addr 0x%x mode %d\n", __FUNCTION__,
|
||||
dev_dbg(&adap->dev, "%s(): addr 0x%x mode %d\n", __func__,
|
||||
slave_addr, alg_data->mif.mode);
|
||||
|
||||
/* Check for 7 bit slave addresses only */
|
||||
@@ -110,14 +110,14 @@ static int i2c_pnx_start(unsigned char slave_addr, struct i2c_adapter *adap)
|
||||
iowrite32(ioread32(I2C_REG_STS(alg_data)) | mstatus_tdi | mstatus_afi,
|
||||
I2C_REG_STS(alg_data));
|
||||
|
||||
dev_dbg(&adap->dev, "%s(): sending %#x\n", __FUNCTION__,
|
||||
dev_dbg(&adap->dev, "%s(): sending %#x\n", __func__,
|
||||
(slave_addr << 1) | start_bit | alg_data->mif.mode);
|
||||
|
||||
/* Write the slave address, START bit and R/W bit */
|
||||
iowrite32((slave_addr << 1) | start_bit | alg_data->mif.mode,
|
||||
I2C_REG_TX(alg_data));
|
||||
|
||||
dev_dbg(&adap->dev, "%s(): exit\n", __FUNCTION__);
|
||||
dev_dbg(&adap->dev, "%s(): exit\n", __func__);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -135,7 +135,7 @@ static void i2c_pnx_stop(struct i2c_adapter *adap)
|
||||
long timeout = 1000;
|
||||
|
||||
dev_dbg(&adap->dev, "%s(): entering: stat = %04x.\n",
|
||||
__FUNCTION__, ioread32(I2C_REG_STS(alg_data)));
|
||||
__func__, ioread32(I2C_REG_STS(alg_data)));
|
||||
|
||||
/* Write a STOP bit to TX FIFO */
|
||||
iowrite32(0xff | stop_bit, I2C_REG_TX(alg_data));
|
||||
@@ -149,7 +149,7 @@ static void i2c_pnx_stop(struct i2c_adapter *adap)
|
||||
}
|
||||
|
||||
dev_dbg(&adap->dev, "%s(): exiting: stat = %04x.\n",
|
||||
__FUNCTION__, ioread32(I2C_REG_STS(alg_data)));
|
||||
__func__, ioread32(I2C_REG_STS(alg_data)));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -164,7 +164,7 @@ static int i2c_pnx_master_xmit(struct i2c_adapter *adap)
|
||||
u32 val;
|
||||
|
||||
dev_dbg(&adap->dev, "%s(): entering: stat = %04x.\n",
|
||||
__FUNCTION__, ioread32(I2C_REG_STS(alg_data)));
|
||||
__func__, ioread32(I2C_REG_STS(alg_data)));
|
||||
|
||||
if (alg_data->mif.len > 0) {
|
||||
/* We still have something to talk about... */
|
||||
@@ -179,7 +179,7 @@ static int i2c_pnx_master_xmit(struct i2c_adapter *adap)
|
||||
alg_data->mif.len--;
|
||||
iowrite32(val, I2C_REG_TX(alg_data));
|
||||
|
||||
dev_dbg(&adap->dev, "%s(): xmit %#x [%d]\n", __FUNCTION__,
|
||||
dev_dbg(&adap->dev, "%s(): xmit %#x [%d]\n", __func__,
|
||||
val, alg_data->mif.len + 1);
|
||||
|
||||
if (alg_data->mif.len == 0) {
|
||||
@@ -197,7 +197,7 @@ static int i2c_pnx_master_xmit(struct i2c_adapter *adap)
|
||||
del_timer_sync(&alg_data->mif.timer);
|
||||
|
||||
dev_dbg(&adap->dev, "%s(): Waking up xfer routine.\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
|
||||
complete(&alg_data->mif.complete);
|
||||
}
|
||||
@@ -213,13 +213,13 @@ static int i2c_pnx_master_xmit(struct i2c_adapter *adap)
|
||||
/* Stop timer. */
|
||||
del_timer_sync(&alg_data->mif.timer);
|
||||
dev_dbg(&adap->dev, "%s(): Waking up xfer routine after "
|
||||
"zero-xfer.\n", __FUNCTION__);
|
||||
"zero-xfer.\n", __func__);
|
||||
|
||||
complete(&alg_data->mif.complete);
|
||||
}
|
||||
|
||||
dev_dbg(&adap->dev, "%s(): exiting: stat = %04x.\n",
|
||||
__FUNCTION__, ioread32(I2C_REG_STS(alg_data)));
|
||||
__func__, ioread32(I2C_REG_STS(alg_data)));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -237,14 +237,14 @@ static int i2c_pnx_master_rcv(struct i2c_adapter *adap)
|
||||
u32 ctl = 0;
|
||||
|
||||
dev_dbg(&adap->dev, "%s(): entering: stat = %04x.\n",
|
||||
__FUNCTION__, ioread32(I2C_REG_STS(alg_data)));
|
||||
__func__, ioread32(I2C_REG_STS(alg_data)));
|
||||
|
||||
/* Check, whether there is already data,
|
||||
* or we didn't 'ask' for it yet.
|
||||
*/
|
||||
if (ioread32(I2C_REG_STS(alg_data)) & mstatus_rfe) {
|
||||
dev_dbg(&adap->dev, "%s(): Write dummy data to fill "
|
||||
"Rx-fifo...\n", __FUNCTION__);
|
||||
"Rx-fifo...\n", __func__);
|
||||
|
||||
if (alg_data->mif.len == 1) {
|
||||
/* Last byte, do not acknowledge next rcv. */
|
||||
@@ -276,7 +276,7 @@ static int i2c_pnx_master_rcv(struct i2c_adapter *adap)
|
||||
if (alg_data->mif.len > 0) {
|
||||
val = ioread32(I2C_REG_RX(alg_data));
|
||||
*alg_data->mif.buf++ = (u8) (val & 0xff);
|
||||
dev_dbg(&adap->dev, "%s(): rcv 0x%x [%d]\n", __FUNCTION__, val,
|
||||
dev_dbg(&adap->dev, "%s(): rcv 0x%x [%d]\n", __func__, val,
|
||||
alg_data->mif.len);
|
||||
|
||||
alg_data->mif.len--;
|
||||
@@ -300,7 +300,7 @@ static int i2c_pnx_master_rcv(struct i2c_adapter *adap)
|
||||
}
|
||||
|
||||
dev_dbg(&adap->dev, "%s(): exiting: stat = %04x.\n",
|
||||
__FUNCTION__, ioread32(I2C_REG_STS(alg_data)));
|
||||
__func__, ioread32(I2C_REG_STS(alg_data)));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -312,7 +312,7 @@ static irqreturn_t i2c_pnx_interrupt(int irq, void *dev_id)
|
||||
struct i2c_pnx_algo_data *alg_data = adap->algo_data;
|
||||
|
||||
dev_dbg(&adap->dev, "%s(): mstat = %x mctrl = %x, mode = %d\n",
|
||||
__FUNCTION__,
|
||||
__func__,
|
||||
ioread32(I2C_REG_STS(alg_data)),
|
||||
ioread32(I2C_REG_CTL(alg_data)),
|
||||
alg_data->mif.mode);
|
||||
@@ -336,7 +336,7 @@ static irqreturn_t i2c_pnx_interrupt(int irq, void *dev_id)
|
||||
/* Slave did not acknowledge, generate a STOP */
|
||||
dev_dbg(&adap->dev, "%s(): "
|
||||
"Slave did not acknowledge, generating a STOP.\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
i2c_pnx_stop(adap);
|
||||
|
||||
/* Disable master interrupts. */
|
||||
@@ -375,7 +375,7 @@ static irqreturn_t i2c_pnx_interrupt(int irq, void *dev_id)
|
||||
iowrite32(stat | mstatus_tdi | mstatus_afi, I2C_REG_STS(alg_data));
|
||||
|
||||
dev_dbg(&adap->dev, "%s(): exiting, stat = %x ctrl = %x.\n",
|
||||
__FUNCTION__, ioread32(I2C_REG_STS(alg_data)),
|
||||
__func__, ioread32(I2C_REG_STS(alg_data)),
|
||||
ioread32(I2C_REG_CTL(alg_data)));
|
||||
|
||||
return IRQ_HANDLED;
|
||||
@@ -447,7 +447,7 @@ i2c_pnx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
|
||||
u32 stat = ioread32(I2C_REG_STS(alg_data));
|
||||
|
||||
dev_dbg(&adap->dev, "%s(): entering: %d messages, stat = %04x.\n",
|
||||
__FUNCTION__, num, ioread32(I2C_REG_STS(alg_data)));
|
||||
__func__, num, ioread32(I2C_REG_STS(alg_data)));
|
||||
|
||||
bus_reset_if_active(adap);
|
||||
|
||||
@@ -473,7 +473,7 @@ i2c_pnx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
|
||||
alg_data->mif.ret = 0;
|
||||
alg_data->last = (i == num - 1);
|
||||
|
||||
dev_dbg(&adap->dev, "%s(): mode %d, %d bytes\n", __FUNCTION__,
|
||||
dev_dbg(&adap->dev, "%s(): mode %d, %d bytes\n", __func__,
|
||||
alg_data->mif.mode,
|
||||
alg_data->mif.len);
|
||||
|
||||
@@ -498,7 +498,7 @@ i2c_pnx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
|
||||
if (!(rc = alg_data->mif.ret))
|
||||
completed++;
|
||||
dev_dbg(&adap->dev, "%s(): Complete, return code = %d.\n",
|
||||
__FUNCTION__, rc);
|
||||
__func__, rc);
|
||||
|
||||
/* Clear TDI and AFI bits in case they are set. */
|
||||
if ((stat = ioread32(I2C_REG_STS(alg_data))) & mstatus_tdi) {
|
||||
@@ -522,7 +522,7 @@ i2c_pnx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
|
||||
alg_data->mif.len = 0;
|
||||
|
||||
dev_dbg(&adap->dev, "%s(): exiting, stat = %x\n",
|
||||
__FUNCTION__, ioread32(I2C_REG_STS(alg_data)));
|
||||
__func__, ioread32(I2C_REG_STS(alg_data)));
|
||||
|
||||
if (completed != num)
|
||||
return ((rc < 0) ? rc : -EREMOTEIO);
|
||||
@@ -563,7 +563,7 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev)
|
||||
|
||||
if (!i2c_pnx || !i2c_pnx->adapter) {
|
||||
dev_err(&pdev->dev, "%s: no platform data supplied\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@@ -697,6 +697,7 @@ static void __exit i2c_adap_pnx_exit(void)
|
||||
MODULE_AUTHOR("Vitaly Wool, Dennis Kovalev <source@mvista.com>");
|
||||
MODULE_DESCRIPTION("I2C driver for Philips IP3204-based I2C busses");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:pnx-i2c");
|
||||
|
||||
/* We need to make sure I2C is initialized before USB */
|
||||
subsys_initcall(i2c_adap_pnx_init);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user