summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Richardson <wfrichar@chromium.org>2013-06-06 10:03:58 -0700
committerChromeBot <chrome-bot@google.com>2013-06-07 10:52:11 -0700
commit124b2f1492b970ebaf34c14920bdcdcc79be536e (patch)
tree565a8ade59f9f63dfb59e7e9da0d935df3c8ee2b
parent0fdfcda963ae7d09d47ddc7bba91c53f22315071 (diff)
downloadchrome-ec-124b2f1492b970ebaf34c14920bdcdcc79be536e.tar.gz
Add support for TI's Smart Battery Charger BQ24707A
This is very similar to the BQ24725. There are just enough differences to require a separate file. BUG=chrome-os-partner:19976 BRANCH=none TEST=none Nothing to test until it's enabled. Change-Id: I3247fcfde93ac75f5f9790acadc7feca28038608 Signed-off-by: Bill Richardson <wfrichar@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/57811 Reviewed-by: Randall Spangler <rspangler@chromium.org>
-rw-r--r--common/build.mk3
-rw-r--r--common/charger_bq24707a.c187
-rw-r--r--common/charger_bq24725.c100
-rw-r--r--common/charger_common.c104
-rw-r--r--include/charger.h8
-rw-r--r--include/charger_bq24707a.h44
6 files changed, 351 insertions, 95 deletions
diff --git a/common/build.mk b/common/build.mk
index 33ea132e06..d4f4174d45 100644
--- a/common/build.mk
+++ b/common/build.mk
@@ -12,8 +12,9 @@ common-y+=gpio_common.o version.o printf.o queue.o
common-$(CONFIG_BATTERY_BQ20Z453)+=battery_bq20z453.o
common-$(CONFIG_BATTERY_LINK)+=battery_link.o
common-$(CONFIG_BATTERY_SPRING)+=battery_spring.o
-common-$(CONFIG_CHARGER)+=charge_state.o battery_precharge.o
+common-$(CONFIG_CHARGER)+=charge_state.o battery_precharge.o charger_common.o
common-$(CONFIG_CHARGER_BQ24725)+=charger_bq24725.o
+common-$(CONFIG_CHARGER_BQ24707A)+=charger_bq24707a.o
common-$(CONFIG_CHARGER_TPS65090)+=pmu_tps65090_charger.o
common-$(CONFIG_CHIPSET_GAIA)+=gaia_power.o
common-$(CONFIG_CHIPSET_X86_IVYBRIDGE)+=x86_power_ivybridge.o
diff --git a/common/charger_bq24707a.c b/common/charger_bq24707a.c
new file mode 100644
index 0000000000..8c8aefccb9
--- /dev/null
+++ b/common/charger_bq24707a.c
@@ -0,0 +1,187 @@
+/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * TI bq24707A battery charger driver.
+ */
+
+#include "charger.h"
+#include "charger_bq24707a.h"
+#include "console.h"
+#include "common.h"
+#include "i2c.h"
+#include "smart_battery.h"
+#include "util.h"
+#include "printf.h"
+
+/* Sense resistor configurations and macros */
+#define DEFAULT_SENSE_RESISTOR 10
+#define R_SNS CONFIG_BQ24707A_R_SNS
+#define R_AC CONFIG_BQ24707A_R_AC
+#define REG_TO_CURRENT(REG, RS) ((REG) * DEFAULT_SENSE_RESISTOR / (RS))
+#define CURRENT_TO_REG(CUR, RS) ((CUR) * (RS) / DEFAULT_SENSE_RESISTOR)
+
+/*
+ * charge voltage bitmask: 0111 1111 1111 0000
+ * charge current bitmask: 0001 1111 1100 0000
+ * input current bitmask : 0001 1111 1000 0000
+ */
+static const struct charger_info bq24707a_charger_info = {
+ .name = "bq24707A",
+ .voltage_max = 19200,
+ .voltage_min = 1024,
+ .voltage_step = 16,
+ .current_max = REG_TO_CURRENT(0x1fc0, R_SNS),
+ .current_min = REG_TO_CURRENT(0x40, R_SNS),
+ .current_step = REG_TO_CURRENT(0x40, R_SNS),
+ .input_current_max = REG_TO_CURRENT(0x1F80, R_AC),
+ .input_current_min = REG_TO_CURRENT(0x80, R_AC),
+ .input_current_step = REG_TO_CURRENT(0x80, R_AC),
+};
+
+/* bq24707a specific interfaces */
+
+int charger_set_input_current(int input_current)
+{
+ return sbc_write(BQ24707_INPUT_CURRENT,
+ CURRENT_TO_REG(input_current, R_AC));
+}
+
+int charger_get_input_current(int *input_current)
+{
+ int rv;
+ int reg;
+
+ rv = sbc_read(BQ24707_INPUT_CURRENT, &reg);
+ if (rv)
+ return rv;
+
+ *input_current = REG_TO_CURRENT(reg, R_AC);
+
+ return EC_SUCCESS;
+}
+
+int charger_manufacturer_id(int *id)
+{
+ return sbc_read(BQ24707_MANUFACTURE_ID, id);
+}
+
+int charger_device_id(int *id)
+{
+ return sbc_read(BQ24707_DEVICE_ID, id);
+}
+
+int charger_get_option(int *option)
+{
+ return sbc_read(BQ24707_CHARGE_OPTION, option);
+}
+
+int charger_set_option(int option)
+{
+ return sbc_write(BQ24707_CHARGE_OPTION, option);
+}
+
+/* Charger interfaces */
+
+const struct charger_info *charger_get_info(void)
+{
+ return &bq24707a_charger_info;
+}
+
+int charger_get_status(int *status)
+{
+ int rv;
+ int option;
+
+ rv = charger_get_option(&option);
+ if (rv)
+ return rv;
+
+ /* Default status */
+ *status = CHARGER_LEVEL_2;
+
+ if (option & OPTION_CHARGE_INHIBIT)
+ *status |= CHARGER_CHARGE_INHIBITED;
+
+ return EC_SUCCESS;
+}
+
+int charger_set_mode(int mode)
+{
+ int rv;
+ int option;
+
+ rv = charger_get_option(&option);
+ if (rv)
+ return rv;
+
+ if (mode & CHARGE_FLAG_INHIBIT_CHARGE)
+ option |= OPTION_CHARGE_INHIBIT;
+ else
+ option &= ~OPTION_CHARGE_INHIBIT;
+ return charger_set_option(option);
+}
+
+int charger_get_current(int *current)
+{
+ int rv;
+ int reg;
+
+ rv = sbc_read(SB_CHARGING_CURRENT, &reg);
+ if (rv)
+ return rv;
+
+ *current = REG_TO_CURRENT(reg, R_SNS);
+ return EC_SUCCESS;
+}
+
+int charger_closest_current(int current)
+{
+ const struct charger_info * const info = charger_get_info();
+
+ /*
+ * If the requested current is non-zero but below our minimum,
+ * return the minimum. See crosbug.com/p/8662.
+ */
+ if (current > 0 && current < info->current_min)
+ return info->current_min;
+
+ /* Clip to max */
+ if (current > info->current_max)
+ return info->current_max;
+
+ /* Otherwise round down to nearest current step */
+ return current - (current % info->current_step);
+}
+
+int charger_set_current(int current)
+{
+ current = charger_closest_current(current);
+
+ return sbc_write(SB_CHARGING_CURRENT, CURRENT_TO_REG(current, R_SNS));
+}
+
+int charger_get_voltage(int *voltage)
+{
+ return sbc_read(SB_CHARGING_VOLTAGE, voltage);
+}
+
+int charger_set_voltage(int voltage)
+{
+ return sbc_write(SB_CHARGING_VOLTAGE, voltage);
+}
+
+/* Charging power state initialization */
+int charger_post_init(void)
+{
+ /*
+ * Note: bq24725 power on reset state is:
+ * watch dog timer = 175 sec
+ * input current limit = ~1/2 maximum setting
+ * charging voltage = 0 mV
+ * charging current = 0 mA
+ */
+
+ /* Set charger input current limit */
+ return charger_set_input_current(CONFIG_CHARGER_INPUT_CURRENT);
+}
diff --git a/common/charger_bq24725.c b/common/charger_bq24725.c
index e7adf3501b..a0d297a996 100644
--- a/common/charger_bq24725.c
+++ b/common/charger_bq24725.c
@@ -40,13 +40,13 @@ static const struct charger_info bq24725_charger_info = {
/* bq24725 specific interfaces */
-static int charger_set_input_current(int input_current)
+int charger_set_input_current(int input_current)
{
return sbc_write(BQ24725_INPUT_CURRENT,
CURRENT_TO_REG(input_current, R_AC));
}
-static int charger_get_input_current(int *input_current)
+int charger_get_input_current(int *input_current)
{
int rv;
int reg;
@@ -60,22 +60,22 @@ static int charger_get_input_current(int *input_current)
return EC_SUCCESS;
}
-static int charger_manufacturer_id(int *id)
+int charger_manufacturer_id(int *id)
{
return sbc_read(BQ24725_MANUFACTURE_ID, id);
}
-static int charger_device_id(int *id)
+int charger_device_id(int *id)
{
return sbc_read(BQ24725_DEVICE_ID, id);
}
-static int charger_get_option(int *option)
+int charger_get_option(int *option)
{
return sbc_read(BQ24725_CHARGE_OPTION, option);
}
-static int charger_set_option(int option)
+int charger_set_option(int option)
{
return sbc_write(BQ24725_CHARGE_OPTION, option);
}
@@ -184,91 +184,3 @@ int charger_post_init(void)
/* Set charger input current limit */
return charger_set_input_current(CONFIG_CHARGER_INPUT_CURRENT);
}
-
-/*****************************************************************************/
-/* Console commands */
-
-static int print_info(void)
-{
- int rv;
- int d;
- const struct charger_info *info;
-
- /* info */
- info = charger_get_info();
- ccprintf("Name : %s\n", info->name);
-
- /* option */
- rv = charger_get_option(&d);
- if (rv)
- return rv;
- ccprintf("Option: %016b (0x%04x)\n", d, d);
-
- /* manufacturer id */
- rv = charger_manufacturer_id(&d);
- if (rv)
- return rv;
- ccprintf("Man id: 0x%04x\n", d);
-
- /* device id */
- rv = charger_device_id(&d);
- if (rv)
- return rv;
- ccprintf("Dev id: 0x%04x\n", d);
-
- /* charge voltage limit */
- rv = charger_get_voltage(&d);
- if (rv)
- return rv;
- ccprintf("V_batt: %5d (%4d - %5d, %3d)\n", d,
- info->voltage_min, info->voltage_max, info->voltage_step);
-
- /* charge current limit */
- rv = charger_get_current(&d);
- if (rv)
- return rv;
- ccprintf("I_batt: %5d (%4d - %5d, %3d)\n", d,
- info->current_min, info->current_max, info->current_step);
-
- /* input current limit */
- rv = charger_get_input_current(&d);
- if (rv)
- return rv;
-
- ccprintf("I_in : %5d (%4d - %5d, %3d)\n", d,
- info->input_current_min, info->input_current_max,
- info->input_current_step);
-
- return EC_SUCCESS;
-}
-
-static int command_charger(int argc, char **argv)
-{
- int d;
- char *e;
-
- if (argc != 3)
- return print_info();
-
- if (strcasecmp(argv[1], "input") == 0) {
- d = strtoi(argv[2], &e, 0);
- if (*e)
- return EC_ERROR_PARAM2;
- return charger_set_input_current(d);
- } else if (strcasecmp(argv[1], "current") == 0) {
- d = strtoi(argv[2], &e, 0);
- if (*e)
- return EC_ERROR_PARAM2;
- return charger_set_current(d);
- } else if (strcasecmp(argv[1], "voltage") == 0) {
- d = strtoi(argv[2], &e, 0);
- if (*e)
- return EC_ERROR_PARAM2;
- return charger_set_voltage(d);
- } else
- return EC_ERROR_PARAM1;
-}
-DECLARE_CONSOLE_COMMAND(charger, command_charger,
- "[input | current | voltage] [newval]",
- "Get or set charger param(s)",
- NULL);
diff --git a/common/charger_common.c b/common/charger_common.c
new file mode 100644
index 0000000000..0e57c8c02c
--- /dev/null
+++ b/common/charger_common.c
@@ -0,0 +1,104 @@
+/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * Common functions for battery charging.
+ */
+
+#include "charger.h"
+#include "common.h"
+#include "console.h"
+#include "host_command.h"
+#include "printf.h"
+#include "smart_battery.h"
+#include "util.h"
+
+/* Console output macros */
+#define CPUTS(outstr) cputs(CC_CHARGER, outstr)
+#define CPRINTF(format, args...) cprintf(CC_CHARGER, format, ## args)
+
+static int print_info(void)
+{
+ int rv;
+ int d;
+ const struct charger_info *info;
+
+ /* info */
+ info = charger_get_info();
+ ccprintf("Name : %s\n", info->name);
+
+ /* option */
+ rv = charger_get_option(&d);
+ if (rv)
+ return rv;
+ ccprintf("Option: %016b (0x%04x)\n", d, d);
+
+ /* manufacturer id */
+ rv = charger_manufacturer_id(&d);
+ if (rv)
+ return rv;
+ ccprintf("Man id: 0x%04x\n", d);
+
+ /* device id */
+ rv = charger_device_id(&d);
+ if (rv)
+ return rv;
+ ccprintf("Dev id: 0x%04x\n", d);
+
+ /* charge voltage limit */
+ rv = charger_get_voltage(&d);
+ if (rv)
+ return rv;
+ ccprintf("V_batt: %5d (%4d - %5d, %3d)\n", d,
+ info->voltage_min, info->voltage_max, info->voltage_step);
+
+ /* charge current limit */
+ rv = charger_get_current(&d);
+ if (rv)
+ return rv;
+ ccprintf("I_batt: %5d (%4d - %5d, %3d)\n", d,
+ info->current_min, info->current_max, info->current_step);
+
+ /* input current limit */
+ rv = charger_get_input_current(&d);
+ if (rv)
+ return rv;
+
+ ccprintf("I_in : %5d (%4d - %5d, %3d)\n", d,
+ info->input_current_min, info->input_current_max,
+ info->input_current_step);
+
+ return EC_SUCCESS;
+}
+
+static int command_charger(int argc, char **argv)
+{
+ int d;
+ char *e;
+
+ if (argc != 3)
+ return print_info();
+
+ if (strcasecmp(argv[1], "input") == 0) {
+ d = strtoi(argv[2], &e, 0);
+ if (*e)
+ return EC_ERROR_PARAM2;
+ return charger_set_input_current(d);
+ } else if (strcasecmp(argv[1], "current") == 0) {
+ d = strtoi(argv[2], &e, 0);
+ if (*e)
+ return EC_ERROR_PARAM2;
+ return charger_set_current(d);
+ } else if (strcasecmp(argv[1], "voltage") == 0) {
+ d = strtoi(argv[2], &e, 0);
+ if (*e)
+ return EC_ERROR_PARAM2;
+ return charger_set_voltage(d);
+ } else
+ return EC_ERROR_PARAM1;
+}
+
+DECLARE_CONSOLE_COMMAND(charger, command_charger,
+ "[input | current | voltage] [newval]",
+ "Get or set charger param(s)",
+ NULL);
diff --git a/include/charger.h b/include/charger.h
index 572ae51aea..661433d21a 100644
--- a/include/charger.h
+++ b/include/charger.h
@@ -61,5 +61,13 @@ int charger_set_current(int current);
int charger_get_voltage(int *voltage);
int charger_set_voltage(int voltage);
+/* Other parameters that may be charger-specific, but are common so far. */
+int charger_set_input_current(int input_current);
+int charger_get_input_current(int *input_current);
+int charger_manufacturer_id(int *id);
+int charger_device_id(int *id);
+int charger_get_option(int *option);
+int charger_set_option(int option);
+
#endif /* __CROS_EC_CHARGER_H */
diff --git a/include/charger_bq24707a.h b/include/charger_bq24707a.h
new file mode 100644
index 0000000000..744e991283
--- /dev/null
+++ b/include/charger_bq24707a.h
@@ -0,0 +1,44 @@
+/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * TI bq24707A battery charger driver.
+ */
+
+#ifndef __CROS_EC_CHARGER_BQ24707A_H
+#define __CROS_EC_CHARGER_BQ24707A_H
+
+/* Chip specific commands */
+#define BQ24707_CHARGE_OPTION 0x12
+#define BQ24707_INPUT_CURRENT 0x3f
+#define BQ24707_MANUFACTURE_ID 0xfe
+#define BQ24707_DEVICE_ID 0xff
+
+/* ChargeOption 0x12 */
+#define OPTION_CHARGE_INHIBIT (1 << 0)
+#define OPTION_ACOC_THRESHOLD (3 << 1)
+#define OPTION_COMPARATOR_THRESHOLD (1 << 4)
+#define OPTION_IOUT_SELECTION (1 << 5)
+#define OPTION_IFAULT_HI_THRESHOLD (3 << 7)
+#define OPTION_EMI_FREQ_ENABLE (1 << 9)
+#define OPTION_EMI_FREQ_ADJ (1 << 10)
+#define OPTION_WATCHDOG_TIMER (3 << 13)
+#define OPTION_AOC_DELITCH_TIME (1 << 15)
+/* OPTION_ACOC_THRESHOLD */
+#define ACOC_THRESHOLD_DISABLE (0 << 1)
+#define ACOC_THRESHOLD_133X (1 << 1)
+#define ACOC_THRESHOLD_166X_DEFAULT (2 << 1)
+#define ACOC_THRESHOLD_222X (3 << 1)
+/* OPTION_IFAULT_HI_THRESHOLD */
+#define IFAULT_THRESHOLD_300MV (0 << 7)
+#define IFAULT_THRESHOLD_500MV (1 << 7)
+#define IFAULT_THRESHOLD_700MV_DEFAULT (2 << 7)
+#define IFAULT_THRESHOLD_900MV (3 << 7)
+/* OPTION_WATCHDOG_TIMER */
+#define CHARGE_WATCHDOG_DISABLE (0 << 13)
+#define CHARGE_WATCHDOG_44SEC (1 << 13)
+#define CHARGE_WATCHDOG_88SEC (2 << 13)
+#define CHARGE_WATCHDOG_175SEC_DEFAULT (3 << 13)
+
+#endif /* __CROS_EC_CHARGER_BQ24707A_H */
+