--------------------------------
 
 To add another FPGA manager, write a driver that implements a set of ops.  The
-probe function calls fpga_mgr_register(), such as::
+probe function calls fpga_mgr_register() or fpga_mgr_register_full(), such as::
 
        static const struct fpga_manager_ops socfpga_fpga_ops = {
                .write_init = socfpga_fpga_ops_configure_init,
                 * them in priv
                 */
 
-               mgr = devm_fpga_mgr_create(dev, "Altera SOCFPGA FPGA Manager",
-                                          &socfpga_fpga_ops, priv);
-               if (!mgr)
-                       return -ENOMEM;
+               mgr = fpga_mgr_register(dev, "Altera SOCFPGA FPGA Manager",
+                                       &socfpga_fpga_ops, priv);
+               if (IS_ERR(mgr))
+                       return PTR_ERR(mgr);
 
                platform_set_drvdata(pdev, mgr);
 
-               return fpga_mgr_register(mgr);
+               return 0;
        }
 
        static int socfpga_fpga_remove(struct platform_device *pdev)
                return 0;
        }
 
+Alternatively, the probe function could call one of the resource managed
+register functions, devm_fpga_mgr_register() or devm_fpga_mgr_register_full().
+When these functions are used, the parameter syntax is the same, but the call
+to fpga_mgr_unregister() should be removed. In the above example, the
+socfpga_fpga_remove() function would not be required.
 
 The ops will implement whatever device specific register writes are needed to
 do the programming sequence for this particular FPGA.  These ops return 0 for
 * ``fpga_mgr_states`` -  Values for :c:expr:`fpga_manager->state`.
 * struct fpga_manager -  the FPGA manager struct
 * struct fpga_manager_ops -  Low level FPGA manager driver ops
-* devm_fpga_mgr_create() -  Allocate and init a manager struct
-* fpga_mgr_register() -  Register an FPGA manager
+* struct fpga_manager_info -  Parameter structure for fpga_mgr_register_full()
+* fpga_mgr_register_full() -  Create and register an FPGA manager using the
+  fpga_mgr_info structure to provide the full flexibility of options
+* fpga_mgr_register() -  Create and register an FPGA manager using standard
+  arguments
+* devm_fpga_mgr_register_full() -  Resource managed version of
+  fpga_mgr_register_full()
+* devm_fpga_mgr_register() -  Resource managed version of fpga_mgr_register()
 * fpga_mgr_unregister() -  Unregister an FPGA manager
 
 .. kernel-doc:: include/linux/fpga/fpga-mgr.h
 .. kernel-doc:: include/linux/fpga/fpga-mgr.h
    :functions: fpga_manager_ops
 
+.. kernel-doc:: include/linux/fpga/fpga-mgr.h
+   :functions: fpga_manager_info
+
 .. kernel-doc:: drivers/fpga/fpga-mgr.c
-   :functions: devm_fpga_mgr_create
+   :functions: fpga_mgr_register_full
 
 .. kernel-doc:: drivers/fpga/fpga-mgr.c
    :functions: fpga_mgr_register
 
+.. kernel-doc:: drivers/fpga/fpga-mgr.c
+   :functions: devm_fpga_mgr_register_full
+
+.. kernel-doc:: drivers/fpga/fpga-mgr.c
+   :functions: devm_fpga_mgr_register
+
 .. kernel-doc:: drivers/fpga/fpga-mgr.c
    :functions: fpga_mgr_unregister
 
        snprintf(conf->mgr_name, sizeof(conf->mgr_name), "%s @%s",
                 ALTERA_CVP_MGR_NAME, pci_name(pdev));
 
