[PATCH] i2c-mxs: fix compile warning in mxs_i2c_xfer()
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
> 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
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