usb: phy: replace spinlock with mutex in OTG FSM
authorAnton Tikhomirov <av.tikhomirov@samsung.com>
Tue, 26 Nov 2013 02:46:05 +0000 (11:46 +0900)
committerFelipe Balbi <balbi@ti.com>
Tue, 26 Nov 2013 16:58:18 +0000 (10:58 -0600)
OTG Final State Machine calls functions which may sleep.

For example, start_gadget callback implementation can use
usb_gadget_vbus_connect(), whose context: can sleep.

If so, mutex should be used instead of spinlock.

Signed-off-by: Anton Tikhomirov <av.tikhomirov@samsung.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/phy/phy-fsl-usb.c
drivers/usb/phy/phy-fsm-usb.c
drivers/usb/phy/phy-fsm-usb.h

index 7f3c73b967ce6faf804ee1f29b82acbdde1f59f1..62d5af22efafff0b3aa037fa226840b46ec506b2 100644 (file)
@@ -848,7 +848,7 @@ static int fsl_otg_conf(struct platform_device *pdev)
                pr_info("Couldn't init OTG timers\n");
                goto err;
        }
-       spin_lock_init(&fsl_otg_tc->fsm.lock);
+       mutex_init(&fsl_otg_tc->fsm.lock);
 
        /* Set OTG state machine operations */
        fsl_otg_tc->fsm.ops = &fsl_otg_ops;
@@ -1017,10 +1017,9 @@ static int show_fsl_usb2_otg_state(struct device *dev,
        struct otg_fsm *fsm = &fsl_otg_dev->fsm;
        char *next = buf;
        unsigned size = PAGE_SIZE;
-       unsigned long flags;
        int t;
 
-       spin_lock_irqsave(&fsm->lock, flags);
+       mutex_lock(&fsm->lock);
 
        /* basic driver infomation */
        t = scnprintf(next, size,
@@ -1088,7 +1087,7 @@ static int show_fsl_usb2_otg_state(struct device *dev,
        size -= t;
        next += t;
 
-       spin_unlock_irqrestore(&fsm->lock, flags);
+       mutex_unlock(&fsm->lock);
 
        return PAGE_SIZE - size;
 }
index 329c2d2f85959963c7828d3d9332315062480623..2817b04a6c473a8e740dfba3e74faec4eee2d388 100644 (file)
@@ -23,7 +23,7 @@
 
 #include <linux/kernel.h>
 #include <linux/types.h>
-#include <linux/spinlock.h>
+#include <linux/mutex.h>
 #include <linux/delay.h>
 #include <linux/usb.h>
 #include <linux/usb/gadget.h>
@@ -245,9 +245,8 @@ int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state)
 int otg_statemachine(struct otg_fsm *fsm)
 {
        enum usb_otg_state state;
-       unsigned long flags;
 
-       spin_lock_irqsave(&fsm->lock, flags);
+       mutex_lock(&fsm->lock);
 
        state = fsm->otg->phy->state;
        state_changed = 0;
@@ -359,7 +358,7 @@ int otg_statemachine(struct otg_fsm *fsm)
        default:
                break;
        }
-       spin_unlock_irqrestore(&fsm->lock, flags);
+       mutex_lock(&fsm->lock);
 
        VDBG("quit statemachine, changed = %d\n", state_changed);
        return state_changed;
index 200f4d156020c2a434a08c49d9407778234c4ae9..b6ba1bfb86f2aa7cfb348bc2e704e48c34796b1b 100644 (file)
@@ -18,7 +18,7 @@
 #ifndef __LINUX_USB_OTG_FSM_H
 #define __LINUX_USB_OTG_FSM_H
 
-#include <linux/spinlock.h>
+#include <linux/mutex.h>
 #include <linux/errno.h>
 
 #undef VERBOSE
@@ -116,7 +116,7 @@ struct otg_fsm {
 
        /* Current usb protocol used: 0:undefine; 1:host; 2:client */
        int protocol;
-       spinlock_t lock;
+       struct mutex lock;
 };
 
 struct otg_fsm_ops {