-       mgr = devm_fpga_mgr_create(&pdev->dev, conf->mgr_name,
-                                  &altera_cvp_ops, conf);
-       if (!mgr) {
-               ret = -ENOMEM;
+       mgr = fpga_mgr_register(&pdev->dev, conf->mgr_name,
+                               &altera_cvp_ops, conf);
+       if (IS_ERR(mgr)) {
+               ret = PTR_ERR(mgr);
                goto err_unmap;
        }
 
        pci_set_drvdata(pdev, mgr);
 
-       ret = fpga_mgr_register(mgr);
-       if (ret)
-               goto err_unmap;
-
        return 0;
 
 err_unmap:
 
                (val & ALT_PR_CSR_STATUS_MSK) >> ALT_PR_CSR_STATUS_SFT,
                (int)(val & ALT_PR_CSR_PR_START));
 
-       mgr = devm_fpga_mgr_create(dev, dev_name(dev), &alt_pr_ops, priv);
-       if (!mgr)
-               return -ENOMEM;
-
-       return devm_fpga_mgr_register(dev, mgr);
+       mgr = devm_fpga_mgr_register(dev, dev_name(dev), &alt_pr_ops, priv);
+       return PTR_ERR_OR_ZERO(mgr);
 }
 EXPORT_SYMBOL_GPL(alt_pr_register);
 
 
        snprintf(conf->mgr_name, sizeof(conf->mgr_name), "%s %s",
                 dev_driver_string(&spi->dev), dev_name(&spi->dev));
 
