* Author: Michal Wilczynski <m.wilczynski@samsung.com>
  */
 
+#include <linux/auxiliary_bus.h>
 #include <linux/firmware/thead/thead,th1520-aon.h>
 #include <linux/slab.h>
 #include <linux/platform_device.h>
        }
 }
 
+static void th1520_pd_pwrseq_unregister_adev(void *adev)
+{
+       auxiliary_device_delete(adev);
+       auxiliary_device_uninit(adev);
+}
+
+static int th1520_pd_pwrseq_gpu_init(struct device *dev)
+{
+       struct auxiliary_device *adev;
+       int ret;
+
+       /*
+        * Correctly check only for the property's existence in the DT node.
+        * We don't need to get/claim the reset here; that is the job of
+        * the auxiliary driver that we are about to spawn.
+        */
+       if (device_property_match_string(dev, "reset-names", "gpu-clkgen") < 0)
+               /*
+                * This is not an error. It simply means the optional sequencer
+                * is not described in the device tree.
+                */
+               return 0;
+
+       adev = devm_kzalloc(dev, sizeof(*adev), GFP_KERNEL);
+       if (!adev)
+               return -ENOMEM;
+
+       adev->name = "pwrseq-gpu";
+       adev->dev.parent = dev;
+
+       ret = auxiliary_device_init(adev);
+       if (ret)
+               return ret;
+
+       ret = auxiliary_device_add(adev);
+       if (ret) {
+               auxiliary_device_uninit(adev);
+               return ret;
+       }
+
+       return devm_add_action_or_reset(dev, th1520_pd_pwrseq_unregister_adev,
+                                       adev);
+}
+
 static int th1520_pd_probe(struct platform_device *pdev)
 {
        struct generic_pm_domain **domains;
        if (ret)
                goto err_clean_genpd;
 
+       ret = th1520_pd_pwrseq_gpu_init(dev);
+       if (ret)
+               goto err_clean_provider;
+
        return 0;
 
+err_clean_provider:
+       of_genpd_del_provider(dev->of_node);
 err_clean_genpd:
        for (i--; i >= 0; i--)
                pm_genpd_remove(domains[i]);