All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v2 0/2] power: pmic: Add support for LP87565 family of PMICs
@ 2017-06-07  4:08 Keerthy
  2017-06-07  4:08 ` [U-Boot] [PATCH v2 1/2] power: pmic: lp87565: Add the basic pmic support Keerthy
  2017-06-07  4:08 ` [U-Boot] [PATCH v2 2/2] power: regulator: lp87565: add regulator support Keerthy
  0 siblings, 2 replies; 5+ messages in thread
From: Keerthy @ 2017-06-07  4:08 UTC (permalink / raw)
  To: u-boot

The series adds support for LP87565 family of PMICs.
Implements functions to configure regulators. Enable/Disable
Get/Set voltages of regulators. 

Keerthy (2):
  power: pmic: lp87565: Add the basic pmic support
  power: regulator: lp87565: add regulator support

 drivers/power/pmic/Kconfig                  |   7 +
 drivers/power/pmic/Makefile                 |   1 +
 drivers/power/pmic/lp87565.c                |  85 ++++++++++++
 drivers/power/regulator/Kconfig             |  10 ++
 drivers/power/regulator/Makefile            |   1 +
 drivers/power/regulator/lp87565_regulator.c | 199 ++++++++++++++++++++++++++++
 include/power/lp87565.h                     |  12 ++
 7 files changed, 315 insertions(+)
 create mode 100644 drivers/power/pmic/lp87565.c
 create mode 100644 drivers/power/regulator/lp87565_regulator.c
 create mode 100644 include/power/lp87565.h

-- 
1.9.1

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [U-Boot] [PATCH v2 1/2] power: pmic: lp87565: Add the basic pmic support
  2017-06-07  4:08 [U-Boot] [PATCH v2 0/2] power: pmic: Add support for LP87565 family of PMICs Keerthy
