linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v8 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core
@ 2016-02-14  6:29 Chen Feng
  2016-02-14  6:29 ` [PATCH v8 1/5] mfd: hi655x: Add document for mfd hi665x PMIC Chen Feng
                   ` (5 more replies)
  0 siblings, 6 replies; 17+ messages in thread
From: Chen Feng @ 2016-02-14  6:29 UTC (permalink / raw)
  To: lgirdwood, broonie, linux-kernel, lee.jones, puck.chen, w.f,
	kong.kongxinwei, haojian.zhuang
  Cc: suzhuangluan, dan.zhao

The patch sets add support for Hi6220 PMIC Hi655x MFD core and its
regulator driver.
Current testing and support board is Hikey which is one of 96boards.
It is an arm64 open source board. For more information about this board,
please access https://www.96boards.org.

This is hardware layout for access PMIC Hi655x from AP SoC Hi6220.
Between PMIC Hi655x and Hi6220, the physical signal channel is SSI.
We can use memory-mapped I/O to communicate.

+----------------+             +-------------+
|                |             |             |
|    Hi6220      |   SSI bus   |   Hi655x    |
|                |-------------|             |
|                |(REGMAP_MMIO)|             |
+----------------+             +-------------+

V2: Code refactoring of regulator.

V3: Drop mtcmos from this patch and use regmap-irq.

V4: Move the vset-table to driver code and donot open code for it.

V5: Use regulators_node and of_match, donot open code fot it.

V7: Change the constraints into hikey.dts and fix code in PMIC.

V8: Change format in document, and fix bit mask in regulator.

Chen Feng (5):
  mfd: hi655x: Add document for mfd hi665x PMIC
  regulator: hi655x: Document for hi655x regulator
  mfd: hi655x: Add MFD driver for hi655x
  regulator: hi655x: enable regulator for hi655x PMIC
  arm64: dts: hisilicon: Add hi655x pmic dts node

 .../devicetree/bindings/mfd/hisilicon,hi655x.txt   |  27 +++
 .../regulator/hisilicon,hi655x-regulator.txt       |  29 +++
 arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts     |  87 ++++++++
 drivers/mfd/Kconfig                                |  10 +
 drivers/mfd/Makefile                               |   1 +
 drivers/mfd/hi655x-pmic.c                          | 162 +++++++++++++++
 drivers/regulator/Kconfig                          |   8 +
 drivers/regulator/Makefile                         |   1 +
 drivers/regulator/hi655x-regulator.c               | 227 +++++++++++++++++++++
 include/linux/mfd/hi655x-pmic.h                    |  55 +++++
 10 files changed, 607 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt
 create mode 100644 Documentation/devicetree/bindings/regulator/hisilicon,hi655x-regulator.txt
 create mode 100644 drivers/mfd/hi655x-pmic.c
 create mode 100644 drivers/regulator/hi655x-regulator.c
 create mode 100644 include/linux/mfd/hi655x-pmic.h

-- 
1.9.1

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

