Commit 27bf5be8 authored by Jun Li's avatar Jun Li Committed by Greg Kroah-Hartman
Browse files

usb: chipidea: handle single role for usb role class



If usb port is configed to be single role, but usb role class
is trying to set unavailable role, don't try to do role change.

Signed-off-by: default avatarJun Li <jun.li@nxp.com>
Signed-off-by: default avatarPeter Chen <peter.chen@nxp.com>
Link: https://lore.kernel.org/r/20200122014639.22667-2-peter.chen@nxp.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 1e31d3ca
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -302,6 +302,16 @@ static inline enum usb_role ci_role_to_usb_role(struct ci_hdrc *ci)
		return USB_ROLE_NONE;
}

static inline enum ci_role usb_role_to_ci_role(enum usb_role role)
{
	if (role == USB_ROLE_HOST)
		return CI_ROLE_HOST;
	else if (role == USB_ROLE_DEVICE)
		return CI_ROLE_GADGET;
	else
		return CI_ROLE_END;
}

/**
 * hw_read_id_reg: reads from a identification register
 * @ci: the controller
+3 −1
Original line number Diff line number Diff line
@@ -618,9 +618,11 @@ static int ci_usb_role_switch_set(struct device *dev, enum usb_role role)
	struct ci_hdrc *ci = dev_get_drvdata(dev);
	struct ci_hdrc_cable *cable = NULL;
	enum usb_role current_role = ci_role_to_usb_role(ci);
	enum ci_role ci_role = usb_role_to_ci_role(role);
	unsigned long flags;

	if (current_role == role)
	if ((ci_role != CI_ROLE_END && !ci->roles[ci_role]) ||
	    (current_role == role))
		return 0;

	pm_runtime_get_sync(ci->dev);