int bnxt_dl_register(struct bnxt *bp)
 {
+       const struct devlink_ops *devlink_ops;
        struct devlink_port_attrs attrs = {};
        struct devlink *dl;
        int rc;
 
        if (BNXT_PF(bp))
-               dl = devlink_alloc(&bnxt_dl_ops, sizeof(struct bnxt_dl));
+               devlink_ops = &bnxt_dl_ops;
        else
-               dl = devlink_alloc(&bnxt_vf_dl_ops, sizeof(struct bnxt_dl));
+               devlink_ops = &bnxt_vf_dl_ops;
+
+       dl = devlink_alloc(devlink_ops, sizeof(struct bnxt_dl), &bp->pdev->dev);
        if (!dl) {
                netdev_warn(bp->dev, "devlink_alloc failed\n");
                return -ENOMEM;
            bp->hwrm_spec_code > 0x10803)
                bp->eswitch_mode = DEVLINK_ESWITCH_MODE_LEGACY;
 
-       rc = devlink_register(dl, &bp->pdev->dev);
+       rc = devlink_register(dl);
        if (rc) {
                netdev_warn(bp->dev, "devlink_register failed. rc=%d\n", rc);
                goto err_dl_free;
 
        }
 
        devlink = devlink_alloc(&liquidio_devlink_ops,
-                               sizeof(struct lio_devlink_priv));
+                               sizeof(struct lio_devlink_priv),
+                               &octeon_dev->pci_dev->dev);
        if (!devlink) {
                dev_err(&octeon_dev->pci_dev->dev, "devlink alloc failed\n");
                goto setup_nic_dev_free;
        lio_devlink = devlink_priv(devlink);
        lio_devlink->oct = octeon_dev;
 
-       if (devlink_register(devlink, &octeon_dev->pci_dev->dev)) {
+       if (devlink_register(devlink)) {
                devlink_free(devlink);
                dev_err(&octeon_dev->pci_dev->dev,
                        "devlink registration failed\n");
 
        struct dpaa2_eth_devlink_priv *dl_priv;
        int err;
 
-       priv->devlink = devlink_alloc(&dpaa2_eth_devlink_ops, sizeof(*dl_priv));
+       priv->devlink =
+               devlink_alloc(&dpaa2_eth_devlink_ops, sizeof(*dl_priv), dev);
        if (!priv->devlink) {
                dev_err(dev, "devlink_alloc failed\n");
                return -ENOMEM;
        dl_priv = devlink_priv(priv->devlink);
        dl_priv->dpaa2_priv = priv;
 
-       err = devlink_register(priv->devlink, dev);
+       err = devlink_register(priv->devlink);
        if (err) {
                dev_err(dev, "devlink_register() = %d\n", err);
                goto devlink_free;
 
        int ret;
 
        devlink = devlink_alloc(&hclge_devlink_ops,
-                               sizeof(struct hclge_devlink_priv));
+                               sizeof(struct hclge_devlink_priv), &pdev->dev);
        if (!devlink)
                return -ENOMEM;
 
        priv = devlink_priv(devlink);
        priv->hdev = hdev;
 
-       ret = devlink_register(devlink, &pdev->dev);
+       ret = devlink_register(devlink);
        if (ret) {
                dev_err(&pdev->dev, "failed to register devlink, ret = %d\n",
                        ret);
 
        struct devlink *devlink;
        int ret;
 
-       devlink = devlink_alloc(&hclgevf_devlink_ops,
-                               sizeof(struct hclgevf_devlink_priv));
+       devlink =
+               devlink_alloc(&hclgevf_devlink_ops,
+                             sizeof(struct hclgevf_devlink_priv), &pdev->dev);
        if (!devlink)
                return -ENOMEM;
 
        priv = devlink_priv(devlink);
        priv->hdev = hdev;
 
-       ret = devlink_register(devlink, &pdev->dev);
+       ret = devlink_register(devlink);
        if (ret) {
                dev_err(&pdev->dev, "failed to register devlink, ret = %d\n",
                        ret);
 
        .flash_update = hinic_devlink_flash_update,
 };
 
-struct devlink *hinic_devlink_alloc(void)
+struct devlink *hinic_devlink_alloc(struct device *dev)
 {
-       return devlink_alloc(&hinic_devlink_ops, sizeof(struct hinic_dev));
+       return devlink_alloc(&hinic_devlink_ops, sizeof(struct hinic_dev), dev);
 }
 
 void hinic_devlink_free(struct devlink *devlink)
        devlink_free(devlink);
 }
 
-int hinic_devlink_register(struct hinic_devlink_priv *priv, struct device *dev)
+int hinic_devlink_register(struct hinic_devlink_priv *priv)
 {
        struct devlink *devlink = priv_to_devlink(priv);
 
-       return devlink_register(devlink, dev);
+       return devlink_register(devlink);
 }
 
 void hinic_devlink_unregister(struct hinic_devlink_priv *priv)
 
        u32 device_id;
 };
 
-struct devlink *hinic_devlink_alloc(void);
+struct devlink *hinic_devlink_alloc(struct device *dev);
 void hinic_devlink_free(struct devlink *devlink);
-int hinic_devlink_register(struct hinic_devlink_priv *priv, struct device *dev);
+int hinic_devlink_register(struct hinic_devlink_priv *priv);
 void hinic_devlink_unregister(struct hinic_devlink_priv *priv);
 
 int hinic_health_reporters_create(struct hinic_devlink_priv *priv);
 
                return err;
        }
 
-       err = hinic_devlink_register(hwdev->devlink_dev, &pdev->dev);
+       err = hinic_devlink_register(hwdev->devlink_dev);
        if (err) {
                dev_err(&hwif->pdev->dev, "Failed to register devlink\n");
                hinic_pf_to_mgmt_free(&pfhwdev->pf_to_mgmt);
 
        struct devlink *devlink;
        int err, num_qps;
 
-       devlink = hinic_devlink_alloc();
+       devlink = hinic_devlink_alloc(&pdev->dev);
        if (!devlink) {
                dev_err(&pdev->dev, "Hinic devlink alloc failed\n");
                return -ENOMEM;
 
 {
        struct devlink *devlink;
 
-       devlink = devlink_alloc(&ice_devlink_ops, sizeof(struct ice_pf));
+       devlink = devlink_alloc(&ice_devlink_ops, sizeof(struct ice_pf), dev);
        if (!devlink)
                return NULL;
 
        struct device *dev = ice_pf_to_dev(pf);
        int err;
 
-       err = devlink_register(devlink, dev);
+       err = devlink_register(devlink);
        if (err) {
                dev_err(dev, "devlink registration failed: %d\n", err);
                return err;
 
        struct devlink *dl;
        int err;
 
-       dl = devlink_alloc(&rvu_devlink_ops, sizeof(struct rvu_devlink));
+       dl = devlink_alloc(&rvu_devlink_ops, sizeof(struct rvu_devlink),
+                          rvu->dev);
        if (!dl) {
                dev_warn(rvu->dev, "devlink_alloc failed\n");
                return -ENOMEM;
        }
 
-       err = devlink_register(dl, rvu->dev);
+       err = devlink_register(dl);
        if (err) {
                dev_err(rvu->dev, "devlink register failed with error %d\n", err);
                devlink_free(dl);
 
        .trap_drop_counter_get = prestera_drop_counter_get,
 };
 
-struct prestera_switch *prestera_devlink_alloc(void)
+struct prestera_switch *prestera_devlink_alloc(struct prestera_device *dev)
 {
        struct devlink *dl;
 
-       dl = devlink_alloc(&prestera_dl_ops, sizeof(struct prestera_switch));
+       dl = devlink_alloc(&prestera_dl_ops, sizeof(struct prestera_switch),
+                          dev->dev);
 
        return devlink_priv(dl);
 }
        struct devlink *dl = priv_to_devlink(sw);
        int err;
 
-       err = devlink_register(dl, sw->dev->dev);
+       err = devlink_register(dl);
        if (err) {
                dev_err(prestera_dev(sw), "devlink_register failed: %d\n", err);
                return err;
 
 
 #include "prestera.h"
 
-struct prestera_switch *prestera_devlink_alloc(void);
+struct prestera_switch *prestera_devlink_alloc(struct prestera_device *dev);
 void prestera_devlink_free(struct prestera_switch *sw);
 
 int prestera_devlink_register(struct prestera_switch *sw);
 
        struct prestera_switch *sw;
        int err;
 
-       sw = prestera_devlink_alloc();
+       sw = prestera_devlink_alloc(dev);
        if (!sw)
                return -ENOMEM;
 
 
 
        printk_once(KERN_INFO "%s", mlx4_version);
 
-       devlink = devlink_alloc(&mlx4_devlink_ops, sizeof(*priv));
+       devlink = devlink_alloc(&mlx4_devlink_ops, sizeof(*priv), &pdev->dev);
        if (!devlink)
                return -ENOMEM;
        priv = devlink_priv(devlink);
        mutex_init(&dev->persist->interface_state_mutex);
        mutex_init(&dev->persist->pci_status_mutex);
 
-       ret = devlink_register(devlink, &pdev->dev);
+       ret = devlink_register(devlink);
        if (ret)
                goto err_persist_free;
        ret = devlink_params_register(devlink, mlx4_devlink_params,
 
        return 0;
 }
 
-struct devlink *mlx5_devlink_alloc(void)
+struct devlink *mlx5_devlink_alloc(struct device *dev)
 {
-       return devlink_alloc(&mlx5_devlink_ops, sizeof(struct mlx5_core_dev));
+       return devlink_alloc(&mlx5_devlink_ops, sizeof(struct mlx5_core_dev),
+                            dev);
 }
 
 void mlx5_devlink_free(struct devlink *devlink)
                                       ARRAY_SIZE(mlx5_trap_groups_arr));
 }
 
-int mlx5_devlink_register(struct devlink *devlink, struct device *dev)
+int mlx5_devlink_register(struct devlink *devlink)
 {
        int err;
 
-       err = devlink_register(devlink, dev);
+       err = devlink_register(devlink);
        if (err)
                return err;
 
 
 int mlx5_devlink_traps_get_action(struct mlx5_core_dev *dev, int trap_id,
                                  enum devlink_trap_action *action);
 
-struct devlink *mlx5_devlink_alloc(void);
+struct devlink *mlx5_devlink_alloc(struct device *dev);
 void mlx5_devlink_free(struct devlink *devlink);
-int mlx5_devlink_register(struct devlink *devlink, struct device *dev);
+int mlx5_devlink_register(struct devlink *devlink);
 void mlx5_devlink_unregister(struct devlink *devlink);
 
 #endif /* __MLX5_DEVLINK_H__ */
 
 
        set_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
 
-       err = mlx5_devlink_register(priv_to_devlink(dev), dev->device);
+       err = mlx5_devlink_register(priv_to_devlink(dev));
        if (err)
                goto err_devlink_reg;
 
        struct devlink *devlink;
        int err;
 
-       devlink = mlx5_devlink_alloc();
+       devlink = mlx5_devlink_alloc(&pdev->dev);
        if (!devlink) {
                dev_err(&pdev->dev, "devlink alloc failed\n");
                return -ENOMEM;
 
        struct devlink *devlink;
        int err;
 
-       devlink = mlx5_devlink_alloc();
+       devlink = mlx5_devlink_alloc(&adev->dev);
        if (!devlink)
                return -ENOMEM;
 
 
 
        if (!reload) {
                alloc_size = sizeof(*mlxsw_core) + mlxsw_driver->priv_size;
-               devlink = devlink_alloc(&mlxsw_devlink_ops, alloc_size);
+               devlink = devlink_alloc(&mlxsw_devlink_ops, alloc_size,
+                                       mlxsw_bus_info->dev);
                if (!devlink) {
                        err = -ENOMEM;
                        goto err_devlink_alloc;
                goto err_emad_init;
 
        if (!reload) {
-               err = devlink_register(devlink, mlxsw_bus_info->dev);
+               err = devlink_register(devlink);
                if (err)
                        goto err_devlink_register;
        }
 
        if (!np && !pdev->dev.platform_data)
                return -ENODEV;
 
-       devlink = devlink_alloc(&ocelot_devlink_ops, sizeof(*ocelot));
+       devlink =
+               devlink_alloc(&ocelot_devlink_ops, sizeof(*ocelot), &pdev->dev);
        if (!devlink)
                return -ENOMEM;
 
        if (err)
                goto out_put_ports;
 
-       err = devlink_register(devlink, ocelot->dev);
+       err = devlink_register(devlink);
        if (err)
                goto out_ocelot_deinit;
 
 
                goto err_pci_disable;
        }
 
-       devlink = devlink_alloc(&nfp_devlink_ops, sizeof(*pf));
+       devlink = devlink_alloc(&nfp_devlink_ops, sizeof(*pf), &pdev->dev);
        if (!devlink) {
                err = -ENOMEM;
                goto err_rel_regions;
 
        if (err)
                goto err_unmap;
 
-       err = devlink_register(devlink, &pf->pdev->dev);
+       err = devlink_register(devlink);
        if (err)
                goto err_app_clean;
 
 
 {
        struct devlink *dl;
 
-       dl = devlink_alloc(&ionic_dl_ops, sizeof(struct ionic));
+       dl = devlink_alloc(&ionic_dl_ops, sizeof(struct ionic), dev);
 
        return devlink_priv(dl);
 }
        struct devlink_port_attrs attrs = {};
        int err;
 
-       err = devlink_register(dl, ionic->dev);
+       err = devlink_register(dl);
        if (err) {
                dev_warn(ionic->dev, "devlink_register failed: %d\n", err);
                return err;
 
        struct devlink *dl;
        int rc;
 
-       dl = devlink_alloc(&qed_dl_ops, sizeof(struct qed_devlink));
+       dl = devlink_alloc(&qed_dl_ops, sizeof(struct qed_devlink),
+                          &cdev->pdev->dev);
        if (!dl)
                return ERR_PTR(-ENOMEM);
 
        qdevlink = devlink_priv(dl);
        qdevlink->cdev = cdev;
 
-       rc = devlink_register(dl, &cdev->pdev->dev);
+       rc = devlink_register(dl);
        if (rc)
                goto err_free;
 
 
        int i;
 
        common->devlink =
-               devlink_alloc(&am65_cpsw_devlink_ops, sizeof(*dl_priv));
+               devlink_alloc(&am65_cpsw_devlink_ops, sizeof(*dl_priv), dev);
        if (!common->devlink)
                return -ENOMEM;
 
        dl_priv = devlink_priv(common->devlink);
        dl_priv->common = common;
 
-       ret = devlink_register(common->devlink, dev);
+       ret = devlink_register(common->devlink);
        if (ret) {
                dev_err(dev, "devlink reg fail ret:%d\n", ret);
                goto dl_free;
 
        struct cpsw_devlink *dl_priv;
        int ret = 0;
 
-       cpsw->devlink = devlink_alloc(&cpsw_devlink_ops, sizeof(*dl_priv));
+       cpsw->devlink = devlink_alloc(&cpsw_devlink_ops, sizeof(*dl_priv), dev);
        if (!cpsw->devlink)
                return -ENOMEM;
 
        dl_priv = devlink_priv(cpsw->devlink);
        dl_priv->cpsw = cpsw;
 
-       ret = devlink_register(cpsw->devlink, dev);
+       ret = devlink_register(cpsw->devlink);
        if (ret) {
                dev_err(dev, "DL reg fail ret:%d\n", ret);
                goto dl_free;
 
        int err;
 
        devlink = devlink_alloc_ns(&nsim_dev_devlink_ops, sizeof(*nsim_dev),
-                                  nsim_bus_dev->initial_net);
+                                nsim_bus_dev->initial_net, &nsim_bus_dev->dev);
        if (!devlink)
                return -ENOMEM;
        nsim_dev = devlink_priv(devlink);
        if (err)
                goto err_devlink_free;
 
-       err = devlink_register(devlink, &nsim_bus_dev->dev);
+       err = devlink_register(devlink);
        if (err)
                goto err_resources_unregister;
 
 
        ptp_ocp_tod_info(bp);
 }
 
-static int
-ptp_ocp_devlink_register(struct devlink *devlink, struct device *dev)
-{
-       int err;
-
-       err = devlink_register(devlink, dev);
-       if (err)
-               return err;
-
-       return 0;
-}
-
-static void
-ptp_ocp_devlink_unregister(struct devlink *devlink)
-{
-       devlink_unregister(devlink);
-}
-
 static struct device *
 ptp_ocp_find_flash(struct ptp_ocp *bp)
 {
        struct ptp_ocp *bp;
        int err;
 
-       devlink = devlink_alloc(&ptp_ocp_devlink_ops, sizeof(*bp));
+       devlink = devlink_alloc(&ptp_ocp_devlink_ops, sizeof(*bp), &pdev->dev);
        if (!devlink) {
                dev_err(&pdev->dev, "devlink_alloc failed\n");
                return -ENOMEM;
        }
 
-       err = ptp_ocp_devlink_register(devlink, &pdev->dev);
+       err = devlink_register(devlink);
        if (err)
                goto out_free;
 
        pci_disable_device(pdev);
        pci_set_drvdata(pdev, NULL);
 out_unregister:
-       ptp_ocp_devlink_unregister(devlink);
+       devlink_unregister(devlink);
 out_free:
        devlink_free(devlink);
 
        pci_disable_device(pdev);
        pci_set_drvdata(pdev, NULL);
 
-       ptp_ocp_devlink_unregister(devlink);
+       devlink_unregister(devlink);
        devlink_free(devlink);
 }
 
 
        static int cards_found;
        int err;
 
-       devlink = devlink_alloc(&qlge_devlink_ops, sizeof(struct qlge_adapter));
+       devlink = devlink_alloc(&qlge_devlink_ops, sizeof(struct qlge_adapter),
+                               &pdev->dev);
        if (!devlink)
                return -ENOMEM;
 
                goto netdev_free;
        }
 
-       err = devlink_register(devlink, &pdev->dev);
+       err = devlink_register(devlink);
        if (err)
                goto netdev_free;
 
 
  * Drivers that operate on real HW must use devlink_alloc() instead.
  */
 struct devlink *devlink_alloc_ns(const struct devlink_ops *ops,
-                                size_t priv_size, struct net *net);
+                                size_t priv_size, struct net *net,
+                                struct device *dev);
 static inline struct devlink *devlink_alloc(const struct devlink_ops *ops,
-                                           size_t priv_size)
+                                           size_t priv_size,
+                                           struct device *dev)
 {
-       return devlink_alloc_ns(ops, priv_size, &init_net);
+       return devlink_alloc_ns(ops, priv_size, &init_net, dev);
 }
-int devlink_register(struct devlink *devlink, struct device *dev);
+int devlink_register(struct devlink *devlink);
 void devlink_unregister(struct devlink *devlink);
 void devlink_reload_enable(struct devlink *devlink);
 void devlink_reload_disable(struct devlink *devlink);
 
  *     @ops: ops
  *     @priv_size: size of user private data
  *     @net: net namespace
+ *     @dev: parent device
  *
  *     Allocate new devlink instance resources, including devlink index
  *     and name.
  */
 struct devlink *devlink_alloc_ns(const struct devlink_ops *ops,
-                                size_t priv_size, struct net *net)
+                                size_t priv_size, struct net *net,
+                                struct device *dev)
 {
        struct devlink *devlink;
 
-       if (WARN_ON(!ops))
-               return NULL;
-
+       WARN_ON(!ops || !dev);
        if (!devlink_reload_actions_valid(ops))
                return NULL;
 
        devlink = kzalloc(sizeof(*devlink) + priv_size, GFP_KERNEL);
        if (!devlink)
                return NULL;
+
+       devlink->dev = dev;
        devlink->ops = ops;
        xa_init_flags(&devlink->snapshot_ids, XA_FLAGS_ALLOC);
        write_pnet(&devlink->_net, net);
  *     devlink_register - Register devlink instance
  *
  *     @devlink: devlink
- *     @dev: parent device
  */
-int devlink_register(struct devlink *devlink, struct device *dev)
+int devlink_register(struct devlink *devlink)
 {
-       WARN_ON(devlink->dev);
-       devlink->dev = dev;
        mutex_lock(&devlink_mutex);
        list_add_tail(&devlink->list, &devlink_list);
        devlink_notify(devlink, DEVLINK_CMD_NEW);
 
        /* Add the switch to devlink before calling setup, so that setup can
         * add dpipe tables
         */
-       ds->devlink = devlink_alloc(&dsa_devlink_ops, sizeof(*dl_priv));
+       ds->devlink =
+               devlink_alloc(&dsa_devlink_ops, sizeof(*dl_priv), ds->dev);
        if (!ds->devlink)
                return -ENOMEM;
        dl_priv = devlink_priv(ds->devlink);
        dl_priv->ds = ds;
 
-       err = devlink_register(ds->devlink, ds->dev);
+       err = devlink_register(ds->devlink);
        if (err)
                goto free_devlink;