Messages in this thread Patch in this message | | | Date | Wed, 18 Apr 2012 17:05:44 +0200 | From | Wolfram Sang <> | Subject | Re: [PATCH 2/3] i2c-eg20t: Call init() when wait-event timeout occurs |
| |
On Mon, Mar 26, 2012 at 02:55:24PM +0900, Tomoya MORINAGA wrote: > > Signed-off-by: Tomoya MORINAGA <tomoya.rohm@gmail.com>
Woha, that's copy&paste code all over. May I ask to refactor this? Something like:
rtn = pch_..._wait_for_checked_xfer(); if (rtn) return rtn; // All the things you have to do when rtn == 0
in that new function (the name was only a suugestion), you can do all the checks which are now copy-pasted, e.g.:
458 rtn = pch_i2c_wait_for_xfer_complete(adap); 459 if (rtn == 0) { 460 if (pch_i2c_getack(adap)) { 461 pch_dbg(adap, "Receive NACK for slave address" 462 "setting\n"); 463 return -EIO; 464 } 465 } else if (rtn == -EIO) { /* Arbitration Lost */ 466 pch_err(adap, "Lost Arbitration\n"); 467 pch_clrbit(adap->pch_base_address, PCH_I2CSR, I2CMAL_BIT); 468 pch_clrbit(adap->pch_base_address, PCH_I2CSR, I2CMIF_BIT); 469 pch_i2c_init(adap); 470 return -EAGAIN; 471 } else { /* wait-event timeout */ 472 pch_i2c_stop(adap); // Your current fixes added here 473 return -ETIME; 474 } return 0;
It is only pseudo-code, but I think it can be done and will help the driver.
Thanks,
Wolfram
> --- > drivers/i2c/busses/i2c-eg20t.c | 16 ++++++++++++++++ > 1 files changed, 16 insertions(+), 0 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-eg20t.c b/drivers/i2c/busses/i2c-eg20t.c > index d73975b..714b070 100644 > --- a/drivers/i2c/busses/i2c-eg20t.c > +++ b/drivers/i2c/busses/i2c-eg20t.c > @@ -445,7 +445,9 @@ static s32 pch_i2c_writebytes(struct i2c_adapter *i2c_adap, > pch_i2c_init(adap); > return -EAGAIN; > } else { /* wait-event timeout */ > + pch_err(adap, "%s(L.%d):wait-event timeout\n", __func__, __LINE__); > pch_i2c_stop(adap); > + pch_i2c_init(adap); > return -ETIME; > } > } else { > @@ -469,7 +471,9 @@ static s32 pch_i2c_writebytes(struct i2c_adapter *i2c_adap, > pch_i2c_init(adap); > return -EAGAIN; > } else { /* wait-event timeout */ > + pch_err(adap, "%s(L.%d):wait-event timeout\n", __func__, __LINE__); > pch_i2c_stop(adap); > + pch_i2c_init(adap); > return -ETIME; > } > > @@ -490,7 +494,9 @@ static s32 pch_i2c_writebytes(struct i2c_adapter *i2c_adap, > pch_clrbit(adap->pch_base_address, PCH_I2CSR, > I2CMIF_BIT); > } else { /* wait-event timeout */ > + pch_err(adap, "%s(L.%d):wait-event timeout\n", __func__, __LINE__); > pch_i2c_stop(adap); > + pch_i2c_init(adap); > return -ETIME; > } > } > @@ -598,7 +604,9 @@ static s32 pch_i2c_readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, > pch_i2c_init(adap); > return -EAGAIN; > } else { /* wait-event timeout */ > + pch_err(adap, "%s(L.%d):wait-event timeout\n", __func__, __LINE__); > pch_i2c_stop(adap); > + pch_i2c_init(adap); > return -ETIME; > } > pch_i2c_restart(adap); > @@ -621,7 +629,9 @@ static s32 pch_i2c_readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, > pch_i2c_init(adap); > return -EAGAIN; > } else { /* wait-event timeout */ > + pch_err(adap, "%s(L.%d):wait-event timeout\n", __func__, __LINE__); > pch_i2c_stop(adap); > + pch_i2c_init(adap); > return -ETIME; > } > } else { > @@ -648,7 +658,9 @@ static s32 pch_i2c_readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, > pch_i2c_init(adap); > return -EAGAIN; > } else { /* wait-event timeout */ > + pch_err(adap, "%s(L.%d):wait-event timeout\n", __func__, __LINE__); > pch_i2c_stop(adap); > + pch_i2c_init(adap); > return -ETIME; > } > > @@ -677,7 +689,9 @@ static s32 pch_i2c_readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, > return -EIO; > } > } else { /* wait-event timeout */ > + pch_err(adap, "%s(L.%d):wait-event timeout\n", __func__, __LINE__); > pch_i2c_stop(adap); > + pch_i2c_init(adap); > return -ETIME; > } > > @@ -698,7 +712,9 @@ static s32 pch_i2c_readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, > return -EIO; > } > } else { /* wait-event timeout */ > + pch_err(adap, "%s(L.%d):wait-event timeout\n", __func__, __LINE__); > pch_i2c_stop(adap); > + pch_i2c_init(adap); > return -ETIME; > } > > -- > 1.7.7.6 >
-- Pengutronix e.K. | Wolfram Sang | Industrial Linux Solutions | http://www.pengutronix.de/ | [unhandled content-type:application/pgp-signature] | |