Nuvoton: I2C: Fix potential role switch failure

Fix in i2c_do_trsn(), interrupt doesn't change back to enabled due to premature return.

Fix targets:
-   NUMAKER_PFM_NANO130
-   NUMAKER_PFM_NUC472
-   NUMAKER_PFM_M453
-   NUMAKER_PFM_M487/NUMAKER_IOT_M487
-   NUMAKER_IOT_M252
-   NUMAKER_IOT_M263A
-   NU_M2354
pull/15333/head
Chun-Chieh Li 2022-09-23 09:33:41 +08:00
parent 807fd79651
commit dbc0f5b2b3
7 changed files with 31 additions and 17 deletions

View File

@ -441,13 +441,13 @@ static int i2c_do_trsn(i2c_t *obj, uint32_t i2c_ctl, int sync)
case 0x08: // Start case 0x08: // Start
case 0x10: // Master Repeat Start case 0x10: // Master Repeat Start
if (i2c_ctl & I2C_CTL0_STA_Msk) { if (i2c_ctl & I2C_CTL0_STA_Msk) {
return 0; goto cleanup;
} else { } else {
break; break;
} }
case 0xF8: // Bus Released case 0xF8: // Bus Released
if ((i2c_ctl & (I2C_CTL0_STA_Msk | I2C_CTL0_STO_Msk)) == I2C_CTL0_STO_Msk) { if ((i2c_ctl & (I2C_CTL0_STA_Msk | I2C_CTL0_STO_Msk)) == I2C_CTL0_STO_Msk) {
return 0; goto cleanup;
} else { } else {
break; break;
} }
@ -458,6 +458,8 @@ static int i2c_do_trsn(i2c_t *obj, uint32_t i2c_ctl, int sync)
} }
} }
cleanup:
i2c_enable_int(obj); i2c_enable_int(obj);
return err; return err;

View File

@ -425,13 +425,13 @@ static int i2c_do_trsn(i2c_t *obj, uint32_t i2c_ctl, int sync)
case 0x08: // Start case 0x08: // Start
case 0x10: // Master Repeat Start case 0x10: // Master Repeat Start
if (i2c_ctl & I2C_CTL0_STA_Msk) { if (i2c_ctl & I2C_CTL0_STA_Msk) {
return 0; goto cleanup;
} else { } else {
break; break;
} }
case 0xF8: // Bus Released case 0xF8: // Bus Released
if ((i2c_ctl & (I2C_CTL0_STA_Msk | I2C_CTL0_STO_Msk)) == I2C_CTL0_STO_Msk) { if ((i2c_ctl & (I2C_CTL0_STA_Msk | I2C_CTL0_STO_Msk)) == I2C_CTL0_STO_Msk) {
return 0; goto cleanup;
} else { } else {
break; break;
} }
@ -442,6 +442,8 @@ static int i2c_do_trsn(i2c_t *obj, uint32_t i2c_ctl, int sync)
} }
} }
cleanup:
i2c_enable_int(obj); i2c_enable_int(obj);
return err; return err;

View File

@ -430,13 +430,13 @@ static int i2c_do_trsn(i2c_t *obj, uint32_t i2c_ctl, int sync)
case 0x08: // Start case 0x08: // Start
case 0x10: // Master Repeat Start case 0x10: // Master Repeat Start
if (i2c_ctl & I2C_CTL0_STA_Msk) { if (i2c_ctl & I2C_CTL0_STA_Msk) {
return 0; goto cleanup;
} else { } else {
break; break;
} }
case 0xF8: // Bus Released case 0xF8: // Bus Released
if ((i2c_ctl & (I2C_CTL0_STA_Msk | I2C_CTL0_STO_Msk)) == I2C_CTL0_STO_Msk) { if ((i2c_ctl & (I2C_CTL0_STA_Msk | I2C_CTL0_STO_Msk)) == I2C_CTL0_STO_Msk) {
return 0; goto cleanup;
} else { } else {
break; break;
} }
@ -447,6 +447,8 @@ static int i2c_do_trsn(i2c_t *obj, uint32_t i2c_ctl, int sync)
} }
} }
cleanup:
i2c_enable_int(obj); i2c_enable_int(obj);
return err; return err;

View File