-       mgr = devm_fpga_mgr_create(&spi->dev, conf->mgr_name,
-                                  &altera_ps_ops, conf);
-       if (!mgr)
-               return -ENOMEM;
-
-       return devm_fpga_mgr_register(&spi->dev, mgr);
+       mgr = devm_fpga_mgr_register(&spi->dev, conf->mgr_name,
+                                    &altera_ps_ops, conf);
+       return PTR_ERR_OR_ZERO(mgr);
 }
 
 static const struct spi_device_id altera_ps_spi_ids[] = {
 
 static int fme_mgr_probe(struct platform_device *pdev)
 {
        struct dfl_fme_mgr_pdata *pdata = dev_get_platdata(&pdev->dev);
-       struct fpga_compat_id *compat_id;
+       struct fpga_manager_info info = { 0 };
        struct device *dev = &pdev->dev;
        struct fme_mgr_priv *priv;
        struct fpga_manager *mgr;
                        return PTR_ERR(priv->ioaddr);
        }
 
-       compat_id = devm_kzalloc(dev, sizeof(*compat_id), GFP_KERNEL);
-       if (!compat_id)
+       info.name = "DFL FME FPGA Manager";
+       info.mops = &fme_mgr_ops;
+       info.priv = priv;
+       info.compat_id = devm_kzalloc(dev, sizeof(*info.compat_id), GFP_KERNEL);
+       if (!info.compat_id)
                return -ENOMEM;
 
-       fme_mgr_get_compat_id(priv->ioaddr, compat_id);
-
-       mgr = devm_fpga_mgr_create(dev, "DFL FME FPGA Manager",
-                                  &fme_mgr_ops, priv);
-       if (!mgr)
-               return -ENOMEM;
-
-       mgr->compat_id = compat_id;
-
-       return devm_fpga_mgr_register(dev, mgr);
+       fme_mgr_get_compat_id(priv->ioaddr, info.compat_id);
+       mgr = devm_fpga_mgr_register_full(dev, &info);
+       return PTR_ERR_OR_ZERO(mgr);
 }
 
 static struct platform_driver fme_mgr_driver = {
 
 EXPORT_SYMBOL_GPL(fpga_mgr_unlock);
 
 /**
- * fpga_mgr_create - create and initialize an FPGA manager struct
+ * fpga_mgr_register_full - create and register an FPGA Manager device
  * @parent:    fpga manager device from pdev
- * @name:      fpga manager name
- * @mops:      pointer to structure of fpga manager ops
- * @priv:      fpga manager private data
+ * @info:      parameters for fpga manager
  *
- * The caller of this function is responsible for freeing the struct with
- * fpga_mgr_free().  Using devm_fpga_mgr_create() instead is recommended.
+ * The caller of this function is responsible for calling fpga_mgr_unregister().
+ * Using devm_fpga_mgr_register_full() instead is recommended.
  *
- * Return: pointer to struct fpga_manager or NULL
+ * Return: pointer to struct fpga_manager pointer or ERR_PTR()
  */
-struct fpga_manager *fpga_mgr_create(struct device *parent, const char *name,
-                                    const struct fpga_manager_ops *mops,
-                                    void *priv)
+struct fpga_manager *
+fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *info)
 {
+       const struct fpga_manager_ops *mops = info->mops;
        struct fpga_manager *mgr;
        int id, ret;
 
        if (!mops) {
                dev_err(parent, "Attempt to register without fpga_manager_ops\n");
-               return NULL;
+               return ERR_PTR(-EINVAL);
        }
 
-       if (!name || !strlen(name)) {
+       if (!info->name || !strlen(info->name)) {
                dev_err(parent, "Attempt to register with no name!\n");
-               return NULL;
+               return ERR_PTR(-EINVAL);
        }
 
        mgr = kzalloc(sizeof(*mgr), GFP_KERNEL);
        if (!mgr)
-               return NULL;
+               return ERR_PTR(-ENOMEM);
 
        id = ida_simple_get(&fpga_mgr_ida, 0, 0, GFP_KERNEL);
-       if (id < 0)
+       if (id < 0) {
+               ret = id;
                goto error_kfree;
+       }
 
        mutex_init(&mgr->ref_mutex);
 
-       mgr->name = name;
-       mgr->mops = mops;
-       mgr->priv = priv;
+       mgr->name = info->name;
+       mgr->mops = info->mops;
+       mgr->priv = info->priv;
+       mgr->compat_id = info->compat_id;
 
-       device_initialize(&mgr->dev);
        mgr->dev.class = fpga_mgr_class;
        mgr->dev.groups = mops->groups;
        mgr->dev.parent = parent;
        if (ret)
                goto error_device;
 
+       /*
+        * Initialize framework state by requesting low level driver read state
+        * from device.  FPGA may be in reset mode or may have been programmed
+        * by bootloader or EEPROM.
+        */
+       mgr->state = fpga_mgr_state(mgr);
+
+       ret = device_register(&mgr->dev);
+       if (ret) {
+               put_device(&mgr->dev);
+               return ERR_PTR(ret);
+       }
+
        return mgr;
 
 error_device:
 error_kfree:
        kfree(mgr);
 
-       return NULL;
+       return ERR_PTR(ret);
 }
-EXPORT_SYMBOL_GPL(fpga_mgr_create);
+EXPORT_SYMBOL_GPL(fpga_mgr_register_full);
 
 /**
- * fpga_mgr_free - free an FPGA manager created with fpga_mgr_create()
- * @mgr:       fpga manager struct
- */
-void fpga_mgr_free(struct fpga_manager *mgr)
-{
-       ida_simple_remove(&fpga_mgr_ida, mgr->dev.id);
-       kfree(mgr);
-}
-EXPORT_SYMBOL_GPL(fpga_mgr_free);
-
-static void devm_fpga_mgr_release(struct device *dev, void *res)
-{
-       struct fpga_mgr_devres *dr = res;
-
-       fpga_mgr_free(dr->mgr);
-}
-
-/**
- * devm_fpga_mgr_create - create and initialize a managed FPGA manager struct
+ * fpga_mgr_register - create and register an FPGA Manager device
  * @parent:    fpga manager device from pdev
  * @name:      fpga manager name
  * @mops:      pointer to structure of fpga manager ops
  * @priv:      fpga manager private data
  *
- * This function is intended for use in an FPGA manager driver's probe function.
- * After the manager driver creates the manager struct with
- * devm_fpga_mgr_create(), it should register it with fpga_mgr_register().  The
- * manager driver's remove function should call fpga_mgr_unregister().  The
- * manager struct allocated with this function will be freed automatically on
- * driver detach.  This includes the case of a probe function returning error
- * before calling fpga_mgr_register(), the struct will still get cleaned up.
+ * The caller of this function is responsible for calling fpga_mgr_unregister().
+ * Using devm_fpga_mgr_register() instead is recommended. This simple
+ * version of the register function should be sufficient for most users. The
+ * fpga_mgr_register_full() function is available for users that need to pass
+ * additional, optional parameters.
  *
- * Return: pointer to struct fpga_manager or NULL
+ * Return: pointer to struct fpga_manager pointer or ERR_PTR()
  */
-struct fpga_manager *devm_fpga_mgr_create(struct device *parent, const char *name,
-                                         const struct fpga_manager_ops *mops,
-                                         void *priv)
+struct fpga_manager *
+fpga_mgr_register(struct device *parent, const char *name,
+                 const struct fpga_manager_ops *mops, void *priv)
 {
-       struct fpga_mgr_devres *dr;
+       struct fpga_manager_info info = { 0 };
 
-       dr = devres_alloc(devm_fpga_mgr_release, sizeof(*dr), GFP_KERNEL);
-       if (!dr)
-               return NULL;
+       info.name = name;
+       info.mops = mops;
+       info.priv = priv;
 
-       dr->mgr = fpga_mgr_create(parent, name, mops, priv);
-       if (!dr->mgr) {
-               devres_free(dr);
-               return NULL;
-       }
-
-       devres_add(parent, dr);
-
-       return dr->mgr;
-}
-EXPORT_SYMBOL_GPL(devm_fpga_mgr_create);
-
-/**
- * fpga_mgr_register - register an FPGA manager
- * @mgr: fpga manager struct
- *
- * Return: 0 on success, negative error code otherwise.
- */
-int fpga_mgr_register(struct fpga_manager *mgr)
-{
-       int ret;
-
-       /*
-        * Initialize framework state by requesting low level driver read state
-        * from device.  FPGA may be in reset mode or may have been programmed
-        * by bootloader or EEPROM.
-        */
-       mgr->state = fpga_mgr_state(mgr);
-
-       ret = device_add(&mgr->dev);
-       if (ret)
-               goto error_device;
-
-       dev_info(&mgr->dev, "%s registered\n", mgr->name);
-
-       return 0;
-
-error_device:
-       ida_simple_remove(&fpga_mgr_ida, mgr->dev.id);
-
-       return ret;
+       return fpga_mgr_register_full(parent, &info);
 }
 EXPORT_SYMBOL_GPL(fpga_mgr_register);
 
 }
 EXPORT_SYMBOL_GPL(fpga_mgr_unregister);
 
