Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1645575 > unrolled thread

[PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support

Started byKeerthy <j-keerthy@ti.com>
First post2017-05-19 14:50 +0200
Last post2017-05-23 17:40 +0200
Articles 17 — 3 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support Keerthy <j-keerthy@ti.com> - 2017-05-19 14:50 +0200
    Re: [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support "Andrew F. Davis" <afd@ti.com> - 2017-05-19 17:50 +0200
      Re: [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support Keerthy <j-keerthy@ti.com> - 2017-05-22 06:30 +0200
        Re: [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support Keerthy <j-keerthy@ti.com> - 2017-05-23 05:10 +0200
          Re: [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support Lee Jones <lee.jones@linaro.org> - 2017-05-23 09:00 +0200
    Re: [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support Lee Jones <lee.jones@linaro.org> - 2017-05-22 19:50 +0200
      Re: [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support Keerthy <j-keerthy@ti.com> - 2017-05-23 04:40 +0200
        Re: [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support Keerthy <j-keerthy@ti.com> - 2017-05-23 05:10 +0200
        Re: [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support Lee Jones <lee.jones@linaro.org> - 2017-05-23 09:00 +0200
          Re: [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support Keerthy <j-keerthy@ti.com> - 2017-05-23 09:50 +0200
            Re: [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support Keerthy <j-keerthy@ti.com> - 2017-05-23 10:00 +0200
              Re: [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support Lee Jones <lee.jones@linaro.org> - 2017-05-23 10:50 +0200
                Re: [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support Keerthy <j-keerthy@ti.com> - 2017-05-23 12:00 +0200
            Re: [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support Lee Jones <lee.jones@linaro.org> - 2017-05-23 10:50 +0200
              Re: [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support Keerthy <j-keerthy@ti.com> - 2017-05-23 12:20 +0200
                Re: [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support Keerthy <j-keerthy@ti.com> - 2017-05-23 14:30 +0200
                Re: [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support Lee Jones <lee.jones@linaro.org> - 2017-05-23 17:40 +0200

#1645575 — [PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support

FromKeerthy <j-keerthy@ti.com>
Date2017-05-19 14:50 +0200
Subject[PATCH 1/3] mfd: lp87565: Add lp87565 PMIC support
Message-ID<tIPvY-2eo-21@gated-at.bofh.it>
The LP87565 chip is a power management IC for Portable Navigation Systems
and Tablet Computing devices. It contains the following components:

        - Configurable Bucks(Single and multi-phase).
        - Configurable General Purpose Output Signals (GPO).

The LP87565-Q1 variant device uses two 2-phase outputs configuration,
Buck0 is master for Buck0/1 output and Buck2 is master for Buck2/3
output.

Signed-off-by: Keerthy <j-keerthy@ti.com>
---
 Documentation/devicetree/bindings/mfd/lp87565.txt |  44 ++++
 drivers/mfd/Kconfig                               |  14 ++
 drivers/mfd/Makefile                              |   1 +
 drivers/mfd/lp87565.c                             | 103 ++++++++
 include/linux/mfd/lp87565.h                       | 275 ++++++++++++++++++++++
 5 files changed, 437 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mfd/lp87565.txt
 create mode 100644 drivers/mfd/lp87565.c
 create mode 100644 include/linux/mfd/lp87565.h

diff --git a/Documentation/devicetree/bindings/mfd/lp87565.txt b/Documentation/devicetree/bindings/mfd/lp87565.txt
new file mode 100644
index 0000000..38a00a1
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/lp87565.txt
@@ -0,0 +1,44 @@
+TI LP873565 PMIC MFD driver
+
+Required properties:
+  - compatible:	"ti,lp87565", "ti,lp87565-q1"
+  - reg:		I2C slave address.
+  - gpio-controller:	Marks the device node as a GPIO Controller.
+  - #gpio-cells:	Should be two.  The first cell is the pin number and
+			the second cell is used to specify flags.
+			See ../gpio/gpio.txt for more information.
+  - xxx-in-supply:	Phandle to parent supply node of each regulator
+			populated under regulators node. xxx should match
+			the supply_name populated in driver.
+  - regulators:	List of child nodes that specify the regulator
+			initialization data.
+Example:
+
+lp87565: lp87565@60 {
+	compatible = "ti,lp87565-q1";
+	reg = <0x60>;
+	gpio-controller;
+	#gpio-cells = <2>;
+
+	buck10-in-supply =<&vsys_3v3>;
+	buck23-in-supply =<&vsys_3v3>;
+	regulators: regulators {
+		buck10_reg: buck10 {
+			/*VDD_MPU*/
+			regulator-name = "buck10";
+			regulator-min-microvolt = <850000>;
+			regulator-max-microvolt = <1250000>;
+			regulator-always-on;
+			regulator-boot-on;
+		};
+
+		buck23_reg: buck23 {
+			/* VDD_GPU*/
+			regulator-name = "buck23";
+			regulator-min-microvolt = <850000>;
+			regulator-max-microvolt = <1250000>;
+			regulator-boot-on;
+			regulator-always-on;
+		};
+	};
+};
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 3eb5c93..5e884f3 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -1325,6 +1325,20 @@ config MFD_TI_LP873X
 	  This driver can also be built as a module. If so, the module
 	  will be called lp873x.
 
+config MFD_TI_LP87565
+	tristate "TI LP87565 Power Management IC"
+	depends on I2C
+	select MFD_CORE
+	select REGMAP_I2C
+	help
+	  If you say yes here then you get support for the LP87565 series of
+	  Power Management Integrated Circuits (PMIC).
+	  These include voltage regulators, thermal protection, configurable
+	  General Purpose Outputs (GPO) that are used in portable devices.
+
+	  This driver can also be built as a module. If so, the module
+	  will be called lp87565.
+
 config MFD_TPS65218
 	tristate "TI TPS65218 Power Management chips"
 	depends on I2C
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index c16bf1e..7edbe1b 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -25,6 +25,7 @@ obj-$(CONFIG_HTC_PASIC3)	+= htc-pasic3.o
 obj-$(CONFIG_HTC_I2CPLD)	+= htc-i2cpld.o
 
 obj-$(CONFIG_MFD_TI_LP873X)	+= lp873x.o
+obj-$(CONFIG_MFD_TI_LP87565)	+= lp87565.o
 
 obj-$(CONFIG_MFD_DAVINCI_VOICECODEC)	+= davinci_voicecodec.o
 obj-$(CONFIG_MFD_DM355EVM_MSP)	+= dm355evm_msp.o
diff --git a/drivers/mfd/lp87565.c b/drivers/mfd/lp87565.c
new file mode 100644
index 0000000..dff882f
--- /dev/null
+++ b/drivers/mfd/lp87565.c
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * Author: Keerthy <j-keerthy@ti.com>
+ *
+ * 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.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/interrupt.h>
+#include <linux/mfd/core.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/regmap.h>
+
+#include <linux/mfd/lp87565.h>
+
+static const struct regmap_config lp87565_regmap_config = {
+	.reg_bits = 8,
+	.val_bits = 8,
+	.max_register = LP87565_REG_MAX,
+};
+
+static const struct mfd_cell lp87565_cells[] = {
+	{ .name = "lp87565-q1-regulator", },
+	{ .name = "lp87565-q1-gpio", },
+};
+
+static const struct of_device_id of_lp87565_match_table[] = {
+	{
+		.compatible = "ti,lp87565-q1",
+		.data = (void *)LP87565_DEVICE_TYPE_LP87565_Q1,
+	},
+	{}
+};
+MODULE_DEVICE_TABLE(of, of_lp87565_match_table);
+
+static int lp87565_probe(struct i2c_client *client,
+			 const struct i2c_device_id *ids)
+{
+	struct lp87565 *lp87565;
+	const struct of_device_id *of_id;
+	int ret;
+	unsigned int otpid;
+
+	lp87565 = devm_kzalloc(&client->dev, sizeof(*lp87565), GFP_KERNEL);
+	if (!lp87565)
+		return -ENOMEM;
+
+	lp87565->dev = &client->dev;
+
+	lp87565->regmap = devm_regmap_init_i2c(client, &lp87565_regmap_config);
+	if (IS_ERR(lp87565->regmap)) {
+		ret = PTR_ERR(lp87565->regmap);
+		dev_err(lp87565->dev,
+			"Failed to initialize register map: %d\n", ret);
+		return ret;
+	}
+
+	ret = regmap_read(lp87565->regmap, LP87565_REG_OTP_REV, &otpid);
+	if (ret) {
+		dev_err(lp87565->dev, "Failed to read OTP ID\n");
+		return ret;
+	}
+
+	lp87565->rev = otpid & LP87565_OTP_REV_OTP_ID;
+	of_id = of_match_device(of_lp87565_match_table, &client->dev);
+	if (of_id)
+		lp87565->dev_type = (enum lp87565_device_type)of_id->data;
+
+	i2c_set_clientdata(client, lp87565);
+
+	ret = mfd_add_devices(lp87565->dev, PLATFORM_DEVID_AUTO, lp87565_cells,
+			      ARRAY_SIZE(lp87565_cells), NULL, 0, NULL);
+
+	return ret;
+}
+
+static const struct i2c_device_id lp87565_id_table[] = {
+	{ "lp87565-q1", 0 },
+	{ },
+};
+MODULE_DEVICE_TABLE(i2c, lp87565_id_table);
+
+static struct i2c_driver lp87565_driver = {
+	.driver	= {
+		.name	= "lp87565",
+		.of_match_table = of_lp87565_match_table,
+	},
+	.probe		= lp87565_probe,
+	.id_table	= lp87565_id_table,
+};
+module_i2c_driver(lp87565_driver);
+
+MODULE_AUTHOR("J Keerthy <j-keerthy@ti.com>");
+MODULE_DESCRIPTION("lp87565 chip family Multi-Function Device driver");
+MODULE_LICENSE("GPL v2");
diff --git a/include/linux/mfd/lp87565.h b/include/linux/mfd/lp87565.h
new file mode 100644
index 0000000..6112365
--- /dev/null
+++ b/include/linux/mfd/lp87565.h
@@ -0,0 +1,275 @@
+/*
+ * Functions to access LP87565 power management chip.
+ *
+ * Copyright (C) 2016 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * 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.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef __LINUX_MFD_LP87565_H
+#define __LINUX_MFD_LP87565_H
+
+#include <linux/i2c.h>
+#include <linux/regulator/driver.h>
+#include <linux/regulator/machine.h>
+
+enum lp87565_device_type {
+	LP87565_DEVICE_TYPE_UNKNOWN	= 0,
+	LP87565_DEVICE_TYPE_LP87565_Q1,
+};
+
+/* All register addresses */
+#define LP87565_REG_DEV_REV		0X00
+#define LP87565_REG_OTP_REV		0X01
+#define LP87565_REG_BUCK0_CTRL_1		0X02
+#define LP87565_REG_BUCK0_CTRL_2		0X03
+
+#define LP87565_REG_BUCK1_CTRL_1		0X04
+#define LP87565_REG_BUCK1_CTRL_2		0X05
+
+#define LP87565_REG_BUCK2_CTRL_1		0X06
+#define LP87565_REG_BUCK2_CTRL_2		0X07
+
+#define LP87565_REG_BUCK3_CTRL_1		0X08
+#define LP87565_REG_BUCK3_CTRL_2		0X09
+
+#define LP87565_REG_BUCK0_VOUT			0X0A
+#define LP87565_REG_BUCK0_FLOOR_VOUT		0X0B
+
+#define LP87565_REG_BUCK1_VOUT			0X0C
+#define LP87565_REG_BUCK1_FLOOR_VOUT		0X0D
+
+#define LP87565_REG_BUCK2_VOUT			0X0E
+#define LP87565_REG_BUCK2_FLOOR_VOUT		0X0F
+
+#define LP87565_REG_BUCK3_VOUT			0X10
+#define LP87565_REG_BUCK3_FLOOR_VOUT		0X11
+
+#define LP87565_REG_BUCK0_DELAY			0X12
+#define LP87565_REG_BUCK1_DELAY			0X13
+
+#define LP87565_REG_BUCK2_DELAY			0X14
+#define LP87565_REG_BUCK3_DELAY			0X15
+
+#define LP87565_REG_GPO2_DELAY			0X16
+#define LP87565_REG_GPO3_DELAY			0X17
+#define LP87565_REG_RESET			0X18
+#define LP87565_REG_CONFIG			0X19
+
+#define LP87565_REG_INT_TOP_1			0X1A
+#define LP87565_REG_INT_TOP_2			0X1B
+
+#define LP87565_REG_INT_BUCK_0_1		0X1C
+#define LP87565_REG_INT_BUCK_2_3		0X1D
+#define LP87565_REG_TOP_STAT			0X1E
+#define LP87565_REG_BUCK_0_1_STAT		0X1F
+#define LP87565_REG_BUCK_2_3_STAT		0x20
+
+#define LP87565_REG_TOP_MASK_1			0x21
+#define LP87565_REG_TOP_MASK_2			0x22
+
+#define LP87565_REG_BUCK_0_1_MASK		0x23
+#define LP87565_REG_BUCK_2_3_MASK		0x24
+#define LP87565_REG_SEL_I_LOAD			0x25
+
+#define LP87565_REG_I_LOAD_2			0x26
+#define LP87565_REG_I_LOAD_1			0x27
+
+#define LP87565_REG_PGOOD_CTRL1			0x28
+#define LP87565_REG_PGOOD_CTRL2			0x29
+#define LP87565_REG_PGOOD_FLT			0x2A
+#define LP87565_REG_PLL_CTRL			0x2B
+#define LP87565_REG_PIN_FUNCTION		0x2C
+#define LP87565_REG_GPIO_CONFIG			0x2D
+#define LP87565_REG_GPIO_IN			0x2E
+#define LP87565_REG_GPIO_OUT			0x2F
+
+#define LP87565_REG_MAX			LP87565_REG_GPIO_OUT
+
+/* Register field definitions */
+#define LP87565_DEV_REV_DEV_ID			0xC0
+#define LP87565_DEV_REV_ALL_LAYER		0x30
+#define LP87565_DEV_REV_METAL_LAYER		0x0F
+
+#define LP87565_OTP_REV_OTP_ID			0xFF
+
+#define LP87565_BUCK_CTRL_1_EN			BIT(7)
+#define LP87565_BUCK_CTRL_1_EN_PIN_CTRL		BIT(6)
+#define LP87565_BUCK_CTRL_1_PIN_SELECT_EN	0x30
+
+#define LP87565_BUCK_CTRL_1_ROOF_FLOOR_EN	BIT(3)
+#define LP87565_BUCK_CTRL_1_RDIS_EN		BIT(2)
+#define LP87565_BUCK_CTRL_1_FPWM		BIT(1)
+/* Bit0 is reserved for BUCK1 and BUCK3 and valid only for BUCK0 and BUCK2 */
+#define LP87565_BUCK_CTRL_1_FPWM_MP_0_2		BIT(0)
+
+#define LP87565_BUCK_CTRL_2_ILIM		0x38
+#define LP87565_BUCK_CTRL_2_SLEW_RATE		0x07
+
+#define LP87565_BUCK_VSET			0xFF
+#define LP87565_BUCK_FLOOR_VSET			0xFF
+
+#define LP87565_BUCK_SHUTDOWN_DELAY		0xF0
+#define LP87565_BUCK_STARTUP_DELAY		0x0F
+
+#define LP87565_GPIO_SHUTDOWN_DELAY		0xF0
+#define LP87565_GPIO_STARTUP_DELAY		0x0F
+
+#define LP87565_RESET_SW_RESET			BIT(0)
+
+#define LP87565_CONFIG_DOUBLE_DELAY		BIT(7)
+#define LP87565_CONFIG_CLKIN_PD			BIT(6)
+#define LP87565_CONFIG_EN4_PD			BIT(5)
+#define LP87565_CONFIG_EN3_PD			BIT(4)
+#define LP87565_CONFIG_TDIE_WARN_LEVEL		BIT(3)
+#define LP87565_CONFIG_EN2_PD			BIT(2)
+#define LP87565_CONFIG_EN1_PD			BIT(1)
+
+#define LP87565_INT_GPIO			BIT(7)
+#define LP87565_INT_BUCK23			BIT(6)
+#define LP87565_INT_BUCK01			BIT(5)
+#define LP87565_NO_SYNC_CLK			BIT(4)
+#define LP87565_TDIE_SD				BIT(3)
+#define LP87565_TDIE_WARN			BIT(2)
+#define LP87565_INT_OVP				BIT(1)
+#define LP87565_I_LOAD_READY			BIT(0)
+
+#define LP87565_INT_TOP2_RESET_REG		BIT(0)
+
+#define LP87565_BUCK1_PG_INT			BIT(6)
+#define LP87565_BUCK1_SC_INT			BIT(5)
+#define LP87565_BUCK1_ILIM_INT			BIT(4)
+#define LP87565_BUCK0_PG_INT			BIT(2)
+#define LP87565_BUCK0_SC_INT			BIT(1)
+#define LP87565_BUCK0_ILIM_INT			BIT(0)
+
+#define LP87565_BUCK3_PG_INT			BIT(6)
+#define LP87565_BUCK3_SC_INT			BIT(5)
+#define LP87565_BUCK3_ILIM_INT			BIT(4)
+#define LP87565_BUCK2_PG_INT			BIT(2)
+#define LP87565_BUCK2_SC_INT			BIT(1)
+#define LP87565_BUCK2_ILIM_INT			BIT(0)
+
+#define LP87565_SYNC_CLK_STAT			BIT(4)
+#define LP87565_TDIE_SD_STAT			BIT(3)
+#define LP87565_TDIE_WARN_STAT			BIT(2)
+#define LP87565_OVP_STAT			BIT(1)
+
+#define LP87565_BUCK1_STAT			BIT(7)
+#define LP87565_BUCK1_PG_STAT			BIT(6)
+#define LP87565_BUCK1_ILIM_STAT			BIT(4)
+#define LP87565_BUCK0_STAT			BIT(3)
+#define LP87565_BUCK0_PG_STAT			BIT(2)
+#define LP87565_BUCK0_ILIM_STAT			BIT(0)
+
+#define LP87565_BUCK3_STAT			BIT(7)
+#define LP87565_BUCK3_PG_STAT			BIT(6)
+#define LP87565_BUCK3_ILIM_STAT			BIT(4)
+#define LP87565_BUCK2_STAT			BIT(3)
+#define LP87565_BUCK2_PG_STAT			BIT(2)
+#define LP87565_BUCK2_ILIM_STAT			BIT(0)
+
+#define LPL87565_GPIO_MASK			BIT(7)
+#define LPL87565_SYNC_CLK_MASK			BIT(4)
+#define LPL87565_TDIE_WARN_MASK			BIT(2)
+#define LPL87565_I_LOAD_READY_MASK		BIT(0)
+
+#define LPL87565_RESET_REG_MASK			BIT(0)
+
+#define LPL87565_BUCK1_PG_MASK			BIT(6)
+#define LPL87565_BUCK1_ILIM_MASK		BIT(4)
+#define LPL87565_BUCK0_PG_MASK			BIT(2)
+#define LPL87565_BUCK0_ILIM_MASK		BIT(0)
+
+#define LPL87565_BUCK3_PG_MASK			BIT(6)
+#define LPL87565_BUCK3_ILIM_MASK		BIT(4)
+#define LPL87565_BUCK2_PG_MASK			BIT(2)
+#define LPL87565_BUCK2_ILIM_MASK		BIT(0)
+
+#define LP87565_LOAD_CURRENT_BUCK_SELECT	0x3
+
+#define LP87565_I_LOAD2_BUCK_LOAD_CURRENT	0x3
+#define LP87565_I_LOAD1_BUCK_LOAD_CURRENT	0xFF
+
+#define LP87565_PG3_SEL				0xC0
+#define LP87565_PG2_SEL				0x30
+#define LP87565_PG1_SEL				0x0C
+#define LP87565_PG0_SEL				0x03
+
+#define LP87565_HALF_DAY			BIT(7)
+#define LP87565_EN_PG0_NINT			BIT(6)
+#define LP87565_PGOOD_SET_DELAY			BIT(5)
+#define LP87565_EN_PGFLT_STAT			BIT(4)
+#define LP87565_PGOOD_WINDOW			BIT(2)
+#define LP87565_PGOOD_OD			BIT(1)
+#define LP87565_PGOOD_POL			BIT(0)
+
+#define LP87565_PG3_FLT				BIT(3)
+#define LP87565_PG2_FLT				BIT(2)
+#define LP87565_PG1_FLT				BIT(1)
+#define LP87565_PG0_FLT				BIT(0)
+
+#define LP87565_PLL_MODE			0xC0
+#define LP87565_EXT_CLK_FREQ			0x1F
+
+#define LP87565_EN_SPREAD_SPEC			BIT(7)
+#define LP87565_EN_PIN_CTRL_GPIO3		BIT(6)
+#define LP87565_EN_PIN_SELECT_GPIO3		BIT(5)
+#define LP87565_EN_PIN_CTRL_GPIO2		BIT(4)
+#define LP87565_EN_PIN_SELECT_GPIO2		BIT(3)
+#define LP87565_GPIO3_SEL			BIT(2)
+#define LP87565_GPIO2_SEL			BIT(1)
+#define LP87565_GPIO1_SEL			BIT(0)
+
+#define LP87565_GOIO3_OD			BIT(6)
+#define LP87565_GOIO2_OD			BIT(5)
+#define LP87565_GOIO1_OD			BIT(4)
+#define LP87565_GOIO3_DIR			BIT(2)
+#define LP87565_GOIO2_DIR			BIT(1)
+#define LP87565_GOIO1_DIR			BIT(0)
+
+#define LP87565_GOIO3_IN			BIT(2)
+#define LP87565_GOIO2_IN			BIT(1)
+#define LP87565_GOIO1_IN			BIT(0)
+
+#define LP87565_GOIO3_OUT			BIT(2)
+#define LP87565_GOIO2_OUT			BIT(1)
+#define LP87565_GOIO1_OUT			BIT(0)
+
+/* Number of step-down converters available */
+#define LP87565_NUM_BUCK		6
+
+enum LP87565_regulator_id {
+	/* BUCK's */
+	LP87565_BUCK_0,
+	LP87565_BUCK_1,
+	LP87565_BUCK_2,
+	LP87565_BUCK_3,
+	LP87565_BUCK_10,
+	LP87565_BUCK_23,
+};
+
+/**
+ * struct LP87565 - state holder for the LP87565 driver
+ * @dev: struct device pointer for MFD device
+ * @rev: revision of the LP87565
+ * @dev_type: The device type for example lp87565-q1
+ * @lock: lock guarding the data structure
+ * @regmap: register map of the LP87565 PMIC
+ *
+ * Device data may be used to access the LP87565 chip
+ */
+struct lp87565 {
+	struct device *dev;
+	u8 rev;
+	u8 dev_type;
+	struct regmap *regmap;
+};
+#endif /* __LINUX_MFD_LP87565_H */
-- 
1.9.1

[toc] | [next] | [standalone]


#1645689

From"Andrew F. Davis" <afd@ti.com>
Date2017-05-19 17:50 +0200
Message-ID<tISk9-4bg-15@gated-at.bofh.it>
In reply to#1645575
On 05/19/2017 07:42 AM, Keerthy wrote:
> The LP87565 chip is a power management IC for Portable Navigation Systems
> and Tablet Computing devices. It contains the following components:
> 
>         - Configurable Bucks(Single and multi-phase).
>         - Configurable General Purpose Output Signals (GPO).
> 
> The LP87565-Q1 variant device uses two 2-phase outputs configuration,
> Buck0 is master for Buck0/1 output and Buck2 is master for Buck2/3
> output.
> 
> Signed-off-by: Keerthy <j-keerthy@ti.com>
> ---
>  Documentation/devicetree/bindings/mfd/lp87565.txt |  44 ++++
>  drivers/mfd/Kconfig                               |  14 ++
>  drivers/mfd/Makefile                              |   1 +
>  drivers/mfd/lp87565.c                             | 103 ++++++++
>  include/linux/mfd/lp87565.h                       | 275 ++++++++++++++++++++++
>  5 files changed, 437 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/mfd/lp87565.txt
>  create mode 100644 drivers/mfd/lp87565.c
>  create mode 100644 include/linux/mfd/lp87565.h
> 
> diff --git a/Documentation/devicetree/bindings/mfd/lp87565.txt b/Documentation/devicetree/bindings/mfd/lp87565.txt
> new file mode 100644
> index 0000000..38a00a1
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/mfd/lp87565.txt
> @@ -0,0 +1,44 @@
> +TI LP873565 PMIC MFD driver
> +
> +Required properties:
> +  - compatible:	"ti,lp87565", "ti,lp87565-q1"

The of_device_id table in the driver only seems to match for
"ti,lp87565-q1", not "ti,lp87565".

> +  - reg:		I2C slave address.
> +  - gpio-controller:	Marks the device node as a GPIO Controller.
> +  - #gpio-cells:	Should be two.  The first cell is the pin number and
> +			the second cell is used to specify flags.
> +			See ../gpio/gpio.txt for more information.
> +  - xxx-in-supply:	Phandle to parent supply node of each regulator
> +			populated under regulators node. xxx should match
> +			the supply_name populated in driver.
> +  - regulators:	List of child nodes that specify the regulator
> +			initialization data.
> +Example:
> +
> +lp87565: lp87565@60 {

pmic: lp87565@60 {

Is more standard.

> +	compatible = "ti,lp87565-q1";
> +	reg = <0x60>;
> +	gpio-controller;
> +	#gpio-cells = <2>;
> +
> +	buck10-in-supply =<&vsys_3v3>;
> +	buck23-in-supply =<&vsys_3v3>;
> +	regulators: regulators {
> +		buck10_reg: buck10 {
> +			/*VDD_MPU*/
> +			regulator-name = "buck10";
> +			regulator-min-microvolt = <850000>;
> +			regulator-max-microvolt = <1250000>;
> +			regulator-always-on;
> +			regulator-boot-on;
> +		};
> +
> +		buck23_reg: buck23 {
> +			/* VDD_GPU*/
> +			regulator-name = "buck23";
> +			regulator-min-microvolt = <850000>;
> +			regulator-max-microvolt = <1250000>;
> +			regulator-boot-on;
> +			regulator-always-on;
> +		};
> +	};
> +};
> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> index 3eb5c93..5e884f3 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -1325,6 +1325,20 @@ config MFD_TI_LP873X
>  	  This driver can also be built as a module. If so, the module
>  	  will be called lp873x.
>  
> +config MFD_TI_LP87565
> +	tristate "TI LP87565 Power Management IC"
> +	depends on I2C
> +	select MFD_CORE
> +	select REGMAP_I2C
> +	help
> +	  If you say yes here then you get support for the LP87565 series of
> +	  Power Management Integrated Circuits (PMIC).
> +	  These include voltage regulators, thermal protection, configurable
> +	  General Purpose Outputs (GPO) that are used in portable devices.
> +
> +	  This driver can also be built as a module. If so, the module
> +	  will be called lp87565.
> +
>  config MFD_TPS65218
>  	tristate "TI TPS65218 Power Management chips"
>  	depends on I2C
> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> index c16bf1e..7edbe1b 100644
> --- a/drivers/mfd/Makefile
> +++ b/drivers/mfd/Makefile
> @@ -25,6 +25,7 @@ obj-$(CONFIG_HTC_PASIC3)	+= htc-pasic3.o
>  obj-$(CONFIG_HTC_I2CPLD)	+= htc-i2cpld.o
>  
>  obj-$(CONFIG_MFD_TI_LP873X)	+= lp873x.o
> +obj-$(CONFIG_MFD_TI_LP87565)	+= lp87565.o
>  
>  obj-$(CONFIG_MFD_DAVINCI_VOICECODEC)	+= davinci_voicecodec.o
>  obj-$(CONFIG_MFD_DM355EVM_MSP)	+= dm355evm_msp.o
> diff --git a/drivers/mfd/lp87565.c b/drivers/mfd/lp87565.c
> new file mode 100644
> index 0000000..dff882f
> --- /dev/null
> +++ b/drivers/mfd/lp87565.c
> @@ -0,0 +1,103 @@
> +/*
> + * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
> + *
> + * Author: Keerthy <j-keerthy@ti.com>
> + *
> + * 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.
> + *
> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> + * kind, whether express or implied; without even the implied warranty
> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + */
> +
> +#include <linux/interrupt.h>
> +#include <linux/mfd/core.h>
> +#include <linux/module.h>
> +#include <linux/of_device.h>
> +#include <linux/regmap.h>
> +
> +#include <linux/mfd/lp87565.h>
> +
> +static const struct regmap_config lp87565_regmap_config = {
> +	.reg_bits = 8,
> +	.val_bits = 8,
> +	.max_register = LP87565_REG_MAX,
> +};
> +
> +static const struct mfd_cell lp87565_cells[] = {
> +	{ .name = "lp87565-q1-regulator", },
> +	{ .name = "lp87565-q1-gpio", },
> +};
> +
> +static const struct of_device_id of_lp87565_match_table[] = {
> +	{
> +		.compatible = "ti,lp87565-q1",
> +		.data = (void *)LP87565_DEVICE_TYPE_LP87565_Q1,
> +	},
> +	{}
> +};
> +MODULE_DEVICE_TABLE(of, of_lp87565_match_table);
> +
> +static int lp87565_probe(struct i2c_client *client,
> +			 const struct i2c_device_id *ids)
> +{
> +	struct lp87565 *lp87565;
> +	const struct of_device_id *of_id;
> +	int ret;
> +	unsigned int otpid;
> +
> +	lp87565 = devm_kzalloc(&client->dev, sizeof(*lp87565), GFP_KERNEL);
> +	if (!lp87565)
> +		return -ENOMEM;
> +
> +	lp87565->dev = &client->dev;
> +
> +	lp87565->regmap = devm_regmap_init_i2c(client, &lp87565_regmap_config);
> +	if (IS_ERR(lp87565->regmap)) {
> +		ret = PTR_ERR(lp87565->regmap);
> +		dev_err(lp87565->dev,
> +			"Failed to initialize register map: %d\n", ret);
> +		return ret;
> +	}
> +
> +	ret = regmap_read(lp87565->regmap, LP87565_REG_OTP_REV, &otpid);
> +	if (ret) {
> +		dev_err(lp87565->dev, "Failed to read OTP ID\n");
> +		return ret;
> +	}
> +
> +	lp87565->rev = otpid & LP87565_OTP_REV_OTP_ID;
> +	of_id = of_match_device(of_lp87565_match_table, &client->dev);
> +	if (of_id)
> +		lp87565->dev_type = (enum lp87565_device_type)of_id->data;
> +
> +	i2c_set_clientdata(client, lp87565);
> +
> +	ret = mfd_add_devices(lp87565->dev, PLATFORM_DEVID_AUTO, lp87565_cells,
> +			      ARRAY_SIZE(lp87565_cells), NULL, 0, NULL);
> +
> +	return ret;
> +}
> +
> +static const struct i2c_device_id lp87565_id_table[] = {
> +	{ "lp87565-q1", 0 },
> +	{ },
> +};
> +MODULE_DEVICE_TABLE(i2c, lp87565_id_table);
> +
> +static struct i2c_driver lp87565_driver = {
> +	.driver	= {
> +		.name	= "lp87565",
> +		.of_match_table = of_lp87565_match_table,
> +	},
> +	.probe		= lp87565_probe,
> +	.id_table	= lp87565_id_table,
> +};
> +module_i2c_driver(lp87565_driver);
> +
> +MODULE_AUTHOR("J Keerthy <j-keerthy@ti.com>");
> +MODULE_DESCRIPTION("lp87565 chip family Multi-Function Device driver");
> +MODULE_LICENSE("GPL v2");
> diff --git a/include/linux/mfd/lp87565.h b/include/linux/mfd/lp87565.h
> new file mode 100644
> index 0000000..6112365
> --- /dev/null
> +++ b/include/linux/mfd/lp87565.h
> @@ -0,0 +1,275 @@
> +/*
> + * Functions to access LP87565 power management chip.
> + *
> + * Copyright (C) 2016 Texas Instruments Incorporated - http://www.ti.com/
> + *
> + * 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.
> + *
> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> + * kind, whether express or implied; without even the implied warranty
> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + */
> +
> +#ifndef __LINUX_MFD_LP87565_H
> +#define __LINUX_MFD_LP87565_H
> +
> +#include <linux/i2c.h>
> +#include <linux/regulator/driver.h>
> +#include <linux/regulator/machine.h>
> +
> +enum lp87565_device_type {
> +	LP87565_DEVICE_TYPE_UNKNOWN	= 0,
> +	LP87565_DEVICE_TYPE_LP87565_Q1,
> +};
> +
> +/* All register addresses */
> +#define LP87565_REG_DEV_REV		0X00
> +#define LP87565_REG_OTP_REV		0X01
> +#define LP87565_REG_BUCK0_CTRL_1		0X02
> +#define LP87565_REG_BUCK0_CTRL_2		0X03
> +
> +#define LP87565_REG_BUCK1_CTRL_1		0X04
> +#define LP87565_REG_BUCK1_CTRL_2		0X05
> +
> +#define LP87565_REG_BUCK2_CTRL_1		0X06
> +#define LP87565_REG_BUCK2_CTRL_2		0X07
> +
> +#define LP87565_REG_BUCK3_CTRL_1		0X08
> +#define LP87565_REG_BUCK3_CTRL_2		0X09
> +
> +#define LP87565_REG_BUCK0_VOUT			0X0A
> +#define LP87565_REG_BUCK0_FLOOR_VOUT		0X0B
> +
> +#define LP87565_REG_BUCK1_VOUT			0X0C
> +#define LP87565_REG_BUCK1_FLOOR_VOUT		0X0D
> +
> +#define LP87565_REG_BUCK2_VOUT			0X0E
> +#define LP87565_REG_BUCK2_FLOOR_VOUT		0X0F
> +
> +#define LP87565_REG_BUCK3_VOUT			0X10
> +#define LP87565_REG_BUCK3_FLOOR_VOUT		0X11
> +
> +#define LP87565_REG_BUCK0_DELAY			0X12
> +#define LP87565_REG_BUCK1_DELAY			0X13
> +
> +#define LP87565_REG_BUCK2_DELAY			0X14
> +#define LP87565_REG_BUCK3_DELAY			0X15
> +
> +#define LP87565_REG_GPO2_DELAY			0X16
> +#define LP87565_REG_GPO3_DELAY			0X17
> +#define LP87565_REG_RESET			0X18
> +#define LP87565_REG_CONFIG			0X19
> +
> +#define LP87565_REG_INT_TOP_1			0X1A
> +#define LP87565_REG_INT_TOP_2			0X1B
> +
> +#define LP87565_REG_INT_BUCK_0_1		0X1C
> +#define LP87565_REG_INT_BUCK_2_3		0X1D
> +#define LP87565_REG_TOP_STAT			0X1E
> +#define LP87565_REG_BUCK_0_1_STAT		0X1F
> +#define LP87565_REG_BUCK_2_3_STAT		0x20
> +
> +#define LP87565_REG_TOP_MASK_1			0x21
> +#define LP87565_REG_TOP_MASK_2			0x22
> +
> +#define LP87565_REG_BUCK_0_1_MASK		0x23
> +#define LP87565_REG_BUCK_2_3_MASK		0x24
> +#define LP87565_REG_SEL_I_LOAD			0x25
> +
> +#define LP87565_REG_I_LOAD_2			0x26
> +#define LP87565_REG_I_LOAD_1			0x27
> +
> +#define LP87565_REG_PGOOD_CTRL1			0x28
> +#define LP87565_REG_PGOOD_CTRL2			0x29
> +#define LP87565_REG_PGOOD_FLT			0x2A
> +#define LP87565_REG_PLL_CTRL			0x2B
> +#define LP87565_REG_PIN_FUNCTION		0x2C
> +#define LP87565_REG_GPIO_CONFIG			0x2D
> +#define LP87565_REG_GPIO_IN			0x2E
> +#define LP87565_REG_GPIO_OUT			0x2F
> +
> +#define LP87565_REG_MAX			LP87565_REG_GPIO_OUT
> +
> +/* Register field definitions */
> +#define LP87565_DEV_REV_DEV_ID			0xC0
> +#define LP87565_DEV_REV_ALL_LAYER		0x30
> +#define LP87565_DEV_REV_METAL_LAYER		0x0F
> +
> +#define LP87565_OTP_REV_OTP_ID			0xFF
> +
> +#define LP87565_BUCK_CTRL_1_EN			BIT(7)
> +#define LP87565_BUCK_CTRL_1_EN_PIN_CTRL		BIT(6)
> +#define LP87565_BUCK_CTRL_1_PIN_SELECT_EN	0x30
> +
> +#define LP87565_BUCK_CTRL_1_ROOF_FLOOR_EN	BIT(3)
> +#define LP87565_BUCK_CTRL_1_RDIS_EN		BIT(2)
> +#define LP87565_BUCK_CTRL_1_FPWM		BIT(1)
> +/* Bit0 is reserved for BUCK1 and BUCK3 and valid only for BUCK0 and BUCK2 */
> +#define LP87565_BUCK_CTRL_1_FPWM_MP_0_2		BIT(0)
> +
> +#define LP87565_BUCK_CTRL_2_ILIM		0x38
> +#define LP87565_BUCK_CTRL_2_SLEW_RATE		0x07
> +
> +#define LP87565_BUCK_VSET			0xFF
> +#define LP87565_BUCK_FLOOR_VSET			0xFF
> +
> +#define LP87565_BUCK_SHUTDOWN_DELAY		0xF0
> +#define LP87565_BUCK_STARTUP_DELAY		0x0F
> +
> +#define LP87565_GPIO_SHUTDOWN_DELAY		0xF0
> +#define LP87565_GPIO_STARTUP_DELAY		0x0F
> +
> +#define LP87565_RESET_SW_RESET			BIT(0)
> +
> +#define LP87565_CONFIG_DOUBLE_DELAY		BIT(7)
> +#define LP87565_CONFIG_CLKIN_PD			BIT(6)
> +#define LP87565_CONFIG_EN4_PD			BIT(5)
> +#define LP87565_CONFIG_EN3_PD			BIT(4)
> +#define LP87565_CONFIG_TDIE_WARN_LEVEL		BIT(3)
> +#define LP87565_CONFIG_EN2_PD			BIT(2)
> +#define LP87565_CONFIG_EN1_PD			BIT(1)
> +
> +#define LP87565_INT_GPIO			BIT(7)
> +#define LP87565_INT_BUCK23			BIT(6)
> +#define LP87565_INT_BUCK01			BIT(5)
> +#define LP87565_NO_SYNC_CLK			BIT(4)
> +#define LP87565_TDIE_SD				BIT(3)
> +#define LP87565_TDIE_WARN			BIT(2)
> +#define LP87565_INT_OVP				BIT(1)
> +#define LP87565_I_LOAD_READY			BIT(0)
> +
> +#define LP87565_INT_TOP2_RESET_REG		BIT(0)
> +
> +#define LP87565_BUCK1_PG_INT			BIT(6)
> +#define LP87565_BUCK1_SC_INT			BIT(5)
> +#define LP87565_BUCK1_ILIM_INT			BIT(4)
> +#define LP87565_BUCK0_PG_INT			BIT(2)
> +#define LP87565_BUCK0_SC_INT			BIT(1)
> +#define LP87565_BUCK0_ILIM_INT			BIT(0)
> +
> +#define LP87565_BUCK3_PG_INT			BIT(6)
> +#define LP87565_BUCK3_SC_INT			BIT(5)
> +#define LP87565_BUCK3_ILIM_INT			BIT(4)
> +#define LP87565_BUCK2_PG_INT			BIT(2)
> +#define LP87565_BUCK2_SC_INT			BIT(1)
> +#define LP87565_BUCK2_ILIM_INT			BIT(0)
> +
> +#define LP87565_SYNC_CLK_STAT			BIT(4)
> +#define LP87565_TDIE_SD_STAT			BIT(3)
> +#define LP87565_TDIE_WARN_STAT			BIT(2)
> +#define LP87565_OVP_STAT			BIT(1)
> +
> +#define LP87565_BUCK1_STAT			BIT(7)
> +#define LP87565_BUCK1_PG_STAT			BIT(6)
> +#define LP87565_BUCK1_ILIM_STAT			BIT(4)
> +#define LP87565_BUCK0_STAT			BIT(3)
> +#define LP87565_BUCK0_PG_STAT			BIT(2)
> +#define LP87565_BUCK0_ILIM_STAT			BIT(0)
> +
> +#define LP87565_BUCK3_STAT			BIT(7)
> +#define LP87565_BUCK3_PG_STAT			BIT(6)
> +#define LP87565_BUCK3_ILIM_STAT			BIT(4)
> +#define LP87565_BUCK2_STAT			BIT(3)
> +#define LP87565_BUCK2_PG_STAT			BIT(2)
> +#define LP87565_BUCK2_ILIM_STAT			BIT(0)
> +
> +#define LPL87565_GPIO_MASK			BIT(7)
> +#define LPL87565_SYNC_CLK_MASK			BIT(4)
> +#define LPL87565_TDIE_WARN_MASK			BIT(2)
> +#define LPL87565_I_LOAD_READY_MASK		BIT(0)
> +
> +#define LPL87565_RESET_REG_MASK			BIT(0)
> +
> +#define LPL87565_BUCK1_PG_MASK			BIT(6)
> +#define LPL87565_BUCK1_ILIM_MASK		BIT(4)
> +#define LPL87565_BUCK0_PG_MASK			BIT(2)
> +#define LPL87565_BUCK0_ILIM_MASK		BIT(0)
> +
> +#define LPL87565_BUCK3_PG_MASK			BIT(6)
> +#define LPL87565_BUCK3_ILIM_MASK		BIT(4)
> +#define LPL87565_BUCK2_PG_MASK			BIT(2)
> +#define LPL87565_BUCK2_ILIM_MASK		BIT(0)
> +
> +#define LP87565_LOAD_CURRENT_BUCK_SELECT	0x3
> +
> +#define LP87565_I_LOAD2_BUCK_LOAD_CURRENT	0x3
> +#define LP87565_I_LOAD1_BUCK_LOAD_CURRENT	0xFF
> +
> +#define LP87565_PG3_SEL				0xC0
> +#define LP87565_PG2_SEL				0x30
> +#define LP87565_PG1_SEL				0x0C
> +#define LP87565_PG0_SEL				0x03
> +
> +#define LP87565_HALF_DAY			BIT(7)
> +#define LP87565_EN_PG0_NINT			BIT(6)
> +#define LP87565_PGOOD_SET_DELAY			BIT(5)
> +#define LP87565_EN_PGFLT_STAT			BIT(4)
> +#define LP87565_PGOOD_WINDOW			BIT(2)
> +#define LP87565_PGOOD_OD			BIT(1)
> +#define LP87565_PGOOD_POL			BIT(0)
> +
> +#define LP87565_PG3_FLT				BIT(3)
> +#define LP87565_PG2_FLT				BIT(2)
> +#define LP87565_PG1_FLT				BIT(1)
> +#define LP87565_PG0_FLT				BIT(0)
> +
> +#define LP87565_PLL_MODE			0xC0
> +#define LP87565_EXT_CLK_FREQ			0x1F
> +
> +#define LP87565_EN_SPREAD_SPEC			BIT(7)
> +#define LP87565_EN_PIN_CTRL_GPIO3		BIT(6)
> +#define LP87565_EN_PIN_SELECT_GPIO3		BIT(5)
> +#define LP87565_EN_PIN_CTRL_GPIO2		BIT(4)
> +#define LP87565_EN_PIN_SELECT_GPIO2		BIT(3)
> +#define LP87565_GPIO3_SEL			BIT(2)
> +#define LP87565_GPIO2_SEL			BIT(1)
> +#define LP87565_GPIO1_SEL			BIT(0)
> +
> +#define LP87565_GOIO3_OD			BIT(6)
> +#define LP87565_GOIO2_OD			BIT(5)
> +#define LP87565_GOIO1_OD			BIT(4)
> +#define LP87565_GOIO3_DIR			BIT(2)
> +#define LP87565_GOIO2_DIR			BIT(1)
> +#define LP87565_GOIO1_DIR			BIT(0)
> +
> +#define LP87565_GOIO3_IN			BIT(2)
> +#define LP87565_GOIO2_IN			BIT(1)
> +#define LP87565_GOIO1_IN			BIT(0)
> +
> +#define LP87565_GOIO3_OUT			BIT(2)
> +#define LP87565_GOIO2_OUT			BIT(1)
> +#define LP87565_GOIO1_OUT			BIT(0)
> +
> +/* Number of step-down converters available */
> +#define LP87565_NUM_BUCK		6
> +
> +enum LP87565_regulator_id {
> +	/* BUCK's */
> +	LP87565_BUCK_0,
> +	LP87565_BUCK_1,
> +	LP87565_BUCK_2,
> +	LP87565_BUCK_3,
> +	LP87565_BUCK_10,
> +	LP87565_BUCK_23,
> +};
> +
> +/**
> + * struct LP87565 - state holder for the LP87565 driver
> + * @dev: struct device pointer for MFD device
> + * @rev: revision of the LP87565
> + * @dev_type: The device type for example lp87565-q1
> + * @lock: lock guarding the data structure
> + * @regmap: register map of the LP87565 PMIC
> + *
> + * Device data may be used to access the LP87565 chip
> + */
> +struct lp87565 {
> +	struct device *dev;
> +	u8 rev;
> +	u8 dev_type;
> +	struct regmap *regmap;
> +};
> +#endif /* __LINUX_MFD_LP87565_H */
> 

[toc] | [prev] | [next] | [standalone]


#1646505

FromKeerthy <j-keerthy@ti.com>
Date2017-05-22 06:30 +0200
Message-ID<tJN8K-EY-5@gated-at.bofh.it>
In reply to#1645689

On Friday 19 May 2017 09:12 PM, Andrew F. Davis wrote:
> On 05/19/2017 07:42 AM, Keerthy wrote:
>> The LP87565 chip is a power management IC for Portable Navigation Systems
>> and Tablet Computing devices. It contains the following components:
>>
>>         - Configurable Bucks(Single and multi-phase).
>>         - Configurable General Purpose Output Signals (GPO).
>>
>> The LP87565-Q1 variant device uses two 2-phase outputs configuration,
>> Buck0 is master for Buck0/1 output and Buck2 is master for Buck2/3
>> output.
>>
>> Signed-off-by: Keerthy <j-keerthy@ti.com>
>> ---
>>  Documentation/devicetree/bindings/mfd/lp87565.txt |  44 ++++
>>  drivers/mfd/Kconfig                               |  14 ++
>>  drivers/mfd/Makefile                              |   1 +
>>  drivers/mfd/lp87565.c                             | 103 ++++++++
>>  include/linux/mfd/lp87565.h                       | 275 ++++++++++++++++++++++
>>  5 files changed, 437 insertions(+)
>>  create mode 100644 Documentation/devicetree/bindings/mfd/lp87565.txt
>>  create mode 100644 drivers/mfd/lp87565.c
>>  create mode 100644 include/linux/mfd/lp87565.h
>>
>> diff --git a/Documentation/devicetree/bindings/mfd/lp87565.txt b/Documentation/devicetree/bindings/mfd/lp87565.txt
>> new file mode 100644
>> index 0000000..38a00a1
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/mfd/lp87565.txt
>> @@ -0,0 +1,44 @@
>> +TI LP873565 PMIC MFD driver
>> +
>> +Required properties:
>> +  - compatible:	"ti,lp87565", "ti,lp87565-q1"
> 
> The of_device_id table in the driver only seems to match for
> "ti,lp87565-q1", not "ti,lp87565".

I will add both. ti,lp87565 is the generic one and the ti,lp87565-q1 is
a specific one with dual phase regulators.

> 
>> +  - reg:		I2C slave address.
>> +  - gpio-controller:	Marks the device node as a GPIO Controller.
>> +  - #gpio-cells:	Should be two.  The first cell is the pin number and
>> +			the second cell is used to specify flags.
>> +			See ../gpio/gpio.txt for more information.
>> +  - xxx-in-supply:	Phandle to parent supply node of each regulator
>> +			populated under regulators node. xxx should match
>> +			the supply_name populated in driver.
>> +  - regulators:	List of child nodes that specify the regulator
>> +			initialization data.
>> +Example:
>> +
>> +lp87565: lp87565@60 {
> 
> pmic: lp87565@60 {
> 
> Is more standard.

Sure. I will change that.

Thanks for reviewing.

> 
>> +	compatible = "ti,lp87565-q1";
>> +	reg = <0x60>;
>> +	gpio-controller;
>> +	#gpio-cells = <2>;
>> +
>> +	buck10-in-supply =<&vsys_3v3>;
>> +	buck23-in-supply =<&vsys_3v3>;
>> +	regulators: regulators {
>> +		buck10_reg: buck10 {
>> +			/*VDD_MPU*/
>> +			regulator-name = "buck10";
>> +			regulator-min-microvolt = <850000>;
>> +			regulator-max-microvolt = <1250000>;
>> +			regulator-always-on;
>> +			regulator-boot-on;
>> +		};
>> +
>> +		buck23_reg: buck23 {
>> +			/* VDD_GPU*/
>> +			regulator-name = "buck23";
>> +			regulator-min-microvolt = <850000>;
>> +			regulator-max-microvolt = <1250000>;
>> +			regulator-boot-on;
>> +			regulator-always-on;
>> +		};
>> +	};
>> +};
>> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
>> index 3eb5c93..5e884f3 100644
>> --- a/drivers/mfd/Kconfig
>> +++ b/drivers/mfd/Kconfig
>> @@ -1325,6 +1325,20 @@ config MFD_TI_LP873X
>>  	  This driver can also be built as a module. If so, the module
>>  	  will be called lp873x.
>>  
>> +config MFD_TI_LP87565
>> +	tristate "TI LP87565 Power Management IC"
>> +	depends on I2C
>> +	select MFD_CORE
>> +	select REGMAP_I2C
>> +	help
>> +	  If you say yes here then you get support for the LP87565 series of
>> +	  Power Management Integrated Circuits (PMIC).
>> +	  These include voltage regulators, thermal protection, configurable
>> +	  General Purpose Outputs (GPO) that are used in portable devices.
>> +
>> +	  This driver can also be built as a module. If so, the module
>> +	  will be called lp87565.
>> +
>>  config MFD_TPS65218
>>  	tristate "TI TPS65218 Power Management chips"
>>  	depends on I2C
>> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
>> index c16bf1e..7edbe1b 100644
>> --- a/drivers/mfd/Makefile
>> +++ b/drivers/mfd/Makefile
>> @@ -25,6 +25,7 @@ obj-$(CONFIG_HTC_PASIC3)	+= htc-pasic3.o
>>  obj-$(CONFIG_HTC_I2CPLD)	+= htc-i2cpld.o
>>  
>>  obj-$(CONFIG_MFD_TI_LP873X)	+= lp873x.o
>> +obj-$(CONFIG_MFD_TI_LP87565)	+= lp87565.o
>>  
>>  obj-$(CONFIG_MFD_DAVINCI_VOICECODEC)	+= davinci_voicecodec.o
>>  obj-$(CONFIG_MFD_DM355EVM_MSP)	+= dm355evm_msp.o
>> diff --git a/drivers/mfd/lp87565.c b/drivers/mfd/lp87565.c
>> new file mode 100644
>> index 0000000..dff882f
>> --- /dev/null
>> +++ b/drivers/mfd/lp87565.c
>> @@ -0,0 +1,103 @@
>> +/*
>> + * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
>> + *
>> + * Author: Keerthy <j-keerthy@ti.com>
>> + *
>> + * 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.
>> + *
>> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
>> + * kind, whether express or implied; without even the implied warranty
>> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + */
>> +
>> +#include <linux/interrupt.h>
>> +#include <linux/mfd/core.h>
>> +#include <linux/module.h>
>> +#include <linux/of_device.h>
>> +#include <linux/regmap.h>
>> +
>> +#include <linux/mfd/lp87565.h>
>> +
>> +static const struct regmap_config lp87565_regmap_config = {
>> +	.reg_bits = 8,
>> +	.val_bits = 8,
>> +	.max_register = LP87565_REG_MAX,
>> +};
>> +
>> +static const struct mfd_cell lp87565_cells[] = {
>> +	{ .name = "lp87565-q1-regulator", },
>> +	{ .name = "lp87565-q1-gpio", },
>> +};
>> +
>> +static const struct of_device_id of_lp87565_match_table[] = {
>> +	{
>> +		.compatible = "ti,lp87565-q1",
>> +		.data = (void *)LP87565_DEVICE_TYPE_LP87565_Q1,
>> +	},
>> +	{}
>> +};
>> +MODULE_DEVICE_TABLE(of, of_lp87565_match_table);
>> +
>> +static int lp87565_probe(struct i2c_client *client,
>> +			 const struct i2c_device_id *ids)
>> +{
>> +	struct lp87565 *lp87565;
>> +	const struct of_device_id *of_id;
>> +	int ret;
>> +	unsigned int otpid;
>> +
>> +	lp87565 = devm_kzalloc(&client->dev, sizeof(*lp87565), GFP_KERNEL);
>> +	if (!lp87565)
>> +		return -ENOMEM;
>> +
>> +	lp87565->dev = &client->dev;
>> +
>> +	lp87565->regmap = devm_regmap_init_i2c(client, &lp87565_regmap_config);
>> +	if (IS_ERR(lp87565->regmap)) {
>> +		ret = PTR_ERR(lp87565->regmap);
>> +		dev_err(lp87565->dev,
>> +			"Failed to initialize register map: %d\n", ret);
>> +		return ret;
>> +	}
>> +
>> +	ret = regmap_read(lp87565->regmap, LP87565_REG_OTP_REV, &otpid);
>> +	if (ret) {
>> +		dev_err(lp87565->dev, "Failed to read OTP ID\n");
>> +		return ret;
>> +	}
>> +
>> +	lp87565->rev = otpid & LP87565_OTP_REV_OTP_ID;
>> +	of_id = of_match_device(of_lp87565_match_table, &client->dev);
>> +	if (of_id)
>> +		lp87565->dev_type = (enum lp87565_device_type)of_id->data;
>> +
>> +	i2c_set_clientdata(client, lp87565);
>> +
>> +	ret = mfd_add_devices(lp87565->dev, PLATFORM_DEVID_AUTO, lp87565_cells,
>> +			      ARRAY_SIZE(lp87565_cells), NULL, 0, NULL);
>> +
>> +	return ret;
>> +}
>> +
>> +static const struct i2c_device_id lp87565_id_table[] = {
>> +	{ "lp87565-q1", 0 },
>> +	{ },
>> +};
>> +MODULE_DEVICE_TABLE(i2c, lp87565_id_table);
>> +
>> +static struct i2c_driver lp87565_driver = {
>> +	.driver	= {
>> +		.name	= "lp87565",
>> +		.of_match_table = of_lp87565_match_table,
>> +	},
>> +	.probe		= lp87565_probe,
>> +	.id_table	= lp87565_id_table,
>> +};
>> +module_i2c_driver(lp87565_driver);
>> +
>> +MODULE_AUTHOR("J Keerthy <j-keerthy@ti.com>");
>> +MODULE_DESCRIPTION("lp87565 chip family Multi-Function Device driver");
>> +MODULE_LICENSE("GPL v2");
>> diff --git a/include/linux/mfd/lp87565.h b/include/linux/mfd/lp87565.h
>> new file mode 100644
>> index 0000000..6112365
>> --- /dev/null
>> +++ b/include/linux/mfd/lp87565.h
>> @@ -0,0 +1,275 @@
>> +/*
>> + * Functions to access LP87565 power management chip.
>> + *
>> + * Copyright (C) 2016 Texas Instruments Incorporated - http://www.ti.com/
>> + *
>> + * 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.
>> + *
>> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
>> + * kind, whether express or implied; without even the implied warranty
>> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + */
>> +
>> +#ifndef __LINUX_MFD_LP87565_H
>> +#define __LINUX_MFD_LP87565_H
>> +
>> +#include <linux/i2c.h>
>> +#include <linux/regulator/driver.h>
>> +#include <linux/regulator/machine.h>
>> +
>> +enum lp87565_device_type {
>> +	LP87565_DEVICE_TYPE_UNKNOWN	= 0,
>> +	LP87565_DEVICE_TYPE_LP87565_Q1,
>> +};
>> +
>> +/* All register addresses */
>> +#define LP87565_REG_DEV_REV		0X00
>> +#define LP87565_REG_OTP_REV		0X01
>> +#define LP87565_REG_BUCK0_CTRL_1		0X02
>> +#define LP87565_REG_BUCK0_CTRL_2		0X03
>> +
>> +#define LP87565_REG_BUCK1_CTRL_1		0X04
>> +#define LP87565_REG_BUCK1_CTRL_2		0X05
>> +
>> +#define LP87565_REG_BUCK2_CTRL_1		0X06
>> +#define LP87565_REG_BUCK2_CTRL_2		0X07
>> +
>> +#define LP87565_REG_BUCK3_CTRL_1		0X08
>> +#define LP87565_REG_BUCK3_CTRL_2		0X09
>> +
>> +#define LP87565_REG_BUCK0_VOUT			0X0A
>> +#define LP87565_REG_BUCK0_FLOOR_VOUT		0X0B
>> +
>> +#define LP87565_REG_BUCK1_VOUT			0X0C
>> +#define LP87565_REG_BUCK1_FLOOR_VOUT		0X0D
>> +
>> +#define LP87565_REG_BUCK2_VOUT			0X0E
>> +#define LP87565_REG_BUCK2_FLOOR_VOUT		0X0F
>> +
>> +#define LP87565_REG_BUCK3_VOUT			0X10
>> +#define LP87565_REG_BUCK3_FLOOR_VOUT		0X11
>> +
>> +#define LP87565_REG_BUCK0_DELAY			0X12
>> +#define LP87565_REG_BUCK1_DELAY			0X13
>> +
>> +#define LP87565_REG_BUCK2_DELAY			0X14
>> +#define LP87565_REG_BUCK3_DELAY			0X15
>> +
>> +#define LP87565_REG_GPO2_DELAY			0X16
>> +#define LP87565_REG_GPO3_DELAY			0X17
>> +#define LP87565_REG_RESET			0X18
>> +#define LP87565_REG_CONFIG			0X19
>> +
>> +#define LP87565_REG_INT_TOP_1			0X1A
>> +#define LP87565_REG_INT_TOP_2			0X1B
>> +
>> +#define LP87565_REG_INT_BUCK_0_1		0X1C
>> +#define LP87565_REG_INT_BUCK_2_3		0X1D
>> +#define LP87565_REG_TOP_STAT			0X1E
>> +#define LP87565_REG_BUCK_0_1_STAT		0X1F
>> +#define LP87565_REG_BUCK_2_3_STAT		0x20
>> +
>> +#define LP87565_REG_TOP_MASK_1			0x21
>> +#define LP87565_REG_TOP_MASK_2			0x22
>> +
>> +#define LP87565_REG_BUCK_0_1_MASK		0x23
>> +#define LP87565_REG_BUCK_2_3_MASK		0x24
>> +#define LP87565_REG_SEL_I_LOAD			0x25
>> +
>> +#define LP87565_REG_I_LOAD_2			0x26
>> +#define LP87565_REG_I_LOAD_1			0x27
>> +
>> +#define LP87565_REG_PGOOD_CTRL1			0x28
>> +#define LP87565_REG_PGOOD_CTRL2			0x29
>> +#define LP87565_REG_PGOOD_FLT			0x2A
>> +#define LP87565_REG_PLL_CTRL			0x2B
>> +#define LP87565_REG_PIN_FUNCTION		0x2C
>> +#define LP87565_REG_GPIO_CONFIG			0x2D
>> +#define LP87565_REG_GPIO_IN			0x2E
>> +#define LP87565_REG_GPIO_OUT			0x2F
>> +
>> +#define LP87565_REG_MAX			LP87565_REG_GPIO_OUT
>> +
>> +/* Register field definitions */
>> +#define LP87565_DEV_REV_DEV_ID			0xC0
>> +#define LP87565_DEV_REV_ALL_LAYER		0x30
>> +#define LP87565_DEV_REV_METAL_LAYER		0x0F
>> +
>> +#define LP87565_OTP_REV_OTP_ID			0xFF
>> +
>> +#define LP87565_BUCK_CTRL_1_EN			BIT(7)
>> +#define LP87565_BUCK_CTRL_1_EN_PIN_CTRL		BIT(6)
>> +#define LP87565_BUCK_CTRL_1_PIN_SELECT_EN	0x30
>> +
>> +#define LP87565_BUCK_CTRL_1_ROOF_FLOOR_EN	BIT(3)
>> +#define LP87565_BUCK_CTRL_1_RDIS_EN		BIT(2)
>> +#define LP87565_BUCK_CTRL_1_FPWM		BIT(1)
>> +/* Bit0 is reserved for BUCK1 and BUCK3 and valid only for BUCK0 and BUCK2 */
>> +#define LP87565_BUCK_CTRL_1_FPWM_MP_0_2		BIT(0)
>> +
>> +#define LP87565_BUCK_CTRL_2_ILIM		0x38
>> +#define LP87565_BUCK_CTRL_2_SLEW_RATE		0x07
>> +
>> +#define LP87565_BUCK_VSET			0xFF
>> +#define LP87565_BUCK_FLOOR_VSET			0xFF
>> +
>> +#define LP87565_BUCK_SHUTDOWN_DELAY		0xF0
>> +#define LP87565_BUCK_STARTUP_DELAY		0x0F
>> +
>> +#define LP87565_GPIO_SHUTDOWN_DELAY		0xF0
>> +#define LP87565_GPIO_STARTUP_DELAY		0x0F
>> +
>> +#define LP87565_RESET_SW_RESET			BIT(0)
>> +
>> +#define LP87565_CONFIG_DOUBLE_DELAY		BIT(7)
>> +#define LP87565_CONFIG_CLKIN_PD			BIT(6)
>> +#define LP87565_CONFIG_EN4_PD			BIT(5)
>> +#define LP87565_CONFIG_EN3_PD			BIT(4)
>> +#define LP87565_CONFIG_TDIE_WARN_LEVEL		BIT(3)
>> +#define LP87565_CONFIG_EN2_PD			BIT(2)
>> +#define LP87565_CONFIG_EN1_PD			BIT(1)
>> +
>> +#define LP87565_INT_GPIO			BIT(7)
>> +#define LP87565_INT_BUCK23			BIT(6)
>> +#define LP87565_INT_BUCK01			BIT(5)
>> +#define LP87565_NO_SYNC_CLK			BIT(4)
>> +#define LP87565_TDIE_SD				BIT(3)
>> +#define LP87565_TDIE_WARN			BIT(2)
>> +#define LP87565_INT_OVP				BIT(1)
>> +#define LP87565_I_LOAD_READY			BIT(0)
>> +
>> +#define LP87565_INT_TOP2_RESET_REG		BIT(0)
>> +
>> +#define LP87565_BUCK1_PG_INT			BIT(6)
>> +#define LP87565_BUCK1_SC_INT			BIT(5)
>> +#define LP87565_BUCK1_ILIM_INT			BIT(4)
>> +#define LP87565_BUCK0_PG_INT			BIT(2)
>> +#define LP87565_BUCK0_SC_INT			BIT(1)
>> +#define LP87565_BUCK0_ILIM_INT			BIT(0)
>> +
>> +#define LP87565_BUCK3_PG_INT			BIT(6)
>> +#define LP87565_BUCK3_SC_INT			BIT(5)
>> +#define LP87565_BUCK3_ILIM_INT			BIT(4)
>> +#define LP87565_BUCK2_PG_INT			BIT(2)
>> +#define LP87565_BUCK2_SC_INT			BIT(1)
>> +#define LP87565_BUCK2_ILIM_INT			BIT(0)
>> +
>> +#define LP87565_SYNC_CLK_STAT			BIT(4)
>> +#define LP87565_TDIE_SD_STAT			BIT(3)
>> +#define LP87565_TDIE_WARN_STAT			BIT(2)
>> +#define LP87565_OVP_STAT			BIT(1)
>> +
>> +#define LP87565_BUCK1_STAT			BIT(7)
>> +#define LP87565_BUCK1_PG_STAT			BIT(6)
>> +#define LP87565_BUCK1_ILIM_STAT			BIT(4)
>> +#define LP87565_BUCK0_STAT			BIT(3)
>> +#define LP87565_BUCK0_PG_STAT			BIT(2)
>> +#define LP87565_BUCK0_ILIM_STAT			BIT(0)
>> +
>> +#define LP87565_BUCK3_STAT			BIT(7)
>> +#define LP87565_BUCK3_PG_STAT			BIT(6)
>> +#define LP87565_BUCK3_ILIM_STAT			BIT(4)
>> +#define LP87565_BUCK2_STAT			BIT(3)
>> +#define LP87565_BUCK2_PG_STAT			BIT(2)
>> +#define LP87565_BUCK2_ILIM_STAT			BIT(0)
>> +
>> +#define LPL87565_GPIO_MASK			BIT(7)
>> +#define LPL87565_SYNC_CLK_MASK			BIT(4)
>> +#define LPL87565_TDIE_WARN_MASK			BIT(2)
>> +#define LPL87565_I_LOAD_READY_MASK		BIT(0)
>> +
>> +#define LPL87565_RESET_REG_MASK			BIT(0)
>> +
>> +#define LPL87565_BUCK1_PG_MASK			BIT(6)
>> +#define LPL87565_BUCK1_ILIM_MASK		BIT(4)
>> +#define LPL87565_BUCK0_PG_MASK			BIT(2)
>> +#define LPL87565_BUCK0_ILIM_MASK		BIT(0)
>> +
>> +#define LPL87565_BUCK3_PG_MASK			BIT(6)
>> +#define LPL87565_BUCK3_ILIM_MASK		BIT(4)
>> +#define LPL87565_BUCK2_PG_MASK			BIT(2)
>> +#define LPL87565_BUCK2_ILIM_MASK		BIT(0)
>> +
>> +#define LP87565_LOAD_CURRENT_BUCK_SELECT	0x3
>> +
>> +#define LP87565_I_LOAD2_BUCK_LOAD_CURRENT	0x3
>> +#define LP87565_I_LOAD1_BUCK_LOAD_CURRENT	0xFF
>> +
>> +#define LP87565_PG3_SEL				0xC0
>> +#define LP87565_PG2_SEL				0x30
>> +#define LP87565_PG1_SEL				0x0C
>> +#define LP87565_PG0_SEL				0x03
>> +
>> +#define LP87565_HALF_DAY			BIT(7)
>> +#define LP87565_EN_PG0_NINT			BIT(6)
>> +#define LP87565_PGOOD_SET_DELAY			BIT(5)
>> +#define LP87565_EN_PGFLT_STAT			BIT(4)
>> +#define LP87565_PGOOD_WINDOW			BIT(2)
>> +#define LP87565_PGOOD_OD			BIT(1)
>> +#define LP87565_PGOOD_POL			BIT(0)
>> +
>> +#define LP87565_PG3_FLT				BIT(3)
>> +#define LP87565_PG2_FLT				BIT(2)
>> +#define LP87565_PG1_FLT				BIT(1)
>> +#define LP87565_PG0_FLT				BIT(0)
>> +
>> +#define LP87565_PLL_MODE			0xC0
>> +#define LP87565_EXT_CLK_FREQ			0x1F
>> +
>> +#define LP87565_EN_SPREAD_SPEC			BIT(7)
>> +#define LP87565_EN_PIN_CTRL_GPIO3		BIT(6)
>> +#define LP87565_EN_PIN_SELECT_GPIO3		BIT(5)
>> +#define LP87565_EN_PIN_CTRL_GPIO2		BIT(4)
>> +#define LP87565_EN_PIN_SELECT_GPIO2		BIT(3)
>> +#define LP87565_GPIO3_SEL			BIT(2)
>> +#define LP87565_GPIO2_SEL			BIT(1)
>> +#define LP87565_GPIO1_SEL			BIT(0)
>> +
>> +#define LP87565_GOIO3_OD			BIT(6)
>> +#define LP87565_GOIO2_OD			BIT(5)
>> +#define LP87565_GOIO1_OD			BIT(4)
>> +#define LP87565_GOIO3_DIR			BIT(2)
>> +#define LP87565_GOIO2_DIR			BIT(1)
>> +#define LP87565_GOIO1_DIR			BIT(0)
>> +
>> +#define LP87565_GOIO3_IN			BIT(2)
>> +#define LP87565_GOIO2_IN			BIT(1)
>> +#define LP87565_GOIO1_IN			BIT(0)
>> +
>> +#define LP87565_GOIO3_OUT			BIT(2)
>> +#define LP87565_GOIO2_OUT			BIT(1)
>> +#define LP87565_GOIO1_OUT			BIT(0)
>> +
>> +/* Number of step-down converters available */
>> +#define LP87565_NUM_BUCK		6
>> +
>> +enum LP87565_regulator_id {
>> +	/* BUCK's */
>> +	LP87565_BUCK_0,
>> +	LP87565_BUCK_1,
>> +	LP87565_BUCK_2,
>> +	LP87565_BUCK_3,
>> +	LP87565_BUCK_10,
>> +	LP87565_BUCK_23,
>> +};
>> +
>> +/**
>> + * struct LP87565 - state holder for the LP87565 driver
>> + * @dev: struct device pointer for MFD device
>> + * @rev: revision of the LP87565
>> + * @dev_type: The device type for example lp87565-q1
>> + * @lock: lock guarding the data structure
>> + * @regmap: register map of the LP87565 PMIC
>> + *
>> + * Device data may be used to access the LP87565 chip
>> + */
>> +struct lp87565 {
>> +	struct device *dev;
>> +	u8 rev;
>> +	u8 dev_type;
>> +	struct regmap *regmap;
>> +};
>> +#endif /* __LINUX_MFD_LP87565_H */
>>

[toc] | [prev] | [next] | [standalone]


#1647597

FromKeerthy <j-keerthy@ti.com>
Date2017-05-23 05:10 +0200
Message-ID<tK8mR-5Uk-9@gated-at.bofh.it>
In reply to#1646505

On Monday 22 May 2017 09:53 AM, Keerthy wrote:
> 
> 
> On Friday 19 May 2017 09:12 PM, Andrew F. Davis wrote:
>> On 05/19/2017 07:42 AM, Keerthy wrote:
>>> The LP87565 chip is a power management IC for Portable Navigation Systems
>>> and Tablet Computing devices. It contains the following components:
>>>
>>>         - Configurable Bucks(Single and multi-phase).
>>>         - Configurable General Purpose Output Signals (GPO).
>>>
>>> The LP87565-Q1 variant device uses two 2-phase outputs configuration,
>>> Buck0 is master for Buck0/1 output and Buck2 is master for Buck2/3
>>> output.
>>>
>>> Signed-off-by: Keerthy <j-keerthy@ti.com>
>>> ---
>>>  Documentation/devicetree/bindings/mfd/lp87565.txt |  44 ++++
>>>  drivers/mfd/Kconfig                               |  14 ++
>>>  drivers/mfd/Makefile                              |   1 +
>>>  drivers/mfd/lp87565.c                             | 103 ++++++++
>>>  include/linux/mfd/lp87565.h                       | 275 ++++++++++++++++++++++
>>>  5 files changed, 437 insertions(+)
>>>  create mode 100644 Documentation/devicetree/bindings/mfd/lp87565.txt
>>>  create mode 100644 drivers/mfd/lp87565.c
>>>  create mode 100644 include/linux/mfd/lp87565.h
>>>
>>> diff --git a/Documentation/devicetree/bindings/mfd/lp87565.txt b/Documentation/devicetree/bindings/mfd/lp87565.txt
>>> new file mode 100644
>>> index 0000000..38a00a1
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/mfd/lp87565.txt
>>> @@ -0,0 +1,44 @@
>>> +TI LP873565 PMIC MFD driver
>>> +
>>> +Required properties:
>>> +  - compatible:	"ti,lp87565", "ti,lp87565-q1"
>>
>> The of_device_id table in the driver only seems to match for
>> "ti,lp87565-q1", not "ti,lp87565".
> 
> I will add both. ti,lp87565 is the generic one and the ti,lp87565-q1 is
> a specific one with dual phase regulators.
> 
>>
>>> +  - reg:		I2C slave address.
>>> +  - gpio-controller:	Marks the device node as a GPIO Controller.
>>> +  - #gpio-cells:	Should be two.  The first cell is the pin number and
>>> +			the second cell is used to specify flags.
>>> +			See ../gpio/gpio.txt for more information.
>>> +  - xxx-in-supply:	Phandle to parent supply node of each regulator
>>> +			populated under regulators node. xxx should match
>>> +			the supply_name populated in driver.
>>> +  - regulators:	List of child nodes that specify the regulator
>>> +			initialization data.
>>> +Example:
>>> +
>>> +lp87565: lp87565@60 {
>>
>> pmic: lp87565@60 {
>>
>> Is more standard.
> 
> Sure. I will change that.
> 
> Thanks for reviewing.

Andrew,

In case there are 2 PMICs on a board this would be confusing.
Instead i would prefer to use:

lp87565_pmic: lp87565@60 {

There are already existing entries of that form.

Thanks,
Keerthy

> 
>>
>>> +	compatible = "ti,lp87565-q1";
>>> +	reg = <0x60>;
>>> +	gpio-controller;
>>> +	#gpio-cells = <2>;
>>> +
>>> +	buck10-in-supply =<&vsys_3v3>;
>>> +	buck23-in-supply =<&vsys_3v3>;
>>> +	regulators: regulators {
>>> +		buck10_reg: buck10 {
>>> +			/*VDD_MPU*/
>>> +			regulator-name = "buck10";
>>> +			regulator-min-microvolt = <850000>;
>>> +			regulator-max-microvolt = <1250000>;
>>> +			regulator-always-on;
>>> +			regulator-boot-on;
>>> +		};
>>> +
>>> +		buck23_reg: buck23 {
>>> +			/* VDD_GPU*/
>>> +			regulator-name = "buck23";
>>> +			regulator-min-microvolt = <850000>;
>>> +			regulator-max-microvolt = <1250000>;
>>> +			regulator-boot-on;
>>> +			regulator-always-on;
>>> +		};
>>> +	};
>>> +};
>>> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
>>> index 3eb5c93..5e884f3 100644
>>> --- a/drivers/mfd/Kconfig
>>> +++ b/drivers/mfd/Kconfig
>>> @@ -1325,6 +1325,20 @@ config MFD_TI_LP873X
>>>  	  This driver can also be built as a module. If so, the module
>>>  	  will be called lp873x.
>>>  
>>> +config MFD_TI_LP87565
>>> +	tristate "TI LP87565 Power Management IC"
>>> +	depends on I2C
>>> +	select MFD_CORE
>>> +	select REGMAP_I2C
>>> +	help
>>> +	  If you say yes here then you get support for the LP87565 series of
>>> +	  Power Management Integrated Circuits (PMIC).
>>> +	  These include voltage regulators, thermal protection, configurable
>>> +	  General Purpose Outputs (GPO) that are used in portable devices.
>>> +
>>> +	  This driver can also be built as a module. If so, the module
>>> +	  will be called lp87565.
>>> +
>>>  config MFD_TPS65218
>>>  	tristate "TI TPS65218 Power Management chips"
>>>  	depends on I2C
>>> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
>>> index c16bf1e..7edbe1b 100644
>>> --- a/drivers/mfd/Makefile
>>> +++ b/drivers/mfd/Makefile
>>> @@ -25,6 +25,7 @@ obj-$(CONFIG_HTC_PASIC3)	+= htc-pasic3.o
>>>  obj-$(CONFIG_HTC_I2CPLD)	+= htc-i2cpld.o
>>>  
>>>  obj-$(CONFIG_MFD_TI_LP873X)	+= lp873x.o
>>> +obj-$(CONFIG_MFD_TI_LP87565)	+= lp87565.o
>>>  
>>>  obj-$(CONFIG_MFD_DAVINCI_VOICECODEC)	+= davinci_voicecodec.o
>>>  obj-$(CONFIG_MFD_DM355EVM_MSP)	+= dm355evm_msp.o
>>> diff --git a/drivers/mfd/lp87565.c b/drivers/mfd/lp87565.c
>>> new file mode 100644
>>> index 0000000..dff882f
>>> --- /dev/null
>>> +++ b/drivers/mfd/lp87565.c
>>> @@ -0,0 +1,103 @@
>>> +/*
>>> + * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
>>> + *
>>> + * Author: Keerthy <j-keerthy@ti.com>
>>> + *
>>> + * 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.
>>> + *
>>> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
>>> + * kind, whether express or implied; without even the implied warranty
>>> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>> + * GNU General Public License for more details.
>>> + */
>>> +
>>> +#include <linux/interrupt.h>
>>> +#include <linux/mfd/core.h>
>>> +#include <linux/module.h>
>>> +#include <linux/of_device.h>
>>> +#include <linux/regmap.h>
>>> +
>>> +#include <linux/mfd/lp87565.h>
>>> +
>>> +static const struct regmap_config lp87565_regmap_config = {
>>> +	.reg_bits = 8,
>>> +	.val_bits = 8,
>>> +	.max_register = LP87565_REG_MAX,
>>> +};
>>> +
>>> +static const struct mfd_cell lp87565_cells[] = {
>>> +	{ .name = "lp87565-q1-regulator", },
>>> +	{ .name = "lp87565-q1-gpio", },
>>> +};
>>> +
>>> +static const struct of_device_id of_lp87565_match_table[] = {
>>> +	{
>>> +		.compatible = "ti,lp87565-q1",
>>> +		.data = (void *)LP87565_DEVICE_TYPE_LP87565_Q1,
>>> +	},
>>> +	{}
>>> +};
>>> +MODULE_DEVICE_TABLE(of, of_lp87565_match_table);
>>> +
>>> +static int lp87565_probe(struct i2c_client *client,
>>> +			 const struct i2c_device_id *ids)
>>> +{
>>> +	struct lp87565 *lp87565;
>>> +	const struct of_device_id *of_id;
>>> +	int ret;
>>> +	unsigned int otpid;
>>> +
>>> +	lp87565 = devm_kzalloc(&client->dev, sizeof(*lp87565), GFP_KERNEL);
>>> +	if (!lp87565)
>>> +		return -ENOMEM;
>>> +
>>> +	lp87565->dev = &client->dev;
>>> +
>>> +	lp87565->regmap = devm_regmap_init_i2c(client, &lp87565_regmap_config);
>>> +	if (IS_ERR(lp87565->regmap)) {
>>> +		ret = PTR_ERR(lp87565->regmap);
>>> +		dev_err(lp87565->dev,
>>> +			"Failed to initialize register map: %d\n", ret);
>>> +		return ret;
>>> +	}
>>> +
>>> +	ret = regmap_read(lp87565->regmap, LP87565_REG_OTP_REV, &otpid);
>>> +	if (ret) {
>>> +		dev_err(lp87565->dev, "Failed to read OTP ID\n");
>>> +		return ret;
>>> +	}
>>> +
>>> +	lp87565->rev = otpid & LP87565_OTP_REV_OTP_ID;
>>> +	of_id = of_match_device(of_lp87565_match_table, &client->dev);
>>> +	if (of_id)
>>> +		lp87565->dev_type = (enum lp87565_device_type)of_id->data;
>>> +
>>> +	i2c_set_clientdata(client, lp87565);
>>> +
>>> +	ret = mfd_add_devices(lp87565->dev, PLATFORM_DEVID_AUTO, lp87565_cells,
>>> +			      ARRAY_SIZE(lp87565_cells), NULL, 0, NULL);
>>> +
>>> +	return ret;
>>> +}
>>> +
>>> +static const struct i2c_device_id lp87565_id_table[] = {
>>> +	{ "lp87565-q1", 0 },
>>> +	{ },
>>> +};
>>> +MODULE_DEVICE_TABLE(i2c, lp87565_id_table);
>>> +
>>> +static struct i2c_driver lp87565_driver = {
>>> +	.driver	= {
>>> +		.name	= "lp87565",
>>> +		.of_match_table = of_lp87565_match_table,
>>> +	},
>>> +	.probe		= lp87565_probe,
>>> +	.id_table	= lp87565_id_table,
>>> +};
>>> +module_i2c_driver(lp87565_driver);
>>> +
>>> +MODULE_AUTHOR("J Keerthy <j-keerthy@ti.com>");
>>> +MODULE_DESCRIPTION("lp87565 chip family Multi-Function Device driver");
>>> +MODULE_LICENSE("GPL v2");
>>> diff --git a/include/linux/mfd/lp87565.h b/include/linux/mfd/lp87565.h
>>> new file mode 100644
>>> index 0000000..6112365
>>> --- /dev/null
>>> +++ b/include/linux/mfd/lp87565.h
>>> @@ -0,0 +1,275 @@
>>> +/*
>>> + * Functions to access LP87565 power management chip.
>>> + *
>>> + * Copyright (C) 2016 Texas Instruments Incorporated - http://www.ti.com/
>>> + *
>>> + * 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.
>>> + *
>>> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
>>> + * kind, whether express or implied; without even the implied warranty
>>> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>> + * GNU General Public License for more details.
>>> + */
>>> +
>>> +#ifndef __LINUX_MFD_LP87565_H
>>> +#define __LINUX_MFD_LP87565_H
>>> +
>>> +#include <linux/i2c.h>
>>> +#include <linux/regulator/driver.h>
>>> +#include <linux/regulator/machine.h>
>>> +
>>> +enum lp87565_device_type {
>>> +	LP87565_DEVICE_TYPE_UNKNOWN	= 0,
>>> +	LP87565_DEVICE_TYPE_LP87565_Q1,
>>> +};
>>> +
>>> +/* All register addresses */
>>> +#define LP87565_REG_DEV_REV		0X00
>>> +#define LP87565_REG_OTP_REV		0X01
>>> +#define LP87565_REG_BUCK0_CTRL_1		0X02
>>> +#define LP87565_REG_BUCK0_CTRL_2		0X03
>>> +
>>> +#define LP87565_REG_BUCK1_CTRL_1		0X04
>>> +#define LP87565_REG_BUCK1_CTRL_2		0X05
>>> +
>>> +#define LP87565_REG_BUCK2_CTRL_1		0X06
>>> +#define LP87565_REG_BUCK2_CTRL_2		0X07
>>> +
>>> +#define LP87565_REG_BUCK3_CTRL_1		0X08
>>> +#define LP87565_REG_BUCK3_CTRL_2		0X09
>>> +
>>> +#define LP87565_REG_BUCK0_VOUT			0X0A
>>> +#define LP87565_REG_BUCK0_FLOOR_VOUT		0X0B
>>> +
>>> +#define LP87565_REG_BUCK1_VOUT			0X0C
>>> +#define LP87565_REG_BUCK1_FLOOR_VOUT		0X0D
>>> +
>>> +#define LP87565_REG_BUCK2_VOUT			0X0E
>>> +#define LP87565_REG_BUCK2_FLOOR_VOUT		0X0F
>>> +
>>> +#define LP87565_REG_BUCK3_VOUT			0X10
>>> +#define LP87565_REG_BUCK3_FLOOR_VOUT		0X11
>>> +
>>> +#define LP87565_REG_BUCK0_DELAY			0X12
>>> +#define LP87565_REG_BUCK1_DELAY			0X13
>>> +
>>> +#define LP87565_REG_BUCK2_DELAY			0X14
>>> +#define LP87565_REG_BUCK3_DELAY			0X15
>>> +
>>> +#define LP87565_REG_GPO2_DELAY			0X16
>>> +#define LP87565_REG_GPO3_DELAY			0X17
>>> +#define LP87565_REG_RESET			0X18
>>> +#define LP87565_REG_CONFIG			0X19
>>> +
>>> +#define LP87565_REG_INT_TOP_1			0X1A
>>> +#define LP87565_REG_INT_TOP_2			0X1B
>>> +
>>> +#define LP87565_REG_INT_BUCK_0_1		0X1C
>>> +#define LP87565_REG_INT_BUCK_2_3		0X1D
>>> +#define LP87565_REG_TOP_STAT			0X1E
>>> +#define LP87565_REG_BUCK_0_1_STAT		0X1F
>>> +#define LP87565_REG_BUCK_2_3_STAT		0x20
>>> +
>>> +#define LP87565_REG_TOP_MASK_1			0x21
>>> +#define LP87565_REG_TOP_MASK_2			0x22
>>> +
>>> +#define LP87565_REG_BUCK_0_1_MASK		0x23
>>> +#define LP87565_REG_BUCK_2_3_MASK		0x24
>>> +#define LP87565_REG_SEL_I_LOAD			0x25
>>> +
>>> +#define LP87565_REG_I_LOAD_2			0x26
>>> +#define LP87565_REG_I_LOAD_1			0x27
>>> +
>>> +#define LP87565_REG_PGOOD_CTRL1			0x28
>>> +#define LP87565_REG_PGOOD_CTRL2			0x29
>>> +#define LP87565_REG_PGOOD_FLT			0x2A
>>> +#define LP87565_REG_PLL_CTRL			0x2B
>>> +#define LP87565_REG_PIN_FUNCTION		0x2C
>>> +#define LP87565_REG_GPIO_CONFIG			0x2D
>>> +#define LP87565_REG_GPIO_IN			0x2E
>>> +#define LP87565_REG_GPIO_OUT			0x2F
>>> +
>>> +#define LP87565_REG_MAX			LP87565_REG_GPIO_OUT
>>> +
>>> +/* Register field definitions */
>>> +#define LP87565_DEV_REV_DEV_ID			0xC0
>>> +#define LP87565_DEV_REV_ALL_LAYER		0x30
>>> +#define LP87565_DEV_REV_METAL_LAYER		0x0F
>>> +
>>> +#define LP87565_OTP_REV_OTP_ID			0xFF
>>> +
>>> +#define LP87565_BUCK_CTRL_1_EN			BIT(7)
>>> +#define LP87565_BUCK_CTRL_1_EN_PIN_CTRL		BIT(6)
>>> +#define LP87565_BUCK_CTRL_1_PIN_SELECT_EN	0x30
>>> +
>>> +#define LP87565_BUCK_CTRL_1_ROOF_FLOOR_EN	BIT(3)
>>> +#define LP87565_BUCK_CTRL_1_RDIS_EN		BIT(2)
>>> +#define LP87565_BUCK_CTRL_1_FPWM		BIT(1)
>>> +/* Bit0 is reserved for BUCK1 and BUCK3 and valid only for BUCK0 and BUCK2 */
>>> +#define LP87565_BUCK_CTRL_1_FPWM_MP_0_2		BIT(0)
>>> +
>>> +#define LP87565_BUCK_CTRL_2_ILIM		0x38
>>> +#define LP87565_BUCK_CTRL_2_SLEW_RATE		0x07
>>> +
>>> +#define LP87565_BUCK_VSET			0xFF
>>> +#define LP87565_BUCK_FLOOR_VSET			0xFF
>>> +
>>> +#define LP87565_BUCK_SHUTDOWN_DELAY		0xF0
>>> +#define LP87565_BUCK_STARTUP_DELAY		0x0F
>>> +
>>> +#define LP87565_GPIO_SHUTDOWN_DELAY		0xF0
>>> +#define LP87565_GPIO_STARTUP_DELAY		0x0F
>>> +
>>> +#define LP87565_RESET_SW_RESET			BIT(0)
>>> +
>>> +#define LP87565_CONFIG_DOUBLE_DELAY		BIT(7)
>>> +#define LP87565_CONFIG_CLKIN_PD			BIT(6)
>>> +#define LP87565_CONFIG_EN4_PD			BIT(5)
>>> +#define LP87565_CONFIG_EN3_PD			BIT(4)
>>> +#define LP87565_CONFIG_TDIE_WARN_LEVEL		BIT(3)
>>> +#define LP87565_CONFIG_EN2_PD			BIT(2)
>>> +#define LP87565_CONFIG_EN1_PD			BIT(1)
>>> +
>>> +#define LP87565_INT_GPIO			BIT(7)
>>> +#define LP87565_INT_BUCK23			BIT(6)
>>> +#define LP87565_INT_BUCK01			BIT(5)
>>> +#define LP87565_NO_SYNC_CLK			BIT(4)
>>> +#define LP87565_TDIE_SD				BIT(3)
>>> +#define LP87565_TDIE_WARN			BIT(2)
>>> +#define LP87565_INT_OVP				BIT(1)
>>> +#define LP87565_I_LOAD_READY			BIT(0)
>>> +
>>> +#define LP87565_INT_TOP2_RESET_REG		BIT(0)
>>> +
>>> +#define LP87565_BUCK1_PG_INT			BIT(6)
>>> +#define LP87565_BUCK1_SC_INT			BIT(5)
>>> +#define LP87565_BUCK1_ILIM_INT			BIT(4)
>>> +#define LP87565_BUCK0_PG_INT			BIT(2)
>>> +#define LP87565_BUCK0_SC_INT			BIT(1)
>>> +#define LP87565_BUCK0_ILIM_INT			BIT(0)
>>> +
>>> +#define LP87565_BUCK3_PG_INT			BIT(6)
>>> +#define LP87565_BUCK3_SC_INT			BIT(5)
>>> +#define LP87565_BUCK3_ILIM_INT			BIT(4)
>>> +#define LP87565_BUCK2_PG_INT			BIT(2)
>>> +#define LP87565_BUCK2_SC_INT			BIT(1)
>>> +#define LP87565_BUCK2_ILIM_INT			BIT(0)
>>> +
>>> +#define LP87565_SYNC_CLK_STAT			BIT(4)
>>> +#define LP87565_TDIE_SD_STAT			BIT(3)
>>> +#define LP87565_TDIE_WARN_STAT			BIT(2)
>>> +#define LP87565_OVP_STAT			BIT(1)
>>> +
>>> +#define LP87565_BUCK1_STAT			BIT(7)
>>> +#define LP87565_BUCK1_PG_STAT			BIT(6)
>>> +#define LP87565_BUCK1_ILIM_STAT			BIT(4)
>>> +#define LP87565_BUCK0_STAT			BIT(3)
>>> +#define LP87565_BUCK0_PG_STAT			BIT(2)
>>> +#define LP87565_BUCK0_ILIM_STAT			BIT(0)
>>> +
>>> +#define LP87565_BUCK3_STAT			BIT(7)
>>> +#define LP87565_BUCK3_PG_STAT			BIT(6)
>>> +#define LP87565_BUCK3_ILIM_STAT			BIT(4)
>>> +#define LP87565_BUCK2_STAT			BIT(3)
>>> +#define LP87565_BUCK2_PG_STAT			BIT(2)
>>> +#define LP87565_BUCK2_ILIM_STAT			BIT(0)
>>> +
>>> +#define LPL87565_GPIO_MASK			BIT(7)
>>> +#define LPL87565_SYNC_CLK_MASK			BIT(4)
>>> +#define LPL87565_TDIE_WARN_MASK			BIT(2)
>>> +#define LPL87565_I_LOAD_READY_MASK		BIT(0)
>>> +
>>> +#define LPL87565_RESET_REG_MASK			BIT(0)
>>> +
>>> +#define LPL87565_BUCK1_PG_MASK			BIT(6)
>>> +#define LPL87565_BUCK1_ILIM_MASK		BIT(4)
>>> +#define LPL87565_BUCK0_PG_MASK			BIT(2)
>>> +#define LPL87565_BUCK0_ILIM_MASK		BIT(0)
>>> +
>>> +#define LPL87565_BUCK3_PG_MASK			BIT(6)
>>> +#define LPL87565_BUCK3_ILIM_MASK		BIT(4)
>>> +#define LPL87565_BUCK2_PG_MASK			BIT(2)
>>> +#define LPL87565_BUCK2_ILIM_MASK		BIT(0)
>>> +
>>> +#define LP87565_LOAD_CURRENT_BUCK_SELECT	0x3
>>> +
>>> +#define LP87565_I_LOAD2_BUCK_LOAD_CURRENT	0x3
>>> +#define LP87565_I_LOAD1_BUCK_LOAD_CURRENT	0xFF
>>> +
>>> +#define LP87565_PG3_SEL				0xC0
>>> +#define LP87565_PG2_SEL				0x30
>>> +#define LP87565_PG1_SEL				0x0C
>>> +#define LP87565_PG0_SEL				0x03
>>> +
>>> +#define LP87565_HALF_DAY			BIT(7)
>>> +#define LP87565_EN_PG0_NINT			BIT(6)
>>> +#define LP87565_PGOOD_SET_DELAY			BIT(5)
>>> +#define LP87565_EN_PGFLT_STAT			BIT(4)
>>> +#define LP87565_PGOOD_WINDOW			BIT(2)
>>> +#define LP87565_PGOOD_OD			BIT(1)
>>> +#define LP87565_PGOOD_POL			BIT(0)
>>> +
>>> +#define LP87565_PG3_FLT				BIT(3)
>>> +#define LP87565_PG2_FLT				BIT(2)
>>> +#define LP87565_PG1_FLT				BIT(1)
>>> +#define LP87565_PG0_FLT				BIT(0)
>>> +
>>> +#define LP87565_PLL_MODE			0xC0
>>> +#define LP87565_EXT_CLK_FREQ			0x1F
>>> +
>>> +#define LP87565_EN_SPREAD_SPEC			BIT(7)
>>> +#define LP87565_EN_PIN_CTRL_GPIO3		BIT(6)
>>> +#define LP87565_EN_PIN_SELECT_GPIO3		BIT(5)
>>> +#define LP87565_EN_PIN_CTRL_GPIO2		BIT(4)
>>> +#define LP87565_EN_PIN_SELECT_GPIO2		BIT(3)
>>> +#define LP87565_GPIO3_SEL			BIT(2)
>>> +#define LP87565_GPIO2_SEL			BIT(1)
>>> +#define LP87565_GPIO1_SEL			BIT(0)
>>> +
>>> +#define LP87565_GOIO3_OD			BIT(6)
>>> +#define LP87565_GOIO2_OD			BIT(5)
>>> +#define LP87565_GOIO1_OD			BIT(4)
>>> +#define LP87565_GOIO3_DIR			BIT(2)
>>> +#define LP87565_GOIO2_DIR			BIT(1)
>>> +#define LP87565_GOIO1_DIR			BIT(0)
>>> +
>>> +#define LP87565_GOIO3_IN			BIT(2)
>>> +#define LP87565_GOIO2_IN			BIT(1)
>>> +#define LP87565_GOIO1_IN			BIT(0)
>>> +
>>> +#define LP87565_GOIO3_OUT			BIT(2)
>>> +#define LP87565_GOIO2_OUT			BIT(1)
>>> +#define LP87565_GOIO1_OUT			BIT(0)
>>> +
>>> +/* Number of step-down converters available */
>>> +#define LP87565_NUM_BUCK		6
>>> +
>>> +enum LP87565_regulator_id {
>>> +	/* BUCK's */
>>> +	LP87565_BUCK_0,
>>> +	LP87565_BUCK_1,
>>> +	LP87565_BUCK_2,
>>> +	LP87565_BUCK_3,
>>> +	LP87565_BUCK_10,
>>> +	LP87565_BUCK_23,
>>> +};
>>> +
>>> +/**
>>> + * struct LP87565 - state holder for the LP87565 driver
>>> + * @dev: struct device pointer for MFD device
>>> + * @rev: revision of the LP87565
>>> + * @dev_type: The device type for example lp87565-q1
>>> + * @lock: lock guarding the data structure
>>> + * @regmap: register map of the LP87565 PMIC
>>> + *
>>> + * Device data may be used to access the LP87565 chip
>>> + */
>>> +struct lp87565 {
>>> +	struct device *dev;
>>> +	u8 rev;
>>> +	u8 dev_type;
>>> +	struct regmap *regmap;
>>> +};
>>> +#endif /* __LINUX_MFD_LP87565_H */
>>>

[toc] | [prev] | [next] | [standalone]


#1647690

FromLee Jones <lee.jones@linaro.org>
Date2017-05-23 09:00 +0200
Message-ID<tKbXr-7Xu-5@gated-at.bofh.it>
In reply to#1647597
On Tue, 23 May 2017, Keerthy wrote:

> 
> 
> On Monday 22 May 2017 09:53 AM, Keerthy wrote:
> > 
> > 
> > On Friday 19 May 2017 09:12 PM, Andrew F. Davis wrote:
> >> On 05/19/2017 07:42 AM, Keerthy wrote:
> >>> The LP87565 chip is a power management IC for Portable Navigation Systems
> >>> and Tablet Computing devices. It contains the following components:
> >>>
> >>>         - Configurable Bucks(Single and multi-phase).
> >>>         - Configurable General Purpose Output Signals (GPO).
> >>>
> >>> The LP87565-Q1 variant device uses two 2-phase outputs configuration,
> >>> Buck0 is master for Buck0/1 output and Buck2 is master for Buck2/3
> >>> output.
> >>>
> >>> Signed-off-by: Keerthy <j-keerthy@ti.com>
> >>> ---
> >>>  Documentation/devicetree/bindings/mfd/lp87565.txt |  44 ++++
> >>>  drivers/mfd/Kconfig                               |  14 ++
> >>>  drivers/mfd/Makefile                              |   1 +
> >>>  drivers/mfd/lp87565.c                             | 103 ++++++++
> >>>  include/linux/mfd/lp87565.h                       | 275 ++++++++++++++++++++++
> >>>  5 files changed, 437 insertions(+)
> >>>  create mode 100644 Documentation/devicetree/bindings/mfd/lp87565.txt
> >>>  create mode 100644 drivers/mfd/lp87565.c
> >>>  create mode 100644 include/linux/mfd/lp87565.h
> >>>
> >>> diff --git a/Documentation/devicetree/bindings/mfd/lp87565.txt b/Documentation/devicetree/bindings/mfd/lp87565.txt
> >>> new file mode 100644
> >>> index 0000000..38a00a1
> >>> --- /dev/null
> >>> +++ b/Documentation/devicetree/bindings/mfd/lp87565.txt
> >>> @@ -0,0 +1,44 @@
> >>> +TI LP873565 PMIC MFD driver
> >>> +
> >>> +Required properties:
> >>> +  - compatible:	"ti,lp87565", "ti,lp87565-q1"
> >>
> >> The of_device_id table in the driver only seems to match for
> >> "ti,lp87565-q1", not "ti,lp87565".
> > 
> > I will add both. ti,lp87565 is the generic one and the ti,lp87565-q1 is
> > a specific one with dual phase regulators.
> > 
> >>
> >>> +  - reg:		I2C slave address.
> >>> +  - gpio-controller:	Marks the device node as a GPIO Controller.
> >>> +  - #gpio-cells:	Should be two.  The first cell is the pin number and
> >>> +			the second cell is used to specify flags.
> >>> +			See ../gpio/gpio.txt for more information.
> >>> +  - xxx-in-supply:	Phandle to parent supply node of each regulator
> >>> +			populated under regulators node. xxx should match
> >>> +			the supply_name populated in driver.
> >>> +  - regulators:	List of child nodes that specify the regulator
> >>> +			initialization data.
> >>> +Example:
> >>> +
> >>> +lp87565: lp87565@60 {
> >>
> >> pmic: lp87565@60 {
> >>
> >> Is more standard.
> > 
> > Sure. I will change that.
> > 
> > Thanks for reviewing.
> 
> Andrew,
> 
> In case there are 2 PMICs on a board this would be confusing.
> Instead i would prefer to use:
> 
> lp87565_pmic: lp87565@60 {
> 
> There are already existing entries of that form.

This too is not correct.

It should be:

lp87565: pmic@60 {

The label at the front is flexible, but the node name should be the
generic type of device, so; gpio, regulator, serial, i2c, timer, pmic,
etc, followed by the value of the reg property.

> >>> +	compatible = "ti,lp87565-q1";
> >>> +	reg = <0x60>;
> >>> +	gpio-controller;
> >>> +	#gpio-cells = <2>;
> >>> +
> >>> +	buck10-in-supply =<&vsys_3v3>;
> >>> +	buck23-in-supply =<&vsys_3v3>;
> >>> +	regulators: regulators {
> >>> +		buck10_reg: buck10 {
> >>> +			/*VDD_MPU*/
> >>> +			regulator-name = "buck10";
> >>> +			regulator-min-microvolt = <850000>;
> >>> +			regulator-max-microvolt = <1250000>;
> >>> +			regulator-always-on;
> >>> +			regulator-boot-on;
> >>> +		};
> >>> +
> >>> +		buck23_reg: buck23 {
> >>> +			/* VDD_GPU*/
> >>> +			regulator-name = "buck23";
> >>> +			regulator-min-microvolt = <850000>;
> >>> +			regulator-max-microvolt = <1250000>;
> >>> +			regulator-boot-on;
> >>> +			regulator-always-on;
> >>> +		};
> >>> +	};
> >>> +};
> >>> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> >>> index 3eb5c93..5e884f3 100644
> >>> --- a/drivers/mfd/Kconfig
> >>> +++ b/drivers/mfd/Kconfig
> >>> @@ -1325,6 +1325,20 @@ config MFD_TI_LP873X
> >>>  	  This driver can also be built as a module. If so, the module
> >>>  	  will be called lp873x.
> >>>  
> >>> +config MFD_TI_LP87565
> >>> +	tristate "TI LP87565 Power Management IC"
> >>> +	depends on I2C
> >>> +	select MFD_CORE
> >>> +	select REGMAP_I2C
> >>> +	help
> >>> +	  If you say yes here then you get support for the LP87565 series of
> >>> +	  Power Management Integrated Circuits (PMIC).
> >>> +	  These include voltage regulators, thermal protection, configurable
> >>> +	  General Purpose Outputs (GPO) that are used in portable devices.
> >>> +
> >>> +	  This driver can also be built as a module. If so, the module
> >>> +	  will be called lp87565.
> >>> +
> >>>  config MFD_TPS65218
> >>>  	tristate "TI TPS65218 Power Management chips"
> >>>  	depends on I2C
> >>> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> >>> index c16bf1e..7edbe1b 100644
> >>> --- a/drivers/mfd/Makefile
> >>> +++ b/drivers/mfd/Makefile
> >>> @@ -25,6 +25,7 @@ obj-$(CONFIG_HTC_PASIC3)	+= htc-pasic3.o
> >>>  obj-$(CONFIG_HTC_I2CPLD)	+= htc-i2cpld.o
> >>>  
> >>>  obj-$(CONFIG_MFD_TI_LP873X)	+= lp873x.o
> >>> +obj-$(CONFIG_MFD_TI_LP87565)	+= lp87565.o
> >>>  
> >>>  obj-$(CONFIG_MFD_DAVINCI_VOICECODEC)	+= davinci_voicecodec.o
> >>>  obj-$(CONFIG_MFD_DM355EVM_MSP)	+= dm355evm_msp.o
> >>> diff --git a/drivers/mfd/lp87565.c b/drivers/mfd/lp87565.c
> >>> new file mode 100644
> >>> index 0000000..dff882f
> >>> --- /dev/null
> >>> +++ b/drivers/mfd/lp87565.c
> >>> @@ -0,0 +1,103 @@
> >>> +/*
> >>> + * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
> >>> + *
> >>> + * Author: Keerthy <j-keerthy@ti.com>
> >>> + *
> >>> + * 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.
> >>> + *
> >>> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> >>> + * kind, whether express or implied; without even the implied warranty
> >>> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> >>> + * GNU General Public License for more details.
> >>> + */
> >>> +
> >>> +#include <linux/interrupt.h>
> >>> +#include <linux/mfd/core.h>
> >>> +#include <linux/module.h>
> >>> +#include <linux/of_device.h>
> >>> +#include <linux/regmap.h>
> >>> +
> >>> +#include <linux/mfd/lp87565.h>
> >>> +
> >>> +static const struct regmap_config lp87565_regmap_config = {
> >>> +	.reg_bits = 8,
> >>> +	.val_bits = 8,
> >>> +	.max_register = LP87565_REG_MAX,
> >>> +};
> >>> +
> >>> +static const struct mfd_cell lp87565_cells[] = {
> >>> +	{ .name = "lp87565-q1-regulator", },
> >>> +	{ .name = "lp87565-q1-gpio", },
> >>> +};
> >>> +
> >>> +static const struct of_device_id of_lp87565_match_table[] = {
> >>> +	{
> >>> +		.compatible = "ti,lp87565-q1",
> >>> +		.data = (void *)LP87565_DEVICE_TYPE_LP87565_Q1,
> >>> +	},
> >>> +	{}
> >>> +};
> >>> +MODULE_DEVICE_TABLE(of, of_lp87565_match_table);
> >>> +
> >>> +static int lp87565_probe(struct i2c_client *client,
> >>> +			 const struct i2c_device_id *ids)
> >>> +{
> >>> +	struct lp87565 *lp87565;
> >>> +	const struct of_device_id *of_id;
> >>> +	int ret;
> >>> +	unsigned int otpid;
> >>> +
> >>> +	lp87565 = devm_kzalloc(&client->dev, sizeof(*lp87565), GFP_KERNEL);
> >>> +	if (!lp87565)
> >>> +		return -ENOMEM;
> >>> +
> >>> +	lp87565->dev = &client->dev;
> >>> +
> >>> +	lp87565->regmap = devm_regmap_init_i2c(client, &lp87565_regmap_config);
> >>> +	if (IS_ERR(lp87565->regmap)) {
> >>> +		ret = PTR_ERR(lp87565->regmap);
> >>> +		dev_err(lp87565->dev,
> >>> +			"Failed to initialize register map: %d\n", ret);
> >>> +		return ret;
> >>> +	}
> >>> +
> >>> +	ret = regmap_read(lp87565->regmap, LP87565_REG_OTP_REV, &otpid);
> >>> +	if (ret) {
> >>> +		dev_err(lp87565->dev, "Failed to read OTP ID\n");
> >>> +		return ret;
> >>> +	}
> >>> +
> >>> +	lp87565->rev = otpid & LP87565_OTP_REV_OTP_ID;
> >>> +	of_id = of_match_device(of_lp87565_match_table, &client->dev);
> >>> +	if (of_id)
> >>> +		lp87565->dev_type = (enum lp87565_device_type)of_id->data;
> >>> +
> >>> +	i2c_set_clientdata(client, lp87565);
> >>> +
> >>> +	ret = mfd_add_devices(lp87565->dev, PLATFORM_DEVID_AUTO, lp87565_cells,
> >>> +			      ARRAY_SIZE(lp87565_cells), NULL, 0, NULL);
> >>> +
> >>> +	return ret;
> >>> +}
> >>> +
> >>> +static const struct i2c_device_id lp87565_id_table[] = {
> >>> +	{ "lp87565-q1", 0 },
> >>> +	{ },
> >>> +};
> >>> +MODULE_DEVICE_TABLE(i2c, lp87565_id_table);
> >>> +
> >>> +static struct i2c_driver lp87565_driver = {
> >>> +	.driver	= {
> >>> +		.name	= "lp87565",
> >>> +		.of_match_table = of_lp87565_match_table,
> >>> +	},
> >>> +	.probe		= lp87565_probe,
> >>> +	.id_table	= lp87565_id_table,
> >>> +};
> >>> +module_i2c_driver(lp87565_driver);
> >>> +
> >>> +MODULE_AUTHOR("J Keerthy <j-keerthy@ti.com>");
> >>> +MODULE_DESCRIPTION("lp87565 chip family Multi-Function Device driver");
> >>> +MODULE_LICENSE("GPL v2");
> >>> diff --git a/include/linux/mfd/lp87565.h b/include/linux/mfd/lp87565.h
> >>> new file mode 100644
> >>> index 0000000..6112365
> >>> --- /dev/null
> >>> +++ b/include/linux/mfd/lp87565.h
> >>> @@ -0,0 +1,275 @@
> >>> +/*
> >>> + * Functions to access LP87565 power management chip.
> >>> + *
> >>> + * Copyright (C) 2016 Texas Instruments Incorporated - http://www.ti.com/
> >>> + *
> >>> + * 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.
> >>> + *
> >>> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> >>> + * kind, whether express or implied; without even the implied warranty
> >>> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> >>> + * GNU General Public License for more details.
> >>> + */
> >>> +
> >>> +#ifndef __LINUX_MFD_LP87565_H
> >>> +#define __LINUX_MFD_LP87565_H
> >>> +
> >>> +#include <linux/i2c.h>
> >>> +#include <linux/regulator/driver.h>
> >>> +#include <linux/regulator/machine.h>
> >>> +
> >>> +enum lp87565_device_type {
> >>> +	LP87565_DEVICE_TYPE_UNKNOWN	= 0,
> >>> +	LP87565_DEVICE_TYPE_LP87565_Q1,
> >>> +};
> >>> +
> >>> +/* All register addresses */
> >>> +#define LP87565_REG_DEV_REV		0X00
> >>> +#define LP87565_REG_OTP_REV		0X01
> >>> +#define LP87565_REG_BUCK0_CTRL_1		0X02
> >>> +#define LP87565_REG_BUCK0_CTRL_2		0X03
> >>> +
> >>> +#define LP87565_REG_BUCK1_CTRL_1		0X04
> >>> +#define LP87565_REG_BUCK1_CTRL_2		0X05
> >>> +
> >>> +#define LP87565_REG_BUCK2_CTRL_1		0X06
> >>> +#define LP87565_REG_BUCK2_CTRL_2		0X07
> >>> +
> >>> +#define LP87565_REG_BUCK3_CTRL_1		0X08
> >>> +#define LP87565_REG_BUCK3_CTRL_2		0X09
> >>> +
> >>> +#define LP87565_REG_BUCK0_VOUT			0X0A
> >>> +#define LP87565_REG_BUCK0_FLOOR_VOUT		0X0B
> >>> +
> >>> +#define LP87565_REG_BUCK1_VOUT			0X0C
> >>> +#define LP87565_REG_BUCK1_FLOOR_VOUT		0X0D
> >>> +
> >>> +#define LP87565_REG_BUCK2_VOUT			0X0E
> >>> +#define LP87565_REG_BUCK2_FLOOR_VOUT		0X0F
> >>> +
> >>> +#define LP87565_REG_BUCK3_VOUT			0X10
> >>> +#define LP87565_REG_BUCK3_FLOOR_VOUT		0X11
> >>> +
> >>> +#define LP87565_REG_BUCK0_DELAY			0X12
> >>> +#define LP87565_REG_BUCK1_DELAY			0X13
> >>> +
> >>> +#define LP87565_REG_BUCK2_DELAY			0X14
> >>> +#define LP87565_REG_BUCK3_DELAY			0X15
> >>> +
> >>> +#define LP87565_REG_GPO2_DELAY			0X16
> >>> +#define LP87565_REG_GPO3_DELAY			0X17
> >>> +#define LP87565_REG_RESET			0X18
> >>> +#define LP87565_REG_CONFIG			0X19
> >>> +
> >>> +#define LP87565_REG_INT_TOP_1			0X1A
> >>> +#define LP87565_REG_INT_TOP_2			0X1B
> >>> +
> >>> +#define LP87565_REG_INT_BUCK_0_1		0X1C
> >>> +#define LP87565_REG_INT_BUCK_2_3		0X1D
> >>> +#define LP87565_REG_TOP_STAT			0X1E
> >>> +#define LP87565_REG_BUCK_0_1_STAT		0X1F
> >>> +#define LP87565_REG_BUCK_2_3_STAT		0x20
> >>> +
> >>> +#define LP87565_REG_TOP_MASK_1			0x21
> >>> +#define LP87565_REG_TOP_MASK_2			0x22
> >>> +
> >>> +#define LP87565_REG_BUCK_0_1_MASK		0x23
> >>> +#define LP87565_REG_BUCK_2_3_MASK		0x24
> >>> +#define LP87565_REG_SEL_I_LOAD			0x25
> >>> +
> >>> +#define LP87565_REG_I_LOAD_2			0x26
> >>> +#define LP87565_REG_I_LOAD_1			0x27
> >>> +
> >>> +#define LP87565_REG_PGOOD_CTRL1			0x28
> >>> +#define LP87565_REG_PGOOD_CTRL2			0x29
> >>> +#define LP87565_REG_PGOOD_FLT			0x2A
> >>> +#define LP87565_REG_PLL_CTRL			0x2B
> >>> +#define LP87565_REG_PIN_FUNCTION		0x2C
> >>> +#define LP87565_REG_GPIO_CONFIG			0x2D
> >>> +#define LP87565_REG_GPIO_IN			0x2E
> >>> +#define LP87565_REG_GPIO_OUT			0x2F
> >>> +
> >>> +#define LP87565_REG_MAX			LP87565_REG_GPIO_OUT
> >>> +
> >>> +/* Register field definitions */
> >>> +#define LP87565_DEV_REV_DEV_ID			0xC0
> >>> +#define LP87565_DEV_REV_ALL_LAYER		0x30
> >>> +#define LP87565_DEV_REV_METAL_LAYER		0x0F
> >>> +
> >>> +#define LP87565_OTP_REV_OTP_ID			0xFF
> >>> +
> >>> +#define LP87565_BUCK_CTRL_1_EN			BIT(7)
> >>> +#define LP87565_BUCK_CTRL_1_EN_PIN_CTRL		BIT(6)
> >>> +#define LP87565_BUCK_CTRL_1_PIN_SELECT_EN	0x30
> >>> +
> >>> +#define LP87565_BUCK_CTRL_1_ROOF_FLOOR_EN	BIT(3)
> >>> +#define LP87565_BUCK_CTRL_1_RDIS_EN		BIT(2)
> >>> +#define LP87565_BUCK_CTRL_1_FPWM		BIT(1)
> >>> +/* Bit0 is reserved for BUCK1 and BUCK3 and valid only for BUCK0 and BUCK2 */
> >>> +#define LP87565_BUCK_CTRL_1_FPWM_MP_0_2		BIT(0)
> >>> +
> >>> +#define LP87565_BUCK_CTRL_2_ILIM		0x38
> >>> +#define LP87565_BUCK_CTRL_2_SLEW_RATE		0x07
> >>> +
> >>> +#define LP87565_BUCK_VSET			0xFF
> >>> +#define LP87565_BUCK_FLOOR_VSET			0xFF
> >>> +
> >>> +#define LP87565_BUCK_SHUTDOWN_DELAY		0xF0
> >>> +#define LP87565_BUCK_STARTUP_DELAY		0x0F
> >>> +
> >>> +#define LP87565_GPIO_SHUTDOWN_DELAY		0xF0
> >>> +#define LP87565_GPIO_STARTUP_DELAY		0x0F
> >>> +
> >>> +#define LP87565_RESET_SW_RESET			BIT(0)
> >>> +
> >>> +#define LP87565_CONFIG_DOUBLE_DELAY		BIT(7)
> >>> +#define LP87565_CONFIG_CLKIN_PD			BIT(6)
> >>> +#define LP87565_CONFIG_EN4_PD			BIT(5)
> >>> +#define LP87565_CONFIG_EN3_PD			BIT(4)
> >>> +#define LP87565_CONFIG_TDIE_WARN_LEVEL		BIT(3)
> >>> +#define LP87565_CONFIG_EN2_PD			BIT(2)
> >>> +#define LP87565_CONFIG_EN1_PD			BIT(1)
> >>> +
> >>> +#define LP87565_INT_GPIO			BIT(7)
> >>> +#define LP87565_INT_BUCK23			BIT(6)
> >>> +#define LP87565_INT_BUCK01			BIT(5)
> >>> +#define LP87565_NO_SYNC_CLK			BIT(4)
> >>> +#define LP87565_TDIE_SD				BIT(3)
> >>> +#define LP87565_TDIE_WARN			BIT(2)
> >>> +#define LP87565_INT_OVP				BIT(1)
> >>> +#define LP87565_I_LOAD_READY			BIT(0)
> >>> +
> >>> +#define LP87565_INT_TOP2_RESET_REG		BIT(0)
> >>> +
> >>> +#define LP87565_BUCK1_PG_INT			BIT(6)
> >>> +#define LP87565_BUCK1_SC_INT			BIT(5)
> >>> +#define LP87565_BUCK1_ILIM_INT			BIT(4)
> >>> +#define LP87565_BUCK0_PG_INT			BIT(2)
> >>> +#define LP87565_BUCK0_SC_INT			BIT(1)
> >>> +#define LP87565_BUCK0_ILIM_INT			BIT(0)
> >>> +
> >>> +#define LP87565_BUCK3_PG_INT			BIT(6)
> >>> +#define LP87565_BUCK3_SC_INT			BIT(5)
> >>> +#define LP87565_BUCK3_ILIM_INT			BIT(4)
> >>> +#define LP87565_BUCK2_PG_INT			BIT(2)
> >>> +#define LP87565_BUCK2_SC_INT			BIT(1)
> >>> +#define LP87565_BUCK2_ILIM_INT			BIT(0)
> >>> +
> >>> +#define LP87565_SYNC_CLK_STAT			BIT(4)
> >>> +#define LP87565_TDIE_SD_STAT			BIT(3)
> >>> +#define LP87565_TDIE_WARN_STAT			BIT(2)
> >>> +#define LP87565_OVP_STAT			BIT(1)
> >>> +
> >>> +#define LP87565_BUCK1_STAT			BIT(7)
> >>> +#define LP87565_BUCK1_PG_STAT			BIT(6)
> >>> +#define LP87565_BUCK1_ILIM_STAT			BIT(4)
> >>> +#define LP87565_BUCK0_STAT			BIT(3)
> >>> +#define LP87565_BUCK0_PG_STAT			BIT(2)
> >>> +#define LP87565_BUCK0_ILIM_STAT			BIT(0)
> >>> +
> >>> +#define LP87565_BUCK3_STAT			BIT(7)
> >>> +#define LP87565_BUCK3_PG_STAT			BIT(6)
> >>> +#define LP87565_BUCK3_ILIM_STAT			BIT(4)
> >>> +#define LP87565_BUCK2_STAT			BIT(3)
> >>> +#define LP87565_BUCK2_PG_STAT			BIT(2)
> >>> +#define LP87565_BUCK2_ILIM_STAT			BIT(0)
> >>> +
> >>> +#define LPL87565_GPIO_MASK			BIT(7)
> >>> +#define LPL87565_SYNC_CLK_MASK			BIT(4)
> >>> +#define LPL87565_TDIE_WARN_MASK			BIT(2)
> >>> +#define LPL87565_I_LOAD_READY_MASK		BIT(0)
> >>> +
> >>> +#define LPL87565_RESET_REG_MASK			BIT(0)
> >>> +
> >>> +#define LPL87565_BUCK1_PG_MASK			BIT(6)
> >>> +#define LPL87565_BUCK1_ILIM_MASK		BIT(4)
> >>> +#define LPL87565_BUCK0_PG_MASK			BIT(2)
> >>> +#define LPL87565_BUCK0_ILIM_MASK		BIT(0)
> >>> +
> >>> +#define LPL87565_BUCK3_PG_MASK			BIT(6)
> >>> +#define LPL87565_BUCK3_ILIM_MASK		BIT(4)
> >>> +#define LPL87565_BUCK2_PG_MASK			BIT(2)
> >>> +#define LPL87565_BUCK2_ILIM_MASK		BIT(0)
> >>> +
> >>> +#define LP87565_LOAD_CURRENT_BUCK_SELECT	0x3
> >>> +
> >>> +#define LP87565_I_LOAD2_BUCK_LOAD_CURRENT	0x3
> >>> +#define LP87565_I_LOAD1_BUCK_LOAD_CURRENT	0xFF
> >>> +
> >>> +#define LP87565_PG3_SEL				0xC0
> >>> +#define LP87565_PG2_SEL				0x30
> >>> +#define LP87565_PG1_SEL				0x0C
> >>> +#define LP87565_PG0_SEL				0x03
> >>> +
> >>> +#define LP87565_HALF_DAY			BIT(7)
> >>> +#define LP87565_EN_PG0_NINT			BIT(6)
> >>> +#define LP87565_PGOOD_SET_DELAY			BIT(5)
> >>> +#define LP87565_EN_PGFLT_STAT			BIT(4)
> >>> +#define LP87565_PGOOD_WINDOW			BIT(2)
> >>> +#define LP87565_PGOOD_OD			BIT(1)
> >>> +#define LP87565_PGOOD_POL			BIT(0)
> >>> +
> >>> +#define LP87565_PG3_FLT				BIT(3)
> >>> +#define LP87565_PG2_FLT				BIT(2)
> >>> +#define LP87565_PG1_FLT				BIT(1)
> >>> +#define LP87565_PG0_FLT				BIT(0)
> >>> +
> >>> +#define LP87565_PLL_MODE			0xC0
> >>> +#define LP87565_EXT_CLK_FREQ			0x1F
> >>> +
> >>> +#define LP87565_EN_SPREAD_SPEC			BIT(7)
> >>> +#define LP87565_EN_PIN_CTRL_GPIO3		BIT(6)
> >>> +#define LP87565_EN_PIN_SELECT_GPIO3		BIT(5)
> >>> +#define LP87565_EN_PIN_CTRL_GPIO2		BIT(4)
> >>> +#define LP87565_EN_PIN_SELECT_GPIO2		BIT(3)
> >>> +#define LP87565_GPIO3_SEL			BIT(2)
> >>> +#define LP87565_GPIO2_SEL			BIT(1)
> >>> +#define LP87565_GPIO1_SEL			BIT(0)
> >>> +
> >>> +#define LP87565_GOIO3_OD			BIT(6)
> >>> +#define LP87565_GOIO2_OD			BIT(5)
> >>> +#define LP87565_GOIO1_OD			BIT(4)
> >>> +#define LP87565_GOIO3_DIR			BIT(2)
> >>> +#define LP87565_GOIO2_DIR			BIT(1)
> >>> +#define LP87565_GOIO1_DIR			BIT(0)
> >>> +
> >>> +#define LP87565_GOIO3_IN			BIT(2)
> >>> +#define LP87565_GOIO2_IN			BIT(1)
> >>> +#define LP87565_GOIO1_IN			BIT(0)
> >>> +
> >>> +#define LP87565_GOIO3_OUT			BIT(2)
> >>> +#define LP87565_GOIO2_OUT			BIT(1)
> >>> +#define LP87565_GOIO1_OUT			BIT(0)
> >>> +
> >>> +/* Number of step-down converters available */
> >>> +#define LP87565_NUM_BUCK		6
> >>> +
> >>> +enum LP87565_regulator_id {
> >>> +	/* BUCK's */
> >>> +	LP87565_BUCK_0,
> >>> +	LP87565_BUCK_1,
> >>> +	LP87565_BUCK_2,
> >>> +	LP87565_BUCK_3,
> >>> +	LP87565_BUCK_10,
> >>> +	LP87565_BUCK_23,
> >>> +};
> >>> +
> >>> +/**
> >>> + * struct LP87565 - state holder for the LP87565 driver
> >>> + * @dev: struct device pointer for MFD device
> >>> + * @rev: revision of the LP87565
> >>> + * @dev_type: The device type for example lp87565-q1
> >>> + * @lock: lock guarding the data structure
> >>> + * @regmap: register map of the LP87565 PMIC
> >>> + *
> >>> + * Device data may be used to access the LP87565 chip
> >>> + */
> >>> +struct lp87565 {
> >>> +	struct device *dev;
> >>> +	u8 rev;
> >>> +	u8 dev_type;
> >>> +	struct regmap *regmap;
> >>> +};
> >>> +#endif /* __LINUX_MFD_LP87565_H */
> >>>

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

[toc] | [prev] | [next] | [standalone]


#1647220

FromLee Jones <lee.jones@linaro.org>
Date2017-05-22 19:50 +0200
Message-ID<tJZCW-dH-9@gated-at.bofh.it>
In reply to#1645575
On Fri, 19 May 2017, Keerthy wrote:

> The LP87565 chip is a power management IC for Portable Navigation Systems
> and Tablet Computing devices. It contains the following components:
> 
>         - Configurable Bucks(Single and multi-phase).
>         - Configurable General Purpose Output Signals (GPO).
> 
> The LP87565-Q1 variant device uses two 2-phase outputs configuration,
> Buck0 is master for Buck0/1 output and Buck2 is master for Buck2/3
> output.
> 
> Signed-off-by: Keerthy <j-keerthy@ti.com>
> ---
>  Documentation/devicetree/bindings/mfd/lp87565.txt |  44 ++++
>  drivers/mfd/Kconfig                               |  14 ++
>  drivers/mfd/Makefile                              |   1 +
>  drivers/mfd/lp87565.c                             | 103 ++++++++
>  include/linux/mfd/lp87565.h                       | 275 ++++++++++++++++++++++
>  5 files changed, 437 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/mfd/lp87565.txt
>  create mode 100644 drivers/mfd/lp87565.c
>  create mode 100644 include/linux/mfd/lp87565.h
> 
> diff --git a/Documentation/devicetree/bindings/mfd/lp87565.txt b/Documentation/devicetree/bindings/mfd/lp87565.txt
> new file mode 100644
> index 0000000..38a00a1
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/mfd/lp87565.txt
> @@ -0,0 +1,44 @@
> +TI LP873565 PMIC MFD driver
> +
> +Required properties:
> +  - compatible:	"ti,lp87565", "ti,lp87565-q1"
> +  - reg:		I2C slave address.
> +  - gpio-controller:	Marks the device node as a GPIO Controller.
> +  - #gpio-cells:	Should be two.  The first cell is the pin number and
> +			the second cell is used to specify flags.
> +			See ../gpio/gpio.txt for more information.
> +  - xxx-in-supply:	Phandle to parent supply node of each regulator
> +			populated under regulators node. xxx should match
> +			the supply_name populated in driver.
> +  - regulators:	List of child nodes that specify the regulator
> +			initialization data.
> +Example:
> +
> +lp87565: lp87565@60 {
> +	compatible = "ti,lp87565-q1";
> +	reg = <0x60>;
> +	gpio-controller;
> +	#gpio-cells = <2>;
> +
> +	buck10-in-supply =<&vsys_3v3>;
> +	buck23-in-supply =<&vsys_3v3>;

White space errors.

'\n' here.

> +	regulators: regulators {
> +		buck10_reg: buck10 {
> +			/*VDD_MPU*/

Whitespace errors.

> +			regulator-name = "buck10";
> +			regulator-min-microvolt = <850000>;
> +			regulator-max-microvolt = <1250000>;
> +			regulator-always-on;
> +			regulator-boot-on;
> +		};
> +
> +		buck23_reg: buck23 {
> +			/* VDD_GPU*/

Whitespace errors.

> +			regulator-name = "buck23";
> +			regulator-min-microvolt = <850000>;
> +			regulator-max-microvolt = <1250000>;
> +			regulator-boot-on;
> +			regulator-always-on;
> +		};
> +	};
> +};
> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> index 3eb5c93..5e884f3 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -1325,6 +1325,20 @@ config MFD_TI_LP873X
>  	  This driver can also be built as a module. If so, the module
>  	  will be called lp873x.
>  
> +config MFD_TI_LP87565
> +	tristate "TI LP87565 Power Management IC"
> +	depends on I2C
> +	select MFD_CORE
> +	select REGMAP_I2C
> +	help
> +	  If you say yes here then you get support for the LP87565 series of
> +	  Power Management Integrated Circuits (PMIC).
> +	  These include voltage regulators, thermal protection, configurable
> +	  General Purpose Outputs (GPO) that are used in portable devices.
> +
> +	  This driver can also be built as a module. If so, the module
> +	  will be called lp87565.
> +
>  config MFD_TPS65218
>  	tristate "TI TPS65218 Power Management chips"
>  	depends on I2C
> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> index c16bf1e..7edbe1b 100644
> --- a/drivers/mfd/Makefile
> +++ b/drivers/mfd/Makefile
> @@ -25,6 +25,7 @@ obj-$(CONFIG_HTC_PASIC3)	+= htc-pasic3.o
>  obj-$(CONFIG_HTC_I2CPLD)	+= htc-i2cpld.o
>  
>  obj-$(CONFIG_MFD_TI_LP873X)	+= lp873x.o
> +obj-$(CONFIG_MFD_TI_LP87565)	+= lp87565.o
>  
>  obj-$(CONFIG_MFD_DAVINCI_VOICECODEC)	+= davinci_voicecodec.o
>  obj-$(CONFIG_MFD_DM355EVM_MSP)	+= dm355evm_msp.o
> diff --git a/drivers/mfd/lp87565.c b/drivers/mfd/lp87565.c
> new file mode 100644
> index 0000000..dff882f
> --- /dev/null
> +++ b/drivers/mfd/lp87565.c
> @@ -0,0 +1,103 @@
> +/*
> + * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
> + *
> + * Author: Keerthy <j-keerthy@ti.com>

We usually ask for full "first last" names.

> + * 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.
> + *
> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> + * kind, whether express or implied; without even the implied warranty
> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.

Can you use the short licence?

> + */
> +
> +#include <linux/interrupt.h>
> +#include <linux/mfd/core.h>
> +#include <linux/module.h>
> +#include <linux/of_device.h>
> +#include <linux/regmap.h>
> +
> +#include <linux/mfd/lp87565.h>
> +
> +static const struct regmap_config lp87565_regmap_config = {
> +	.reg_bits = 8,
> +	.val_bits = 8,
> +	.max_register = LP87565_REG_MAX,
> +};
> +
> +static const struct mfd_cell lp87565_cells[] = {
> +	{ .name = "lp87565-q1-regulator", },
> +	{ .name = "lp87565-q1-gpio", },
> +};
> +
> +static const struct of_device_id of_lp87565_match_table[] = {
> +	{
> +		.compatible = "ti,lp87565-q1",
> +		.data = (void *)LP87565_DEVICE_TYPE_LP87565_Q1,
> +	},
> +	{}
> +};
> +MODULE_DEVICE_TABLE(of, of_lp87565_match_table);
> +
> +static int lp87565_probe(struct i2c_client *client,
> +			 const struct i2c_device_id *ids)
> +{
> +	struct lp87565 *lp87565;
> +	const struct of_device_id *of_id;
> +	int ret;
> +	unsigned int otpid;
> +
> +	lp87565 = devm_kzalloc(&client->dev, sizeof(*lp87565), GFP_KERNEL);
> +	if (!lp87565)
> +		return -ENOMEM;
> +
> +	lp87565->dev = &client->dev;
> +
> +	lp87565->regmap = devm_regmap_init_i2c(client, &lp87565_regmap_config);
> +	if (IS_ERR(lp87565->regmap)) {
> +		ret = PTR_ERR(lp87565->regmap);
> +		dev_err(lp87565->dev,
> +			"Failed to initialize register map: %d\n", ret);
> +		return ret;
> +	}
> +
> +	ret = regmap_read(lp87565->regmap, LP87565_REG_OTP_REV, &otpid);
> +	if (ret) {
> +		dev_err(lp87565->dev, "Failed to read OTP ID\n");
> +		return ret;
> +	}
> +
> +	lp87565->rev = otpid & LP87565_OTP_REV_OTP_ID;

'\n' here.

> +	of_id = of_match_device(of_lp87565_match_table, &client->dev);
> +	if (of_id)
> +		lp87565->dev_type = (enum lp87565_device_type)of_id->data;
> +
> +	i2c_set_clientdata(client, lp87565);
> +
> +	ret = mfd_add_devices(lp87565->dev, PLATFORM_DEVID_AUTO, lp87565_cells,
> +			      ARRAY_SIZE(lp87565_cells), NULL, 0, NULL);
> +
> +	return ret;
> +}
> +
> +static const struct i2c_device_id lp87565_id_table[] = {
> +	{ "lp87565-q1", 0 },
> +	{ },
> +};
> +MODULE_DEVICE_TABLE(i2c, lp87565_id_table);

Is this an OF only driver, or not?

> +static struct i2c_driver lp87565_driver = {
> +	.driver	= {
> +		.name	= "lp87565",
> +		.of_match_table = of_lp87565_match_table,
> +	},
> +	.probe		= lp87565_probe,
> +	.id_table	= lp87565_id_table,
> +};
> +module_i2c_driver(lp87565_driver);
> +
> +MODULE_AUTHOR("J Keerthy <j-keerthy@ti.com>");
> +MODULE_DESCRIPTION("lp87565 chip family Multi-Function Device driver");
> +MODULE_LICENSE("GPL v2");
> diff --git a/include/linux/mfd/lp87565.h b/include/linux/mfd/lp87565.h
> new file mode 100644
> index 0000000..6112365
> --- /dev/null
> +++ b/include/linux/mfd/lp87565.h
> @@ -0,0 +1,275 @@
> +/*
> + * Functions to access LP87565 power management chip.
> + *
> + * Copyright (C) 2016 Texas Instruments Incorporated - http://www.ti.com/

Please update the Copyright.

> + * 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.
> + *
> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> + * kind, whether express or implied; without even the implied warranty
> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + */
> +
> +#ifndef __LINUX_MFD_LP87565_H
> +#define __LINUX_MFD_LP87565_H
> +
> +#include <linux/i2c.h>
> +#include <linux/regulator/driver.h>
> +#include <linux/regulator/machine.h>
> +
> +enum lp87565_device_type {
> +	LP87565_DEVICE_TYPE_UNKNOWN	= 0,
> +	LP87565_DEVICE_TYPE_LP87565_Q1,
> +};
> +
> +/* All register addresses */
> +#define LP87565_REG_DEV_REV		0X00
> +#define LP87565_REG_OTP_REV		0X01
> +#define LP87565_REG_BUCK0_CTRL_1		0X02
> +#define LP87565_REG_BUCK0_CTRL_2		0X03
> +
> +#define LP87565_REG_BUCK1_CTRL_1		0X04
> +#define LP87565_REG_BUCK1_CTRL_2		0X05
> +
> +#define LP87565_REG_BUCK2_CTRL_1		0X06
> +#define LP87565_REG_BUCK2_CTRL_2		0X07
> +
> +#define LP87565_REG_BUCK3_CTRL_1		0X08
> +#define LP87565_REG_BUCK3_CTRL_2		0X09
> +
> +#define LP87565_REG_BUCK0_VOUT			0X0A
> +#define LP87565_REG_BUCK0_FLOOR_VOUT		0X0B
> +
> +#define LP87565_REG_BUCK1_VOUT			0X0C
> +#define LP87565_REG_BUCK1_FLOOR_VOUT		0X0D
> +
> +#define LP87565_REG_BUCK2_VOUT			0X0E
> +#define LP87565_REG_BUCK2_FLOOR_VOUT		0X0F
> +
> +#define LP87565_REG_BUCK3_VOUT			0X10
> +#define LP87565_REG_BUCK3_FLOOR_VOUT		0X11
> +
> +#define LP87565_REG_BUCK0_DELAY			0X12
> +#define LP87565_REG_BUCK1_DELAY			0X13
> +
> +#define LP87565_REG_BUCK2_DELAY			0X14
> +#define LP87565_REG_BUCK3_DELAY			0X15
> +
> +#define LP87565_REG_GPO2_DELAY			0X16
> +#define LP87565_REG_GPO3_DELAY			0X17
> +#define LP87565_REG_RESET			0X18
> +#define LP87565_REG_CONFIG			0X19
> +
> +#define LP87565_REG_INT_TOP_1			0X1A
> +#define LP87565_REG_INT_TOP_2			0X1B
> +
> +#define LP87565_REG_INT_BUCK_0_1		0X1C
> +#define LP87565_REG_INT_BUCK_2_3		0X1D
> +#define LP87565_REG_TOP_STAT			0X1E
> +#define LP87565_REG_BUCK_0_1_STAT		0X1F
> +#define LP87565_REG_BUCK_2_3_STAT		0x20
> +
> +#define LP87565_REG_TOP_MASK_1			0x21
> +#define LP87565_REG_TOP_MASK_2			0x22
> +
> +#define LP87565_REG_BUCK_0_1_MASK		0x23
> +#define LP87565_REG_BUCK_2_3_MASK		0x24
> +#define LP87565_REG_SEL_I_LOAD			0x25
> +
> +#define LP87565_REG_I_LOAD_2			0x26
> +#define LP87565_REG_I_LOAD_1			0x27
> +
> +#define LP87565_REG_PGOOD_CTRL1			0x28
> +#define LP87565_REG_PGOOD_CTRL2			0x29
> +#define LP87565_REG_PGOOD_FLT			0x2A
> +#define LP87565_REG_PLL_CTRL			0x2B
> +#define LP87565_REG_PIN_FUNCTION		0x2C
> +#define LP87565_REG_GPIO_CONFIG			0x2D
> +#define LP87565_REG_GPIO_IN			0x2E
> +#define LP87565_REG_GPIO_OUT			0x2F
> +
> +#define LP87565_REG_MAX			LP87565_REG_GPIO_OUT
> +
> +/* Register field definitions */
> +#define LP87565_DEV_REV_DEV_ID			0xC0
> +#define LP87565_DEV_REV_ALL_LAYER		0x30
> +#define LP87565_DEV_REV_METAL_LAYER		0x0F
> +
> +#define LP87565_OTP_REV_OTP_ID			0xFF
> +
> +#define LP87565_BUCK_CTRL_1_EN			BIT(7)
> +#define LP87565_BUCK_CTRL_1_EN_PIN_CTRL		BIT(6)
> +#define LP87565_BUCK_CTRL_1_PIN_SELECT_EN	0x30
> +
> +#define LP87565_BUCK_CTRL_1_ROOF_FLOOR_EN	BIT(3)
> +#define LP87565_BUCK_CTRL_1_RDIS_EN		BIT(2)
> +#define LP87565_BUCK_CTRL_1_FPWM		BIT(1)
> +/* Bit0 is reserved for BUCK1 and BUCK3 and valid only for BUCK0 and BUCK2 */
> +#define LP87565_BUCK_CTRL_1_FPWM_MP_0_2		BIT(0)
> +
> +#define LP87565_BUCK_CTRL_2_ILIM		0x38
> +#define LP87565_BUCK_CTRL_2_SLEW_RATE		0x07
> +
> +#define LP87565_BUCK_VSET			0xFF
> +#define LP87565_BUCK_FLOOR_VSET			0xFF
> +
> +#define LP87565_BUCK_SHUTDOWN_DELAY		0xF0
> +#define LP87565_BUCK_STARTUP_DELAY		0x0F
> +
> +#define LP87565_GPIO_SHUTDOWN_DELAY		0xF0
> +#define LP87565_GPIO_STARTUP_DELAY		0x0F
> +
> +#define LP87565_RESET_SW_RESET			BIT(0)
> +
> +#define LP87565_CONFIG_DOUBLE_DELAY		BIT(7)
> +#define LP87565_CONFIG_CLKIN_PD			BIT(6)
> +#define LP87565_CONFIG_EN4_PD			BIT(5)
> +#define LP87565_CONFIG_EN3_PD			BIT(4)
> +#define LP87565_CONFIG_TDIE_WARN_LEVEL		BIT(3)
> +#define LP87565_CONFIG_EN2_PD			BIT(2)
> +#define LP87565_CONFIG_EN1_PD			BIT(1)
> +
> +#define LP87565_INT_GPIO			BIT(7)
> +#define LP87565_INT_BUCK23			BIT(6)
> +#define LP87565_INT_BUCK01			BIT(5)
> +#define LP87565_NO_SYNC_CLK			BIT(4)
> +#define LP87565_TDIE_SD				BIT(3)
> +#define LP87565_TDIE_WARN			BIT(2)
> +#define LP87565_INT_OVP				BIT(1)
> +#define LP87565_I_LOAD_READY			BIT(0)
> +
> +#define LP87565_INT_TOP2_RESET_REG		BIT(0)
> +
> +#define LP87565_BUCK1_PG_INT			BIT(6)
> +#define LP87565_BUCK1_SC_INT			BIT(5)
> +#define LP87565_BUCK1_ILIM_INT			BIT(4)
> +#define LP87565_BUCK0_PG_INT			BIT(2)
> +#define LP87565_BUCK0_SC_INT			BIT(1)
> +#define LP87565_BUCK0_ILIM_INT			BIT(0)
> +
> +#define LP87565_BUCK3_PG_INT			BIT(6)
> +#define LP87565_BUCK3_SC_INT			BIT(5)
> +#define LP87565_BUCK3_ILIM_INT			BIT(4)
> +#define LP87565_BUCK2_PG_INT			BIT(2)
> +#define LP87565_BUCK2_SC_INT			BIT(1)
> +#define LP87565_BUCK2_ILIM_INT			BIT(0)
> +
> +#define LP87565_SYNC_CLK_STAT			BIT(4)
> +#define LP87565_TDIE_SD_STAT			BIT(3)
> +#define LP87565_TDIE_WARN_STAT			BIT(2)
> +#define LP87565_OVP_STAT			BIT(1)
> +
> +#define LP87565_BUCK1_STAT			BIT(7)
> +#define LP87565_BUCK1_PG_STAT			BIT(6)
> +#define LP87565_BUCK1_ILIM_STAT			BIT(4)
> +#define LP87565_BUCK0_STAT			BIT(3)
> +#define LP87565_BUCK0_PG_STAT			BIT(2)
> +#define LP87565_BUCK0_ILIM_STAT			BIT(0)
> +
> +#define LP87565_BUCK3_STAT			BIT(7)
> +#define LP87565_BUCK3_PG_STAT			BIT(6)
> +#define LP87565_BUCK3_ILIM_STAT			BIT(4)
> +#define LP87565_BUCK2_STAT			BIT(3)
> +#define LP87565_BUCK2_PG_STAT			BIT(2)
> +#define LP87565_BUCK2_ILIM_STAT			BIT(0)
> +
> +#define LPL87565_GPIO_MASK			BIT(7)
> +#define LPL87565_SYNC_CLK_MASK			BIT(4)
> +#define LPL87565_TDIE_WARN_MASK			BIT(2)
> +#define LPL87565_I_LOAD_READY_MASK		BIT(0)
> +
> +#define LPL87565_RESET_REG_MASK			BIT(0)
> +
> +#define LPL87565_BUCK1_PG_MASK			BIT(6)
> +#define LPL87565_BUCK1_ILIM_MASK		BIT(4)
> +#define LPL87565_BUCK0_PG_MASK			BIT(2)
> +#define LPL87565_BUCK0_ILIM_MASK		BIT(0)
> +
> +#define LPL87565_BUCK3_PG_MASK			BIT(6)
> +#define LPL87565_BUCK3_ILIM_MASK		BIT(4)
> +#define LPL87565_BUCK2_PG_MASK			BIT(2)
> +#define LPL87565_BUCK2_ILIM_MASK		BIT(0)
> +
> +#define LP87565_LOAD_CURRENT_BUCK_SELECT	0x3
> +
> +#define LP87565_I_LOAD2_BUCK_LOAD_CURRENT	0x3
> +#define LP87565_I_LOAD1_BUCK_LOAD_CURRENT	0xFF
> +
> +#define LP87565_PG3_SEL				0xC0
> +#define LP87565_PG2_SEL				0x30
> +#define LP87565_PG1_SEL				0x0C
> +#define LP87565_PG0_SEL				0x03
> +
> +#define LP87565_HALF_DAY			BIT(7)
> +#define LP87565_EN_PG0_NINT			BIT(6)
> +#define LP87565_PGOOD_SET_DELAY			BIT(5)
> +#define LP87565_EN_PGFLT_STAT			BIT(4)
> +#define LP87565_PGOOD_WINDOW			BIT(2)
> +#define LP87565_PGOOD_OD			BIT(1)
> +#define LP87565_PGOOD_POL			BIT(0)
> +
> +#define LP87565_PG3_FLT				BIT(3)
> +#define LP87565_PG2_FLT				BIT(2)
> +#define LP87565_PG1_FLT				BIT(1)
> +#define LP87565_PG0_FLT				BIT(0)
> +
> +#define LP87565_PLL_MODE			0xC0
> +#define LP87565_EXT_CLK_FREQ			0x1F
> +
> +#define LP87565_EN_SPREAD_SPEC			BIT(7)
> +#define LP87565_EN_PIN_CTRL_GPIO3		BIT(6)
> +#define LP87565_EN_PIN_SELECT_GPIO3		BIT(5)
> +#define LP87565_EN_PIN_CTRL_GPIO2		BIT(4)
> +#define LP87565_EN_PIN_SELECT_GPIO2		BIT(3)
> +#define LP87565_GPIO3_SEL			BIT(2)
> +#define LP87565_GPIO2_SEL			BIT(1)
> +#define LP87565_GPIO1_SEL			BIT(0)
> +
> +#define LP87565_GOIO3_OD			BIT(6)
> +#define LP87565_GOIO2_OD			BIT(5)
> +#define LP87565_GOIO1_OD			BIT(4)
> +#define LP87565_GOIO3_DIR			BIT(2)
> +#define LP87565_GOIO2_DIR			BIT(1)
> +#define LP87565_GOIO1_DIR			BIT(0)
> +
> +#define LP87565_GOIO3_IN			BIT(2)
> +#define LP87565_GOIO2_IN			BIT(1)
> +#define LP87565_GOIO1_IN			BIT(0)
> +
> +#define LP87565_GOIO3_OUT			BIT(2)
> +#define LP87565_GOIO2_OUT			BIT(1)
> +#define LP87565_GOIO1_OUT			BIT(0)
> +
> +/* Number of step-down converters available */
> +#define LP87565_NUM_BUCK		6
> +
> +enum LP87565_regulator_id {
> +	/* BUCK's */
> +	LP87565_BUCK_0,
> +	LP87565_BUCK_1,
> +	LP87565_BUCK_2,
> +	LP87565_BUCK_3,
> +	LP87565_BUCK_10,
> +	LP87565_BUCK_23,
> +};
> +
> +/**
> + * struct LP87565 - state holder for the LP87565 driver
> + * @dev: struct device pointer for MFD device
> + * @rev: revision of the LP87565
> + * @dev_type: The device type for example lp87565-q1
> + * @lock: lock guarding the data structure
> + * @regmap: register map of the LP87565 PMIC
> + *
> + * Device data may be used to access the LP87565 chip
> + */
> +struct lp87565 {
> +	struct device *dev;
> +	u8 rev;
> +	u8 dev_type;
> +	struct regmap *regmap;
> +};
> +#endif /* __LINUX_MFD_LP87565_H */

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

[toc] | [prev] | [next] | [standalone]


#1647591

FromKeerthy <j-keerthy@ti.com>
Date2017-05-23 04:40 +0200
Message-ID<tK7TP-5va-1@gated-at.bofh.it>
In reply to#1647220

On Monday 22 May 2017 11:18 PM, Lee Jones wrote:
> On Fri, 19 May 2017, Keerthy wrote:
> 
>> The LP87565 chip is a power management IC for Portable Navigation Systems
>> and Tablet Computing devices. It contains the following components:
>>
>>         - Configurable Bucks(Single and multi-phase).
>>         - Configurable General Purpose Output Signals (GPO).
>>
>> The LP87565-Q1 variant device uses two 2-phase outputs configuration,
>> Buck0 is master for Buck0/1 output and Buck2 is master for Buck2/3
>> output.
>>
>> Signed-off-by: Keerthy <j-keerthy@ti.com>
>> ---
>>  Documentation/devicetree/bindings/mfd/lp87565.txt |  44 ++++
>>  drivers/mfd/Kconfig                               |  14 ++
>>  drivers/mfd/Makefile                              |   1 +
>>  drivers/mfd/lp87565.c                             | 103 ++++++++
>>  include/linux/mfd/lp87565.h                       | 275 ++++++++++++++++++++++
>>  5 files changed, 437 insertions(+)
>>  create mode 100644 Documentation/devicetree/bindings/mfd/lp87565.txt
>>  create mode 100644 drivers/mfd/lp87565.c
>>  create mode 100644 include/linux/mfd/lp87565.h
>>
>> diff --git a/Documentation/devicetree/bindings/mfd/lp87565.txt b/Documentation/devicetree/bindings/mfd/lp87565.txt
>> new file mode 100644
>> index 0000000..38a00a1
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/mfd/lp87565.txt
>> @@ -0,0 +1,44 @@
>> +TI LP873565 PMIC MFD driver
>> +
>> +Required properties:
>> +  - compatible:	"ti,lp87565", "ti,lp87565-q1"
>> +  - reg:		I2C slave address.
>> +  - gpio-controller:	Marks the device node as a GPIO Controller.
>> +  - #gpio-cells:	Should be two.  The first cell is the pin number and
>> +			the second cell is used to specify flags.
>> +			See ../gpio/gpio.txt for more information.
>> +  - xxx-in-supply:	Phandle to parent supply node of each regulator
>> +			populated under regulators node. xxx should match
>> +			the supply_name populated in driver.
>> +  - regulators:	List of child nodes that specify the regulator
>> +			initialization data.
>> +Example:
>> +
>> +lp87565: lp87565@60 {
>> +	compatible = "ti,lp87565-q1";
>> +	reg = <0x60>;
>> +	gpio-controller;
>> +	#gpio-cells = <2>;
>> +
>> +	buck10-in-supply =<&vsys_3v3>;
>> +	buck23-in-supply =<&vsys_3v3>;
> 
> White space errors.
> 
> '\n' here.

I will fix this.

> 
>> +	regulators: regulators {
>> +		buck10_reg: buck10 {
>> +			/*VDD_MPU*/
> 
> Whitespace errors.

I will fix this.

> 
>> +			regulator-name = "buck10";
>> +			regulator-min-microvolt = <850000>;
>> +			regulator-max-microvolt = <1250000>;
>> +			regulator-always-on;
>> +			regulator-boot-on;
>> +		};
>> +
>> +		buck23_reg: buck23 {
>> +			/* VDD_GPU*/
> 
> Whitespace errors.

I will fix this.

> 
>> +			regulator-name = "buck23";
>> +			regulator-min-microvolt = <850000>;
>> +			regulator-max-microvolt = <1250000>;
>> +			regulator-boot-on;
>> +			regulator-always-on;
>> +		};
>> +	};
>> +};
>> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
>> index 3eb5c93..5e884f3 100644
>> --- a/drivers/mfd/Kconfig
>> +++ b/drivers/mfd/Kconfig
>> @@ -1325,6 +1325,20 @@ config MFD_TI_LP873X
>>  	  This driver can also be built as a module. If so, the module
>>  	  will be called lp873x.
>>  
>> +config MFD_TI_LP87565
>> +	tristate "TI LP87565 Power Management IC"
>> +	depends on I2C
>> +	select MFD_CORE
>> +	select REGMAP_I2C
>> +	help
>> +	  If you say yes here then you get support for the LP87565 series of
>> +	  Power Management Integrated Circuits (PMIC).
>> +	  These include voltage regulators, thermal protection, configurable
>> +	  General Purpose Outputs (GPO) that are used in portable devices.
>> +
>> +	  This driver can also be built as a module. If so, the module
>> +	  will be called lp87565.
>> +
>>  config MFD_TPS65218
>>  	tristate "TI TPS65218 Power Management chips"
>>  	depends on I2C
>> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
>> index c16bf1e..7edbe1b 100644
>> --- a/drivers/mfd/Makefile
>> +++ b/drivers/mfd/Makefile
>> @@ -25,6 +25,7 @@ obj-$(CONFIG_HTC_PASIC3)	+= htc-pasic3.o
>>  obj-$(CONFIG_HTC_I2CPLD)	+= htc-i2cpld.o
>>  
>>  obj-$(CONFIG_MFD_TI_LP873X)	+= lp873x.o
>> +obj-$(CONFIG_MFD_TI_LP87565)	+= lp87565.o
>>  
>>  obj-$(CONFIG_MFD_DAVINCI_VOICECODEC)	+= davinci_voicecodec.o
>>  obj-$(CONFIG_MFD_DM355EVM_MSP)	+= dm355evm_msp.o
>> diff --git a/drivers/mfd/lp87565.c b/drivers/mfd/lp87565.c
>> new file mode 100644
>> index 0000000..dff882f
>> --- /dev/null
>> +++ b/drivers/mfd/lp87565.c
>> @@ -0,0 +1,103 @@
>> +/*
>> + * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
>> + *
>> + * Author: Keerthy <j-keerthy@ti.com>
> 
> We usually ask for full "first last" names.

Keerthy is my full name and i do not have a surname.

> 
>> + * 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.
>> + *
>> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
>> + * kind, whether express or implied; without even the implied warranty
>> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
> 
> Can you use the short licence?

Okay Sure.

> 
>> + */
>> +
>> +#include <linux/interrupt.h>
>> +#include <linux/mfd/core.h>
>> +#include <linux/module.h>
>> +#include <linux/of_device.h>
>> +#include <linux/regmap.h>
>> +
>> +#include <linux/mfd/lp87565.h>
>> +
>> +static const struct regmap_config lp87565_regmap_config = {
>> +	.reg_bits = 8,
>> +	.val_bits = 8,
>> +	.max_register = LP87565_REG_MAX,
>> +};
>> +
>> +static const struct mfd_cell lp87565_cells[] = {
>> +	{ .name = "lp87565-q1-regulator", },
>> +	{ .name = "lp87565-q1-gpio", },
>> +};
>> +
>> +static const struct of_device_id of_lp87565_match_table[] = {
>> +	{
>> +		.compatible = "ti,lp87565-q1",
>> +		.data = (void *)LP87565_DEVICE_TYPE_LP87565_Q1,
>> +	},
>> +	{}
>> +};
>> +MODULE_DEVICE_TABLE(of, of_lp87565_match_table);
>> +
>> +static int lp87565_probe(struct i2c_client *client,
>> +			 const struct i2c_device_id *ids)
>> +{
>> +	struct lp87565 *lp87565;
>> +	const struct of_device_id *of_id;
>> +	int ret;
>> +	unsigned int otpid;
>> +
>> +	lp87565 = devm_kzalloc(&client->dev, sizeof(*lp87565), GFP_KERNEL);
>> +	if (!lp87565)
>> +		return -ENOMEM;
>> +
>> +	lp87565->dev = &client->dev;
>> +
>> +	lp87565->regmap = devm_regmap_init_i2c(client, &lp87565_regmap_config);
>> +	if (IS_ERR(lp87565->regmap)) {
>> +		ret = PTR_ERR(lp87565->regmap);
>> +		dev_err(lp87565->dev,
>> +			"Failed to initialize register map: %d\n", ret);
>> +		return ret;
>> +	}
>> +
>> +	ret = regmap_read(lp87565->regmap, LP87565_REG_OTP_REV, &otpid);
>> +	if (ret) {
>> +		dev_err(lp87565->dev, "Failed to read OTP ID\n");
>> +		return ret;
>> +	}
>> +
>> +	lp87565->rev = otpid & LP87565_OTP_REV_OTP_ID;
> 
> '\n' here.

Okay.

> 
>> +	of_id = of_match_device(of_lp87565_match_table, &client->dev);
>> +	if (of_id)
>> +		lp87565->dev_type = (enum lp87565_device_type)of_id->data;
>> +
>> +	i2c_set_clientdata(client, lp87565);
>> +
>> +	ret = mfd_add_devices(lp87565->dev, PLATFORM_DEVID_AUTO, lp87565_cells,
>> +			      ARRAY_SIZE(lp87565_cells), NULL, 0, NULL);
>> +
>> +	return ret;
>> +}
>> +
>> +static const struct i2c_device_id lp87565_id_table[] = {
>> +	{ "lp87565-q1", 0 },
>> +	{ },
>> +};
>> +MODULE_DEVICE_TABLE(i2c, lp87565_id_table);
> 
> Is this an OF only driver, or not?
> 
>> +static struct i2c_driver lp87565_driver = {
>> +	.driver	= {
>> +		.name	= "lp87565",
>> +		.of_match_table = of_lp87565_match_table,
>> +	},
>> +	.probe		= lp87565_probe,
>> +	.id_table	= lp87565_id_table,
>> +};
>> +module_i2c_driver(lp87565_driver);
>> +
>> +MODULE_AUTHOR("J Keerthy <j-keerthy@ti.com>");
>> +MODULE_DESCRIPTION("lp87565 chip family Multi-Function Device driver");
>> +MODULE_LICENSE("GPL v2");
>> diff --git a/include/linux/mfd/lp87565.h b/include/linux/mfd/lp87565.h
>> new file mode 100644
>> index 0000000..6112365
>> --- /dev/null
>> +++ b/include/linux/mfd/lp87565.h
>> @@ -0,0 +1,275 @@
>> +/*
>> + * Functions to access LP87565 power management chip.
>> + *
>> + * Copyright (C) 2016 Texas Instruments Incorporated - http://www.ti.com/
> 
> Please update the Copyright.

Oops yes. Thanks for catching it. I will fix in v2.

Thanks for reviewing it.

> 
>> + * 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.
>> + *
>> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
>> + * kind, whether express or implied; without even the implied warranty
>> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + */
>> +
>> +#ifndef __LINUX_MFD_LP87565_H
>> +#define __LINUX_MFD_LP87565_H
>> +
>> +#include <linux/i2c.h>
>> +#include <linux/regulator/driver.h>
>> +#include <linux/regulator/machine.h>
>> +
>> +enum lp87565_device_type {
>> +	LP87565_DEVICE_TYPE_UNKNOWN	= 0,
>> +	LP87565_DEVICE_TYPE_LP87565_Q1,
>> +};
>> +
>> +/* All register addresses */
>> +#define LP87565_REG_DEV_REV		0X00
>> +#define LP87565_REG_OTP_REV		0X01
>> +#define LP87565_REG_BUCK0_CTRL_1		0X02
>> +#define LP87565_REG_BUCK0_CTRL_2		0X03
>> +
>> +#define LP87565_REG_BUCK1_CTRL_1		0X04
>> +#define LP87565_REG_BUCK1_CTRL_2		0X05
>> +
>> +#define LP87565_REG_BUCK2_CTRL_1		0X06
>> +#define LP87565_REG_BUCK2_CTRL_2		0X07
>> +
>> +#define LP87565_REG_BUCK3_CTRL_1		0X08
>> +#define LP87565_REG_BUCK3_CTRL_2		0X09
>> +
>> +#define LP87565_REG_BUCK0_VOUT			0X0A
>> +#define LP87565_REG_BUCK0_FLOOR_VOUT		0X0B
>> +
>> +#define LP87565_REG_BUCK1_VOUT			0X0C
>> +#define LP87565_REG_BUCK1_FLOOR_VOUT		0X0D
>> +
>> +#define LP87565_REG_BUCK2_VOUT			0X0E
>> +#define LP87565_REG_BUCK2_FLOOR_VOUT		0X0F
>> +
>> +#define LP87565_REG_BUCK3_VOUT			0X10
>> +#define LP87565_REG_BUCK3_FLOOR_VOUT		0X11
>> +
>> +#define LP87565_REG_BUCK0_DELAY			0X12
>> +#define LP87565_REG_BUCK1_DELAY			0X13
>> +
>> +#define LP87565_REG_BUCK2_DELAY			0X14
>> +#define LP87565_REG_BUCK3_DELAY			0X15
>> +
>> +#define LP87565_REG_GPO2_DELAY			0X16
>> +#define LP87565_REG_GPO3_DELAY			0X17
>> +#define LP87565_REG_RESET			0X18
>> +#define LP87565_REG_CONFIG			0X19
>> +
>> +#define LP87565_REG_INT_TOP_1			0X1A
>> +#define LP87565_REG_INT_TOP_2			0X1B
>> +
>> +#define LP87565_REG_INT_BUCK_0_1		0X1C
>> +#define LP87565_REG_INT_BUCK_2_3		0X1D
>> +#define LP87565_REG_TOP_STAT			0X1E
>> +#define LP87565_REG_BUCK_0_1_STAT		0X1F
>> +#define LP87565_REG_BUCK_2_3_STAT		0x20
>> +
>> +#define LP87565_REG_TOP_MASK_1			0x21
>> +#define LP87565_REG_TOP_MASK_2			0x22
>> +
>> +#define LP87565_REG_BUCK_0_1_MASK		0x23
>> +#define LP87565_REG_BUCK_2_3_MASK		0x24
>> +#define LP87565_REG_SEL_I_LOAD			0x25
>> +
>> +#define LP87565_REG_I_LOAD_2			0x26
>> +#define LP87565_REG_I_LOAD_1			0x27
>> +
>> +#define LP87565_REG_PGOOD_CTRL1			0x28
>> +#define LP87565_REG_PGOOD_CTRL2			0x29
>> +#define LP87565_REG_PGOOD_FLT			0x2A
>> +#define LP87565_REG_PLL_CTRL			0x2B
>> +#define LP87565_REG_PIN_FUNCTION		0x2C
>> +#define LP87565_REG_GPIO_CONFIG			0x2D
>> +#define LP87565_REG_GPIO_IN			0x2E
>> +#define LP87565_REG_GPIO_OUT			0x2F
>> +
>> +#define LP87565_REG_MAX			LP87565_REG_GPIO_OUT
>> +
>> +/* Register field definitions */
>> +#define LP87565_DEV_REV_DEV_ID			0xC0
>> +#define LP87565_DEV_REV_ALL_LAYER		0x30
>> +#define LP87565_DEV_REV_METAL_LAYER		0x0F
>> +
>> +#define LP87565_OTP_REV_OTP_ID			0xFF
>> +
>> +#define LP87565_BUCK_CTRL_1_EN			BIT(7)
>> +#define LP87565_BUCK_CTRL_1_EN_PIN_CTRL		BIT(6)
>> +#define LP87565_BUCK_CTRL_1_PIN_SELECT_EN	0x30
>> +
>> +#define LP87565_BUCK_CTRL_1_ROOF_FLOOR_EN	BIT(3)
>> +#define LP87565_BUCK_CTRL_1_RDIS_EN		BIT(2)
>> +#define LP87565_BUCK_CTRL_1_FPWM		BIT(1)
>> +/* Bit0 is reserved for BUCK1 and BUCK3 and valid only for BUCK0 and BUCK2 */
>> +#define LP87565_BUCK_CTRL_1_FPWM_MP_0_2		BIT(0)
>> +
>> +#define LP87565_BUCK_CTRL_2_ILIM		0x38
>> +#define LP87565_BUCK_CTRL_2_SLEW_RATE		0x07
>> +
>> +#define LP87565_BUCK_VSET			0xFF
>> +#define LP87565_BUCK_FLOOR_VSET			0xFF
>> +
>> +#define LP87565_BUCK_SHUTDOWN_DELAY		0xF0
>> +#define LP87565_BUCK_STARTUP_DELAY		0x0F
>> +
>> +#define LP87565_GPIO_SHUTDOWN_DELAY		0xF0
>> +#define LP87565_GPIO_STARTUP_DELAY		0x0F
>> +
>> +#define LP87565_RESET_SW_RESET			BIT(0)
>> +
>> +#define LP87565_CONFIG_DOUBLE_DELAY		BIT(7)
>> +#define LP87565_CONFIG_CLKIN_PD			BIT(6)
>> +#define LP87565_CONFIG_EN4_PD			BIT(5)
>> +#define LP87565_CONFIG_EN3_PD			BIT(4)
>> +#define LP87565_CONFIG_TDIE_WARN_LEVEL		BIT(3)
>> +#define LP87565_CONFIG_EN2_PD			BIT(2)
>> +#define LP87565_CONFIG_EN1_PD			BIT(1)
>> +
>> +#define LP87565_INT_GPIO			BIT(7)
>> +#define LP87565_INT_BUCK23			BIT(6)
>> +#define LP87565_INT_BUCK01			BIT(5)
>> +#define LP87565_NO_SYNC_CLK			BIT(4)
>> +#define LP87565_TDIE_SD				BIT(3)
>> +#define LP87565_TDIE_WARN			BIT(2)
>> +#define LP87565_INT_OVP				BIT(1)
>> +#define LP87565_I_LOAD_READY			BIT(0)
>> +
>> +#define LP87565_INT_TOP2_RESET_REG		BIT(0)
>> +
>> +#define LP87565_BUCK1_PG_INT			BIT(6)
>> +#define LP87565_BUCK1_SC_INT			BIT(5)
>> +#define LP87565_BUCK1_ILIM_INT			BIT(4)
>> +#define LP87565_BUCK0_PG_INT			BIT(2)
>> +#define LP87565_BUCK0_SC_INT			BIT(1)
>> +#define LP87565_BUCK0_ILIM_INT			BIT(0)
>> +
>> +#define LP87565_BUCK3_PG_INT			BIT(6)
>> +#define LP87565_BUCK3_SC_INT			BIT(5)
>> +#define LP87565_BUCK3_ILIM_INT			BIT(4)
>> +#define LP87565_BUCK2_PG_INT			BIT(2)
>> +#define LP87565_BUCK2_SC_INT			BIT(1)
>> +#define LP87565_BUCK2_ILIM_INT			BIT(0)
>> +
>> +#define LP87565_SYNC_CLK_STAT			BIT(4)
>> +#define LP87565_TDIE_SD_STAT			BIT(3)
>> +#define LP87565_TDIE_WARN_STAT			BIT(2)
>> +#define LP87565_OVP_STAT			BIT(1)
>> +
>> +#define LP87565_BUCK1_STAT			BIT(7)
>> +#define LP87565_BUCK1_PG_STAT			BIT(6)
>> +#define LP87565_BUCK1_ILIM_STAT			BIT(4)
>> +#define LP87565_BUCK0_STAT			BIT(3)
>> +#define LP87565_BUCK0_PG_STAT			BIT(2)
>> +#define LP87565_BUCK0_ILIM_STAT			BIT(0)
>> +
>> +#define LP87565_BUCK3_STAT			BIT(7)
>> +#define LP87565_BUCK3_PG_STAT			BIT(6)
>> +#define LP87565_BUCK3_ILIM_STAT			BIT(4)
>> +#define LP87565_BUCK2_STAT			BIT(3)
>> +#define LP87565_BUCK2_PG_STAT			BIT(2)
>> +#define LP87565_BUCK2_ILIM_STAT			BIT(0)
>> +
>> +#define LPL87565_GPIO_MASK			BIT(7)
>> +#define LPL87565_SYNC_CLK_MASK			BIT(4)
>> +#define LPL87565_TDIE_WARN_MASK			BIT(2)
>> +#define LPL87565_I_LOAD_READY_MASK		BIT(0)
>> +
>> +#define LPL87565_RESET_REG_MASK			BIT(0)
>> +
>> +#define LPL87565_BUCK1_PG_MASK			BIT(6)
>> +#define LPL87565_BUCK1_ILIM_MASK		BIT(4)
>> +#define LPL87565_BUCK0_PG_MASK			BIT(2)
>> +#define LPL87565_BUCK0_ILIM_MASK		BIT(0)
>> +
>> +#define LPL87565_BUCK3_PG_MASK			BIT(6)
>> +#define LPL87565_BUCK3_ILIM_MASK		BIT(4)
>> +#define LPL87565_BUCK2_PG_MASK			BIT(2)
>> +#define LPL87565_BUCK2_ILIM_MASK		BIT(0)
>> +
>> +#define LP87565_LOAD_CURRENT_BUCK_SELECT	0x3
>> +
>> +#define LP87565_I_LOAD2_BUCK_LOAD_CURRENT	0x3
>> +#define LP87565_I_LOAD1_BUCK_LOAD_CURRENT	0xFF
>> +
>> +#define LP87565_PG3_SEL				0xC0
>> +#define LP87565_PG2_SEL				0x30
>> +#define LP87565_PG1_SEL				0x0C
>> +#define LP87565_PG0_SEL				0x03
>> +
>> +#define LP87565_HALF_DAY			BIT(7)
>> +#define LP87565_EN_PG0_NINT			BIT(6)
>> +#define LP87565_PGOOD_SET_DELAY			BIT(5)
>> +#define LP87565_EN_PGFLT_STAT			BIT(4)
>> +#define LP87565_PGOOD_WINDOW			BIT(2)
>> +#define LP87565_PGOOD_OD			BIT(1)
>> +#define LP87565_PGOOD_POL			BIT(0)
>> +
>> +#define LP87565_PG3_FLT				BIT(3)
>> +#define LP87565_PG2_FLT				BIT(2)
>> +#define LP87565_PG1_FLT				BIT(1)
>> +#define LP87565_PG0_FLT				BIT(0)
>> +
>> +#define LP87565_PLL_MODE			0xC0
>> +#define LP87565_EXT_CLK_FREQ			0x1F
>> +
>> +#define LP87565_EN_SPREAD_SPEC			BIT(7)
>> +#define LP87565_EN_PIN_CTRL_GPIO3		BIT(6)
>> +#define LP87565_EN_PIN_SELECT_GPIO3		BIT(5)
>> +#define LP87565_EN_PIN_CTRL_GPIO2		BIT(4)
>> +#define LP87565_EN_PIN_SELECT_GPIO2		BIT(3)
>> +#define LP87565_GPIO3_SEL			BIT(2)
>> +#define LP87565_GPIO2_SEL			BIT(1)
>> +#define LP87565_GPIO1_SEL			BIT(0)
>> +
>> +#define LP87565_GOIO3_OD			BIT(6)
>> +#define LP87565_GOIO2_OD			BIT(5)
>> +#define LP87565_GOIO1_OD			BIT(4)
>> +#define LP87565_GOIO3_DIR			BIT(2)
>> +#define LP87565_GOIO2_DIR			BIT(1)
>> +#define LP87565_GOIO1_DIR			BIT(0)
>> +
>> +#define LP87565_GOIO3_IN			BIT(2)
>> +#define LP87565_GOIO2_IN			BIT(1)
>> +#define LP87565_GOIO1_IN			BIT(0)
>> +
>> +#define LP87565_GOIO3_OUT			BIT(2)
>> +#define LP87565_GOIO2_OUT			BIT(1)
>> +#define LP87565_GOIO1_OUT			BIT(0)
>> +
>> +/* Number of step-down converters available */
>> +#define LP87565_NUM_BUCK		6
>> +
>> +enum LP87565_regulator_id {
>> +	/* BUCK's */
>> +	LP87565_BUCK_0,
>> +	LP87565_BUCK_1,
>> +	LP87565_BUCK_2,
>> +	LP87565_BUCK_3,
>> +	LP87565_BUCK_10,
>> +	LP87565_BUCK_23,
>> +};
>> +
>> +/**
>> + * struct LP87565 - state holder for the LP87565 driver
>> + * @dev: struct device pointer for MFD device
>> + * @rev: revision of the LP87565
>> + * @dev_type: The device type for example lp87565-q1
>> + * @lock: lock guarding the data structure
>> + * @regmap: register map of the LP87565 PMIC
>> + *
>> + * Device data may be used to access the LP87565 chip
>> + */
>> +struct lp87565 {
>> +	struct device *dev;
>> +	u8 rev;
>> +	u8 dev_type;
>> +	struct regmap *regmap;
>> +};
>> +#endif /* __LINUX_MFD_LP87565_H */
> 

[toc] | [prev] | [next] | [standalone]


#1647596

FromKeerthy <j-keerthy@ti.com>
Date2017-05-23 05:10 +0200
Message-ID<tK8mR-5Uk-5@gated-at.bofh.it>
In reply to#1647591

On Tuesday 23 May 2017 08:05 AM, Keerthy wrote:
> 
> 
> On Monday 22 May 2017 11:18 PM, Lee Jones wrote:
>> On Fri, 19 May 2017, Keerthy wrote:
>>
>>> The LP87565 chip is a power management IC for Portable Navigation Systems
>>> and Tablet Computing devices. It contains the following components:
>>>
>>>         - Configurable Bucks(Single and multi-phase).
>>>         - Configurable General Purpose Output Signals (GPO).
>>>
>>> The LP87565-Q1 variant device uses two 2-phase outputs configuration,
>>> Buck0 is master for Buck0/1 output and Buck2 is master for Buck2/3
>>> output.
>>>
>>> Signed-off-by: Keerthy <j-keerthy@ti.com>
>>> ---
>>>  Documentation/devicetree/bindings/mfd/lp87565.txt |  44 ++++
>>>  drivers/mfd/Kconfig                               |  14 ++
>>>  drivers/mfd/Makefile                              |   1 +
>>>  drivers/mfd/lp87565.c                             | 103 ++++++++
>>>  include/linux/mfd/lp87565.h                       | 275 ++++++++++++++++++++++
>>>  5 files changed, 437 insertions(+)
>>>  create mode 100644 Documentation/devicetree/bindings/mfd/lp87565.txt
>>>  create mode 100644 drivers/mfd/lp87565.c
>>>  create mode 100644 include/linux/mfd/lp87565.h
>>>
>>> diff --git a/Documentation/devicetree/bindings/mfd/lp87565.txt b/Documentation/devicetree/bindings/mfd/lp87565.txt
>>> new file mode 100644
>>> index 0000000..38a00a1
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/mfd/lp87565.txt
>>> @@ -0,0 +1,44 @@
>>> +TI LP873565 PMIC MFD driver
>>> +
>>> +Required properties:
>>> +  - compatible:	"ti,lp87565", "ti,lp87565-q1"
>>> +  - reg:		I2C slave address.
>>> +  - gpio-controller:	Marks the device node as a GPIO Controller.
>>> +  - #gpio-cells:	Should be two.  The first cell is the pin number and
>>> +			the second cell is used to specify flags.
>>> +			See ../gpio/gpio.txt for more information.
>>> +  - xxx-in-supply:	Phandle to parent supply node of each regulator
>>> +			populated under regulators node. xxx should match
>>> +			the supply_name populated in driver.
>>> +  - regulators:	List of child nodes that specify the regulator
>>> +			initialization data.
>>> +Example:
>>> +
>>> +lp87565: lp87565@60 {
>>> +	compatible = "ti,lp87565-q1";
>>> +	reg = <0x60>;
>>> +	gpio-controller;
>>> +	#gpio-cells = <2>;
>>> +
>>> +	buck10-in-supply =<&vsys_3v3>;
>>> +	buck23-in-supply =<&vsys_3v3>;
>>
>> White space errors.
>>
>> '\n' here.
> 
> I will fix this.
> 
>>
>>> +	regulators: regulators {
>>> +		buck10_reg: buck10 {
>>> +			/*VDD_MPU*/
>>
>> Whitespace errors.
> 
> I will fix this.
> 
>>
>>> +			regulator-name = "buck10";
>>> +			regulator-min-microvolt = <850000>;
>>> +			regulator-max-microvolt = <1250000>;
>>> +			regulator-always-on;
>>> +			regulator-boot-on;
>>> +		};
>>> +
>>> +		buck23_reg: buck23 {
>>> +			/* VDD_GPU*/
>>
>> Whitespace errors.
> 
> I will fix this.
> 
>>
>>> +			regulator-name = "buck23";
>>> +			regulator-min-microvolt = <850000>;
>>> +			regulator-max-microvolt = <1250000>;
>>> +			regulator-boot-on;
>>> +			regulator-always-on;
>>> +		};
>>> +	};
>>> +};
>>> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
>>> index 3eb5c93..5e884f3 100644
>>> --- a/drivers/mfd/Kconfig
>>> +++ b/drivers/mfd/Kconfig
>>> @@ -1325,6 +1325,20 @@ config MFD_TI_LP873X
>>>  	  This driver can also be built as a module. If so, the module
>>>  	  will be called lp873x.
>>>  
>>> +config MFD_TI_LP87565
>>> +	tristate "TI LP87565 Power Management IC"
>>> +	depends on I2C
>>> +	select MFD_CORE
>>> +	select REGMAP_I2C
>>> +	help
>>> +	  If you say yes here then you get support for the LP87565 series of
>>> +	  Power Management Integrated Circuits (PMIC).
>>> +	  These include voltage regulators, thermal protection, configurable
>>> +	  General Purpose Outputs (GPO) that are used in portable devices.
>>> +
>>> +	  This driver can also be built as a module. If so, the module
>>> +	  will be called lp87565.
>>> +
>>>  config MFD_TPS65218
>>>  	tristate "TI TPS65218 Power Management chips"
>>>  	depends on I2C
>>> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
>>> index c16bf1e..7edbe1b 100644
>>> --- a/drivers/mfd/Makefile
>>> +++ b/drivers/mfd/Makefile
>>> @@ -25,6 +25,7 @@ obj-$(CONFIG_HTC_PASIC3)	+= htc-pasic3.o
>>>  obj-$(CONFIG_HTC_I2CPLD)	+= htc-i2cpld.o
>>>  
>>>  obj-$(CONFIG_MFD_TI_LP873X)	+= lp873x.o
>>> +obj-$(CONFIG_MFD_TI_LP87565)	+= lp87565.o
>>>  
>>>  obj-$(CONFIG_MFD_DAVINCI_VOICECODEC)	+= davinci_voicecodec.o
>>>  obj-$(CONFIG_MFD_DM355EVM_MSP)	+= dm355evm_msp.o
>>> diff --git a/drivers/mfd/lp87565.c b/drivers/mfd/lp87565.c
>>> new file mode 100644
>>> index 0000000..dff882f
>>> --- /dev/null
>>> +++ b/drivers/mfd/lp87565.c
>>> @@ -0,0 +1,103 @@
>>> +/*
>>> + * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
>>> + *
>>> + * Author: Keerthy <j-keerthy@ti.com>
>>
>> We usually ask for full "first last" names.
> 
> Keerthy is my full name and i do not have a surname.
> 
>>
>>> + * 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.
>>> + *
>>> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
>>> + * kind, whether express or implied; without even the implied warranty
>>> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>> + * GNU General Public License for more details.
>>
>> Can you use the short licence?
> 
> Okay Sure.

I hope the below is what you are looking for:

"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;  either version 2 of the  License, or (at
your option) any later version."

> 
>>
>>> + */
>>> +
>>> +#include <linux/interrupt.h>
>>> +#include <linux/mfd/core.h>
>>> +#include <linux/module.h>
>>> +#include <linux/of_device.h>
>>> +#include <linux/regmap.h>
>>> +
>>> +#include <linux/mfd/lp87565.h>
>>> +
>>> +static const struct regmap_config lp87565_regmap_config = {
>>> +	.reg_bits = 8,
>>> +	.val_bits = 8,
>>> +	.max_register = LP87565_REG_MAX,
>>> +};
>>> +
>>> +static const struct mfd_cell lp87565_cells[] = {
>>> +	{ .name = "lp87565-q1-regulator", },
>>> +	{ .name = "lp87565-q1-gpio", },
>>> +};
>>> +
>>> +static const struct of_device_id of_lp87565_match_table[] = {
>>> +	{
>>> +		.compatible = "ti,lp87565-q1",
>>> +		.data = (void *)LP87565_DEVICE_TYPE_LP87565_Q1,
>>> +	},
>>> +	{}
>>> +};
>>> +MODULE_DEVICE_TABLE(of, of_lp87565_match_table);
>>> +
>>> +static int lp87565_probe(struct i2c_client *client,
>>> +			 const struct i2c_device_id *ids)
>>> +{
>>> +	struct lp87565 *lp87565;
>>> +	const struct of_device_id *of_id;
>>> +	int ret;
>>> +	unsigned int otpid;
>>> +
>>> +	lp87565 = devm_kzalloc(&client->dev, sizeof(*lp87565), GFP_KERNEL);
>>> +	if (!lp87565)
>>> +		return -ENOMEM;
>>> +
>>> +	lp87565->dev = &client->dev;
>>> +
>>> +	lp87565->regmap = devm_regmap_init_i2c(client, &lp87565_regmap_config);
>>> +	if (IS_ERR(lp87565->regmap)) {
>>> +		ret = PTR_ERR(lp87565->regmap);
>>> +		dev_err(lp87565->dev,
>>> +			"Failed to initialize register map: %d\n", ret);
>>> +		return ret;
>>> +	}
>>> +
>>> +	ret = regmap_read(lp87565->regmap, LP87565_REG_OTP_REV, &otpid);
>>> +	if (ret) {
>>> +		dev_err(lp87565->dev, "Failed to read OTP ID\n");
>>> +		return ret;
>>> +	}
>>> +
>>> +	lp87565->rev = otpid & LP87565_OTP_REV_OTP_ID;
>>
>> '\n' here.
> 
> Okay.
> 
>>
>>> +	of_id = of_match_device(of_lp87565_match_table, &client->dev);
>>> +	if (of_id)
>>> +		lp87565->dev_type = (enum lp87565_device_type)of_id->data;
>>> +
>>> +	i2c_set_clientdata(client, lp87565);
>>> +
>>> +	ret = mfd_add_devices(lp87565->dev, PLATFORM_DEVID_AUTO, lp87565_cells,
>>> +			      ARRAY_SIZE(lp87565_cells), NULL, 0, NULL);
>>> +
>>> +	return ret;
>>> +}
>>> +
>>> +static const struct i2c_device_id lp87565_id_table[] = {
>>> +	{ "lp87565-q1", 0 },
>>> +	{ },
>>> +};
>>> +MODULE_DEVICE_TABLE(i2c, lp87565_id_table);
>>
>> Is this an OF only driver, or not?

Yes OF only driver.

>>
>>> +static struct i2c_driver lp87565_driver = {
>>> +	.driver	= {
>>> +		.name	= "lp87565",
>>> +		.of_match_table = of_lp87565_match_table,
>>> +	},
>>> +	.probe		= lp87565_probe,
>>> +	.id_table	= lp87565_id_table,
>>> +};
>>> +module_i2c_driver(lp87565_driver);
>>> +
>>> +MODULE_AUTHOR("J Keerthy <j-keerthy@ti.com>");
>>> +MODULE_DESCRIPTION("lp87565 chip family Multi-Function Device driver");
>>> +MODULE_LICENSE("GPL v2");
>>> diff --git a/include/linux/mfd/lp87565.h b/include/linux/mfd/lp87565.h
>>> new file mode 100644
>>> index 0000000..6112365
>>> --- /dev/null
>>> +++ b/include/linux/mfd/lp87565.h
>>> @@ -0,0 +1,275 @@
>>> +/*
>>> + * Functions to access LP87565 power management chip.
>>> + *
>>> + * Copyright (C) 2016 Texas Instruments Incorporated - http://www.ti.com/
>>
>> Please update the Copyright.
> 
> Oops yes. Thanks for catching it. I will fix in v2.
> 
> Thanks for reviewing it.
> 
>>
>>> + * 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.
>>> + *
>>> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
>>> + * kind, whether express or implied; without even the implied warranty
>>> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>> + * GNU General Public License for more details.
>>> + */
>>> +
>>> +#ifndef __LINUX_MFD_LP87565_H
>>> +#define __LINUX_MFD_LP87565_H
>>> +
>>> +#include <linux/i2c.h>
>>> +#include <linux/regulator/driver.h>
>>> +#include <linux/regulator/machine.h>
>>> +
>>> +enum lp87565_device_type {
>>> +	LP87565_DEVICE_TYPE_UNKNOWN	= 0,
>>> +	LP87565_DEVICE_TYPE_LP87565_Q1,
>>> +};
>>> +
>>> +/* All register addresses */
>>> +#define LP87565_REG_DEV_REV		0X00
>>> +#define LP87565_REG_OTP_REV		0X01
>>> +#define LP87565_REG_BUCK0_CTRL_1		0X02
>>> +#define LP87565_REG_BUCK0_CTRL_2		0X03
>>> +
>>> +#define LP87565_REG_BUCK1_CTRL_1		0X04
>>> +#define LP87565_REG_BUCK1_CTRL_2		0X05
>>> +
>>> +#define LP87565_REG_BUCK2_CTRL_1		0X06
>>> +#define LP87565_REG_BUCK2_CTRL_2		0X07
>>> +
>>> +#define LP87565_REG_BUCK3_CTRL_1		0X08
>>> +#define LP87565_REG_BUCK3_CTRL_2		0X09
>>> +
>>> +#define LP87565_REG_BUCK0_VOUT			0X0A
>>> +#define LP87565_REG_BUCK0_FLOOR_VOUT		0X0B
>>> +
>>> +#define LP87565_REG_BUCK1_VOUT			0X0C
>>> +#define LP87565_REG_BUCK1_FLOOR_VOUT		0X0D
>>> +
>>> +#define LP87565_REG_BUCK2_VOUT			0X0E
>>> +#define LP87565_REG_BUCK2_FLOOR_VOUT		0X0F
>>> +
>>> +#define LP87565_REG_BUCK3_VOUT			0X10
>>> +#define LP87565_REG_BUCK3_FLOOR_VOUT		0X11
>>> +
>>> +#define LP87565_REG_BUCK0_DELAY			0X12
>>> +#define LP87565_REG_BUCK1_DELAY			0X13
>>> +
>>> +#define LP87565_REG_BUCK2_DELAY			0X14
>>> +#define LP87565_REG_BUCK3_DELAY			0X15
>>> +
>>> +#define LP87565_REG_GPO2_DELAY			0X16
>>> +#define LP87565_REG_GPO3_DELAY			0X17
>>> +#define LP87565_REG_RESET			0X18
>>> +#define LP87565_REG_CONFIG			0X19
>>> +
>>> +#define LP87565_REG_INT_TOP_1			0X1A
>>> +#define LP87565_REG_INT_TOP_2			0X1B
>>> +
>>> +#define LP87565_REG_INT_BUCK_0_1		0X1C
>>> +#define LP87565_REG_INT_BUCK_2_3		0X1D
>>> +#define LP87565_REG_TOP_STAT			0X1E
>>> +#define LP87565_REG_BUCK_0_1_STAT		0X1F
>>> +#define LP87565_REG_BUCK_2_3_STAT		0x20
>>> +
>>> +#define LP87565_REG_TOP_MASK_1			0x21
>>> +#define LP87565_REG_TOP_MASK_2			0x22
>>> +
>>> +#define LP87565_REG_BUCK_0_1_MASK		0x23
>>> +#define LP87565_REG_BUCK_2_3_MASK		0x24
>>> +#define LP87565_REG_SEL_I_LOAD			0x25
>>> +
>>> +#define LP87565_REG_I_LOAD_2			0x26
>>> +#define LP87565_REG_I_LOAD_1			0x27
>>> +
>>> +#define LP87565_REG_PGOOD_CTRL1			0x28
>>> +#define LP87565_REG_PGOOD_CTRL2			0x29
>>> +#define LP87565_REG_PGOOD_FLT			0x2A
>>> +#define LP87565_REG_PLL_CTRL			0x2B
>>> +#define LP87565_REG_PIN_FUNCTION		0x2C
>>> +#define LP87565_REG_GPIO_CONFIG			0x2D
>>> +#define LP87565_REG_GPIO_IN			0x2E
>>> +#define LP87565_REG_GPIO_OUT			0x2F
>>> +
>>> +#define LP87565_REG_MAX			LP87565_REG_GPIO_OUT
>>> +
>>> +/* Register field definitions */
>>> +#define LP87565_DEV_REV_DEV_ID			0xC0
>>> +#define LP87565_DEV_REV_ALL_LAYER		0x30
>>> +#define LP87565_DEV_REV_METAL_LAYER		0x0F
>>> +
>>> +#define LP87565_OTP_REV_OTP_ID			0xFF
>>> +
>>> +#define LP87565_BUCK_CTRL_1_EN			BIT(7)
>>> +#define LP87565_BUCK_CTRL_1_EN_PIN_CTRL		BIT(6)
>>> +#define LP87565_BUCK_CTRL_1_PIN_SELECT_EN	0x30
>>> +
>>> +#define LP87565_BUCK_CTRL_1_ROOF_FLOOR_EN	BIT(3)
>>> +#define LP87565_BUCK_CTRL_1_RDIS_EN		BIT(2)
>>> +#define LP87565_BUCK_CTRL_1_FPWM		BIT(1)
>>> +/* Bit0 is reserved for BUCK1 and BUCK3 and valid only for BUCK0 and BUCK2 */
>>> +#define LP87565_BUCK_CTRL_1_FPWM_MP_0_2		BIT(0)
>>> +
>>> +#define LP87565_BUCK_CTRL_2_ILIM		0x38
>>> +#define LP87565_BUCK_CTRL_2_SLEW_RATE		0x07
>>> +
>>> +#define LP87565_BUCK_VSET			0xFF
>>> +#define LP87565_BUCK_FLOOR_VSET			0xFF
>>> +
>>> +#define LP87565_BUCK_SHUTDOWN_DELAY		0xF0
>>> +#define LP87565_BUCK_STARTUP_DELAY		0x0F
>>> +
>>> +#define LP87565_GPIO_SHUTDOWN_DELAY		0xF0
>>> +#define LP87565_GPIO_STARTUP_DELAY		0x0F
>>> +
>>> +#define LP87565_RESET_SW_RESET			BIT(0)
>>> +
>>> +#define LP87565_CONFIG_DOUBLE_DELAY		BIT(7)
>>> +#define LP87565_CONFIG_CLKIN_PD			BIT(6)
>>> +#define LP87565_CONFIG_EN4_PD			BIT(5)
>>> +#define LP87565_CONFIG_EN3_PD			BIT(4)
>>> +#define LP87565_CONFIG_TDIE_WARN_LEVEL		BIT(3)
>>> +#define LP87565_CONFIG_EN2_PD			BIT(2)
>>> +#define LP87565_CONFIG_EN1_PD			BIT(1)
>>> +
>>> +#define LP87565_INT_GPIO			BIT(7)
>>> +#define LP87565_INT_BUCK23			BIT(6)
>>> +#define LP87565_INT_BUCK01			BIT(5)
>>> +#define LP87565_NO_SYNC_CLK			BIT(4)
>>> +#define LP87565_TDIE_SD				BIT(3)
>>> +#define LP87565_TDIE_WARN			BIT(2)
>>> +#define LP87565_INT_OVP				BIT(1)
>>> +#define LP87565_I_LOAD_READY			BIT(0)
>>> +
>>> +#define LP87565_INT_TOP2_RESET_REG		BIT(0)
>>> +
>>> +#define LP87565_BUCK1_PG_INT			BIT(6)
>>> +#define LP87565_BUCK1_SC_INT			BIT(5)
>>> +#define LP87565_BUCK1_ILIM_INT			BIT(4)
>>> +#define LP87565_BUCK0_PG_INT			BIT(2)
>>> +#define LP87565_BUCK0_SC_INT			BIT(1)
>>> +#define LP87565_BUCK0_ILIM_INT			BIT(0)
>>> +
>>> +#define LP87565_BUCK3_PG_INT			BIT(6)
>>> +#define LP87565_BUCK3_SC_INT			BIT(5)
>>> +#define LP87565_BUCK3_ILIM_INT			BIT(4)
>>> +#define LP87565_BUCK2_PG_INT			BIT(2)
>>> +#define LP87565_BUCK2_SC_INT			BIT(1)
>>> +#define LP87565_BUCK2_ILIM_INT			BIT(0)
>>> +
>>> +#define LP87565_SYNC_CLK_STAT			BIT(4)
>>> +#define LP87565_TDIE_SD_STAT			BIT(3)
>>> +#define LP87565_TDIE_WARN_STAT			BIT(2)
>>> +#define LP87565_OVP_STAT			BIT(1)
>>> +
>>> +#define LP87565_BUCK1_STAT			BIT(7)
>>> +#define LP87565_BUCK1_PG_STAT			BIT(6)
>>> +#define LP87565_BUCK1_ILIM_STAT			BIT(4)
>>> +#define LP87565_BUCK0_STAT			BIT(3)
>>> +#define LP87565_BUCK0_PG_STAT			BIT(2)
>>> +#define LP87565_BUCK0_ILIM_STAT			BIT(0)
>>> +
>>> +#define LP87565_BUCK3_STAT			BIT(7)
>>> +#define LP87565_BUCK3_PG_STAT			BIT(6)
>>> +#define LP87565_BUCK3_ILIM_STAT			BIT(4)
>>> +#define LP87565_BUCK2_STAT			BIT(3)
>>> +#define LP87565_BUCK2_PG_STAT			BIT(2)
>>> +#define LP87565_BUCK2_ILIM_STAT			BIT(0)
>>> +
>>> +#define LPL87565_GPIO_MASK			BIT(7)
>>> +#define LPL87565_SYNC_CLK_MASK			BIT(4)
>>> +#define LPL87565_TDIE_WARN_MASK			BIT(2)
>>> +#define LPL87565_I_LOAD_READY_MASK		BIT(0)
>>> +
>>> +#define LPL87565_RESET_REG_MASK			BIT(0)
>>> +
>>> +#define LPL87565_BUCK1_PG_MASK			BIT(6)
>>> +#define LPL87565_BUCK1_ILIM_MASK		BIT(4)
>>> +#define LPL87565_BUCK0_PG_MASK			BIT(2)
>>> +#define LPL87565_BUCK0_ILIM_MASK		BIT(0)
>>> +
>>> +#define LPL87565_BUCK3_PG_MASK			BIT(6)
>>> +#define LPL87565_BUCK3_ILIM_MASK		BIT(4)
>>> +#define LPL87565_BUCK2_PG_MASK			BIT(2)
>>> +#define LPL87565_BUCK2_ILIM_MASK		BIT(0)
>>> +
>>> +#define LP87565_LOAD_CURRENT_BUCK_SELECT	0x3
>>> +
>>> +#define LP87565_I_LOAD2_BUCK_LOAD_CURRENT	0x3
>>> +#define LP87565_I_LOAD1_BUCK_LOAD_CURRENT	0xFF
>>> +
>>> +#define LP87565_PG3_SEL				0xC0
>>> +#define LP87565_PG2_SEL				0x30
>>> +#define LP87565_PG1_SEL				0x0C
>>> +#define LP87565_PG0_SEL				0x03
>>> +
>>> +#define LP87565_HALF_DAY			BIT(7)
>>> +#define LP87565_EN_PG0_NINT			BIT(6)
>>> +#define LP87565_PGOOD_SET_DELAY			BIT(5)
>>> +#define LP87565_EN_PGFLT_STAT			BIT(4)
>>> +#define LP87565_PGOOD_WINDOW			BIT(2)
>>> +#define LP87565_PGOOD_OD			BIT(1)
>>> +#define LP87565_PGOOD_POL			BIT(0)
>>> +
>>> +#define LP87565_PG3_FLT				BIT(3)
>>> +#define LP87565_PG2_FLT				BIT(2)
>>> +#define LP87565_PG1_FLT				BIT(1)
>>> +#define LP87565_PG0_FLT				BIT(0)
>>> +
>>> +#define LP87565_PLL_MODE			0xC0
>>> +#define LP87565_EXT_CLK_FREQ			0x1F
>>> +
>>> +#define LP87565_EN_SPREAD_SPEC			BIT(7)
>>> +#define LP87565_EN_PIN_CTRL_GPIO3		BIT(6)
>>> +#define LP87565_EN_PIN_SELECT_GPIO3		BIT(5)
>>> +#define LP87565_EN_PIN_CTRL_GPIO2		BIT(4)
>>> +#define LP87565_EN_PIN_SELECT_GPIO2		BIT(3)
>>> +#define LP87565_GPIO3_SEL			BIT(2)
>>> +#define LP87565_GPIO2_SEL			BIT(1)
>>> +#define LP87565_GPIO1_SEL			BIT(0)
>>> +
>>> +#define LP87565_GOIO3_OD			BIT(6)
>>> +#define LP87565_GOIO2_OD			BIT(5)
>>> +#define LP87565_GOIO1_OD			BIT(4)
>>> +#define LP87565_GOIO3_DIR			BIT(2)
>>> +#define LP87565_GOIO2_DIR			BIT(1)
>>> +#define LP87565_GOIO1_DIR			BIT(0)
>>> +
>>> +#define LP87565_GOIO3_IN			BIT(2)
>>> +#define LP87565_GOIO2_IN			BIT(1)
>>> +#define LP87565_GOIO1_IN			BIT(0)
>>> +
>>> +#define LP87565_GOIO3_OUT			BIT(2)
>>> +#define LP87565_GOIO2_OUT			BIT(1)
>>> +#define LP87565_GOIO1_OUT			BIT(0)
>>> +
>>> +/* Number of step-down converters available */
>>> +#define LP87565_NUM_BUCK		6
>>> +
>>> +enum LP87565_regulator_id {
>>> +	/* BUCK's */
>>> +	LP87565_BUCK_0,
>>> +	LP87565_BUCK_1,
>>> +	LP87565_BUCK_2,
>>> +	LP87565_BUCK_3,
>>> +	LP87565_BUCK_10,
>>> +	LP87565_BUCK_23,
>>> +};
>>> +
>>> +/**
>>> + * struct LP87565 - state holder for the LP87565 driver
>>> + * @dev: struct device pointer for MFD device
>>> + * @rev: revision of the LP87565
>>> + * @dev_type: The device type for example lp87565-q1
>>> + * @lock: lock guarding the data structure
>>> + * @regmap: register map of the LP87565 PMIC
>>> + *
>>> + * Device data may be used to access the LP87565 chip
>>> + */
>>> +struct lp87565 {
>>> +	struct device *dev;
>>> +	u8 rev;
>>> +	u8 dev_type;
>>> +	struct regmap *regmap;
>>> +};
>>> +#endif /* __LINUX_MFD_LP87565_H */
>>

[toc] | [prev] | [next] | [standalone]


#1647688

FromLee Jones <lee.jones@linaro.org>
Date2017-05-23 09:00 +0200
Message-ID<tKbXr-7Xu-1@gated-at.bofh.it>
In reply to#1647591
On Tue, 23 May 2017, Keerthy wrote:
> On Monday 22 May 2017 11:18 PM, Lee Jones wrote:
> > On Fri, 19 May 2017, Keerthy wrote:
> > 
> >> The LP87565 chip is a power management IC for Portable Navigation Systems
> >> and Tablet Computing devices. It contains the following components:
> >>
> >>         - Configurable Bucks(Single and multi-phase).
> >>         - Configurable General Purpose Output Signals (GPO).
> >>
> >> The LP87565-Q1 variant device uses two 2-phase outputs configuration,
> >> Buck0 is master for Buck0/1 output and Buck2 is master for Buck2/3
> >> output.
> >>
> >> Signed-off-by: Keerthy <j-keerthy@ti.com>
> >> ---
> >>  Documentation/devicetree/bindings/mfd/lp87565.txt |  44 ++++
> >>  drivers/mfd/Kconfig                               |  14 ++
> >>  drivers/mfd/Makefile                              |   1 +
> >>  drivers/mfd/lp87565.c                             | 103 ++++++++
> >>  include/linux/mfd/lp87565.h                       | 275 ++++++++++++++++++++++
> >>  5 files changed, 437 insertions(+)
> >>  create mode 100644 Documentation/devicetree/bindings/mfd/lp87565.txt
> >>  create mode 100644 drivers/mfd/lp87565.c
> >>  create mode 100644 include/linux/mfd/lp87565.h
> >>

[...]

> >> +/*
> >> + * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
> >> + *
> >> + * Author: Keerthy <j-keerthy@ti.com>
> > 
> > We usually ask for full "first last" names.
> 
> Keerthy is my full name and i do not have a surname.

What is the 'J' for in your email address?
[...]

> >> +static const struct i2c_device_id lp87565_id_table[] = {
> >> +	{ "lp87565-q1", 0 },
> >> +	{ },
> >> +};
> >> +MODULE_DEVICE_TABLE(i2c, lp87565_id_table);
> > 
> > Is this an OF only driver, or not?

You didn't answer my question?

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

[toc] | [prev] | [next] | [standalone]


#1647738

FromKeerthy <j-keerthy@ti.com>
Date2017-05-23 09:50 +0200
Message-ID<tKcJP-65-5@gated-at.bofh.it>
In reply to#1647688

On Tuesday 23 May 2017 12:27 PM, Lee Jones wrote:
> On Tue, 23 May 2017, Keerthy wrote:
>> On Monday 22 May 2017 11:18 PM, Lee Jones wrote:
>>> On Fri, 19 May 2017, Keerthy wrote:
>>>
>>>> The LP87565 chip is a power management IC for Portable Navigation Systems
>>>> and Tablet Computing devices. It contains the following components:
>>>>
>>>>         - Configurable Bucks(Single and multi-phase).
>>>>         - Configurable General Purpose Output Signals (GPO).
>>>>
>>>> The LP87565-Q1 variant device uses two 2-phase outputs configuration,
>>>> Buck0 is master for Buck0/1 output and Buck2 is master for Buck2/3
>>>> output.
>>>>
>>>> Signed-off-by: Keerthy <j-keerthy@ti.com>
>>>> ---
>>>>  Documentation/devicetree/bindings/mfd/lp87565.txt |  44 ++++
>>>>  drivers/mfd/Kconfig                               |  14 ++
>>>>  drivers/mfd/Makefile                              |   1 +
>>>>  drivers/mfd/lp87565.c                             | 103 ++++++++
>>>>  include/linux/mfd/lp87565.h                       | 275 ++++++++++++++++++++++
>>>>  5 files changed, 437 insertions(+)
>>>>  create mode 100644 Documentation/devicetree/bindings/mfd/lp87565.txt
>>>>  create mode 100644 drivers/mfd/lp87565.c
>>>>  create mode 100644 include/linux/mfd/lp87565.h
>>>>
> 
> [...]
> 
>>>> +/*
>>>> + * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
>>>> + *
>>>> + * Author: Keerthy <j-keerthy@ti.com>
>>>
>>> We usually ask for full "first last" names.
>>
>> Keerthy is my full name and i do not have a surname.
> 
> What is the 'J' for in your email address?

Father's initials.

> [...]
> 
>>>> +static const struct i2c_device_id lp87565_id_table[] = {
>>>> +	{ "lp87565-q1", 0 },
>>>> +	{ },
>>>> +};
>>>> +MODULE_DEVICE_TABLE(i2c, lp87565_id_table);
>>>
>>> Is this an OF only driver, or not?
> 
> You didn't answer my question?
> 

Sorry i replied on top again. It will be an OF only driver.

Regards,
Keerthy

[toc] | [prev] | [next] | [standalone]


#1647755

FromKeerthy <j-keerthy@ti.com>
Date2017-05-23 10:00 +0200
Message-ID<tKcTw-a4-21@gated-at.bofh.it>
In reply to#1647738

On Tuesday 23 May 2017 01:11 PM, Keerthy wrote:
> 
> 
> On Tuesday 23 May 2017 12:27 PM, Lee Jones wrote:
>> On Tue, 23 May 2017, Keerthy wrote:
>>> On Monday 22 May 2017 11:18 PM, Lee Jones wrote:
>>>> On Fri, 19 May 2017, Keerthy wrote:
>>>>
>>>>> The LP87565 chip is a power management IC for Portable Navigation Systems
>>>>> and Tablet Computing devices. It contains the following components:
>>>>>
>>>>>         - Configurable Bucks(Single and multi-phase).
>>>>>         - Configurable General Purpose Output Signals (GPO).
>>>>>
>>>>> The LP87565-Q1 variant device uses two 2-phase outputs configuration,
>>>>> Buck0 is master for Buck0/1 output and Buck2 is master for Buck2/3
>>>>> output.
>>>>>
>>>>> Signed-off-by: Keerthy <j-keerthy@ti.com>
>>>>> ---
>>>>>  Documentation/devicetree/bindings/mfd/lp87565.txt |  44 ++++
>>>>>  drivers/mfd/Kconfig                               |  14 ++
>>>>>  drivers/mfd/Makefile                              |   1 +
>>>>>  drivers/mfd/lp87565.c                             | 103 ++++++++
>>>>>  include/linux/mfd/lp87565.h                       | 275 ++++++++++++++++++++++
>>>>>  5 files changed, 437 insertions(+)
>>>>>  create mode 100644 Documentation/devicetree/bindings/mfd/lp87565.txt
>>>>>  create mode 100644 drivers/mfd/lp87565.c
>>>>>  create mode 100644 include/linux/mfd/lp87565.h
>>>>>
>>
>> [...]
>>
>>>>> +/*
>>>>> + * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
>>>>> + *
>>>>> + * Author: Keerthy <j-keerthy@ti.com>
>>>>
>>>> We usually ask for full "first last" names.
>>>
>>> Keerthy is my full name and i do not have a surname.
>>
>> What is the 'J' for in your email address?
> 
> Father's initials.

https://lkml.org/lkml/2012/7/11/482

I have been using this for a while now.

> 
>> [...]
>>
>>>>> +static const struct i2c_device_id lp87565_id_table[] = {
>>>>> +	{ "lp87565-q1", 0 },
>>>>> +	{ },
>>>>> +};
>>>>> +MODULE_DEVICE_TABLE(i2c, lp87565_id_table);
>>>>
>>>> Is this an OF only driver, or not?
>>
>> You didn't answer my question?
>>
> 
> Sorry i replied on top again. It will be an OF only driver.
> 
> Regards,
> Keerthy
> 

[toc] | [prev] | [next] | [standalone]


#1647808

FromLee Jones <lee.jones@linaro.org>
Date2017-05-23 10:50 +0200
Message-ID<tKdFT-Jg-13@gated-at.bofh.it>
In reply to#1647755
On Tue, 23 May 2017, Keerthy wrote:
> On Tuesday 23 May 2017 01:11 PM, Keerthy wrote:
> > On Tuesday 23 May 2017 12:27 PM, Lee Jones wrote:
> >> On Tue, 23 May 2017, Keerthy wrote:
> >>> On Monday 22 May 2017 11:18 PM, Lee Jones wrote:
> >>>> On Fri, 19 May 2017, Keerthy wrote:
> >>>>
> >>>>> The LP87565 chip is a power management IC for Portable Navigation Systems
> >>>>> and Tablet Computing devices. It contains the following components:
> >>>>>
> >>>>>         - Configurable Bucks(Single and multi-phase).
> >>>>>         - Configurable General Purpose Output Signals (GPO).
> >>>>>
> >>>>> The LP87565-Q1 variant device uses two 2-phase outputs configuration,
> >>>>> Buck0 is master for Buck0/1 output and Buck2 is master for Buck2/3
> >>>>> output.
> >>>>>
> >>>>> Signed-off-by: Keerthy <j-keerthy@ti.com>
> >>>>> ---
> >>>>>  Documentation/devicetree/bindings/mfd/lp87565.txt |  44 ++++
> >>>>>  drivers/mfd/Kconfig                               |  14 ++
> >>>>>  drivers/mfd/Makefile                              |   1 +
> >>>>>  drivers/mfd/lp87565.c                             | 103 ++++++++
> >>>>>  include/linux/mfd/lp87565.h                       | 275 ++++++++++++++++++++++
> >>>>>  5 files changed, 437 insertions(+)
> >>>>>  create mode 100644 Documentation/devicetree/bindings/mfd/lp87565.txt
> >>>>>  create mode 100644 drivers/mfd/lp87565.c
> >>>>>  create mode 100644 include/linux/mfd/lp87565.h
> >>>>>
> >>
> >> [...]
> >>
> >>>>> +/*
> >>>>> + * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
> >>>>> + *
> >>>>> + * Author: Keerthy <j-keerthy@ti.com>
> >>>>
> >>>> We usually ask for full "first last" names.
> >>>
> >>> Keerthy is my full name and i do not have a surname.
> >>
> >> What is the 'J' for in your email address?
> > 
> > Father's initials.
> 
> https://lkml.org/lkml/2012/7/11/482
> 
> I have been using this for a while now.

Right and Trump has been president for a while now, it doesn't mean
it's okay. ;)

> >> [...]
> >>
> >>>>> +static const struct i2c_device_id lp87565_id_table[] = {
> >>>>> +	{ "lp87565-q1", 0 },
> >>>>> +	{ },
> >>>>> +};
> >>>>> +MODULE_DEVICE_TABLE(i2c, lp87565_id_table);
> >>>>
> >>>> Is this an OF only driver, or not?
> >>
> >> You didn't answer my question?
> >>
> > 
> > Sorry i replied on top again. It will be an OF only driver.
> > 
> > Regards,
> > Keerthy
> > 

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

[toc] | [prev] | [next] | [standalone]


#1647905

FromKeerthy <j-keerthy@ti.com>
Date2017-05-23 12:00 +0200
Message-ID<tKeLE-1oL-13@gated-at.bofh.it>
In reply to#1647808

On Tuesday 23 May 2017 02:17 PM, Lee Jones wrote:
> On Tue, 23 May 2017, Keerthy wrote:
>> On Tuesday 23 May 2017 01:11 PM, Keerthy wrote:
>>> On Tuesday 23 May 2017 12:27 PM, Lee Jones wrote:
>>>> On Tue, 23 May 2017, Keerthy wrote:
>>>>> On Monday 22 May 2017 11:18 PM, Lee Jones wrote:
>>>>>> On Fri, 19 May 2017, Keerthy wrote:
>>>>>>
>>>>>>> The LP87565 chip is a power management IC for Portable Navigation Systems
>>>>>>> and Tablet Computing devices. It contains the following components:
>>>>>>>
>>>>>>>         - Configurable Bucks(Single and multi-phase).
>>>>>>>         - Configurable General Purpose Output Signals (GPO).
>>>>>>>
>>>>>>> The LP87565-Q1 variant device uses two 2-phase outputs configuration,
>>>>>>> Buck0 is master for Buck0/1 output and Buck2 is master for Buck2/3
>>>>>>> output.
>>>>>>>
>>>>>>> Signed-off-by: Keerthy <j-keerthy@ti.com>
>>>>>>> ---
>>>>>>>  Documentation/devicetree/bindings/mfd/lp87565.txt |  44 ++++
>>>>>>>  drivers/mfd/Kconfig                               |  14 ++
>>>>>>>  drivers/mfd/Makefile                              |   1 +
>>>>>>>  drivers/mfd/lp87565.c                             | 103 ++++++++
>>>>>>>  include/linux/mfd/lp87565.h                       | 275 ++++++++++++++++++++++
>>>>>>>  5 files changed, 437 insertions(+)
>>>>>>>  create mode 100644 Documentation/devicetree/bindings/mfd/lp87565.txt
>>>>>>>  create mode 100644 drivers/mfd/lp87565.c
>>>>>>>  create mode 100644 include/linux/mfd/lp87565.h
>>>>>>>
>>>>
>>>> [...]
>>>>
>>>>>>> +/*
>>>>>>> + * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
>>>>>>> + *
>>>>>>> + * Author: Keerthy <j-keerthy@ti.com>
>>>>>>
>>>>>> We usually ask for full "first last" names.
>>>>>
>>>>> Keerthy is my full name and i do not have a surname.
>>>>
>>>> What is the 'J' for in your email address?
>>>
>>> Father's initials.
>>
>> https://lkml.org/lkml/2012/7/11/482
>>
>> I have been using this for a while now.
> 
> Right and Trump has been president for a while now, it doesn't mean
> it's okay. ;)

I won't comment on Trump! Let me assure you once again that my full name
is Keerthy just like your full name is Lee Jones :-).

> 
>>>> [...]
>>>>
>>>>>>> +static const struct i2c_device_id lp87565_id_table[] = {
>>>>>>> +	{ "lp87565-q1", 0 },
>>>>>>> +	{ },
>>>>>>> +};
>>>>>>> +MODULE_DEVICE_TABLE(i2c, lp87565_id_table);
>>>>>>
>>>>>> Is this an OF only driver, or not?
>>>>
>>>> You didn't answer my question?
>>>>
>>>
>>> Sorry i replied on top again. It will be an OF only driver.
>>>
>>> Regards,
>>> Keerthy
>>>
> 

[toc] | [prev] | [next] | [standalone]


#1647812

FromLee Jones <lee.jones@linaro.org>
Date2017-05-23 10:50 +0200
Message-ID<tKdFU-Jg-19@gated-at.bofh.it>
In reply to#1647738
On Tue, 23 May 2017, Keerthy wrote:
> On Tuesday 23 May 2017 12:27 PM, Lee Jones wrote:
> > On Tue, 23 May 2017, Keerthy wrote:
> >> On Monday 22 May 2017 11:18 PM, Lee Jones wrote:
> >>> On Fri, 19 May 2017, Keerthy wrote:
> >>>
> >>>> The LP87565 chip is a power management IC for Portable Navigation Systems
> >>>> and Tablet Computing devices. It contains the following components:
> >>>>
> >>>>         - Configurable Bucks(Single and multi-phase).
> >>>>         - Configurable General Purpose Output Signals (GPO).
> >>>>
> >>>> The LP87565-Q1 variant device uses two 2-phase outputs configuration,
> >>>> Buck0 is master for Buck0/1 output and Buck2 is master for Buck2/3
> >>>> output.
> >>>>
> >>>> Signed-off-by: Keerthy <j-keerthy@ti.com>
> >>>> ---
> >>>>  Documentation/devicetree/bindings/mfd/lp87565.txt |  44 ++++
> >>>>  drivers/mfd/Kconfig                               |  14 ++
> >>>>  drivers/mfd/Makefile                              |   1 +
> >>>>  drivers/mfd/lp87565.c                             | 103 ++++++++
> >>>>  include/linux/mfd/lp87565.h                       | 275 ++++++++++++++++++++++
> >>>>  5 files changed, 437 insertions(+)
> >>>>  create mode 100644 Documentation/devicetree/bindings/mfd/lp87565.txt
> >>>>  create mode 100644 drivers/mfd/lp87565.c
> >>>>  create mode 100644 include/linux/mfd/lp87565.h
> >>>>
> > 
> > [...]
> > 
> >>>> +/*
> >>>> + * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
> >>>> + *
> >>>> + * Author: Keerthy <j-keerthy@ti.com>
> >>>
> >>> We usually ask for full "first last" names.
> >>
> >> Keerthy is my full name and i do not have a surname.
> > 
> > What is the 'J' for in your email address?
> 
> Father's initials.

Okay.

> > [...]
> > 
> >>>> +static const struct i2c_device_id lp87565_id_table[] = {
> >>>> +	{ "lp87565-q1", 0 },
> >>>> +	{ },
> >>>> +};
> >>>> +MODULE_DEVICE_TABLE(i2c, lp87565_id_table);
> >>>
> >>> Is this an OF only driver, or not?
> > 
> > You didn't answer my question?
> 
> Sorry i replied on top again. It will be an OF only driver.

Okay, then you don't need this table and you should depend on OF in
the Kconfig file.

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

[toc] | [prev] | [next] | [standalone]


#1647913

FromKeerthy <j-keerthy@ti.com>
Date2017-05-23 12:20 +0200
Message-ID<tKf4Z-1Lc-1@gated-at.bofh.it>
In reply to#1647812

On Tuesday 23 May 2017 02:15 PM, Lee Jones wrote:
> On Tue, 23 May 2017, Keerthy wrote:
>> On Tuesday 23 May 2017 12:27 PM, Lee Jones wrote:
>>> On Tue, 23 May 2017, Keerthy wrote:
>>>> On Monday 22 May 2017 11:18 PM, Lee Jones wrote:
>>>>> On Fri, 19 May 2017, Keerthy wrote:
>>>>>
>>>>>> The LP87565 chip is a power management IC for Portable Navigation Systems
>>>>>> and Tablet Computing devices. It contains the following components:
>>>>>>
>>>>>>         - Configurable Bucks(Single and multi-phase).
>>>>>>         - Configurable General Purpose Output Signals (GPO).
>>>>>>
>>>>>> The LP87565-Q1 variant device uses two 2-phase outputs configuration,
>>>>>> Buck0 is master for Buck0/1 output and Buck2 is master for Buck2/3
>>>>>> output.
>>>>>>
>>>>>> Signed-off-by: Keerthy <j-keerthy@ti.com>
>>>>>> ---
>>>>>>  Documentation/devicetree/bindings/mfd/lp87565.txt |  44 ++++
>>>>>>  drivers/mfd/Kconfig                               |  14 ++
>>>>>>  drivers/mfd/Makefile                              |   1 +
>>>>>>  drivers/mfd/lp87565.c                             | 103 ++++++++
>>>>>>  include/linux/mfd/lp87565.h                       | 275 ++++++++++++++++++++++
>>>>>>  5 files changed, 437 insertions(+)
>>>>>>  create mode 100644 Documentation/devicetree/bindings/mfd/lp87565.txt
>>>>>>  create mode 100644 drivers/mfd/lp87565.c
>>>>>>  create mode 100644 include/linux/mfd/lp87565.h
>>>>>>
>>>
>>> [...]
>>>
>>>>>> +/*
>>>>>> + * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
>>>>>> + *
>>>>>> + * Author: Keerthy <j-keerthy@ti.com>
>>>>>
>>>>> We usually ask for full "first last" names.
>>>>
>>>> Keerthy is my full name and i do not have a surname.
>>>
>>> What is the 'J' for in your email address?
>>
>> Father's initials.
> 
> Okay.
> 
>>> [...]
>>>
>>>>>> +static const struct i2c_device_id lp87565_id_table[] = {
>>>>>> +	{ "lp87565-q1", 0 },
>>>>>> +	{ },
>>>>>> +};
>>>>>> +MODULE_DEVICE_TABLE(i2c, lp87565_id_table);
>>>>>
>>>>> Is this an OF only driver, or not?
>>>
>>> You didn't answer my question?
>>
>> Sorry i replied on top again. It will be an OF only driver.
> 
> Okay, then you don't need this table and you should depend on OF in
> the Kconfig file.

Okay. Cool thanks for this info.

I am seeing this commit: 4895e493f91bff7f96f328b883c7f6448aa6abc6

mfd: Export OF module alias information in missing drivers

So no need of i2c_device_id for any of the OF-only mfd drivers?

> 

[toc] | [prev] | [next] | [standalone]


#1647981

FromKeerthy <j-keerthy@ti.com>
Date2017-05-23 14:30 +0200
Message-ID<tKh6N-38u-13@gated-at.bofh.it>
In reply to#1647913

On Tuesday 23 May 2017 03:41 PM, Keerthy wrote:
> 
> 
> On Tuesday 23 May 2017 02:15 PM, Lee Jones wrote:
>> On Tue, 23 May 2017, Keerthy wrote:
>>> On Tuesday 23 May 2017 12:27 PM, Lee Jones wrote:
>>>> On Tue, 23 May 2017, Keerthy wrote:
>>>>> On Monday 22 May 2017 11:18 PM, Lee Jones wrote:
>>>>>> On Fri, 19 May 2017, Keerthy wrote:
>>>>>>
>>>>>>> The LP87565 chip is a power management IC for Portable Navigation Systems
>>>>>>> and Tablet Computing devices. It contains the following components:
>>>>>>>
>>>>>>>         - Configurable Bucks(Single and multi-phase).
>>>>>>>         - Configurable General Purpose Output Signals (GPO).
>>>>>>>
>>>>>>> The LP87565-Q1 variant device uses two 2-phase outputs configuration,
>>>>>>> Buck0 is master for Buck0/1 output and Buck2 is master for Buck2/3
>>>>>>> output.
>>>>>>>
>>>>>>> Signed-off-by: Keerthy <j-keerthy@ti.com>
>>>>>>> ---
>>>>>>>  Documentation/devicetree/bindings/mfd/lp87565.txt |  44 ++++
>>>>>>>  drivers/mfd/Kconfig                               |  14 ++
>>>>>>>  drivers/mfd/Makefile                              |   1 +
>>>>>>>  drivers/mfd/lp87565.c                             | 103 ++++++++
>>>>>>>  include/linux/mfd/lp87565.h                       | 275 ++++++++++++++++++++++
>>>>>>>  5 files changed, 437 insertions(+)
>>>>>>>  create mode 100644 Documentation/devicetree/bindings/mfd/lp87565.txt
>>>>>>>  create mode 100644 drivers/mfd/lp87565.c
>>>>>>>  create mode 100644 include/linux/mfd/lp87565.h
>>>>>>>
>>>>
>>>> [...]
>>>>
>>>>>>> +/*
>>>>>>> + * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
>>>>>>> + *
>>>>>>> + * Author: Keerthy <j-keerthy@ti.com>
>>>>>>
>>>>>> We usually ask for full "first last" names.
>>>>>
>>>>> Keerthy is my full name and i do not have a surname.
>>>>
>>>> What is the 'J' for in your email address?
>>>
>>> Father's initials.
>>
>> Okay.
>>
>>>> [...]
>>>>
>>>>>>> +static const struct i2c_device_id lp87565_id_table[] = {
>>>>>>> +	{ "lp87565-q1", 0 },
>>>>>>> +	{ },
>>>>>>> +};
>>>>>>> +MODULE_DEVICE_TABLE(i2c, lp87565_id_table);
>>>>>>
>>>>>> Is this an OF only driver, or not?
>>>>
>>>> You didn't answer my question?
>>>
>>> Sorry i replied on top again. It will be an OF only driver.
>>
>> Okay, then you don't need this table and you should depend on OF in
>> the Kconfig file.
> 
> Okay. Cool thanks for this info.
> 
> I am seeing this commit: 4895e493f91bff7f96f328b883c7f6448aa6abc6
> 
> mfd: Export OF module alias information in missing drivers
> 
> So no need of i2c_device_id for any of the OF-only mfd drivers?

Referred drivers/mfd/max77686.c driver. Used probe_new. Posted v2.

> 
>>

[toc] | [prev] | [next] | [standalone]


#1648207

FromLee Jones <lee.jones@linaro.org>
Date2017-05-23 17:40 +0200
Message-ID<tKk4G-54Q-19@gated-at.bofh.it>
In reply to#1647913
On Tue, 23 May 2017, Keerthy wrote:

> 
> 
> On Tuesday 23 May 2017 02:15 PM, Lee Jones wrote:
> > On Tue, 23 May 2017, Keerthy wrote:
> >> On Tuesday 23 May 2017 12:27 PM, Lee Jones wrote:
> >>> On Tue, 23 May 2017, Keerthy wrote:
> >>>> On Monday 22 May 2017 11:18 PM, Lee Jones wrote:
> >>>>> On Fri, 19 May 2017, Keerthy wrote:
> >>>>>
> >>>>>> The LP87565 chip is a power management IC for Portable Navigation Systems
> >>>>>> and Tablet Computing devices. It contains the following components:
> >>>>>>
> >>>>>>         - Configurable Bucks(Single and multi-phase).
> >>>>>>         - Configurable General Purpose Output Signals (GPO).
> >>>>>>
> >>>>>> The LP87565-Q1 variant device uses two 2-phase outputs configuration,
> >>>>>> Buck0 is master for Buck0/1 output and Buck2 is master for Buck2/3
> >>>>>> output.
> >>>>>>
> >>>>>> Signed-off-by: Keerthy <j-keerthy@ti.com>
> >>>>>> ---
> >>>>>>  Documentation/devicetree/bindings/mfd/lp87565.txt |  44 ++++
> >>>>>>  drivers/mfd/Kconfig                               |  14 ++
> >>>>>>  drivers/mfd/Makefile                              |   1 +
> >>>>>>  drivers/mfd/lp87565.c                             | 103 ++++++++
> >>>>>>  include/linux/mfd/lp87565.h                       | 275 ++++++++++++++++++++++
> >>>>>>  5 files changed, 437 insertions(+)
> >>>>>>  create mode 100644 Documentation/devicetree/bindings/mfd/lp87565.txt
> >>>>>>  create mode 100644 drivers/mfd/lp87565.c
> >>>>>>  create mode 100644 include/linux/mfd/lp87565.h
> >>>>>>
> >>>
> >>> [...]
> >>>
> >>>>>> +/*
> >>>>>> + * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
> >>>>>> + *
> >>>>>> + * Author: Keerthy <j-keerthy@ti.com>
> >>>>>
> >>>>> We usually ask for full "first last" names.
> >>>>
> >>>> Keerthy is my full name and i do not have a surname.
> >>>
> >>> What is the 'J' for in your email address?
> >>
> >> Father's initials.
> > 
> > Okay.
> > 
> >>> [...]
> >>>
> >>>>>> +static const struct i2c_device_id lp87565_id_table[] = {
> >>>>>> +	{ "lp87565-q1", 0 },
> >>>>>> +	{ },
> >>>>>> +};
> >>>>>> +MODULE_DEVICE_TABLE(i2c, lp87565_id_table);
> >>>>>
> >>>>> Is this an OF only driver, or not?
> >>>
> >>> You didn't answer my question?
> >>
> >> Sorry i replied on top again. It will be an OF only driver.
> > 
> > Okay, then you don't need this table and you should depend on OF in
> > the Kconfig file.
> 
> Okay. Cool thanks for this info.
> 
> I am seeing this commit: 4895e493f91bff7f96f328b883c7f6448aa6abc6
> 
> mfd: Export OF module alias information in missing drivers
> 
> So no need of i2c_device_id for any of the OF-only mfd drivers?

So long as you don't depend on the .data attribute.

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web