@ 2017-06-07  4:08 ` Keerthy
  2017-06-07 12:58   ` Jaehoon Chung
  2017-06-07  4:08 ` [U-Boot] [PATCH v2 2/2] power: regulator: lp87565: add regulator support Keerthy
  1 sibling, 1 reply; 5+ messages in thread
From: Keerthy @ 2017-06-07  4:08 UTC (permalink / raw)
  To: u-boot

Add support to bind the regulators/child nodes with the pmic.

Signed-off-by: Keerthy <j-keerthy@ti.com>
---

Changes in v2:

  * Used dev_read_subnode function to fetch the regulators node.
 
 drivers/power/pmic/Kconfig   |  7 ++++
 drivers/power/pmic/Makefile  |  1 +
 drivers/power/pmic/lp87565.c | 85 ++++++++++++++++++++++++++++++++++++++++++++
 include/power/lp87565.h      | 12 +++++++
 4 files changed, 105 insertions(+)
 create mode 100644 drivers/power/pmic/lp87565.c
 create mode 100644 include/power/lp87565.h

diff --git a/drivers/power/pmic/Kconfig b/drivers/power/pmic/Kconfig
index 3f50c12..e3f9e4d 100644
--- a/drivers/power/pmic/Kconfig
+++ b/drivers/power/pmic/Kconfig
@@ -188,6 +188,13 @@ config PMIC_LP873X
 	The LP873X is a PMIC containing couple of LDOs and couple of SMPS.
 	This driver binds the pmic children.
 
+config PMIC_LP87565
+	bool "Enable driver for Texas Instruments LP87565 PMIC"
+	depends on DM_PMIC
+	---help---
+	The LP87565 is a PMIC containing a bunch of SMPS.
+	This driver binds the pmic children.
+
 config POWER_MC34VR500
 	bool "Enable driver for Freescale MC34VR500 PMIC"
 	---help---
diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile
index f409e3a..f488799 100644
--- a/drivers/power/pmic/Makefile
+++ b/drivers/power/pmic/Makefile
@@ -21,6 +21,7 @@ obj-$(CONFIG_PMIC_TPS65090) += tps65090.o
 obj-$(CONFIG_PMIC_S5M8767) += s5m8767.o
 obj-$(CONFIG_$(SPL_)PMIC_PALMAS) += palmas.o
 obj-$(CONFIG_$(SPL_)PMIC_LP873X) += lp873x.o
+obj-$(CONFIG_$(SPL_)PMIC_LP87565) += lp87565.o
 
 obj-$(CONFIG_POWER_LTC3676) += pmic_ltc3676.o
 obj-$(CONFIG_POWER_MAX77696) += pmic_max77696.o
diff --git a/drivers/power/pmic/lp87565.c b/drivers/power/pmic/lp87565.c
new file mode 100644
index 0000000..9803bf9
--- /dev/null
+++ b/drivers/power/pmic/lp87565.c
@@ -0,0 +1,85 @@
+/*
+ * (C) Copyright 2017 Texas Instruments Incorporated, <www.ti.com>
+ * Keerthy <j-keerthy@ti.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <fdtdec.h>
+#include <errno.h>
+#include <dm.h>
+#include <i2c.h>
+#include <power/pmic.h>
+#include <power/regulator.h>
+#include <power/lp87565.h>
+#include <dm/device.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static const struct pmic_child_info pmic_children_info[] = {
+	{ .prefix = "buck", .driver = LP87565_BUCK_DRIVER },
+	{ },
+};
+
+static int lp87565_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 lp87565_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 lp87565_bind(struct udevice *dev)
+{
+	ofnode regulators_node;
+	int children;
+
+	regulators_node = dev_read_subnode(dev, "regulators");
+	if (!ofnode_valid(regulators_node)) {
+		debug("%s: %s regulators subnode not found!", __func__,
+		      dev->name);
+		return -ENXIO;
+	}
+
+	debug("%s: '%s' - found regulators subnode\n", __func__, dev->name);
+
+	children = pmic_bind_children(dev, regulators_node, pmic_children_info);
+	if (!children)
+		printf("%s: %s - no child found\n", __func__, dev->name);
+
+	/* Always return success for this device */
+	return 0;
+}
+
+static struct dm_pmic_ops lp87565_ops = {
+	.read = lp87565_read,
+	.write = lp87565_write,
+};
+
+static const struct udevice_id lp87565_ids[] = {
+	{ .compatible = "ti,lp87565", .data = LP87565 },
+	{ .compatible = "ti,lp87565-q1", .data = LP87565_Q1 },
+	{ }
+};
+
+U_BOOT_DRIVER(pmic_lp87565) = {
+	.name = "lp87565_pmic",
+	.id = UCLASS_PMIC,
+	.of_match = lp87565_ids,
+	.bind = lp87565_bind,
+	.ops = &lp87565_ops,
+};
diff --git a/include/power/lp87565.h b/include/power/lp87565.h
new file mode 100644
index 0000000..5160f5d
--- /dev/null
+++ b/include/power/lp87565.h
@@ -0,0 +1,12 @@
+#define LP87565	0x0
+#define LP87565_Q1	0x1
+
+#define LP87565_BUCK_NUM		6
+
+/* Drivers name */
+#define LP87565_BUCK_DRIVER	"lp87565_buck"
+
+#define LP87565_BUCK_VOLT_MASK		0xFF
+#define LP87565_BUCK_VOLT_MAX_HEX	0xFF
+#define LP87565_BUCK_VOLT_MAX		3360000
+#define LP87565_BUCK_MODE_MASK		0x80
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [U-Boot] [PATCH v2 2/2] power: regulator: lp87565: add regulator support
  2017-06-07  4:08 [U-Boot] [PATCH v2 0/2] power: pmic: Add support for LP87565 family of PMICs Keerthy
  2017-06-07  4:08 ` [U-Boot] [PATCH v2 1/2] power: pmic: lp87565: Add the basic pmic support Keerthy
