i2c: sh_mobile: make sure to not accidently trigger STOP
The datasheet was a bit vague, but after consultation with HW designers, we came to the conclusion that we should set the SCP bit always when dealing only with the ICE bit. A set SCP bit is ignored, and thus fine, a cleared one may trigger STOP on the bus. Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Tested-by: Jacopo Mondi <jacopo+renesas@jmondi.org> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
This commit is contained in:
parent
a4fde7e5c9
commit
4ed152c4da
|
@ -604,10 +604,10 @@ static int start_ch(struct sh_mobile_i2c_data *pd, struct i2c_msg *usr_msg,
|
||||||
|
|
||||||
if (do_init) {
|
if (do_init) {
|
||||||
/* Initialize channel registers */
|
/* Initialize channel registers */
|
||||||
iic_wr(pd, ICCR, 0);
|
iic_wr(pd, ICCR, ICCR_SCP);
|
||||||
|
|
||||||
/* Enable channel and configure rx ack */
|
/* Enable channel and configure rx ack */
|
||||||
iic_wr(pd, ICCR, ICCR_ICE);
|
iic_wr(pd, ICCR, ICCR_ICE | ICCR_SCP);
|
||||||
|
|
||||||
/* Set the clock */
|
/* Set the clock */
|
||||||
iic_wr(pd, ICCL, pd->iccl & 0xff);
|
iic_wr(pd, ICCL, pd->iccl & 0xff);
|
||||||
|
@ -723,7 +723,7 @@ static int sh_mobile_i2c_xfer(struct i2c_adapter *adapter,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable channel */
|
/* Disable channel */
|
||||||
iic_wr(pd, ICCR, 0);
|
iic_wr(pd, ICCR, ICCR_SCP);
|
||||||
|
|
||||||
/* Disable clock and mark device as idle */
|
/* Disable clock and mark device as idle */
|
||||||
pm_runtime_put_sync(pd->dev);
|
pm_runtime_put_sync(pd->dev);
|
||||||
|
|
Loading…
Reference in New Issue