Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1463575 > unrolled thread
| Started by | Wenyou Yang <wenyou.yang@atmel.com> |
|---|---|
| First post | 2016-08-16 11:20 +0200 |
| Last post | 2016-08-17 14:00 +0200 |
| Articles | 9 — 2 participants |
Back to article view | Back to linux.kernel
[PATCH v5 0/7] power: act8945a_charger: Improvements Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-16 11:20 +0200
[PATCH v5 5/7] power: act8945a_charger: Add capacity level property Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-16 11:20 +0200
Re: [PATCH v5 5/7] power: act8945a_charger: Add capacity level property Sebastian Reichel <sre@kernel.org> - 2016-08-17 13:50 +0200
[PATCH v5 3/7] power: act8945a_charger: Add status change update support Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-16 11:20 +0200
Re: [PATCH v5 3/7] power: act8945a_charger: Add status change update support Sebastian Reichel <sre@kernel.org> - 2016-08-17 13:50 +0200
[PATCH v5 4/7] power: act8945a_charger: Fix the power supply type Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-16 11:20 +0200
[PATCH v5 7/7] doc: bindings: act8945a-charger: Update properties Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-16 11:30 +0200
[PATCH v5 6/7] power: act8945a_charger: Add max current property Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-16 11:30 +0200
Re: [PATCH v5 6/7] power: act8945a_charger: Add max current property Sebastian Reichel <sre@kernel.org> - 2016-08-17 14:00 +0200
| From | Wenyou Yang <wenyou.yang@atmel.com> |
|---|---|
| Date | 2016-08-16 11:20 +0200 |
| Subject | [PATCH v5 0/7] power: act8945a_charger: Improvements |
| Message-ID | <s6IHo-1dz-9@gated-at.bofh.it> |
This patch series is to improve the implementation of act8945a-charger driver, such as improve the way to check the status, fix the power supply type property, add the status change update, and add more properties: capacity level property and max current property. Changes in v5: - Add Acked-by tag. Changes in v4: - Use "interrupts" property, instead of "active-semi,lbo-gpios" for irq. - Change devname of devm_request_irq() from "lbo-detect" to "act8945a, lbo-detect". - Fix wrong gpio assignment for chglev_pin. - Update the doc/binding for using "interrupts" property. Changes in v3: - Remove unneeded semicolon to fix semicolon.cocci warning. Changes in v2: - Add missing ret declaration. Wenyou Yang (7): power: act8945a_charger: Remove "battery_temperature" power: act8945a_charger: Improve power: act8945a_charger: Add status change update support power: act8945a_charger: Fix the power supply type power: act8945a_charger: Add capacity level property power: act8945a_charger: Add max current property doc: bindings: act8945a-charger: Update properties .../bindings/power/supply/act8945a-charger.txt | 16 +- drivers/power/supply/act8945a_charger.c | 373 ++++++++++++++++++--- 2 files changed, 348 insertions(+), 41 deletions(-) -- 2.7.4
[toc] | [next] | [standalone]
| From | Wenyou Yang <wenyou.yang@atmel.com> |
|---|---|
| Date | 2016-08-16 11:20 +0200 |
| Subject | [PATCH v5 5/7] power: act8945a_charger: Add capacity level property |
| Message-ID | <s6IHo-1dz-15@gated-at.bofh.it> |
| In reply to | #1463575 |
Add the power supply capacity level property, it corresponds to
POWER_SUPPLY_CAPACITY_LEVEL_*.
It also utilizes the precision voltage detector function module
to catch the low battery voltage.
Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
---
Changes in v5: None
Changes in v4:
- Change devname of devm_request_irq() from "lbo-detect" to
"act8945a, lbo-detect".
Changes in v3: None
Changes in v2: None
drivers/power/supply/act8945a_charger.c | 78 +++++++++++++++++++++++++++++++++
1 file changed, 78 insertions(+)
diff --git a/drivers/power/supply/act8945a_charger.c b/drivers/power/supply/act8945a_charger.c
index a3d89be..2321796 100644
--- a/drivers/power/supply/act8945a_charger.c
+++ b/drivers/power/supply/act8945a_charger.c
@@ -83,6 +83,7 @@ struct act8945a_charger {
struct work_struct work;
bool init_done;
+ int lbo_pin;
};
static int act8945a_get_charger_state(struct regmap *regmap, int *val)
@@ -208,11 +209,70 @@ static int act8945a_get_battery_health(struct regmap *regmap, int *val)
return 0;
}
+static int act8945a_get_capacity_level(struct act8945a_charger *charger,
+ struct regmap *regmap, int *val)
+{
+ int ret;
+ unsigned int status, state, config;
+ int lbo_level = 1;
+
+ if (gpio_is_valid(charger->lbo_pin))
+ lbo_level = gpio_get_value(charger->lbo_pin);
+
+ ret = regmap_read(regmap, ACT8945A_APCH_STATUS, &status);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_read(regmap, ACT8945A_APCH_CFG, &config);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_read(regmap, ACT8945A_APCH_STATE, &state);
+ if (ret < 0)
+ return ret;
+
+ state &= APCH_STATE_CSTATE;
+ state >>= APCH_STATE_CSTATE_SHIFT;
+
+ switch (state) {
+ case APCH_STATE_CSTATE_PRE:
+ *val = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
+ break;
+ case APCH_STATE_CSTATE_FAST:
+ if (lbo_level)
+ *val = POWER_SUPPLY_CAPACITY_LEVEL_HIGH;
+ else
+ *val = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
+ break;
+ case APCH_STATE_CSTATE_EOC:
+ if (status & APCH_STATUS_CHGDAT)
+ *val = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
+ else
+ *val = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
+ break;
+ case APCH_STATE_CSTATE_DISABLED:
+ default:
+ if (config & APCH_CFG_SUSCHG) {
+ *val = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
+ } else {
+ *val = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
+ if (!(status & APCH_STATUS_INDAT)) {
+ if (!lbo_level)
+ *val = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
+ }
+ }
+ break;
+ }
+
+ return 0;
+}
+
static enum power_supply_property act8945a_charger_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_CHARGE_TYPE,
POWER_SUPPLY_PROP_TECHNOLOGY,
POWER_SUPPLY_PROP_HEALTH,
+ POWER_SUPPLY_PROP_CAPACITY_LEVEL,
POWER_SUPPLY_PROP_MODEL_NAME,
POWER_SUPPLY_PROP_MANUFACTURER
};
@@ -238,6 +298,10 @@ static int act8945a_charger_get_property(struct power_supply *psy,
case POWER_SUPPLY_PROP_HEALTH:
ret = act8945a_get_battery_health(regmap, &val->intval);
break;
+ case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
+ ret = act8945a_get_capacity_level(charger,
+ regmap, &val->intval);
+ break;
case POWER_SUPPLY_PROP_MODEL_NAME:
val->strval = act8945a_charger_model;
break;
@@ -352,6 +416,20 @@ static int act8945a_charger_config(struct device *dev,
if (tmp & APCH_CFG_SUSCHG)
value |= APCH_CFG_SUSCHG;
+ charger->lbo_pin = of_get_named_gpio(np, "active-semi,lbo-gpios", 0);
+ if (gpio_is_valid(charger->lbo_pin)) {
+ if (!devm_gpio_request(dev, charger->lbo_pin, "lbo-detect")) {
+ ret = devm_request_irq(dev,
+ gpio_to_irq(charger->lbo_pin),
+ act8945a_status_changed,
+ IRQF_TRIGGER_FALLING |
+ IRQF_TRIGGER_RISING,
+ "act8945a, lbo-detect", charger);
+ if (ret)
+ dev_dbg(dev, "failed to request LBO pin IRQ\n");
+ }
+ }
+
chglev_pin = of_get_named_gpio_flags(np,
"active-semi,chglev-gpios", 0, &flags);
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Sebastian Reichel <sre@kernel.org> |
|---|---|
| Date | 2016-08-17 13:50 +0200 |
| Subject | Re: [PATCH v5 5/7] power: act8945a_charger: Add capacity level property |
| Message-ID | <s77w5-t7-7@gated-at.bofh.it> |
| In reply to | #1463576 |
[Multipart message — attachments visible in raw view] — view raw
Hi, On Tue, Aug 16, 2016 at 04:59:56PM +0800, Wenyou Yang wrote: > Add the power supply capacity level property, it corresponds to > POWER_SUPPLY_CAPACITY_LEVEL_*. > > It also utilizes the precision voltage detector function module > to catch the low battery voltage. Please use gpiod API instead of old gpio API. -- Sebastian
[toc] | [prev] | [next] | [standalone]
| From | Wenyou Yang <wenyou.yang@atmel.com> |
|---|---|
| Date | 2016-08-16 11:20 +0200 |
| Subject | [PATCH v5 3/7] power: act8945a_charger: Add status change update support |
| Message-ID | <s6IHo-1dz-35@gated-at.bofh.it> |
| In reply to | #1463575 |
Add the charger status change interrupt support, it will report
the power supply changed event.
This interrupt is generated by one of the conditions as below:
- the state machine jumps out of or into the EOC state
- the CHGIN input voltage goes out of or into the valid range.
- the battery temperature goes out of or into the valid range.
- the PRECHARGE time-out occurs.
- the total charge time-out occurs.
Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
---
Changes in v5: None
Changes in v4:
- Use "interrupts" property, instead of "active-semi,lbo-gpios"
for irq.
Changes in v3: None
Changes in v2: None
drivers/power/supply/act8945a_charger.c | 82 ++++++++++++++++++++++++++++++---
1 file changed, 75 insertions(+), 7 deletions(-)
diff --git a/drivers/power/supply/act8945a_charger.c b/drivers/power/supply/act8945a_charger.c
index 6ddfc1d..74778f7 100644
--- a/drivers/power/supply/act8945a_charger.c
+++ b/drivers/power/supply/act8945a_charger.c
@@ -10,9 +10,11 @@
* published by the Free Software Foundation.
*
*/
+#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
+#include <linux/of_irq.h>
#include <linux/platform_device.h>
#include <linux/power_supply.h>
#include <linux/regmap.h>
@@ -75,7 +77,11 @@ static const char *act8945a_charger_manufacturer = "Active-semi";
#define APCH_STATE_CSTATE_PRE 0x03
struct act8945a_charger {
+ struct power_supply *psy;
struct regmap *regmap;
+ struct work_struct work;
+
+ bool init_done;
};
static int act8945a_get_charger_state(struct regmap *regmap, int *val)
@@ -252,6 +258,47 @@ static const struct power_supply_desc act8945a_charger_desc = {
.num_properties = ARRAY_SIZE(act8945a_charger_props),
};
+static int act8945a_enable_interrupt(struct act8945a_charger *charger)
+{
+ struct regmap *regmap = charger->regmap;
+ unsigned char ctrl;
+ int ret;
+
+ ctrl = APCH_CTRL_CHGEOCOUT | APCH_CTRL_CHGEOCIN |
+ APCH_CTRL_INDIS | APCH_CTRL_INCON |
+ APCH_CTRL_TEMPOUT | APCH_CTRL_TEMPIN |
+ APCH_CTRL_TIMRPRE | APCH_CTRL_TIMRTOT;
+ ret = regmap_write(regmap, ACT8945A_APCH_CTRL, ctrl);
+ if (ret)
+ return ret;
+
+ ctrl = APCH_STATUS_CHGSTAT | APCH_STATUS_INSTAT |
+ APCH_STATUS_TEMPSTAT | APCH_STATUS_TIMRSTAT;
+ ret = regmap_write(regmap, ACT8945A_APCH_STATUS, ctrl);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
+static void act8945a_work(struct work_struct *work)
+{
+ struct act8945a_charger *charger =
+ container_of(work, struct act8945a_charger, work);
+
+ power_supply_changed(charger->psy);
+}
+
+static irqreturn_t act8945a_status_changed(int irq, void *dev_id)
+{
+ struct act8945a_charger *charger = dev_id;
+
+ if (charger->init_done)
+ schedule_work(&charger->work);
+
+ return IRQ_HANDLED;
+}
+
#define DEFAULT_TOTAL_TIME_OUT 3
#define DEFAULT_PRE_TIME_OUT 40
#define DEFAULT_INPUT_OVP_THRESHOLD 6600
@@ -360,9 +407,8 @@ static int act8945a_charger_config(struct device *dev,
static int act8945a_charger_probe(struct platform_device *pdev)
{
struct act8945a_charger *charger;
- struct power_supply *psy;
struct power_supply_config psy_cfg = {};
- int ret;
+ int irq, ret;
charger = devm_kzalloc(&pdev->dev, sizeof(*charger), GFP_KERNEL);
if (!charger)
@@ -378,17 +424,39 @@ static int act8945a_charger_probe(struct platform_device *pdev)
if (ret)
return ret;
+ irq = of_irq_get(pdev->dev.parent->of_node, 0);
+ if (irq == -EPROBE_DEFER) {
+ dev_err(&pdev->dev, "failed to find IRQ number\n");
+ return -EPROBE_DEFER;
+ }
+
+ ret = devm_request_irq(&pdev->dev, irq, act8945a_status_changed,
+ IRQF_TRIGGER_FALLING, "act8945a_interrupt",
+ charger);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to request nIRQ pin IRQ\n");
+ return ret;
+ }
+
psy_cfg.of_node = pdev->dev.parent->of_node;
psy_cfg.drv_data = charger;
- psy = devm_power_supply_register(&pdev->dev,
- &act8945a_charger_desc,
- &psy_cfg);
- if (IS_ERR(psy)) {
+ charger->psy = devm_power_supply_register(&pdev->dev,
+ &act8945a_charger_desc,
+ &psy_cfg);
+ if (IS_ERR(charger->psy)) {
dev_err(&pdev->dev, "failed to register power supply\n");
- return PTR_ERR(psy);
+ return PTR_ERR(charger->psy);
}
+ INIT_WORK(&charger->work, act8945a_work);
+
+ ret = act8945a_enable_interrupt(charger);
+ if (ret)
+ return -EIO;
+
+ charger->init_done = true;
+
return 0;
}
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Sebastian Reichel <sre@kernel.org> |
|---|---|
| Date | 2016-08-17 13:50 +0200 |
| Subject | Re: [PATCH v5 3/7] power: act8945a_charger: Add status change update support |
| Message-ID | <s77w5-t7-5@gated-at.bofh.it> |
| In reply to | #1463580 |
[Multipart message — attachments visible in raw view] — view raw
Hi,
On Tue, Aug 16, 2016 at 04:59:54PM +0800, Wenyou Yang wrote:
> Add the charger status change interrupt support, it will report
> the power supply changed event.
>
> This interrupt is generated by one of the conditions as below:
> - the state machine jumps out of or into the EOC state
> - the CHGIN input voltage goes out of or into the valid range.
> - the battery temperature goes out of or into the valid range.
> - the PRECHARGE time-out occurs.
> - the total charge time-out occurs.
This is unsafe during module remove, since irq work may be scheduled
while power-supply is unregistered. You will have to add a remove
function, which does something like
charger->init_done = false;
cancel_work_sync(&charger->work);
-- Sebastian
> Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
> ---
>
> Changes in v5: None
> Changes in v4:
> - Use "interrupts" property, instead of "active-semi,lbo-gpios"
> for irq.
>
> Changes in v3: None
> Changes in v2: None
>
> drivers/power/supply/act8945a_charger.c | 82 ++++++++++++++++++++++++++++++---
> 1 file changed, 75 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/power/supply/act8945a_charger.c b/drivers/power/supply/act8945a_charger.c
> index 6ddfc1d..74778f7 100644
> --- a/drivers/power/supply/act8945a_charger.c
> +++ b/drivers/power/supply/act8945a_charger.c
> @@ -10,9 +10,11 @@
> * published by the Free Software Foundation.
> *
> */
> +#include <linux/interrupt.h>
> #include <linux/module.h>
> #include <linux/of.h>
> #include <linux/of_gpio.h>
> +#include <linux/of_irq.h>
> #include <linux/platform_device.h>
> #include <linux/power_supply.h>
> #include <linux/regmap.h>
> @@ -75,7 +77,11 @@ static const char *act8945a_charger_manufacturer = "Active-semi";
> #define APCH_STATE_CSTATE_PRE 0x03
>
> struct act8945a_charger {
> + struct power_supply *psy;
> struct regmap *regmap;
> + struct work_struct work;
> +
> + bool init_done;
> };
>
> static int act8945a_get_charger_state(struct regmap *regmap, int *val)
> @@ -252,6 +258,47 @@ static const struct power_supply_desc act8945a_charger_desc = {
> .num_properties = ARRAY_SIZE(act8945a_charger_props),
> };
>
> +static int act8945a_enable_interrupt(struct act8945a_charger *charger)
> +{
> + struct regmap *regmap = charger->regmap;
> + unsigned char ctrl;
> + int ret;
> +
> + ctrl = APCH_CTRL_CHGEOCOUT | APCH_CTRL_CHGEOCIN |
> + APCH_CTRL_INDIS | APCH_CTRL_INCON |
> + APCH_CTRL_TEMPOUT | APCH_CTRL_TEMPIN |
> + APCH_CTRL_TIMRPRE | APCH_CTRL_TIMRTOT;
> + ret = regmap_write(regmap, ACT8945A_APCH_CTRL, ctrl);
> + if (ret)
> + return ret;
> +
> + ctrl = APCH_STATUS_CHGSTAT | APCH_STATUS_INSTAT |
> + APCH_STATUS_TEMPSTAT | APCH_STATUS_TIMRSTAT;
> + ret = regmap_write(regmap, ACT8945A_APCH_STATUS, ctrl);
> + if (ret)
> + return ret;
> +
> + return 0;
> +}
> +
> +static void act8945a_work(struct work_struct *work)
> +{
> + struct act8945a_charger *charger =
> + container_of(work, struct act8945a_charger, work);
> +
> + power_supply_changed(charger->psy);
> +}
> +
> +static irqreturn_t act8945a_status_changed(int irq, void *dev_id)
> +{
> + struct act8945a_charger *charger = dev_id;
> +
> + if (charger->init_done)
> + schedule_work(&charger->work);
> +
> + return IRQ_HANDLED;
> +}
> +
> #define DEFAULT_TOTAL_TIME_OUT 3
> #define DEFAULT_PRE_TIME_OUT 40
> #define DEFAULT_INPUT_OVP_THRESHOLD 6600
> @@ -360,9 +407,8 @@ static int act8945a_charger_config(struct device *dev,
> static int act8945a_charger_probe(struct platform_device *pdev)
> {
> struct act8945a_charger *charger;
> - struct power_supply *psy;
> struct power_supply_config psy_cfg = {};
> - int ret;
> + int irq, ret;
>
> charger = devm_kzalloc(&pdev->dev, sizeof(*charger), GFP_KERNEL);
> if (!charger)
> @@ -378,17 +424,39 @@ static int act8945a_charger_probe(struct platform_device *pdev)
> if (ret)
> return ret;
>
> + irq = of_irq_get(pdev->dev.parent->of_node, 0);
> + if (irq == -EPROBE_DEFER) {
> + dev_err(&pdev->dev, "failed to find IRQ number\n");
> + return -EPROBE_DEFER;
> + }
> +
> + ret = devm_request_irq(&pdev->dev, irq, act8945a_status_changed,
> + IRQF_TRIGGER_FALLING, "act8945a_interrupt",
> + charger);
> + if (ret) {
> + dev_err(&pdev->dev, "failed to request nIRQ pin IRQ\n");
> + return ret;
> + }
> +
> psy_cfg.of_node = pdev->dev.parent->of_node;
> psy_cfg.drv_data = charger;
>
> - psy = devm_power_supply_register(&pdev->dev,
> - &act8945a_charger_desc,
> - &psy_cfg);
> - if (IS_ERR(psy)) {
> + charger->psy = devm_power_supply_register(&pdev->dev,
> + &act8945a_charger_desc,
> + &psy_cfg);
> + if (IS_ERR(charger->psy)) {
> dev_err(&pdev->dev, "failed to register power supply\n");
> - return PTR_ERR(psy);
> + return PTR_ERR(charger->psy);
> }
>
> + INIT_WORK(&charger->work, act8945a_work);
> +
> + ret = act8945a_enable_interrupt(charger);
> + if (ret)
> + return -EIO;
> +
> + charger->init_done = true;
> +
> return 0;
> }
>
> --
> 2.7.4
>
[toc] | [prev] | [next] | [standalone]
| From | Wenyou Yang <wenyou.yang@atmel.com> |
|---|---|
| Date | 2016-08-16 11:20 +0200 |
| Subject | [PATCH v5 4/7] power: act8945a_charger: Fix the power supply type |
| Message-ID | <s6IHo-1dz-31@gated-at.bofh.it> |
| In reply to | #1463575 |
The power supply type property is varying as the external power
supply changes. It is not a constant.
Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
---
Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None
drivers/power/supply/act8945a_charger.c | 48 ++++++++++++++++++++++++++-------
1 file changed, 39 insertions(+), 9 deletions(-)
diff --git a/drivers/power/supply/act8945a_charger.c b/drivers/power/supply/act8945a_charger.c
index 74778f7..a3d89be 100644
--- a/drivers/power/supply/act8945a_charger.c
+++ b/drivers/power/supply/act8945a_charger.c
@@ -78,6 +78,7 @@ static const char *act8945a_charger_manufacturer = "Active-semi";
struct act8945a_charger {
struct power_supply *psy;
+ struct power_supply_desc desc;
struct regmap *regmap;
struct work_struct work;
@@ -250,14 +251,6 @@ static int act8945a_charger_get_property(struct power_supply *psy,
return ret;
}
-static const struct power_supply_desc act8945a_charger_desc = {
- .name = "act8945a-charger",
- .type = POWER_SUPPLY_TYPE_BATTERY,
- .get_property = act8945a_charger_get_property,
- .properties = act8945a_charger_props,
- .num_properties = ARRAY_SIZE(act8945a_charger_props),
-};
-
static int act8945a_enable_interrupt(struct act8945a_charger *charger)
{
struct regmap *regmap = charger->regmap;
@@ -281,11 +274,39 @@ static int act8945a_enable_interrupt(struct act8945a_charger *charger)
return 0;
}
+static unsigned int act8945a_set_supply_type(struct act8945a_charger *charger,
+ unsigned int *type)
+{
+ unsigned int status, state;
+ int ret;
+
+ ret = regmap_read(charger->regmap, ACT8945A_APCH_STATUS, &status);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_read(charger->regmap, ACT8945A_APCH_STATE, &state);
+ if (ret < 0)
+ return ret;
+
+ if (status & APCH_STATUS_INDAT) {
+ if (state & APCH_STATE_ACINSTAT)
+ *type = POWER_SUPPLY_TYPE_MAINS;
+ else
+ *type = POWER_SUPPLY_TYPE_USB;
+ } else {
+ *type = POWER_SUPPLY_TYPE_BATTERY;
+ }
+
+ return 0;
+}
+
static void act8945a_work(struct work_struct *work)
{
struct act8945a_charger *charger =
container_of(work, struct act8945a_charger, work);
+ act8945a_set_supply_type(charger, &charger->desc.type);
+
power_supply_changed(charger->psy);
}
@@ -438,11 +459,20 @@ static int act8945a_charger_probe(struct platform_device *pdev)
return ret;
}
+ charger->desc.name = "act8945a-charger";
+ charger->desc.get_property = act8945a_charger_get_property;
+ charger->desc.properties = act8945a_charger_props;
+ charger->desc.num_properties = ARRAY_SIZE(act8945a_charger_props);
+
+ ret = act8945a_set_supply_type(charger, &charger->desc.type);
+ if (ret)
+ return -EINVAL;
+
psy_cfg.of_node = pdev->dev.parent->of_node;
psy_cfg.drv_data = charger;
charger->psy = devm_power_supply_register(&pdev->dev,
- &act8945a_charger_desc,
+ &charger->desc,
&psy_cfg);
if (IS_ERR(charger->psy)) {
dev_err(&pdev->dev, "failed to register power supply\n");
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Wenyou Yang <wenyou.yang@atmel.com> |
|---|---|
| Date | 2016-08-16 11:30 +0200 |
| Subject | [PATCH v5 7/7] doc: bindings: act8945a-charger: Update properties |
| Message-ID | <s6IR4-1hW-17@gated-at.bofh.it> |
| In reply to | #1463575 |
Due the driver improvements, update the properties,
- Remove "active-semi,check-battery-temperature" property.
- Add the properties, "active-semi,irq_gpio"
and "active-semi,lbo-gpios".
Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
Acked-by: Rob Herring <robh@kernel.org>
---
Changes in v5:
- Add Acked-by tag.
Changes in v4:
- Update the doc/binding for using "interrupts" property.
Changes in v3: None
Changes in v2: None
.../bindings/power/supply/act8945a-charger.txt | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/Documentation/devicetree/bindings/power/supply/act8945a-charger.txt b/Documentation/devicetree/bindings/power/supply/act8945a-charger.txt
index bea254c..f9866c4 100644
--- a/Documentation/devicetree/bindings/power/supply/act8945a-charger.txt
+++ b/Documentation/devicetree/bindings/power/supply/act8945a-charger.txt
@@ -4,10 +4,15 @@ Required properties:
- compatible: "active-semi,act8945a", please refer to ../mfd/act8945a.txt.
- active-semi,chglev-gpios: charge current level phandle with args
as described in ../gpio/gpio.txt.
+ - active-semi,lbo-gpios: specify the low battery voltage detect phandle
+ with args as as described in ../gpio/gpio.txt.
+ - interrupts: <a b> where a is the interrupt number and b is a
+ field that represents an encoding of the sense and level
+ information for the interrupt.
+ - interrupt-parent: the phandle for the interrupt controller that
+ services interrupts for this device.
Optional properties:
- - active-semi,check-battery-temperature: boolean to check the battery
- temperature or not.
- active-semi,input-voltage-threshold-microvolt: unit: mV;
Specifies the charger's input over-voltage threshold value;
The value can be: 6600, 7000, 7500, 8000; default: 6600
@@ -27,9 +32,14 @@ Example:
status = "okay";
pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_charger_chglev>;
+ pinctrl-0 = <&pinctrl_charger_chglev &pinctrl_charger_lbo &pinctrl_charger_irq>;
+
active-semi,chglev-gpios = <&pioA 12 GPIO_ACTIVE_HIGH>;
+ active-semi,lbo-gpios = <&pioA 72 GPIO_ACTIVE_LOW>;
active-semi,input-voltage-threshold-microvolt = <6600>;
active-semi,precondition-timeout = <40>;
active-semi,total-timeout = <3>;
+ interrupt-parent = <&pioA>;
+ interrupts = <45 GPIO_ACTIVE_LOW>;
+
};
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Wenyou Yang <wenyou.yang@atmel.com> |
|---|---|
| Date | 2016-08-16 11:30 +0200 |
| Subject | [PATCH v5 6/7] power: act8945a_charger: Add max current property |
| Message-ID | <s6IR4-1hW-29@gated-at.bofh.it> |
| In reply to | #1463575 |
Add the power supply's current max property,
POWER_SUPPLY_PROP_CURRENT_MAX.
Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
---
Changes in v5: None
Changes in v4:
- Fix wrong gpio assignment for chglev_pin.
Changes in v3: None
Changes in v2: None
drivers/power/supply/act8945a_charger.c | 79 ++++++++++++++++++++++++++++++++-
1 file changed, 77 insertions(+), 2 deletions(-)
diff --git a/drivers/power/supply/act8945a_charger.c b/drivers/power/supply/act8945a_charger.c
index 2321796..9bfbc87 100644
--- a/drivers/power/supply/act8945a_charger.c
+++ b/drivers/power/supply/act8945a_charger.c
@@ -84,6 +84,7 @@ struct act8945a_charger {
bool init_done;
int lbo_pin;
+ int chgin_level;
};
static int act8945a_get_charger_state(struct regmap *regmap, int *val)
@@ -267,12 +268,79 @@ static int act8945a_get_capacity_level(struct act8945a_charger *charger,
return 0;
}
+#define MAX_CURRENT_USB_HIGH 450000
+#define MAX_CURRENT_USB_LOW 90000
+#define MAX_CURRENT_USB_PRE 45000
+/*
+ * Riset(K) = 2336 * (1V/Ichg(mA)) - 0.205
+ * Riset = 2.43K
+ */
+#define MAX_CURRENT_AC_HIGH 886527
+#define MAX_CURRENT_AC_LOW 117305
+#define MAX_CURRENT_AC_HIGH_PRE 88653
+#define MAX_CURRENT_AC_LOW_PRE 11731
+
+static int act8945a_get_current_max(struct act8945a_charger *charger,
+ struct regmap *regmap, int *val)
+{
+ int ret;
+ unsigned int status, state;
+ unsigned int acin_state;
+
+ ret = regmap_read(regmap, ACT8945A_APCH_STATUS, &status);
+ if (ret < 0)
+ return ret;
+
+ ret = regmap_read(regmap, ACT8945A_APCH_STATE, &state);
+ if (ret < 0)
+ return ret;
+
+ acin_state = (state & APCH_STATE_ACINSTAT) >> 1;
+
+ state &= APCH_STATE_CSTATE;
+ state >>= APCH_STATE_CSTATE_SHIFT;
+
+ switch (state) {
+ case APCH_STATE_CSTATE_PRE:
+ if (acin_state) {
+ if (charger->chgin_level)
+ *val = MAX_CURRENT_AC_HIGH_PRE;
+ else
+ *val = MAX_CURRENT_AC_LOW_PRE;
+ } else {
+ *val = MAX_CURRENT_USB_PRE;
+ }
+ break;
+ case APCH_STATE_CSTATE_FAST:
+ if (acin_state) {
+ if (charger->chgin_level)
+ *val = MAX_CURRENT_AC_HIGH;
+ else
+ *val = MAX_CURRENT_AC_LOW;
+ } else {
+ if (charger->chgin_level)
+ *val = MAX_CURRENT_USB_HIGH;
+ else
+ *val = MAX_CURRENT_USB_LOW;
+ }
+ break;
+ case APCH_STATE_CSTATE_EOC:
+ case APCH_STATE_CSTATE_DISABLED:
+ default:
+ *val = 0;
+ break;
+ }
+
+ return 0;
+}
+
static enum power_supply_property act8945a_charger_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_CHARGE_TYPE,
POWER_SUPPLY_PROP_TECHNOLOGY,
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_CAPACITY_LEVEL,
+ POWER_SUPPLY_PROP_CURRENT_MAX,
POWER_SUPPLY_PROP_MODEL_NAME,
POWER_SUPPLY_PROP_MANUFACTURER
};
@@ -302,6 +370,10 @@ static int act8945a_charger_get_property(struct power_supply *psy,
ret = act8945a_get_capacity_level(charger,
regmap, &val->intval);
break;
+ case POWER_SUPPLY_PROP_CURRENT_MAX:
+ ret = act8945a_get_current_max(charger,
+ regmap, &val->intval);
+ break;
case POWER_SUPPLY_PROP_MODEL_NAME:
val->strval = act8945a_charger_model;
break;
@@ -434,8 +506,11 @@ static int act8945a_charger_config(struct device *dev,
"active-semi,chglev-gpios", 0, &flags);
if (gpio_is_valid(chglev_pin)) {
- gpio_set_value(chglev_pin,
- ((flags == OF_GPIO_ACTIVE_LOW) ? 0 : 1));
+ if (!devm_gpio_request(dev, chglev_pin, "chglev-pin")) {
+ charger->chgin_level =
+ (flags == OF_GPIO_ACTIVE_LOW) ? 0 : 1;
+ gpio_set_value(chglev_pin, charger->chgin_level);
+ }
}
if (of_property_read_u32(np,
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Sebastian Reichel <sre@kernel.org> |
|---|---|
| Date | 2016-08-17 14:00 +0200 |
| Subject | Re: [PATCH v5 6/7] power: act8945a_charger: Add max current property |
| Message-ID | <s77FM-wB-9@gated-at.bofh.it> |
| In reply to | #1463592 |
[Multipart message — attachments visible in raw view] — view raw
Hi, On Tue, Aug 16, 2016 at 04:59:57PM +0800, Wenyou Yang wrote: > Add the power supply's current max property, > POWER_SUPPLY_PROP_CURRENT_MAX. Please also switch chgin_level to gpiod API. -- Sebastian
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web