|
@@ -15,6 +15,7 @@
|
|
|
#include <linux/init.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/device.h>
|
|
|
+#include <linux/notifier.h>
|
|
|
#include <linux/err.h>
|
|
|
#include <linux/power_supply.h>
|
|
|
#include <linux/thermal.h>
|
|
@@ -24,6 +25,9 @@
|
|
|
struct class *power_supply_class;
|
|
|
EXPORT_SYMBOL_GPL(power_supply_class);
|
|
|
|
|
|
+ATOMIC_NOTIFIER_HEAD(power_supply_notifier);
|
|
|
+EXPORT_SYMBOL_GPL(power_supply_notifier);
|
|
|
+
|
|
|
static struct device_type power_supply_dev_type;
|
|
|
|
|
|
static bool __power_supply_is_supplied_by(struct power_supply *supplier,
|
|
@@ -80,6 +84,8 @@ static void power_supply_changed_work(struct work_struct *work)
|
|
|
class_for_each_device(power_supply_class, NULL, psy,
|
|
|
__power_supply_changed_work);
|
|
|
power_supply_update_leds(psy);
|
|
|
+ atomic_notifier_call_chain(&power_supply_notifier,
|
|
|
+ PSY_EVENT_PROP_CHANGED, psy);
|
|
|
kobject_uevent(&psy->dev->kobj, KOBJ_CHANGE);
|
|
|
spin_lock_irqsave(&psy->changed_lock, flags);
|
|
|
}
|
|
@@ -347,6 +353,18 @@ static void power_supply_dev_release(struct device *dev)
|
|
|
kfree(dev);
|
|
|
}
|
|
|
|
|
|
+int power_supply_reg_notifier(struct notifier_block *nb)
|
|
|
+{
|
|
|
+ return atomic_notifier_chain_register(&power_supply_notifier, nb);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(power_supply_reg_notifier);
|
|
|
+
|
|
|
+void power_supply_unreg_notifier(struct notifier_block *nb)
|
|
|
+{
|
|
|
+ atomic_notifier_chain_unregister(&power_supply_notifier, nb);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(power_supply_unreg_notifier);
|
|
|
+
|
|
|
#ifdef CONFIG_THERMAL
|
|
|
static int power_supply_read_temp(struct thermal_zone_device *tzd,
|
|
|
unsigned long *temp)
|