}
 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;
                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:
 
        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;
 
 
        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);
 
 /*