|
@@ -349,10 +349,16 @@ static int power_supply_match_device_by_name(struct device *dev, const void *dat
|
|
|
*/
|
|
|
struct power_supply *power_supply_get_by_name(const char *name)
|
|
|
{
|
|
|
+ struct power_supply *psy = NULL;
|
|
|
struct device *dev = class_find_device(power_supply_class, NULL, name,
|
|
|
power_supply_match_device_by_name);
|
|
|
|
|
|
- return dev ? dev_get_drvdata(dev) : NULL;
|
|
|
+ if (dev) {
|
|
|
+ psy = dev_get_drvdata(dev);
|
|
|
+ atomic_inc(&psy->use_cnt);
|
|
|
+ }
|
|
|
+
|
|
|
+ return psy;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(power_supply_get_by_name);
|
|
|
|
|
@@ -367,6 +373,7 @@ void power_supply_put(struct power_supply *psy)
|
|
|
{
|
|
|
might_sleep();
|
|
|
|
|
|
+ atomic_dec(&psy->use_cnt);
|
|
|
put_device(&psy->dev);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(power_supply_put);
|
|
@@ -393,6 +400,7 @@ struct power_supply *power_supply_get_by_phandle(struct device_node *np,
|
|
|
const char *property)
|
|
|
{
|
|
|
struct device_node *power_supply_np;
|
|
|
+ struct power_supply *psy = NULL;
|
|
|
struct device *dev;
|
|
|
|
|
|
power_supply_np = of_parse_phandle(np, property, 0);
|
|
@@ -404,7 +412,12 @@ struct power_supply *power_supply_get_by_phandle(struct device_node *np,
|
|
|
|
|
|
of_node_put(power_supply_np);
|
|
|
|
|
|
- return dev ? dev_get_drvdata(dev) : NULL;
|
|
|
+ if (dev) {
|
|
|
+ psy = dev_get_drvdata(dev);
|
|
|
+ atomic_inc(&psy->use_cnt);
|
|
|
+ }
|
|
|
+
|
|
|
+ return psy;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(power_supply_get_by_phandle);
|
|
|
#endif /* CONFIG_OF */
|