return reg1.status;
 }
 
-/*
- * Interface to tell the AP bus code that a configuration
- * change has happened. The bus code should at least do
- * an ap bus resource rescan.
- */
-#if IS_ENABLED(CONFIG_ZCRYPT)
-void ap_bus_cfg_chg(void);
-#else
-static inline void ap_bus_cfg_chg(void){}
-#endif
-
 #endif /* _ASM_S390_AP_H_ */
 
 
 #include <uapi/asm/chsc.h>
 
+/* struct from linux/notifier.h */
+struct notifier_block;
+
 /**
  * Operation codes for CHSC PNSO:
  *    PNSO_OC_NET_BRIDGE_INFO - only addresses that are visible to a bridgeport
        struct chsc_pnso_naid_l2 entries[];
 } __packed __aligned(PAGE_SIZE);
 
+/*
+ * notifier interface - registered notifiers gets called on
+ * the following events:
+ * - ap config changed (CHSC_NOTIFY_AP_CFG)
+ */
+enum chsc_notify_type {
+       CHSC_NOTIFY_AP_CFG = 3,
+};
+
+int chsc_notifier_register(struct notifier_block *nb);
+int chsc_notifier_unregister(struct notifier_block *nb);
+
 #endif /* _ASM_S390_CHSC_H */
 
 #include <asm/crw.h>
 #include <asm/isc.h>
 #include <asm/ebcdic.h>
-#include <asm/ap.h>
 
 #include "css.h"
 #include "cio.h"
 #define SEI_VF_FLA     0xc0 /* VF flag for Full Link Address */
 #define SEI_RS_CHPID   0x4  /* 4 in RS field indicates CHPID */
 
+static BLOCKING_NOTIFIER_HEAD(chsc_notifiers);
+
+int chsc_notifier_register(struct notifier_block *nb)
+{
+       return blocking_notifier_chain_register(&chsc_notifiers, nb);
+}
+EXPORT_SYMBOL(chsc_notifier_register);
+
+int chsc_notifier_unregister(struct notifier_block *nb)
+{
+       return blocking_notifier_chain_unregister(&chsc_notifiers, nb);
+}
+EXPORT_SYMBOL(chsc_notifier_unregister);
+
 /**
  * chsc_error_from_response() - convert a chsc response to an error
  * @response: chsc response code
        if (sei_area->rs != 5)
                return;
 
-       ap_bus_cfg_chg();
+       blocking_notifier_call_chain(&chsc_notifiers,
+                                    CHSC_NOTIFY_AP_CFG, NULL);
 }
 
 static void chsc_process_sei_fces_event(struct chsc_sei_nt0_area *sei_area)
 
 #include <linux/ctype.h>
 #include <linux/module.h>
 #include <asm/uv.h>
+#include <asm/chsc.h>
 
 #include "ap_bus.h"
 #include "ap_debug.h"
 /*
  * A config change has happened, force an ap bus rescan.
  */
-void ap_bus_cfg_chg(void)
+static int ap_bus_cfg_chg(struct notifier_block *nb,
+                         unsigned long action, void *data)
 {
+       if (action != CHSC_NOTIFY_AP_CFG)
+               return NOTIFY_DONE;
+
        pr_debug("%s config change, forcing bus rescan\n", __func__);
 
        ap_bus_force_rescan();
+
+       return NOTIFY_OK;
 }
 
+static struct notifier_block ap_bus_nb = {
+       .notifier_call = ap_bus_cfg_chg,
+};
+
 /*
  * hex2bitmap() - parse hex mask string and set bitmap.
  * Valid strings are "0x012345678" with at least one valid hex number.
 
        queue_work(system_long_wq, &ap_scan_bus_work);
 
+       rc = chsc_notifier_register(&ap_bus_nb);
+       if (rc)
+               goto out;
+
        /* Start the low priority AP bus poll thread. */
        if (!ap_thread_flag)
                return 0;
 
        rc = ap_poll_thread_start();
        if (rc)
-               goto out;
+               goto out_notifier;
 
        return 0;
 
+out_notifier:
+       chsc_notifier_unregister(&ap_bus_nb);
 out:
        cancel_work(&ap_scan_bus_work);
        hrtimer_cancel(&ap_poll_timer);