extern void pm_qos_sysfs_remove_flags(struct device *dev);
 extern int pm_qos_sysfs_add_latency_tolerance(struct device *dev);
 extern void pm_qos_sysfs_remove_latency_tolerance(struct device *dev);
+extern int dpm_sysfs_change_owner(struct device *dev, kuid_t kuid, kgid_t kgid);
 
 #else /* CONFIG_PM */
 
 
 static inline int dpm_sysfs_add(struct device *dev) { return 0; }
 static inline void dpm_sysfs_remove(struct device *dev) {}
+static inline int dpm_sysfs_change_owner(struct device *dev, kuid_t kuid,
+                                        kgid_t kgid) { return 0; }
 
 #endif
 
 
        return enabled ? sprintf(buf, "%lld\n", msec) : sprintf(buf, "\n");
 }
 
+static inline int dpm_sysfs_wakeup_change_owner(struct device *dev, kuid_t kuid,
+                                               kgid_t kgid)
+{
+       if (dev->power.wakeup && dev->power.wakeup->dev)
+               return device_change_owner(dev->power.wakeup->dev, kuid, kgid);
+       return 0;
+}
+
 static DEVICE_ATTR_RO(wakeup_last_time_ms);
 
 #ifdef CONFIG_PM_AUTOSLEEP
 
 static DEVICE_ATTR_RO(wakeup_prevent_sleep_time_ms);
 #endif /* CONFIG_PM_AUTOSLEEP */
-#endif /* CONFIG_PM_SLEEP */
+#else /* CONFIG_PM_SLEEP */
+static inline int dpm_sysfs_wakeup_change_owner(struct device *dev, kuid_t kuid,
+                                               kgid_t kgid)
+{
+       return 0;
+}
+#endif
 
 #ifdef CONFIG_PM_ADVANCED_DEBUG
 static ssize_t runtime_usage_show(struct device *dev,
        return rc;
 }
 
+int dpm_sysfs_change_owner(struct device *dev, kuid_t kuid, kgid_t kgid)
+{
+       int rc;
+
+       if (device_pm_not_required(dev))
+               return 0;
+
+       rc = sysfs_group_change_owner(&dev->kobj, &pm_attr_group, kuid, kgid);
+       if (rc)
+               return rc;
+
+       if (pm_runtime_callbacks_present(dev)) {
+               rc = sysfs_group_change_owner(
+                       &dev->kobj, &pm_runtime_attr_group, kuid, kgid);
+               if (rc)
+                       return rc;
+       }
+
+       if (device_can_wakeup(dev)) {
+               rc = sysfs_group_change_owner(&dev->kobj, &pm_wakeup_attr_group,
+                                             kuid, kgid);
+               if (rc)
+                       return rc;
+
+               rc = dpm_sysfs_wakeup_change_owner(dev, kuid, kgid);
+               if (rc)
+                       return rc;
+       }
+
+       if (dev->power.set_latency_tolerance) {
+               rc = sysfs_group_change_owner(
+                       &dev->kobj, &pm_qos_latency_tolerance_attr_group, kuid,
+                       kgid);
+               if (rc)
+                       return rc;
+       }
+       return 0;
+}
+
 int wakeup_sysfs_add(struct device *dev)
 {
        return sysfs_merge_group(&dev->kobj, &pm_wakeup_attr_group);