-static int fpga_mgr_devres_match(struct device *dev, void *res,
-                                void *match_data)
-{
-       struct fpga_mgr_devres *dr = res;
-
-       return match_data == dr->mgr;
-}
-
 static void devm_fpga_mgr_unregister(struct device *dev, void *res)
 {
        struct fpga_mgr_devres *dr = res;
 }
 
 /**
- * devm_fpga_mgr_register - resource managed variant of fpga_mgr_register()
- * @dev: managing device for this FPGA manager
- * @mgr: fpga manager struct
+ * devm_fpga_mgr_register_full - resource managed variant of fpga_mgr_register()
+ * @parent:    fpga manager device from pdev
+ * @info:      parameters for fpga manager
  *
- * This is the devres variant of fpga_mgr_register() for which the unregister
+ * This is the devres variant of fpga_mgr_register_full() for which the unregister
  * function will be called automatically when the managing device is detached.
  */
-int devm_fpga_mgr_register(struct device *dev, struct fpga_manager *mgr)
+struct fpga_manager *
+devm_fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *info)
 {
        struct fpga_mgr_devres *dr;
-       int ret;
-
-       /*
-        * Make sure that the struct fpga_manager * that is passed in is
-        * managed itself.
-        */
-       if (WARN_ON(!devres_find(dev, devm_fpga_mgr_release,
-                                fpga_mgr_devres_match, mgr)))
-               return -EINVAL;
+       struct fpga_manager *mgr;
 
        dr = devres_alloc(devm_fpga_mgr_unregister, sizeof(*dr), GFP_KERNEL);
        if (!dr)
-               return -ENOMEM;
+               return ERR_PTR(-ENOMEM);
 
-       ret = fpga_mgr_register(mgr);
-       if (ret) {
+       mgr = fpga_mgr_register_full(parent, info);
+       if (IS_ERR(mgr)) {
                devres_free(dr);
-               return ret;
+               return mgr;
        }
 
        dr->mgr = mgr;
-       devres_add(dev, dr);
+       devres_add(parent, dr);
 
-       return 0;
+       return mgr;
+}
+EXPORT_SYMBOL_GPL(devm_fpga_mgr_register_full);
+
+/**
+ * devm_fpga_mgr_register - resource managed variant of fpga_mgr_register()
+ * @parent:    fpga manager device from pdev
+ * @name:      fpga manager name
+ * @mops:      pointer to structure of fpga manager ops
+ * @priv:      fpga manager private data
+ *
+ * This is the devres variant of fpga_mgr_register() for which the
+ * unregister function will be called automatically when the managing
+ * device is detached.
+ */
+struct fpga_manager *
+devm_fpga_mgr_register(struct device *parent, const char *name,
+                      const struct fpga_manager_ops *mops, void *priv)
+{
+       struct fpga_manager_info info = { 0 };
+
+       info.name = name;
+       info.mops = mops;
+       info.priv = priv;
+
+       return devm_fpga_mgr_register_full(parent, &info);
 }
 EXPORT_SYMBOL_GPL(devm_fpga_mgr_register);
 
 static void fpga_mgr_dev_release(struct device *dev)
 {
+       struct fpga_manager *mgr = to_fpga_manager(dev);
+
+       ida_simple_remove(&fpga_mgr_ida, mgr->dev.id);
+       kfree(mgr);
 }
 
 static int __init fpga_mgr_class_init(void)
 
                return ret;
        }
 
