| .. | .. |
|---|
| 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; |
|---|