@ 2017-06-07  4:08 ` Keerthy
  1 sibling, 0 replies; 5+ messages in thread
From: Keerthy @ 2017-06-07  4:08 UTC (permalink / raw)
  To: u-boot

The driver provides regulator set/get voltage
enable/disable functions for lp87565 family of PMICs.

Signed-off-by: Keerthy <j-keerthy@ti.com>
---

Changes in v2:

  * updated Kconfig description.
  * Used -EINVAL instead of hardcoded -1.
  * removed couple of unwanted braces.
  * Changed volt2hex to volt2val and hex2volt to val2volt.

 drivers/power/regulator/Kconfig             |  10 ++
 drivers/power/regulator/Makefile            |   1 +
 drivers/power/regulator/lp87565_regulator.c | 199 ++++++++++++++++++++++++++++
 3 files changed, 210 insertions(+)
 create mode 100644 drivers/power/regulator/lp87565_regulator.c

diff --git a/drivers/power/regulator/Kconfig b/drivers/power/regulator/Kconfig
index ef057e0..f213487 100644
--- a/drivers/power/regulator/Kconfig
+++ b/drivers/power/regulator/Kconfig
@@ -149,3 +149,13 @@ config DM_REGULATOR_LP873X
 	This enables implementation of driver-model regulator uclass
 	features for REGULATOR LP873X and the family of LP873X PMICs.
 	The driver implements get/set api for: value and enable.
+
+config DM_REGULATOR_LP87565
+	bool "Enable driver for LP87565 PMIC regulators"
+        depends on PMIC_LP87565
+	---help---
+	This enables implementation of driver-model regulator uclass
+	features for REGULATOR LP87565 and the family of LP87565 PMICs.
+	LP87565 series of PMICs have 4 single phase BUCKs that can also
+	be configured in multi phase modes. The driver implements
+	get/set api for value and enable.
diff --git a/drivers/power/regulator/Makefile b/drivers/power/regulator/Makefile
index 3e01021..ce14d08 100644
--- a/drivers/power/regulator/Makefile
+++ b/drivers/power/regulator/Makefile
@@ -18,3 +18,4 @@ obj-$(CONFIG_DM_REGULATOR_SANDBOX) += sandbox.o
 obj-$(CONFIG_REGULATOR_TPS65090) += tps65090_regulator.o
 obj-$(CONFIG_$(SPL_)DM_REGULATOR_PALMAS) += palmas_regulator.o
 obj-$(CONFIG_$(SPL_)DM_REGULATOR_LP873X) += lp873x_regulator.o
+obj-$(CONFIG_$(SPL_)DM_REGULATOR_LP87565) += lp87565_regulator.o
diff --git a/drivers/power/regulator/lp87565_regulator.c b/drivers/power/regulator/lp87565_regulator.c
new file mode 100644
index 0000000..3811396
--- /dev/null
+++ b/drivers/power/regulator/lp87565_regulator.c
@@ -0,0 +1,199 @@
+/*
+ * (C) Copyright 2017
+ * Texas Instruments Incorporated, <www.ti.com>
+ *
+ * Keerthy <j-keerthy@ti.com>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <fdtdec.h>
+#include <errno.h>
+#include <dm.h>
+#include <i2c.h>
+#include <power/pmic.h>
+#include <power/regulator.h>
+#include <power/lp87565.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static const char lp87565_buck_ctrl1[LP87565_BUCK_NUM] = {0x2, 0x4, 0x6, 0x8, 0x2, 0x6};
+static const char lp87565_buck_vout[LP87565_BUCK_NUM] = {0xA, 0xC, 0xE, 0x10, 0xA, 0xE };
+
+static int lp87565_buck_enable(struct udevice *dev, int op, bool *enable)
+{
+	int ret;
+	unsigned int adr;
+	struct dm_regulator_uclass_platdata *uc_pdata;
+
+	uc_pdata = dev_get_uclass_platdata(dev);
+	adr = uc_pdata->ctrl_reg;
+
+	ret = pmic_reg_read(dev->parent, adr);
+	if (ret < 0)
+		return ret;
+
+	if (op == PMIC_OP_GET) {
+		ret &= LP87565_BUCK_MODE_MASK;
+
+		if (ret)
+			*enable = true;
+		else
+			*enable = false;
+
+		return 0;
+	} else if (op == PMIC_OP_SET) {
+		if (*enable)
+			ret |= LP87565_BUCK_MODE_MASK;
+		else
+			ret &= ~LP87565_BUCK_MODE_MASK;
+		ret = pmic_reg_write(dev->parent, adr, ret);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
+static int lp87565_buck_volt2val(int uV)
+{
+	if (uV > LP87565_BUCK_VOLT_MAX)
+		return -EINVAL;
+	else if (uV > 1400000)
+		return (uV - 1420000) / 20000 + 0x9E;
+	else if (uV > 730000)
+		return (uV - 735000) / 5000 + 0x18;
+	else if (uV >= 500000)
+		return (uV - 500000) / 10000;
+	else
+		return -EINVAL;
+}
+
+static int lp87565_buck_val2volt(int val)
+{
+	if (val > LP87565_BUCK_VOLT_MAX_HEX)
+		return -EINVAL;
+	else if (val > 0x9D)
+		return 1400000 + (val - 0x9D) * 20000;
+	else if (val > 0x17)
+		return 730000 + (val - 0x17) * 5000;
+	else if (val >= 0x0)
+		return 500000 + val * 10000;
+	else
+		return -EINVAL;
+}
+
+static int lp87565_buck_val(struct udevice *dev, int op, int *uV)
+{
+	unsigned int hex, adr;
+	int ret;
+	struct dm_regulator_uclass_platdata *uc_pdata;
+
+	uc_pdata = dev_get_uclass_platdata(dev);
+
+	if (op == PMIC_OP_GET)
+		*uV = 0;
+
+	adr = uc_pdata->volt_reg;
+
+	ret = pmic_reg_read(dev->parent, adr);
+	if (ret < 0)
+		return ret;
+
+	if (op == PMIC_OP_GET) {
+		ret &= LP87565_BUCK_VOLT_MASK;
+		ret = lp87565_buck_val2volt(ret);
+		if (ret < 0)
+			return ret;
+		*uV = ret;
+
+		return 0;
+	}
+
+	hex = lp87565_buck_volt2val(*uV);
+	if (hex < 0)
+		return hex;
+
+	ret &= 0x0;
+	ret = hex;
+
+	ret = pmic_reg_write(dev->parent, adr, ret);
+
+	return ret;
+}
+
+static int lp87565_buck_probe(struct udevice *dev)
+{
+	struct dm_regulator_uclass_platdata *uc_pdata;
+	int idx;
+
+	uc_pdata = dev_get_uclass_platdata(dev);
+	uc_pdata->type = REGULATOR_TYPE_BUCK;
+
+	idx = dev->driver_data;
+	if (idx == 0 || idx == 1 || idx == 2 || idx == 3) {
+		debug("Single phase regulator\n");
+	} else if (idx == 23) {
+		idx = 5;
+	} else if (idx == 10) {
+		idx = 4;
+	} else {
+		printf("Wrong ID for regulator\n");
+		return -EINVAL;
+	}
+
+	uc_pdata->ctrl_reg = lp87565_buck_ctrl1[idx];
+	uc_pdata->volt_reg = lp87565_buck_vout[idx];
+
+	return 0;
+}
+
+static int buck_get_value(struct udevice *dev)
+{
+	int uV;
+	int ret;
+
+	ret = lp87565_buck_val(dev, PMIC_OP_GET, &uV);
+	if (ret)
+		return ret;
+
+	return uV;
+}
+
+static int buck_set_value(struct udevice *dev, int uV)
+{
+	return lp87565_buck_val(dev, PMIC_OP_SET, &uV);
+}
+
+static bool buck_get_enable(struct udevice *dev)
+{
+	bool enable = false;
+	int ret;
+
+
+	ret = lp87565_buck_enable(dev, PMIC_OP_GET, &enable);
+	if (ret)
+		return ret;
+
+	return enable;
+}
+
+static int buck_set_enable(struct udevice *dev, bool enable)
+{
+	return lp87565_buck_enable(dev, PMIC_OP_SET, &enable);
+}
+
+static const struct dm_regulator_ops lp87565_buck_ops = {
+	.get_value  = buck_get_value,
+	.set_value  = buck_set_value,
+	.get_enable = buck_get_enable,
+	.set_enable = buck_set_enable,
+};
+
+U_BOOT_DRIVER(lp87565_buck) = {
+	.name = LP87565_BUCK_DRIVER,
+	.id = UCLASS_REGULATOR,
+	.ops = &lp87565_buck_ops,
+	.probe = lp87565_buck_probe,
+};
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [U-Boot] [PATCH v2 1/2] power: pmic: lp87565: Add the basic pmic support
  2017-06-07  4:08 ` [U-Boot] [PATCH v2 1/2] power: pmic: lp87565: Add the basic pmic support Keerthy
