Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1457558 > unrolled thread
| Started by | Wenyou Yang <wenyou.yang@atmel.com> |
|---|---|
| First post | 2016-08-08 08:30 +0200 |
| Last post | 2016-08-08 08:30 +0200 |
| Articles | 5 — 1 participant |
Back to article view | Back to linux.kernel
[PATCH v4 0/7] power: act8945a_charger: Improvements Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-08 08:30 +0200
[PATCH v4 3/7] power: act8945a_charger: Add status change update support Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-08 08:30 +0200
[PATCH v4 5/7] power: act8945a_charger: Add capacity level property Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-08 08:30 +0200
[PATCH v4 2/7] power: act8945a_charger: Improve Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-08 08:30 +0200
[PATCH v4 6/7] power: act8945a_charger: Add max current property Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-08 08:30 +0200
| From | Wenyou Yang <wenyou.yang@atmel.com> |
|---|---|
| Date | 2016-08-08 08:30 +0200 |
| Subject | [PATCH v4 0/7] power: act8945a_charger: Improvements |
| Message-ID | <s3Meu-6bP-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 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 .../devicetree/bindings/power/act8945a-charger.txt | 16 +- drivers/power/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-08 08:30 +0200 |
| Subject | [PATCH v4 3/7] power: act8945a_charger: Add status change update support |
| Message-ID | <s3Meu-6bP-17@gated-at.bofh.it> |
| In reply to | #1457558 |
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 v4:
- Use "interrupts" property, instead of "active-semi,lbo-gpios"
for irq.
Changes in v3: None
Changes in v2: None
drivers/power/act8945a_charger.c | 82 ++++++++++++++++++++++++++++++++++++----
1 file changed, 75 insertions(+), 7 deletions(-)
diff --git a/drivers/power/act8945a_charger.c b/drivers/power/act8945a_charger.c
index 6ddfc1d..74778f7 100644
--- a/drivers/power/act8945a_charger.c
+++ b/drivers/power/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-08 08:30 +0200 |
| Subject | [PATCH v4 5/7] power: act8945a_charger: Add capacity level property |
| Message-ID | <s3Meu-6bP-13@gated-at.bofh.it> |
| In reply to | #1457558 |
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 v4:
- Change devname of devm_request_irq() from "lbo-detect" to
"act8945a, lbo-detect".
Changes in v3: None
Changes in v2: None
drivers/power/act8945a_charger.c | 78 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 78 insertions(+)
diff --git a/drivers/power/act8945a_charger.c b/drivers/power/act8945a_charger.c
index a3d89be..2321796 100644
--- a/drivers/power/act8945a_charger.c
+++ b/drivers/power/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 | Wenyou Yang <wenyou.yang@atmel.com> |
|---|---|
| Date | 2016-08-08 08:30 +0200 |
| Subject | [PATCH v4 2/7] power: act8945a_charger: Improve |
| Message-ID | <s3Meu-6bP-21@gated-at.bofh.it> |
| In reply to | #1457558 |
When get the property, first check the charger state machine,
then check the status bit to decide what value is assigned to
the corresponding property.
Retain the SUSCHG bit of REG 0x71 when configure the timers to
avoid losting the charger suspending info after boot.
Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
---
Changes in v4: None
Changes in v3:
- Remove unneeded semicolon to fix semicolon.cocci warning.
Changes in v2:
- Add missing ret declaration.
drivers/power/act8945a_charger.c | 84 ++++++++++++++++++++++++++++++++--------
1 file changed, 68 insertions(+), 16 deletions(-)
diff --git a/drivers/power/act8945a_charger.c b/drivers/power/act8945a_charger.c
index 72d39ba..6ddfc1d 100644
--- a/drivers/power/act8945a_charger.c
+++ b/drivers/power/act8945a_charger.c
@@ -94,16 +94,24 @@ static int act8945a_get_charger_state(struct regmap *regmap, int *val)
state &= APCH_STATE_CSTATE;
state >>= APCH_STATE_CSTATE_SHIFT;
- if (state == APCH_STATE_CSTATE_EOC) {
+ switch (state) {
+ case APCH_STATE_CSTATE_PRE:
+ case APCH_STATE_CSTATE_FAST:
+ *val = POWER_SUPPLY_STATUS_CHARGING;
+ break;
+ case APCH_STATE_CSTATE_EOC:
if (status & APCH_STATUS_CHGDAT)
*val = POWER_SUPPLY_STATUS_FULL;
else
+ *val = POWER_SUPPLY_STATUS_CHARGING;
+ break;
+ case APCH_STATE_CSTATE_DISABLED:
+ default:
+ if (!(status & APCH_STATUS_INDAT))
+ *val = POWER_SUPPLY_STATUS_DISCHARGING;
+ else
*val = POWER_SUPPLY_STATUS_NOT_CHARGING;
- } else if ((state == APCH_STATE_CSTATE_FAST) ||
- (state == APCH_STATE_CSTATE_PRE)) {
- *val = POWER_SUPPLY_STATUS_CHARGING;
- } else {
- *val = POWER_SUPPLY_STATUS_NOT_CHARGING;
+ break;
}
return 0;
@@ -112,7 +120,11 @@ static int act8945a_get_charger_state(struct regmap *regmap, int *val)
static int act8945a_get_charge_type(struct regmap *regmap, int *val)
{
int ret;
- unsigned int state;
+ unsigned int status, 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)
@@ -129,9 +141,15 @@ static int act8945a_get_charge_type(struct regmap *regmap, int *val)
*val = POWER_SUPPLY_CHARGE_TYPE_FAST;
break;
case APCH_STATE_CSTATE_EOC:
+ *val = POWER_SUPPLY_CHARGE_TYPE_NONE;
+ break;
case APCH_STATE_CSTATE_DISABLED:
default:
- *val = POWER_SUPPLY_CHARGE_TYPE_NONE;
+ if (!(status & APCH_STATUS_INDAT))
+ *val = POWER_SUPPLY_CHARGE_TYPE_NONE;
+ else
+ *val = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN;
+ break;
}
return 0;
@@ -140,20 +158,45 @@ static int act8945a_get_charge_type(struct regmap *regmap, int *val)
static int act8945a_get_battery_health(struct regmap *regmap, int *val)
{
int ret;
- unsigned int status;
+ unsigned int status, state, config;
ret = regmap_read(regmap, ACT8945A_APCH_STATUS, &status);
if (ret < 0)
return ret;
- if (status & APCH_STATUS_TEMPDAT)
- *val = POWER_SUPPLY_HEALTH_OVERHEAT;
- else if (!(status & APCH_STATUS_INDAT))
- *val = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
- else if (status & APCH_STATUS_TIMRDAT)
- *val = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
- else
+ 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_DISABLED:
+ if (config & APCH_CFG_SUSCHG) {
+ *val = POWER_SUPPLY_HEALTH_UNKNOWN;
+ } else if (status & APCH_STATUS_INDAT) {
+ if (!(status & APCH_STATUS_TEMPDAT))
+ *val = POWER_SUPPLY_HEALTH_OVERHEAT;
+ else if (status & APCH_STATUS_TIMRDAT)
+ *val = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
+ else
+ *val = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
+ } else {
+ *val = POWER_SUPPLY_HEALTH_GOOD;
+ }
+ break;
+ case APCH_STATE_CSTATE_PRE:
+ case APCH_STATE_CSTATE_FAST:
+ case APCH_STATE_CSTATE_EOC:
+ default:
*val = POWER_SUPPLY_HEALTH_GOOD;
+ break;
+ }
return 0;
}
@@ -224,7 +267,9 @@ static int act8945a_charger_config(struct device *dev,
u32 pre_time_out;
u32 input_voltage_threshold;
int chglev_pin;
+ int ret;
+ unsigned int tmp;
unsigned int value = 0;
if (!np) {
@@ -232,6 +277,13 @@ static int act8945a_charger_config(struct device *dev,
return -EINVAL;
}
+ ret = regmap_read(regmap, ACT8945A_APCH_CFG, &tmp);
+ if (ret)
+ return ret;
+
+ if (tmp & APCH_CFG_SUSCHG)
+ value |= APCH_CFG_SUSCHG;
+
chglev_pin = of_get_named_gpio_flags(np,
"active-semi,chglev-gpios", 0, &flags);
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Wenyou Yang <wenyou.yang@atmel.com> |
|---|---|
| Date | 2016-08-08 08:30 +0200 |
| Subject | [PATCH v4 6/7] power: act8945a_charger: Add max current property |
| Message-ID | <s3Meu-6bP-23@gated-at.bofh.it> |
| In reply to | #1457558 |
Add the power supply's current max property,
POWER_SUPPLY_PROP_CURRENT_MAX.
Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
---
Changes in v4:
- Fix wrong gpio assignment for chglev_pin.
Changes in v3: None
Changes in v2: None
drivers/power/act8945a_charger.c | 79 +++++++++++++++++++++++++++++++++++++++-
1 file changed, 77 insertions(+), 2 deletions(-)
diff --git a/drivers/power/act8945a_charger.c b/drivers/power/act8945a_charger.c
index 2321796..9bfbc87 100644
--- a/drivers/power/act8945a_charger.c
+++ b/drivers/power/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] | [standalone]
Back to top | Article view | linux.kernel
csiph-web