-       mgr = devm_fpga_mgr_create(dev, "Lattice iCE40 FPGA Manager",
-                                  &ice40_fpga_ops, priv);
-       if (!mgr)
-               return -ENOMEM;
-
-       return devm_fpga_mgr_register(dev, mgr);
+       mgr = devm_fpga_mgr_register(dev, "Lattice iCE40 FPGA Manager",
+                                    &ice40_fpga_ops, priv);
+       return PTR_ERR_OR_ZERO(mgr);
 }
 
 static const struct of_device_id ice40_fpga_of_match[] = {
 
                return -EINVAL;
        }
 
-       mgr = devm_fpga_mgr_create(dev, "Lattice MachXO2 SPI FPGA Manager",
-                                  &machxo2_ops, spi);
-       if (!mgr)
-               return -ENOMEM;
-
-       return devm_fpga_mgr_register(dev, mgr);
+       mgr = devm_fpga_mgr_register(dev, "Lattice MachXO2 SPI FPGA Manager",
+                                    &machxo2_ops, spi);
+       return PTR_ERR_OR_ZERO(mgr);
 }
 
 #ifdef CONFIG_OF
 
                return -EBUSY;
        }
 
-       mgr = devm_fpga_mgr_create(dev, "SoCFPGA Arria10 FPGA Manager",
-                                  &socfpga_a10_fpga_mgr_ops, priv);
-       if (!mgr)
-               return -ENOMEM;
-
-       platform_set_drvdata(pdev, mgr);
-
-       ret = fpga_mgr_register(mgr);
-       if (ret) {
+       mgr = fpga_mgr_register(dev, "SoCFPGA Arria10 FPGA Manager",
+                               &socfpga_a10_fpga_mgr_ops, priv);
+       if (IS_ERR(mgr)) {
                clk_disable_unprepare(priv->clk);
-               return ret;
+               return PTR_ERR(mgr);
        }
 
+       platform_set_drvdata(pdev, mgr);
+
        return 0;
 }
 
 
        if (ret)
                return ret;
 
