[linux-yocto] [PATCH] bq25892: Add support for TI bq25892 IC.

Pranav Tipnis pranav.tipnis at intel.com
Wed Aug 3 15:13:11 PDT 2016


From: Rohit S Kenchanpura <rohit.s.kenchanpura at intel.com>

Signed-off-by: Rohit S Kenchanpura <rohit.s.kenchanpura at intel.com>
---
 drivers/power/bq25890_charger.c       | 71 ++++++++++++++++++++++++++++++++++-
 include/linux/power/bq25890_charger.h | 32 ++++++++++++++++
 2 files changed, 102 insertions(+), 1 deletion(-)
 create mode 100644 include/linux/power/bq25890_charger.h

diff --git a/drivers/power/bq25890_charger.c b/drivers/power/bq25890_charger.c
index f993a55..f194f42 100644
--- a/drivers/power/bq25890_charger.c
+++ b/drivers/power/bq25890_charger.c
@@ -24,6 +24,7 @@
 #include <linux/interrupt.h>
 #include <linux/delay.h>
 #include <linux/usb/phy.h>
+#include <linux/power/bq25890_charger.h>
 
 #include <linux/acpi.h>
 #include <linux/of.h>
@@ -32,6 +33,35 @@
 #define BQ25890_IRQ_PIN			"bq25890_irq"
 
 #define BQ25890_ID			3
