Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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