unsigned int n_attr;
        struct hwmon_attr *igb_attr;
 
-       n_attr = adapter->igb_hwmon_buff.n_hwmon;
-       igb_attr = &adapter->igb_hwmon_buff.hwmon_list[n_attr];
+       n_attr = adapter->igb_hwmon_buff->n_hwmon;
+       igb_attr = &adapter->igb_hwmon_buff->hwmon_list[n_attr];
 
        switch (type) {
        case IGB_HWMON_TYPE_LOC:
        igb_attr->dev_attr.attr.mode = S_IRUGO;
        igb_attr->dev_attr.attr.name = igb_attr->name;
        sysfs_attr_init(&igb_attr->dev_attr.attr);
-       rc = device_create_file(&adapter->pdev->dev,
-                               &igb_attr->dev_attr);
-       if (rc == 0)
-               ++adapter->igb_hwmon_buff.n_hwmon;
 
-       return rc;
+       adapter->igb_hwmon_buff->attrs[n_attr] = &igb_attr->dev_attr.attr;
+
+       ++adapter->igb_hwmon_buff->n_hwmon;
+
+       return 0;
 }
 
 static void igb_sysfs_del_adapter(struct igb_adapter *adapter)
 {
-       int i;
-
-       if (adapter == NULL)
-               return;
-
-       for (i = 0; i < adapter->igb_hwmon_buff.n_hwmon; i++) {
-               device_remove_file(&adapter->pdev->dev,
-                          &adapter->igb_hwmon_buff.hwmon_list[i].dev_attr);
-       }
-
-       kfree(adapter->igb_hwmon_buff.hwmon_list);
-
-       if (adapter->igb_hwmon_buff.device)
-               hwmon_device_unregister(adapter->igb_hwmon_buff.device);
 }
 
 /* called from igb_main.c */
 /* called from igb_main.c */
 int igb_sysfs_init(struct igb_adapter *adapter)
 {
-       struct hwmon_buff *igb_hwmon = &adapter->igb_hwmon_buff;
+       struct hwmon_buff *igb_hwmon;
+       struct i2c_client *client;
+       struct device *hwmon_dev;
        unsigned int i;
-       int n_attrs;
        int rc = 0;
-       struct i2c_client *client = NULL;
 
        /* If this method isn't defined we don't support thermals */
        if (adapter->hw.mac.ops.init_thermal_sensor_thresh == NULL)
 
        /* Don't create thermal hwmon interface if no sensors present */
        rc = (adapter->hw.mac.ops.init_thermal_sensor_thresh(&adapter->hw));
-               if (rc)
-                       goto exit;
-
-       /* init i2c_client */
-       client = i2c_new_device(&adapter->i2c_adap, &i350_sensor_info);
-       if (client == NULL) {
-               dev_info(&adapter->pdev->dev,
-                       "Failed to create new i2c device..\n");
+       if (rc)
                goto exit;
-       }
-       adapter->i2c_client = client;
 
-       /* Allocation space for max attributes
-        * max num sensors * values (loc, temp, max, caution)
-        */
-       n_attrs = E1000_MAX_SENSORS * 4;
-       igb_hwmon->hwmon_list = kcalloc(n_attrs, sizeof(struct hwmon_attr),
-                                       GFP_KERNEL);
-       if (!igb_hwmon->hwmon_list) {
+       igb_hwmon = devm_kzalloc(&adapter->pdev->dev, sizeof(*igb_hwmon),
+                                GFP_KERNEL);
+       if (!igb_hwmon) {
                rc = -ENOMEM;
-               goto err;
-       }
-
-       igb_hwmon->device = hwmon_device_register(&adapter->pdev->dev);
-       if (IS_ERR(igb_hwmon->device)) {
-               rc = PTR_ERR(igb_hwmon->device);
-               goto err;
+               goto exit;
        }
+       adapter->igb_hwmon_buff = igb_hwmon;
 
        for (i = 0; i < E1000_MAX_SENSORS; i++) {
 
 
                /* Bail if any hwmon attr struct fails to initialize */
                rc = igb_add_hwmon_attr(adapter, i, IGB_HWMON_TYPE_CAUTION);
-               rc |= igb_add_hwmon_attr(adapter, i, IGB_HWMON_TYPE_LOC);
-               rc |= igb_add_hwmon_attr(adapter, i, IGB_HWMON_TYPE_TEMP);
-               rc |= igb_add_hwmon_attr(adapter, i, IGB_HWMON_TYPE_MAX);
                if (rc)
-                       goto err;
+                       goto exit;
+               rc = igb_add_hwmon_attr(adapter, i, IGB_HWMON_TYPE_LOC);
+               if (rc)
+                       goto exit;
+               rc = igb_add_hwmon_attr(adapter, i, IGB_HWMON_TYPE_TEMP);
+               if (rc)
+                       goto exit;
+               rc = igb_add_hwmon_attr(adapter, i, IGB_HWMON_TYPE_MAX);
+               if (rc)
+                       goto exit;
+       }
+
+       /* init i2c_client */
+       client = i2c_new_device(&adapter->i2c_adap, &i350_sensor_info);
+       if (client == NULL) {
+               dev_info(&adapter->pdev->dev,
+                        "Failed to create new i2c device.\n");
+               rc = -ENODEV;
+               goto exit;
+       }
+       adapter->i2c_client = client;
+
+       igb_hwmon->groups[0] = &igb_hwmon->group;
+       igb_hwmon->group.attrs = igb_hwmon->attrs;
+
+       hwmon_dev = devm_hwmon_device_register_with_groups(&adapter->pdev->dev,
+                                                          client->name,
+                                                          igb_hwmon,
+                                                          igb_hwmon->groups);
+       if (IS_ERR(hwmon_dev)) {
+               rc = PTR_ERR(hwmon_dev);
+               goto err;
        }
 
        goto exit;