@ 2017-06-07 12:58   ` Jaehoon Chung
  2017-06-07 13:26     ` Keerthy
  0 siblings, 1 reply; 5+ messages in thread
From: Jaehoon Chung @ 2017-06-07 12:58 UTC (permalink / raw)
  To: u-boot

Hi Keerthy,

On 06/07/2017 01:08 PM, Keerthy wrote:
> Add support to bind the regulators/child nodes with the pmic.
> 
> Signed-off-by: Keerthy <j-keerthy@ti.com>
> ---
> 
> Changes in v2:
> 
>   * Used dev_read_subnode function to fetch the regulators node.
>  
>  drivers/power/pmic/Kconfig   |  7 ++++
>  drivers/power/pmic/Makefile  |  1 +
>  drivers/power/pmic/lp87565.c | 85 ++++++++++++++++++++++++++++++++++++++++++++
>  include/power/lp87565.h      | 12 +++++++
>  4 files changed, 105 insertions(+)
>  create mode 100644 drivers/power/pmic/lp87565.c
>  create mode 100644 include/power/lp87565.h
> 
> diff --git a/drivers/power/pmic/Kconfig b/drivers/power/pmic/Kconfig
> index 3f50c12..e3f9e4d 100644
> --- a/drivers/power/pmic/Kconfig
> +++ b/drivers/power/pmic/Kconfig
> @@ -188,6 +188,13 @@ config PMIC_LP873X
>  	The LP873X is a PMIC containing couple of LDOs and couple of SMPS.
>  	This driver binds the pmic children.
>  
> +config PMIC_LP87565
> +	bool "Enable driver for Texas Instruments LP87565 PMIC"
> +	depends on DM_PMIC
> +	---help---
> +	The LP87565 is a PMIC containing a bunch of SMPS.
> +	This driver binds the pmic children.
> +
>  config POWER_MC34VR500
>  	bool "Enable driver for Freescale MC34VR500 PMIC"
>  	---help---
> diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile
> index f409e3a..f488799 100644
> --- a/drivers/power/pmic/Makefile
> +++ b/drivers/power/pmic/Makefile
> @@ -21,6 +21,7 @@ obj-$(CONFIG_PMIC_TPS65090) += tps65090.o
>  obj-$(CONFIG_PMIC_S5M8767) += s5m8767.o
>  obj-$(CONFIG_$(SPL_)PMIC_PALMAS) += palmas.o
>  obj-$(CONFIG_$(SPL_)PMIC_LP873X) += lp873x.o
> +obj-$(CONFIG_$(SPL_)PMIC_LP87565) += lp87565.o
>  
>  obj-$(CONFIG_POWER_LTC3676) += pmic_ltc3676.o
>  obj-$(CONFIG_POWER_MAX77696) += pmic_max77696.o
> diff --git a/drivers/power/pmic/lp87565.c b/drivers/power/pmic/lp87565.c
> new file mode 100644
> index 0000000..9803bf9
> --- /dev/null
> +++ b/drivers/power/pmic/lp87565.c
> @@ -0,0 +1,85 @@
> +/*
> + * (C) Copyright 2017 Texas Instruments Incorporated, <www.ti.com>
> + * Keerthy <j-keerthy@ti.com>
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <fdtdec.h>
> +#include <errno.h>
> +#include <dm.h>
> +#include <i2c.h>
> +#include <power/pmic.h>
> +#include <power/regulator.h>
> +#include <power/lp87565.h>
> +#include <dm/device.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +static const struct pmic_child_info pmic_children_info[] = {
> +	{ .prefix = "buck", .driver = LP87565_BUCK_DRIVER },
> +	{ },
> +};
> +
> +static int lp87565_write(struct udevice *dev, uint reg, const uint8_t *buff,
> +			  int len)
> +{
> +	if (dm_i2c_write(dev, reg, buff, len)) {


I think you referred to the other file.. :)

dm_i2c_write() can be returned the other error number..
I think the below code is better than now..I will modify the other files like below

ret = dm_i2c_read()
if (ret)
	error();

return ret;

> +		error("write error to device: %p register: %#x!", dev, reg);
> +		return -EIO;
> +	}
> +
> +	return 0;
> +}
> +
> +static int lp87565_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 lp87565_bind(struct udevice *dev)
> +{
> +	ofnode regulators_node;
> +	int children;
> +
> +	regulators_node = dev_read_subnode(dev, "regulators");
> +	if (!ofnode_valid(regulators_node)) {
> +		debug("%s: %s regulators subnode not found!", __func__,
> +		      dev->name);
> +		return -ENXIO;
> +	}
> +
> +	debug("%s: '%s' - found regulators subnode\n", __func__, dev->name);
> +
> +	children = pmic_bind_children(dev, regulators_node, pmic_children_info);
> +	if (!children)
> +		printf("%s: %s - no child found\n", __func__, dev->name);
> +
> +	/* Always return success for this device */
> +	return 0;
> +}
> +
> +static struct dm_pmic_ops lp87565_ops = {
> +	.read = lp87565_read,
> +	.write = lp87565_write,
> +};
> +
> +static const struct udevice_id lp87565_ids[] = {
> +	{ .compatible = "ti,lp87565", .data = LP87565 },
> +	{ .compatible = "ti,lp87565-q1", .data = LP87565_Q1 },
> +	{ }
> +};
> +
> +U_BOOT_DRIVER(pmic_lp87565) = {
> +	.name = "lp87565_pmic",
> +	.id = UCLASS_PMIC,
> +	.of_match = lp87565_ids,
> +	.bind = lp87565_bind,
> +	.ops = &lp87565_ops,
> +};
> diff --git a/include/power/lp87565.h b/include/power/lp87565.h
> new file mode 100644
> index 0000000..5160f5d
> --- /dev/null
> +++ b/include/power/lp87565.h
> @@ -0,0 +1,12 @@
> +#define LP87565	0x0
> +#define LP87565_Q1	0x1
> +
> +#define LP87565_BUCK_NUM		6
> +
> +/* Drivers name */
> +#define LP87565_BUCK_DRIVER	"lp87565_buck"
> +
> +#define LP87565_BUCK_VOLT_MASK		0xFF
> +#define LP87565_BUCK_VOLT_MAX_HEX	0xFF
> +#define LP87565_BUCK_VOLT_MAX		3360000
> +#define LP87565_BUCK_MODE_MASK		0x80
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [U-Boot] [PATCH v2 1/2] power: pmic: lp87565: Add the basic pmic support
  2017-06-07 12:58   ` Jaehoon Chung
@ 2017-06-07 13:26     ` Keerthy
  0 siblings, 0 replies; 5+ messages in thread
