.. | .. |
---|
966 | 966 | strlen(ci->roles[role]->name))) |
---|
967 | 967 | break; |
---|
968 | 968 | |
---|
969 | | - if (role == CI_ROLE_END || role == ci->role) |
---|
| 969 | + if (role == CI_ROLE_END) |
---|
970 | 970 | return -EINVAL; |
---|
| 971 | + |
---|
| 972 | + mutex_lock(&ci->mutex); |
---|
| 973 | + |
---|
| 974 | + if (role == ci->role) { |
---|
| 975 | + mutex_unlock(&ci->mutex); |
---|
| 976 | + return n; |
---|
| 977 | + } |
---|
971 | 978 | |
---|
972 | 979 | pm_runtime_get_sync(dev); |
---|
973 | 980 | disable_irq(ci->irq); |
---|
.. | .. |
---|
977 | 984 | ci_handle_vbus_change(ci); |
---|
978 | 985 | enable_irq(ci->irq); |
---|
979 | 986 | pm_runtime_put_sync(dev); |
---|
| 987 | + mutex_unlock(&ci->mutex); |
---|
980 | 988 | |
---|
981 | 989 | return (ret == 0) ? n : ret; |
---|
982 | 990 | } |
---|
.. | .. |
---|
1012 | 1020 | return -ENOMEM; |
---|
1013 | 1021 | |
---|
1014 | 1022 | spin_lock_init(&ci->lock); |
---|
| 1023 | + mutex_init(&ci->mutex); |
---|
1015 | 1024 | ci->dev = dev; |
---|
1016 | 1025 | ci->platdata = dev_get_platdata(dev); |
---|
1017 | 1026 | ci->imx28_write_fix = !!(ci->platdata->flags & |
---|
.. | .. |
---|
1081 | 1090 | ret = ci_usb_phy_init(ci); |
---|
1082 | 1091 | if (ret) { |
---|
1083 | 1092 | dev_err(dev, "unable to init phy: %d\n", ret); |
---|
1084 | | - return ret; |
---|
| 1093 | + goto ulpi_exit; |
---|
1085 | 1094 | } |
---|
1086 | 1095 | |
---|
1087 | 1096 | ci->hw_bank.phys = res->start; |
---|