Commit e6b0de46 authored by Manivannan Sadhasivam's avatar Manivannan Sadhasivam Committed by Greg Kroah-Hartman

bus: mhi: core: Add uevent support for module autoloading

Add uevent support to MHI bus so that the client drivers can be autoloaded
by udev when the MHI devices gets created. The client drivers are
expected to provide MODULE_DEVICE_TABLE with the MHI id_table struct so
that the alias can be exported.
Signed-off-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Reviewed-by: default avatarJeffrey Hugo <jhugo@codeaurora.org>
Tested-by: default avatarJeffrey Hugo <jhugo@codeaurora.org>
Link: https://lore.kernel.org/r/20200220095854.4804-13-manivannan.sadhasivam@linaro.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 189ff97c
...@@ -1210,6 +1210,14 @@ void mhi_driver_unregister(struct mhi_driver *mhi_drv) ...@@ -1210,6 +1210,14 @@ void mhi_driver_unregister(struct mhi_driver *mhi_drv)
} }
EXPORT_SYMBOL_GPL(mhi_driver_unregister); EXPORT_SYMBOL_GPL(mhi_driver_unregister);
static int mhi_uevent(struct device *dev, struct kobj_uevent_env *env)
{
struct mhi_device *mhi_dev = to_mhi_device(dev);
return add_uevent_var(env, "MODALIAS=" MHI_DEVICE_MODALIAS_FMT,
mhi_dev->chan_name);
}
static int mhi_match(struct device *dev, struct device_driver *drv) static int mhi_match(struct device *dev, struct device_driver *drv)
{ {
struct mhi_device *mhi_dev = to_mhi_device(dev); struct mhi_device *mhi_dev = to_mhi_device(dev);
...@@ -1236,6 +1244,7 @@ struct bus_type mhi_bus_type = { ...@@ -1236,6 +1244,7 @@ struct bus_type mhi_bus_type = {
.name = "mhi", .name = "mhi",
.dev_name = "mhi", .dev_name = "mhi",
.match = mhi_match, .match = mhi_match,
.uevent = mhi_uevent,
}; };
static int __init mhi_init(void) static int __init mhi_init(void)
......
...@@ -821,6 +821,7 @@ struct wmi_device_id { ...@@ -821,6 +821,7 @@ struct wmi_device_id {
const void *context; const void *context;
}; };
#define MHI_DEVICE_MODALIAS_FMT "mhi:%s"
#define MHI_NAME_SIZE 32 #define MHI_NAME_SIZE 32
/** /**
......
...@@ -231,5 +231,8 @@ int main(void) ...@@ -231,5 +231,8 @@ int main(void)
DEVID(wmi_device_id); DEVID(wmi_device_id);
DEVID_FIELD(wmi_device_id, guid_string); DEVID_FIELD(wmi_device_id, guid_string);
DEVID(mhi_device_id);
DEVID_FIELD(mhi_device_id, chan);
return 0; return 0;
} }
...@@ -1335,6 +1335,15 @@ static int do_wmi_entry(const char *filename, void *symval, char *alias) ...@@ -1335,6 +1335,15 @@ static int do_wmi_entry(const char *filename, void *symval, char *alias)
return 1; return 1;
} }
/* Looks like: mhi:S */
static int do_mhi_entry(const char *filename, void *symval, char *alias)
{
DEF_FIELD_ADDR(symval, mhi_device_id, chan);
sprintf(alias, MHI_DEVICE_MODALIAS_FMT, *chan);
return 1;
}
/* Does namelen bytes of name exactly match the symbol? */ /* Does namelen bytes of name exactly match the symbol? */
static bool sym_is(const char *name, unsigned namelen, const char *symbol) static bool sym_is(const char *name, unsigned namelen, const char *symbol)
{ {
...@@ -1407,6 +1416,7 @@ static const struct devtable devtable[] = { ...@@ -1407,6 +1416,7 @@ static const struct devtable devtable[] = {
{"typec", SIZE_typec_device_id, do_typec_entry}, {"typec", SIZE_typec_device_id, do_typec_entry},
{"tee", SIZE_tee_client_device_id, do_tee_entry}, {"tee", SIZE_tee_client_device_id, do_tee_entry},
{"wmi", SIZE_wmi_device_id, do_wmi_entry}, {"wmi", SIZE_wmi_device_id, do_wmi_entry},
{"mhi", SIZE_mhi_device_id, do_mhi_entry},
}; };
/* Create MODULE_ALIAS() statements. /* Create MODULE_ALIAS() statements.
......
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