greybus: skeleton for future uevents.
authorGreg Kroah-Hartman <greg@kroah.com>
Sat, 15 Nov 2014 20:12:16 +0000 (12:12 -0800)
committerGreg Kroah-Hartman <greg@kroah.com>
Sat, 15 Nov 2014 20:12:16 +0000 (12:12 -0800)
Implement a skeleton for the uevent framework, to be filled in later
when we figure out what type of module "matching" we want to do for
things (connections, interfaces, modules, etc.)

Based on a patch from Viresh Kumar <viresh.kumar@linaro.org>

Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
drivers/staging/greybus/connection.c
drivers/staging/greybus/core.c
drivers/staging/greybus/greybus.h
drivers/staging/greybus/interface.c
drivers/staging/greybus/module.c

index f460df4b4ec85891456a29f4e6f149883a2c9c8e..5927f2d979c280ca01bc942b31befb66714108b9 100644 (file)
@@ -135,7 +135,7 @@ static void gb_connection_release(struct device *dev)
        kfree(connection);
 }
 
-static struct device_type greybus_connection_type = {
+struct device_type greybus_connection_type = {
        .name =         "greybus_connection",
        .release =      gb_connection_release,
 };
index be190e723a23502255ef77346aca1de28c138c7e..9567324c71ec8f50144366f7eb869c412a98169f 100644 (file)
@@ -45,13 +45,42 @@ static int greybus_module_match(struct device *dev, struct device_driver *drv)
 
 static int greybus_uevent(struct device *dev, struct kobj_uevent_env *env)
 {
-       /* struct gb_module *gmod = to_gb_module(dev); */
+       struct gb_module *gmod = NULL;
+       struct gb_interface *interface = NULL;
+       struct gb_connection *connection = NULL;
+
+       if (is_gb_module(dev)) {
+               gmod = to_gb_module(dev);
+       } else if (is_gb_interface(dev)) {
+               interface = to_gb_interface(dev);
+               gmod = interface->gmod;
+       } else if (is_gb_connection(dev)) {
+               connection = to_gb_connection(dev);
+               interface = connection->interface;
+               gmod = interface->gmod;
+       } else {
+               dev_WARN(dev, "uevent for unknown greybus device \"type\"!\n");
+               return -EINVAL;
+       }
 
-       /* FIXME - add some uevents here... */
+       if (connection) {
+               // FIXME
+               // add a uevent that can "load" a connection type
+               return 0;
+       }
 
-       /* FIXME - be sure to check the type to know how to handle modules and
-        * interfaces differently */
+       if (interface) {
+               // FIXME
+               // add a uevent that can "load" a interface type
+               // This is what we need to bind a driver to so use the info
+               // in gmod here as well
+               return 0;
+       }
 
+       // FIXME
+       // "just" a module, be vague here, nothing binds to a module except
+       // the greybus core, so there's not much, if anything, we need to
+       // advertise.
        return 0;
 }
 
index 284be8472148e4c0f0d80756374332a780dc4f7c..eb5eb6080783f0a39cbe240072461b88f9b269be 100644 (file)
@@ -259,5 +259,24 @@ void gb_uart_device_exit(struct gb_connection *connection);
 int svc_set_route_send(struct gb_interface *interface,
                               struct greybus_host_device *hd);
 
+extern struct device_type greybus_module_type;
+extern struct device_type greybus_interface_type;
+extern struct device_type greybus_connection_type;
+
+static inline int is_gb_module(const struct device *dev)
+{
+       return dev->type == &greybus_module_type;
+}
+
+static inline int is_gb_interface(const struct device *dev)
+{
+       return dev->type == &greybus_interface_type;
+}
+
+static inline int is_gb_connection(const struct device *dev)
+{
+       return dev->type == &greybus_connection_type;
+}
+
 #endif /* __KERNEL__ */
 #endif /* __LINUX_GREYBUS_H */
index 04c864f2105f40869b89676f915f167285ab4ae6..38c104fc86754b284d38fd7c754feb4bb07b471d 100644 (file)
@@ -31,7 +31,7 @@ static void gb_interface_release(struct device *dev)
        kfree(interface);
 }
 
-static struct device_type greybus_interface_type = {
+struct device_type greybus_interface_type = {
        .name =         "greybus_interface",
        .release =      gb_interface_release,
 };
index 51bd5c6131ce29ee26940047e071543061d391ee..f432bea3c8182a72fb2ac960868fa62e18ae18f0 100644 (file)
@@ -62,7 +62,7 @@ static void greybus_module_release(struct device *dev)
        kfree(gmod);
 }
 
-static struct device_type greybus_module_type = {
+struct device_type greybus_module_type = {
        .name =         "greybus_module",
        .release =      greybus_module_release,
 };