.brightness_set         = applesmc_brightness_set,
 };
 
-static DEVICE_ATTR(name, 0444, applesmc_name_show, NULL);
-
-static DEVICE_ATTR(position, 0444, applesmc_position_show, NULL);
-static DEVICE_ATTR(calibrate, 0644,
-                       applesmc_calibrate_show, applesmc_calibrate_store);
-
-static struct attribute *accelerometer_attributes[] = {
-       &dev_attr_position.attr,
-       &dev_attr_calibrate.attr,
-       NULL
+static struct applesmc_node_group info_group[] = {
+       { "name", applesmc_name_show },
+       { "key_count", applesmc_key_count_show },
+       { "key_at_index", applesmc_key_at_index_show, applesmc_key_at_index_store },
+       { "key_at_index_name", applesmc_key_at_index_name_show },
+       { "key_at_index_type", applesmc_key_at_index_type_show },
+       { "key_at_index_data_length", applesmc_key_at_index_data_length_show },
+       { "key_at_index_data", applesmc_key_at_index_read_show },
+       { }
 };
 
-static const struct attribute_group accelerometer_attributes_group =
-       { .attrs = accelerometer_attributes };
-
-static DEVICE_ATTR(light, 0444, applesmc_light_show, NULL);
-
-static DEVICE_ATTR(key_count, 0444, applesmc_key_count_show, NULL);
-static DEVICE_ATTR(key_at_index, 0644,
-               applesmc_key_at_index_show, applesmc_key_at_index_store);
-static DEVICE_ATTR(key_at_index_name, 0444,
-                                       applesmc_key_at_index_name_show, NULL);
-static DEVICE_ATTR(key_at_index_type, 0444,
-                                       applesmc_key_at_index_type_show, NULL);
-static DEVICE_ATTR(key_at_index_data_length, 0444,
-                               applesmc_key_at_index_data_length_show, NULL);
-static DEVICE_ATTR(key_at_index_data, 0444,
-                               applesmc_key_at_index_read_show, NULL);
-
-static struct attribute *key_enumeration_attributes[] = {
-       &dev_attr_key_count.attr,
-       &dev_attr_key_at_index.attr,
-       &dev_attr_key_at_index_name.attr,
-       &dev_attr_key_at_index_type.attr,
-       &dev_attr_key_at_index_data_length.attr,
-       &dev_attr_key_at_index_data.attr,
-       NULL
+static struct applesmc_node_group accelerometer_group[] = {
+       { "position", applesmc_position_show },
+       { "calibrate", applesmc_calibrate_show, applesmc_calibrate_store },
+       { }
 };
 
-static const struct attribute_group key_enumeration_group =
-       { .attrs = key_enumeration_attributes };
+static struct applesmc_node_group light_sensor_group[] = {
+       { "light", applesmc_light_show },
+       { }
+};
 
 static struct applesmc_node_group fan_group[] = {
        { "fan%d_label", applesmc_show_fan_position },
        struct input_dev *idev;
        int ret;
 
-       ret = sysfs_create_group(&pdev->dev.kobj,
-                                       &accelerometer_attributes_group);
+       if (!smcreg.has_accelerometer)
+               return 0;
+
+       ret = applesmc_create_nodes(accelerometer_group, 1);
        if (ret)
                goto out;
 
        input_free_polled_device(applesmc_idev);
 
 out_sysfs:
-       sysfs_remove_group(&pdev->dev.kobj, &accelerometer_attributes_group);
+       applesmc_destroy_nodes(accelerometer_group);
 
 out:
        pr_warn("driver init failed (ret=%d)!\n", ret);
 /* Release all ressources used by the accelerometer */
 static void applesmc_release_accelerometer(void)
 {
+       if (!smcreg.has_accelerometer)
+               return;
        input_unregister_polled_device(applesmc_idev);
        input_free_polled_device(applesmc_idev);
-       sysfs_remove_group(&pdev->dev.kobj, &accelerometer_attributes_group);
+       applesmc_destroy_nodes(accelerometer_group);
 }
+
+static int applesmc_create_light_sensor(void)
+{
+       if (!smcreg.num_light_sensors)
+               return 0;
+       return applesmc_create_nodes(light_sensor_group, 1);
+}
+
+static void applesmc_release_light_sensor(void)
+{
+       if (!smcreg.num_light_sensors)
+               return;
+       applesmc_destroy_nodes(light_sensor_group);
+}
+
+static int applesmc_create_key_backlight(void)
+{
+       if (!smcreg.has_key_backlight)
+               return 0;
+       applesmc_led_wq = create_singlethread_workqueue("applesmc-led");
+       if (!applesmc_led_wq)
+               return -ENOMEM;
+       return led_classdev_register(&pdev->dev, &applesmc_backlight);
+}
+
+static void applesmc_release_key_backlight(void)
+{
+       if (!smcreg.has_key_backlight)
+               return;
+       led_classdev_unregister(&applesmc_backlight);
+       destroy_workqueue(applesmc_led_wq);
+}
+
 static int applesmc_dmi_match(const struct dmi_system_id *id)
 {
        return 1;
        if (ret)
                goto out_device;
 
-       ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_name.attr);
+       ret = applesmc_create_nodes(info_group, 1);
        if (ret)
                goto out_smcreg;
 
-       /* Create key enumeration sysfs files */
-       ret = sysfs_create_group(&pdev->dev.kobj, &key_enumeration_group);
-       if (ret)
-               goto out_name;
-
        ret = applesmc_create_nodes(fan_group, smcreg.fan_count);
        if (ret)
                goto out_info;
        if (ret)
                goto out_fans;
 
-       if (smcreg.has_accelerometer) {
-               ret = applesmc_create_accelerometer();
-               if (ret)
-                       goto out_temperature;
-       }
-
-       if (smcreg.num_light_sensors) {
-               /* Add light sensor file */
-               ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_light.attr);
-               if (ret)
-                       goto out_accelerometer;
-       }
+       ret = applesmc_create_accelerometer();
+       if (ret)
+               goto out_temperature;
 
-       if (smcreg.has_key_backlight) {
-               /* Create the workqueue */
-               applesmc_led_wq = create_singlethread_workqueue("applesmc-led");
-               if (!applesmc_led_wq) {
-                       ret = -ENOMEM;
-                       goto out_light_sysfs;
-               }
+       ret = applesmc_create_light_sensor();
+       if (ret)
+               goto out_accelerometer;
 
-               /* register as a led device */
-               ret = led_classdev_register(&pdev->dev, &applesmc_backlight);
-               if (ret < 0)
-                       goto out_light_wq;
-       }
+       ret = applesmc_create_key_backlight();
+       if (ret)
+               goto out_light_sysfs;
 
        hwmon_dev = hwmon_device_register(&pdev->dev);
        if (IS_ERR(hwmon_dev)) {
        return 0;
 
 out_light_ledclass:
-       if (smcreg.has_key_backlight)
-               led_classdev_unregister(&applesmc_backlight);
-out_light_wq:
-       if (smcreg.has_key_backlight)
-               destroy_workqueue(applesmc_led_wq);
+       applesmc_release_key_backlight();
 out_light_sysfs:
-       if (smcreg.num_light_sensors)
-               sysfs_remove_file(&pdev->dev.kobj, &dev_attr_light.attr);
+       applesmc_release_light_sensor();
 out_accelerometer:
-       if (smcreg.has_accelerometer)
-               applesmc_release_accelerometer();
+       applesmc_release_accelerometer();
 out_temperature:
        applesmc_destroy_nodes(temp_group);
 out_fans:
        applesmc_destroy_nodes(fan_group);
 out_info:
-       sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group);
-out_name:
-       sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr);
+       applesmc_destroy_nodes(info_group);
 out_smcreg:
        applesmc_destroy_smcreg();
 out_device:
 static void __exit applesmc_exit(void)
 {
        hwmon_device_unregister(hwmon_dev);
-       if (smcreg.has_key_backlight) {
-               led_classdev_unregister(&applesmc_backlight);
-               destroy_workqueue(applesmc_led_wq);
-       }
-       if (smcreg.num_light_sensors)
-               sysfs_remove_file(&pdev->dev.kobj, &dev_attr_light.attr);
-       if (smcreg.has_accelerometer)
-               applesmc_release_accelerometer();
+       applesmc_release_key_backlight();
+       applesmc_release_light_sensor();
+       applesmc_release_accelerometer();
        applesmc_destroy_nodes(temp_group);
        applesmc_destroy_nodes(fan_group);
-       sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group);
-       sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr);
+       applesmc_destroy_nodes(info_group);
        applesmc_destroy_smcreg();
        platform_device_unregister(pdev);
        platform_driver_unregister(&applesmc_driver);