07d57a32fb
When userspace needs to find a specific device, it currently isn't easy to resolve a /sys/devices/ path from a specific device tree node. Nor is it easy to obtain the compatible list for devices. This patch generalizes the code that inserts OF_* values into the uevent device attribute so that any device that is attached to an OF node will have that information exported to userspace. Without this patch only platform devices and some powerpc-specific busses have access to this data. The original function also creates a MODALIAS property for the compatible list, but that code has not been generalized into the common case because it has the potential to break module loading on a lot of bus types. Bus types are still responsible for their own MODALIAS properties. Boot tested on ARM and compile tested on PowerPC and SPARC. Signed-off-by: Grant Likely <grant.likely@secretlab.ca> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Tobias Klauser <tklauser@distanz.ch> Cc: Frederic Lambert <frdrc66@gmail.com> Cc: Rob Herring <rob.herring@calxeda.com> Cc: Mark Brown <broonie@sirena.org.uk> Cc: "David S. Miller" <davem@davemloft.net> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
71 lines
2 KiB
C
71 lines
2 KiB
C
#ifndef _LINUX_OF_DEVICE_H
|
|
#define _LINUX_OF_DEVICE_H
|
|
|
|
#include <linux/platform_device.h>
|
|
#include <linux/of_platform.h> /* temporary until merge */
|
|
|
|
#ifdef CONFIG_OF_DEVICE
|
|
#include <linux/device.h>
|
|
#include <linux/of.h>
|
|
#include <linux/mod_devicetable.h>
|
|
|
|
extern const struct of_device_id *of_match_device(
|
|
const struct of_device_id *matches, const struct device *dev);
|
|
extern void of_device_make_bus_id(struct device *dev);
|
|
|
|
/**
|
|
* of_driver_match_device - Tell if a driver's of_match_table matches a device.
|
|
* @drv: the device_driver structure to test
|
|
* @dev: the device structure to match against
|
|
*/
|
|
static inline int of_driver_match_device(struct device *dev,
|
|
const struct device_driver *drv)
|
|
{
|
|
return of_match_device(drv->of_match_table, dev) != NULL;
|
|
}
|
|
|
|
extern struct platform_device *of_dev_get(struct platform_device *dev);
|
|
extern void of_dev_put(struct platform_device *dev);
|
|
|
|
extern int of_device_add(struct platform_device *pdev);
|
|
extern int of_device_register(struct platform_device *ofdev);
|
|
extern void of_device_unregister(struct platform_device *ofdev);
|
|
|
|
extern ssize_t of_device_get_modalias(struct device *dev,
|
|
char *str, ssize_t len);
|
|
|
|
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);
|
|
|
|
static inline void of_device_node_put(struct device *dev)
|
|
{
|
|
of_node_put(dev->of_node);
|
|
}
|
|
|
|
#else /* CONFIG_OF_DEVICE */
|
|
|
|
static inline int of_driver_match_device(struct device *dev,
|
|
struct device_driver *drv)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void of_device_uevent(struct device *dev,
|
|
struct kobj_uevent_env *env) { }
|
|
|
|
static inline int of_device_uevent_modalias(struct device *dev,
|
|
struct kobj_uevent_env *env)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
|
|
static inline void of_device_node_put(struct device *dev) { }
|
|
|
|
static inline const struct of_device_id *of_match_device(
|
|
const struct of_device_id *matches, const struct device *dev)
|
|
{
|
|
return NULL;
|
|
}
|
|
#endif /* CONFIG_OF_DEVICE */
|
|
|
|
#endif /* _LINUX_OF_DEVICE_H */
|