Patch "i2c: brcmstb: Fix START and STOP conditions" has been added to the 4.9-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
i2c: brcmstb: Fix START and STOP conditions
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
i2c-brcmstb-fix-start-and-stop-conditions.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
2de3ec4f1d4ba6ee380478055104eb918bd50cceMon Sep 17 00:00:00 2001
From: Jaedon Shin <[email protected]>
Date: Fri, 3 Mar 2017 10:55:03 +0900
Subject: i2c: brcmstb: Fix START and STOP conditions
From: Jaedon Shin <[email protected]>
commit 2de3ec4f1d4ba6ee380478055104eb918bd50cce upstream.
The BSC data buffers to send and receive data are each of size 32 bytes or 8 bytes 'xfersz' depending on SoC. The problem observed for all the combined message transfer was if length of data transfer was a multiple of 'xfersz' a repeated START was being transmitted by BSC driver. Fixed this by appropriately setting START/STOP conditions for such transfers.
--- drivers/i2c/busses/i2c-brcmstb.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-)
drivers/i2c/busses/i2c-brcmstb.c +21 -6
@@ -465,6 +465,7 @@ static int brcmstb_i2c_xfer(struct i2c_au8 *tmp_buf;int len =0 ;int xfersz =brcmstb_i2c_get_xfersz (dev); +u32 cond, cond_per_msg;if (dev->is_suspended)return -EBUSY ;
@@ -481,10 +482,11 @@ static int brcmstb_i2c_xfer(struct i2c_a pmsg->buf ? pmsg->buf[0] : '0', pmsg->len);if (i < (num -1 ) && (msgs[i +1 ].flags &I2C_M_NOSTART )) -brcmstb_set_i2c_start_stop (dev, ~(COND_START_STOP )); + cond = ~COND_START_STOP ;else -brcmstb_set_i2c_start_stop (dev, -COND_RESTART |COND_NOSTOP ); + cond =COND_RESTART |COND_NOSTOP ; + +brcmstb_set_i2c_start_stop (dev, cond);/* Send slave address */ if (!(pmsg->flags &I2C_M_NOSTART )) {
@@ -497,13 +499,24 @@ static int brcmstb_i2c_xfer(struct i2c_a } } + cond_per_msg = cond; +/* Perform data transfer */ while (len) { bytes_to_xfer =min (len, xfersz); -if (len <= xfersz && i == (num -1 )) -brcmstb_set_i2c_start_stop (dev, - ~(COND_START_STOP )); +if (len <= xfersz) { +if (i == (num -1 )) + cond_per_msg = cond_per_msg & + ~(COND_RESTART |COND_NOSTOP ); +else + cond_per_msg = cond; + }else { + cond_per_msg = (cond_per_msg & ~COND_RESTART ) | +COND_NOSTOP ; + } + +brcmstb_set_i2c_start_stop (dev, cond_per_msg); rc =brcmstb_i2c_xfer_bsc_data (dev, tmp_buf, bytes_to_xfer, pmsg);
@@ -512,6 +525,8 @@ static int brcmstb_i2c_xfer(struct i2c_a len -= bytes_to_xfer; tmp_buf += bytes_to_xfer; + + cond_per_msg =COND_NOSTART |COND_NOSTOP ; } }
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/i2c-brcmstb-fix-start-and-stop-conditions.patch