i2c: Bus drivers return -Errno not -1
[safe/jmp/linux-2.6] / drivers / i2c / busses / i2c-amd756-s4882.c
index f51ab65..2f150e3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * i2c-amd756-s4882.c - i2c-amd756 extras for the Tyan S4882 motherboard
  *
- * Copyright (C) 2004 Jean Delvare <khali@linux-fr.org>
+ * Copyright (C) 2004, 2008 Jean Delvare <khali@linux-fr.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -38,6 +38,7 @@
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/i2c.h>
+#include <linux/mutex.h>
 
 extern struct i2c_adapter amd756_smbus;
 
@@ -45,7 +46,7 @@ static struct i2c_adapter *s4882_adapter;
 static struct i2c_algorithm *s4882_algo;
 
 /* Wrapper access functions for multiplexed SMBus */
-static struct semaphore amd756_lock;
+static DEFINE_MUTEX(amd756_lock);
 
 static s32 amd756_access_virt0(struct i2c_adapter * adap, u16 addr,
                               unsigned short flags, char read_write,
@@ -57,14 +58,14 @@ static s32 amd756_access_virt0(struct i2c_adapter * adap, u16 addr,
        /* We exclude the multiplexed addresses */
        if (addr == 0x4c || (addr & 0xfc) == 0x50 || (addr & 0xfc) == 0x30
         || addr == 0x18)
-               return -1;
+               return -ENXIO;
 
-       down(&amd756_lock);
+       mutex_lock(&amd756_lock);
 
        error = amd756_smbus.algo->smbus_xfer(adap, addr, flags, read_write,
                                              command, size, data);
 
-       up(&amd756_lock);
+       mutex_unlock(&amd756_lock);
 
        return error;
 }
@@ -85,9 +86,9 @@ static inline s32 amd756_access_channel(struct i2c_adapter * adap, u16 addr,
 
        /* We exclude the non-multiplexed addresses */
        if (addr != 0x4c && (addr & 0xfc) != 0x50 && (addr & 0xfc) != 0x30)
-               return -1;
+               return -ENXIO;
 
-       down(&amd756_lock);
+       mutex_lock(&amd756_lock);
 
        if (last_channels != channels) {
                union i2c_smbus_data mplxdata;
@@ -105,7 +106,7 @@ static inline s32 amd756_access_channel(struct i2c_adapter * adap, u16 addr,
                                              command, size, data);
 
 UNLOCK:
-       up(&amd756_lock);
+       mutex_unlock(&amd756_lock);
        return error;
 }
 
@@ -166,8 +167,6 @@ static int __init amd756_s4882_init(void)
        }
 
        printk(KERN_INFO "Enabling SMBus multiplexing for Tyan S4882\n");
-       init_MUTEX(&amd756_lock);
-
        /* Define the 5 virtual adapters and algorithms structures */
        if (!(s4882_adapter = kzalloc(5 * sizeof(struct i2c_adapter),
                                      GFP_KERNEL))) {
@@ -185,12 +184,14 @@ static int __init amd756_s4882_init(void)
        s4882_algo[0].smbus_xfer = amd756_access_virt0;
        s4882_adapter[0] = amd756_smbus;
        s4882_adapter[0].algo = s4882_algo;
+       s4882_adapter[0].dev.parent = amd756_smbus.dev.parent;
        for (i = 1; i < 5; i++) {
                s4882_algo[i] = *(amd756_smbus.algo);
                s4882_adapter[i] = amd756_smbus;
                sprintf(s4882_adapter[i].name,
                        "SMBus 8111 adapter (CPU%d)", i-1);
                s4882_adapter[i].algo = s4882_algo+i;
+               s4882_adapter[i].dev.parent = amd756_smbus.dev.parent;
        }
        s4882_algo[1].smbus_xfer = amd756_access_virt1;
        s4882_algo[2].smbus_xfer = amd756_access_virt2;
@@ -230,7 +231,8 @@ ERROR2:
        kfree(s4882_adapter);
        s4882_adapter = NULL;
 ERROR1:
-       i2c_del_adapter(&amd756_smbus);
+       /* Restore physical bus */
+       i2c_add_adapter(&amd756_smbus);
 ERROR0:
        return error;
 }
@@ -245,10 +247,8 @@ static void __exit amd756_s4882_exit(void)
                kfree(s4882_adapter);
                s4882_adapter = NULL;
        }
-       if (s4882_algo) {
-               kfree(s4882_algo);
-               s4882_algo = NULL;
-       }
+       kfree(s4882_algo);
+       s4882_algo = NULL;
 
        /* Restore physical bus */
        if (i2c_add_adapter(&amd756_smbus))