* [PATCH v8 1/5] mfd: hi655x: Add document for mfd hi665x PMIC
  2016-02-14  6:29 [PATCH v8 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core Chen Feng
@ 2016-02-14  6:29 ` Chen Feng
  2016-02-15  8:32   ` Lee Jones
  2016-04-11 10:40   ` Lee Jones
  2016-02-14  6:29 ` [PATCH v8 2/5] regulator: hi655x: Document for hi655x regulator Chen Feng
                   ` (4 subsequent siblings)
  5 siblings, 2 replies; 17+ messages in thread
From: Chen Feng @ 2016-02-14  6:29 UTC (permalink / raw)
  To: lgirdwood, broonie, linux-kernel, lee.jones, puck.chen, w.f,
	kong.kongxinwei, haojian.zhuang
  Cc: suzhuangluan, dan.zhao

DT bindings for hisilicon hi655x MFD PMIC chip.

Signed-off-by: Chen Feng <puck.chen@hisilicon.com>
Signed-off-by: Fei Wang <w.f@huawei.com>
Signed-off-by: Xinwei Kong <kong.kongxinwei@hisilicon.com>
Reviewed-by: Haojian Zhuang <haojian.zhuang@linaro.org>
---
 .../devicetree/bindings/mfd/hisilicon,hi655x.txt   | 27 ++++++++++++++++++++++
 1 file changed, 27 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt

diff --git a/Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt b/Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt
new file mode 100644
index 0000000..0548569
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt
@@ -0,0 +1,27 @@
+Hisilicon Hi655x Power Management Integrated Circuit (PMIC)
+
+The hardware layout for access PMIC Hi655x from AP SoC Hi6220.
+Between PMIC Hi655x and Hi6220, the physical signal channel is SSI.
+We can use memory-mapped I/O to communicate.
+
++----------------+             +-------------+
+|                |             |             |
+|    Hi6220      |   SSI bus   |   Hi655x    |
+|                |-------------|             |
+|                |(REGMAP_MMIO)|             |
++----------------+             +-------------+
+
+Required properties:
+- compatible:           Should be "hisilicon,hi655x-pmic".
+- reg:                  Base address of PMIC on Hi6220 SoC.
+- interrupt-controller: Hi655x has internal IRQs (has own IRQ domain).
+- pmic-gpios:           The GPIO used by PMIC IRQ.
+
+Example:
+	pmic: pmic@f8000000 {
+		compatible = "hisilicon,hi655x-pmic";
+		reg = <0x0 0xf8000000 0x0 0x1000>;
+		interrupt-controller;
+		#interrupt-cells = <2>;
+		pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+	}
-- 
1.9.1

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

* [PATCH v8 2/5] regulator: hi655x: Document for hi655x regulator
  2016-02-14  6:29 [PATCH v8 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core Chen Feng
  2016-02-14  6:29 ` [PATCH v8 1/5] mfd: hi655x: Add document for mfd hi665x PMIC Chen Feng
@ 2016-02-14  6:29 ` Chen Feng
  2016-02-14  6:29 ` [PATCH v8 3/5] mfd: hi655x: Add MFD driver for hi655x Chen Feng
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 17+ messages in thread
From: Chen Feng @ 2016-02-14  6:29 UTC (permalink / raw)
  To: lgirdwood, broonie, linux-kernel, lee.jones, puck.chen, w.f,
	kong.kongxinwei, haojian.zhuang
  Cc: suzhuangluan, dan.zhao

This patch adds the device tree binding documentation for
hi655x PMIC regulator.

Signed-off-by: Chen Feng <puck.chen@hisilicon.com>
Signed-off-by: Fei Wang <w.f@huawei.com>
Signed-off-by: Xinwei Kong <kong.kongxinwei@hisilicon.com>
Reviewed-by: Haojian Zhuang <haojian.zhuang@linaro.org>
---
 .../regulator/hisilicon,hi655x-regulator.txt       | 29 ++++++++++++++++++++++
 1 file changed, 29 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/regulator/hisilicon,hi655x-regulator.txt

diff --git a/Documentation/devicetree/bindings/regulator/hisilicon,hi655x-regulator.txt b/Documentation/devicetree/bindings/regulator/hisilicon,hi655x-regulator.txt
new file mode 100644
index 0000000..14cfdc5
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/hisilicon,hi655x-regulator.txt
@@ -0,0 +1,29 @@
+Hisilicon Hi655x Voltage regulators
+
+Note:
+The Hi655x regulator control is managed by Hi655x PMIC.
+So the node of this regulator must be child node of Hi655x
+PMIC node.
+
+The driver uses the regulator core framework, so please also
+take the bindings of regulator.txt for reference.
+
+The valid names for regulators are:
+
+LDO2_2V8 LDO7_SDIO LDO10_2V85 LDO13_1V8 LDO14_2V8
+LDO15_1V8 LDO17_2V5 LDO19_3V0 LDO21_1V8 LDO22_1V2
+
+Example:
+        pmic: pmic@f8000000 {
+                compatible = "hisilicon,hi655x-pmic";
+		...
+		regulators {
+			ldo2: LDO2@a21 {
+				regulator-name = "LDO2_2V8";
+				regulator-min-microvolt = <2500000>;
+				regulator-max-microvolt = <3200000>;
+				regulator-enable-ramp-delay = <120>;
+			};
+			...
+		}
+	}
-- 
1.9.1

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

* [PATCH v8 3/5] mfd: hi655x: Add MFD driver for hi655x
  2016-02-14  6:29 [PATCH v8 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core Chen Feng
  2016-02-14  6:29 ` [PATCH v8 1/5] mfd: hi655x: Add document for mfd hi665x PMIC Chen Feng
  2016-02-14  6:29 ` [PATCH v8 2/5] regulator: hi655x: Document for hi655x regulator Chen Feng
@ 2016-02-14  6:29 ` Chen Feng
  2016-04-11 10:41   ` Lee Jones
  2016-02-14  6:29 ` [PATCH v8 4/5] regulator: hi655x: enable regulator for hi655x PMIC Chen Feng
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 17+ messages in thread
From: Chen Feng @ 2016-02-14  6:29 UTC (permalink / raw)
  To: lgirdwood, broonie, linux-kernel, lee.jones, puck.chen, w.f,
	kong.kongxinwei, haojian.zhuang
  Cc: suzhuangluan, dan.zhao

Add PMIC MFD driver to support hisilicon hi665x.

Signed-off-by: Chen Feng <puck.chen@hisilicon.com>
Signed-off-by: Fei Wang <w.f@huawei.com>
Signed-off-by: Xinwei Kong <kong.kongxinwei@hisilicon.com>
Reviewed-by: Haojian Zhuang <haojian.zhuang@linaro.org>
Acked-by: Lee Jones <lee.jones@linaro.org>
---
 drivers/mfd/Kconfig             |  10 +++
 drivers/mfd/Makefile            |   1 +
 drivers/mfd/hi655x-pmic.c       | 162 ++++++++++++++++++++++++++++++++++++++++
 include/linux/mfd/hi655x-pmic.h |  55 ++++++++++++++
 4 files changed, 228 insertions(+)
 create mode 100644 drivers/mfd/hi655x-pmic.c
 create mode 100644 include/linux/mfd/hi655x-pmic.h

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 9ca66de..5b1c091 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -284,6 +284,16 @@ config MFD_HI6421_PMIC
 	  menus in order to enable them.
 	  We communicate with the Hi6421 via memory-mapped I/O.
 
+config MFD_HI655X_PMIC
+	tristate "HiSilicon Hi655X series PMU/Codec IC"
+	depends on ARCH_HISI || COMPILE_TEST
+	depends on OF
+	select MFD_CORE
+	select REGMAP_MMIO
+	select REGMAP_IRQ
+	help
+	  Select this option to enable Hisilicon hi655x series pmic driver.
+
 config HTC_EGPIO
 	bool "HTC EGPIO support"
 	depends on GPIOLIB && ARM
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 0f230a6..1e166c1 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -190,6 +190,7 @@ obj-$(CONFIG_MFD_STW481X)	+= stw481x.o
 obj-$(CONFIG_MFD_IPAQ_MICRO)	+= ipaq-micro.o
 obj-$(CONFIG_MFD_MENF21BMC)	+= menf21bmc.o
 obj-$(CONFIG_MFD_HI6421_PMIC)	+= hi6421-pmic-core.o
+obj-$(CONFIG_MFD_HI655X_PMIC)   += hi655x-pmic.o
 obj-$(CONFIG_MFD_DLN2)		+= dln2.o
 obj-$(CONFIG_MFD_RT5033)	+= rt5033.o
 obj-$(CONFIG_MFD_SKY81452)	+= sky81452.o
diff --git a/drivers/mfd/hi655x-pmic.c b/drivers/mfd/hi655x-pmic.c
new file mode 100644
index 0000000..05ddc78
--- /dev/null
+++ b/drivers/mfd/hi655x-pmic.c
@@ -0,0 +1,162 @@
+/*
+ * Device driver for MFD hi655x PMIC
+ *
+ * Copyright (c) 2016 Hisilicon.
+ *
+ * Authors:
+ * Chen Feng <puck.chen@hisilicon.com>
+ * Fei  Wang <w.f@huawei.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/gpio.h>
+#include <linux/io.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/mfd/core.h>
+#include <linux/mfd/hi655x-pmic.h>
+#include <linux/module.h>
+#include <linux/of_gpio.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+static const struct mfd_cell hi655x_pmic_devs[] = {
+	{ .name = "hi655x-regulator", },
+};
+
+static const struct regmap_irq hi655x_irqs[] = {
+	{ .reg_offset = 0, .mask = OTMP_D1R_INT },
+	{ .reg_offset = 0, .mask = VSYS_2P5_R_INT },
+	{ .reg_offset = 0, .mask = VSYS_UV_D3R_INT },
+	{ .reg_offset = 0, .mask = VSYS_6P0_D200UR_INT },
+	{ .reg_offset = 0, .mask = PWRON_D4SR_INT },
+	{ .reg_offset = 0, .mask = PWRON_D20F_INT },
+	{ .reg_offset = 0, .mask = PWRON_D20R_INT },
+	{ .reg_offset = 0, .mask = RESERVE_INT },
+};
+
+static const struct regmap_irq_chip hi655x_irq_chip = {
+	.name = "hi655x-pmic",
+	.irqs = hi655x_irqs,
+	.num_regs = 1,
+	.num_irqs = ARRAY_SIZE(hi655x_irqs),
+	.status_base = HI655X_IRQ_STAT_BASE,
+	.mask_base = HI655X_IRQ_MASK_BASE,
+};
+
+static struct regmap_config hi655x_regmap_config = {
+	.reg_bits = 32,
+	.reg_stride = HI655X_STRIDE,
+	.val_bits = 8,
+	.max_register = HI655X_BUS_ADDR(0xFFF),
+};
+
+static void hi655x_local_irq_clear(struct regmap *map)
+{
+	int i;
+
+	regmap_write(map, HI655X_ANA_IRQM_BASE, HI655X_IRQ_CLR);
+	for (i = 0; i < HI655X_IRQ_ARRAY; i++) {
+		regmap_write(map, HI655X_IRQ_STAT_BASE + i * HI655X_STRIDE,
+			     HI655X_IRQ_CLR);
+	}
+}
+
+static int hi655x_pmic_probe(struct platform_device *pdev)
+{
+	int ret;
+	struct hi655x_pmic *pmic;
+	struct device *dev = &pdev->dev;
+	struct device_node *np = dev->of_node;
+	void __iomem *base;
+
+	pmic = devm_kzalloc(dev, sizeof(*pmic), GFP_KERNEL);
+	if (!pmic)
+		return -ENOMEM;
+	pmic->dev = dev;
+
+	pmic->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!pmic->res)
+		return -ENOENT;
+
+	base = devm_ioremap_resource(dev, pmic->res);
+	if (!base)
+		return -ENOMEM;
+
+	pmic->regmap = devm_regmap_init_mmio_clk(dev, NULL, base,
+						 &hi655x_regmap_config);
+
+	regmap_read(pmic->regmap, HI655X_BUS_ADDR(HI655X_VER_REG), &pmic->ver);
+	if ((pmic->ver < PMU_VER_START) || (pmic->ver > PMU_VER_END)) {
+		dev_warn(dev, "PMU version %d unsupported\n", pmic->ver);
+		return -EINVAL;
+	}
+
+	hi655x_local_irq_clear(pmic->regmap);
+
+	pmic->gpio = of_get_named_gpio(np, "pmic-gpios", 0);
+	if (!gpio_is_valid(pmic->gpio)) {
+		dev_err(dev, "Failed to get the pmic-gpios\n");
+		return -ENODEV;
+	}
+
+	ret = devm_gpio_request_one(dev, pmic->gpio, GPIOF_IN,
+				    "hi655x_pmic_irq");
+	if (ret < 0) {
+		dev_err(dev, "Failed to request gpio %d  ret = %d\n",
+			pmic->gpio, ret);
+		return ret;
+	}
+
+	ret = regmap_add_irq_chip(pmic->regmap, gpio_to_irq(pmic->gpio),
+				  IRQF_TRIGGER_LOW | IRQF_NO_SUSPEND, 0,
+				  &hi655x_irq_chip, &pmic->irq_data);
+	if (ret) {
+		dev_err(dev, "Failed to obtain 'hi655x_pmic_irq' %d\n", ret);
+		return ret;
+	}
+
+	platform_set_drvdata(pdev, pmic);
+
+	ret = mfd_add_devices(dev, PLATFORM_DEVID_AUTO, hi655x_pmic_devs,
+			      ARRAY_SIZE(hi655x_pmic_devs), NULL, 0, NULL);
+	if (ret) {
+		dev_err(dev, "Failed to register device %d\n", ret);
+		regmap_del_irq_chip(gpio_to_irq(pmic->gpio), pmic->irq_data);
+		return ret;
+	}
+
+	return 0;
+}
+
+static int hi655x_pmic_remove(struct platform_device *pdev)
+{
+	struct hi655x_pmic *pmic = platform_get_drvdata(pdev);
+
+	regmap_del_irq_chip(gpio_to_irq(pmic->gpio), pmic->irq_data);
+	mfd_remove_devices(&pdev->dev);
+	return 0;
+}
+
+static const struct of_device_id hi655x_pmic_match[] = {
+	{ .compatible = "hisilicon,hi655x-pmic", },
+	{},
+};
+
+static struct platform_driver hi655x_pmic_driver = {
+	.driver	= {
+		.name =	"hi655x-pmic",
+		.of_match_table = of_match_ptr(hi655x_pmic_match),
+	},
+	.probe  = hi655x_pmic_probe,
+	.remove = hi655x_pmic_remove,
+};
+module_platform_driver(hi655x_pmic_driver);
+
+MODULE_AUTHOR("Chen Feng <puck.chen@hisilicon.com>");
+MODULE_DESCRIPTION("Hisilicon hi655x PMIC driver");
+MODULE_LICENSE("GPL v2");
diff --git a/include/linux/mfd/hi655x-pmic.h b/include/linux/mfd/hi655x-pmic.h
new file mode 100644
index 0000000..dbbe9a6
--- /dev/null
+++ b/include/linux/mfd/hi655x-pmic.h
@@ -0,0 +1,55 @@
+/*
+ * Device driver for regulators in hi655x IC
+ *
+ * Copyright (c) 2016 Hisilicon.
+ *
+ * Authors:
+ * Chen Feng <puck.chen@hisilicon.com>
+ * Fei  Wang <w.f@huawei.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __HI655X_PMIC_H
+#define __HI655X_PMIC_H
+
+/* Hi655x registers are mapped to memory bus in 4 bytes stride */
+#define HI655X_STRIDE                   4
+#define HI655X_BUS_ADDR(x)              ((x) << 2)
+
+#define HI655X_BITS                     8
+
+#define HI655X_NR_IRQ                   32
+
+#define HI655X_IRQ_STAT_BASE            (0x003 << 2)
+#define HI655X_IRQ_MASK_BASE            (0x007 << 2)
+#define HI655X_ANA_IRQM_BASE            (0x1b5 << 2)
+#define HI655X_IRQ_ARRAY                4
+#define HI655X_IRQ_MASK                 0xFF
+#define HI655X_IRQ_CLR                  0xFF
+#define HI655X_VER_REG                  0x00
+
+#define PMU_VER_START                   0x10
+#define PMU_VER_END                     0x38
+
+#define RESERVE_INT                     BIT(7)
+#define PWRON_D20R_INT                  BIT(6)
+#define PWRON_D20F_INT                  BIT(5)
+#define PWRON_D4SR_INT                  BIT(4)
+#define VSYS_6P0_D200UR_INT             BIT(3)
+#define VSYS_UV_D3R_INT                 BIT(2)
+#define VSYS_2P5_R_INT                  BIT(1)
+#define OTMP_D1R_INT                    BIT(0)
+
+struct hi655x_pmic {
+	struct resource *res;
+	struct device *dev;
+	struct regmap *regmap;
+	int gpio;
+	unsigned int ver;
+	struct regmap_irq_chip_data *irq_data;
+};
+
+#endif
-- 
1.9.1

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

* [PATCH v8 4/5] regulator: hi655x: enable regulator for hi655x PMIC
  2016-02-14  6:29 [PATCH v8 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core Chen Feng
                   ` (2 preceding siblings ...)
  2016-02-14  6:29 ` [PATCH v8 3/5] mfd: hi655x: Add MFD driver for hi655x Chen Feng
@ 2016-02-14  6:29 ` Chen Feng
  2016-02-14  6:29 ` [PATCH v8 5/5] arm64: dts: hisilicon: Add hi655x pmic dts node Chen Feng
  2016-04-11  8:14 ` [PATCH v8 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core Lee Jones
  5 siblings, 0 replies; 17+ messages in thread
From: Chen Feng @ 2016-02-14  6:29 UTC (permalink / raw)
  To: lgirdwood, broonie, linux-kernel, lee.jones, puck.chen, w.f,
	kong.kongxinwei, haojian.zhuang
  Cc: suzhuangluan, dan.zhao

Add the regulator driver for hi655x PMIC.

Signed-off-by: Chen Feng <puck.chen@hisilicon.com>
Signed-off-by: Fei Wang <w.f@huawei.com>
Signed-off-by: Xinwei Kong <kong.kongxinwei@hisilicon.com>
Reviewed-by: Haojian Zhuang <haojian.zhuang@linaro.org>
---
 drivers/regulator/Kconfig            |   8 ++
 drivers/regulator/Makefile           |   1 +
 drivers/regulator/hi655x-regulator.c | 227 +++++++++++++++++++++++++++++++++++
 3 files changed, 236 insertions(+)
 create mode 100644 drivers/regulator/hi655x-regulator.c

diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 8155e80..cd8ce7e 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -261,6 +261,14 @@ config REGULATOR_HI6421
 	  21 general purpose LDOs, 3 dedicated LDOs, and 5 BUCKs. All
 	  of them come with support to either ECO (idle) or sleep mode.
 
+config REGULATOR_HI655X
+	tristate "Hisilicon HI655X PMIC regulators support"
+	depends on ARCH_HISI || COMPILE_TEST
+	depends on MFD_HI655X_PMIC && OF
+	help
+	  This driver provides support for the voltage regulators of the
+	  Hisilicon Hi655x PMIC device.
+
 config REGULATOR_ISL9305
 	tristate "Intersil ISL9305 regulator"
 	depends on I2C
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index 980b194..422786c 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -34,6 +34,7 @@ obj-$(CONFIG_REGULATOR_DB8500_PRCMU) += db8500-prcmu.o
 obj-$(CONFIG_REGULATOR_FAN53555) += fan53555.o
 obj-$(CONFIG_REGULATOR_GPIO) += gpio-regulator.o
 obj-$(CONFIG_REGULATOR_HI6421) += hi6421-regulator.o
+obj-$(CONFIG_REGULATOR_HI655X) += hi655x-regulator.o
 obj-$(CONFIG_REGULATOR_ISL6271A) += isl6271a-regulator.o
 obj-$(CONFIG_REGULATOR_ISL9305) += isl9305.o
 obj-$(CONFIG_REGULATOR_LM363X) += lm363x-regulator.o
diff --git a/drivers/regulator/hi655x-regulator.c b/drivers/regulator/hi655x-regulator.c
new file mode 100644
index 0000000..aca1846
--- /dev/null
+++ b/drivers/regulator/hi655x-regulator.c
@@ -0,0 +1,227 @@
+/*
+ * Device driver for regulators in Hi655x IC
+ *
+ * Copyright (c) 2016 Hisilicon.
+ *
+ * Authors:
+ * Chen Feng <puck.chen@hisilicon.com>
+ * Fei  Wang <w.f@huawei.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/bitops.h>
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/module.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+#include <linux/regulator/driver.h>
+#include <linux/regulator/machine.h>
+#include <linux/regulator/of_regulator.h>
+#include <linux/mfd/hi655x-pmic.h>
+
+struct hi655x_regulator {
+	unsigned int disable_reg;
+	unsigned int status_reg;
+	unsigned int ctrl_regs;
+	unsigned int ctrl_mask;
+	struct regulator_desc rdesc;
+};
+
+/* LDO7 & LDO10 */
+static const unsigned int ldo7_voltages[] = {
+	1800000, 1850000, 2850000, 2900000,
+	3000000, 3100000, 3200000, 3300000,
+};
+
+static const unsigned int ldo19_voltages[] = {
+	1800000, 1850000, 1900000, 1750000,
+	2800000, 2850000, 2900000, 3000000,
+};
+
+static const unsigned int ldo22_voltages[] = {
+	 900000, 1000000, 1050000, 1100000,
+	1150000, 1175000, 1185000, 1200000,
+};
+
+enum hi655x_regulator_id {
+	HI655X_LDO0,
+	HI655X_LDO1,
+	HI655X_LDO2,
+	HI655X_LDO3,
+	HI655X_LDO4,
+	HI655X_LDO5,
+	HI655X_LDO6,
+	HI655X_LDO7,
+	HI655X_LDO8,
+	HI655X_LDO9,
+	HI655X_LDO10,
+	HI655X_LDO11,
+	HI655X_LDO12,
+	HI655X_LDO13,
+	HI655X_LDO14,
+	HI655X_LDO15,
+	HI655X_LDO16,
+	HI655X_LDO17,
+	HI655X_LDO18,
+	HI655X_LDO19,
+	HI655X_LDO20,
+	HI655X_LDO21,
+	HI655X_LDO22,
+};
+
+static int hi655x_is_enabled(struct regulator_dev *rdev)
+{
+	unsigned int value = 0;
+
+	struct hi655x_regulator *regulator = rdev_get_drvdata(rdev);
+
+	regmap_read(rdev->regmap, regulator->status_reg, &value);
+	return (value & BIT(regulator->ctrl_mask));
+}
+
+static int hi655x_disable(struct regulator_dev *rdev)
+{
+	int ret = 0;
+
+	struct hi655x_regulator *regulator = rdev_get_drvdata(rdev);
+
+	ret = regmap_write(rdev->regmap, regulator->disable_reg,
+			   BIT(regulator->ctrl_mask));
+	return ret;
+}
+
+static struct regulator_ops hi655x_regulator_ops = {
+	.enable = regulator_enable_regmap,
+	.disable = hi655x_disable,
+	.is_enabled = hi655x_is_enabled,
+	.list_voltage = regulator_list_voltage_table,
+	.get_voltage_sel = regulator_get_voltage_sel_regmap,
+	.set_voltage_sel = regulator_set_voltage_sel_regmap,
+};
+
+static struct regulator_ops hi655x_ldo_linear_ops = {
+	.enable = regulator_enable_regmap,
+	.disable = hi655x_disable,
+	.is_enabled = hi655x_is_enabled,
+	.list_voltage = regulator_list_voltage_linear,
+	.get_voltage_sel = regulator_get_voltage_sel_regmap,
+	.set_voltage_sel = regulator_set_voltage_sel_regmap,
+};
+
+#define HI655X_LDO(_ID, vreg, vmask, ereg, dreg,                 \
+		   sreg, cmask, vtable) {                        \
+	.rdesc = {                                               \
+		.name            = #_ID,                         \
+		.of_match        = of_match_ptr(#_ID),           \
+		.ops             = &hi655x_regulator_ops,        \
+		.regulators_node = of_match_ptr("regulators"),   \
+		.type            = REGULATOR_VOLTAGE,            \
+		.id              = HI655X_##_ID,                 \
+		.owner           = THIS_MODULE,                  \
+		.n_voltages      = ARRAY_SIZE(vtable),           \
+		.volt_table      = vtable,                       \
+		.vsel_reg        = HI655X_BUS_ADDR(vreg),        \
+		.vsel_mask       = vmask,                        \
+		.enable_reg      = HI655X_BUS_ADDR(ereg),        \
+		.enable_mask     = BIT(cmask),                   \
+	},                                                       \
+	.disable_reg = HI655X_BUS_ADDR(dreg),                    \
+	.status_reg = HI655X_BUS_ADDR(sreg),                     \
+	.ctrl_mask = cmask,                                      \
+}
+
+#define HI655X_LDO_LINEAR(_ID, vreg, vmask, ereg, dreg,          \
+			  sreg, cmask, minv, nvolt, vstep) {     \
+	.rdesc = {                                               \
+		.name            = #_ID,                         \
+		.of_match        = of_match_ptr(#_ID),           \
+		.ops             = &hi655x_ldo_linear_ops,       \
+		.regulators_node = of_match_ptr("regulators"),   \
+		.type            = REGULATOR_VOLTAGE,            \
+		.id              = HI655X_##_ID,                 \
+		.owner           = THIS_MODULE,                  \
+		.min_uV          = minv,                         \
+		.n_voltages      = nvolt,                        \
+		.uV_step         = vstep,                        \
+		.vsel_reg        = HI655X_BUS_ADDR(vreg),        \
+		.vsel_mask       = vmask,                        \
+		.enable_reg      = HI655X_BUS_ADDR(ereg),        \
+		.enable_mask     = BIT(cmask),                   \
+	},                                                       \
+	.disable_reg = HI655X_BUS_ADDR(dreg),                    \
+	.status_reg = HI655X_BUS_ADDR(sreg),                     \
+	.ctrl_mask = cmask,                                      \
+}
+
+static struct hi655x_regulator regulators[] = {
+	HI655X_LDO_LINEAR(LDO2, 0x72, 0x07, 0x29, 0x2a, 0x2b, 0x01,
+			  2500000, 8, 100000),
+	HI655X_LDO(LDO7, 0x78, 0x07, 0x29, 0x2a, 0x2b, 0x06, ldo7_voltages),
+	HI655X_LDO(LDO10, 0x78, 0x07, 0x29, 0x2a, 0x2b, 0x01, ldo7_voltages),
+	HI655X_LDO_LINEAR(LDO13, 0x7e, 0x07, 0x2c, 0x2d, 0x2e, 0x04,
+			  1600000, 8, 50000),
+	HI655X_LDO_LINEAR(LDO14, 0x7f, 0x07, 0x2c, 0x2d, 0x2e, 0x05,
+			  2500000, 8, 100000),
+	HI655X_LDO_LINEAR(LDO15, 0x80, 0x07, 0x2c, 0x2d, 0x2e, 0x06,
+			  1600000, 8, 50000),
+	HI655X_LDO_LINEAR(LDO17, 0x82, 0x07, 0x2f, 0x30, 0x31, 0x00,
+			  2500000, 8, 100000),
+	HI655X_LDO(LDO19, 0x84, 0x07, 0x2f, 0x30, 0x31, 0x02, ldo19_voltages),
+	HI655X_LDO_LINEAR(LDO21, 0x86, 0x07, 0x2f, 0x30, 0x31, 0x04,
+			  1650000, 8, 50000),
+	HI655X_LDO(LDO22, 0x87, 0x07, 0x2f, 0x30, 0x31, 0x05, ldo22_voltages),
+};
+
+static int hi655x_regulator_probe(struct platform_device *pdev)
+{
+	unsigned int i;
+	struct hi655x_regulator *regulator;
+	struct hi655x_pmic *pmic;
+	struct regulator_config config = { };
+	struct regulator_dev *rdev;
+
+	pmic = dev_get_drvdata(pdev->dev.parent);
+	if (!pmic) {
+		dev_err(&pdev->dev, "no pmic in the regulator parent node\n");
+		return -ENODEV;
+	}
+
+	regulator = devm_kzalloc(&pdev->dev, sizeof(*regulator), GFP_KERNEL);
+	if (!regulator)
+		return -ENOMEM;
+
+	platform_set_drvdata(pdev, regulator);
+
+	config.dev = pdev->dev.parent;
+	config.regmap = pmic->regmap;
+	config.driver_data = regulator;
+	for (i = 0; i < ARRAY_SIZE(regulators); i++) {
+		rdev = devm_regulator_register(&pdev->dev,
+					       &regulators[i].rdesc,
+					       &config);
+		if (IS_ERR(rdev)) {
+			dev_err(&pdev->dev, "failed to register regulator %s\n",
+				regulator->rdesc.name);
+			return PTR_ERR(rdev);
+		}
+	}
+	return 0;
+}
+
+static struct platform_driver hi655x_regulator_driver = {
+	.driver = {
+		.name	= "hi655x-regulator",
+	},
+	.probe	= hi655x_regulator_probe,
+};
+module_platform_driver(hi655x_regulator_driver);
+
+MODULE_AUTHOR("Chen Feng <puck.chen@hisilicon.com>");
+MODULE_DESCRIPTION("Hisilicon Hi655x regulator driver");
+MODULE_LICENSE("GPL v2");
-- 
1.9.1

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

* [PATCH v8 5/5] arm64: dts: hisilicon: Add hi655x pmic dts node
  2016-02-14  6:29 [PATCH v8 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core Chen Feng
                   ` (3 preceding siblings ...)
  2016-02-14  6:29 ` [PATCH v8 4/5] regulator: hi655x: enable regulator for hi655x PMIC Chen Feng
@ 2016-02-14  6:29 ` Chen Feng
  2016-04-11  8:14 ` [PATCH v8 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core Lee Jones
  5 siblings, 0 replies; 17+ messages in thread
From: Chen Feng @ 2016-02-14  6:29 UTC (permalink / raw)
  To: lgirdwood, broonie, linux-kernel, lee.jones, puck.chen, w.f,
	kong.kongxinwei, haojian.zhuang
  Cc: suzhuangluan, dan.zhao

Add the mfd hi655x dts node and regulator support on
hi6220 platform.

Signed-off-by: Chen Feng <puck.chen@hisilicon.com>
Signed-off-by: Fei Wang <w.f@huawei.com>
Signed-off-by: Xinwei Kong <kong.kongxinwei@hisilicon.com>
Reviewed-by: Haojian Zhuang <haojian.zhuang@linaro.org>
---
 arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts | 87 ++++++++++++++++++++++++++
 1 file changed, 87 insertions(+)

diff --git a/arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts b/arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts
index 8185251..775ea36 100644
--- a/arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts
+++ b/arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts
@@ -6,6 +6,7 @@
  */
 
 /dts-v1/;
+#include <dt-bindings/gpio/gpio.h>
 
 /*Reserved 1MB memory for MCU*/
 /memreserve/ 0x05e00000 0x00100000;
@@ -31,6 +32,92 @@
 		device_type = "memory";
 		reg = <0x0 0x0 0x0 0x40000000>;
 	};
+
+	pmic: pmic@f8000000 {
+		compatible = "hisilicon,hi655x-pmic";
+		reg = <0x0 0xf8000000 0x0 0x1000>;
+		interrupt-controller;
+		#interrupt-cells = <2>;
+		pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+		status = "okay";
+
+		regulators {
+			ldo2: LDO2@a21 {
+				regulator-name = "LDO2_2V8";
+				regulator-min-microvolt = <2500000>;
+				regulator-max-microvolt = <3200000>;
+				regulator-enable-ramp-delay = <120>;
+			};
+
+			ldo7: LDO7@a26 {
+				regulator-name = "LDO7_SDIO";
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <3300000>;
+				regulator-enable-ramp-delay = <120>;
+			};
+
+			ldo10: LDO10@a29 {
+				regulator-name = "LDO10_2V85";
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <3000000>;
+				regulator-enable-ramp-delay = <360>;
+			};
+
+			ldo13: LDO13@a32 {
+				regulator-name = "LDO13_1V8";
+				regulator-min-microvolt = <1600000>;
+				regulator-max-microvolt = <1950000>;
+				regulator-enable-ramp-delay = <120>;
+			};
+
+			ldo14: LDO14@a33 {
+				regulator-name = "LDO14_2V8";
+				regulator-min-microvolt = <2500000>;
+				regulator-max-microvolt = <3200000>;
+				regulator-enable-ramp-delay = <120>;
+			};
+
+			ldo15: LDO15@a34 {
+				regulator-name = "LDO15_1V8";
+				regulator-min-microvolt = <1600000>;
+				regulator-max-microvolt = <1950000>;
+				regulator-boot-on;
+				regulator-always-on;
+				regulator-enable-ramp-delay = <120>;
+			};
+
+			ldo17: LDO17@a36 {
+				regulator-name = "LDO17_2V5";
+				regulator-min-microvolt = <2500000>;
+				regulator-max-microvolt = <3200000>;
+				regulator-enable-ramp-delay = <120>;
+			};
+
+			ldo19: LDO19@a38 {
+				regulator-name = "LDO19_3V0";
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <3000000>;
+				regulator-enable-ramp-delay = <360>;
+			};
+
+			ldo21: LDO21@a40 {
+				regulator-name = "LDO21_1V8";
+				regulator-min-microvolt = <1650000>;
+				regulator-max-microvolt = <2000000>;
+				regulator-always-on;
+				regulator-enable-ramp-delay = <120>;
+			};
+
+			ldo22: LDO22@a41 {
+				regulator-name = "LDO22_1V2";
+				regulator-min-microvolt = <900000>;
+				regulator-max-microvolt = <1200000>;
+				regulator-boot-on;
+				regulator-always-on;
+				regulator-enable-ramp-delay = <120>;
+			};
+		};
+	};
 };
 
 &uart2 {
-- 
1.9.1

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

* Re: [PATCH v8 1/5] mfd: hi655x: Add document for mfd hi665x PMIC
  2016-02-14  6:29 ` [PATCH v8 1/5] mfd: hi655x: Add document for mfd hi665x PMIC Chen Feng
@ 2016-02-15  8:32   ` Lee Jones
  2016-02-16  1:21     ` Chen Feng
  2016-04-11 10:40   ` Lee Jones
  1 sibling, 1 reply; 17+ messages in thread
From: Lee Jones @ 2016-02-15  8:32 UTC (permalink / raw)
  To: Chen Feng
  Cc: lgirdwood, broonie, linux-kernel, w.f, kong.kongxinwei,
	haojian.zhuang, suzhuangluan, dan.zhao

On Sun, 14 Feb 2016, Chen Feng wrote:

> DT bindings for hisilicon hi655x MFD PMIC chip.
> 
> Signed-off-by: Chen Feng <puck.chen@hisilicon.com>
> Signed-off-by: Fei Wang <w.f@huawei.com>
> Signed-off-by: Xinwei Kong <kong.kongxinwei@hisilicon.com>
> Reviewed-by: Haojian Zhuang <haojian.zhuang@linaro.org>
> ---
>  .../devicetree/bindings/mfd/hisilicon,hi655x.txt   | 27 ++++++++++++++++++++++
>  1 file changed, 27 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt

For my own reference:
  Acked-by: Lee Jones <lee.jones@linaro.org>

> diff --git a/Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt b/Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt
> new file mode 100644
> index 0000000..0548569
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt
> @@ -0,0 +1,27 @@
> +Hisilicon Hi655x Power Management Integrated Circuit (PMIC)
> +
> +The hardware layout for access PMIC Hi655x from AP SoC Hi6220.
> +Between PMIC Hi655x and Hi6220, the physical signal channel is SSI.
> +We can use memory-mapped I/O to communicate.
> +
> ++----------------+             +-------------+
> +|                |             |             |
> +|    Hi6220      |   SSI bus   |   Hi655x    |
> +|                |-------------|             |
> +|                |(REGMAP_MMIO)|             |
> ++----------------+             +-------------+
> +
> +Required properties:
> +- compatible:           Should be "hisilicon,hi655x-pmic".
> +- reg:                  Base address of PMIC on Hi6220 SoC.
> +- interrupt-controller: Hi655x has internal IRQs (has own IRQ domain).
> +- pmic-gpios:           The GPIO used by PMIC IRQ.
> +
> +Example:
> +	pmic: pmic@f8000000 {
> +		compatible = "hisilicon,hi655x-pmic";
> +		reg = <0x0 0xf8000000 0x0 0x1000>;
> +		interrupt-controller;
> +		#interrupt-cells = <2>;
> +		pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
> +	}

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

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

* Re: [PATCH v8 1/5] mfd: hi655x: Add document for mfd hi665x PMIC
  2016-02-15  8:32   ` Lee Jones
@ 2016-02-16  1:21     ` Chen Feng
  2016-02-27  8:36       ` Wei Xu
  0 siblings, 1 reply; 17+ messages in thread
From: Chen Feng @ 2016-02-16  1:21 UTC (permalink / raw)
  To: Lee Jones, xuwei5
  Cc: lgirdwood, broonie, linux-kernel, w.f, kong.kongxinwei,
	haojian.zhuang, suzhuangluan, dan.zhao

Lee,
Thanks for your review.

On 2016/2/15 16:32, Lee Jones wrote:
> On Sun, 14 Feb 2016, Chen Feng wrote:
> 
>> DT bindings for hisilicon hi655x MFD PMIC chip.
>>
>> Signed-off-by: Chen Feng <puck.chen@hisilicon.com>
>> Signed-off-by: Fei Wang <w.f@huawei.com>
>> Signed-off-by: Xinwei Kong <kong.kongxinwei@hisilicon.com>
>> Reviewed-by: Haojian Zhuang <haojian.zhuang@linaro.org>
>> ---
>>  .../devicetree/bindings/mfd/hisilicon,hi655x.txt   | 27 ++++++++++++++++++++++
>>  1 file changed, 27 insertions(+)
>>  create mode 100644 Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt
> 
> For my own reference:
>   Acked-by: Lee Jones <lee.jones@linaro.org>
> 

Will you merge this into your git-repo?

git git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git

I saw mark already merged the part of regulator into his git tree.




Hi Wei,

Could you help merge the DTS part of these patch sets.

>> diff --git a/Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt b/Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt
>> new file mode 100644
>> index 0000000..0548569
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt
>> @@ -0,0 +1,27 @@
>> +Hisilicon Hi655x Power Management Integrated Circuit (PMIC)
>> +
>> +The hardware layout for access PMIC Hi655x from AP SoC Hi6220.
>> +Between PMIC Hi655x and Hi6220, the physical signal channel is SSI.
>> +We can use memory-mapped I/O to communicate.
>> +
>> ++----------------+             +-------------+
>> +|                |             |             |
>> +|    Hi6220      |   SSI bus   |   Hi655x    |
>> +|                |-------------|             |
>> +|                |(REGMAP_MMIO)|             |
>> ++----------------+             +-------------+
>> +
>> +Required properties:
>> +- compatible:           Should be "hisilicon,hi655x-pmic".
>> +- reg:                  Base address of PMIC on Hi6220 SoC.
>> +- interrupt-controller: Hi655x has internal IRQs (has own IRQ domain).
>> +- pmic-gpios:           The GPIO used by PMIC IRQ.
>> +
>> +Example:
>> +	pmic: pmic@f8000000 {
>> +		compatible = "hisilicon,hi655x-pmic";
>> +		reg = <0x0 0xf8000000 0x0 0x1000>;
>> +		interrupt-controller;
>> +		#interrupt-cells = <2>;
>> +		pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
>> +	}
> 

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

* Re: [PATCH v8 1/5] mfd: hi655x: Add document for mfd hi665x PMIC
  2016-02-16  1:21     ` Chen Feng
@ 2016-02-27  8:36       ` Wei Xu
  0 siblings, 0 replies; 17+ messages in thread
From: Wei Xu @ 2016-02-27  8:36 UTC (permalink / raw)
  To: Chen Feng, Lee Jones
  Cc: lgirdwood, broonie, linux-kernel, w.f, kong.kongxinwei,
	haojian.zhuang, suzhuangluan, dan.zhao

Hi Leo,

On 16/02/2016 09:21, Chen Feng wrote:
> Lee,
> Thanks for your review.
> 
> On 2016/2/15 16:32, Lee Jones wrote:
>> On Sun, 14 Feb 2016, Chen Feng wrote:
>>
>>> DT bindings for hisilicon hi655x MFD PMIC chip.
>>>
>>> Signed-off-by: Chen Feng <puck.chen@hisilicon.com>
>>> Signed-off-by: Fei Wang <w.f@huawei.com>
>>> Signed-off-by: Xinwei Kong <kong.kongxinwei@hisilicon.com>
>>> Reviewed-by: Haojian Zhuang <haojian.zhuang@linaro.org>
>>> ---
>>>  .../devicetree/bindings/mfd/hisilicon,hi655x.txt   | 27 ++++++++++++++++++++++
>>>  1 file changed, 27 insertions(+)
>>>  create mode 100644 Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt
>>
>> For my own reference:
>>   Acked-by: Lee Jones <lee.jones@linaro.org>
>>
> 
> Will you merge this into your git-repo?
> 
> git git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git
> 
> I saw mark already merged the part of regulator into his git tree.
> 
> 
> 
> 
> Hi Wei,
> 
> Could you help merge the DTS part of these patch sets.

Applied the 5th patch into the hisilicon soc tree.
Thanks!

Best Regards,
Wei

> 
>>> diff --git a/Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt b/Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt
>>> new file mode 100644
>>> index 0000000..0548569
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt
>>> @@ -0,0 +1,27 @@
>>> +Hisilicon Hi655x Power Management Integrated Circuit (PMIC)
>>> +
>>> +The hardware layout for access PMIC Hi655x from AP SoC Hi6220.
>>> +Between PMIC Hi655x and Hi6220, the physical signal channel is SSI.
>>> +We can use memory-mapped I/O to communicate.
>>> +
>>> ++----------------+             +-------------+
>>> +|                |             |             |
>>> +|    Hi6220      |   SSI bus   |   Hi655x    |
>>> +|                |-------------|             |
>>> +|                |(REGMAP_MMIO)|             |
>>> ++----------------+             +-------------+
>>> +
>>> +Required properties:
>>> +- compatible:           Should be "hisilicon,hi655x-pmic".
>>> +- reg:                  Base address of PMIC on Hi6220 SoC.
>>> +- interrupt-controller: Hi655x has internal IRQs (has own IRQ domain).
>>> +- pmic-gpios:           The GPIO used by PMIC IRQ.
>>> +
>>> +Example:
>>> +	pmic: pmic@f8000000 {
>>> +		compatible = "hisilicon,hi655x-pmic";
>>> +		reg = <0x0 0xf8000000 0x0 0x1000>;
>>> +		interrupt-controller;
>>> +		#interrupt-cells = <2>;
>>> +		pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
>>> +	}
>>
> 
> 
> .
> 

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

* Re: [PATCH v8 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core
  2016-02-14  6:29 [PATCH v8 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core Chen Feng
                   ` (4 preceding siblings ...)
  2016-02-14  6:29 ` [PATCH v8 5/5] arm64: dts: hisilicon: Add hi655x pmic dts node Chen Feng
@ 2016-04-11  8:14 ` Lee Jones
  2016-04-11  8:41   ` Chen Feng
  5 siblings, 1 reply; 17+ messages in thread
From: Lee Jones @ 2016-04-11  8:14 UTC (permalink / raw)
  To: Chen Feng
  Cc: lgirdwood, broonie, linux-kernel, w.f, kong.kongxinwei,
	haojian.zhuang, suzhuangluan, dan.zhao

On Sun, 14 Feb 2016, Chen Feng wrote:

> The patch sets add support for Hi6220 PMIC Hi655x MFD core and its
> regulator driver.
> Current testing and support board is Hikey which is one of 96boards.
> It is an arm64 open source board. For more information about this board,
> please access https://www.96boards.org.
> 
> This is hardware layout for access PMIC Hi655x from AP SoC Hi6220.
> Between PMIC Hi655x and Hi6220, the physical signal channel is SSI.
> We can use memory-mapped I/O to communicate.
> 
> +----------------+             +-------------+
> |                |             |             |
> |    Hi6220      |   SSI bus   |   Hi655x    |
> |                |-------------|             |
> |                |(REGMAP_MMIO)|             |
> +----------------+             +-------------+
> 
> V2: Code refactoring of regulator.
> 
> V3: Drop mtcmos from this patch and use regmap-irq.
> 
> V4: Move the vset-table to driver code and donot open code for it.
> 
> V5: Use regulators_node and of_match, donot open code fot it.
> 
> V7: Change the constraints into hikey.dts and fix code in PMIC.
> 
> V8: Change format in document, and fix bit mask in regulator.
> 
> Chen Feng (5):
>   mfd: hi655x: Add document for mfd hi665x PMIC
>   regulator: hi655x: Document for hi655x regulator
>   mfd: hi655x: Add MFD driver for hi655x
>   regulator: hi655x: enable regulator for hi655x PMIC
>   arm64: dts: hisilicon: Add hi655x pmic dts node

So what's going on with this set?  Can the MFD patches go in via my
tree on their own?  Or are there dependencies between them and the
Regulator changes?  If the latter, then we need Mark's Ack to
proceed.

>  .../devicetree/bindings/mfd/hisilicon,hi655x.txt   |  27 +++
>  .../regulator/hisilicon,hi655x-regulator.txt       |  29 +++
>  arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts     |  87 ++++++++
>  drivers/mfd/Kconfig                                |  10 +
>  drivers/mfd/Makefile                               |   1 +
>  drivers/mfd/hi655x-pmic.c                          | 162 +++++++++++++++
>  drivers/regulator/Kconfig                          |   8 +
>  drivers/regulator/Makefile                         |   1 +
>  drivers/regulator/hi655x-regulator.c               | 227 +++++++++++++++++++++
>  include/linux/mfd/hi655x-pmic.h                    |  55 +++++
>  10 files changed, 607 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt
>  create mode 100644 Documentation/devicetree/bindings/regulator/hisilicon,hi655x-regulator.txt
>  create mode 100644 drivers/mfd/hi655x-pmic.c
>  create mode 100644 drivers/regulator/hi655x-regulator.c
>  create mode 100644 include/linux/mfd/hi655x-pmic.h
> 

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

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

* Re: [PATCH v8 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core
  2016-04-11  8:14 ` [PATCH v8 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core Lee Jones
@ 2016-04-11  8:41   ` Chen Feng
  0 siblings, 0 replies; 17+ messages in thread
From: Chen Feng @ 2016-04-11  8:41 UTC (permalink / raw)
  To: Lee Jones
  Cc: lgirdwood, broonie, linux-kernel, w.f, kong.kongxinwei,
	haojian.zhuang, suzhuangluan, dan.zhao

Hi lee,

Mark already took the regulator set.

Please help take the mfd part.
mfd: hi655x: Add document for mfd hi665x PMIC
and
mfd: hi655x: Add MFD driver for hi655x

thanks a lot.

On 2016/4/11 16:14, Lee Jones wrote:
> On Sun, 14 Feb 2016, Chen Feng wrote:
> 
>> The patch sets add support for Hi6220 PMIC Hi655x MFD core and its
>> regulator driver.
>> Current testing and support board is Hikey which is one of 96boards.
>> It is an arm64 open source board. For more information about this board,
>> please access https://www.96boards.org.
>>
>> This is hardware layout for access PMIC Hi655x from AP SoC Hi6220.
>> Between PMIC Hi655x and Hi6220, the physical signal channel is SSI.
>> We can use memory-mapped I/O to communicate.
>>
>> +----------------+             +-------------+
>> |                |             |             |
>> |    Hi6220      |   SSI bus   |   Hi655x    |
>> |                |-------------|             |
>> |                |(REGMAP_MMIO)|             |
>> +----------------+             +-------------+
>>
>> V2: Code refactoring of regulator.
>>
>> V3: Drop mtcmos from this patch and use regmap-irq.
>>
>> V4: Move the vset-table to driver code and donot open code for it.
>>
>> V5: Use regulators_node and of_match, donot open code fot it.
>>
>> V7: Change the constraints into hikey.dts and fix code in PMIC.
>>
>> V8: Change format in document, and fix bit mask in regulator.
>>
>> Chen Feng (5):
>>   mfd: hi655x: Add document for mfd hi665x PMIC
>>   regulator: hi655x: Document for hi655x regulator
>>   mfd: hi655x: Add MFD driver for hi655x
>>   regulator: hi655x: enable regulator for hi655x PMIC
>>   arm64: dts: hisilicon: Add hi655x pmic dts node
> 
> So what's going on with this set?  Can the MFD patches go in via my
> tree on their own?  Or are there dependencies between them and the
> Regulator changes?  If the latter, then we need Mark's Ack to
> proceed.
> 
>>  .../devicetree/bindings/mfd/hisilicon,hi655x.txt   |  27 +++
>>  .../regulator/hisilicon,hi655x-regulator.txt       |  29 +++
>>  arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts     |  87 ++++++++
>>  drivers/mfd/Kconfig                                |  10 +
>>  drivers/mfd/Makefile                               |   1 +
>>  drivers/mfd/hi655x-pmic.c                          | 162 +++++++++++++++
>>  drivers/regulator/Kconfig                          |   8 +
>>  drivers/regulator/Makefile                         |   1 +
>>  drivers/regulator/hi655x-regulator.c               | 227 +++++++++++++++++++++
>>  include/linux/mfd/hi655x-pmic.h                    |  55 +++++
>>  10 files changed, 607 insertions(+)
>>  create mode 100644 Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt
>>  create mode 100644 Documentation/devicetree/bindings/regulator/hisilicon,hi655x-regulator.txt
>>  create mode 100644 drivers/mfd/hi655x-pmic.c
>>  create mode 100644 drivers/regulator/hi655x-regulator.c
>>  create mode 100644 include/linux/mfd/hi655x-pmic.h
>>
> 

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

* Re: [PATCH v8 1/5] mfd: hi655x: Add document for mfd hi665x PMIC
  2016-02-14  6:29 ` [PATCH v8 1/5] mfd: hi655x: Add document for mfd hi665x PMIC Chen Feng
  2016-02-15  8:32   ` Lee Jones
@ 2016-04-11 10:40   ` Lee Jones
  1 sibling, 0 replies; 17+ messages in thread
From: Lee Jones @ 2016-04-11 10:40 UTC (permalink / raw)
  To: Chen Feng
  Cc: lgirdwood, broonie, linux-kernel, w.f, kong.kongxinwei,
	haojian.zhuang, suzhuangluan, dan.zhao

On Sun, 14 Feb 2016, Chen Feng wrote:

> DT bindings for hisilicon hi655x MFD PMIC chip.
> 
> Signed-off-by: Chen Feng <puck.chen@hisilicon.com>
> Signed-off-by: Fei Wang <w.f@huawei.com>
> Signed-off-by: Xinwei Kong <kong.kongxinwei@hisilicon.com>
> Reviewed-by: Haojian Zhuang <haojian.zhuang@linaro.org>
> ---
>  .../devicetree/bindings/mfd/hisilicon,hi655x.txt   | 27 ++++++++++++++++++++++
>  1 file changed, 27 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt

Applied, thanks.

> diff --git a/Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt b/Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt
> new file mode 100644
> index 0000000..0548569
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt
> @@ -0,0 +1,27 @@
> +Hisilicon Hi655x Power Management Integrated Circuit (PMIC)
> +
> +The hardware layout for access PMIC Hi655x from AP SoC Hi6220.
> +Between PMIC Hi655x and Hi6220, the physical signal channel is SSI.
> +We can use memory-mapped I/O to communicate.
> +
> ++----------------+             +-------------+
> +|                |             |             |
> +|    Hi6220      |   SSI bus   |   Hi655x    |
> +|                |-------------|             |
> +|                |(REGMAP_MMIO)|             |
> ++----------------+             +-------------+
> +
> +Required properties:
> +- compatible:           Should be "hisilicon,hi655x-pmic".
> +- reg:                  Base address of PMIC on Hi6220 SoC.
> +- interrupt-controller: Hi655x has internal IRQs (has own IRQ domain).
> +- pmic-gpios:           The GPIO used by PMIC IRQ.
> +
> +Example:
> +	pmic: pmic@f8000000 {
> +		compatible = "hisilicon,hi655x-pmic";
> +		reg = <0x0 0xf8000000 0x0 0x1000>;
> +		interrupt-controller;
> +		#interrupt-cells = <2>;
> +		pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
> +	}

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

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

* Re: [PATCH v8 3/5] mfd: hi655x: Add MFD driver for hi655x
  2016-02-14  6:29 ` [PATCH v8 3/5] mfd: hi655x: Add MFD driver for hi655x Chen Feng
@ 2016-04-11 10:41   ` Lee Jones
       [not found]     ` <570D982C.6090307@hisilicon.com>
  0 siblings, 1 reply; 17+ messages in thread
From: Lee Jones @ 2016-04-11 10:41 UTC (permalink / raw)
  To: Chen Feng
  Cc: lgirdwood, broonie, linux-kernel, w.f, kong.kongxinwei,
	haojian.zhuang, suzhuangluan, dan.zhao

On Sun, 14 Feb 2016, Chen Feng wrote:

> Add PMIC MFD driver to support hisilicon hi665x.
> 
> Signed-off-by: Chen Feng <puck.chen@hisilicon.com>
> Signed-off-by: Fei Wang <w.f@huawei.com>
> Signed-off-by: Xinwei Kong <kong.kongxinwei@hisilicon.com>
> Reviewed-by: Haojian Zhuang <haojian.zhuang@linaro.org>
> Acked-by: Lee Jones <lee.jones@linaro.org>
> ---
>  drivers/mfd/Kconfig             |  10 +++
>  drivers/mfd/Makefile            |   1 +
>  drivers/mfd/hi655x-pmic.c       | 162 ++++++++++++++++++++++++++++++++++++++++
>  include/linux/mfd/hi655x-pmic.h |  55 ++++++++++++++
>  4 files changed, 228 insertions(+)
>  create mode 100644 drivers/mfd/hi655x-pmic.c
>  create mode 100644 include/linux/mfd/hi655x-pmic.h

Applied, thanks.

> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> index 9ca66de..5b1c091 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -284,6 +284,16 @@ config MFD_HI6421_PMIC
>  	  menus in order to enable them.
>  	  We communicate with the Hi6421 via memory-mapped I/O.
>  
> +config MFD_HI655X_PMIC
> +	tristate "HiSilicon Hi655X series PMU/Codec IC"
> +	depends on ARCH_HISI || COMPILE_TEST
> +	depends on OF
> +	select MFD_CORE
> +	select REGMAP_MMIO
> +	select REGMAP_IRQ
> +	help
> +	  Select this option to enable Hisilicon hi655x series pmic driver.
> +
>  config HTC_EGPIO
>  	bool "HTC EGPIO support"
>  	depends on GPIOLIB && ARM
> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> index 0f230a6..1e166c1 100644
> --- a/drivers/mfd/Makefile
> +++ b/drivers/mfd/Makefile
> @@ -190,6 +190,7 @@ obj-$(CONFIG_MFD_STW481X)	+= stw481x.o
>  obj-$(CONFIG_MFD_IPAQ_MICRO)	+= ipaq-micro.o
>  obj-$(CONFIG_MFD_MENF21BMC)	+= menf21bmc.o
>  obj-$(CONFIG_MFD_HI6421_PMIC)	+= hi6421-pmic-core.o
> +obj-$(CONFIG_MFD_HI655X_PMIC)   += hi655x-pmic.o
>  obj-$(CONFIG_MFD_DLN2)		+= dln2.o
>  obj-$(CONFIG_MFD_RT5033)	+= rt5033.o
>  obj-$(CONFIG_MFD_SKY81452)	+= sky81452.o
> diff --git a/drivers/mfd/hi655x-pmic.c b/drivers/mfd/hi655x-pmic.c
> new file mode 100644
> index 0000000..05ddc78
> --- /dev/null
> +++ b/drivers/mfd/hi655x-pmic.c
> @@ -0,0 +1,162 @@
> +/*
> + * Device driver for MFD hi655x PMIC
> + *
> + * Copyright (c) 2016 Hisilicon.
> + *
> + * Authors:
> + * Chen Feng <puck.chen@hisilicon.com>
> + * Fei  Wang <w.f@huawei.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +
> +#include <linux/gpio.h>
> +#include <linux/io.h>
> +#include <linux/interrupt.h>
> +#include <linux/init.h>
> +#include <linux/mfd/core.h>
> +#include <linux/mfd/hi655x-pmic.h>
> +#include <linux/module.h>
> +#include <linux/of_gpio.h>
> +#include <linux/of_platform.h>
> +#include <linux/platform_device.h>
> +#include <linux/regmap.h>
> +
> +static const struct mfd_cell hi655x_pmic_devs[] = {
> +	{ .name = "hi655x-regulator", },
> +};
> +
> +static const struct regmap_irq hi655x_irqs[] = {
> +	{ .reg_offset = 0, .mask = OTMP_D1R_INT },
> +	{ .reg_offset = 0, .mask = VSYS_2P5_R_INT },
> +	{ .reg_offset = 0, .mask = VSYS_UV_D3R_INT },
> +	{ .reg_offset = 0, .mask = VSYS_6P0_D200UR_INT },
> +	{ .reg_offset = 0, .mask = PWRON_D4SR_INT },
> +	{ .reg_offset = 0, .mask = PWRON_D20F_INT },
> +	{ .reg_offset = 0, .mask = PWRON_D20R_INT },
> +	{ .reg_offset = 0, .mask = RESERVE_INT },
> +};
> +
> +static const struct regmap_irq_chip hi655x_irq_chip = {
> +	.name = "hi655x-pmic",
> +	.irqs = hi655x_irqs,
> +	.num_regs = 1,
> +	.num_irqs = ARRAY_SIZE(hi655x_irqs),
> +	.status_base = HI655X_IRQ_STAT_BASE,
> +	.mask_base = HI655X_IRQ_MASK_BASE,
> +};
> +
> +static struct regmap_config hi655x_regmap_config = {
> +	.reg_bits = 32,
> +	.reg_stride = HI655X_STRIDE,
> +	.val_bits = 8,
> +	.max_register = HI655X_BUS_ADDR(0xFFF),
> +};
> +
> +static void hi655x_local_irq_clear(struct regmap *map)
> +{
> +	int i;
> +
> +	regmap_write(map, HI655X_ANA_IRQM_BASE, HI655X_IRQ_CLR);
> +	for (i = 0; i < HI655X_IRQ_ARRAY; i++) {
> +		regmap_write(map, HI655X_IRQ_STAT_BASE + i * HI655X_STRIDE,
> +			     HI655X_IRQ_CLR);
> +	}
> +}
> +
> +static int hi655x_pmic_probe(struct platform_device *pdev)
> +{
> +	int ret;
> +	struct hi655x_pmic *pmic;
> +	struct device *dev = &pdev->dev;
> +	struct device_node *np = dev->of_node;
> +	void __iomem *base;
> +
> +	pmic = devm_kzalloc(dev, sizeof(*pmic), GFP_KERNEL);
> +	if (!pmic)
> +		return -ENOMEM;
> +	pmic->dev = dev;
> +
> +	pmic->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	if (!pmic->res)
> +		return -ENOENT;
> +
> +	base = devm_ioremap_resource(dev, pmic->res);
> +	if (!base)
> +		return -ENOMEM;
> +
> +	pmic->regmap = devm_regmap_init_mmio_clk(dev, NULL, base,
> +						 &hi655x_regmap_config);
> +
> +	regmap_read(pmic->regmap, HI655X_BUS_ADDR(HI655X_VER_REG), &pmic->ver);
> +	if ((pmic->ver < PMU_VER_START) || (pmic->ver > PMU_VER_END)) {
> +		dev_warn(dev, "PMU version %d unsupported\n", pmic->ver);
> +		return -EINVAL;
> +	}
> +
> +	hi655x_local_irq_clear(pmic->regmap);
> +
> +	pmic->gpio = of_get_named_gpio(np, "pmic-gpios", 0);
> +	if (!gpio_is_valid(pmic->gpio)) {
> +		dev_err(dev, "Failed to get the pmic-gpios\n");
> +		return -ENODEV;
> +	}
> +
> +	ret = devm_gpio_request_one(dev, pmic->gpio, GPIOF_IN,
> +				    "hi655x_pmic_irq");
> +	if (ret < 0) {
> +		dev_err(dev, "Failed to request gpio %d  ret = %d\n",
> +			pmic->gpio, ret);
> +		return ret;
> +	}
> +
> +	ret = regmap_add_irq_chip(pmic->regmap, gpio_to_irq(pmic->gpio),
> +				  IRQF_TRIGGER_LOW | IRQF_NO_SUSPEND, 0,
> +				  &hi655x_irq_chip, &pmic->irq_data);
> +	if (ret) {
> +		dev_err(dev, "Failed to obtain 'hi655x_pmic_irq' %d\n", ret);
> +		return ret;
> +	}
> +
> +	platform_set_drvdata(pdev, pmic);
> +
> +	ret = mfd_add_devices(dev, PLATFORM_DEVID_AUTO, hi655x_pmic_devs,
> +			      ARRAY_SIZE(hi655x_pmic_devs), NULL, 0, NULL);
> +	if (ret) {
> +		dev_err(dev, "Failed to register device %d\n", ret);
> +		regmap_del_irq_chip(gpio_to_irq(pmic->gpio), pmic->irq_data);
> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
> +static int hi655x_pmic_remove(struct platform_device *pdev)
> +{
> +	struct hi655x_pmic *pmic = platform_get_drvdata(pdev);
> +
> +	regmap_del_irq_chip(gpio_to_irq(pmic->gpio), pmic->irq_data);
> +	mfd_remove_devices(&pdev->dev);
> +	return 0;
> +}
> +
> +static const struct of_device_id hi655x_pmic_match[] = {
> +	{ .compatible = "hisilicon,hi655x-pmic", },
> +	{},
> +};
> +
> +static struct platform_driver hi655x_pmic_driver = {
> +	.driver	= {
> +		.name =	"hi655x-pmic",
> +		.of_match_table = of_match_ptr(hi655x_pmic_match),
> +	},
> +	.probe  = hi655x_pmic_probe,
> +	.remove = hi655x_pmic_remove,
> +};
> +module_platform_driver(hi655x_pmic_driver);
> +
> +MODULE_AUTHOR("Chen Feng <puck.chen@hisilicon.com>");
> +MODULE_DESCRIPTION("Hisilicon hi655x PMIC driver");
> +MODULE_LICENSE("GPL v2");
> diff --git a/include/linux/mfd/hi655x-pmic.h b/include/linux/mfd/hi655x-pmic.h
> new file mode 100644
> index 0000000..dbbe9a6
> --- /dev/null
> +++ b/include/linux/mfd/hi655x-pmic.h
> @@ -0,0 +1,55 @@
> +/*
> + * Device driver for regulators in hi655x IC
> + *
> + * Copyright (c) 2016 Hisilicon.
> + *
> + * Authors:
> + * Chen Feng <puck.chen@hisilicon.com>
> + * Fei  Wang <w.f@huawei.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +
> +#ifndef __HI655X_PMIC_H
> +#define __HI655X_PMIC_H
> +
> +/* Hi655x registers are mapped to memory bus in 4 bytes stride */
> +#define HI655X_STRIDE                   4
> +#define HI655X_BUS_ADDR(x)              ((x) << 2)
> +
> +#define HI655X_BITS                     8
> +
> +#define HI655X_NR_IRQ                   32
> +
> +#define HI655X_IRQ_STAT_BASE            (0x003 << 2)
> +#define HI655X_IRQ_MASK_BASE            (0x007 << 2)
> +#define HI655X_ANA_IRQM_BASE            (0x1b5 << 2)
> +#define HI655X_IRQ_ARRAY                4
> +#define HI655X_IRQ_MASK                 0xFF
> +#define HI655X_IRQ_CLR                  0xFF
> +#define HI655X_VER_REG                  0x00
> +
> +#define PMU_VER_START                   0x10
> +#define PMU_VER_END                     0x38
> +
> +#define RESERVE_INT                     BIT(7)
> +#define PWRON_D20R_INT                  BIT(6)
> +#define PWRON_D20F_INT                  BIT(5)
> +#define PWRON_D4SR_INT                  BIT(4)
> +#define VSYS_6P0_D200UR_INT             BIT(3)
> +#define VSYS_UV_D3R_INT                 BIT(2)
> +#define VSYS_2P5_R_INT                  BIT(1)
> +#define OTMP_D1R_INT                    BIT(0)
> +
> +struct hi655x_pmic {
> +	struct resource *res;
> +	struct device *dev;
> +	struct regmap *regmap;
> +	int gpio;
> +	unsigned int ver;
> +	struct regmap_irq_chip_data *irq_data;
> +};
> +
> +#endif

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

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

* Re: Re: [PATCH v8 3/5] mfd: hi655x: Add MFD driver for hi655x
       [not found]     ` <570D982C.6090307@hisilicon.com>
@ 2016-04-19  3:25       ` Guodong Xu
  2016-04-19  6:53         ` Lee Jones
  0 siblings, 1 reply; 17+ messages in thread
From: Guodong Xu @ 2016-04-19  3:25 UTC (permalink / raw)
  To: Mark Brown, Lee Jones
  Cc: Liam Girdwood, linux-kernel, Wang Fei, XinWei Kong,
	Haojian Zhuang, Zhuangluan Su, Chen Feng, Dan Zhao

On 13 April 2016 at 08:51, Chen Feng <puck.chen@hisilicon.com> wrote:
>
>
>
> -------- Forwarded Message --------
> Subject: Re: [PATCH v8 3/5] mfd: hi655x: Add MFD driver for hi655x
> Date: Mon, 11 Apr 2016 11:41:06 +0100
> From: Lee Jones <lee.jones@linaro.org>
> To: Chen Feng <puck.chen@hisilicon.com>
> CC: lgirdwood@gmail.com, broonie@kernel.org, linux-kernel@vger.kernel.org, w.f@huawei.com, kong.kongxinwei@hisilicon.com, haojian.zhuang@linaro.org, suzhuangluan@hisilicon.com, dan.zhao@hisilicon.com
>
> On Sun, 14 Feb 2016, Chen Feng wrote:
>
> > Add PMIC MFD driver to support hisilicon hi665x.
> >
> > Signed-off-by: Chen Feng <puck.chen@hisilicon.com>
> > Signed-off-by: Fei Wang <w.f@huawei.com>
> > Signed-off-by: Xinwei Kong <kong.kongxinwei@hisilicon.com>
> > Reviewed-by: Haojian Zhuang <haojian.zhuang@linaro.org>
> > Acked-by: Lee Jones <lee.jones@linaro.org>
> > ---
> >  drivers/mfd/Kconfig             |  10 +++
> >  drivers/mfd/Makefile            |   1 +
> >  drivers/mfd/hi655x-pmic.c       | 162 ++++++++++++++++++++++++++++++++++++++++
> >  include/linux/mfd/hi655x-pmic.h |  55 ++++++++++++++
> >  4 files changed, 228 insertions(+)
> >  create mode 100644 drivers/mfd/hi655x-pmic.c
> >  create mode 100644 include/linux/mfd/hi655x-pmic.h
>
> Applied, thanks.

Hi, Lee, Mark

I still didn't see this patch in linux-next (next-20160418) since your
replied "Applied". Are you expecting anything else? Dependencies?

I didn't see any unsolved review comments actually. But if there is,
please let us know, so I can send an updated version.

-Guodong

>
> > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > index 9ca66de..5b1c091 100644
> > --- a/drivers/mfd/Kconfig
> > +++ b/drivers/mfd/Kconfig
> > @@ -284,6 +284,16 @@ config MFD_HI6421_PMIC
> >         menus in order to enable them.
> >         We communicate with the Hi6421 via memory-mapped I/O.
> >
> > +config MFD_HI655X_PMIC
> > +     tristate "HiSilicon Hi655X series PMU/Codec IC"
> > +     depends on ARCH_HISI || COMPILE_TEST
> > +     depends on OF
> > +     select MFD_CORE
> > +     select REGMAP_MMIO
> > +     select REGMAP_IRQ
> > +     help
> > +       Select this option to enable Hisilicon hi655x series pmic driver.
> > +
> >  config HTC_EGPIO
> >       bool "HTC EGPIO support"
> >       depends on GPIOLIB && ARM
> > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> > index 0f230a6..1e166c1 100644
> > --- a/drivers/mfd/Makefile
> > +++ b/drivers/mfd/Makefile
> > @@ -190,6 +190,7 @@ obj-$(CONFIG_MFD_STW481X) += stw481x.o
> >  obj-$(CONFIG_MFD_IPAQ_MICRO) += ipaq-micro.o
> >  obj-$(CONFIG_MFD_MENF21BMC)  += menf21bmc.o
> >  obj-$(CONFIG_MFD_HI6421_PMIC)        += hi6421-pmic-core.o
> > +obj-$(CONFIG_MFD_HI655X_PMIC)   += hi655x-pmic.o
> >  obj-$(CONFIG_MFD_DLN2)               += dln2.o
> >  obj-$(CONFIG_MFD_RT5033)     += rt5033.o
> >  obj-$(CONFIG_MFD_SKY81452)   += sky81452.o
> > diff --git a/drivers/mfd/hi655x-pmic.c b/drivers/mfd/hi655x-pmic.c
> > new file mode 100644
> > index 0000000..05ddc78
> > --- /dev/null
> > +++ b/drivers/mfd/hi655x-pmic.c
> > @@ -0,0 +1,162 @@
> > +/*
> > + * Device driver for MFD hi655x PMIC
> > + *
> > + * Copyright (c) 2016 Hisilicon.
> > + *
> > + * Authors:
> > + * Chen Feng <puck.chen@hisilicon.com>
> > + * Fei  Wang <w.f@huawei.com>
> > + *
> > + * This program is free software; you can redistribute it and/or modify
> > + * it under the terms of the GNU General Public License version 2 as
> > + * published by the Free Software Foundation.
> > + */
> > +
> > +#include <linux/gpio.h>
> > +#include <linux/io.h>
> > +#include <linux/interrupt.h>
> > +#include <linux/init.h>
> > +#include <linux/mfd/core.h>
> > +#include <linux/mfd/hi655x-pmic.h>
> > +#include <linux/module.h>
> > +#include <linux/of_gpio.h>
> > +#include <linux/of_platform.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/regmap.h>
> > +
> > +static const struct mfd_cell hi655x_pmic_devs[] = {
> > +     { .name = "hi655x-regulator", },
> > +};
> > +
> > +static const struct regmap_irq hi655x_irqs[] = {
> > +     { .reg_offset = 0, .mask = OTMP_D1R_INT },
> > +     { .reg_offset = 0, .mask = VSYS_2P5_R_INT },
> > +     { .reg_offset = 0, .mask = VSYS_UV_D3R_INT },
> > +     { .reg_offset = 0, .mask = VSYS_6P0_D200UR_INT },
> > +     { .reg_offset = 0, .mask = PWRON_D4SR_INT },
> > +     { .reg_offset = 0, .mask = PWRON_D20F_INT },
> > +     { .reg_offset = 0, .mask = PWRON_D20R_INT },
> > +     { .reg_offset = 0, .mask = RESERVE_INT },
> > +};
> > +
> > +static const struct regmap_irq_chip hi655x_irq_chip = {
> > +     .name = "hi655x-pmic",
> > +     .irqs = hi655x_irqs,
> > +     .num_regs = 1,
> > +     .num_irqs = ARRAY_SIZE(hi655x_irqs),
> > +     .status_base = HI655X_IRQ_STAT_BASE,
> > +     .mask_base = HI655X_IRQ_MASK_BASE,
> > +};
> > +
> > +static struct regmap_config hi655x_regmap_config = {
> > +     .reg_bits = 32,
> > +     .reg_stride = HI655X_STRIDE,
> > +     .val_bits = 8,
> > +     .max_register = HI655X_BUS_ADDR(0xFFF),
> > +};
> > +
> > +static void hi655x_local_irq_clear(struct regmap *map)
> > +{
> > +     int i;
> > +
> > +     regmap_write(map, HI655X_ANA_IRQM_BASE, HI655X_IRQ_CLR);
> > +     for (i = 0; i < HI655X_IRQ_ARRAY; i++) {
> > +             regmap_write(map, HI655X_IRQ_STAT_BASE + i * HI655X_STRIDE,
> > +                          HI655X_IRQ_CLR);
> > +     }
> > +}
> > +
> > +static int hi655x_pmic_probe(struct platform_device *pdev)
> > +{
> > +     int ret;
> > +     struct hi655x_pmic *pmic;
> > +     struct device *dev = &pdev->dev;
> > +     struct device_node *np = dev->of_node;
> > +     void __iomem *base;
> > +
> > +     pmic = devm_kzalloc(dev, sizeof(*pmic), GFP_KERNEL);
> > +     if (!pmic)
> > +             return -ENOMEM;
> > +     pmic->dev = dev;
> > +
> > +     pmic->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > +     if (!pmic->res)
> > +             return -ENOENT;
> > +
> > +     base = devm_ioremap_resource(dev, pmic->res);
> > +     if (!base)
> > +             return -ENOMEM;
> > +
> > +     pmic->regmap = devm_regmap_init_mmio_clk(dev, NULL, base,
> > +                                              &hi655x_regmap_config);
> > +
> > +     regmap_read(pmic->regmap, HI655X_BUS_ADDR(HI655X_VER_REG), &pmic->ver);
> > +     if ((pmic->ver < PMU_VER_START) || (pmic->ver > PMU_VER_END)) {
> > +             dev_warn(dev, "PMU version %d unsupported\n", pmic->ver);
> > +             return -EINVAL;
> > +     }
> > +
> > +     hi655x_local_irq_clear(pmic->regmap);
> > +
> > +     pmic->gpio = of_get_named_gpio(np, "pmic-gpios", 0);
> > +     if (!gpio_is_valid(pmic->gpio)) {
> > +             dev_err(dev, "Failed to get the pmic-gpios\n");
> > +             return -ENODEV;
> > +     }
> > +
> > +     ret = devm_gpio_request_one(dev, pmic->gpio, GPIOF_IN,
> > +                                 "hi655x_pmic_irq");
> > +     if (ret < 0) {
> > +             dev_err(dev, "Failed to request gpio %d  ret = %d\n",
> > +                     pmic->gpio, ret);
> > +             return ret;
> > +     }
> > +
> > +     ret = regmap_add_irq_chip(pmic->regmap, gpio_to_irq(pmic->gpio),
> > +                               IRQF_TRIGGER_LOW | IRQF_NO_SUSPEND, 0,
> > +                               &hi655x_irq_chip, &pmic->irq_data);
> > +     if (ret) {
> > +             dev_err(dev, "Failed to obtain 'hi655x_pmic_irq' %d\n", ret);
> > +             return ret;
> > +     }
> > +
> > +     platform_set_drvdata(pdev, pmic);
> > +
> > +     ret = mfd_add_devices(dev, PLATFORM_DEVID_AUTO, hi655x_pmic_devs,
> > +                           ARRAY_SIZE(hi655x_pmic_devs), NULL, 0, NULL);
> > +     if (ret) {
> > +             dev_err(dev, "Failed to register device %d\n", ret);
> > +             regmap_del_irq_chip(gpio_to_irq(pmic->gpio), pmic->irq_data);
> > +             return ret;
> > +     }
> > +
> > +     return 0;
> > +}
> > +
> > +static int hi655x_pmic_remove(struct platform_device *pdev)
> > +{
> > +     struct hi655x_pmic *pmic = platform_get_drvdata(pdev);
> > +
> > +     regmap_del_irq_chip(gpio_to_irq(pmic->gpio), pmic->irq_data);
> > +     mfd_remove_devices(&pdev->dev);
> > +     return 0;
> > +}
> > +
> > +static const struct of_device_id hi655x_pmic_match[] = {
> > +     { .compatible = "hisilicon,hi655x-pmic", },
> > +     {},
> > +};
> > +
> > +static struct platform_driver hi655x_pmic_driver = {
> > +     .driver = {
> > +             .name = "hi655x-pmic",
> > +             .of_match_table = of_match_ptr(hi655x_pmic_match),
> > +     },
> > +     .probe  = hi655x_pmic_probe,
> > +     .remove = hi655x_pmic_remove,
> > +};
> > +module_platform_driver(hi655x_pmic_driver);
> > +
> > +MODULE_AUTHOR("Chen Feng <puck.chen@hisilicon.com>");
> > +MODULE_DESCRIPTION("Hisilicon hi655x PMIC driver");
> > +MODULE_LICENSE("GPL v2");
> > diff --git a/include/linux/mfd/hi655x-pmic.h b/include/linux/mfd/hi655x-pmic.h
> > new file mode 100644
> > index 0000000..dbbe9a6
> > --- /dev/null
> > +++ b/include/linux/mfd/hi655x-pmic.h
> > @@ -0,0 +1,55 @@
> > +/*
> > + * Device driver for regulators in hi655x IC
> > + *
> > + * Copyright (c) 2016 Hisilicon.
> > + *
> > + * Authors:
> > + * Chen Feng <puck.chen@hisilicon.com>
> > + * Fei  Wang <w.f@huawei.com>
> > + *
> > + * This program is free software; you can redistribute it and/or modify
> > + * it under the terms of the GNU General Public License version 2 as
> > + * published by the Free Software Foundation.
> > + */
> > +
> > +#ifndef __HI655X_PMIC_H
> > +#define __HI655X_PMIC_H
> > +
> > +/* Hi655x registers are mapped to memory bus in 4 bytes stride */
> > +#define HI655X_STRIDE                   4
> > +#define HI655X_BUS_ADDR(x)              ((x) << 2)
> > +
> > +#define HI655X_BITS                     8
> > +
> > +#define HI655X_NR_IRQ                   32
> > +
> > +#define HI655X_IRQ_STAT_BASE            (0x003 << 2)
> > +#define HI655X_IRQ_MASK_BASE            (0x007 << 2)
> > +#define HI655X_ANA_IRQM_BASE            (0x1b5 << 2)
> > +#define HI655X_IRQ_ARRAY                4
> > +#define HI655X_IRQ_MASK                 0xFF
> > +#define HI655X_IRQ_CLR                  0xFF
> > +#define HI655X_VER_REG                  0x00
> > +
> > +#define PMU_VER_START                   0x10
> > +#define PMU_VER_END                     0x38
> > +
> > +#define RESERVE_INT                     BIT(7)
> > +#define PWRON_D20R_INT                  BIT(6)
> > +#define PWRON_D20F_INT                  BIT(5)
> > +#define PWRON_D4SR_INT                  BIT(4)
> > +#define VSYS_6P0_D200UR_INT             BIT(3)
> > +#define VSYS_UV_D3R_INT                 BIT(2)
> > +#define VSYS_2P5_R_INT                  BIT(1)
> > +#define OTMP_D1R_INT                    BIT(0)
> > +
> > +struct hi655x_pmic {
> > +     struct resource *res;
> > +     struct device *dev;
> > +     struct regmap *regmap;
> > +     int gpio;
> > +     unsigned int ver;
> > +     struct regmap_irq_chip_data *irq_data;
> > +};
> > +
> > +#endif
>
> --
> Lee Jones
> Linaro STMicroelectronics Landing Team Lead
> Linaro.org │ Open source software for ARM SoCs
> Follow Linaro: Facebook | Twitter | Blog
>
> .
>
>
>
>

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

* Re: Re: [PATCH v8 3/5] mfd: hi655x: Add MFD driver for hi655x
  2016-04-19  3:25       ` Guodong Xu
@ 2016-04-19  6:53         ` Lee Jones
  2016-04-19  6:57           ` Guodong Xu
  2016-05-18  3:14           ` Guodong Xu
  0 siblings, 2 replies; 17+ messages in thread
From: Lee Jones @ 2016-04-19  6:53 UTC (permalink / raw)
  To: Guodong Xu
  Cc: Mark Brown, Liam Girdwood, linux-kernel, Wang Fei, XinWei Kong,
	Haojian Zhuang, Zhuangluan Su, Chen Feng, Dan Zhao

On Tue, 19 Apr 2016, Guodong Xu wrote:

> On 13 April 2016 at 08:51, Chen Feng <puck.chen@hisilicon.com> wrote:
> >
> >
> >
> > -------- Forwarded Message --------
> > Subject: Re: [PATCH v8 3/5] mfd: hi655x: Add MFD driver for hi655x
> > Date: Mon, 11 Apr 2016 11:41:06 +0100
> > From: Lee Jones <lee.jones@linaro.org>
> > To: Chen Feng <puck.chen@hisilicon.com>
> > CC: lgirdwood@gmail.com, broonie@kernel.org, linux-kernel@vger.kernel.org, w.f@huawei.com, kong.kongxinwei@hisilicon.com, haojian.zhuang@linaro.org, suzhuangluan@hisilicon.com, dan.zhao@hisilicon.com
> >
> > On Sun, 14 Feb 2016, Chen Feng wrote:
> >
> > > Add PMIC MFD driver to support hisilicon hi665x.
> > >
> > > Signed-off-by: Chen Feng <puck.chen@hisilicon.com>
> > > Signed-off-by: Fei Wang <w.f@huawei.com>
> > > Signed-off-by: Xinwei Kong <kong.kongxinwei@hisilicon.com>
> > > Reviewed-by: Haojian Zhuang <haojian.zhuang@linaro.org>
> > > Acked-by: Lee Jones <lee.jones@linaro.org>
> > > ---
> > >  drivers/mfd/Kconfig             |  10 +++
> > >  drivers/mfd/Makefile            |   1 +
> > >  drivers/mfd/hi655x-pmic.c       | 162 ++++++++++++++++++++++++++++++++++++++++
> > >  include/linux/mfd/hi655x-pmic.h |  55 ++++++++++++++
> > >  4 files changed, 228 insertions(+)
> > >  create mode 100644 drivers/mfd/hi655x-pmic.c
> > >  create mode 100644 include/linux/mfd/hi655x-pmic.h
> >
> > Applied, thanks.
> 
> Hi, Lee, Mark
> 
> I still didn't see this patch in linux-next (next-20160418) since your
> replied "Applied". Are you expecting anything else? Dependencies?
> 
> I didn't see any unsolved review comments actually. But if there is,
> please let us know, so I can send an updated version.

When I applied your patch, I also added ~40 other patches.  I haven't
yet got around to editing and pushing them all to -next.  I will put
some time aside this morning in order to complete the push.

> > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > > index 9ca66de..5b1c091 100644
> > > --- a/drivers/mfd/Kconfig
> > > +++ b/drivers/mfd/Kconfig
> > > @@ -284,6 +284,16 @@ config MFD_HI6421_PMIC
> > >         menus in order to enable them.
> > >         We communicate with the Hi6421 via memory-mapped I/O.
> > >
> > > +config MFD_HI655X_PMIC
> > > +     tristate "HiSilicon Hi655X series PMU/Codec IC"
> > > +     depends on ARCH_HISI || COMPILE_TEST
> > > +     depends on OF
> > > +     select MFD_CORE
> > > +     select REGMAP_MMIO
> > > +     select REGMAP_IRQ
> > > +     help
> > > +       Select this option to enable Hisilicon hi655x series pmic driver.
> > > +
> > >  config HTC_EGPIO
> > >       bool "HTC EGPIO support"
> > >       depends on GPIOLIB && ARM
> > > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> > > index 0f230a6..1e166c1 100644
> > > --- a/drivers/mfd/Makefile
> > > +++ b/drivers/mfd/Makefile
> > > @@ -190,6 +190,7 @@ obj-$(CONFIG_MFD_STW481X) += stw481x.o
> > >  obj-$(CONFIG_MFD_IPAQ_MICRO) += ipaq-micro.o
> > >  obj-$(CONFIG_MFD_MENF21BMC)  += menf21bmc.o
> > >  obj-$(CONFIG_MFD_HI6421_PMIC)        += hi6421-pmic-core.o
> > > +obj-$(CONFIG_MFD_HI655X_PMIC)   += hi655x-pmic.o
> > >  obj-$(CONFIG_MFD_DLN2)               += dln2.o
> > >  obj-$(CONFIG_MFD_RT5033)     += rt5033.o
> > >  obj-$(CONFIG_MFD_SKY81452)   += sky81452.o
> > > diff --git a/drivers/mfd/hi655x-pmic.c b/drivers/mfd/hi655x-pmic.c
> > > new file mode 100644
> > > index 0000000..05ddc78
> > > --- /dev/null
> > > +++ b/drivers/mfd/hi655x-pmic.c
> > > @@ -0,0 +1,162 @@
> > > +/*
> > > + * Device driver for MFD hi655x PMIC
> > > + *
> > > + * Copyright (c) 2016 Hisilicon.
> > > + *
> > > + * Authors:
> > > + * Chen Feng <puck.chen@hisilicon.com>
> > > + * Fei  Wang <w.f@huawei.com>
> > > + *
> > > + * This program is free software; you can redistribute it and/or modify
> > > + * it under the terms of the GNU General Public License version 2 as
> > > + * published by the Free Software Foundation.
> > > + */
> > > +
> > > +#include <linux/gpio.h>
> > > +#include <linux/io.h>
> > > +#include <linux/interrupt.h>
> > > +#include <linux/init.h>
> > > +#include <linux/mfd/core.h>
> > > +#include <linux/mfd/hi655x-pmic.h>
> > > +#include <linux/module.h>
> > > +#include <linux/of_gpio.h>
> > > +#include <linux/of_platform.h>
> > > +#include <linux/platform_device.h>
> > > +#include <linux/regmap.h>
> > > +
> > > +static const struct mfd_cell hi655x_pmic_devs[] = {
> > > +     { .name = "hi655x-regulator", },
> > > +};
> > > +
> > > +static const struct regmap_irq hi655x_irqs[] = {
> > > +     { .reg_offset = 0, .mask = OTMP_D1R_INT },
> > > +     { .reg_offset = 0, .mask = VSYS_2P5_R_INT },
> > > +     { .reg_offset = 0, .mask = VSYS_UV_D3R_INT },
> > > +     { .reg_offset = 0, .mask = VSYS_6P0_D200UR_INT },
> > > +     { .reg_offset = 0, .mask = PWRON_D4SR_INT },
> > > +     { .reg_offset = 0, .mask = PWRON_D20F_INT },
> > > +     { .reg_offset = 0, .mask = PWRON_D20R_INT },
> > > +     { .reg_offset = 0, .mask = RESERVE_INT },
> > > +};
> > > +
> > > +static const struct regmap_irq_chip hi655x_irq_chip = {
> > > +     .name = "hi655x-pmic",
> > > +     .irqs = hi655x_irqs,
> > > +     .num_regs = 1,
> > > +     .num_irqs = ARRAY_SIZE(hi655x_irqs),
> > > +     .status_base = HI655X_IRQ_STAT_BASE,
> > > +     .mask_base = HI655X_IRQ_MASK_BASE,
> > > +};
> > > +
> > > +static struct regmap_config hi655x_regmap_config = {
> > > +     .reg_bits = 32,
> > > +     .reg_stride = HI655X_STRIDE,
> > > +     .val_bits = 8,
> > > +     .max_register = HI655X_BUS_ADDR(0xFFF),
> > > +};
> > > +
> > > +static void hi655x_local_irq_clear(struct regmap *map)
> > > +{
> > > +     int i;
> > > +
> > > +     regmap_write(map, HI655X_ANA_IRQM_BASE, HI655X_IRQ_CLR);
> > > +     for (i = 0; i < HI655X_IRQ_ARRAY; i++) {
> > > +             regmap_write(map, HI655X_IRQ_STAT_BASE + i * HI655X_STRIDE,
> > > +                          HI655X_IRQ_CLR);
> > > +     }
> > > +}
> > > +
> > > +static int hi655x_pmic_probe(struct platform_device *pdev)
> > > +{
> > > +     int ret;
> > > +     struct hi655x_pmic *pmic;
> > > +     struct device *dev = &pdev->dev;
> > > +     struct device_node *np = dev->of_node;
> > > +     void __iomem *base;
> > > +
> > > +     pmic = devm_kzalloc(dev, sizeof(*pmic), GFP_KERNEL);
> > > +     if (!pmic)
> > > +             return -ENOMEM;
> > > +     pmic->dev = dev;
> > > +
> > > +     pmic->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > > +     if (!pmic->res)
> > > +             return -ENOENT;
> > > +
> > > +     base = devm_ioremap_resource(dev, pmic->res);
> > > +     if (!base)
> > > +             return -ENOMEM;
> > > +
> > > +     pmic->regmap = devm_regmap_init_mmio_clk(dev, NULL, base,
> > > +                                              &hi655x_regmap_config);
> > > +
> > > +     regmap_read(pmic->regmap, HI655X_BUS_ADDR(HI655X_VER_REG), &pmic->ver);
> > > +     if ((pmic->ver < PMU_VER_START) || (pmic->ver > PMU_VER_END)) {
> > > +             dev_warn(dev, "PMU version %d unsupported\n", pmic->ver);
> > > +             return -EINVAL;
> > > +     }
> > > +
> > > +     hi655x_local_irq_clear(pmic->regmap);
> > > +
> > > +     pmic->gpio = of_get_named_gpio(np, "pmic-gpios", 0);
> > > +     if (!gpio_is_valid(pmic->gpio)) {
> > > +             dev_err(dev, "Failed to get the pmic-gpios\n");
> > > +             return -ENODEV;
> > > +     }
> > > +
> > > +     ret = devm_gpio_request_one(dev, pmic->gpio, GPIOF_IN,
> > > +                                 "hi655x_pmic_irq");
> > > +     if (ret < 0) {
> > > +             dev_err(dev, "Failed to request gpio %d  ret = %d\n",
> > > +                     pmic->gpio, ret);
> > > +             return ret;
> > > +     }
> > > +
> > > +     ret = regmap_add_irq_chip(pmic->regmap, gpio_to_irq(pmic->gpio),
> > > +                               IRQF_TRIGGER_LOW | IRQF_NO_SUSPEND, 0,
> > > +                               &hi655x_irq_chip, &pmic->irq_data);
> > > +     if (ret) {
> > > +             dev_err(dev, "Failed to obtain 'hi655x_pmic_irq' %d\n", ret);
> > > +             return ret;
> > > +     }
> > > +
> > > +     platform_set_drvdata(pdev, pmic);
> > > +
> > > +     ret = mfd_add_devices(dev, PLATFORM_DEVID_AUTO, hi655x_pmic_devs,
> > > +                           ARRAY_SIZE(hi655x_pmic_devs), NULL, 0, NULL);
> > > +     if (ret) {
> > > +             dev_err(dev, "Failed to register device %d\n", ret);
> > > +             regmap_del_irq_chip(gpio_to_irq(pmic->gpio), pmic->irq_data);
> > > +             return ret;
> > > +     }
> > > +
> > > +     return 0;
> > > +}
> > > +
> > > +static int hi655x_pmic_remove(struct platform_device *pdev)
> > > +{
> > > +     struct hi655x_pmic *pmic = platform_get_drvdata(pdev);
> > > +
> > > +     regmap_del_irq_chip(gpio_to_irq(pmic->gpio), pmic->irq_data);
> > > +     mfd_remove_devices(&pdev->dev);
> > > +     return 0;
> > > +}
> > > +
> > > +static const struct of_device_id hi655x_pmic_match[] = {
> > > +     { .compatible = "hisilicon,hi655x-pmic", },
> > > +     {},
> > > +};
> > > +
> > > +static struct platform_driver hi655x_pmic_driver = {
> > > +     .driver = {
> > > +             .name = "hi655x-pmic",
> > > +             .of_match_table = of_match_ptr(hi655x_pmic_match),
> > > +     },
> > > +     .probe  = hi655x_pmic_probe,
> > > +     .remove = hi655x_pmic_remove,
> > > +};
> > > +module_platform_driver(hi655x_pmic_driver);
> > > +
> > > +MODULE_AUTHOR("Chen Feng <puck.chen@hisilicon.com>");
> > > +MODULE_DESCRIPTION("Hisilicon hi655x PMIC driver");
> > > +MODULE_LICENSE("GPL v2");
> > > diff --git a/include/linux/mfd/hi655x-pmic.h b/include/linux/mfd/hi655x-pmic.h
> > > new file mode 100644
> > > index 0000000..dbbe9a6
> > > --- /dev/null
> > > +++ b/include/linux/mfd/hi655x-pmic.h
> > > @@ -0,0 +1,55 @@
> > > +/*
> > > + * Device driver for regulators in hi655x IC
> > > + *
> > > + * Copyright (c) 2016 Hisilicon.
> > > + *
> > > + * Authors:
> > > + * Chen Feng <puck.chen@hisilicon.com>
> > > + * Fei  Wang <w.f@huawei.com>
> > > + *
> > > + * This program is free software; you can redistribute it and/or modify
> > > + * it under the terms of the GNU General Public License version 2 as
> > > + * published by the Free Software Foundation.
> > > + */
> > > +
> > > +#ifndef __HI655X_PMIC_H
> > > +#define __HI655X_PMIC_H
> > > +
> > > +/* Hi655x registers are mapped to memory bus in 4 bytes stride */
> > > +#define HI655X_STRIDE                   4
> > > +#define HI655X_BUS_ADDR(x)              ((x) << 2)
> > > +
> > > +#define HI655X_BITS                     8
> > > +
> > > +#define HI655X_NR_IRQ                   32
> > > +
> > > +#define HI655X_IRQ_STAT_BASE            (0x003 << 2)
> > > +#define HI655X_IRQ_MASK_BASE            (0x007 << 2)
> > > +#define HI655X_ANA_IRQM_BASE            (0x1b5 << 2)
> > > +#define HI655X_IRQ_ARRAY                4
> > > +#define HI655X_IRQ_MASK                 0xFF
> > > +#define HI655X_IRQ_CLR                  0xFF
> > > +#define HI655X_VER_REG                  0x00
> > > +
> > > +#define PMU_VER_START                   0x10
> > > +#define PMU_VER_END                     0x38
> > > +
> > > +#define RESERVE_INT                     BIT(7)
> > > +#define PWRON_D20R_INT                  BIT(6)
> > > +#define PWRON_D20F_INT                  BIT(5)
> > > +#define PWRON_D4SR_INT                  BIT(4)
> > > +#define VSYS_6P0_D200UR_INT             BIT(3)
> > > +#define VSYS_UV_D3R_INT                 BIT(2)
> > > +#define VSYS_2P5_R_INT                  BIT(1)
> > > +#define OTMP_D1R_INT                    BIT(0)
> > > +
> > > +struct hi655x_pmic {
> > > +     struct resource *res;
> > > +     struct device *dev;
> > > +     struct regmap *regmap;
> > > +     int gpio;
> > > +     unsigned int ver;
> > > +     struct regmap_irq_chip_data *irq_data;
> > > +};
> > > +
> > > +#endif
> >
> >
> > .
> >
> >
> >
> >

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

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

* Re: Re: [PATCH v8 3/5] mfd: hi655x: Add MFD driver for hi655x
  2016-04-19  6:53         ` Lee Jones
@ 2016-04-19  6:57           ` Guodong Xu
  2016-05-18  3:14           ` Guodong Xu
  1 sibling, 0 replies; 17+ messages in thread
From: Guodong Xu @ 2016-04-19  6:57 UTC (permalink / raw)
  To: Lee Jones
  Cc: Mark Brown, Liam Girdwood, linux-kernel, Wang Fei, XinWei Kong,
	Haojian Zhuang, Zhuangluan Su, Chen Feng, Dan Zhao

On 19 April 2016 at 14:53, Lee Jones <lee.jones@linaro.org> wrote:
> On Tue, 19 Apr 2016, Guodong Xu wrote:
>
>> On 13 April 2016 at 08:51, Chen Feng <puck.chen@hisilicon.com> wrote:
>> >
>> >
>> >
>> > -------- Forwarded Message --------
>> > Subject: Re: [PATCH v8 3/5] mfd: hi655x: Add MFD driver for hi655x
>> > Date: Mon, 11 Apr 2016 11:41:06 +0100
>> > From: Lee Jones <lee.jones@linaro.org>
>> > To: Chen Feng <puck.chen@hisilicon.com>
>> > CC: lgirdwood@gmail.com, broonie@kernel.org, linux-kernel@vger.kernel.org, w.f@huawei.com, kong.kongxinwei@hisilicon.com, haojian.zhuang@linaro.org, suzhuangluan@hisilicon.com, dan.zhao@hisilicon.com
>> >
>> > On Sun, 14 Feb 2016, Chen Feng wrote:
>> >
>> > > Add PMIC MFD driver to support hisilicon hi665x.
>> > >
>> > > Signed-off-by: Chen Feng <puck.chen@hisilicon.com>
>> > > Signed-off-by: Fei Wang <w.f@huawei.com>
>> > > Signed-off-by: Xinwei Kong <kong.kongxinwei@hisilicon.com>
>> > > Reviewed-by: Haojian Zhuang <haojian.zhuang@linaro.org>
>> > > Acked-by: Lee Jones <lee.jones@linaro.org>
>> > > ---
>> > >  drivers/mfd/Kconfig             |  10 +++
>> > >  drivers/mfd/Makefile            |   1 +
>> > >  drivers/mfd/hi655x-pmic.c       | 162 ++++++++++++++++++++++++++++++++++++++++
>> > >  include/linux/mfd/hi655x-pmic.h |  55 ++++++++++++++
>> > >  4 files changed, 228 insertions(+)
>> > >  create mode 100644 drivers/mfd/hi655x-pmic.c
>> > >  create mode 100644 include/linux/mfd/hi655x-pmic.h
>> >
>> > Applied, thanks.
>>
>> Hi, Lee, Mark
>>
>> I still didn't see this patch in linux-next (next-20160418) since your
>> replied "Applied". Are you expecting anything else? Dependencies?
>>
>> I didn't see any unsolved review comments actually. But if there is,
>> please let us know, so I can send an updated version.
>
> When I applied your patch, I also added ~40 other patches.  I haven't
> yet got around to editing and pushing them all to -next.  I will put
> some time aside this morning in order to complete the push.

Thanks, Lee.

-Guodong

>
>> > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
>> > > index 9ca66de..5b1c091 100644
>> > > --- a/drivers/mfd/Kconfig
>> > > +++ b/drivers/mfd/Kconfig
>> > > @@ -284,6 +284,16 @@ config MFD_HI6421_PMIC
>> > >         menus in order to enable them.
>> > >         We communicate with the Hi6421 via memory-mapped I/O.
>> > >
>> > > +config MFD_HI655X_PMIC
>> > > +     tristate "HiSilicon Hi655X series PMU/Codec IC"
>> > > +     depends on ARCH_HISI || COMPILE_TEST
>> > > +     depends on OF
>> > > +     select MFD_CORE
>> > > +     select REGMAP_MMIO
>> > > +     select REGMAP_IRQ
>> > > +     help
>> > > +       Select this option to enable Hisilicon hi655x series pmic driver.
>> > > +
>> > >  config HTC_EGPIO
>> > >       bool "HTC EGPIO support"
>> > >       depends on GPIOLIB && ARM
>> > > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
>> > > index 0f230a6..1e166c1 100644
>> > > --- a/drivers/mfd/Makefile
>> > > +++ b/drivers/mfd/Makefile
>> > > @@ -190,6 +190,7 @@ obj-$(CONFIG_MFD_STW481X) += stw481x.o
>> > >  obj-$(CONFIG_MFD_IPAQ_MICRO) += ipaq-micro.o
>> > >  obj-$(CONFIG_MFD_MENF21BMC)  += menf21bmc.o
>> > >  obj-$(CONFIG_MFD_HI6421_PMIC)        += hi6421-pmic-core.o
>> > > +obj-$(CONFIG_MFD_HI655X_PMIC)   += hi655x-pmic.o
>> > >  obj-$(CONFIG_MFD_DLN2)               += dln2.o
>> > >  obj-$(CONFIG_MFD_RT5033)     += rt5033.o
>> > >  obj-$(CONFIG_MFD_SKY81452)   += sky81452.o
>> > > diff --git a/drivers/mfd/hi655x-pmic.c b/drivers/mfd/hi655x-pmic.c
>> > > new file mode 100644
>> > > index 0000000..05ddc78
>> > > --- /dev/null
>> > > +++ b/drivers/mfd/hi655x-pmic.c
>> > > @@ -0,0 +1,162 @@
>> > > +/*
>> > > + * Device driver for MFD hi655x PMIC
>> > > + *
>> > > + * Copyright (c) 2016 Hisilicon.
>> > > + *
>> > > + * Authors:
>> > > + * Chen Feng <puck.chen@hisilicon.com>
>> > > + * Fei  Wang <w.f@huawei.com>
>> > > + *
>> > > + * This program is free software; you can redistribute it and/or modify
>> > > + * it under the terms of the GNU General Public License version 2 as
>> > > + * published by the Free Software Foundation.
>> > > + */
>> > > +
>> > > +#include <linux/gpio.h>
>> > > +#include <linux/io.h>
>> > > +#include <linux/interrupt.h>
>> > > +#include <linux/init.h>
>> > > +#include <linux/mfd/core.h>
>> > > +#include <linux/mfd/hi655x-pmic.h>
>> > > +#include <linux/module.h>
>> > > +#include <linux/of_gpio.h>
>> > > +#include <linux/of_platform.h>
>> > > +#include <linux/platform_device.h>
>> > > +#include <linux/regmap.h>
>> > > +
>> > > +static const struct mfd_cell hi655x_pmic_devs[] = {
>> > > +     { .name = "hi655x-regulator", },
>> > > +};
>> > > +
>> > > +static const struct regmap_irq hi655x_irqs[] = {
>> > > +     { .reg_offset = 0, .mask = OTMP_D1R_INT },
>> > > +     { .reg_offset = 0, .mask = VSYS_2P5_R_INT },
>> > > +     { .reg_offset = 0, .mask = VSYS_UV_D3R_INT },
>> > > +     { .reg_offset = 0, .mask = VSYS_6P0_D200UR_INT },
>> > > +     { .reg_offset = 0, .mask = PWRON_D4SR_INT },
>> > > +     { .reg_offset = 0, .mask = PWRON_D20F_INT },
>> > > +     { .reg_offset = 0, .mask = PWRON_D20R_INT },
>> > > +     { .reg_offset = 0, .mask = RESERVE_INT },
>> > > +};
>> > > +
>> > > +static const struct regmap_irq_chip hi655x_irq_chip = {
>> > > +     .name = "hi655x-pmic",
>> > > +     .irqs = hi655x_irqs,
>> > > +     .num_regs = 1,
>> > > +     .num_irqs = ARRAY_SIZE(hi655x_irqs),
>> > > +     .status_base = HI655X_IRQ_STAT_BASE,
>> > > +     .mask_base = HI655X_IRQ_MASK_BASE,
>> > > +};
>> > > +
>> > > +static struct regmap_config hi655x_regmap_config = {
>> > > +     .reg_bits = 32,
>> > > +     .reg_stride = HI655X_STRIDE,
>> > > +     .val_bits = 8,
>> > > +     .max_register = HI655X_BUS_ADDR(0xFFF),
>> > > +};
>> > > +
>> > > +static void hi655x_local_irq_clear(struct regmap *map)
>> > > +{
>> > > +     int i;
>> > > +
>> > > +     regmap_write(map, HI655X_ANA_IRQM_BASE, HI655X_IRQ_CLR);
>> > > +     for (i = 0; i < HI655X_IRQ_ARRAY; i++) {
>> > > +             regmap_write(map, HI655X_IRQ_STAT_BASE + i * HI655X_STRIDE,
>> > > +                          HI655X_IRQ_CLR);
>> > > +     }
>> > > +}
>> > > +
>> > > +static int hi655x_pmic_probe(struct platform_device *pdev)
>> > > +{
>> > > +     int ret;
>> > > +     struct hi655x_pmic *pmic;
>> > > +     struct device *dev = &pdev->dev;
>> > > +     struct device_node *np = dev->of_node;
>> > > +     void __iomem *base;
>> > > +
>> > > +     pmic = devm_kzalloc(dev, sizeof(*pmic), GFP_KERNEL);
>> > > +     if (!pmic)
>> > > +             return -ENOMEM;
>> > > +     pmic->dev = dev;
>> > > +
>> > > +     pmic->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>> > > +     if (!pmic->res)
>> > > +             return -ENOENT;
>> > > +
>> > > +     base = devm_ioremap_resource(dev, pmic->res);
>> > > +     if (!base)
>> > > +             return -ENOMEM;
>> > > +
>> > > +     pmic->regmap = devm_regmap_init_mmio_clk(dev, NULL, base,
>> > > +                                              &hi655x_regmap_config);
>> > > +
>> > > +     regmap_read(pmic->regmap, HI655X_BUS_ADDR(HI655X_VER_REG), &pmic->ver);
>> > > +     if ((pmic->ver < PMU_VER_START) || (pmic->ver > PMU_VER_END)) {
>> > > +             dev_warn(dev, "PMU version %d unsupported\n", pmic->ver);
>> > > +             return -EINVAL;
>> > > +     }
>> > > +
>> > > +     hi655x_local_irq_clear(pmic->regmap);
>> > > +
>> > > +     pmic->gpio = of_get_named_gpio(np, "pmic-gpios", 0);
>> > > +     if (!gpio_is_valid(pmic->gpio)) {
>> > > +             dev_err(dev, "Failed to get the pmic-gpios\n");
>> > > +             return -ENODEV;
>> > > +     }
>> > > +
>> > > +     ret = devm_gpio_request_one(dev, pmic->gpio, GPIOF_IN,
>> > > +                                 "hi655x_pmic_irq");
>> > > +     if (ret < 0) {
>> > > +             dev_err(dev, "Failed to request gpio %d  ret = %d\n",
>> > > +                     pmic->gpio, ret);
>> > > +             return ret;
>> > > +     }
>> > > +
>> > > +     ret = regmap_add_irq_chip(pmic->regmap, gpio_to_irq(pmic->gpio),
>> > > +                               IRQF_TRIGGER_LOW | IRQF_NO_SUSPEND, 0,
>> > > +                               &hi655x_irq_chip, &pmic->irq_data);
>> > > +     if (ret) {
>> > > +             dev_err(dev, "Failed to obtain 'hi655x_pmic_irq' %d\n", ret);
>> > > +             return ret;
>> > > +     }
>> > > +
>> > > +     platform_set_drvdata(pdev, pmic);
>> > > +
>> > > +     ret = mfd_add_devices(dev, PLATFORM_DEVID_AUTO, hi655x_pmic_devs,
>> > > +                           ARRAY_SIZE(hi655x_pmic_devs), NULL, 0, NULL);
>> > > +     if (ret) {
>> > > +             dev_err(dev, "Failed to register device %d\n", ret);
>> > > +             regmap_del_irq_chip(gpio_to_irq(pmic->gpio), pmic->irq_data);
>> > > +             return ret;
>> > > +     }
>> > > +
>> > > +     return 0;
>> > > +}
>> > > +
>> > > +static int hi655x_pmic_remove(struct platform_device *pdev)
>> > > +{
>> > > +     struct hi655x_pmic *pmic = platform_get_drvdata(pdev);
>> > > +
>> > > +     regmap_del_irq_chip(gpio_to_irq(pmic->gpio), pmic->irq_data);
>> > > +     mfd_remove_devices(&pdev->dev);
>> > > +     return 0;
>> > > +}
>> > > +
>> > > +static const struct of_device_id hi655x_pmic_match[] = {
>> > > +     { .compatible = "hisilicon,hi655x-pmic", },
>> > > +     {},
>> > > +};
>> > > +
>> > > +static struct platform_driver hi655x_pmic_driver = {
>> > > +     .driver = {
>> > > +             .name = "hi655x-pmic",
>> > > +             .of_match_table = of_match_ptr(hi655x_pmic_match),
>> > > +     },
>> > > +     .probe  = hi655x_pmic_probe,
>> > > +     .remove = hi655x_pmic_remove,
>> > > +};
>> > > +module_platform_driver(hi655x_pmic_driver);
>> > > +
>> > > +MODULE_AUTHOR("Chen Feng <puck.chen@hisilicon.com>");
>> > > +MODULE_DESCRIPTION("Hisilicon hi655x PMIC driver");
>> > > +MODULE_LICENSE("GPL v2");
>> > > diff --git a/include/linux/mfd/hi655x-pmic.h b/include/linux/mfd/hi655x-pmic.h
>> > > new file mode 100644
>> > > index 0000000..dbbe9a6
>> > > --- /dev/null
>> > > +++ b/include/linux/mfd/hi655x-pmic.h
>> > > @@ -0,0 +1,55 @@
>> > > +/*
>> > > + * Device driver for regulators in hi655x IC
>> > > + *
>> > > + * Copyright (c) 2016 Hisilicon.
>> > > + *
>> > > + * Authors:
>> > > + * Chen Feng <puck.chen@hisilicon.com>
>> > > + * Fei  Wang <w.f@huawei.com>
>> > > + *
>> > > + * This program is free software; you can redistribute it and/or modify
>> > > + * it under the terms of the GNU General Public License version 2 as
>> > > + * published by the Free Software Foundation.
>> > > + */
>> > > +
>> > > +#ifndef __HI655X_PMIC_H
>> > > +#define __HI655X_PMIC_H
>> > > +
>> > > +/* Hi655x registers are mapped to memory bus in 4 bytes stride */
>> > > +#define HI655X_STRIDE                   4
>> > > +#define HI655X_BUS_ADDR(x)              ((x) << 2)
>> > > +
>> > > +#define HI655X_BITS                     8
>> > > +
>> > > +#define HI655X_NR_IRQ                   32
>> > > +
>> > > +#define HI655X_IRQ_STAT_BASE            (0x003 << 2)
>> > > +#define HI655X_IRQ_MASK_BASE            (0x007 << 2)
>> > > +#define HI655X_ANA_IRQM_BASE            (0x1b5 << 2)
>> > > +#define HI655X_IRQ_ARRAY                4
>> > > +#define HI655X_IRQ_MASK                 0xFF
>> > > +#define HI655X_IRQ_CLR                  0xFF
>> > > +#define HI655X_VER_REG                  0x00
>> > > +
>> > > +#define PMU_VER_START                   0x10
>> > > +#define PMU_VER_END                     0x38
>> > > +
>> > > +#define RESERVE_INT                     BIT(7)
>> > > +#define PWRON_D20R_INT                  BIT(6)
>> > > +#define PWRON_D20F_INT                  BIT(5)
>> > > +#define PWRON_D4SR_INT                  BIT(4)
>> > > +#define VSYS_6P0_D200UR_INT             BIT(3)
>> > > +#define VSYS_UV_D3R_INT                 BIT(2)
>> > > +#define VSYS_2P5_R_INT                  BIT(1)
>> > > +#define OTMP_D1R_INT                    BIT(0)
>> > > +
>> > > +struct hi655x_pmic {
>> > > +     struct resource *res;
>> > > +     struct device *dev;
>> > > +     struct regmap *regmap;
>> > > +     int gpio;
>> > > +     unsigned int ver;
>> > > +     struct regmap_irq_chip_data *irq_data;
>> > > +};
>> > > +
>> > > +#endif
>> >
>> >
>> > .
>> >
>> >
>> >
>> >
>
> --
> Lee Jones
> Linaro STMicroelectronics Landing Team Lead
> Linaro.org │ Open source software for ARM SoCs
> Follow Linaro: Facebook | Twitter | Blog

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

* Re: Re: [PATCH v8 3/5] mfd: hi655x: Add MFD driver for hi655x
  2016-04-19  6:53         ` Lee Jones
  2016-04-19  6:57           ` Guodong Xu
@ 2016-05-18  3:14           ` Guodong Xu
  1 sibling, 0 replies; 17+ messages in thread
From: Guodong Xu @ 2016-05-18  3:14 UTC (permalink / raw)
  To: Lee Jones
  Cc: Mark Brown, Liam Girdwood, linux-kernel, Wang Fei, XinWei Kong,
	Haojian Zhuang, Zhuangluan Su, Chen Feng, Dan Zhao,
	Scott Bambrough, Amit Kucheria

On 19 April 2016 at 14:53, Lee Jones <lee.jones@linaro.org> wrote:
>
> On Tue, 19 Apr 2016, Guodong Xu wrote:
>
> > On 13 April 2016 at 08:51, Chen Feng <puck.chen@hisilicon.com> wrote:
> > >
> > >
> > >
> > > -------- Forwarded Message --------
> > > Subject: Re: [PATCH v8 3/5] mfd: hi655x: Add MFD driver for hi655x
> > > Date: Mon, 11 Apr 2016 11:41:06 +0100
> > > From: Lee Jones <lee.jones@linaro.org>
> > > To: Chen Feng <puck.chen@hisilicon.com>
> > > CC: lgirdwood@gmail.com, broonie@kernel.org, linux-kernel@vger.kernel.org, w.f@huawei.com, kong.kongxinwei@hisilicon.com, haojian.zhuang@linaro.org, suzhuangluan@hisilicon.com, dan.zhao@hisilicon.com
> > >
> > > On Sun, 14 Feb 2016, Chen Feng wrote:
> > >
> > > > Add PMIC MFD driver to support hisilicon hi665x.
> > > >
> > > > Signed-off-by: Chen Feng <puck.chen@hisilicon.com>
> > > > Signed-off-by: Fei Wang <w.f@huawei.com>
> > > > Signed-off-by: Xinwei Kong <kong.kongxinwei@hisilicon.com>
> > > > Reviewed-by: Haojian Zhuang <haojian.zhuang@linaro.org>
> > > > Acked-by: Lee Jones <lee.jones@linaro.org>
> > > > ---
> > > >  drivers/mfd/Kconfig             |  10 +++
> > > >  drivers/mfd/Makefile            |   1 +
> > > >  drivers/mfd/hi655x-pmic.c       | 162 ++++++++++++++++++++++++++++++++++++++++
> > > >  include/linux/mfd/hi655x-pmic.h |  55 ++++++++++++++
> > > >  4 files changed, 228 insertions(+)
> > > >  create mode 100644 drivers/mfd/hi655x-pmic.c
> > > >  create mode 100644 include/linux/mfd/hi655x-pmic.h
> > >
> > > Applied, thanks.
> >
> > Hi, Lee, Mark
> >
> > I still didn't see this patch in linux-next (next-20160418) since your
> > replied "Applied". Are you expecting anything else? Dependencies?
> >
> > I didn't see any unsolved review comments actually. But if there is,
> > please let us know, so I can send an updated version.
>
> When I applied your patch, I also added ~40 other patches.  I haven't
> yet got around to editing and pushing them all to -next.  I will put
> some time aside this morning in order to complete the push.


Hi, Lee

As of this morning, I still cannot see hi655x in your for-mfd-next
branch and in linux-next (next-20160517)

I saw this patch integrated on Apr/19:
mfd: hi655x: Add document for hi665x PMIC

But apparently missing this one:
[PATCH v8 3/5] mfd: hi655x: Add MFD driver for hi655x

Would you please have a check? Sorry if I'm asking something stupid.
Look forward to seeing it in v4.7-rcs.

Thank you.

-Guodong

>
>
> > > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > > > index 9ca66de..5b1c091 100644
> > > > --- a/drivers/mfd/Kconfig
> > > > +++ b/drivers/mfd/Kconfig
> > > > @@ -284,6 +284,16 @@ config MFD_HI6421_PMIC
> > > >         menus in order to enable them.
> > > >         We communicate with the Hi6421 via memory-mapped I/O.
> > > >
> > > > +config MFD_HI655X_PMIC
> > > > +     tristate "HiSilicon Hi655X series PMU/Codec IC"
> > > > +     depends on ARCH_HISI || COMPILE_TEST
> > > > +     depends on OF
> > > > +     select MFD_CORE
> > > > +     select REGMAP_MMIO
> > > > +     select REGMAP_IRQ
> > > > +     help
> > > > +       Select this option to enable Hisilicon hi655x series pmic driver.
> > > > +
> > > >  config HTC_EGPIO
> > > >       bool "HTC EGPIO support"
> > > >       depends on GPIOLIB && ARM
> > > > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> > > > index 0f230a6..1e166c1 100644
> > > > --- a/drivers/mfd/Makefile
> > > > +++ b/drivers/mfd/Makefile
> > > > @@ -190,6 +190,7 @@ obj-$(CONFIG_MFD_STW481X) += stw481x.o
> > > >  obj-$(CONFIG_MFD_IPAQ_MICRO) += ipaq-micro.o
> > > >  obj-$(CONFIG_MFD_MENF21BMC)  += menf21bmc.o
> > > >  obj-$(CONFIG_MFD_HI6421_PMIC)        += hi6421-pmic-core.o
> > > > +obj-$(CONFIG_MFD_HI655X_PMIC)   += hi655x-pmic.o
> > > >  obj-$(CONFIG_MFD_DLN2)               += dln2.o
> > > >  obj-$(CONFIG_MFD_RT5033)     += rt5033.o
> > > >  obj-$(CONFIG_MFD_SKY81452)   += sky81452.o
> > > > diff --git a/drivers/mfd/hi655x-pmic.c b/drivers/mfd/hi655x-pmic.c
> > > > new file mode 100644
> > > > index 0000000..05ddc78
> > > > --- /dev/null
> > > > +++ b/drivers/mfd/hi655x-pmic.c
> > > > @@ -0,0 +1,162 @@
> > > > +/*
> > > > + * Device driver for MFD hi655x PMIC
> > > > + *
> > > > + * Copyright (c) 2016 Hisilicon.
> > > > + *
> > > > + * Authors:
> > > > + * Chen Feng <puck.chen@hisilicon.com>
> > > > + * Fei  Wang <w.f@huawei.com>
> > > > + *
> > > > + * This program is free software; you can redistribute it and/or modify
> > > > + * it under the terms of the GNU General Public License version 2 as
> > > > + * published by the Free Software Foundation.
> > > > + */
> > > > +
> > > > +#include <linux/gpio.h>
> > > > +#include <linux/io.h>
> > > > +#include <linux/interrupt.h>
> > > > +#include <linux/init.h>
> > > > +#include <linux/mfd/core.h>
> > > > +#include <linux/mfd/hi655x-pmic.h>
> > > > +#include <linux/module.h>
> > > > +#include <linux/of_gpio.h>
> > > > +#include <linux/of_platform.h>
> > > > +#include <linux/platform_device.h>
> > > > +#include <linux/regmap.h>
> > > > +
> > > > +static const struct mfd_cell hi655x_pmic_devs[] = {
> > > > +     { .name = "hi655x-regulator", },
> > > > +};
> > > > +
> > > > +static const struct regmap_irq hi655x_irqs[] = {
> > > > +     { .reg_offset = 0, .mask = OTMP_D1R_INT },
> > > > +     { .reg_offset = 0, .mask = VSYS_2P5_R_INT },
> > > > +     { .reg_offset = 0, .mask = VSYS_UV_D3R_INT },
> > > > +     { .reg_offset = 0, .mask = VSYS_6P0_D200UR_INT },
> > > > +     { .reg_offset = 0, .mask = PWRON_D4SR_INT },
> > > > +     { .reg_offset = 0, .mask = PWRON_D20F_INT },
> > > > +     { .reg_offset = 0, .mask = PWRON_D20R_INT },
> > > > +     { .reg_offset = 0, .mask = RESERVE_INT },
> > > > +};
> > > > +
> > > > +static const struct regmap_irq_chip hi655x_irq_chip = {
> > > > +     .name = "hi655x-pmic",
> > > > +     .irqs = hi655x_irqs,
> > > > +     .num_regs = 1,
> > > > +     .num_irqs = ARRAY_SIZE(hi655x_irqs),
> > > > +     .status_base = HI655X_IRQ_STAT_BASE,
> > > > +     .mask_base = HI655X_IRQ_MASK_BASE,
> > > > +};
> > > > +
> > > > +static struct regmap_config hi655x_regmap_config = {
> > > > +     .reg_bits = 32,
> > > > +     .reg_stride = HI655X_STRIDE,
> > > > +     .val_bits = 8,
> > > > +     .max_register = HI655X_BUS_ADDR(0xFFF),
> > > > +};
> > > > +
> > > > +static void hi655x_local_irq_clear(struct regmap *map)
> > > > +{
> > > > +     int i;
> > > > +
> > > > +     regmap_write(map, HI655X_ANA_IRQM_BASE, HI655X_IRQ_CLR);
> > > > +     for (i = 0; i < HI655X_IRQ_ARRAY; i++) {
> > > > +             regmap_write(map, HI655X_IRQ_STAT_BASE + i * HI655X_STRIDE,
> > > > +                          HI655X_IRQ_CLR);
> > > > +     }
> > > > +}
> > > > +
> > > > +static int hi655x_pmic_probe(struct platform_device *pdev)
> > > > +{
> > > > +     int ret;
> > > > +     struct hi655x_pmic *pmic;
> > > > +     struct device *dev = &pdev->dev;
> > > > +     struct device_node *np = dev->of_node;
> > > > +     void __iomem *base;
> > > > +
> > > > +     pmic = devm_kzalloc(dev, sizeof(*pmic), GFP_KERNEL);
> > > > +     if (!pmic)
> > > > +             return -ENOMEM;
> > > > +     pmic->dev = dev;
> > > > +
> > > > +     pmic->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > > > +     if (!pmic->res)
> > > > +             return -ENOENT;
> > > > +
> > > > +     base = devm_ioremap_resource(dev, pmic->res);
> > > > +     if (!base)
> > > > +             return -ENOMEM;
> > > > +
> > > > +     pmic->regmap = devm_regmap_init_mmio_clk(dev, NULL, base,
> > > > +                                              &hi655x_regmap_config);
> > > > +
> > > > +     regmap_read(pmic->regmap, HI655X_BUS_ADDR(HI655X_VER_REG), &pmic->ver);
> > > > +     if ((pmic->ver < PMU_VER_START) || (pmic->ver > PMU_VER_END)) {
> > > > +             dev_warn(dev, "PMU version %d unsupported\n", pmic->ver);
> > > > +             return -EINVAL;
> > > > +     }
> > > > +
> > > > +     hi655x_local_irq_clear(pmic->regmap);
> > > > +
> > > > +     pmic->gpio = of_get_named_gpio(np, "pmic-gpios", 0);
> > > > +     if (!gpio_is_valid(pmic->gpio)) {
> > > > +             dev_err(dev, "Failed to get the pmic-gpios\n");
> > > > +             return -ENODEV;
> > > > +     }
> > > > +
> > > > +     ret = devm_gpio_request_one(dev, pmic->gpio, GPIOF_IN,
> > > > +                                 "hi655x_pmic_irq");
> > > > +     if (ret < 0) {
> > > > +             dev_err(dev, "Failed to request gpio %d  ret = %d\n",
> > > > +                     pmic->gpio, ret);
> > > > +             return ret;
> > > > +     }
> > > > +
> > > > +     ret = regmap_add_irq_chip(pmic->regmap, gpio_to_irq(pmic->gpio),
> > > > +                               IRQF_TRIGGER_LOW | IRQF_NO_SUSPEND, 0,
> > > > +                               &hi655x_irq_chip, &pmic->irq_data);
> > > > +     if (ret) {
> > > > +             dev_err(dev, "Failed to obtain 'hi655x_pmic_irq' %d\n", ret);
> > > > +             return ret;
> > > > +     }
> > > > +
> > > > +     platform_set_drvdata(pdev, pmic);
> > > > +
> > > > +     ret = mfd_add_devices(dev, PLATFORM_DEVID_AUTO, hi655x_pmic_devs,
> > > > +                           ARRAY_SIZE(hi655x_pmic_devs), NULL, 0, NULL);
> > > > +     if (ret) {
> > > > +             dev_err(dev, "Failed to register device %d\n", ret);
> > > > +             regmap_del_irq_chip(gpio_to_irq(pmic->gpio), pmic->irq_data);
> > > > +             return ret;
> > > > +     }
> > > > +
> > > > +     return 0;
> > > > +}
> > > > +
> > > > +static int hi655x_pmic_remove(struct platform_device *pdev)
> > > > +{
> > > > +     struct hi655x_pmic *pmic = platform_get_drvdata(pdev);
> > > > +
> > > > +     regmap_del_irq_chip(gpio_to_irq(pmic->gpio), pmic->irq_data);
> > > > +     mfd_remove_devices(&pdev->dev);
> > > > +     return 0;
> > > > +}
> > > > +
> > > > +static const struct of_device_id hi655x_pmic_match[] = {
> > > > +     { .compatible = "hisilicon,hi655x-pmic", },
> > > > +     {},
> > > > +};
> > > > +
> > > > +static struct platform_driver hi655x_pmic_driver = {
> > > > +     .driver = {
> > > > +             .name = "hi655x-pmic",
> > > > +             .of_match_table = of_match_ptr(hi655x_pmic_match),
> > > > +     },
> > > > +     .probe  = hi655x_pmic_probe,
> > > > +     .remove = hi655x_pmic_remove,
> > > > +};
> > > > +module_platform_driver(hi655x_pmic_driver);
> > > > +
> > > > +MODULE_AUTHOR("Chen Feng <puck.chen@hisilicon.com>");
> > > > +MODULE_DESCRIPTION("Hisilicon hi655x PMIC driver");
> > > > +MODULE_LICENSE("GPL v2");
> > > > diff --git a/include/linux/mfd/hi655x-pmic.h b/include/linux/mfd/hi655x-pmic.h
> > > > new file mode 100644
> > > > index 0000000..dbbe9a6
> > > > --- /dev/null
> > > > +++ b/include/linux/mfd/hi655x-pmic.h
> > > > @@ -0,0 +1,55 @@
> > > > +/*
> > > > + * Device driver for regulators in hi655x IC
> > > > + *
> > > > + * Copyright (c) 2016 Hisilicon.
> > > > + *
> > > > + * Authors:
> > > > + * Chen Feng <puck.chen@hisilicon.com>
> > > > + * Fei  Wang <w.f@huawei.com>
> > > > + *
> > > > + * This program is free software; you can redistribute it and/or modify
> > > > + * it under the terms of the GNU General Public License version 2 as
> > > > + * published by the Free Software Foundation.
> > > > + */
> > > > +
> > > > +#ifndef __HI655X_PMIC_H
> > > > +#define __HI655X_PMIC_H
> > > > +
> > > > +/* Hi655x registers are mapped to memory bus in 4 bytes stride */
> > > > +#define HI655X_STRIDE                   4
> > > > +#define HI655X_BUS_ADDR(x)              ((x) << 2)
> > > > +
> > > > +#define HI655X_BITS                     8
> > > > +
> > > > +#define HI655X_NR_IRQ                   32
> > > > +
> > > > +#define HI655X_IRQ_STAT_BASE            (0x003 << 2)
> > > > +#define HI655X_IRQ_MASK_BASE            (0x007 << 2)
> > > > +#define HI655X_ANA_IRQM_BASE            (0x1b5 << 2)
> > > > +#define HI655X_IRQ_ARRAY                4
> > > > +#define HI655X_IRQ_MASK                 0xFF
> > > > +#define HI655X_IRQ_CLR                  0xFF
> > > > +#define HI655X_VER_REG                  0x00
> > > > +
> > > > +#define PMU_VER_START                   0x10
> > > > +#define PMU_VER_END                     0x38
> > > > +
> > > > +#define RESERVE_INT                     BIT(7)
> > > > +#define PWRON_D20R_INT                  BIT(6)
> > > > +#define PWRON_D20F_INT                  BIT(5)
> > > > +#define PWRON_D4SR_INT                  BIT(4)
> > > > +#define VSYS_6P0_D200UR_INT             BIT(3)
> > > > +#define VSYS_UV_D3R_INT                 BIT(2)
> > > > +#define VSYS_2P5_R_INT                  BIT(1)
> > > > +#define OTMP_D1R_INT                    BIT(0)
> > > > +
> > > > +struct hi655x_pmic {
> > > > +     struct resource *res;
> > > > +     struct device *dev;
> > > > +     struct regmap *regmap;
> > > > +     int gpio;
> > > > +     unsigned int ver;
> > > > +     struct regmap_irq_chip_data *irq_data;
> > > > +};
> > > > +
> > > > +#endif
> > >
> > >
> > > .
> > >
> > >
> > >
> > >
>
> --
> Lee Jones
> Linaro STMicroelectronics Landing Team Lead
> Linaro.org │ Open source software for ARM SoCs
> Follow Linaro: Facebook | Twitter | Blog

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

end of thread, other threads:[~2016-05-18  3:14 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-02-14  6:29 [PATCH v8 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core Chen Feng
2016-02-14  6:29 ` [PATCH v8 1/5] mfd: hi655x: Add document for mfd hi665x PMIC Chen Feng
2016-02-15  8:32   ` Lee Jones
2016-02-16  1:21     ` Chen Feng
2016-02-27  8:36       ` Wei Xu
2016-04-11 10:40   ` Lee Jones
2016-02-14  6:29 ` [PATCH v8 2/5] regulator: hi655x: Document for hi655x regulator Chen Feng
2016-02-14  6:29 ` [PATCH v8 3/5] mfd: hi655x: Add MFD driver for hi655x Chen Feng
2016-04-11 10:41   ` Lee Jones
     [not found]     ` <570D982C.6090307@hisilicon.com>
2016-04-19  3:25       ` Guodong Xu
2016-04-19  6:53         ` Lee Jones
2016-04-19  6:57           ` Guodong Xu
2016-05-18  3:14           ` Guodong Xu
2016-02-14  6:29 ` [PATCH v8 4/5] regulator: hi655x: enable regulator for hi655x PMIC Chen Feng
2016-02-14  6:29 ` [PATCH v8 5/5] arm64: dts: hisilicon: Add hi655x pmic dts node Chen Feng
2016-04-11  8:14 ` [PATCH v8 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core Lee Jones
2016-04-11  8:41   ` Chen Feng

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).