static void power_supply_changed_work(struct work_struct *work)
{
- unsigned long flags;
struct power_supply *psy = container_of(work, struct power_supply,
changed_work);
dev_dbg(psy->dev, "%s\n", __func__);
- spin_lock_irqsave(&psy->changed_lock, flags);
- if (psy->changed) {
- psy->changed = false;
- spin_unlock_irqrestore(&psy->changed_lock, flags);
+ class_for_each_device(power_supply_class, NULL, psy,
+ __power_supply_changed_work);
- class_for_each_device(power_supply_class, NULL, psy,
- __power_supply_changed_work);
+ power_supply_update_leds(psy);
- power_supply_update_leds(psy);
-
- kobject_uevent(&psy->dev->kobj, KOBJ_CHANGE);
- spin_lock_irqsave(&psy->changed_lock, flags);
- }
- if (!psy->changed)
- wake_unlock(&psy->work_wake_lock);
- spin_unlock_irqrestore(&psy->changed_lock, flags);
+ kobject_uevent(&psy->dev->kobj, KOBJ_CHANGE);
}
void power_supply_changed(struct power_supply *psy)
{
- unsigned long flags;
-
dev_dbg(psy->dev, "%s\n", __func__);
- spin_lock_irqsave(&psy->changed_lock, flags);
- psy->changed = true;
- wake_lock(&psy->work_wake_lock);
- spin_unlock_irqrestore(&psy->changed_lock, flags);
schedule_work(&psy->changed_work);
}
EXPORT_SYMBOL_GPL(power_supply_changed);
}
INIT_WORK(&psy->changed_work, power_supply_changed_work);
- spin_lock_init(&psy->changed_lock);
- wake_lock_init(&psy->work_wake_lock, WAKE_LOCK_SUSPEND, "power-supply");
rc = power_supply_create_attrs(psy);
if (rc)
create_triggers_failed:
power_supply_remove_attrs(psy);
create_attrs_failed:
- wake_lock_destroy(&psy->work_wake_lock);
device_unregister(psy->dev);
dev_create_failed:
success:
flush_scheduled_work();
power_supply_remove_triggers(psy);
power_supply_remove_attrs(psy);
- wake_lock_destroy(&psy->work_wake_lock);
device_unregister(psy->dev);
}
EXPORT_SYMBOL_GPL(power_supply_unregister);
#define __LINUX_POWER_SUPPLY_H__
#include <linux/device.h>
-#include <linux/wakelock.h>
#include <linux/workqueue.h>
#include <linux/leds.h>
/* private */
struct device *dev;
struct work_struct changed_work;
- spinlock_t changed_lock;
- bool changed;
- struct wake_lock work_wake_lock;
#ifdef CONFIG_LEDS_TRIGGERS
struct led_trigger *charging_full_trig;