RE: [PATCH v5 3/4] drivers/i2c/busses/i2c-at91.c: add new driver

2011-11-23 Thread Voss, Nikolaus
Hi,

Carsten Behling wrote on 2011-11-23:

 this case is already catched in at91_do_twi_transfer():
 
 Sorry, I did not found this code in your patch.
 (http://www.mail-archive.com/linux-i2c@vger.kernel.org/msg06556.html):
 
 +   if (is_read) {
 +   if (!dev-buf_len)

yes, this won't work for buf_len == 1. It is corrected in
https://lkml.org/lkml/2011/11/18/223 which I held back for some time
as it should have been just a feature extension. I was not aware it
also fixed the buf_len = 1 bug. Sorry for that...

(Explanation: in the first implementation I immediately decremented
buf_len, so buf_len == 1 could not occur. Later I removed that but
did not fully fold it into the base patch.)

Thanks,
Niko

--
To unsubscribe from this list: send the line unsubscribe linux-i2c in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


AW: [PATCH v5 3/4] drivers/i2c/busses/i2c-at91.c: add new driver

2011-11-23 Thread Carsten Behling
 this case is already catched in at91_do_twi_transfer():

Sorry, I did not found this code in your patch.
(http://www.mail-archive.com/linux-i2c@vger.kernel.org/msg06556.html):

 +   if (is_read) {
 +   if (!dev-buf_len)
 +   at91_twi_write(dev, AT91_TWI_CR,
 +  AT91_TWI_START | AT91_TWI_STOP);
 +   else
 +   at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_START);
 +   at91_twi_write(dev, AT91_TWI_IER,
 +  AT91_TWI_TXCOMP | AT91_TWI_RXRDY);
 +   } else {
 +   at91_twi_write_next_byte(dev);
 +   at91_twi_write(dev, AT91_TWI_IER,
 +  AT91_TWI_TXCOMP | AT91_TWI_TXRDY);
 +   }

Is there a more recent version ?

Mit freundlichen Grüßen / Best regards
Carsten Behling

Development Engineer
Garz  Fricke GmbH
Tempowerkring 2, 21079 Hamburg - Germany
Amtsgericht Hamburg HRB 60514
Geschäftsführer: Manfred Garz, Matthias Fricke
Phone: +49 (0) 40 791 899 - 56
Fax:+49 40 / 791 899 - 39
www.garz-fricke.com 

 


-Ursprüngliche Nachricht-
Von: Voss, Nikolaus [mailto:n.v...@weinmann.de] 
Gesendet: Dienstag, 22. November 2011 17:26
An: Carsten Behling
Cc: 'linux-i2c@vger.kernel.org'; 'linux-arm-ker...@lists.infradead.org'; 
'linux-ker...@vger.kernel.org'
Betreff: RE: [PATCH v5 3/4] drivers/i2c/busses/i2c-at91.c: add new driver

Hi,

Carsten Behling wrote on 2011-11-22:
 +static void at91_twi_read_next_byte(struct at91_twi_dev *dev)
 +{
 +   *dev-buf = at91_twi_read(dev, AT91_TWI_RHR)  0xff;
 +
 +   /* send stop if second but last byte has been read */
 +   if (--dev-buf_len == 1)
 +   at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_STOP);
 
 
 
 If dev-buf_len =1 at the beginning of a read transfer, a stop condition will
 never be send.

this case is already catched in at91_do_twi_transfer():

+   if (dev-msg-flags  I2C_M_RD) {
+   unsigned start_flags = AT91_TWI_START;
+
+   /* if only one byte is to be read, immediately stop transfer */
+   if (dev-buf_len = 1  !(dev-msg-flags  I2C_M_RECV_LEN))
+   start_flags |= AT91_TWI_STOP;
+   at91_twi_write(dev, AT91_TWI_CR, start_flags);

Thanks for reviewing,
Niko

--
To unsubscribe from this list: send the line unsubscribe linux-i2c in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[GIT PULL] i2c fixes for Linux 3.2

2011-11-23 Thread Jean Delvare
Hi Linus,

Please pull i2c subsystem fixes for Linux 3.2 from:

git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging.git i2c-for-linus

 Documentation/i2c/ten-bit-addresses |   36 ++
 drivers/i2c/algos/i2c-algo-bit.c|4 +-
 drivers/i2c/i2c-core.c  |4 ++-
 drivers/i2c/i2c-dev.c   |2 +-
 include/linux/i2c.h |3 --
 5 files changed, 25 insertions(+), 24 deletions(-)

---

Jean Delvare (2):
  i2c: Fix device name for 10-bit slave address
  i2c: Delete ANY_I2C_BUS

Jeffrey (Sheng-Hui) Chu (1):
  i2c-algo-bit: Generate correct i2c address sequence for 10-bit target

Shubhrajyoti D (1):
  i2c: Make i2cdev_notifier_call static

Thanks,
-- 
Jean Delvare
--
To unsubscribe from this list: send the line unsubscribe linux-i2c in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


AW: [PATCH v5 3/4] drivers/i2c/busses/i2c-at91.c: add new driver

2011-11-23 Thread Carsten Behling
Hi,

I try to use the at24 eeprom driver on top of this driver.

This EEPROM (24c32) works with two address bytes.

Writing results in a call to at91_twi_xfer() with num=1.
In this case the internal address register is not used and the address is sent 
out within the buffer.

Reading results in a call to at91_twi_xfer() with num=2.
In this case the internal address register is used.

However the MSB of the internal address resides in msg-buf[0] and the LSB 
resides in msg-buf[1] of the first message.

As a result the code:

+   for (i = 0; i  msg-len; ++i) {
+   internal_address |= ((unsigned)msg-buf[i])  (8 * i);
+   int_addr_flag += AT91_TWI_IADRSZ_1;
+   }
+   at91_twi_write(dev, AT91_TWI_IADR, internal_address);

constructs an internal address in a wrong byte order.

Example: Try to read from address 0x100:

msg[0]-buf[0] = 0x1; 
msg[0]-buf[1] = 0x0;

results in

internal_address = 0x1;

I think it must be:

+   for (i = 0; i  msg-len; ++i) {
+   internal_address |= ((unsigned)msg-buf[msg-len-1-i]) 
 (8 * i);
+   int_addr_flag += AT91_TWI_IADRSZ_1;
+   }
+   at91_twi_write(dev, AT91_TWI_IADR, internal_address);

... or the at24 eeprom driver constructs the wrong internal address ...

Mit freundlichen Grüßen / Best regards
Carsten Behling

Development Engineer
Garz  Fricke GmbH
Tempowerkring 2, 21079 Hamburg - Germany
Amtsgericht Hamburg HRB 60514
Geschäftsführer: Manfred Garz, Matthias Fricke
Phone: +49 (0) 40 791 899 - 56
Fax:+49 40 / 791 899 - 39
www.garz-fricke.com 

 


-Ursprüngliche Nachricht-
Von: Voss, Nikolaus [mailto:n.v...@weinmann.de] 
Gesendet: Mittwoch, 23. November 2011 11:29
An: Carsten Behling
Cc: 'linux-i2c@vger.kernel.org'; 'linux-arm-ker...@lists.infradead.org'; 
'linux-ker...@vger.kernel.org'
Betreff: RE: [PATCH v5 3/4] drivers/i2c/busses/i2c-at91.c: add new driver

Hi,

Carsten Behling wrote on 2011-11-23:

 this case is already catched in at91_do_twi_transfer():
 
 Sorry, I did not found this code in your patch.
 (http://www.mail-archive.com/linux-i2c@vger.kernel.org/msg06556.html):
 
 +   if (is_read) {
 +   if (!dev-buf_len)

yes, this won't work for buf_len == 1. It is corrected in
https://lkml.org/lkml/2011/11/18/223 which I held back for some time
as it should have been just a feature extension. I was not aware it
also fixed the buf_len = 1 bug. Sorry for that...

(Explanation: in the first implementation I immediately decremented
buf_len, so buf_len == 1 could not occur. Later I removed that but
did not fully fold it into the base patch.)

Thanks,
Niko

--
To unsubscribe from this list: send the line unsubscribe linux-i2c in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH v5 3/4] drivers/i2c/busses/i2c-at91.c: add new driver

2011-11-23 Thread Voss, Nikolaus
Hi Carsten,

Carsten Behling wrote on 2011-11-23:
 I think it must be:
 
 + for (i = 0; i  msg-len; ++i) {
 + internal_address |= ((unsigned)msg-buf[msg-len-1-i]) 
  (8 * i);
 + int_addr_flag += AT91_TWI_IADRSZ_1;
 + }
 + at91_twi_write(dev, AT91_TWI_IADR, internal_address);

yes, I think you're right. I tested only with 8 bit addresses
(msg-len = 1), so I haven't seen this error.

I will modify the patch and post it later today.

Thanks for this feedback,
Niko

--
To unsubscribe from this list: send the line unsubscribe linux-i2c in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v7 4/5] G45 TWI: remove open drain setting for twi function gpios

2011-11-23 Thread Nikolaus Voss
The G45 datasheets explicitly states that setting the open drain property
on peripheral function gpios is not allowed. (How about other A91 chips?)

Signed-off-by: Nikolaus Voss n.v...@weinmann.de
---
 arch/arm/mach-at91/at91sam9g45_devices.c |6 --
 1 files changed, 0 insertions(+), 6 deletions(-)

diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c 
b/arch/arm/mach-at91/at91sam9g45_devices.c
index 09a16d6..8743b14 100644
--- a/arch/arm/mach-at91/at91sam9g45_devices.c
+++ b/arch/arm/mach-at91/at91sam9g45_devices.c
@@ -684,18 +684,12 @@ void __init at91_add_device_i2c(short i2c_id, struct 
i2c_board_info *devices, in
/* pins used for TWI interface */
if (i2c_id == 0) {
at91_set_A_periph(AT91_PIN_PA20, 0);/* TWD */
-   at91_set_multi_drive(AT91_PIN_PA20, 1);
-
at91_set_A_periph(AT91_PIN_PA21, 0);/* TWCK */
-   at91_set_multi_drive(AT91_PIN_PA21, 1);
 
platform_device_register(at91sam9g45_twi0_device);
} else {
at91_set_A_periph(AT91_PIN_PB10, 0);/* TWD */
-   at91_set_multi_drive(AT91_PIN_PB10, 1);
-
at91_set_A_periph(AT91_PIN_PB11, 0);/* TWCK */
-   at91_set_multi_drive(AT91_PIN_PB11, 1);
 
platform_device_register(at91sam9g45_twi1_device);
}
-- 
1.7.5.4

--
To unsubscribe from this list: send the line unsubscribe linux-i2c in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v7 2/5] Replace clk_lookup.con_id with clk_lookup.dev_id entries for twi clk

2011-11-23 Thread Nikolaus Voss
The old driver used con_id clock entries. Convert to use dev_id
for clock lookup via standard method.

Signed-off-by: Nikolaus Voss n.v...@weinmann.de
---
 arch/arm/mach-at91/at91cap9.c|1 +
 arch/arm/mach-at91/at91rm9200.c  |1 +
 arch/arm/mach-at91/at91sam9260.c |1 +
 arch/arm/mach-at91/at91sam9261.c |1 +
 arch/arm/mach-at91/at91sam9263.c |1 +
 arch/arm/mach-at91/at91sam9g45.c |2 ++
 arch/arm/mach-at91/at91sam9rl.c  |2 ++
 7 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-at91/at91cap9.c b/arch/arm/mach-at91/at91cap9.c
index ecdd54d..e69d5e0 100644
--- a/arch/arm/mach-at91/at91cap9.c
+++ b/arch/arm/mach-at91/at91cap9.c
@@ -219,6 +219,7 @@ static struct clk_lookup periph_clocks_lookups[] = {
CLKDEV_CON_DEV_ID(t0_clk, atmel_tcb.0, tcb_clk),
CLKDEV_CON_DEV_ID(pclk, ssc.0, ssc0_clk),
CLKDEV_CON_DEV_ID(pclk, ssc.1, ssc1_clk),
+   CLKDEV_CON_DEV_ID(NULL, at91_i2c, twi_clk),
/* fake hclk clock */
CLKDEV_CON_DEV_ID(hclk, at91_ohci, ohci_clk),
 };
diff --git a/arch/arm/mach-at91/at91rm9200.c b/arch/arm/mach-at91/at91rm9200.c
index 713d3bd..a52f777 100644
--- a/arch/arm/mach-at91/at91rm9200.c
+++ b/arch/arm/mach-at91/at91rm9200.c
@@ -193,6 +193,7 @@ static struct clk_lookup periph_clocks_lookups[] = {
CLKDEV_CON_DEV_ID(pclk, ssc.0, ssc0_clk),
CLKDEV_CON_DEV_ID(pclk, ssc.1, ssc1_clk),
CLKDEV_CON_DEV_ID(pclk, ssc.2, ssc2_clk),
+   CLKDEV_CON_DEV_ID(NULL, at91_i2c, twi_clk),
/* fake hclk clock */
CLKDEV_CON_DEV_ID(hclk, at91_ohci, ohci_clk),
 };
diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c
index b84a9f6..6e98738 100644
--- a/arch/arm/mach-at91/at91sam9260.c
+++ b/arch/arm/mach-at91/at91sam9260.c
@@ -199,6 +199,7 @@ static struct clk_lookup periph_clocks_lookups[] = {
CLKDEV_CON_DEV_ID(t4_clk, atmel_tcb.1, tc4_clk),
CLKDEV_CON_DEV_ID(t5_clk, atmel_tcb.1, tc5_clk),
CLKDEV_CON_DEV_ID(pclk, ssc.0, ssc_clk),
+   CLKDEV_CON_DEV_ID(NULL, at91_i2c, twi_clk),
/* more usart lookup table for DT entries */
CLKDEV_CON_DEV_ID(usart, f200.serial, mck),
CLKDEV_CON_DEV_ID(usart, fffb.serial, usart0_clk),
diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c
index 658a518..4946fb5 100644
--- a/arch/arm/mach-at91/at91sam9261.c
+++ b/arch/arm/mach-at91/at91sam9261.c
@@ -176,6 +176,7 @@ static struct clk_lookup periph_clocks_lookups[] = {
CLKDEV_CON_DEV_ID(pclk, ssc.1, ssc1_clk),
CLKDEV_CON_DEV_ID(pclk, ssc.2, ssc2_clk),
CLKDEV_CON_DEV_ID(hclk, at91_ohci, hck0),
+   CLKDEV_CON_DEV_ID(NULL, at91_i2c, twi_clk),
 };
 
 static struct clk_lookup usart_clocks_lookups[] = {
diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c
index f83fbb0..2c14e43 100644
--- a/arch/arm/mach-at91/at91sam9263.c
+++ b/arch/arm/mach-at91/at91sam9263.c
@@ -189,6 +189,7 @@ static struct clk_lookup periph_clocks_lookups[] = {
CLKDEV_CON_DEV_ID(spi_clk, atmel_spi.0, spi0_clk),
CLKDEV_CON_DEV_ID(spi_clk, atmel_spi.1, spi1_clk),
CLKDEV_CON_DEV_ID(t0_clk, atmel_tcb.0, tcb_clk),
+   CLKDEV_CON_DEV_ID(NULL, at91_i2c, twi_clk),
/* fake hclk clock */
CLKDEV_CON_DEV_ID(hclk, at91_ohci, ohci_clk),
 };
diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c
index 318b040..357f056 100644
--- a/arch/arm/mach-at91/at91sam9g45.c
+++ b/arch/arm/mach-at91/at91sam9g45.c
@@ -220,6 +220,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
CLKDEV_CON_DEV_ID(spi_clk, atmel_spi.1, spi1_clk),
CLKDEV_CON_DEV_ID(t0_clk, atmel_tcb.0, tcb0_clk),
CLKDEV_CON_DEV_ID(t0_clk, atmel_tcb.1, tcb0_clk),
+   CLKDEV_CON_DEV_ID(NULL, at91_i2c.0, twi0_clk),
+   CLKDEV_CON_DEV_ID(NULL, at91_i2c.1, twi1_clk),
CLKDEV_CON_DEV_ID(pclk, ssc.0, ssc0_clk),
CLKDEV_CON_DEV_ID(pclk, ssc.1, ssc1_clk),
CLKDEV_CON_DEV_ID(NULL, atmel-trng, trng_clk),
diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c
index a238105..312beb5 100644
--- a/arch/arm/mach-at91/at91sam9rl.c
+++ b/arch/arm/mach-at91/at91sam9rl.c
@@ -184,6 +184,8 @@ static struct clk_lookup periph_clocks_lookups[] = {
CLKDEV_CON_DEV_ID(t2_clk, atmel_tcb.0, tc2_clk),
CLKDEV_CON_DEV_ID(pclk, ssc.0, ssc0_clk),
CLKDEV_CON_DEV_ID(pclk, ssc.1, ssc1_clk),
+   CLKDEV_CON_DEV_ID(NULL, at91_i2c.0, twi0_clk),
+   CLKDEV_CON_DEV_ID(NULL, at91_i2c.1, twi1_clk),
 };
 
 static struct clk_lookup usart_clocks_lookups[] = {
-- 
1.7.5.4

--
To unsubscribe from this list: send the line unsubscribe linux-i2c in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v7 5/5] i2c-at91.c: add SMBUS_READ_BLOCK_DATA functionality

2011-11-23 Thread Nikolaus Voss
SMBus emulation uses I2C_M_RECV_LEN flag to indicate a SMBus block
read operation in which the length of a transfer is inicated by the
first received byte.

Make better use of clk_prepare()/clk_unprepare().

More sensible transfer timeout.

Signed-off-by: Nikolaus Voss n.v...@weinmann.de
---
 drivers/i2c/busses/i2c-at91.c |   44 +++-
 1 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c
index cc9061d..cb34add 100644
--- a/drivers/i2c/busses/i2c-at91.c
+++ b/drivers/i2c/busses/i2c-at91.c
@@ -32,7 +32,7 @@
 #include i2c-at91.h
 
 #define TWI_CLK_HZ 10  /* max 400 Kbits/s */
-#define AT91_I2C_TIMEOUT   msecs_to_jiffies(10)/* transfer timeout */
+#define AT91_I2C_TIMEOUT   msecs_to_jiffies(100)   /* transfer timeout */
 
 struct at91_twi_dev {
struct device   *dev;
@@ -41,6 +41,7 @@ struct at91_twi_dev {
struct clk  *clk;
u8  *buf;
size_t  buf_len;
+   struct i2c_msg  *msg;
int irq;
unsignedtransfer_status;
struct i2c_adapter  adapter;
@@ -113,9 +114,18 @@ static void at91_twi_write_next_byte(struct at91_twi_dev 
*dev)
 static void at91_twi_read_next_byte(struct at91_twi_dev *dev)
 {
*dev-buf = at91_twi_read(dev, AT91_TWI_RHR)  0xff;
+   --dev-buf_len;
+
+   /* handle I2C_SMBUS_BLOCK_DATA */
+   if (unlikely(dev-msg-flags  I2C_M_RECV_LEN)) {
+   dev-msg-flags = ~I2C_M_RECV_LEN;
+   dev-buf_len += *dev-buf;
+   dev-msg-len = dev-buf_len + 1;
+   dev_dbg(dev-dev, received block length %d\n, dev-buf_len);
+   }
 
/* send stop if second but last byte has been read */
-   if (--dev-buf_len == 1)
+   if (dev-buf_len == 1)
at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_STOP);
 
dev_dbg(dev-dev, read 0x%x, to go %d\n, *dev-buf, dev-buf_len);
@@ -144,17 +154,21 @@ static irqreturn_t atmel_twi_interrupt(int irq, void 
*dev_id)
return IRQ_HANDLED;
 }
 
-static int at91_do_twi_transfer(struct at91_twi_dev *dev, bool is_read)
+static int at91_do_twi_transfer(struct at91_twi_dev *dev)
 {
int ret;
 
+   dev_dbg(dev-dev, transfer: %s %d bytes.\n,
+   (dev-msg-flags  I2C_M_RD) ? read : write, dev-buf_len);
+
INIT_COMPLETION(dev-cmd_complete);
-   if (is_read) {
-   if (dev-buf_len = 1)
-   at91_twi_write(dev, AT91_TWI_CR,
-  AT91_TWI_START | AT91_TWI_STOP);
-   else
-   at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_START);
+   if (dev-msg-flags  I2C_M_RD) {
+   unsigned start_flags = AT91_TWI_START;
+
+   /* if only one byte is to be read, immediately stop transfer */
+   if (dev-buf_len = 1  !(dev-msg-flags  I2C_M_RECV_LEN))
+   start_flags |= AT91_TWI_STOP;
+   at91_twi_write(dev, AT91_TWI_CR, start_flags);
at91_twi_write(dev, AT91_TWI_IER,
   AT91_TWI_TXCOMP | AT91_TWI_RXRDY);
} else {
@@ -229,17 +243,17 @@ static int at91_twi_xfer(struct i2c_adapter *adap, struct 
i2c_msg *msg, int num)
 
dev-buf_len = m_start-len;
dev-buf = m_start-buf;
+   dev-msg = m_start;
 
-   ret = at91_do_twi_transfer(dev, m_start-flags  I2C_M_RD);
-   if (ret  0)
-   return ret;
+   ret = at91_do_twi_transfer(dev);
 
-   return num;
+   return (ret  0) ? ret : num;
 }
 
 static u32 at91_twi_func(struct i2c_adapter *adapter)
 {
-   return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
+   return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL
+   | I2C_FUNC_SMBUS_READ_BLOCK_DATA;
 }
 
 static struct i2c_algorithm at91_twi_algorithm = {
@@ -326,6 +340,7 @@ err_unuse_clocks:
iounmap(dev-base);
 err_mem_ioremap:
clk_disable(dev-clk);
+   clk_unprepare(dev-clk);
clk_put(dev-clk);
 err_free_mem:
kfree(dev);
@@ -343,6 +358,7 @@ static int __devexit at91_twi_remove(struct platform_device 
*pdev)
 
rc = i2c_del_adapter(dev-adapter);
clk_disable(dev-clk);
+   clk_unprepare(dev-clk);
clk_put(dev-clk);
free_irq(dev-irq, dev);
iounmap(dev-base);
-- 
1.7.5.4

--
To unsubscribe from this list: send the line unsubscribe linux-i2c in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v7 3/5] drivers/i2c/busses/i2c-at91.c: add new driver

2011-11-23 Thread Nikolaus Voss
This driver has the following properties compared to the old driver:
1. Support for multiple interfaces.
2. Interrupt driven I/O as opposed to polling/busy waiting.
3. Support for _one_ repeated start (Sr) condition, which is enough
   for most real-world applications including all SMBus transfer types.
   (The hardware does not support issuing arbitrary Sr conditions on the
bus.)

Tested on Atmel G45 with BQ20Z80 battery SMBus client.

Signed-off-by: Nikolaus Voss n.v...@weinmann.de
Reviewed-by: Felipe Balbi ba...@ti.com
---
 drivers/i2c/busses/Kconfig|   11 +-
 drivers/i2c/busses/Makefile   |1 +
 drivers/i2c/busses/i2c-at91.c |  412 +
 drivers/i2c/busses/i2c-at91.h |   80 
 4 files changed, 497 insertions(+), 7 deletions(-)
 create mode 100644 drivers/i2c/busses/i2c-at91.c
 create mode 100644 drivers/i2c/busses/i2c-at91.h

diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
index a3afac4..2ef618d 100644
--- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig
@@ -285,18 +285,15 @@ comment I2C system bus drivers (mostly embedded / 
system-on-chip)
 
 config I2C_AT91
tristate Atmel AT91 I2C Two-Wire interface (TWI)
-   depends on ARCH_AT91  EXPERIMENTAL  BROKEN
+   depends on ARCH_AT91  EXPERIMENTAL
help
  This supports the use of the I2C interface on Atmel AT91
  processors.
 
- This driver is BROKEN because the controller which it uses
- will easily trigger RX overrun and TX underrun errors.  Using
- low I2C clock rates may partially work around those issues
- on some systems.  Another serious problem is that there is no
- documented way to issue repeated START conditions, as needed
+ A serious problem is that there is no documented way to issue
+ repeated START conditions for more than two messages, as needed
  to support combined I2C messages.  Use the i2c-gpio driver
- unless your system can cope with those limitations.
+ unless your system can cope with this limitation.
 
 config I2C_AU1550
tristate Au1550/Au1200 SMBus interface
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
index e8a1852..fba6da6 100644
--- a/drivers/i2c/busses/Makefile
+++ b/drivers/i2c/busses/Makefile
@@ -28,6 +28,7 @@ obj-$(CONFIG_I2C_HYDRA)   += i2c-hydra.o
 obj-$(CONFIG_I2C_POWERMAC) += i2c-powermac.o
 
 # Embedded system I2C/SMBus host controller drivers
+obj-$(CONFIG_I2C_AT91) += i2c-at91.o
 obj-$(CONFIG_I2C_AU1550)   += i2c-au1550.o
 obj-$(CONFIG_I2C_BLACKFIN_TWI) += i2c-bfin-twi.o
 obj-$(CONFIG_I2C_CPM)  += i2c-cpm.o
diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c
new file mode 100644
index 000..cc9061d
--- /dev/null
+++ b/drivers/i2c/busses/i2c-at91.c
@@ -0,0 +1,412 @@
+/*
+ *  i2c Support for Atmel's AT91 Two-Wire Interface (TWI)
+ *
+ *  Copyright (C) 2011 Weinmann Medical GmbH
+ *  Author: Nikolaus Voss n.v...@weinmann.de
+ *
+ *  Evolved from original work by:
+ *  Copyright (C) 2004 Rick Bronson
+ *  Converted to 2.6 by Andrew Victor and...@sanpeople.com
+ *
+ *  Borrowed heavily from original work by:
+ *  Copyright (C) 2000 Philip Edelbrock p...@stimpy.netroedge.com
+ *
+ *  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
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ */
+
+#include linux/clk.h
+#include linux/completion.h
+#include linux/err.h
+#include linux/i2c.h
+#include linux/interrupt.h
+#include linux/io.h
+#include linux/module.h
+#include linux/platform_device.h
+#include linux/slab.h
+
+#include mach/cpu.h
+
+#include i2c-at91.h
+
+#define TWI_CLK_HZ 10  /* max 400 Kbits/s */
+#define AT91_I2C_TIMEOUT   msecs_to_jiffies(10)/* transfer timeout */
+
+struct at91_twi_dev {
+   struct device   *dev;
+   void __iomem*base;
+   struct completion   cmd_complete;
+   struct clk  *clk;
+   u8  *buf;
+   size_t  buf_len;
+   int irq;
+   unsignedtransfer_status;
+   struct i2c_adapter  adapter;
+};
+
+static unsigned at91_twi_read(struct at91_twi_dev *dev, unsigned reg)
+{
+   return __raw_readl(dev-base + reg);
+}
+
+static void at91_twi_write(struct at91_twi_dev *dev, unsigned reg, unsigned 
val)
+{
+   __raw_writel(val, dev-base + reg);
+}
+
+static void at91_disable_twi_interrupts(struct at91_twi_dev *dev)
+{
+   at91_twi_write(dev, AT91_TWI_IDR,
+  AT91_TWI_TXCOMP | AT91_TWI_RXRDY | AT91_TWI_TXRDY);
+}
+
+static void at91_init_twi_bus(struct at91_twi_dev *dev)
+{
+   at91_disable_twi_interrupts(dev);
+   at91_twi_write(dev, 

[PATCH v7 1/5] drivers/i2c/busses/i2c-at91.c: remove broken driver

2011-11-23 Thread Nikolaus Voss
Signed-off-by: Nikolaus Voss n.v...@weinmann.de
---
 arch/arm/mach-at91/include/mach/at91_twi.h |   68 --
 drivers/i2c/busses/Makefile|1 -
 drivers/i2c/busses/i2c-at91.c  |  327 
 3 files changed, 0 insertions(+), 396 deletions(-)
 delete mode 100644 arch/arm/mach-at91/include/mach/at91_twi.h
 delete mode 100644 drivers/i2c/busses/i2c-at91.c

diff --git a/arch/arm/mach-at91/include/mach/at91_twi.h 
b/arch/arm/mach-at91/include/mach/at91_twi.h
deleted file mode 100644
index bb2880f..000
--- a/arch/arm/mach-at91/include/mach/at91_twi.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * arch/arm/mach-at91/include/mach/at91_twi.h
- *
- * Copyright (C) 2005 Ivan Kokshaysky
- * Copyright (C) SAN People
- *
- * Two-wire Interface (TWI) registers.
- * Based on AT91RM9200 datasheet revision E.
- *
- * 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
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- */
-
-#ifndef AT91_TWI_H
-#define AT91_TWI_H
-
-#defineAT91_TWI_CR 0x00/* Control Register */
-#defineAT91_TWI_START  (1   0)   /* Send a Start 
Condition */
-#defineAT91_TWI_STOP   (1   1)   /* Send a Stop 
Condition */
-#defineAT91_TWI_MSEN   (1   2)   /* Master 
Transfer Enable */
-#defineAT91_TWI_MSDIS  (1   3)   /* Master 
Transfer Disable */
-#defineAT91_TWI_SVEN   (1   4)   /* Slave 
Transfer Enable [SAM9260 only] */
-#defineAT91_TWI_SVDIS  (1   5)   /* Slave 
Transfer Disable [SAM9260 only] */
-#defineAT91_TWI_SWRST  (1   7)   /* Software 
Reset */
-
-#defineAT91_TWI_MMR0x04/* Master Mode Register 
*/
-#defineAT91_TWI_IADRSZ (3  8)/* Internal 
Device Address Size */
-#defineAT91_TWI_IADRSZ_NO  (0  8)
-#defineAT91_TWI_IADRSZ_1   (1  8)
-#defineAT91_TWI_IADRSZ_2   (2  8)
-#defineAT91_TWI_IADRSZ_3   (3  8)
-#defineAT91_TWI_MREAD  (1 12)/* Master Read 
Direction */
-#defineAT91_TWI_DADR   (0x7f  16)/* Device 
Address */
-
-#defineAT91_TWI_SMR0x08/* Slave Mode Register 
[SAM9260 only] */
-#defineAT91_TWI_SADR   (0x7f  16)/* Slave 
Address */
-
-#defineAT91_TWI_IADR   0x0c/* Internal Address 
Register */
-
-#defineAT91_TWI_CWGR   0x10/* Clock Waveform 
Generator Register */
-#defineAT91_TWI_CLDIV  (0xff   0)/* Clock Low 
Divisor */
-#defineAT91_TWI_CHDIV  (0xff   8)/* Clock High 
Divisor */
-#defineAT91_TWI_CKDIV  (7 16)/* Clock 
Divider */
-
-#defineAT91_TWI_SR 0x20/* Status Register */
-#defineAT91_TWI_TXCOMP (1   0)   /* Transmission 
Complete */
-#defineAT91_TWI_RXRDY  (1   1)   /* Receive 
Holding Register Ready */
-#defineAT91_TWI_TXRDY  (1   2)   /* Transmit 
Holding Register Ready */
-#defineAT91_TWI_SVREAD (1   3)   /* Slave Read 
[SAM9260 only] */
-#defineAT91_TWI_SVACC  (1   4)   /* Slave Access 
[SAM9260 only] */
-#defineAT91_TWI_GACC   (1   5)   /* General Call 
Access [SAM9260 only] */
-#defineAT91_TWI_OVRE   (1   6)   /* Overrun 
Error [AT91RM9200 only] */
-#defineAT91_TWI_UNRE   (1   7)   /* Underrun 
Error [AT91RM9200 only] */
-#defineAT91_TWI_NACK   (1   8)   /* Not 
Acknowledged */
-#defineAT91_TWI_ARBLST (1   9)   /* Arbitration 
Lost [SAM9260 only] */
-#defineAT91_TWI_SCLWS  (1  10)   /* Clock Wait 
State [SAM9260 only] */
-#defineAT91_TWI_EOSACC (1  11)   /* End of Slave 
Address [SAM9260 only] */
-
-#defineAT91_TWI_IER0x24/* Interrupt Enable 
Register */
-#defineAT91_TWI_IDR0x28/* Interrupt Disable 
Register */
-#defineAT91_TWI_IMR0x2c/* Interrupt Mask 
Register */
-#defineAT91_TWI_RHR0x30/* Receive Holding 
Register */
-#defineAT91_TWI_THR0x34/* Transmit Holding 
Register */
-
-#endif
-
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
index fba6da6..e8a1852 

Re: [PATCH v7 3/5] drivers/i2c/busses/i2c-at91.c: add new driver

2011-11-23 Thread Arnd Bergmann
On Tuesday 08 November 2011, Nikolaus Voss wrote:


 +
 +static unsigned at91_twi_read(struct at91_twi_dev *dev, unsigned reg)
 +{
 + return __raw_readl(dev-base + reg);
 +}
 +
 +static void at91_twi_write(struct at91_twi_dev *dev, unsigned reg, unsigned 
 val)
 +{
 + __raw_writel(val, dev-base + reg);
 +}

Better use readl/writel or readl_relaxed/writel_relaxed.

 +/*
 + * Calculate and set symmetric clock as stated in datasheet:
 + * twi_clk = F_MAIN / (2 * cdiv * (1  ckdiv) + 4)
 + */
 +static void __devinit at91_set_twi_clock(struct at91_twi_dev *dev, int 
 twi_clk)
 +{
 + const int div = DIV_ROUND_UP(clk_get_rate(dev-clk), 2 * twi_clk) - 2;
 + int ckdiv = fls(div  8);
 + const int cdiv = div  ckdiv;
 +
 + if (cpu_is_at91rm9200()  (ckdiv  5)) {
 + dev_warn(dev-dev, AT91RM9200 erratum 22: using ckdiv = 5.\n);
 + ckdiv = 5;
 + }

Don't check a global property like this locally in the driver. Instead,
make it a property of the device that you check here and set it based on
the the device name set by the platform, or by a device tree property.

 diff --git a/drivers/i2c/busses/i2c-at91.h b/drivers/i2c/busses/i2c-at91.h
 new file mode 100644
 index 000..a898159
 --- /dev/null
 +++ b/drivers/i2c/busses/i2c-at91.h
 @@ -0,0 +1,80 @@
 +
 +#ifndef AT91_TWI_H
 +#define AT91_TWI_H
 +

No need for a header file if all the values in it are used in only one
source file. Just move everything to i2c_at91.c

 +#define  AT91_TWI_MMR0x04/* Master Mode Register 
 */
 +#define  AT91_TWI_IADRSZ (3  8)/* Internal Device 
 Address
 +  *  Size */
 +#define  AT91_TWI_IADRSZ_NO  (0  8)
 +#define  AT91_TWI_IADRSZ_1   (1  8)
 +#define  AT91_TWI_IADRSZ_2   (2  8)
 +#define  AT91_TWI_IADRSZ_3   (3  8)
 +#define  AT91_TWI_MREAD  (1 12)/* Master Read 
 Direction */
 +#define  AT91_TWI_DADR   (0x7f  16)/* Device Address */

These are harder to read than just using hexadecimal bitmasks:

#define AT91_TWI_MMR0x0004
#define AT91_TWI_IADRSZ 0x0300
#define AT91_TWI_IADRSZ_NO  0x
#define AT91_TWI_IADRSZ_1   0x0100
...

Arnd
--
To unsubscribe from this list: send the line unsubscribe linux-i2c in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v7 0/5] AT91: replace broken TWI driver i2c-at91.c

2011-11-23 Thread Ben Dooks

On Wed, Nov 23, 2011 at 04:35:55PM +0100, Nikolaus Voss wrote:
 The old driver has two main deficencies:
 i)  No repeated start (Sr) condiction is possible, this makes it unusable
 e.g. for most SMBus transfers.
 ii) I/O was done with polling/busy waiting what caused over-/underruns
 even at light system loads and clock speeds.
 
 The new driver overcomes these deficencies and in addition allows for
 more than one TWI interface.
 
 A remaining limitation is the fact, that only one repeated start is
 possible (two concatenated messages). This limitation is imposed by
 the hardware. However, this should not be a problem as all common
 i2c-client communication does not rely on more than one repeated start.
 
 v7: Patch 4/5: i)  fix bug if internal address  1 byte
ii) send stop when len == 1
(both reported by Carsten Behling)
 v6: Patch 5/5: support for I2C_SMBUS_BLOCK_DATA transfers.
 Better use of clk_(un)prepare().
 More sensible transfer timeout.
 v5: Another round of review comments from Ryan Mallon, Felipe Balbi
 and Russell King: convert twi clk to use .dev_id, cleanups
 v4: Integrated more review comments from Ryan Mallon and Felipe Balbi:
 Moved register include file to local include, code cleanups
 v3: Integrated review comments from Ryan Mallon and Felipe Balbi
 v2: Fixed whitespace issue
 
 Nikolaus Voss (5):
   drivers/i2c/busses/i2c-at91.c: remove broken driver
   Replace clk_lookup.con_id with clk_lookup.dev_id entries for twi clk
   drivers/i2c/busses/i2c-at91.c: add new driver
   G45 TWI: remove open drain setting for twi function gpios
   i2c-at91.c: add SMBUS_READ_BLOCK_DATA functionality

Is the original driver so broken that the two could not co-exist, or are
we making so many changes that there's no point in keeping the original
one?
 
  arch/arm/mach-at91/at91cap9.c  |1 +
  arch/arm/mach-at91/at91rm9200.c|1 +
  arch/arm/mach-at91/at91sam9260.c   |1 +
  arch/arm/mach-at91/at91sam9261.c   |1 +
  arch/arm/mach-at91/at91sam9263.c   |1 +
  arch/arm/mach-at91/at91sam9g45.c   |2 +
  arch/arm/mach-at91/at91sam9g45_devices.c   |6 -
  arch/arm/mach-at91/at91sam9rl.c|2 +
  arch/arm/mach-at91/include/mach/at91_twi.h |   68 
  drivers/i2c/busses/Kconfig |   11 +-
  drivers/i2c/busses/i2c-at91.c  |  529 
 +---
  drivers/i2c/busses/i2c-at91.h  |   80 +
  12 files changed, 408 insertions(+), 295 deletions(-)
  delete mode 100644 arch/arm/mach-at91/include/mach/at91_twi.h
  create mode 100644 drivers/i2c/busses/i2c-at91.h
 
 -- 
 1.7.5.4
 
 --
 To unsubscribe from this list: send the line unsubscribe linux-i2c in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Ben Dooks, b...@fluff.org, http://www.fluff.org/ben/

Large Hadron Colada: A large Pina Colada that makes the universe disappear.

--
To unsubscribe from this list: send the line unsubscribe linux-i2c in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Still problems wit egt20 i2c driver

2011-11-23 Thread Ben Dooks
On Tue, Nov 22, 2011 at 07:52:57PM +0900, Tomoya MORINAGA wrote:
 Hi Christian,
 
 Good news!
 
 Except [PATCH] i2c-eg20t: modified the setting of transfer rate,
 all patches already accepted.
 So, they will got into linux-3.3.

If there's anything that been missed, let me know as I intend on
starting -next up again at the weekend.

-- 
Ben Dooks, b...@fluff.org, http://www.fluff.org/ben/

Large Hadron Colada: A large Pina Colada that makes the universe disappear.

--
To unsubscribe from this list: send the line unsubscribe linux-i2c in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 3/5] SPI: Add helper macro for spi_driver boilerplate

2011-11-23 Thread Ben Dooks
On Wed, Nov 16, 2011 at 10:12:54AM -0700, Grant Likely wrote:
 On Wed, Nov 16, 2011 at 2:13 AM, Lars-Peter Clausen l...@metafoo.de wrote:
  This patch introduces the module_spi_driver macro which is a convenience 
  macro
  for SPI driver modules similar to module_platform_driver. It is intended to 
  be
  used by drivers which init/exit section does nothing but register/unregister
  the SPI driver. By using this macro it is possible to eliminate a few lines 
  of
  boilerplate code per SPI driver.
 
  Signed-off-by: Lars-Peter Clausen l...@metafoo.de
 
 Acked-by: Grant Likely grant.lik...@secretlab.ca

I'm begining to think we need to make some of these driver and device
bits more generic... there seems to be so much similar but not quite
the same code.

-- 
Ben Dooks, b...@fluff.org, http://www.fluff.org/ben/

Large Hadron Colada: A large Pina Colada that makes the universe disappear.

--
To unsubscribe from this list: send the line unsubscribe linux-i2c in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Still problems wit egt20 i2c driver

2011-11-23 Thread Tomoya MORINAGA
Hi Ben

It seems the following patches are not reviewed yet.
[PATCH] i2c-eg20t: modified the setting of transfer rate (Mon, 26 Sep
2011 16:16:23 +0900)
[PATCH 1/2] i2c-eg20t: Support new device LAPIS Semiconductor ML7831
IOH (Fri, 28 Oct 2011 09:40:10 +0900)
[PATCH 2/2] i2c-eg20t: Change-company-name-OKI-SEMICONDUCTOR to LAPIS
Semiconductor

Thanks in advance.

---
tomoya
ROHM Co., Ltd

2011/11/24 Ben Dooks ben-...@fluff.org:
 On Tue, Nov 22, 2011 at 07:52:57PM +0900, Tomoya MORINAGA wrote:
 Hi Christian,

 Good news!

 Except [PATCH] i2c-eg20t: modified the setting of transfer rate,
 all patches already accepted.
 So, they will got into linux-3.3.

 If there's anything that been missed, let me know as I intend on
 starting -next up again at the weekend.

 --
 Ben Dooks, b...@fluff.org, http://www.fluff.org/ben/

 Large Hadron Colada: A large Pina Colada that makes the universe disappear.


--
To unsubscribe from this list: send the line unsubscribe linux-i2c in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH v7 0/5] AT91: replace broken TWI driver i2c-at91.c

2011-11-23 Thread Voss, Nikolaus
Hi,

Ben Dooks wrote on 2011-11-24:
 On Wed, Nov 23, 2011 at 04:35:55PM +0100, Nikolaus Voss wrote:
  The old driver has two main deficencies:
  i)  No repeated start (Sr) condiction is possible, this makes it unusable
  e.g. for most SMBus transfers.
  ii) I/O was done with polling/busy waiting what caused over-/underruns
  even at light system loads and clock speeds.
 
  The new driver overcomes these deficencies and in addition allows for
  more than one TWI interface.
 
  A remaining limitation is the fact, that only one repeated start is
  possible (two concatenated messages). This limitation is imposed by
  the hardware. However, this should not be a problem as all common
  i2c-client communication does not rely on more than one repeated start.
 
  v7: Patch 4/5: i)  fix bug if internal address  1 byte
 ii) send stop when len == 1
 (both reported by Carsten Behling)
  v6: Patch 5/5: support for I2C_SMBUS_BLOCK_DATA transfers.
  Better use of clk_(un)prepare().
  More sensible transfer timeout.
  v5: Another round of review comments from Ryan Mallon, Felipe Balbi
  and Russell King: convert twi clk to use .dev_id, cleanups
  v4: Integrated more review comments from Ryan Mallon and Felipe Balbi:
  Moved register include file to local include, code cleanups
  v3: Integrated review comments from Ryan Mallon and Felipe Balbi
  v2: Fixed whitespace issue
 
  Nikolaus Voss (5):
drivers/i2c/busses/i2c-at91.c: remove broken driver
Replace clk_lookup.con_id with clk_lookup.dev_id entries for twi clk
drivers/i2c/busses/i2c-at91.c: add new driver
G45 TWI: remove open drain setting for twi function gpios
i2c-at91.c: add SMBUS_READ_BLOCK_DATA functionality
 
 Is the original driver so broken that the two could not co-exist, or are
 we making so many changes that there's no point in keeping the original
 one?

The old driver was marked as broken for the above reasons and I can hardly
imagine any setup in which it would be preferable to i2c-gpio. So it does
not make any sense to keep the old driver alive. Though inspired by the old
driver, the new one is almost a rewrite from scratch, so for better reviewing,
I removed the old instead of doing a diff.

Niko

--
To unsubscribe from this list: send the line unsubscribe linux-i2c in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 3/5] SPI: Add helper macro for spi_driver boilerplate

2011-11-23 Thread Lars-Peter Clausen
On 11/24/2011 01:13 AM, Ben Dooks wrote:
 On Wed, Nov 16, 2011 at 10:12:54AM -0700, Grant Likely wrote:
 On Wed, Nov 16, 2011 at 2:13 AM, Lars-Peter Clausen l...@metafoo.de wrote:
 This patch introduces the module_spi_driver macro which is a convenience 
 macro
 for SPI driver modules similar to module_platform_driver. It is intended to 
 be
 used by drivers which init/exit section does nothing but register/unregister
 the SPI driver. By using this macro it is possible to eliminate a few lines 
 of
 boilerplate code per SPI driver.

 Signed-off-by: Lars-Peter Clausen l...@metafoo.de

 Acked-by: Grant Likely grant.lik...@secretlab.ca
 
 I'm begining to think we need to make some of these driver and device
 bits more generic... there seems to be so much similar but not quite
 the same code.
 