@ -448,14 +448,14 @@ static int i2c_do_trsn(i2c_t *obj, uint32_t i2c_ctl, int sync)
case 0x08: // Start case 0x08: // Start
case 0x10: // Master Repeat Start case 0x10: // Master Repeat Start
if (i2c_ctl & I2C_CTL_STA_Msk) { if (i2c_ctl & I2C_CTL_STA_Msk) {
return 0; goto cleanup;
} }
else { else {
break; break;
} }
case 0xF8: // Bus Released case 0xF8: // Bus Released
if (i2c_ctl & (I2C_CTL_STA_Msk | I2C_CTL_STO_Msk) == I2C_CTL_STO_Msk) { if (i2c_ctl & (I2C_CTL_STA_Msk | I2C_CTL_STO_Msk) == I2C_CTL_STO_Msk) {
return 0; goto cleanup;
} }
else { else {
break; break;
@ -472,6 +472,8 @@ static int i2c_do_trsn(i2c_t *obj, uint32_t i2c_ctl, int sync)
} }
} }
cleanup:
i2c_enable_int(obj); i2c_enable_int(obj);
return err; return err;

View File

@ -432,13 +432,13 @@ static int i2c_do_trsn(i2c_t *obj, uint32_t i2c_ctl, int sync)
case 0x08: // Start case 0x08: // Start
case 0x10: // Master Repeat Start case 0x10: // Master Repeat Start
if (i2c_ctl & I2C_CTL0_STA_Msk) { if (i2c_ctl & I2C_CTL0_STA_Msk) {
return 0; goto cleanup;
} else { } else {
break; break;
} }
case 0xF8: // Bus Released case 0xF8: // Bus Released
if ((i2c_ctl & (I2C_CTL0_STA_Msk | I2C_CTL0_STO_Msk)) == I2C_CTL0_STO_Msk) { if ((i2c_ctl & (I2C_CTL0_STA_Msk | I2C_CTL0_STO_Msk)) == I2C_CTL0_STO_Msk) {
return 0; goto cleanup;
} else { } else {
break; break;
} }
@ -449,6 +449,8 @@ static int i2c_do_trsn(i2c_t *obj, uint32_t i2c_ctl, int sync)
} }
} }
cleanup:
i2c_enable_int(obj); i2c_enable_int(obj);
return err; return err;

View File

@ -468,14 +468,14 @@ static int i2c_do_trsn(i2c_t *obj, uint32_t i2c_ctl, int sync)
case 0x08: // Start case 0x08: // Start
case 0x10: // Master Repeat Start case 0x10: // Master Repeat Start
if (i2c_ctl & I2C_CON_START_Msk) { if (i2c_ctl & I2C_CON_START_Msk) {
return 0; goto cleanup;
} }
else { else {
break; break;
} }
case 0xF8: // Bus Released case 0xF8: // Bus Released
if ((i2c_ctl & (I2C_CON_START_Msk | I2C_CON_STOP_Msk)) == I2C_CON_STOP_Msk) { if ((i2c_ctl & (I2C_CON_START_Msk | I2C_CON_STOP_Msk)) == I2C_CON_STOP_Msk) {
return 0; goto cleanup;
} }
else { else {
break; break;
@ -492,6 +492,8 @@ static int i2c_do_trsn(i2c_t *obj, uint32_t i2c_ctl, int sync)
} }
} }
cleanup:
i2c_enable_int(obj); i2c_enable_int(obj);
return err; return err;

View File

@ -465,14 +465,14 @@ static int i2c_do_trsn(i2c_t *obj, uint32_t i2c_ctl, int sync)
case 0x08: // Start case 0x08: // Start
case 0x10: // Master Repeat Start case 0x10: // Master Repeat Start
if (i2c_ctl & I2C_CTL_STA_Msk) { if (i2c_ctl & I2C_CTL_STA_Msk) {
return 0; goto cleanup;
} }
else { else {
break; break;
} }
case 0xF8: // Bus Released case 0xF8: // Bus Released
if (i2c_ctl & (I2C_CTL_STA_Msk | I2C_CTL_STO_Msk) == I2C_CTL_STO_Msk) { if (i2c_ctl & (I2C_CTL_STA_Msk | I2C_CTL_STO_Msk) == I2C_CTL_STO_Msk) {
return 0; goto cleanup;
} }
else { else {
break; break;
@ -489,6 +489,8 @@ static int i2c_do_trsn(i2c_t *obj, uint32_t i2c_ctl, int sync)
} }
} }
cleanup:
i2c_enable_int(obj); i2c_enable_int(obj);
return err; return err;