Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/pci-2.6
[sfrench/cifs-2.6.git] / drivers / w1 / w1_int.c
index 68565aacec7bef30085a99c4786d93de2133660a..6840dfebe4d4c82a5abc242a8ee1d66570f100ab 100644 (file)
@@ -41,7 +41,7 @@ static struct w1_master * w1_alloc_dev(u32 id, int slave_count, int slave_ttl,
        /*
         * We are in process context(kernel thread), so can sleep.
         */
-       dev = kmalloc(sizeof(struct w1_master) + sizeof(struct w1_bus_master), GFP_KERNEL);
+       dev = kzalloc(sizeof(struct w1_master) + sizeof(struct w1_bus_master), GFP_KERNEL);
        if (!dev) {
                printk(KERN_ERR
                        "Failed to allocate %zd bytes for new w1 device.\n",
@@ -49,7 +49,6 @@ static struct w1_master * w1_alloc_dev(u32 id, int slave_count, int slave_ttl,
                return NULL;
        }
 
-       memset(dev, 0, sizeof(struct w1_master) + sizeof(struct w1_bus_master));
 
        dev->bus_master = (struct w1_bus_master *)(dev + 1);
 
@@ -65,7 +64,7 @@ static struct w1_master * w1_alloc_dev(u32 id, int slave_count, int slave_ttl,
        atomic_set(&dev->refcnt, 2);
 
        INIT_LIST_HEAD(&dev->slist);
-       init_MUTEX(&dev->mutex);
+       mutex_init(&dev->mutex);
 
        memcpy(&dev->dev, device, sizeof(struct device));
        snprintf(dev->dev.bus_id, sizeof(dev->dev.bus_id),
@@ -74,16 +73,11 @@ static struct w1_master * w1_alloc_dev(u32 id, int slave_count, int slave_ttl,
 
        dev->driver = driver;
 
-       dev->groups = 1;
        dev->seq = 1;
-       dev_init_netlink(dev);
 
        err = device_register(&dev->dev);
        if (err) {
                printk(KERN_ERR "Failed to register master device. err=%d\n", err);
-
-               dev_fini_netlink(dev);
-
                memset(dev, 0, sizeof(struct w1_master));
                kfree(dev);
                dev = NULL;
@@ -105,7 +99,8 @@ int w1_add_master_device(struct w1_bus_master *master)
 
         /* validate minimum functionality */
         if (!(master->touch_bit && master->reset_bus) &&
-            !(master->write_bit && master->read_bit)) {
+            !(master->write_bit && master->read_bit) &&
+           !(master->write_byte && master->read_byte && master->reset_bus)) {
                printk(KERN_ERR "w1_add_master_device: invalid function set\n");
                return(-EINVAL);
         }
@@ -131,12 +126,12 @@ int w1_add_master_device(struct w1_bus_master *master)
 
        dev->initialized = 1;
 
-       spin_lock(&w1_mlock);
+       mutex_lock(&w1_mlock);
        list_add(&dev->w1_master_entry, &w1_masters);
-       spin_unlock(&w1_mlock);
+       mutex_unlock(&w1_mlock);
 
+       memset(&msg, 0, sizeof(msg));
        msg.id.mst.id = dev->id;
-       msg.id.mst.pid = dev->thread->pid;
        msg.type = W1_MASTER_ADD;
        w1_netlink_send(dev, &msg);
 
@@ -153,7 +148,6 @@ err_out_free_dev:
 void __w1_remove_master_device(struct w1_master *dev)
 {
        struct w1_netlink_msg msg;
-       pid_t pid = dev->thread->pid;
 
        set_bit(W1_MASTER_NEED_EXIT, &dev->flags);
        kthread_stop(dev->thread);
@@ -166,8 +160,8 @@ void __w1_remove_master_device(struct w1_master *dev)
                        flush_signals(current);
        }
 
+       memset(&msg, 0, sizeof(msg));
        msg.id.mst.id = dev->id;
-       msg.id.mst.pid = pid;
        msg.type = W1_MASTER_REMOVE;
        w1_netlink_send(dev, &msg);
 
@@ -176,22 +170,24 @@ void __w1_remove_master_device(struct w1_master *dev)
 
 void w1_remove_master_device(struct w1_bus_master *bm)
 {
-       struct w1_master *dev = NULL;
+       struct w1_master *dev, *found = NULL;
 
        list_for_each_entry(dev, &w1_masters, w1_master_entry) {
                if (!dev->initialized)
                        continue;
 
-               if (dev->bus_master->data == bm->data)
+               if (dev->bus_master->data == bm->data) {
+                       found = dev;
                        break;
+               }
        }
 
-       if (!dev) {
+       if (!found) {
                printk(KERN_ERR "Device doesn't exist.\n");
                return;
        }
 
-       __w1_remove_master_device(dev);
+       __w1_remove_master_device(found);
 }
 
 EXPORT_SYMBOL(w1_add_master_device);