-       mgr = devm_fpga_mgr_create(dev, "Altera SOCFPGA FPGA Manager",
-                                  &socfpga_fpga_ops, priv);
-       if (!mgr)
-               return -ENOMEM;
-
-       return devm_fpga_mgr_register(dev, mgr);
+       mgr = devm_fpga_mgr_register(dev, "Altera SOCFPGA FPGA Manager",
+                                    &socfpga_fpga_ops, priv);
+       return PTR_ERR_OR_ZERO(mgr);
 }
 
 #ifdef CONFIG_OF
 
 
        init_completion(&priv->status_return_completion);
 
-       mgr = fpga_mgr_create(dev, "Stratix10 SOC FPGA Manager",
-                             &s10_ops, priv);
-       if (!mgr) {
-               dev_err(dev, "unable to create FPGA manager\n");
-               ret = -ENOMEM;
-               goto probe_err;
-       }
-
-       ret = fpga_mgr_register(mgr);
-       if (ret) {
+       mgr = fpga_mgr_register(dev, "Stratix10 SOC FPGA Manager",
+                               &s10_ops, priv);
+       if (IS_ERR(mgr)) {
                dev_err(dev, "unable to register FPGA manager\n");
-               fpga_mgr_free(mgr);
+               ret = PTR_ERR(mgr);
                goto probe_err;
        }
 
        struct s10_priv *priv = mgr->priv;
 
        fpga_mgr_unregister(mgr);
-       fpga_mgr_free(mgr);
        stratix10_svc_free_channel(priv->chan);
 
        return 0;
 
        if (IS_ERR(priv->io_base))
                return PTR_ERR(priv->io_base);
 
-       mgr = devm_fpga_mgr_create(kdev, "TS-73xx FPGA Manager",
-                                  &ts73xx_fpga_ops, priv);
-       if (!mgr)
-               return -ENOMEM;
-
-       return devm_fpga_mgr_register(kdev, mgr);
+       mgr = devm_fpga_mgr_register(kdev, "TS-73xx FPGA Manager",
+                                    &ts73xx_fpga_ops, priv);
+       return PTR_ERR_OR_ZERO(mgr);
 }
 
 static struct platform_driver ts73xx_fpga_driver = {
 
                return ret;
        }
 
-       mgr = devm_fpga_mgr_create(dev, "Xilinx Versal FPGA Manager",
-                                  &versal_fpga_ops, NULL);
-       if (!mgr)
-               return -ENOMEM;
-
-       return devm_fpga_mgr_register(dev, mgr);
+       mgr = devm_fpga_mgr_register(dev, "Xilinx Versal FPGA Manager",
+                                    &versal_fpga_ops, NULL);
+       return PTR_ERR_OR_ZERO(mgr);
 }
 
 static const struct of_device_id versal_fpga_of_match[] = {
 
                return dev_err_probe(&spi->dev, PTR_ERR(conf->done),
                                     "Failed to get DONE gpio\n");
 
-       mgr = devm_fpga_mgr_create(&spi->dev,
-                                  "Xilinx Slave Serial FPGA Manager",
-                                  &xilinx_spi_ops, conf);
-       if (!mgr)
-               return -ENOMEM;
-
-       return devm_fpga_mgr_register(&spi->dev, mgr);
+       mgr = devm_fpga_mgr_register(&spi->dev,
+                                    "Xilinx Slave Serial FPGA Manager",
+                                    &xilinx_spi_ops, conf);
+       return PTR_ERR_OR_ZERO(mgr);
 }
 
 #ifdef CONFIG_OF
 
 
        clk_disable(priv->clk);
 
