Re: [PATCH v3 2/3] ARM: qcom: Add coincell charger driver

2015-07-24 Thread Andy Gross
On Thu, Jul 16, 2015 at 04:55:32PM -0700, Tim Bird wrote:
> This driver is used to configure the coincell charger found in
> Qualcomm PMICs.
> 
> The driver allows configuring the current-limiting resistor for
> the charger, as well as the voltage to apply to the coincell
> (or capacitor) when charging.
> 
> Signed-off-by: Tim Bird 
> ---

Looks fine.

Reviewed-by: Andy Gross 

-- 
Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3 2/3] ARM: qcom: Add coincell charger driver

2015-07-16 Thread Tim Bird
This driver is used to configure the coincell charger found in
Qualcomm PMICs.

The driver allows configuring the current-limiting resistor for
the charger, as well as the voltage to apply to the coincell
(or capacitor) when charging.

Signed-off-by: Tim Bird 
---

Changes in v3:
 - change 'depends on' in Kconfig 
 - remove 'select REGMAP' in Kconfig
 - put spaces in map lists
 - use 'bool' type for enable variable
 - remove some printks
 - add missing braces in error handling in qcom_coincell_chgr_config
 - eliminate of_node NULL check in probe routine
 - rename driver to qcom-spmi-coincell
 - put struct qcom_coincell on stack, instead of allocating it
 - return the result of a function directly (in a few places)
 - reorder operations to avoid partial register update

 drivers/misc/Kconfig |  10 +++
 drivers/misc/Makefile|   1 +
 drivers/misc/qcom-coincell.c | 152 +++
 3 files changed, 163 insertions(+)
 create mode 100644 drivers/misc/qcom-coincell.c

diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 42c3852..c29 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -271,6 +271,16 @@ config HP_ILO
  To compile this driver as a module, choose M here: the
  module will be called hpilo.
 
+config QCOM_COINCELL
+   tristate "Qualcomm coincell charger support"
+   depends on MFD_SPMI_PMIC || COMPILE_TEST
+   help
+ This driver supports the coincell block found inside of
+ Qualcomm PMICs.  The coincell charger provides a means to
+ charge a coincell battery or backup capacitor which is used
+ to maintain PMIC register and RTC state in the absence of
+ external power.
+
 config SGI_GRU
tristate "SGI GRU driver"
depends on X86_UV && SMP
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index d056fb7..537d7f3 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -18,6 +18,7 @@ obj-$(CONFIG_LKDTM)   += lkdtm.o
 obj-$(CONFIG_TIFM_CORE)+= tifm_core.o
 obj-$(CONFIG_TIFM_7XX1)+= tifm_7xx1.o
 obj-$(CONFIG_PHANTOM)  += phantom.o
+obj-$(CONFIG_QCOM_COINCELL)+= qcom-coincell.o
 obj-$(CONFIG_SENSORS_BH1780)   += bh1780gli.o
 obj-$(CONFIG_SENSORS_BH1770)   += bh1770glc.o
 obj-$(CONFIG_SENSORS_APDS990X) += apds990x.o
diff --git a/drivers/misc/qcom-coincell.c b/drivers/misc/qcom-coincell.c
new file mode 100644
index 000..7b4a2da
--- /dev/null
+++ b/drivers/misc/qcom-coincell.c
@@ -0,0 +1,152 @@
+/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015, Sony Mobile Communications Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct qcom_coincell {
+   struct device   *dev;
+   struct regmap   *regmap;
+   u32 base_addr;
+};
+
+#define QCOM_COINCELL_REG_RSET 0x44
+#define QCOM_COINCELL_REG_VSET 0x45
+#define QCOM_COINCELL_REG_ENABLE   0x46
+
+#define QCOM_COINCELL_ENABLE   BIT(7)
+
+static const int qcom_rset_map[] = { 2100, 1700, 1200, 800 };
+static const int qcom_vset_map[] = { 2500, 3200, 3100, 3000 };
+/* NOTE: for pm8921 and others, voltage of 2500 is 16 (1b), not 0 */
+
+/* if enable==0, rset and vset are ignored */
+static int qcom_coincell_chgr_config(struct qcom_coincell *chgr, int rset,
+int vset, bool enable)
+{
+   int i, j, rc;
+
+   /* if disabling, just do that and skip other operations */
+   if (!enable)
+   return regmap_write(chgr->regmap,
+ chgr->base_addr + QCOM_COINCELL_REG_ENABLE, 0);
+
+   /* find index for current-limiting resistor */
+   for (i = 0; i < ARRAY_SIZE(qcom_rset_map); i++)
+   if (rset == qcom_rset_map[i])
+   break;
+
+   if (i >= ARRAY_SIZE(qcom_rset_map)) {
+   dev_err(chgr->dev, "invalid rset-ohms value %d\n", rset);
+   return -EINVAL;
+   }
+
+   /* find index for charge voltage */
+   for (j = 0; j < ARRAY_SIZE(qcom_vset_map); j++)
+   if (vset == qcom_vset_map[j])
+   break;
+
+   if (j >= ARRAY_SIZE(qcom_vset_map)) {
+   dev_err(chgr->dev, "invalid vset-millivolts value %d\n", vset);
+   return -EINVAL;
+   }
+
+   rc = regmap_write(chgr->regmap,
+ chgr->base_addr + QCOM_COINCELL_REG_RSET, i);
+   if (rc) {
+