From 736a9f5d8327cb5f1d885171ae94eb47e13e2c8f Mon Sep 17 00:00:00 2001 From: Manuel Lauss Date: Sun, 27 Jan 2008 18:14:52 +0100 Subject: [PATCH] --- yaml --- r: 77353 b: refs/heads/master c: 91f27958d686da713c3b0a1dc205288898e44124 h: refs/heads/master i: 77351: b8a410b95d48f3200c1612b33f1c404c8498475d v: v3 --- [refs] | 2 +- trunk/drivers/i2c/busses/i2c-au1550.c | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 187d5c001858..7700fb49dae1 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 4bd28ebda2d48f16c1f16ff936a6927a4ef2194d +refs/heads/master: 91f27958d686da713c3b0a1dc205288898e44124 diff --git a/trunk/drivers/i2c/busses/i2c-au1550.c b/trunk/drivers/i2c/busses/i2c-au1550.c index 2f684166c43d..7d51a43b38d3 100644 --- a/trunk/drivers/i2c/busses/i2c-au1550.c +++ b/trunk/drivers/i2c/busses/i2c-au1550.c @@ -105,7 +105,7 @@ wait_master_done(struct i2c_au1550_data *adap) } static int -do_address(struct i2c_au1550_data *adap, unsigned int addr, int rd) +do_address(struct i2c_au1550_data *adap, unsigned int addr, int rd, int q) { volatile psc_smb_t *sp; u32 stat; @@ -134,6 +134,10 @@ do_address(struct i2c_au1550_data *adap, unsigned int addr, int rd) if (rd) addr |= 1; + /* zero-byte xfers stop immediately */ + if (q) + addr |= PSC_SMBTXRX_STP; + /* Put byte into fifo, start up master. */ sp->psc_smbtxrx = addr; @@ -142,7 +146,7 @@ do_address(struct i2c_au1550_data *adap, unsigned int addr, int rd) au_sync(); if (wait_ack(adap)) return -EIO; - return 0; + return (q) ? wait_master_done(adap) : 0; } static u32 @@ -262,7 +266,8 @@ au1550_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, int num) for (i = 0; !err && i < num; i++) { p = &msgs[i]; - err = do_address(adap, p->addr, p->flags & I2C_M_RD); + err = do_address(adap, p->addr, p->flags & I2C_M_RD, + (p->len == 0)); if (err || !p->len) continue; if (p->flags & I2C_M_RD)