greybus: core: add bus id to uevents
authorJohan Hovold <johan@hovoldconsulting.com>
Thu, 3 Dec 2015 18:18:02 +0000 (19:18 +0100)
committerGreg Kroah-Hartman <gregkh@google.com>
Fri, 4 Dec 2015 01:25:28 +0000 (17:25 -0800)
Add the bus id to all greybus uevents.

This is needed to identify devices that are being removed (e.g. at
hot-unplug).

Signed-off-by: Johan Hovold <johan@hovoldconsulting.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/core.c
drivers/staging/greybus/svc.c
drivers/staging/greybus/svc.h

index 9dcb1bf311c032fc6a3e566ac236cf1616625273..3d8b7ef589bb5e427e80848ec59edf70b378dfbd 100644 (file)
@@ -77,7 +77,7 @@ 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_host_device *hd = NULL;
+       struct gb_host_device *hd;
        struct gb_interface *intf = NULL;
        struct gb_bundle *bundle = NULL;
        struct gb_svc *svc = NULL;
@@ -86,16 +86,22 @@ static int greybus_uevent(struct device *dev, struct kobj_uevent_env *env)
                hd = to_gb_host_device(dev);
        } else if (is_gb_interface(dev)) {
                intf = to_gb_interface(dev);
+               hd = intf->hd;
        } else if (is_gb_bundle(dev)) {
                bundle = to_gb_bundle(dev);
                intf = bundle->intf;
+               hd = intf->hd;
        } else if (is_gb_svc(dev)) {
                svc = to_gb_svc(dev);
+               hd = svc->hd;
        } else {
                dev_WARN(dev, "uevent for unknown greybus device \"type\"!\n");
                return -EINVAL;
        }
 
+       if (add_uevent_var(env, "BUS=%u", hd->bus_id))
+               return -ENOMEM;
+
        if (bundle) {
                // FIXME
                // add a uevent that can "load" a bundle type
@@ -104,10 +110,6 @@ static int greybus_uevent(struct device *dev, struct kobj_uevent_env *env)
                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 f65aba6446e2c072a7bdef13ca946d4f3405f10d..7037125e5cb7fb6f0a08d548b632278eb8fd20cc 100644 (file)
@@ -695,6 +695,7 @@ static int gb_svc_connection_init(struct gb_connection *connection)
        ida_init(&svc->device_id_map);
        svc->state = GB_SVC_STATE_RESET;
        svc->connection = connection;
+       svc->hd = hd;
        connection->private = svc;
 
        hd->svc = svc;
index 3acfa07cc73bab8abcdc017beb3772cd3a86a787..ca0f71d059b17a864088d9e644ba1c5ee8674e06 100644 (file)
@@ -19,6 +19,7 @@ enum gb_svc_state {
 struct gb_svc {
        struct device           dev;
 
+       struct gb_host_device   *hd;
        struct gb_connection    *connection;
        enum gb_svc_state       state;
        struct ida              device_id_map;