diff --git a/drivers/base/power/power.h b/drivers/base/power/power.h index 54292cdd7808..d3935141f037 100644 --- a/drivers/base/power/power.h +++ b/drivers/base/power/power.h @@ -62,6 +62,7 @@ static inline void device_wakeup_detach_irq(struct device *dev) /* * sysfs.c */ +extern bool dpm_sys_has_power_group(struct device *dev); extern int dpm_sysfs_add(struct device *dev); extern void dpm_sysfs_remove(struct device *dev); diff --git a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c index a1474fb67db9..e0bfa7234b34 100644 --- a/drivers/base/power/sysfs.c +++ b/drivers/base/power/sysfs.c @@ -722,6 +722,15 @@ int dpm_sysfs_add(struct device *dev) rc = pm_wakeup_source_sysfs_add(dev); if (rc) goto err_latency; + + if (dev->parent) + if (dev->parent->parent) + pr_info("DC %s: ADD power from %s/%s/%s\n", __func__, dev_name(dev->parent->parent), dev_name(dev->parent), dev_name(dev)); + else + pr_info("DC %s: ADD power from %s/%s\n", __func__, dev_name(dev->parent), dev_name(dev)); + else + pr_info("DC %s: ADD power from %s\n", __func__, dev_name(dev)); + return 0; err_latency: @@ -826,13 +835,36 @@ void rpm_sysfs_remove(struct device *dev) sysfs_unmerge_group(&dev->kobj, &pm_runtime_attr_group); } +bool dpm_sys_has_power_group(struct device *dev) { + struct kernfs_node *parent = dev->kobj.sd; + return kernfs_find_and_get(parent, pm_attr_group.name) != 0; +} + void dpm_sysfs_remove(struct device *dev) { + struct kernfs_node *parent = dev->kobj.sd; + if (device_pm_not_required(dev)) return; + sysfs_unmerge_group(&dev->kobj, &pm_qos_latency_tolerance_attr_group); + dev_pm_qos_constraints_destroy(dev); + rpm_sysfs_remove(dev); + sysfs_unmerge_group(&dev->kobj, &pm_wakeup_attr_group); + + if (kernfs_find_and_get(parent, pm_attr_group.name)) { + if (dev->parent) + if (dev->parent->parent) + pr_info("DC %s: remove power from %s/%s/%s\n", __func__, dev_name(dev->parent->parent), dev_name(dev->parent), dev_name(dev)); + else + pr_info("DC %s: remove power from %s/%s\n", __func__, dev_name(dev->parent), dev_name(dev)); + else + pr_info("DC %s: remove power from %s\n", __func__, dev_name(dev)); + } else + pr_info("DC %s: GOING TO crash :, name: %s/%s/%s\n", __func__, dev_name(dev->parent->parent), dev_name(dev->parent), dev_name(dev)); + sysfs_remove_group(&dev->kobj, &pm_attr_group); } diff --git a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c index f4a727918e35..8fc3c757c740 100644 --- a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c +++ b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c @@ -2131,7 +2131,8 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw) } /* This step MUST happen after the earlier powerup step */ - pvr2_i2c_core_init(hdw); + //pvr2_i2c_core_init(hdw); + return; if (!pvr2_hdw_dev_ok(hdw)) return; /* Reset demod only on Hauppauge 160xxx platform */ diff --git a/fs/sysfs/group.c b/fs/sysfs/group.c index 64e6a6698935..48bce9f1da43 100644 --- a/fs/sysfs/group.c +++ b/fs/sysfs/group.c @@ -8,6 +8,7 @@ * Copyright (c) 2013 The Linux Foundation */ +#include #include #include #include @@ -272,10 +273,14 @@ void sysfs_remove_group(struct kobject *kobj, { struct kernfs_node *parent = kobj->sd; struct kernfs_node *kn; + struct device * dev; if (grp->name) { kn = kernfs_find_and_get(parent, grp->name); if (!kn) { + dev = container_of(kobj, struct device, kobj); + pr_info("DC %s: crashing: %s/%s/%s", __func__, + dev_name(dev->parent->parent), dev_name(dev->parent), dev_name(dev)); WARN(!kn, KERN_WARNING "sysfs group '%s' not found for kobject '%s'\n", grp->name, kobject_name(kobj));