From: Keerthy @ 2017-06-07 13:26 UTC (permalink / raw)
  To: u-boot



On Wednesday 07 June 2017 06:28 PM, Jaehoon Chung wrote:
> Hi Keerthy,
> 
> On 06/07/2017 01:08 PM, Keerthy wrote:
>> Add support to bind the regulators/child nodes with the pmic.
>>
>> Signed-off-by: Keerthy <j-keerthy@ti.com>
>> ---
>>
>> Changes in v2:
>>
>>   * Used dev_read_subnode function to fetch the regulators node.
>>  
>>  drivers/power/pmic/Kconfig   |  7 ++++
>>  drivers/power/pmic/Makefile  |  1 +
>>  drivers/power/pmic/lp87565.c | 85 ++++++++++++++++++++++++++++++++++++++++++++
>>  include/power/lp87565.h      | 12 +++++++
>>  4 files changed, 105 insertions(+)
>>  create mode 100644 drivers/power/pmic/lp87565.c
>>  create mode 100644 include/power/lp87565.h
>>
>> diff --git a/drivers/power/pmic/Kconfig b/drivers/power/pmic/Kconfig
>> index 3f50c12..e3f9e4d 100644
>> --- a/drivers/power/pmic/Kconfig
>> +++ b/drivers/power/pmic/Kconfig
>> @@ -188,6 +188,13 @@ config PMIC_LP873X
>>  	The LP873X is a PMIC containing couple of LDOs and couple of SMPS.
>>  	This driver binds the pmic children.
>>  
>> +config PMIC_LP87565
>> +	bool "Enable driver for Texas Instruments LP87565 PMIC"
>> +	depends on DM_PMIC
>> +	---help---
>> +	The LP87565 is a PMIC containing a bunch of SMPS.
>> +	This driver binds the pmic children.
>> +
>>  config POWER_MC34VR500
>>  	bool "Enable driver for Freescale MC34VR500 PMIC"
>>  	---help---
>> diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile
>> index f409e3a..f488799 100644
>> --- a/drivers/power/pmic/Makefile
>> +++ b/drivers/power/pmic/Makefile
>> @@ -21,6 +21,7 @@ obj-$(CONFIG_PMIC_TPS65090) += tps65090.o
>>  obj-$(CONFIG_PMIC_S5M8767) += s5m8767.o
>>  obj-$(CONFIG_$(SPL_)PMIC_PALMAS) += palmas.o
>>  obj-$(CONFIG_$(SPL_)PMIC_LP873X) += lp873x.o
>> +obj-$(CONFIG_$(SPL_)PMIC_LP87565) += lp87565.o
>>  
>>  obj-$(CONFIG_POWER_LTC3676) += pmic_ltc3676.o
>>  obj-$(CONFIG_POWER_MAX77696) += pmic_max77696.o
>> diff --git a/drivers/power/pmic/lp87565.c b/drivers/power/pmic/lp87565.c
>> new file mode 100644
>> index 0000000..9803bf9
>> --- /dev/null
>> +++ b/drivers/power/pmic/lp87565.c
>> @@ -0,0 +1,85 @@
>> +/*
>> + * (C) Copyright 2017 Texas Instruments Incorporated, <www.ti.com>
>> + * Keerthy <j-keerthy@ti.com>
>> + *
>> + * SPDX-License-Identifier:	GPL-2.0+
>> + */
>> +
>> +#include <common.h>
>> +#include <fdtdec.h>
>> +#include <errno.h>
>> +#include <dm.h>
>> +#include <i2c.h>
>> +#include <power/pmic.h>
>> +#include <power/regulator.h>
>> +#include <power/lp87565.h>
>> +#include <dm/device.h>
>> +
>> +DECLARE_GLOBAL_DATA_PTR;
>> +
>> +static const struct pmic_child_info pmic_children_info[] = {
>> +	{ .prefix = "buck", .driver = LP87565_BUCK_DRIVER },
>> +	{ },
>> +};
>> +
>> +static int lp87565_write(struct udevice *dev, uint reg, const uint8_t *buff,
>> +			  int len)
>> +{
>> +	if (dm_i2c_write(dev, reg, buff, len)) {
> 
> 
> I think you referred to the other file.. :)
> 
> dm_i2c_write() can be returned the other error number..
> I think the below code is better than now..I will modify the other files like below
> 
> ret = dm_i2c_read()
> if (ret)
> 	error();
> 
> return ret;

Jaehoon,

yes makes sense. So both dm_i2c_write and dm_i2c_read can return
different values. I will change like how you have suggested and post v3.

Thanks,
Keerthy

> 
>> +		error("write error to device: %p register: %#x!", dev, reg);
>> +		return -EIO;
>> +	}
>> +
>> +	return 0;
>> +}
>> +
>> +static int lp87565_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 lp87565_bind(struct udevice *dev)
>> +{
>> +	ofnode regulators_node;
>> +	int children;
>> +
>> +	regulators_node = dev_read_subnode(dev, "regulators");
>> +	if (!ofnode_valid(regulators_node)) {
>> +		debug("%s: %s regulators subnode not found!", __func__,
>> +		      dev->name);
>> +		return -ENXIO;
>> +	}
>> +
>> +	debug("%s: '%s' - found regulators subnode\n", __func__, dev->name);
>> +
>> +	children = pmic_bind_children(dev, regulators_node, pmic_children_info);
>> +	if (!children)
>> +		printf("%s: %s - no child found\n", __func__, dev->name);
>> +
>> +	/* Always return success for this device */
>> +	return 0;
>> +}
>> +
>> +static struct dm_pmic_ops lp87565_ops = {
>> +	.read = lp87565_read,
>> +	.write = lp87565_write,
>> +};
>> +
>> +static const struct udevice_id lp87565_ids[] = {
>> +	{ .compatible = "ti,lp87565", .data = LP87565 },
>> +	{ .compatible = "ti,lp87565-q1", .data = LP87565_Q1 },
>> +	{ }
>> +};
>> +
>> +U_BOOT_DRIVER(pmic_lp87565) = {
>> +	.name = "lp87565_pmic",
>> +	.id = UCLASS_PMIC,
>> +	.of_match = lp87565_ids,
>> +	.bind = lp87565_bind,
>> +	.ops = &lp87565_ops,
>> +};
>> diff --git a/include/power/lp87565.h b/include/power/lp87565.h
>> new file mode 100644
>> index 0000000..5160f5d
>> --- /dev/null
>> +++ b/include/power/lp87565.h
>> @@ -0,0 +1,12 @@
>> +#define LP87565	0x0
>> +#define LP87565_Q1	0x1
>> +
>> +#define LP87565_BUCK_NUM		6
>> +
>> +/* Drivers name */
>> +#define LP87565_BUCK_DRIVER	"lp87565_buck"
>> +
>> +#define LP87565_BUCK_VOLT_MASK		0xFF
>> +#define LP87565_BUCK_VOLT_MAX_HEX	0xFF
>> +#define LP87565_BUCK_VOLT_MAX		3360000
>> +#define LP87565_BUCK_MODE_MASK		0x80
>>
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2017-06-07 13:26 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-07  4:08 [U-Boot] [PATCH v2 0/2] power: pmic: Add support for LP87565 family of PMICs Keerthy
2017-06-07  4:08 ` [U-Boot] [PATCH v2 1/2] power: pmic: lp87565: Add the basic pmic support Keerthy
2017-06-07 12:58   ` Jaehoon Chung
2017-06-07 13:26     ` Keerthy
2017-06-07  4:08 ` [U-Boot] [PATCH v2 2/2] power: regulator: lp87565: add regulator support Keerthy

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.