I've been thinking the same. A good start would probably be consolidating
the platform/spi/i2c device id handling code. Since those are all name based
ids the code for handling them looks rather similar, though there are some
minor differences.

- Lars
--
To unsubscribe from this list: send the line unsubscribe linux-i2c in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] i2c-mxs: fix compile warning in mxs_i2c_xfer()

2011-11-23 Thread Shawn Guo
  CC  drivers/i2c/busses/i2c-mxs.o
drivers/i2c/busses/i2c-mxs.c: In function ‘mxs_i2c_xfer’:
drivers/i2c/busses/i2c-mxs.c:196:6: warning: ‘data’ may be used uninitialized 
in this function

Signed-off-by: Shawn Guo shawn@linaro.org
---
 drivers/i2c/busses/i2c-mxs.c |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/i2c/busses/i2c-mxs.c b/drivers/i2c/busses/i2c-mxs.c
index 7e78f7c..00f098f 100644
--- a/drivers/i2c/busses/i2c-mxs.c
+++ b/drivers/i2c/busses/i2c-mxs.c
@@ -193,7 +193,7 @@ static int mxs_i2c_wait_for_data(struct mxs_i2c_dev *i2c)
 
 static int mxs_i2c_finish_read(struct mxs_i2c_dev *i2c, u8 *buf, int len)
 {
-   u32 data;
+   u32 data = 0;
int i;
 
for (i = 0; i  len; i++) {
-- 
1.7.4.1

--
To unsubscribe from this list: send the line unsubscribe linux-i2c in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html