Commit 3e3b8196 authored by Heikki Krogerus's avatar Heikki Krogerus Committed by Greg Kroah-Hartman

usb: typec: mux: Take care of driver module reference counting

Functions typec_mux_get() and typec_switch_get() already
make sure that the mux device reference count is
incremented, but the same must be done to the driver module
as well to prevent the drivers from being unloaded in the
middle of operation.

This fixes a potential "BUG: unable to handle kernel paging
request at ..." from happening.

Fixes: 93dd2112 ("usb: typec: mux: Get the mux identifier from function parameter")
Acked-by: default avatarHans de Goede <hdegoede@redhat.com>
Tested-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 16c4cb19
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/device.h> #include <linux/device.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/module.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/usb/typec_mux.h> #include <linux/usb/typec_mux.h>
...@@ -49,8 +50,10 @@ struct typec_switch *typec_switch_get(struct device *dev) ...@@ -49,8 +50,10 @@ struct typec_switch *typec_switch_get(struct device *dev)
mutex_lock(&switch_lock); mutex_lock(&switch_lock);
sw = device_connection_find_match(dev, "typec-switch", NULL, sw = device_connection_find_match(dev, "typec-switch", NULL,
typec_switch_match); typec_switch_match);
if (!IS_ERR_OR_NULL(sw)) if (!IS_ERR_OR_NULL(sw)) {
WARN_ON(!try_module_get(sw->dev->driver->owner));
get_device(sw->dev); get_device(sw->dev);
}
mutex_unlock(&switch_lock); mutex_unlock(&switch_lock);
return sw; return sw;
...@@ -65,8 +68,10 @@ EXPORT_SYMBOL_GPL(typec_switch_get); ...@@ -65,8 +68,10 @@ EXPORT_SYMBOL_GPL(typec_switch_get);
*/ */
void typec_switch_put(struct typec_switch *sw) void typec_switch_put(struct typec_switch *sw)
{ {
if (!IS_ERR_OR_NULL(sw)) if (!IS_ERR_OR_NULL(sw)) {
module_put(sw->dev->driver->owner);
put_device(sw->dev); put_device(sw->dev);
}
} }
EXPORT_SYMBOL_GPL(typec_switch_put); EXPORT_SYMBOL_GPL(typec_switch_put);
...@@ -136,8 +141,10 @@ struct typec_mux *typec_mux_get(struct device *dev, const char *name) ...@@ -136,8 +141,10 @@ struct typec_mux *typec_mux_get(struct device *dev, const char *name)
mutex_lock(&mux_lock); mutex_lock(&mux_lock);
mux = device_connection_find_match(dev, name, NULL, typec_mux_match); mux = device_connection_find_match(dev, name, NULL, typec_mux_match);
if (!IS_ERR_OR_NULL(mux)) if (!IS_ERR_OR_NULL(mux)) {
WARN_ON(!try_module_get(mux->dev->driver->owner));
get_device(mux->dev); get_device(mux->dev);
}
mutex_unlock(&mux_lock); mutex_unlock(&mux_lock);
return mux; return mux;
...@@ -152,8 +159,10 @@ EXPORT_SYMBOL_GPL(typec_mux_get); ...@@ -152,8 +159,10 @@ EXPORT_SYMBOL_GPL(typec_mux_get);
*/ */
void typec_mux_put(struct typec_mux *mux) void typec_mux_put(struct typec_mux *mux)
{ {
if (!IS_ERR_OR_NULL(mux)) if (!IS_ERR_OR_NULL(mux)) {
module_put(mux->dev->driver->owner);
put_device(mux->dev); put_device(mux->dev);
}
} }
EXPORT_SYMBOL_GPL(typec_mux_put); EXPORT_SYMBOL_GPL(typec_mux_put);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment