aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/backport-5.4/815-v5.8-i2c-pxa-consolidate-i2c_pxa_-xfer-implementations.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/backport-5.4/815-v5.8-i2c-pxa-consolidate-i2c_pxa_-xfer-implementations.patch')
-rw-r--r--target/linux/generic/backport-5.4/815-v5.8-i2c-pxa-consolidate-i2c_pxa_-xfer-implementations.patch96
1 files changed, 96 insertions, 0 deletions
diff --git a/target/linux/generic/backport-5.4/815-v5.8-i2c-pxa-consolidate-i2c_pxa_-xfer-implementations.patch b/target/linux/generic/backport-5.4/815-v5.8-i2c-pxa-consolidate-i2c_pxa_-xfer-implementations.patch
new file mode 100644
index 0000000000..f66759f48b
--- /dev/null
+++ b/target/linux/generic/backport-5.4/815-v5.8-i2c-pxa-consolidate-i2c_pxa_-xfer-implementations.patch
@@ -0,0 +1,96 @@
+From: Russell King <rmk+kernel@armlinux.org.uk>
+Bcc: linux@mail.armlinux.org.uk
+Subject: [PATCH 1/7] i2c: pxa: consolidate i2c_pxa_*xfer() implementations
+MIME-Version: 1.0
+Content-Disposition: inline
+Content-Transfer-Encoding: 8bit
+Content-Type: text/plain; charset="utf-8"
+
+Most of i2c_pxa_pio_xfer() and i2c_pxa_xfer() are identical; the only
+differences are that i2c_pxa_pio_xfer() may reset the bus, and they
+use different underlying transfer functions. The retry loop is the
+same. Consolidate these two functions.
+
+Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+---
+ drivers/i2c/busses/i2c-pxa.c | 36 ++++++++++++++++--------------------
+ 1 file changed, 16 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c
+index c1e50c0b9756..46f1cf97d955 100644
+--- a/drivers/i2c/busses/i2c-pxa.c
++++ b/drivers/i2c/busses/i2c-pxa.c
+@@ -1102,18 +1102,20 @@ static int i2c_pxa_do_xfer(struct pxa_i2c *i2c, struct i2c_msg *msg, int num)
+ return ret;
+ }
+
+-static int i2c_pxa_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
++static int i2c_pxa_internal_xfer(struct pxa_i2c *i2c,
++ struct i2c_msg *msgs, int num,
++ int (*xfer)(struct pxa_i2c *,
++ struct i2c_msg *, int num))
+ {
+- struct pxa_i2c *i2c = adap->algo_data;
+ int ret, i;
+
+- for (i = adap->retries; i >= 0; i--) {
+- ret = i2c_pxa_do_xfer(i2c, msgs, num);
++ for (i = i2c->adap.retries; i >= 0; i--) {
++ ret = xfer(i2c, msgs, num);
+ if (ret != I2C_RETRY)
+ goto out;
+
+ if (i2c_debug)
+- dev_dbg(&adap->dev, "Retrying transmission\n");
++ dev_dbg(&i2c->adap.dev, "Retrying transmission\n");
+ udelay(100);
+ }
+ i2c_pxa_scream_blue_murder(i2c, "exhausted retries");
+@@ -1123,6 +1125,14 @@ static int i2c_pxa_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num
+ return ret;
+ }
+
++static int i2c_pxa_xfer(struct i2c_adapter *adap,
++ struct i2c_msg msgs[], int num)
++{
++ struct pxa_i2c *i2c = adap->algo_data;
++
++ return i2c_pxa_internal_xfer(i2c, msgs, num, i2c_pxa_do_xfer);
++}
++
+ static u32 i2c_pxa_functionality(struct i2c_adapter *adap)
+ {
+ return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
+@@ -1210,7 +1220,6 @@ static int i2c_pxa_pio_xfer(struct i2c_adapter *adap,
+ struct i2c_msg msgs[], int num)
+ {
+ struct pxa_i2c *i2c = adap->algo_data;
+- int ret, i;
+
+ /* If the I2C controller is disabled we need to reset it
+ (probably due to a suspend/resume destroying state). We do
+@@ -1219,20 +1228,7 @@ static int i2c_pxa_pio_xfer(struct i2c_adapter *adap,
+ if (!(readl(_ICR(i2c)) & ICR_IUE))
+ i2c_pxa_reset(i2c);
+
+- for (i = adap->retries; i >= 0; i--) {
+- ret = i2c_pxa_do_pio_xfer(i2c, msgs, num);
+- if (ret != I2C_RETRY)
+- goto out;
+-
+- if (i2c_debug)
+- dev_dbg(&adap->dev, "Retrying transmission\n");
+- udelay(100);
+- }
+- i2c_pxa_scream_blue_murder(i2c, "exhausted retries");
+- ret = -EREMOTEIO;
+- out:
+- i2c_pxa_set_slave(i2c, ret);
+- return ret;
++ return i2c_pxa_internal_xfer(i2c, msgs, num, i2c_pxa_do_pio_xfer);
+ }
+
+ static const struct i2c_algorithm i2c_pxa_pio_algorithm = {
+--
+2.20.1
+