void *mem_region;
        size_t mem_size;
  
+       struct qcom_rproc_glink glink_subdev;
        struct qcom_rproc_subdev smd_subdev;
 +      struct qcom_rproc_ssr ssr_subdev;
  };
  
  static int adsp_load(struct rproc *rproc, const struct firmware *fw)
                goto free_rproc;
        }
  
+       qcom_add_glink_subdev(rproc, &adsp->glink_subdev);
        qcom_add_smd_subdev(rproc, &adsp->smd_subdev);
 +      qcom_add_ssr_subdev(rproc, &adsp->ssr_subdev, desc->ssr_name);
  
        ret = rproc_add(rproc);
        if (ret)
        qcom_smem_state_put(adsp->state);
        rproc_del(adsp->rproc);
  
+       qcom_remove_glink_subdev(adsp->rproc, &adsp->glink_subdev);
        qcom_remove_smd_subdev(adsp->rproc, &adsp->smd_subdev);
 +      qcom_remove_ssr_subdev(adsp->rproc, &adsp->ssr_subdev);
        rproc_free(adsp->rproc);
  
        return 0;
 
  #include <linux/firmware.h>
  #include <linux/kernel.h>
  #include <linux/module.h>
 +#include <linux/notifier.h>
  #include <linux/remoteproc.h>
+ #include <linux/rpmsg/qcom_glink.h>
  #include <linux/rpmsg/qcom_smd.h>
  
  #include "remoteproc_internal.h"
  #include "qcom_common.h"
  
+ #define to_glink_subdev(d) container_of(d, struct qcom_rproc_glink, subdev)
  #define to_smd_subdev(d) container_of(d, struct qcom_rproc_subdev, subdev)
 +#define to_ssr_subdev(d) container_of(d, struct qcom_rproc_ssr, subdev)
 +
 +static BLOCKING_NOTIFIER_HEAD(ssr_notifiers);
  
  /**
   * qcom_mdt_find_rsc_table() - provide dummy resource table for remoteproc