Re: [U-Boot] [PATCH v6 2/6] power: pmic: Palmas: Add the base pmic support

2016-10-10 Thread Simon Glass
On 29 September 2016 at 21:50, Keerthy  wrote:
> Add support to bind the regulators/child nodes with the pmic.
> Also adds the pmic i2c based read/write funtions to access pmic
> registers.
>
> Signed-off-by: Keerthy 
> Reviewed-by: Simon Glass 
> Reviewed-by: Tom Rini 
> ---
> Changes in v6:
>
>   * Used dm_i2c_write and dm_i2c_read in place of dm_i2c_reg_write
> dm_i2c_reg_read respectively.
>
> Changes in v5:
>
>   * Added pmic read/write functions.
>
>  drivers/power/pmic/Kconfig  |   7 +++
>  drivers/power/pmic/Makefile |   1 +
>  drivers/power/pmic/palmas.c | 104 
> 
>  include/power/palmas.h  |  25 +++
>  4 files changed, 137 insertions(+)
>  create mode 100644 drivers/power/pmic/palmas.c
>  create mode 100644 include/power/palmas.h

Applied to u-boot-dm, thanks!
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


[U-Boot] [PATCH v6 2/6] power: pmic: Palmas: Add the base pmic support

2016-09-29 Thread Keerthy
Add support to bind the regulators/child nodes with the pmic.
Also adds the pmic i2c based read/write funtions to access pmic
registers.

Signed-off-by: Keerthy 
Reviewed-by: Simon Glass 
Reviewed-by: Tom Rini 
---
Changes in v6:

  * Used dm_i2c_write and dm_i2c_read in place of dm_i2c_reg_write
dm_i2c_reg_read respectively.

Changes in v5:

  * Added pmic read/write functions.

 drivers/power/pmic/Kconfig  |   7 +++
 drivers/power/pmic/Makefile |   1 +
 drivers/power/pmic/palmas.c | 104 
 include/power/palmas.h  |  25 +++
 4 files changed, 137 insertions(+)
 create mode 100644 drivers/power/pmic/palmas.c
 create mode 100644 include/power/palmas.h

diff --git a/drivers/power/pmic/Kconfig b/drivers/power/pmic/Kconfig
index 69f8d51..92931c5 100644
--- a/drivers/power/pmic/Kconfig
+++ b/drivers/power/pmic/Kconfig
@@ -135,3 +135,10 @@ config PMIC_TPS65090
FETs and a battery charger. This driver provides register access
only, and you can enable the regulator/charger drivers separately if
required.
+
+config PMIC_PALMAS
+   bool "Enable driver for Texas Instruments PALMAS PMIC"
+   depends on DM_PMIC
+   ---help---
+   The PALMAS is a PMIC containing several LDOs, SMPS.
+   This driver binds the pmic children.
diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile
index 52b4f71..828c0cf 100644
--- a/drivers/power/pmic/Makefile
+++ b/drivers/power/pmic/Makefile
@@ -15,6 +15,7 @@ obj-$(CONFIG_PMIC_PM8916) += pm8916.o
 obj-$(CONFIG_PMIC_RK808) += rk808.o
 obj-$(CONFIG_PMIC_TPS65090) += tps65090.o
 obj-$(CONFIG_PMIC_S5M8767) += s5m8767.o
+obj-$(CONFIG_$(SPL_)PMIC_PALMAS) += palmas.o
 
 obj-$(CONFIG_POWER_LTC3676) += pmic_ltc3676.o
 obj-$(CONFIG_POWER_MAX77696) += pmic_max77696.o
diff --git a/drivers/power/pmic/palmas.c b/drivers/power/pmic/palmas.c
new file mode 100644
index 000..6c79a93
--- /dev/null
+++ b/drivers/power/pmic/palmas.c
@@ -0,0 +1,104 @@
+/*
+ * (C) Copyright 2016 Texas Instruments Incorporated, 
+ * Keerthy 
+ *
+ * SPDX-License-Identifier:GPL-2.0+
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static const struct pmic_child_info pmic_children_info[] = {
+   { .prefix = "ldo", .driver = PALMAS_LDO_DRIVER },
+   { .prefix = "smps", .driver = PALMAS_SMPS_DRIVER },
+   { },
+};
+
+static int palmas_write(struct udevice *dev, uint reg, const uint8_t *buff,
+ int len)
+{
+   if (dm_i2c_write(dev, reg, buff, len)) {
+   error("write error to device: %p register: %#x!", dev, reg);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+static int palmas_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
+{
+   if (dm_i2c_read(dev, reg, buff, len)) {
+   error("read error from device: %p register: %#x!", dev, reg);
+   return -EIO;
+   }
+
+   return 0;
+}
+
+static int palmas_bind(struct udevice *dev)
+{
+   int pmic_node = -1, regulators_node;
+   const void *blob = gd->fdt_blob;
+   int children;
+   int node = dev->of_offset;
+   int subnode, len;
+
+   fdt_for_each_subnode(blob, subnode, node) {
+   const char *name;
+   char *temp;
+
+   name = fdt_get_name(blob, subnode, );
+   temp = strstr(name, "pmic");
+   if (temp) {
+   pmic_node = subnode;
+   break;
+   }
+   }
+
+   if (pmic_node <= 0) {
+   debug("%s: %s pmic subnode not found!", __func__, dev->name);
+   return -ENXIO;
+   }
+
+   regulators_node = fdt_subnode_offset(blob, pmic_node, "regulators");
+
+   if (regulators_node <= 0) {
+   debug("%s: %s reg subnode not found!", __func__, dev->name);
+   return -ENXIO;
+   }
+
+   children = pmic_bind_children(dev, regulators_node, pmic_children_info);
+   if (!children)
+   debug("%s: %s - no child found\n", __func__, dev->name);
+
+   /* Always return success for this device */
+   return 0;
+}
+
+static struct dm_pmic_ops palmas_ops = {
+   .read = palmas_read,
+   .write = palmas_write,
+};
+
+static const struct udevice_id palmas_ids[] = {
+   { .compatible = "ti,tps659038", .data = TPS659038 },
+   { .compatible = "ti,tps65917" , .data = TPS65917 },
+   { }
+};
+
+U_BOOT_DRIVER(pmic_palmas) = {
+   .name = "palmas_pmic",
+   .id = UCLASS_PMIC,
+   .of_match = palmas_ids,
+   .bind = palmas_bind,
+   .ops = _ops,
+};
diff --git a/include/power/palmas.h b/include/power/palmas.h
new file mode 100644
index 000..bad5a35
--- /dev/null
+++ b/include/power/palmas.h
@@ -0,0 +1,25 @@
+#definePALMAS  0x0
+#define