Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 16e569e9 authored by Anton Tikhomirov's avatar Anton Tikhomirov Committed by Felipe Balbi
Browse files

usb: phy: replace spinlock with mutex in OTG FSM



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: default avatarAnton Tikhomirov <av.tikhomirov@samsung.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent d49dd788
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -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;
}
+3 −4
Original line number Diff line number Diff line
@@ -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;
+2 −2
Original line number Diff line number Diff line
@@ -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 {