mfd: Add initialisation callback for WM8350
Mark Brown [Fri, 10 Oct 2008 14:58:13 +0000 (15:58 +0100)]
Some functions of the WM8350 require board-specific initialisation on
startup. Provide a callback to the WM8350 driver in platform data
for platforms to use to configure the chip.  Use of a callback allows
platforms to control the ordering of initialisation which can be
important.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Samuel Ortiz <sameo@openedhand.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>

drivers/mfd/wm8350-core.c
drivers/mfd/wm8350-i2c.c
include/linux/mfd/wm8350/core.h

index c7552c0..071834b 100644 (file)
@@ -388,7 +388,8 @@ out:
 }
 EXPORT_SYMBOL_GPL(wm8350_create_cache);
 
-int wm8350_device_init(struct wm8350 *wm8350)
+int wm8350_device_init(struct wm8350 *wm8350,
+                      struct wm8350_platform_data *pdata)
 {
        int ret = -EINVAL;
        u16 id1, id2, mask, mode;
@@ -439,6 +440,15 @@ int wm8350_device_init(struct wm8350 *wm8350)
                return ret;
        }
 
+       if (pdata->init) {
+               ret = pdata->init(wm8350);
+               if (ret != 0) {
+                       dev_err(wm8350->dev, "Platform init() failed: %d\n",
+                               ret);
+                       goto err;
+               }
+       }
+
        return 0;
 
 err:
index 2b0569c..245b790 100644 (file)
@@ -65,7 +65,7 @@ static int wm8350_i2c_probe(struct i2c_client *i2c,
        wm8350->read_dev = wm8350_i2c_read_device;
        wm8350->write_dev = wm8350_i2c_write_device;
 
-       ret = wm8350_device_init(wm8350);
+       ret = wm8350_device_init(wm8350, i2c->dev.platform_data);
        if (ret < 0)
                goto err;
 
index 94778c1..8f2beae 100644 (file)
@@ -564,10 +564,22 @@ struct wm8350 {
        u16 *reg_cache;
 };
 
+/**
+ * Data to be supplied by the platform to initialise the WM8350.
+ *
+ * @init: Function called during driver initialisation.  Should be
+ *        used by the platform to configure GPIO functions and similar.
+ */
+struct wm8350_platform_data {
+       int (*init)(struct wm8350 *wm8350);
+};
+
+
 /*
  * WM8350 device initialisation and exit.
  */
-int wm8350_device_init(struct wm8350 *wm8350);
+int wm8350_device_init(struct wm8350 *wm8350,
+                      struct wm8350_platform_data *pdata);
 void wm8350_device_exit(struct wm8350 *wm8350);
 
 /*