+#define BQ25892_ID			0
+
+/* pmic charger info */
+
+#define PMIC_CHG_DEF_CC             2600000     /* in uA */
+#define PMIC_CHG_DEF_IPRECHG        256000      /* in uA */
+#define PMIC_CHG_DEF_ITERM          128000      /* in uA */
+#define PMIC_CHG_DEF_CV             4350000     /* in uV */
+#define PMIC_CHG_DEF_VSYSMIN        3500000     /* in uV */
+#define PMIC_CHG_DEF_BOOSTV         4700000     /* in uV */
+#define PMIC_CHG_DEF_BOOSTI         500000      /* in uA */
+#define PMIC_CHG_MAX_CC             2600000     /* in uA */
+#define PMIC_CHG_MAX_CV             4350000     /* in uV */
+#define PMIC_CHG_MAX_TEMP           100		/* in DegC */
+#define PMIC_CHG_MIN_TEMP           0		/* in DegC */
+
+static struct bq25890_platform_data charger_drvdata = {
+	.def_cc		= PMIC_CHG_DEF_CC,
+	.def_cv		= PMIC_CHG_DEF_CV,
+	.iterm		= PMIC_CHG_DEF_ITERM,
+	.iprechg	= PMIC_CHG_DEF_IPRECHG,
+	.sysvmin	= PMIC_CHG_DEF_VSYSMIN,
+	.boostv		= PMIC_CHG_DEF_BOOSTV,
+	.boosti		= PMIC_CHG_DEF_BOOSTI,
+	.max_cc		= PMIC_CHG_MAX_CC,
+	.max_cv		= PMIC_CHG_MAX_CV,
+	.min_temp	= PMIC_CHG_MIN_TEMP,
+	.max_temp	= PMIC_CHG_MAX_TEMP,
+};
 
 enum bq25890_fields {
 	F_EN_HIZ, F_EN_ILIM, F_IILIM,				     /* Reg00 */
@@ -88,6 +118,7 @@ struct bq25890_state {
 
 struct bq25890_device {
 	struct i2c_client *client;
+	struct bq25890_platform_data *pdata;
 	struct device *dev;
 	struct power_supply *charger;
 
@@ -104,6 +135,11 @@ struct bq25890_device {
 	struct bq25890_state state;
 
 	struct mutex lock; /* protect state data */
+
+	int cc;
+	int cv;
+	int inlmt;
+	int chg_cntl_max;
 };
 
 static const struct regmap_range bq25890_readonly_reg_ranges[] = {
@@ -732,6 +768,7 @@ static int bq25890_irq_probe(struct bq25890_device *bq)
 	return gpiod_to_irq(irq);
 }
 
+#ifdef CONFIG_OF
 static int bq25890_fw_read_u32_props(struct bq25890_device *bq)
 {
 	int ret;
@@ -791,6 +828,37 @@ static int bq25890_fw_probe(struct bq25890_device *bq)
 
 	return 0;
 }
+#else
+static int bq25890_fw_probe(struct bq25890_device *bq)
+{
+	struct bq25890_init_data *init = &bq->init_data;
+
+	/* initialize the BXT platform data */
+	init->ichg = bq25890_find_idx(bq->pdata->def_cc, TBL_ICHG);
+	init->vreg = bq25890_find_idx(bq->pdata->def_cv, TBL_VREG);
+	init->iterm = bq25890_find_idx(bq->pdata->iterm, TBL_ITERM);
+	init->iprechg = bq25890_find_idx(bq->pdata->iprechg, TBL_IPRECHG);
+	init->sysvmin = bq25890_find_idx(bq->pdata->sysvmin, TBL_SYSVMIN);
+	init->boostv = bq25890_find_idx(bq->pdata->boostv, TBL_BOOSTV);
+	init->boosti = bq25890_find_idx(bq->pdata->boosti, TBL_BOOSTI);
+	init->treg = bq25890_find_idx(bq->pdata->max_temp, TBL_TREG);
+	init->boostf = bq->pdata->boostf_low;
+	init->ilim_en = bq->pdata->en_ilim_pin;
+
+	bq->cc = bq->pdata->def_cc;
+	bq->cv = bq->pdata->def_cv;
+
+	/*
+	 * devide the limit into 100mA steps so that
+	 * total available steps will n + 2 including
+	 * zero and High-Z mode.
+	 */
+	bq->chg_cntl_max = (bq->pdata->def_cc / 100000) + 2;
+
+	return 0;
+}
+#endif
+
 
 static int bq25890_probe(struct i2c_client *client,
 			 const struct i2c_device_id *id)
@@ -840,12 +908,13 @@ static int bq25890_probe(struct i2c_client *client,
 		return bq->chip_id;
 	}
 
-	if (bq->chip_id != BQ25890_ID) {
+	if ((bq->chip_id != BQ25890_ID) && (bq->chip_id != BQ25892_ID)) {
 		dev_err(dev, "Chip with ID=%d, not supported!\n", bq->chip_id);
 		return -ENODEV;
 	}
 
 	if (!dev->platform_data) {
+		bq->pdata = &charger_drvdata;
 		ret = bq25890_fw_probe(bq);
 		if (ret < 0) {
 			dev_err(dev, "Cannot read device properties.\n");
diff --git a/include/linux/power/bq25890_charger.h b/include/linux/power/bq25890_charger.h
new file mode 100644
index 0000000..6caf198
--- /dev/null
+++ b/include/linux/power/bq25890_charger.h
@@ -0,0 +1,32 @@
+/*
+ * bq25890_charger.h: platform data structure for bq25890 driver
+ *
+ * (C) Copyright 2015 Intel Corporation
+ *
+ * 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; version 2
+ * of the License.
+ */
+
+#ifndef __BQ25890_CHARGER_H__
+#define __BQ25890_CHARGER_H__
+
+struct bq25890_platform_data {
+	int def_cc;	/* in uA */
+	int def_cv;	/* in uV */
+	int iterm;	/* in uA */
+	int iprechg;	/* in uA */
+	int sysvmin;	/* in uA */
+	int boosti;	/* in uA */
+	int boostv;	/* in uV */
+	int max_cv;	/* in uV */
+	int max_cc;	/* in uA */
+	int min_temp;	/* in DegC */
+	int max_temp;	/* in DegC */
+	bool boostf_low;
+	bool en_thermal_reg;
+	bool en_ilim_pin;
+};
+
+#endif
-- 
1.9.1



More information about the linux-yocto mailing list