Skip to content

Commit

Permalink
of: device: Support loading a module with OF based modalias
Browse files Browse the repository at this point in the history
In the case of ULPI devices, we want to be able to load the
driver before registering the device so that we don't get stuck
in a loop waiting for the phy module to appear and failing usb
controller probe. Currently we request the ulpi module via the
ulpi ids, but in the DT case we might need to request it with the
OF based modalias instead. Add a common function that allows
anyone to request a module with the OF based modalias.

Acked-by: Rob Herring <[email protected]>
Cc: <[email protected]>
Signed-off-by: Stephen Boyd <[email protected]>
Signed-off-by: Peter Chen <[email protected]>
  • Loading branch information
bebarino authored and Peter Chen committed Jan 20, 2017
1 parent 3f991aa commit 9c829c0
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 0 deletions.
23 changes: 23 additions & 0 deletions drivers/of/device.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,29 @@ ssize_t of_device_get_modalias(struct device *dev, char *str, ssize_t len)
return tsize;
}

int of_device_request_module(struct device *dev)
{
char *str;
ssize_t size;
int ret;

size = of_device_get_modalias(dev, NULL, 0);
if (size < 0)
return size;

str = kmalloc(size + 1, GFP_KERNEL);
if (!str)
return -ENOMEM;

of_device_get_modalias(dev, str, size);
str[size] = '\0';
ret = request_module(str);
kfree(str);

return ret;
}
EXPORT_SYMBOL_GPL(of_device_request_module);

/**
* of_device_uevent - Display OF related uevent information
*/
Expand Down
6 changes: 6 additions & 0 deletions include/linux/of_device.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ extern const void *of_device_get_match_data(const struct device *dev);

extern ssize_t of_device_get_modalias(struct device *dev,
char *str, ssize_t len);
extern int of_device_request_module(struct device *dev);

extern void of_device_uevent(struct device *dev, struct kobj_uevent_env *env);
extern int of_device_uevent_modalias(struct device *dev, struct kobj_uevent_env *env);
Expand Down Expand Up @@ -78,6 +79,11 @@ static inline int of_device_get_modalias(struct device *dev,
return -ENODEV;
}

static inline int of_device_request_module(struct device *dev)
{
return -ENODEV;
}

static inline int of_device_uevent_modalias(struct device *dev,
struct kobj_uevent_env *env)
{
Expand Down

0 comments on commit 9c829c0

Please sign in to comment.