diff --git a/drivers/usb/roles/class.c b/drivers/usb/roles/class.c index 32e6d19f7011..435addc7fd56 100644 --- a/drivers/usb/roles/class.c +++ b/drivers/usb/roles/class.c @@ -20,6 +20,9 @@ struct usb_role_switch { struct device dev; struct mutex lock; /* device lock*/ enum usb_role role; +#ifdef CONFIG_NO_GKI + bool registered; +#endif /* From descriptor */ struct device *usb2_port; @@ -46,6 +49,11 @@ int usb_role_switch_set_role(struct usb_role_switch *sw, enum usb_role role) if (IS_ERR_OR_NULL(sw)) return 0; +#ifdef CONFIG_NO_GKI + if (!sw->registered) + return -EOPNOTSUPP; +#endif + mutex_lock(&sw->lock); ret = sw->set(sw, role); @@ -74,6 +82,11 @@ enum usb_role usb_role_switch_get_role(struct usb_role_switch *sw) if (IS_ERR_OR_NULL(sw)) return USB_ROLE_NONE; +#ifdef CONFIG_NO_GKI + if (!sw->registered) + return USB_ROLE_NONE; +#endif + mutex_lock(&sw->lock); if (sw->get) @@ -351,6 +364,10 @@ usb_role_switch_register(struct device *parent, return ERR_PTR(ret); } +#ifdef CONFIG_NO_GKI + sw->registered = true; +#endif + /* TODO: Symlinks for the host port and the device controller. */ return sw; @@ -365,8 +382,12 @@ EXPORT_SYMBOL_GPL(usb_role_switch_register); */ void usb_role_switch_unregister(struct usb_role_switch *sw) { - if (!IS_ERR_OR_NULL(sw)) + if (!IS_ERR_OR_NULL(sw)) { +#ifdef CONFIG_NO_GKI + sw->registered = false; +#endif device_unregister(&sw->dev); + } } EXPORT_SYMBOL_GPL(usb_role_switch_unregister);