]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
mfd: Register WM8400 codec device
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Thu, 18 Dec 2008 09:54:22 +0000 (10:54 +0100)
committerSamuel Ortiz <samuel@sortiz.org>
Sun, 4 Jan 2009 11:17:41 +0000 (12:17 +0100)
Register a child device for the codec in the WM8400.

Also switch the unregistration of the MFD devices to use the MFD core
since the current code is hand rolling the same thing.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Samuel Ortiz <sameo@openedhand.com>
drivers/mfd/Kconfig
drivers/mfd/wm8400-core.c

index 8cd3dd9a69b201cc75c995e43dc357dbe9cd629d..ddfb12b52f54ebc239c9d25402f22857e943b297 100644 (file)
@@ -116,6 +116,7 @@ config PMIC_DA903X
 
 config MFD_WM8400
        tristate "Support Wolfson Microelectronics WM8400"
+       select MFD_CORE
        depends on I2C
        help
          Support for the Wolfson Microelecronics WM8400 PMIC and audio
index 6a0cedb5bb8a1356fa86f28d73c82a5117402a1a..cf30d06a0104a6ab4f6295a7abf2a8ad85700a9a 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/bug.h>
 #include <linux/i2c.h>
 #include <linux/kernel.h>
+#include <linux/mfd/core.h>
 #include <linux/mfd/wm8400-private.h>
 #include <linux/mfd/wm8400-audio.h>
 
@@ -239,6 +240,16 @@ void wm8400_reset_codec_reg_cache(struct wm8400 *wm8400)
 }
 EXPORT_SYMBOL_GPL(wm8400_reset_codec_reg_cache);
 
+static int wm8400_register_codec(struct wm8400 *wm8400)
+{
+       struct mfd_cell cell = {
+               .name = "wm8400-codec",
+               .driver_data = wm8400,
+       };
+
+       return mfd_add_devices(wm8400->dev, -1, &cell, 1, NULL, 0);
+}
+
 /*
  * wm8400_init - Generic initialisation
  *
@@ -296,24 +307,32 @@ static int wm8400_init(struct wm8400 *wm8400,
        reg = (reg & WM8400_CHIP_REV_MASK) >> WM8400_CHIP_REV_SHIFT;
        dev_info(wm8400->dev, "WM8400 revision %x\n", reg);
 
+       ret = wm8400_register_codec(wm8400);
+       if (ret != 0) {
+               dev_err(wm8400->dev, "Failed to register codec\n");
+               goto err_children;
+       }
+
        if (pdata && pdata->platform_init) {
                ret = pdata->platform_init(wm8400->dev);
-               if (ret != 0)
+               if (ret != 0) {
                        dev_err(wm8400->dev, "Platform init failed: %d\n",
                                ret);
+                       goto err_children;
+               }
        } else
                dev_warn(wm8400->dev, "No platform initialisation supplied\n");
 
+       return 0;
+
+err_children:
+       mfd_remove_devices(wm8400->dev);
        return ret;
 }
 
 static void wm8400_release(struct wm8400 *wm8400)
 {
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(wm8400->regulators); i++)
-               if (wm8400->regulators[i].name)
-                       platform_device_unregister(&wm8400->regulators[i]);
+       mfd_remove_devices(wm8400->dev);
 }
 
 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)