-       mgr = devm_fpga_mgr_create(dev, "Xilinx Zynq FPGA Manager",
-                                  &zynq_fpga_ops, priv);
-       if (!mgr)
-               return -ENOMEM;
-
-       platform_set_drvdata(pdev, mgr);
-
-       err = fpga_mgr_register(mgr);
-       if (err) {
+       mgr = fpga_mgr_register(dev, "Xilinx Zynq FPGA Manager",
+                               &zynq_fpga_ops, priv);
+       if (IS_ERR(mgr)) {
                dev_err(dev, "unable to register FPGA manager\n");
                clk_unprepare(priv->clk);
-               return err;
+               return PTR_ERR(mgr);
        }
 
+       platform_set_drvdata(pdev, mgr);
+
        return 0;
 }
 
 
 
        priv->dev = dev;
 
-       mgr = devm_fpga_mgr_create(dev, "Xilinx ZynqMP FPGA Manager",
-                                  &zynqmp_fpga_ops, priv);
-       if (!mgr)
-               return -ENOMEM;
-
-       return devm_fpga_mgr_register(dev, mgr);
+       mgr = devm_fpga_mgr_register(dev, "Xilinx ZynqMP FPGA Manager",
+                                    &zynqmp_fpga_ops, priv);
+       return PTR_ERR_OR_ZERO(mgr);
 }
 
 #ifdef CONFIG_OF
 
 #endif
 };
 
+/**
+ * struct fpga_compat_id - id for compatibility check
+ *
+ * @id_h: high 64bit of the compat_id
+ * @id_l: low 64bit of the compat_id
+ */
+struct fpga_compat_id {
+       u64 id_h;
+       u64 id_l;
+};
+
+/**
+ * struct fpga_manager_info - collection of parameters for an FPGA Manager
+ * @name: fpga manager name
+ * @compat_id: FPGA manager id for compatibility check.
+ * @mops: pointer to structure of fpga manager ops
+ * @priv: fpga manager private data
+ *
+ * fpga_manager_info contains parameters for the register_full function.
+ * These are separated into an info structure because they some are optional
+ * others could be added to in the future. The info structure facilitates
+ * maintaining a stable API.
+ */
+struct fpga_manager_info {
+       const char *name;
+       struct fpga_compat_id *compat_id;
+       const struct fpga_manager_ops *mops;
+       void *priv;
+};
+
 /**
  * struct fpga_manager_ops - ops for low level fpga manager drivers
  * @initial_header_size: Maximum number of bytes that should be passed into write_init
 #define FPGA_MGR_STATUS_IP_PROTOCOL_ERR                BIT(3)
 #define FPGA_MGR_STATUS_FIFO_OVERFLOW_ERR      BIT(4)
 
-/**
- * struct fpga_compat_id - id for compatibility check
- *
- * @id_h: high 64bit of the compat_id
- * @id_l: low 64bit of the compat_id
- */
-struct fpga_compat_id {
-       u64 id_h;
-       u64 id_l;
-};
-
 /**
  * struct fpga_manager - fpga manager structure
  * @name: name of low level fpga manager
 
 void fpga_mgr_put(struct fpga_manager *mgr);
 
-struct fpga_manager *fpga_mgr_create(struct device *dev, const char *name,
-                                    const struct fpga_manager_ops *mops,
-                                    void *priv);
-void fpga_mgr_free(struct fpga_manager *mgr);
-int fpga_mgr_register(struct fpga_manager *mgr);
-void fpga_mgr_unregister(struct fpga_manager *mgr);
+struct fpga_manager *
+fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *info);
 
-int devm_fpga_mgr_register(struct device *dev, struct fpga_manager *mgr);
+struct fpga_manager *
+fpga_mgr_register(struct device *parent, const char *name,
+                 const struct fpga_manager_ops *mops, void *priv);
+void fpga_mgr_unregister(struct fpga_manager *mgr);
 
-struct fpga_manager *devm_fpga_mgr_create(struct device *dev, const char *name,
-                                         const struct fpga_manager_ops *mops,
-                                         void *priv);
+struct fpga_manager *
+devm_fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *info);
+struct fpga_manager *
+devm_fpga_mgr_register(struct device *parent, const char *name,
+                      const struct fpga_manager_ops *mops, void *priv);
 
 #endif /*_LINUX_FPGA_MGR_H */