Commit 2e220e6e authored by Michael Hennerich's avatar Michael Hennerich Committed by Sebastian Reichel

power: supply: ltc3651-charger: Fix device name

There never was a device called LTC3651, it always was just LT3651.
This circumstance makes it pretty difficult to identify what this
driver is meant to control.channges since
Signed-off-by: default avatarMichael Hennerich <michael.hennerich@analog.com>
Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
parent 252fbeb8
ltc3651-charger Analog Devices LT3651 Charger Power Supply bindings: lt3651-charger
Required properties: Required properties:
- compatible: "lltc,ltc3651-charger" - compatible: Should contain one of the following:
* "lltc,ltc3651-charger", (DEPRECATED: Use "lltc,lt3651-charger")
* "lltc,lt3651-charger"
- lltc,acpr-gpios: Connect to ACPR output. See remark below. - lltc,acpr-gpios: Connect to ACPR output. See remark below.
Optional properties: Optional properties:
- lltc,fault-gpios: Connect to FAULT output. See remark below. - lltc,fault-gpios: Connect to FAULT output. See remark below.
- lltc,chrg-gpios: Connect to CHRG output. See remark below. - lltc,chrg-gpios: Connect to CHRG output. See remark below.
The ltc3651 outputs are open-drain type and active low. The driver assumes the The lt3651 outputs are open-drain type and active low. The driver assumes the
GPIO reports "active" when the output is asserted, so if the pins have been GPIO reports "active" when the output is asserted, so if the pins have been
connected directly, the GPIO flags should be set to active low also. connected directly, the GPIO flags should be set to active low also.
...@@ -20,7 +22,7 @@ attributes to detect changes. ...@@ -20,7 +22,7 @@ attributes to detect changes.
Example: Example:
charger: battery-charger { charger: battery-charger {
compatible = "lltc,ltc3651-charger"; compatible = "lltc,lt3651-charger";
lltc,acpr-gpios = <&gpio0 68 GPIO_ACTIVE_LOW>; lltc,acpr-gpios = <&gpio0 68 GPIO_ACTIVE_LOW>;
lltc,fault-gpios = <&gpio0 64 GPIO_ACTIVE_LOW>; lltc,fault-gpios = <&gpio0 64 GPIO_ACTIVE_LOW>;
lltc,chrg-gpios = <&gpio0 63 GPIO_ACTIVE_LOW>; lltc,chrg-gpios = <&gpio0 63 GPIO_ACTIVE_LOW>;
......
...@@ -475,12 +475,12 @@ config CHARGER_MANAGER ...@@ -475,12 +475,12 @@ config CHARGER_MANAGER
runtime and in suspend-to-RAM by waking up the system periodically runtime and in suspend-to-RAM by waking up the system periodically
with help of suspend_again support. with help of suspend_again support.
config CHARGER_LTC3651 config CHARGER_LT3651
tristate "LTC3651 charger" tristate "Analog Devices LT3651 charger"
depends on GPIOLIB depends on GPIOLIB
help help
Say Y to include support for the LTC3651 battery charger which reports Say Y to include support for the Analog Devices (Linear Technology)
its status via GPIO lines. LT3651 battery charger which reports its status via GPIO lines.
config CHARGER_MAX14577 config CHARGER_MAX14577
tristate "Maxim MAX14577/77836 battery charger driver" tristate "Maxim MAX14577/77836 battery charger driver"
......
...@@ -67,7 +67,7 @@ obj-$(CONFIG_CHARGER_LP8727) += lp8727_charger.o ...@@ -67,7 +67,7 @@ obj-$(CONFIG_CHARGER_LP8727) += lp8727_charger.o
obj-$(CONFIG_CHARGER_LP8788) += lp8788-charger.o obj-$(CONFIG_CHARGER_LP8788) += lp8788-charger.o
obj-$(CONFIG_CHARGER_GPIO) += gpio-charger.o obj-$(CONFIG_CHARGER_GPIO) += gpio-charger.o
obj-$(CONFIG_CHARGER_MANAGER) += charger-manager.o obj-$(CONFIG_CHARGER_MANAGER) += charger-manager.o
obj-$(CONFIG_CHARGER_LTC3651) += ltc3651-charger.o obj-$(CONFIG_CHARGER_LT3651) += ltc3651-charger.o
obj-$(CONFIG_CHARGER_MAX14577) += max14577_charger.o obj-$(CONFIG_CHARGER_MAX14577) += max14577_charger.o
obj-$(CONFIG_CHARGER_DETECTOR_MAX14656) += max14656_charger_detector.o obj-$(CONFIG_CHARGER_DETECTOR_MAX14656) += max14656_charger_detector.o
obj-$(CONFIG_CHARGER_MAX77693) += max77693_charger.o obj-$(CONFIG_CHARGER_MAX77693) += max77693_charger.o
......
// SPDX-License-Identifier: GPL-2.0+
/* /*
* Driver for Analog Devices (Linear Technology) LT3651 charger IC.
* Copyright (C) 2017, Topic Embedded Products * Copyright (C) 2017, Topic Embedded Products
* Driver for LTC3651 charger IC.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/ */
#include <linux/device.h> #include <linux/device.h>
...@@ -19,7 +15,7 @@ ...@@ -19,7 +15,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/of.h> #include <linux/of.h>
struct ltc3651_charger { struct lt3651_charger {
struct power_supply *charger; struct power_supply *charger;
struct power_supply_desc charger_desc; struct power_supply_desc charger_desc;
struct gpio_desc *acpr_gpio; struct gpio_desc *acpr_gpio;
...@@ -27,7 +23,7 @@ struct ltc3651_charger { ...@@ -27,7 +23,7 @@ struct ltc3651_charger {
struct gpio_desc *chrg_gpio; struct gpio_desc *chrg_gpio;
}; };
static irqreturn_t ltc3651_charger_irq(int irq, void *devid) static irqreturn_t lt3651_charger_irq(int irq, void *devid)
{ {
struct power_supply *charger = devid; struct power_supply *charger = devid;
...@@ -36,37 +32,37 @@ static irqreturn_t ltc3651_charger_irq(int irq, void *devid) ...@@ -36,37 +32,37 @@ static irqreturn_t ltc3651_charger_irq(int irq, void *devid)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static inline struct ltc3651_charger *psy_to_ltc3651_charger( static inline struct lt3651_charger *psy_to_lt3651_charger(
struct power_supply *psy) struct power_supply *psy)
{ {
return power_supply_get_drvdata(psy); return power_supply_get_drvdata(psy);
} }
static int ltc3651_charger_get_property(struct power_supply *psy, static int lt3651_charger_get_property(struct power_supply *psy,
enum power_supply_property psp, union power_supply_propval *val) enum power_supply_property psp, union power_supply_propval *val)
{ {
struct ltc3651_charger *ltc3651_charger = psy_to_ltc3651_charger(psy); struct lt3651_charger *lt3651_charger = psy_to_lt3651_charger(psy);
switch (psp) { switch (psp) {
case POWER_SUPPLY_PROP_STATUS: case POWER_SUPPLY_PROP_STATUS:
if (!ltc3651_charger->chrg_gpio) { if (!lt3651_charger->chrg_gpio) {
val->intval = POWER_SUPPLY_STATUS_UNKNOWN; val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
break; break;
} }
if (gpiod_get_value(ltc3651_charger->chrg_gpio)) if (gpiod_get_value(lt3651_charger->chrg_gpio))
val->intval = POWER_SUPPLY_STATUS_CHARGING; val->intval = POWER_SUPPLY_STATUS_CHARGING;
else else
val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
break; break;
case POWER_SUPPLY_PROP_ONLINE: case POWER_SUPPLY_PROP_ONLINE:
val->intval = gpiod_get_value(ltc3651_charger->acpr_gpio); val->intval = gpiod_get_value(lt3651_charger->acpr_gpio);
break; break;
case POWER_SUPPLY_PROP_HEALTH: case POWER_SUPPLY_PROP_HEALTH:
if (!ltc3651_charger->fault_gpio) { if (!lt3651_charger->fault_gpio) {
val->intval = POWER_SUPPLY_HEALTH_UNKNOWN; val->intval = POWER_SUPPLY_HEALTH_UNKNOWN;
break; break;
} }
if (!gpiod_get_value(ltc3651_charger->fault_gpio)) { if (!gpiod_get_value(lt3651_charger->fault_gpio)) {
val->intval = POWER_SUPPLY_HEALTH_GOOD; val->intval = POWER_SUPPLY_HEALTH_GOOD;
break; break;
} }
...@@ -74,11 +70,11 @@ static int ltc3651_charger_get_property(struct power_supply *psy, ...@@ -74,11 +70,11 @@ static int ltc3651_charger_get_property(struct power_supply *psy,
* If the fault pin is active, the chrg pin explains the type * If the fault pin is active, the chrg pin explains the type
* of failure. * of failure.
*/ */
if (!ltc3651_charger->chrg_gpio) { if (!lt3651_charger->chrg_gpio) {
val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE; val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
break; break;
} }
val->intval = gpiod_get_value(ltc3651_charger->chrg_gpio) ? val->intval = gpiod_get_value(lt3651_charger->chrg_gpio) ?
POWER_SUPPLY_HEALTH_OVERHEAT : POWER_SUPPLY_HEALTH_OVERHEAT :
POWER_SUPPLY_HEALTH_DEAD; POWER_SUPPLY_HEALTH_DEAD;
break; break;
...@@ -89,59 +85,59 @@ static int ltc3651_charger_get_property(struct power_supply *psy, ...@@ -89,59 +85,59 @@ static int ltc3651_charger_get_property(struct power_supply *psy,
return 0; return 0;
} }
static enum power_supply_property ltc3651_charger_properties[] = { static enum power_supply_property lt3651_charger_properties[] = {
POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_ONLINE, POWER_SUPPLY_PROP_ONLINE,
POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_PROP_HEALTH,
}; };
static int ltc3651_charger_probe(struct platform_device *pdev) static int lt3651_charger_probe(struct platform_device *pdev)
{ {
struct power_supply_config psy_cfg = {}; struct power_supply_config psy_cfg = {};
struct ltc3651_charger *ltc3651_charger; struct lt3651_charger *lt3651_charger;
struct power_supply_desc *charger_desc; struct power_supply_desc *charger_desc;
int ret; int ret;
ltc3651_charger = devm_kzalloc(&pdev->dev, sizeof(*ltc3651_charger), lt3651_charger = devm_kzalloc(&pdev->dev, sizeof(*lt3651_charger),
GFP_KERNEL); GFP_KERNEL);
if (!ltc3651_charger) if (!lt3651_charger)
return -ENOMEM; return -ENOMEM;
ltc3651_charger->acpr_gpio = devm_gpiod_get(&pdev->dev, lt3651_charger->acpr_gpio = devm_gpiod_get(&pdev->dev,
"lltc,acpr", GPIOD_IN); "lltc,acpr", GPIOD_IN);
if (IS_ERR(ltc3651_charger->acpr_gpio)) { if (IS_ERR(lt3651_charger->acpr_gpio)) {
ret = PTR_ERR(ltc3651_charger->acpr_gpio); ret = PTR_ERR(lt3651_charger->acpr_gpio);
dev_err(&pdev->dev, "Failed to acquire acpr GPIO: %d\n", ret); dev_err(&pdev->dev, "Failed to acquire acpr GPIO: %d\n", ret);
return ret; return ret;
} }
ltc3651_charger->fault_gpio = devm_gpiod_get_optional(&pdev->dev, lt3651_charger->fault_gpio = devm_gpiod_get_optional(&pdev->dev,
"lltc,fault", GPIOD_IN); "lltc,fault", GPIOD_IN);
if (IS_ERR(ltc3651_charger->fault_gpio)) { if (IS_ERR(lt3651_charger->fault_gpio)) {
ret = PTR_ERR(ltc3651_charger->fault_gpio); ret = PTR_ERR(lt3651_charger->fault_gpio);
dev_err(&pdev->dev, "Failed to acquire fault GPIO: %d\n", ret); dev_err(&pdev->dev, "Failed to acquire fault GPIO: %d\n", ret);
return ret; return ret;
} }
ltc3651_charger->chrg_gpio = devm_gpiod_get_optional(&pdev->dev, lt3651_charger->chrg_gpio = devm_gpiod_get_optional(&pdev->dev,
"lltc,chrg", GPIOD_IN); "lltc,chrg", GPIOD_IN);
if (IS_ERR(ltc3651_charger->chrg_gpio)) { if (IS_ERR(lt3651_charger->chrg_gpio)) {
ret = PTR_ERR(ltc3651_charger->chrg_gpio); ret = PTR_ERR(lt3651_charger->chrg_gpio);
dev_err(&pdev->dev, "Failed to acquire chrg GPIO: %d\n", ret); dev_err(&pdev->dev, "Failed to acquire chrg GPIO: %d\n", ret);
return ret; return ret;
} }
charger_desc = &ltc3651_charger->charger_desc; charger_desc = &lt3651_charger->charger_desc;
charger_desc->name = pdev->dev.of_node->name; charger_desc->name = pdev->dev.of_node->name;
charger_desc->type = POWER_SUPPLY_TYPE_MAINS; charger_desc->type = POWER_SUPPLY_TYPE_MAINS;
charger_desc->properties = ltc3651_charger_properties; charger_desc->properties = lt3651_charger_properties;
charger_desc->num_properties = ARRAY_SIZE(ltc3651_charger_properties); charger_desc->num_properties = ARRAY_SIZE(lt3651_charger_properties);
charger_desc->get_property = ltc3651_charger_get_property; charger_desc->get_property = lt3651_charger_get_property;
psy_cfg.of_node = pdev->dev.of_node; psy_cfg.of_node = pdev->dev.of_node;
psy_cfg.drv_data = ltc3651_charger; psy_cfg.drv_data = lt3651_charger;
ltc3651_charger->charger = devm_power_supply_register(&pdev->dev, lt3651_charger->charger = devm_power_supply_register(&pdev->dev,
charger_desc, &psy_cfg); charger_desc, &psy_cfg);
if (IS_ERR(ltc3651_charger->charger)) { if (IS_ERR(lt3651_charger->charger)) {
ret = PTR_ERR(ltc3651_charger->charger); ret = PTR_ERR(lt3651_charger->charger);
dev_err(&pdev->dev, "Failed to register power supply: %d\n", dev_err(&pdev->dev, "Failed to register power supply: %d\n",
ret); ret);
return ret; return ret;
...@@ -152,59 +148,60 @@ static int ltc3651_charger_probe(struct platform_device *pdev) ...@@ -152,59 +148,60 @@ static int ltc3651_charger_probe(struct platform_device *pdev)
* support IRQs on these pins, userspace will have to poll the sysfs * support IRQs on these pins, userspace will have to poll the sysfs
* files manually. * files manually.
*/ */
if (ltc3651_charger->acpr_gpio) { if (lt3651_charger->acpr_gpio) {
ret = gpiod_to_irq(ltc3651_charger->acpr_gpio); ret = gpiod_to_irq(lt3651_charger->acpr_gpio);
if (ret >= 0) if (ret >= 0)
ret = devm_request_any_context_irq(&pdev->dev, ret, ret = devm_request_any_context_irq(&pdev->dev, ret,
ltc3651_charger_irq, lt3651_charger_irq,
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
dev_name(&pdev->dev), ltc3651_charger->charger); dev_name(&pdev->dev), lt3651_charger->charger);
if (ret < 0) if (ret < 0)
dev_warn(&pdev->dev, "Failed to request acpr irq\n"); dev_warn(&pdev->dev, "Failed to request acpr irq\n");
} }
if (ltc3651_charger->fault_gpio) { if (lt3651_charger->fault_gpio) {
ret = gpiod_to_irq(ltc3651_charger->fault_gpio); ret = gpiod_to_irq(lt3651_charger->fault_gpio);
if (ret >= 0) if (ret >= 0)
ret = devm_request_any_context_irq(&pdev->dev, ret, ret = devm_request_any_context_irq(&pdev->dev, ret,
ltc3651_charger_irq, lt3651_charger_irq,
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
dev_name(&pdev->dev), ltc3651_charger->charger); dev_name(&pdev->dev), lt3651_charger->charger);
if (ret < 0) if (ret < 0)
dev_warn(&pdev->dev, "Failed to request fault irq\n"); dev_warn(&pdev->dev, "Failed to request fault irq\n");
} }
if (ltc3651_charger->chrg_gpio) { if (lt3651_charger->chrg_gpio) {
ret = gpiod_to_irq(ltc3651_charger->chrg_gpio); ret = gpiod_to_irq(lt3651_charger->chrg_gpio);
if (ret >= 0) if (ret >= 0)
ret = devm_request_any_context_irq(&pdev->dev, ret, ret = devm_request_any_context_irq(&pdev->dev, ret,
ltc3651_charger_irq, lt3651_charger_irq,
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
dev_name(&pdev->dev), ltc3651_charger->charger); dev_name(&pdev->dev), lt3651_charger->charger);
if (ret < 0) if (ret < 0)
dev_warn(&pdev->dev, "Failed to request chrg irq\n"); dev_warn(&pdev->dev, "Failed to request chrg irq\n");
} }
platform_set_drvdata(pdev, ltc3651_charger); platform_set_drvdata(pdev, lt3651_charger);
return 0; return 0;
} }
static const struct of_device_id ltc3651_charger_match[] = { static const struct of_device_id lt3651_charger_match[] = {
{ .compatible = "lltc,ltc3651-charger" }, { .compatible = "lltc,ltc3651-charger" }, /* DEPRECATED */
{ .compatible = "lltc,lt3651-charger" },
{ } { }
}; };
MODULE_DEVICE_TABLE(of, ltc3651_charger_match); MODULE_DEVICE_TABLE(of, lt3651_charger_match);
static struct platform_driver ltc3651_charger_driver = { static struct platform_driver lt3651_charger_driver = {
.probe = ltc3651_charger_probe, .probe = lt3651_charger_probe,
.driver = { .driver = {
.name = "ltc3651-charger", .name = "lt3651-charger",
.of_match_table = ltc3651_charger_match, .of_match_table = lt3651_charger_match,
}, },
}; };
module_platform_driver(ltc3651_charger_driver); module_platform_driver(lt3651_charger_driver);
MODULE_AUTHOR("Mike Looijmans <mike.looijmans@topic.nl>"); MODULE_AUTHOR("Mike Looijmans <mike.looijmans@topic.nl>");
MODULE_DESCRIPTION("Driver for LTC3651 charger"); MODULE_DESCRIPTION("Driver for LT3651 charger");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:ltc3651-charger"); MODULE_ALIAS("platform:lt3651-charger");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment