]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/w1/w1.c
Merge remote-tracking branches 'asoc/topic/adau' and 'asoc/topic/adsp' into asoc...
[karo-tx-linux.git] / drivers / w1 / w1.c
index b96f61b15dc65e866564a075686072eddc49f905..ff52618cafbecab99224143424ad57887de789f1 100644 (file)
@@ -614,27 +614,11 @@ end:
        return err;
 }
 
-/*
- * Handle sysfs file creation and removal here, before userspace is told that
- * the device is added / removed from the system
- */
-static int w1_bus_notify(struct notifier_block *nb, unsigned long action,
-                        void *data)
+static int w1_family_notify(unsigned long action, struct w1_slave *sl)
 {
-       struct device *dev = data;
-       struct w1_slave *sl;
        struct w1_family_ops *fops;
        int err;
 
-       /*
-        * Only care about slave devices at the moment.  Yes, we should use a
-        * separate "type" for this, but for now, look at the release function
-        * to know which type it is...
-        */
-       if (dev->release != w1_slave_release)
-               return 0;
-
-       sl = dev_to_w1_slave(dev);
        fops = sl->family->fops;
 
        if (!fops)
@@ -673,10 +657,6 @@ static int w1_bus_notify(struct notifier_block *nb, unsigned long action,
        return 0;
 }
 
-static struct notifier_block w1_bus_nb = {
-       .notifier_call = w1_bus_notify,
-};
-
 static int __w1_attach_slave_device(struct w1_slave *sl)
 {
        int err;
@@ -698,6 +678,9 @@ static int __w1_attach_slave_device(struct w1_slave *sl)
        dev_dbg(&sl->dev, "%s: registering %s as %p.\n", __func__,
                dev_name(&sl->dev), sl);
 
+       /* suppress for w1_family_notify before sending KOBJ_ADD */
+       dev_set_uevent_suppress(&sl->dev, true);
+
        err = device_register(&sl->dev);
        if (err < 0) {
                dev_err(&sl->dev,
@@ -705,7 +688,7 @@ static int __w1_attach_slave_device(struct w1_slave *sl)
                        dev_name(&sl->dev), err);
                return err;
        }
-
+       w1_family_notify(BUS_NOTIFY_ADD_DEVICE, sl);
 
        dev_set_uevent_suppress(&sl->dev, false);
        kobject_uevent(&sl->dev.kobj, KOBJ_ADD);
@@ -799,6 +782,7 @@ int w1_unref_slave(struct w1_slave *sl)
                msg.type = W1_SLAVE_REMOVE;
                w1_netlink_send(sl->master, &msg);
 
+               w1_family_notify(BUS_NOTIFY_DEL_DEVICE, sl);
                device_unregister(&sl->dev);
                #ifdef DEBUG
                memset(sl, 0, sizeof(*sl));
@@ -1186,10 +1170,6 @@ static int __init w1_init(void)
                goto err_out_exit_init;
        }
 
-       retval = bus_register_notifier(&w1_bus_type, &w1_bus_nb);
-       if (retval)
-               goto err_out_bus_unregister;
-
        retval = driver_register(&w1_master_driver);
        if (retval) {
                printk(KERN_ERR