From: Beomho Seo
This patch adds device driver of max77843 charger. This driver provide
initialize each charging mode(e.g. fast charge, top-off mode and constant
charging mode so on.). Additionally, control charging parameters to use
i2c interface.
Cc: Sebastian Reichel
Signed-off-by: Beomho Seo
---
drivers/power/Kconfig|7 +
drivers/power/Makefile |1 +
drivers/power/max77843_charger.c | 508 ++
3 files changed, 516 insertions(+)
create mode 100644 drivers/power/max77843_charger.c
diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig
index 27b751b..994793d 100644
--- a/drivers/power/Kconfig
+++ b/drivers/power/Kconfig
@@ -337,6 +337,13 @@ config CHARGER_MAX77693
help
Say Y to enable support for the Maxim MAX77693 battery charger.
+config CHARGER_MAX77843
+ tristate "Maxim MAX77843 battery charger driver"
+ depends on MFD_MAX77843
+ help
+ Say Y to enable support for the battery charger control sysfs and
+ platform data of MAX77843
+
config CHARGER_MAX8997
tristate "Maxim MAX8997/MAX8966 PMIC battery charger driver"
depends on MFD_MAX8997 && REGULATOR_MAX8997
diff --git a/drivers/power/Makefile b/drivers/power/Makefile
index 36f9e0d..ed69cea 100644
--- a/drivers/power/Makefile
+++ b/drivers/power/Makefile
@@ -53,6 +53,7 @@ obj-$(CONFIG_CHARGER_GPIO)+= gpio-charger.o
obj-$(CONFIG_CHARGER_MANAGER) += charger-manager.o
obj-$(CONFIG_CHARGER_MAX14577) += max14577_charger.o
obj-$(CONFIG_CHARGER_MAX77693) += max77693_charger.o
+obj-$(CONFIG_CHARGER_MAX77843) += max77843_charger.o
obj-$(CONFIG_CHARGER_MAX8997) += max8997_charger.o
obj-$(CONFIG_CHARGER_MAX8998) += max8998_charger.o
obj-$(CONFIG_CHARGER_BQ2415X) += bq2415x_charger.o
diff --git a/drivers/power/max77843_charger.c b/drivers/power/max77843_charger.c
new file mode 100644
index 000..392eebc1a
--- /dev/null
+++ b/drivers/power/max77843_charger.c
@@ -0,0 +1,508 @@
+/*
+ * Charger driver for Maxim MAX77843
+ *
+ * Copyright (C) 2015 Samsung Electronics, Co., Ltd.
+ * Author: Beomho Seo
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published bythe Free Software Foundation.
+ */
+
+#include
+#include
+#include
+#include
+
+struct max77843_charger_info {
+ u32 fast_charge_uamp;
+ u32 top_off_uamp;
+ u32 input_uamp_limit;
+};
+
+struct max77843_charger {
+ struct device *dev;
+ struct max77843 *max77843;
+ struct i2c_client *client;
+ struct regmap *regmap;
+ struct power_supply psy;
+
+ struct max77843_charger_info*info;
+};
+
+static int max77843_charger_get_max_current(struct max77843_charger *charger)
+{
+ struct regmap *regmap = charger->regmap;
+ int ret, val = 0;
+ unsigned int reg_data;
+
+ ret = regmap_read(regmap, MAX77843_CHG_REG_CHG_CNFG_09, ®_data);
+ if (ret) {
+ dev_err(charger->dev,
+ "Failed to read max current register: %d\n", ret);
+ return ret;
+ }
+
+ if (reg_data <= 0x03) {
+ val = MAX77843_CHG_INPUT_CURRENT_LIMIT_MIN;
+ } else if (reg_data >= 0x78) {
+ val = MAX77843_CHG_INPUT_CURRENT_LIMIT_MAX;
+ } else {
+ val = reg_data / 3;
+ if (reg_data % 3 == 0)
+ val *= 10;
+ else if (reg_data % 3 == 1)
+ val = val * 10 + 33000;
+ else
+ val = val * 10 + 67000;
+ }
+
+ return val;
+}
+
+static int max77843_charger_get_now_current(struct max77843_charger *charger)
+{
+ struct regmap *regmap = charger->regmap;
+ int ret, val = 0;
+ unsigned int reg_data;
+
+ ret = regmap_read(regmap, MAX77843_CHG_REG_CHG_CNFG_02, ®_data);
+ if (ret) {
+ dev_err(charger->dev,
+ "Failed to read charge current register: %d\n", ret);
+ return ret;
+ }
+
+ reg_data &= MAX77843_CHG_FAST_CHG_CURRENT_MASK;
+
+ if (reg_data <= 0x02)
+ val = MAX77843_CHG_FAST_CHG_CURRENT_MIN;
+ else if (reg_data >= 0x3f)
+ val = MAX77843_CHG_FAST_CHG_CURRENT_MAX;
+ else
+ val = reg_data * MAX77843_CHG_FAST_CHG_CURRENT_STEP;
+
+ return val;
+}
+
+static int max77843_charger_get_online(struct max77843_charger *charger)
+{
+ struct regmap *regmap = charger->regmap;
+ int ret, val = 0;
+ unsigned int reg_data;
+
+ ret = regmap_read(regmap, MAX77843_CHG_REG_CHG_INT_OK, ®_data);
+ if (ret) {
+ dev_err(charger->dev,
+ "Failed to read charger status: %d\n", ret);
+ return ret;
+ }
+
+ if (reg_data & MAX77843