sdio.o sdio_ops.o sdio_bus.o \
                                   sdio_cis.o sdio_io.o sdio_irq.o \
                                   quirks.o slot-gpio.o
-mmc_core-$(CONFIG_OF)          += pwrseq.o
+mmc_core-$(CONFIG_OF)          += pwrseq.o pwrseq_simple.o
 mmc_core-$(CONFIG_DEBUG_FS)    += debugfs.o
 
  *
  *  MMC power sequence management
  */
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/err.h>
+#include <linux/of.h>
+#include <linux/of_platform.h>
+
 #include <linux/mmc/host.h>
 
 #include "pwrseq.h"
 
+struct mmc_pwrseq_match {
+       const char *compatible;
+       int (*alloc)(struct mmc_host *host, struct device *dev);
+};
+
+static struct mmc_pwrseq_match pwrseq_match[] = {
+       {
+               .compatible = "mmc-pwrseq-simple",
+               .alloc = mmc_pwrseq_simple_alloc,
+       },
+};
+
+static struct mmc_pwrseq_match *mmc_pwrseq_find(struct device_node *np)
+{
+       struct mmc_pwrseq_match *match = ERR_PTR(-ENODEV);
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(pwrseq_match); i++) {
+               if (of_device_is_compatible(np, pwrseq_match[i].compatible)) {
+                       match = &pwrseq_match[i];
+                       break;
+               }
+       }
+
+       return match;
+}
 
 int mmc_pwrseq_alloc(struct mmc_host *host)
 {
-       return 0;
+       struct platform_device *pdev;
+       struct device_node *np;
+       struct mmc_pwrseq_match *match;
+       int ret = 0;
+
+       np = of_parse_phandle(host->parent->of_node, "mmc-pwrseq", 0);
+       if (!np)
+               return 0;
+
+       pdev = of_find_device_by_node(np);
+       if (!pdev) {
+               ret = -ENODEV;
+               goto err;
+       }
+
+       match = mmc_pwrseq_find(np);
+       if (IS_ERR(match)) {
+               ret = PTR_ERR(match);
+               goto err;
+       }
+
+       ret = match->alloc(host, &pdev->dev);
+       if (!ret)
+               dev_info(host->parent, "allocated mmc-pwrseq\n");
+
+err:
+       of_node_put(np);
+       return ret;
 }
 
 void mmc_pwrseq_pre_power_on(struct mmc_host *host)
 
 void mmc_pwrseq_power_off(struct mmc_host *host);
 void mmc_pwrseq_free(struct mmc_host *host);
 
+int mmc_pwrseq_simple_alloc(struct mmc_host *host, struct device *dev);
+
 #else
 
 static inline int mmc_pwrseq_alloc(struct mmc_host *host) { return 0; }
 
--- /dev/null
+/*
+ *  Copyright (C) 2014 Linaro Ltd
+ *
+ * Author: Ulf Hansson <ulf.hansson@linaro.org>
+ *
+ * License terms: GNU General Public License (GPL) version 2
+ *
+ *  Simple MMC power sequence management
+ */
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/device.h>
+#include <linux/err.h>
+
+#include <linux/mmc/host.h>
+
+#include "pwrseq.h"
+
+struct mmc_pwrseq_simple {
+       struct mmc_pwrseq pwrseq;
+};
+
+static void mmc_pwrseq_simple_free(struct mmc_host *host)
+{
+       struct mmc_pwrseq_simple *pwrseq = container_of(host->pwrseq,
+                                       struct mmc_pwrseq_simple, pwrseq);
+
+       kfree(pwrseq);
+       host->pwrseq = NULL;
+}
+
+static struct mmc_pwrseq_ops mmc_pwrseq_simple_ops = {
+       .free = mmc_pwrseq_simple_free,
+};
+
+int mmc_pwrseq_simple_alloc(struct mmc_host *host, struct device *dev)
+{
+       struct mmc_pwrseq_simple *pwrseq;
+
+       pwrseq = kzalloc(sizeof(struct mmc_pwrseq_simple), GFP_KERNEL);
+       if (!pwrseq)
+               return -ENOMEM;
+
+       pwrseq->pwrseq.ops = &mmc_pwrseq_simple_ops;
+       host->pwrseq = &pwrseq->pwrseq;
+
+       return 0;
+}