Merge remote-tracking branch 'asoc/fix/intel' into asoc-linus
[linux-2.6-block.git] / drivers / power / supply / power_supply_core.c
1 /*
2  *  Universal power supply monitor class
3  *
4  *  Copyright © 2007  Anton Vorontsov <cbou@mail.ru>
5  *  Copyright © 2004  Szabolcs Gyurko
6  *  Copyright © 2003  Ian Molton <spyro@f2s.com>
7  *
8  *  Modified: 2004, Oct     Szabolcs Gyurko
9  *
10  *  You may use this code as per GPL version 2
11  */
12
13 #include <linux/module.h>
14 #include <linux/types.h>
15 #include <linux/init.h>
16 #include <linux/slab.h>
17 #include <linux/device.h>
18 #include <linux/notifier.h>
19 #include <linux/err.h>
20 #include <linux/of.h>
21 #include <linux/power_supply.h>
22 #include <linux/thermal.h>
23 #include "power_supply.h"
24
25 /* exported for the APM Power driver, APM emulation */
26 struct class *power_supply_class;
27 EXPORT_SYMBOL_GPL(power_supply_class);
28
29 ATOMIC_NOTIFIER_HEAD(power_supply_notifier);
30 EXPORT_SYMBOL_GPL(power_supply_notifier);
31
32 static struct device_type power_supply_dev_type;
33
34 #define POWER_SUPPLY_DEFERRED_REGISTER_TIME     msecs_to_jiffies(10)
35
36 static bool __power_supply_is_supplied_by(struct power_supply *supplier,
37                                          struct power_supply *supply)
38 {
39         int i;
40
41         if (!supply->supplied_from && !supplier->supplied_to)
42                 return false;
43
44         /* Support both supplied_to and supplied_from modes */
45         if (supply->supplied_from) {
46                 if (!supplier->desc->name)
47                         return false;
48                 for (i = 0; i < supply->num_supplies; i++)
49                         if (!strcmp(supplier->desc->name, supply->supplied_from[i]))
50                                 return true;
51         } else {
52                 if (!supply->desc->name)
53                         return false;
54                 for (i = 0; i < supplier->num_supplicants; i++)
55                         if (!strcmp(supplier->supplied_to[i], supply->desc->name))
56                                 return true;
57         }
58
59         return false;
60 }
61
62 static int __power_supply_changed_work(struct device *dev, void *data)
63 {
64         struct power_supply *psy = data;
65         struct power_supply *pst = dev_get_drvdata(dev);
66
67         if (__power_supply_is_supplied_by(psy, pst)) {
68                 if (pst->desc->external_power_changed)
69                         pst->desc->external_power_changed(pst);
70         }
71
72         return 0;
73 }
74
75 static void power_supply_changed_work(struct work_struct *work)
76 {
77         unsigned long flags;
78         struct power_supply *psy = container_of(work, struct power_supply,
79                                                 changed_work);
80
81         dev_dbg(&psy->dev, "%s\n", __func__);
82
83         spin_lock_irqsave(&psy->changed_lock, flags);
84         /*
85          * Check 'changed' here to avoid issues due to race between
86          * power_supply_changed() and this routine. In worst case
87          * power_supply_changed() can be called again just before we take above
88          * lock. During the first call of this routine we will mark 'changed' as
89          * false and it will stay false for the next call as well.
90          */
91         if (likely(psy->changed)) {
92                 psy->changed = false;
93                 spin_unlock_irqrestore(&psy->changed_lock, flags);
94                 class_for_each_device(power_supply_class, NULL, psy,
95                                       __power_supply_changed_work);
96                 power_supply_update_leds(psy);
97                 atomic_notifier_call_chain(&power_supply_notifier,
98                                 PSY_EVENT_PROP_CHANGED, psy);
99                 kobject_uevent(&psy->dev.kobj, KOBJ_CHANGE);
100                 spin_lock_irqsave(&psy->changed_lock, flags);
101         }
102
103         /*
104          * Hold the wakeup_source until all events are processed.
105          * power_supply_changed() might have called again and have set 'changed'
106          * to true.
107          */
108         if (likely(!psy->changed))
109                 pm_relax(&psy->dev);
110         spin_unlock_irqrestore(&psy->changed_lock, flags);
111 }
112
113 void power_supply_changed(struct power_supply *psy)
114 {
115         unsigned long flags;
116
117         dev_dbg(&psy->dev, "%s\n", __func__);
118
119         spin_lock_irqsave(&psy->changed_lock, flags);
120         psy->changed = true;
121         pm_stay_awake(&psy->dev);
122         spin_unlock_irqrestore(&psy->changed_lock, flags);
123         schedule_work(&psy->changed_work);
124 }
125 EXPORT_SYMBOL_GPL(power_supply_changed);
126
127 /*
128  * Notify that power supply was registered after parent finished the probing.
129  *
130  * Often power supply is registered from driver's probe function. However
131  * calling power_supply_changed() directly from power_supply_register()
132  * would lead to execution of get_property() function provided by the driver
133  * too early - before the probe ends.
134  *
135  * Avoid that by waiting on parent's mutex.
136  */
137 static void power_supply_deferred_register_work(struct work_struct *work)
138 {
139         struct power_supply *psy = container_of(work, struct power_supply,
140                                                 deferred_register_work.work);
141
142         if (psy->dev.parent)
143                 mutex_lock(&psy->dev.parent->mutex);
144
145         power_supply_changed(psy);
146
147         if (psy->dev.parent)
148                 mutex_unlock(&psy->dev.parent->mutex);
149 }
150
151 #ifdef CONFIG_OF
152 #include <linux/of.h>
153
154 static int __power_supply_populate_supplied_from(struct device *dev,
155                                                  void *data)
156 {
157         struct power_supply *psy = data;
158         struct power_supply *epsy = dev_get_drvdata(dev);
159         struct device_node *np;
160         int i = 0;
161
162         do {
163                 np = of_parse_phandle(psy->of_node, "power-supplies", i++);
164                 if (!np)
165                         break;
166
167                 if (np == epsy->of_node) {
168                         dev_info(&psy->dev, "%s: Found supply : %s\n",
169                                 psy->desc->name, epsy->desc->name);
170                         psy->supplied_from[i-1] = (char *)epsy->desc->name;
171                         psy->num_supplies++;
172                         of_node_put(np);
173                         break;
174                 }
175                 of_node_put(np);
176         } while (np);
177
178         return 0;
179 }
180
181 static int power_supply_populate_supplied_from(struct power_supply *psy)
182 {
183         int error;
184
185         error = class_for_each_device(power_supply_class, NULL, psy,
186                                       __power_supply_populate_supplied_from);
187
188         dev_dbg(&psy->dev, "%s %d\n", __func__, error);
189
190         return error;
191 }
192
193 static int  __power_supply_find_supply_from_node(struct device *dev,
194                                                  void *data)
195 {
196         struct device_node *np = data;
197         struct power_supply *epsy = dev_get_drvdata(dev);
198
199         /* returning non-zero breaks out of class_for_each_device loop */
200         if (epsy->of_node == np)
201                 return 1;
202
203         return 0;
204 }
205
206 static int power_supply_find_supply_from_node(struct device_node *supply_node)
207 {
208         int error;
209
210         /*
211          * class_for_each_device() either returns its own errors or values
212          * returned by __power_supply_find_supply_from_node().
213          *
214          * __power_supply_find_supply_from_node() will return 0 (no match)
215          * or 1 (match).
216          *
217          * We return 0 if class_for_each_device() returned 1, -EPROBE_DEFER if
218          * it returned 0, or error as returned by it.
219          */
220         error = class_for_each_device(power_supply_class, NULL, supply_node,
221                                        __power_supply_find_supply_from_node);
222
223         return error ? (error == 1 ? 0 : error) : -EPROBE_DEFER;
224 }
225
226 static int power_supply_check_supplies(struct power_supply *psy)
227 {
228         struct device_node *np;
229         int cnt = 0;
230
231         /* If there is already a list honor it */
232         if (psy->supplied_from && psy->num_supplies > 0)
233                 return 0;
234
235         /* No device node found, nothing to do */
236         if (!psy->of_node)
237                 return 0;
238
239         do {
240                 int ret;
241
242                 np = of_parse_phandle(psy->of_node, "power-supplies", cnt++);
243                 if (!np)
244                         break;
245
246                 ret = power_supply_find_supply_from_node(np);
247                 of_node_put(np);
248
249                 if (ret) {
250                         dev_dbg(&psy->dev, "Failed to find supply!\n");
251                         return ret;
252                 }
253         } while (np);
254
255         /* Missing valid "power-supplies" entries */
256         if (cnt == 1)
257                 return 0;
258
259         /* All supplies found, allocate char ** array for filling */
260         psy->supplied_from = devm_kzalloc(&psy->dev, sizeof(psy->supplied_from),
261                                           GFP_KERNEL);
262         if (!psy->supplied_from) {
263                 dev_err(&psy->dev, "Couldn't allocate memory for supply list\n");
264                 return -ENOMEM;
265         }
266
267         *psy->supplied_from = devm_kzalloc(&psy->dev,
268                                            sizeof(char *) * (cnt - 1),
269                                            GFP_KERNEL);
270         if (!*psy->supplied_from) {
271                 dev_err(&psy->dev, "Couldn't allocate memory for supply list\n");
272                 return -ENOMEM;
273         }
274
275         return power_supply_populate_supplied_from(psy);
276 }
277 #else
278 static int power_supply_check_supplies(struct power_supply *psy)
279 {
280         int nval, ret;
281
282         if (!psy->dev.parent)
283                 return 0;
284
285         nval = device_property_read_string_array(psy->dev.parent,
286                                                  "supplied-from", NULL, 0);
287         if (nval <= 0)
288                 return 0;
289
290         psy->supplied_from = devm_kmalloc_array(&psy->dev, nval,
291                                                 sizeof(char *), GFP_KERNEL);
292         if (!psy->supplied_from)
293                 return -ENOMEM;
294
295         ret = device_property_read_string_array(psy->dev.parent,
296                 "supplied-from", (const char **)psy->supplied_from, nval);
297         if (ret < 0)
298                 return ret;
299
300         psy->num_supplies = nval;
301
302         return 0;
303 }
304 #endif
305
306 struct psy_am_i_supplied_data {
307         struct power_supply *psy;
308         unsigned int count;
309 };
310
311 static int __power_supply_am_i_supplied(struct device *dev, void *_data)
312 {
313         union power_supply_propval ret = {0,};
314         struct power_supply *epsy = dev_get_drvdata(dev);
315         struct psy_am_i_supplied_data *data = _data;
316
317         data->count++;
318         if (__power_supply_is_supplied_by(epsy, data->psy))
319                 if (!epsy->desc->get_property(epsy, POWER_SUPPLY_PROP_ONLINE,
320                                         &ret))
321                         return ret.intval;
322
323         return 0;
324 }
325
326 int power_supply_am_i_supplied(struct power_supply *psy)
327 {
328         struct psy_am_i_supplied_data data = { psy, 0 };
329         int error;
330
331         error = class_for_each_device(power_supply_class, NULL, &data,
332                                       __power_supply_am_i_supplied);
333
334         dev_dbg(&psy->dev, "%s count %u err %d\n", __func__, data.count, error);
335
336         if (data.count == 0)
337                 return -ENODEV;
338
339         return error;
340 }
341 EXPORT_SYMBOL_GPL(power_supply_am_i_supplied);
342
343 static int __power_supply_is_system_supplied(struct device *dev, void *data)
344 {
345         union power_supply_propval ret = {0,};
346         struct power_supply *psy = dev_get_drvdata(dev);
347         unsigned int *count = data;
348
349         (*count)++;
350         if (psy->desc->type != POWER_SUPPLY_TYPE_BATTERY)
351                 if (!psy->desc->get_property(psy, POWER_SUPPLY_PROP_ONLINE,
352                                         &ret))
353                         return ret.intval;
354
355         return 0;
356 }
357
358 int power_supply_is_system_supplied(void)
359 {
360         int error;
361         unsigned int count = 0;
362
363         error = class_for_each_device(power_supply_class, NULL, &count,
364                                       __power_supply_is_system_supplied);
365
366         /*
367          * If no power class device was found at all, most probably we are
368          * running on a desktop system, so assume we are on mains power.
369          */
370         if (count == 0)
371                 return 1;
372
373         return error;
374 }
375 EXPORT_SYMBOL_GPL(power_supply_is_system_supplied);
376
377 int power_supply_set_battery_charged(struct power_supply *psy)
378 {
379         if (atomic_read(&psy->use_cnt) >= 0 &&
380                         psy->desc->type == POWER_SUPPLY_TYPE_BATTERY &&
381                         psy->desc->set_charged) {
382                 psy->desc->set_charged(psy);
383                 return 0;
384         }
385
386         return -EINVAL;
387 }
388 EXPORT_SYMBOL_GPL(power_supply_set_battery_charged);
389
390 static int power_supply_match_device_by_name(struct device *dev, const void *data)
391 {
392         const char *name = data;
393         struct power_supply *psy = dev_get_drvdata(dev);
394
395         return strcmp(psy->desc->name, name) == 0;
396 }
397
398 /**
399  * power_supply_get_by_name() - Search for a power supply and returns its ref
400  * @name: Power supply name to fetch
401  *
402  * If power supply was found, it increases reference count for the
403  * internal power supply's device. The user should power_supply_put()
404  * after usage.
405  *
406  * Return: On success returns a reference to a power supply with
407  * matching name equals to @name, a NULL otherwise.
408  */
409 struct power_supply *power_supply_get_by_name(const char *name)
410 {
411         struct power_supply *psy = NULL;
412         struct device *dev = class_find_device(power_supply_class, NULL, name,
413                                         power_supply_match_device_by_name);
414
415         if (dev) {
416                 psy = dev_get_drvdata(dev);
417                 atomic_inc(&psy->use_cnt);
418         }
419
420         return psy;
421 }
422 EXPORT_SYMBOL_GPL(power_supply_get_by_name);
423
424 /**
425  * power_supply_put() - Drop reference obtained with power_supply_get_by_name
426  * @psy: Reference to put
427  *
428  * The reference to power supply should be put before unregistering
429  * the power supply.
430  */
431 void power_supply_put(struct power_supply *psy)
432 {
433         might_sleep();
434
435         atomic_dec(&psy->use_cnt);
436         put_device(&psy->dev);
437 }
438 EXPORT_SYMBOL_GPL(power_supply_put);
439
440 #ifdef CONFIG_OF
441 static int power_supply_match_device_node(struct device *dev, const void *data)
442 {
443         return dev->parent && dev->parent->of_node == data;
444 }
445
446 /**
447  * power_supply_get_by_phandle() - Search for a power supply and returns its ref
448  * @np: Pointer to device node holding phandle property
449  * @property: Name of property holding a power supply name
450  *
451  * If power supply was found, it increases reference count for the
452  * internal power supply's device. The user should power_supply_put()
453  * after usage.
454  *
455  * Return: On success returns a reference to a power supply with
456  * matching name equals to value under @property, NULL or ERR_PTR otherwise.
457  */
458 struct power_supply *power_supply_get_by_phandle(struct device_node *np,
459                                                         const char *property)
460 {
461         struct device_node *power_supply_np;
462         struct power_supply *psy = NULL;
463         struct device *dev;
464
465         power_supply_np = of_parse_phandle(np, property, 0);
466         if (!power_supply_np)
467                 return ERR_PTR(-ENODEV);
468
469         dev = class_find_device(power_supply_class, NULL, power_supply_np,
470                                                 power_supply_match_device_node);
471
472         of_node_put(power_supply_np);
473
474         if (dev) {
475                 psy = dev_get_drvdata(dev);
476                 atomic_inc(&psy->use_cnt);
477         }
478
479         return psy;
480 }
481 EXPORT_SYMBOL_GPL(power_supply_get_by_phandle);
482
483 static void devm_power_supply_put(struct device *dev, void *res)
484 {
485         struct power_supply **psy = res;
486
487         power_supply_put(*psy);
488 }
489
490 /**
491  * devm_power_supply_get_by_phandle() - Resource managed version of
492  *  power_supply_get_by_phandle()
493  * @dev: Pointer to device holding phandle property
494  * @property: Name of property holding a power supply phandle
495  *
496  * Return: On success returns a reference to a power supply with
497  * matching name equals to value under @property, NULL or ERR_PTR otherwise.
498  */
499 struct power_supply *devm_power_supply_get_by_phandle(struct device *dev,
500                                                       const char *property)
501 {
502         struct power_supply **ptr, *psy;
503
504         if (!dev->of_node)
505                 return ERR_PTR(-ENODEV);
506
507         ptr = devres_alloc(devm_power_supply_put, sizeof(*ptr), GFP_KERNEL);
508         if (!ptr)
509                 return ERR_PTR(-ENOMEM);
510
511         psy = power_supply_get_by_phandle(dev->of_node, property);
512         if (IS_ERR_OR_NULL(psy)) {
513                 devres_free(ptr);
514         } else {
515                 *ptr = psy;
516                 devres_add(dev, ptr);
517         }
518         return psy;
519 }
520 EXPORT_SYMBOL_GPL(devm_power_supply_get_by_phandle);
521 #endif /* CONFIG_OF */
522
523 int power_supply_get_battery_info(struct power_supply *psy,
524                                   struct power_supply_battery_info *info)
525 {
526         struct device_node *battery_np;
527         const char *value;
528         int err;
529
530         info->energy_full_design_uwh         = -EINVAL;
531         info->charge_full_design_uah         = -EINVAL;
532         info->voltage_min_design_uv          = -EINVAL;
533         info->precharge_current_ua           = -EINVAL;
534         info->charge_term_current_ua         = -EINVAL;
535         info->constant_charge_current_max_ua = -EINVAL;
536         info->constant_charge_voltage_max_uv = -EINVAL;
537
538         if (!psy->of_node) {
539                 dev_warn(&psy->dev, "%s currently only supports devicetree\n",
540                          __func__);
541                 return -ENXIO;
542         }
543
544         battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0);
545         if (!battery_np)
546                 return -ENODEV;
547
548         err = of_property_read_string(battery_np, "compatible", &value);
549         if (err)
550                 return err;
551
552         if (strcmp("simple-battery", value))
553                 return -ENODEV;
554
555         /* The property and field names below must correspond to elements
556          * in enum power_supply_property. For reasoning, see
557          * Documentation/power/power_supply_class.txt.
558          */
559
560         of_property_read_u32(battery_np, "energy-full-design-microwatt-hours",
561                              &info->energy_full_design_uwh);
562         of_property_read_u32(battery_np, "charge-full-design-microamp-hours",
563                              &info->charge_full_design_uah);
564         of_property_read_u32(battery_np, "voltage-min-design-microvolt",
565                              &info->voltage_min_design_uv);
566         of_property_read_u32(battery_np, "precharge-current-microamp",
567                              &info->precharge_current_ua);
568         of_property_read_u32(battery_np, "charge-term-current-microamp",
569                              &info->charge_term_current_ua);
570         of_property_read_u32(battery_np, "constant_charge_current_max_microamp",
571                              &info->constant_charge_current_max_ua);
572         of_property_read_u32(battery_np, "constant_charge_voltage_max_microvolt",
573                              &info->constant_charge_voltage_max_uv);
574
575         return 0;
576 }
577 EXPORT_SYMBOL_GPL(power_supply_get_battery_info);
578
579 int power_supply_get_property(struct power_supply *psy,
580                             enum power_supply_property psp,
581                             union power_supply_propval *val)
582 {
583         if (atomic_read(&psy->use_cnt) <= 0) {
584                 if (!psy->initialized)
585                         return -EAGAIN;
586                 return -ENODEV;
587         }
588
589         return psy->desc->get_property(psy, psp, val);
590 }
591 EXPORT_SYMBOL_GPL(power_supply_get_property);
592
593 int power_supply_set_property(struct power_supply *psy,
594                             enum power_supply_property psp,
595                             const union power_supply_propval *val)
596 {
597         if (atomic_read(&psy->use_cnt) <= 0 || !psy->desc->set_property)
598                 return -ENODEV;
599
600         return psy->desc->set_property(psy, psp, val);
601 }
602 EXPORT_SYMBOL_GPL(power_supply_set_property);
603
604 int power_supply_property_is_writeable(struct power_supply *psy,
605                                         enum power_supply_property psp)
606 {
607         if (atomic_read(&psy->use_cnt) <= 0 ||
608                         !psy->desc->property_is_writeable)
609                 return -ENODEV;
610
611         return psy->desc->property_is_writeable(psy, psp);
612 }
613 EXPORT_SYMBOL_GPL(power_supply_property_is_writeable);
614
615 void power_supply_external_power_changed(struct power_supply *psy)
616 {
617         if (atomic_read(&psy->use_cnt) <= 0 ||
618                         !psy->desc->external_power_changed)
619                 return;
620
621         psy->desc->external_power_changed(psy);
622 }
623 EXPORT_SYMBOL_GPL(power_supply_external_power_changed);
624
625 int power_supply_powers(struct power_supply *psy, struct device *dev)
626 {
627         return sysfs_create_link(&psy->dev.kobj, &dev->kobj, "powers");
628 }
629 EXPORT_SYMBOL_GPL(power_supply_powers);
630
631 static void power_supply_dev_release(struct device *dev)
632 {
633         struct power_supply *psy = container_of(dev, struct power_supply, dev);
634         pr_debug("device: '%s': %s\n", dev_name(dev), __func__);
635         kfree(psy);
636 }
637
638 int power_supply_reg_notifier(struct notifier_block *nb)
639 {
640         return atomic_notifier_chain_register(&power_supply_notifier, nb);
641 }
642 EXPORT_SYMBOL_GPL(power_supply_reg_notifier);
643
644 void power_supply_unreg_notifier(struct notifier_block *nb)
645 {
646         atomic_notifier_chain_unregister(&power_supply_notifier, nb);
647 }
648 EXPORT_SYMBOL_GPL(power_supply_unreg_notifier);
649
650 #ifdef CONFIG_THERMAL
651 static int power_supply_read_temp(struct thermal_zone_device *tzd,
652                 int *temp)
653 {
654         struct power_supply *psy;
655         union power_supply_propval val;
656         int ret;
657
658         WARN_ON(tzd == NULL);
659         psy = tzd->devdata;
660         ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_TEMP, &val);
661         if (ret)
662                 return ret;
663
664         /* Convert tenths of degree Celsius to milli degree Celsius. */
665         *temp = val.intval * 100;
666
667         return ret;
668 }
669
670 static struct thermal_zone_device_ops psy_tzd_ops = {
671         .get_temp = power_supply_read_temp,
672 };
673
674 static int psy_register_thermal(struct power_supply *psy)
675 {
676         int i;
677
678         if (psy->desc->no_thermal)
679                 return 0;
680
681         /* Register battery zone device psy reports temperature */
682         for (i = 0; i < psy->desc->num_properties; i++) {
683                 if (psy->desc->properties[i] == POWER_SUPPLY_PROP_TEMP) {
684                         psy->tzd = thermal_zone_device_register(psy->desc->name,
685                                         0, 0, psy, &psy_tzd_ops, NULL, 0, 0);
686                         return PTR_ERR_OR_ZERO(psy->tzd);
687                 }
688         }
689         return 0;
690 }
691
692 static void psy_unregister_thermal(struct power_supply *psy)
693 {
694         if (IS_ERR_OR_NULL(psy->tzd))
695                 return;
696         thermal_zone_device_unregister(psy->tzd);
697 }
698
699 /* thermal cooling device callbacks */
700 static int ps_get_max_charge_cntl_limit(struct thermal_cooling_device *tcd,
701                                         unsigned long *state)
702 {
703         struct power_supply *psy;
704         union power_supply_propval val;
705         int ret;
706
707         psy = tcd->devdata;
708         ret = power_supply_get_property(psy,
709                         POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX, &val);
710         if (ret)
711                 return ret;
712
713         *state = val.intval;
714
715         return ret;
716 }
717
718 static int ps_get_cur_chrage_cntl_limit(struct thermal_cooling_device *tcd,
719                                         unsigned long *state)
720 {
721         struct power_supply *psy;
722         union power_supply_propval val;
723         int ret;
724
725         psy = tcd->devdata;
726         ret = power_supply_get_property(psy,
727                         POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT, &val);
728         if (ret)
729                 return ret;
730
731         *state = val.intval;
732
733         return ret;
734 }
735
736 static int ps_set_cur_charge_cntl_limit(struct thermal_cooling_device *tcd,
737                                         unsigned long state)
738 {
739         struct power_supply *psy;
740         union power_supply_propval val;
741         int ret;
742
743         psy = tcd->devdata;
744         val.intval = state;
745         ret = psy->desc->set_property(psy,
746                 POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT, &val);
747
748         return ret;
749 }
750
751 static const struct thermal_cooling_device_ops psy_tcd_ops = {
752         .get_max_state = ps_get_max_charge_cntl_limit,
753         .get_cur_state = ps_get_cur_chrage_cntl_limit,
754         .set_cur_state = ps_set_cur_charge_cntl_limit,
755 };
756
757 static int psy_register_cooler(struct power_supply *psy)
758 {
759         int i;
760
761         /* Register for cooling device if psy can control charging */
762         for (i = 0; i < psy->desc->num_properties; i++) {
763                 if (psy->desc->properties[i] ==
764                                 POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT) {
765                         psy->tcd = thermal_cooling_device_register(
766                                                         (char *)psy->desc->name,
767                                                         psy, &psy_tcd_ops);
768                         return PTR_ERR_OR_ZERO(psy->tcd);
769                 }
770         }
771         return 0;
772 }
773
774 static void psy_unregister_cooler(struct power_supply *psy)
775 {
776         if (IS_ERR_OR_NULL(psy->tcd))
777                 return;
778         thermal_cooling_device_unregister(psy->tcd);
779 }
780 #else
781 static int psy_register_thermal(struct power_supply *psy)
782 {
783         return 0;
784 }
785
786 static void psy_unregister_thermal(struct power_supply *psy)
787 {
788 }
789
790 static int psy_register_cooler(struct power_supply *psy)
791 {
792         return 0;
793 }
794
795 static void psy_unregister_cooler(struct power_supply *psy)
796 {
797 }
798 #endif
799
800 static struct power_supply *__must_check
801 __power_supply_register(struct device *parent,
802                                    const struct power_supply_desc *desc,
803                                    const struct power_supply_config *cfg,
804                                    bool ws)
805 {
806         struct device *dev;
807         struct power_supply *psy;
808         int rc;
809
810         if (!parent)
811                 pr_warn("%s: Expected proper parent device for '%s'\n",
812                         __func__, desc->name);
813
814         psy = kzalloc(sizeof(*psy), GFP_KERNEL);
815         if (!psy)
816                 return ERR_PTR(-ENOMEM);
817
818         dev = &psy->dev;
819
820         device_initialize(dev);
821
822         dev->class = power_supply_class;
823         dev->type = &power_supply_dev_type;
824         dev->parent = parent;
825         dev->release = power_supply_dev_release;
826         dev_set_drvdata(dev, psy);
827         psy->desc = desc;
828         if (cfg) {
829                 psy->drv_data = cfg->drv_data;
830                 psy->of_node = cfg->of_node;
831                 psy->supplied_to = cfg->supplied_to;
832                 psy->num_supplicants = cfg->num_supplicants;
833         }
834
835         rc = dev_set_name(dev, "%s", desc->name);
836         if (rc)
837                 goto dev_set_name_failed;
838
839         INIT_WORK(&psy->changed_work, power_supply_changed_work);
840         INIT_DELAYED_WORK(&psy->deferred_register_work,
841                           power_supply_deferred_register_work);
842
843         rc = power_supply_check_supplies(psy);
844         if (rc) {
845                 dev_info(dev, "Not all required supplies found, defer probe\n");
846                 goto check_supplies_failed;
847         }
848
849         spin_lock_init(&psy->changed_lock);
850         rc = device_init_wakeup(dev, ws);
851         if (rc)
852                 goto wakeup_init_failed;
853
854         rc = device_add(dev);
855         if (rc)
856                 goto device_add_failed;
857
858         rc = psy_register_thermal(psy);
859         if (rc)
860                 goto register_thermal_failed;
861
862         rc = psy_register_cooler(psy);
863         if (rc)
864                 goto register_cooler_failed;
865
866         rc = power_supply_create_triggers(psy);
867         if (rc)
868                 goto create_triggers_failed;
869
870         /*
871          * Update use_cnt after any uevents (most notably from device_add()).
872          * We are here still during driver's probe but
873          * the power_supply_uevent() calls back driver's get_property
874          * method so:
875          * 1. Driver did not assigned the returned struct power_supply,
876          * 2. Driver could not finish initialization (anything in its probe
877          *    after calling power_supply_register()).
878          */
879         atomic_inc(&psy->use_cnt);
880         psy->initialized = true;
881
882         queue_delayed_work(system_power_efficient_wq,
883                            &psy->deferred_register_work,
884                            POWER_SUPPLY_DEFERRED_REGISTER_TIME);
885
886         return psy;
887
888 create_triggers_failed:
889         psy_unregister_cooler(psy);
890 register_cooler_failed:
891         psy_unregister_thermal(psy);
892 register_thermal_failed:
893         device_del(dev);
894 device_add_failed:
895 wakeup_init_failed:
896 check_supplies_failed:
897 dev_set_name_failed:
898         put_device(dev);
899         return ERR_PTR(rc);
900 }
901
902 /**
903  * power_supply_register() - Register new power supply
904  * @parent:     Device to be a parent of power supply's device, usually
905  *              the device which probe function calls this
906  * @desc:       Description of power supply, must be valid through whole
907  *              lifetime of this power supply
908  * @cfg:        Run-time specific configuration accessed during registering,
909  *              may be NULL
910  *
911  * Return: A pointer to newly allocated power_supply on success
912  * or ERR_PTR otherwise.
913  * Use power_supply_unregister() on returned power_supply pointer to release
914  * resources.
915  */
916 struct power_supply *__must_check power_supply_register(struct device *parent,
917                 const struct power_supply_desc *desc,
918                 const struct power_supply_config *cfg)
919 {
920         return __power_supply_register(parent, desc, cfg, true);
921 }
922 EXPORT_SYMBOL_GPL(power_supply_register);
923
924 /**
925  * power_supply_register_no_ws() - Register new non-waking-source power supply
926  * @parent:     Device to be a parent of power supply's device, usually
927  *              the device which probe function calls this
928  * @desc:       Description of power supply, must be valid through whole
929  *              lifetime of this power supply
930  * @cfg:        Run-time specific configuration accessed during registering,
931  *              may be NULL
932  *
933  * Return: A pointer to newly allocated power_supply on success
934  * or ERR_PTR otherwise.
935  * Use power_supply_unregister() on returned power_supply pointer to release
936  * resources.
937  */
938 struct power_supply *__must_check
939 power_supply_register_no_ws(struct device *parent,
940                 const struct power_supply_desc *desc,
941                 const struct power_supply_config *cfg)
942 {
943         return __power_supply_register(parent, desc, cfg, false);
944 }
945 EXPORT_SYMBOL_GPL(power_supply_register_no_ws);
946
947 static void devm_power_supply_release(struct device *dev, void *res)
948 {
949         struct power_supply **psy = res;
950
951         power_supply_unregister(*psy);
952 }
953
954 /**
955  * devm_power_supply_register() - Register managed power supply
956  * @parent:     Device to be a parent of power supply's device, usually
957  *              the device which probe function calls this
958  * @desc:       Description of power supply, must be valid through whole
959  *              lifetime of this power supply
960  * @cfg:        Run-time specific configuration accessed during registering,
961  *              may be NULL
962  *
963  * Return: A pointer to newly allocated power_supply on success
964  * or ERR_PTR otherwise.
965  * The returned power_supply pointer will be automatically unregistered
966  * on driver detach.
967  */
968 struct power_supply *__must_check
969 devm_power_supply_register(struct device *parent,
970                 const struct power_supply_desc *desc,
971                 const struct power_supply_config *cfg)
972 {
973         struct power_supply **ptr, *psy;
974
975         ptr = devres_alloc(devm_power_supply_release, sizeof(*ptr), GFP_KERNEL);
976
977         if (!ptr)
978                 return ERR_PTR(-ENOMEM);
979         psy = __power_supply_register(parent, desc, cfg, true);
980         if (IS_ERR(psy)) {
981                 devres_free(ptr);
982         } else {
983                 *ptr = psy;
984                 devres_add(parent, ptr);
985         }
986         return psy;
987 }
988 EXPORT_SYMBOL_GPL(devm_power_supply_register);
989
990 /**
991  * devm_power_supply_register_no_ws() - Register managed non-waking-source power supply
992  * @parent:     Device to be a parent of power supply's device, usually
993  *              the device which probe function calls this
994  * @desc:       Description of power supply, must be valid through whole
995  *              lifetime of this power supply
996  * @cfg:        Run-time specific configuration accessed during registering,
997  *              may be NULL
998  *
999  * Return: A pointer to newly allocated power_supply on success
1000  * or ERR_PTR otherwise.
1001  * The returned power_supply pointer will be automatically unregistered
1002  * on driver detach.
1003  */
1004 struct power_supply *__must_check
1005 devm_power_supply_register_no_ws(struct device *parent,
1006                 const struct power_supply_desc *desc,
1007                 const struct power_supply_config *cfg)
1008 {
1009         struct power_supply **ptr, *psy;
1010
1011         ptr = devres_alloc(devm_power_supply_release, sizeof(*ptr), GFP_KERNEL);
1012
1013         if (!ptr)
1014                 return ERR_PTR(-ENOMEM);
1015         psy = __power_supply_register(parent, desc, cfg, false);
1016         if (IS_ERR(psy)) {
1017                 devres_free(ptr);
1018         } else {
1019                 *ptr = psy;
1020                 devres_add(parent, ptr);
1021         }
1022         return psy;
1023 }
1024 EXPORT_SYMBOL_GPL(devm_power_supply_register_no_ws);
1025
1026 /**
1027  * power_supply_unregister() - Remove this power supply from system
1028  * @psy:        Pointer to power supply to unregister
1029  *
1030  * Remove this power supply from the system. The resources of power supply
1031  * will be freed here or on last power_supply_put() call.
1032  */
1033 void power_supply_unregister(struct power_supply *psy)
1034 {
1035         WARN_ON(atomic_dec_return(&psy->use_cnt));
1036         cancel_work_sync(&psy->changed_work);
1037         cancel_delayed_work_sync(&psy->deferred_register_work);
1038         sysfs_remove_link(&psy->dev.kobj, "powers");
1039         power_supply_remove_triggers(psy);
1040         psy_unregister_cooler(psy);
1041         psy_unregister_thermal(psy);
1042         device_init_wakeup(&psy->dev, false);
1043         device_unregister(&psy->dev);
1044 }
1045 EXPORT_SYMBOL_GPL(power_supply_unregister);
1046
1047 void *power_supply_get_drvdata(struct power_supply *psy)
1048 {
1049         return psy->drv_data;
1050 }
1051 EXPORT_SYMBOL_GPL(power_supply_get_drvdata);
1052
1053 static int __init power_supply_class_init(void)
1054 {
1055         power_supply_class = class_create(THIS_MODULE, "power_supply");
1056
1057         if (IS_ERR(power_supply_class))
1058                 return PTR_ERR(power_supply_class);
1059
1060         power_supply_class->dev_uevent = power_supply_uevent;
1061         power_supply_init_attrs(&power_supply_dev_type);
1062
1063         return 0;
1064 }
1065
1066 static void __exit power_supply_class_exit(void)
1067 {
1068         class_destroy(power_supply_class);
1069 }
1070
1071 subsys_initcall(power_supply_class_init);
1072 module_exit(power_supply_class_exit);
1073
1074 MODULE_DESCRIPTION("Universal power supply monitor class");
1075 MODULE_AUTHOR("Ian Molton <spyro@f2s.com>, "
1076               "Szabolcs Gyurko, "
1077               "Anton Vorontsov <cbou@mail.ru>");
1078 MODULE_LICENSE("GPL");