[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 
---
 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


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  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 
>>
>> Acked-by: Grant Likely 
> 
> 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


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: 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 :
> 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  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 
> 
> Acked-by: Grant Likely 

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 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 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: [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


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

2011-11-23 Thread Nikolaus Voss
Signed-off-by: Nikolaus Voss 
---
 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/bu

[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 
Reviewed-by: Felipe Balbi 
---
 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 
+ *
+ *  Evolved from original work by:
+ *  Copyright (C) 2004 Rick Bronson
+ *  Converted to 2.6 by Andrew Victor 
+ *
+ *  Borrowed heavily from original work by:
+ *  Copyright (C) 2000 Philip Edelbrock 
+ *
+ *  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 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+
+#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, AT91_TWI_CR, AT91_TWI_SWRST);
+   at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_MSEN);
+   at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_SVDIS);
+}
+
+/*
+ * Calculate and set symmetric clock as stated in datasheet:
+ 

[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 
---
 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 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 
---
 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 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 
---
 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 0/5] AT91: replace broken TWI driver i2c-at91.c

2011-11-23 Thread Nikolaus Voss
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

 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


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


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


[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
> 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


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