return false;
        }
 
-       if (!kgd2kfd_init_p(KFD_INTERFACE_VERSION, &kgd2kfd)) {
+       if (kgd2kfd_init_p(KFD_INTERFACE_VERSION, &kgd2kfd)) {
                symbol_put(kgd2kfd_init);
                kfd2kgd = NULL;
                kgd2kfd = NULL;
 
        return true;
 #elif defined(CONFIG_HSA_AMD)
-       if (!kgd2kfd_init(KFD_INTERFACE_VERSION, &kgd2kfd)) {
+       if (kgd2kfd_init(KFD_INTERFACE_VERSION, &kgd2kfd)) {
                kfd2kgd = NULL;
                kgd2kfd = NULL;
                return false;
 
 MODULE_PARM_DESC(send_sigterm,
        "Send sigterm to HSA process on unhandled exception (0 = disable, 1 = enable)");
 
-bool kgd2kfd_init(unsigned interface_version, const struct kgd2kfd_calls **g2f)
+static int amdkfd_init_completed;
+
+int kgd2kfd_init(unsigned interface_version, const struct kgd2kfd_calls **g2f)
 {
+       if (!amdkfd_init_completed)
+               return -EPROBE_DEFER;
+
        /*
         * Only one interface version is supported,
         * no kfd/kgd version skew allowed.
         */
        if (interface_version != KFD_INTERFACE_VERSION)
-               return false;
+               return -EINVAL;
 
        *g2f = &kgd2kfd;
 
-       return true;
+       return 0;
 }
 EXPORT_SYMBOL(kgd2kfd_init);
 
 
        kfd_process_create_wq();
 
+       amdkfd_init_completed = 1;
+
        dev_info(kfd_device, "Initialized module\n");
 
        return 0;
 
 static void __exit kfd_module_exit(void)
 {
+       amdkfd_init_completed = 0;
+
        kfd_process_destroy_wq();
        kfd_topology_shutdown();
        kfd_chardev_exit();
 
        int (*resume)(struct kfd_dev *kfd);
 };
 
-bool kgd2kfd_init(unsigned interface_version,
+int kgd2kfd_init(unsigned interface_version,
                const struct kgd2kfd_calls **g2f);
 
 #endif /* KGD_KFD_INTERFACE_H_INCLUDED */
 
        if (kgd2kfd_init_p == NULL)
                return false;
 
-       if (!kgd2kfd_init_p(KFD_INTERFACE_VERSION, &kgd2kfd)) {
+       if (kgd2kfd_init_p(KFD_INTERFACE_VERSION, &kgd2kfd)) {
                symbol_put(kgd2kfd_init);
                kgd2kfd = NULL;
 
 
        return true;
 #elif defined(CONFIG_HSA_AMD)
-       if (!kgd2kfd_init(KFD_INTERFACE_VERSION, &kgd2kfd)) {
+       if (kgd2kfd_init(KFD_INTERFACE_VERSION, &kgd2kfd)) {
                kgd2kfd = NULL;
 
                return false;