| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * TI LP8788 MFD - battery charger driver |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright 2012 Texas Instruments |
|---|
| 5 | 6 | * |
|---|
| 6 | 7 | * Author: Milo(Woogyom) Kim <milo.kim@ti.com> |
|---|
| 7 | | - * |
|---|
| 8 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 9 | | - * it under the terms of the GNU General Public License version 2 as |
|---|
| 10 | | - * published by the Free Software Foundation. |
|---|
| 11 | | - * |
|---|
| 12 | 8 | */ |
|---|
| 13 | 9 | |
|---|
| 14 | 10 | #include <linux/err.h> |
|---|
| .. | .. |
|---|
| 410 | 406 | .get_property = lp8788_battery_get_property, |
|---|
| 411 | 407 | }; |
|---|
| 412 | 408 | |
|---|
| 413 | | -static int lp8788_psy_register(struct platform_device *pdev, |
|---|
| 414 | | - struct lp8788_charger *pchg) |
|---|
| 415 | | -{ |
|---|
| 416 | | - struct power_supply_config charger_cfg = {}; |
|---|
| 417 | | - |
|---|
| 418 | | - charger_cfg.supplied_to = battery_supplied_to; |
|---|
| 419 | | - charger_cfg.num_supplicants = ARRAY_SIZE(battery_supplied_to); |
|---|
| 420 | | - |
|---|
| 421 | | - pchg->charger = power_supply_register(&pdev->dev, |
|---|
| 422 | | - &lp8788_psy_charger_desc, |
|---|
| 423 | | - &charger_cfg); |
|---|
| 424 | | - if (IS_ERR(pchg->charger)) |
|---|
| 425 | | - return -EPERM; |
|---|
| 426 | | - |
|---|
| 427 | | - pchg->battery = power_supply_register(&pdev->dev, |
|---|
| 428 | | - &lp8788_psy_battery_desc, NULL); |
|---|
| 429 | | - if (IS_ERR(pchg->battery)) { |
|---|
| 430 | | - power_supply_unregister(pchg->charger); |
|---|
| 431 | | - return -EPERM; |
|---|
| 432 | | - } |
|---|
| 433 | | - |
|---|
| 434 | | - return 0; |
|---|
| 435 | | -} |
|---|
| 436 | | - |
|---|
| 437 | 409 | static void lp8788_psy_unregister(struct lp8788_charger *pchg) |
|---|
| 438 | 410 | { |
|---|
| 439 | 411 | power_supply_unregister(pchg->battery); |
|---|
| .. | .. |
|---|
| 677 | 649 | static DEVICE_ATTR(eoc_time, S_IRUSR, lp8788_show_eoc_time, NULL); |
|---|
| 678 | 650 | static DEVICE_ATTR(eoc_level, S_IRUSR, lp8788_show_eoc_level, NULL); |
|---|
| 679 | 651 | |
|---|
| 680 | | -static struct attribute *lp8788_charger_attr[] = { |
|---|
| 652 | +static struct attribute *lp8788_charger_sysfs_attrs[] = { |
|---|
| 681 | 653 | &dev_attr_charger_status.attr, |
|---|
| 682 | 654 | &dev_attr_eoc_time.attr, |
|---|
| 683 | 655 | &dev_attr_eoc_level.attr, |
|---|
| 684 | 656 | NULL, |
|---|
| 685 | 657 | }; |
|---|
| 686 | 658 | |
|---|
| 687 | | -static const struct attribute_group lp8788_attr_group = { |
|---|
| 688 | | - .attrs = lp8788_charger_attr, |
|---|
| 689 | | -}; |
|---|
| 659 | +ATTRIBUTE_GROUPS(lp8788_charger_sysfs); |
|---|
| 660 | + |
|---|
| 661 | +static int lp8788_psy_register(struct platform_device *pdev, |
|---|
| 662 | + struct lp8788_charger *pchg) |
|---|
| 663 | +{ |
|---|
| 664 | + struct power_supply_config charger_cfg = {}; |
|---|
| 665 | + |
|---|
| 666 | + charger_cfg.attr_grp = lp8788_charger_sysfs_groups; |
|---|
| 667 | + charger_cfg.supplied_to = battery_supplied_to; |
|---|
| 668 | + charger_cfg.num_supplicants = ARRAY_SIZE(battery_supplied_to); |
|---|
| 669 | + |
|---|
| 670 | + pchg->charger = power_supply_register(&pdev->dev, |
|---|
| 671 | + &lp8788_psy_charger_desc, |
|---|
| 672 | + &charger_cfg); |
|---|
| 673 | + if (IS_ERR(pchg->charger)) |
|---|
| 674 | + return -EPERM; |
|---|
| 675 | + |
|---|
| 676 | + pchg->battery = power_supply_register(&pdev->dev, |
|---|
| 677 | + &lp8788_psy_battery_desc, NULL); |
|---|
| 678 | + if (IS_ERR(pchg->battery)) { |
|---|
| 679 | + power_supply_unregister(pchg->charger); |
|---|
| 680 | + return -EPERM; |
|---|
| 681 | + } |
|---|
| 682 | + |
|---|
| 683 | + return 0; |
|---|
| 684 | +} |
|---|
| 690 | 685 | |
|---|
| 691 | 686 | static int lp8788_charger_probe(struct platform_device *pdev) |
|---|
| 692 | 687 | { |
|---|
| .. | .. |
|---|
| 713 | 708 | if (ret) |
|---|
| 714 | 709 | return ret; |
|---|
| 715 | 710 | |
|---|
| 716 | | - ret = sysfs_create_group(&pdev->dev.kobj, &lp8788_attr_group); |
|---|
| 717 | | - if (ret) { |
|---|
| 718 | | - lp8788_psy_unregister(pchg); |
|---|
| 719 | | - return ret; |
|---|
| 720 | | - } |
|---|
| 721 | | - |
|---|
| 722 | 711 | ret = lp8788_irq_register(pdev, pchg); |
|---|
| 723 | 712 | if (ret) |
|---|
| 724 | 713 | dev_warn(dev, "failed to register charger irq: %d\n", ret); |
|---|
| .. | .. |
|---|
| 732 | 721 | |
|---|
| 733 | 722 | flush_work(&pchg->charger_work); |
|---|
| 734 | 723 | lp8788_irq_unregister(pdev, pchg); |
|---|
| 735 | | - sysfs_remove_group(&pdev->dev.kobj, &lp8788_attr_group); |
|---|
| 736 | 724 | lp8788_psy_unregister(pchg); |
|---|
| 737 | 725 | |
|---|
| 738 | 726 | return 0; |
|---|