All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core
@ 2016-01-04 12:27 Chen Feng
  2016-01-04 12:27 ` [PATCH v4 1/5] doc: bindings: Add document for mfd hi665x PMIC Chen Feng
                   ` (4 more replies)
  0 siblings, 5 replies; 13+ messages in thread
From: Chen Feng @ 2016-01-04 12:27 UTC (permalink / raw)
  To: lee.jones, lgirdwood, broonie, linux-kernel, puck.chen,
	yudongbin, saberlily.xia, suzhuangluan, kong.kongxinwei,
	xuyiping, z.liuxinliang, puck.chenfeng, weidong2, w.f
  Cc: qijiwen, peter.panshilin, dan.zhao, linuxarm, liguozhu,
	shimingxing, albert.lubing, oliver.fu, haojian.zhuang

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.

Chen Feng (5):
  doc: bindings: Add document for mfd hi665x PMIC
  doc: bindings: Document for hi655x regulator driver
  mfd: hi655x: Add hi665x pmic driver
  regulator: add regulator driver of hi655x pmic
  hisilicon/dts: Add hi655x pmic dts node

 .../devicetree/bindings/mfd/hisilicon,hi655x.txt   |  17 ++
 .../regulator/hisilicon,hi655x-regulator.txt       |  24 +++
 arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts     |   5 +
 arch/arm64/boot/dts/hisilicon/hi6220.dtsi          |  99 +++++++++
 drivers/mfd/Kconfig                                |  10 +
 drivers/mfd/Makefile                               |   1 +
 drivers/mfd/hi655x-pmic.c                          | 160 ++++++++++++++
 drivers/regulator/Kconfig                          |   8 +
 drivers/regulator/Makefile                         |   1 +
 drivers/regulator/hi655x-regulator.c               | 232 +++++++++++++++++++++
 include/linux/mfd/hi655x-pmic.h                    |  56 +++++
 11 files changed, 613 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] 13+ messages in thread

* [PATCH v4 1/5] doc: bindings: Add document for mfd hi665x PMIC
  2016-01-04 12:27 [PATCH v4 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core Chen Feng
@ 2016-01-04 12:27 ` Chen Feng
  2016-01-04 12:27 ` [PATCH v4 2/5] doc: bindings: Document for hi655x regulator driver Chen Feng
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 13+ messages in thread
From: Chen Feng @ 2016-01-04 12:27 UTC (permalink / raw)
  To: lee.jones, lgirdwood, broonie, linux-kernel, puck.chen,
	yudongbin, saberlily.xia, suzhuangluan, kong.kongxinwei,
	xuyiping, z.liuxinliang, puck.chenfeng, weidong2, w.f
  Cc: qijiwen, peter.panshilin, dan.zhao, linuxarm, liguozhu,
	shimingxing, albert.lubing, oliver.fu, haojian.zhuang

Add document for mfd driver hi655x pmic driver

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>
---
 .../devicetree/bindings/mfd/hisilicon,hi655x.txt        | 17 +++++++++++++++++
 1 file changed, 17 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..9479619
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/hisilicon,hi655x.txt
@@ -0,0 +1,17 @@
+Hisilicon hi655x Power Management Integrated Circuit (PMIC)
+
+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-driver";
+		reg = <0x0 0xf8000000 0x0 0x1000>;
+		#interrupt-cells = <2>;
+		interrupt-controller;
+		pmic-gpios = <&gpio1 2 0>;
+		status = "disabled";
+	}
-- 
1.9.1


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

* [PATCH v4 2/5] doc: bindings: Document for hi655x regulator driver
  2016-01-04 12:27 [PATCH v4 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core Chen Feng
  2016-01-04 12:27 ` [PATCH v4 1/5] doc: bindings: Add document for mfd hi665x PMIC Chen Feng
@ 2016-01-04 12:27 ` Chen Feng
  2016-01-05 15:47   ` Mark Brown
  2016-01-04 12:27 ` [PATCH v4 3/5] mfd: hi655x: Add hi665x pmic driver Chen Feng
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 13+ messages in thread
From: Chen Feng @ 2016-01-04 12:27 UTC (permalink / raw)
  To: lee.jones, lgirdwood, broonie, linux-kernel, puck.chen,
	yudongbin, saberlily.xia, suzhuangluan, kong.kongxinwei,
	xuyiping, z.liuxinliang, puck.chenfeng, weidong2, w.f
  Cc: qijiwen, peter.panshilin, dan.zhao, linuxarm, liguozhu,
	shimingxing, albert.lubing, oliver.fu, haojian.zhuang

Add Document for hi655x pmic regulator driver

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>
---
 .../regulator/hisilicon,hi655x-regulator.txt       | 24 ++++++++++++++++++++++
 1 file changed, 24 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..1cf71a0
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/hisilicon,hi655x-regulator.txt
@@ -0,0 +1,24 @@
+Hisilicon Hi655x Voltage regulators
+
+Note:
+The hi655x regulator control is managed by hi655x Power IC.
+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.
+
+Example:
+        pmic: pmic@f8000000 {
+                compatible = "hisilicon,hi655x-pmic";
+		...
+		ldo2: ldo2@a21 {
+			compatible = "hisilicon,hi655x-regulator";
+			regulator-name = "ldo2";
+			regulator-min-microvolt = <2500000>;
+			regulator-max-microvolt = <3200000>;
+			regulator-valid-modes-mask = <0x02>;
+			regulator-enable-ramp-delay = <120>;
+		};
+		...
+	}
-- 
1.9.1


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

* [PATCH v4 3/5] mfd: hi655x: Add hi665x pmic driver
  2016-01-04 12:27 [PATCH v4 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core Chen Feng
  2016-01-04 12:27 ` [PATCH v4 1/5] doc: bindings: Add document for mfd hi665x PMIC Chen Feng
  2016-01-04 12:27 ` [PATCH v4 2/5] doc: bindings: Document for hi655x regulator driver Chen Feng
@ 2016-01-04 12:27 ` Chen Feng
  2016-01-04 18:45   ` kbuild test robot
  2016-01-04 20:02   ` kbuild test robot
  2016-01-04 12:27 ` [PATCH v4 4/5] regulator: add regulator driver of hi655x pmic Chen Feng
  2016-01-04 12:27 ` [PATCH v4 5/5] hisilicon/dts: Add hi655x pmic dts node Chen Feng
  4 siblings, 2 replies; 13+ messages in thread
From: Chen Feng @ 2016-01-04 12:27 UTC (permalink / raw)
  To: lee.jones, lgirdwood, broonie, linux-kernel, puck.chen,
	yudongbin, saberlily.xia, suzhuangluan, kong.kongxinwei,
	xuyiping, z.liuxinliang, puck.chenfeng, weidong2, w.f
  Cc: qijiwen, peter.panshilin, dan.zhao, linuxarm, liguozhu,
	shimingxing, albert.lubing, oliver.fu, haojian.zhuang

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>
---
 drivers/mfd/Kconfig             |  10 +++
 drivers/mfd/Makefile            |   1 +
 drivers/mfd/hi655x-pmic.c       | 160 ++++++++++++++++++++++++++++++++++++++++
 include/linux/mfd/hi655x-pmic.h |  56 ++++++++++++++
 4 files changed, 227 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 4d92df6..0c84186 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 a8b76b8..6a7b0e1 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -186,6 +186,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..fa50aba
--- /dev/null
+++ b/drivers/mfd/hi655x-pmic.c
@@ -0,0 +1,160 @@
+/*
+ * Device driver for regulators in hi655x IC
+ *
+ * Copyright (c) 2016 Hisilicon.
+ *
+ * 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/io.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/gpio.h>
+#include <linux/of_gpio.h>
+#include <linux/platform_device.h>
+#include <linux/of_platform.h>
+#include <linux/mfd/hi655x-pmic.h>
+#include <linux/regmap.h>
+
+static const struct of_device_id of_hi655x_pmic_child_match_tbl[] = {
+	{ .compatible = "hisilicon,hi655x-regulator", },
+	{},
+};
+
+static const struct of_device_id of_hi655x_pmic_match_tbl[] = {
+	{ .compatible = "hisilicon,hi655x-pmic", },
+	{},
+};
+
+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 unsigned int hi655x_pmic_get_version(struct hi655x_pmic *pmic)
+{
+	u32 val;
+
+	regmap_read(pmic->regmap,
+		    HI655X_BUS_ADDR(HI655X_VER_REG), &val);
+
+	return val;
+}
+
+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);
+	pmic->dev = dev;
+
+	pmic->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!pmic->res) {
+		dev_err(dev, "platform_get_resource err\n");
+		return -ENOENT;
+	}
+	base = devm_ioremap_resource(dev, pmic->res);
+	if (!base) {
+		dev_err(dev, "cannot map register memory\n");
+		return -ENOMEM;
+	}
+	pmic->regmap = devm_regmap_init_mmio_clk(dev, NULL, base,
+						 &hi655x_regmap_config);
+
+	pmic->ver = hi655x_pmic_get_version(pmic);
+	if ((pmic->ver < PMU_VER_START) || (pmic->ver > PMU_VER_END)) {
+		dev_warn(dev, "it is wrong pmu version\n");
+		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, "cannot 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, "add pmic irq chip error! ret %d\n", ret);
+		return ret;
+	}
+
+	/* bind pmic to device */
+	platform_set_drvdata(pdev, pmic);
+
+	/* populate sub nodes */
+	ret = of_platform_populate(np, of_hi655x_pmic_child_match_tbl,
+				   NULL, dev);
+	if (ret) {
+		regmap_del_irq_chip(pmic->irq, pmic->irq_data);
+		return ret;
+	}
+
+	return 0;
+}
+
+static struct platform_driver hi655x_pmic_driver = {
+	.driver	= {
+		.name =	"hi655x-pmic",
+		.of_match_table = of_hi655x_pmic_match_tbl,
+	},
+	.probe  = hi655x_pmic_probe,
+};
+module_platform_driver(hi655x_pmic_driver);
+
+MODULE_AUTHOR("Chen Feng <puck.chen@hisilicon.com>");
+MODULE_DESCRIPTION("Hisi 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..e1af0a1
--- /dev/null
+++ b/include/linux/mfd/hi655x-pmic.h
@@ -0,0 +1,56 @@
+/*
+ * Device driver for regulators in hi655x IC
+ *
+ * Copyright (c) 2016 Hisilicon.
+ *
+ * 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;
+	struct clk *clk;
+	int irq;
+	int gpio;
+	unsigned int ver;
+	struct regmap_irq_chip_data *irq_data;
+};
+
+#endif
-- 
1.9.1


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

* [PATCH v4 4/5] regulator: add regulator driver of hi655x pmic
  2016-01-04 12:27 [PATCH v4 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core Chen Feng
                   ` (2 preceding siblings ...)
  2016-01-04 12:27 ` [PATCH v4 3/5] mfd: hi655x: Add hi665x pmic driver Chen Feng
@ 2016-01-04 12:27 ` Chen Feng
  2016-01-05 15:44   ` Mark Brown
  2016-01-04 12:27 ` [PATCH v4 5/5] hisilicon/dts: Add hi655x pmic dts node Chen Feng
  4 siblings, 1 reply; 13+ messages in thread
From: Chen Feng @ 2016-01-04 12:27 UTC (permalink / raw)
  To: lee.jones, lgirdwood, broonie, linux-kernel, puck.chen,
	yudongbin, saberlily.xia, suzhuangluan, kong.kongxinwei,
	xuyiping, z.liuxinliang, puck.chenfeng, weidong2, w.f
  Cc: qijiwen, peter.panshilin, dan.zhao, linuxarm, liguozhu,
	shimingxing, albert.lubing, oliver.fu, haojian.zhuang

Add regulator support 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>
---
 drivers/regulator/Kconfig            |   8 ++
 drivers/regulator/Makefile           |   1 +
 drivers/regulator/hi655x-regulator.c | 232 +++++++++++++++++++++++++++++++++++
 3 files changed, 241 insertions(+)
 create mode 100644 drivers/regulator/hi655x-regulator.c

diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 8df0b0e..2e9eaa7 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 0f81749..8e4db96 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_LP3971) += lp3971.o
diff --git a/drivers/regulator/hi655x-regulator.c b/drivers/regulator/hi655x-regulator.c
new file mode 100644
index 0000000..47161e6
--- /dev/null
+++ b/drivers/regulator/hi655x-regulator.c
@@ -0,0 +1,232 @@
+/*
+ * Device driver for regulators in hi655x IC
+ *
+ * Copyright (c) 2016 Hisilicon.
+ *
+ * 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_mask;
+	struct regulator_desc rdesc;
+};
+
+/*LDO 2 & LDO 14*/
+static const unsigned int ldo2_voltages[] = {
+	2500000, 2600000, 2700000, 2800000,
+	2900000, 3000000, 3100000, 3200000,
+};
+
+/*LDO7 & LDO10*/
+static const unsigned int ldo7_voltages[] = {
+	1800000, 1850000, 2850000, 2900000,
+	3000000, 3100000, 3200000, 3300000,
+};
+
+/*LDO13 & LDO15*/
+static const unsigned int ldo13_voltages[] = {
+	1600000, 1650000, 1700000, 1750000,
+	1800000, 1850000, 1900000, 1950000,
+};
+
+static const unsigned int ldo17_voltages[] = {
+	2500000, 2600000, 2700000, 2800000,
+	2900000, 3000000, 3100000, 3200000,
+};
+
+static const unsigned int ldo19_voltages[] = {
+	1800000, 1850000, 1900000, 1750000,
+	2800000, 2850000, 2900000, 3000000,
+};
+
+static const unsigned int ldo21_voltages[] = {
+	1650000, 1700000, 1750000, 1800000,
+	1850000, 1900000, 1950000, 2000000,
+};
+
+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,
+};
+
+#define HI655X_LDO(_id, vreg, vmask, ereg, dreg,                        \
+		   sreg, cmask, vtable) {                               \
+		.rdesc = {                                              \
+			.name           = #_id,                         \
+			.ops            = &hi655x_regulator_ops,        \
+			.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    = cmask,                        \
+		},                                                      \
+		.disable_reg = HI655X_BUS_ADDR(dreg),                   \
+		.status_reg = HI655X_BUS_ADDR(sreg),                    \
+		.ctrl_mask = cmask,                                     \
+	}
+
+static struct hi655x_regulator regulators[] = {
+	HI655X_LDO(ldo2, 0x72, 0x07, 0x29, 0x2a, 0x2b, 0x01, ldo2_voltages),
+	HI655X_LDO(ldo7, 0x78, 0x07, 0x29, 0x2a, 0x2b, 0x06, ldo7_voltages),
+	HI655X_LDO(ldo10, 0x78, 0x07, 0x29, 0x2a, 0x2b, 0x01, ldo7_voltages),
+	HI655X_LDO(ldo13, 0x7e, 0x07, 0x2c, 0x2d, 0x2e, 0x04, ldo13_voltages),
+	HI655X_LDO(ldo14, 0x7f, 0x07, 0x2c, 0x2d, 0x2e, 0x05, ldo2_voltages),
+	HI655X_LDO(ldo15, 0x80, 0x07, 0x2c, 0x2d, 0x2e, 0x06, ldo13_voltages),
+	HI655X_LDO(ldo17, 0x82, 0x07, 0x2f, 0x30, 0x31, 0x00, ldo17_voltages),
+	HI655X_LDO(ldo19, 0x84, 0x07, 0x2f, 0x30, 0x31, 0x02, ldo19_voltages),
+	HI655X_LDO(ldo21, 0x86, 0x07, 0x2f, 0x30, 0x31, 0x04, ldo21_voltages),
+	HI655X_LDO(ldo22, 0x87, 0x07, 0x2f, 0x30, 0x31, 0x05, ldo22_voltages),
+};
+
+static const struct of_device_id of_hi655x_regulator_match_tbl[] = {
+	{
+		.compatible = "hisilicon,hi655x-regulator",
+	},
+};
+MODULE_DEVICE_TABLE(of, of_hi655x_regulator_match_tbl);
+
+static int hi655x_regulator_probe(struct platform_device *pdev)
+{
+	unsigned int i;
+	struct regulator_dev *rdev;
+	struct hi655x_pmic *pmic;
+	struct hi655x_regulator *regulator;
+	struct regulator_init_data *init_data;
+	struct regulator_config config = { };
+	struct device *dev = &pdev->dev;
+	struct device_node *np = pdev->dev.of_node;
+
+	pmic = dev_get_drvdata(dev->parent);
+	if (!pmic) {
+		dev_err(dev, "no pmic in the regulator parent node\n");
+		return -ENODEV;
+	}
+
+	regulator = devm_kzalloc(dev, sizeof(*regulator), GFP_KERNEL);
+	if (!regulator)
+		return -ENOMEM;
+
+	for (i = 0; i < ARRAY_SIZE(regulators); i++) {
+		if (!of_node_cmp(np->name, regulators[i].rdesc.name))
+			break;
+	}
+
+	if (i == ARRAY_SIZE(regulators)) {
+		dev_err(dev, "error regulator %s int dts\n", np->name);
+		return -ENODEV;
+	}
+
+	regulator = &regulators[i];
+	init_data = of_get_regulator_init_data(dev, np,
+					       &regulator->rdesc);
+	if (!init_data)
+		return -EINVAL;
+
+	config.dev = dev;
+	config.init_data = init_data;
+	config.driver_data = regulator;
+	config.regmap = pmic->regmap;
+	config.of_node = pdev->dev.of_node;
+
+	rdev = devm_regulator_register(dev, &regulator->rdesc,
+				       &config);
+	if (IS_ERR(rdev))
+		return PTR_ERR(rdev);
+
+	platform_set_drvdata(pdev, regulator);
+
+	return 0;
+}
+
+static struct platform_driver hi655x_regulator_driver = {
+	.driver = {
+		.name	= "hi655x-regulator",
+		.of_match_table = of_hi655x_regulator_match_tbl,
+	},
+	.probe	= hi655x_regulator_probe,
+};
+module_platform_driver(hi655x_regulator_driver);
+
+MODULE_AUTHOR("Chen Feng <puck.chen@hisilicon.com>");
+MODULE_DESCRIPTION("Hisi hi655x PMIC driver");
+MODULE_LICENSE("GPL v2");
-- 
1.9.1


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

* [PATCH v4 5/5] hisilicon/dts: Add hi655x pmic dts node
  2016-01-04 12:27 [PATCH v4 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core Chen Feng
                   ` (3 preceding siblings ...)
  2016-01-04 12:27 ` [PATCH v4 4/5] regulator: add regulator driver of hi655x pmic Chen Feng
@ 2016-01-04 12:27 ` Chen Feng
  4 siblings, 0 replies; 13+ messages in thread
From: Chen Feng @ 2016-01-04 12:27 UTC (permalink / raw)
  To: lee.jones, lgirdwood, broonie, linux-kernel, puck.chen,
	yudongbin, saberlily.xia, suzhuangluan, kong.kongxinwei,
	xuyiping, z.liuxinliang, puck.chenfeng, weidong2, w.f
  Cc: qijiwen, peter.panshilin, dan.zhao, linuxarm, liguozhu,
	shimingxing, albert.lubing, oliver.fu, haojian.zhuang

Add the mfd hi655x dts node and regulator support

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>
---
 arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts |  5 ++
 arch/arm64/boot/dts/hisilicon/hi6220.dtsi      | 99 ++++++++++++++++++++++++++
 2 files changed, 104 insertions(+)

diff --git a/arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts b/arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts
index 8d43a0f..f714ac7 100644
--- a/arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts
+++ b/arch/arm64/boot/dts/hisilicon/hi6220-hikey.dts
@@ -31,4 +31,9 @@
 		device_type = "memory";
 		reg = <0x0 0x0 0x0 0x40000000>;
 	};
+
+};
+
+&pmic {
+	status = "okay";
 };
diff --git a/arch/arm64/boot/dts/hisilicon/hi6220.dtsi b/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
index 82d2488..48966a5 100644
--- a/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
+++ b/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
@@ -208,5 +208,104 @@
 			clock-names = "uartclk", "apb_pclk";
 			status = "disabled";
 		};
+
+		pmic: pmic@f8000000 {
+			compatible = "hisilicon,hi655x-pmic";
+			reg = <0x0 0xf8000000 0x0 0x1000>;
+			#interrupt-cells = <2>;
+			interrupt-controller;
+			pmic-gpios = <&gpio1 2 0>;
+			status = "disabled";
+
+			ldo2: ldo2@a21 {
+				compatible = "hisilicon,hi655x-regulator";
+				regulator-name = "ldo2";
+				regulator-min-microvolt = <2500000>;
+				regulator-max-microvolt = <3200000>;
+				regulator-valid-modes-mask = <0x02>;
+				regulator-enable-ramp-delay = <120>;
+			};
+
+			ldo7: ldo7@a26 {
+				compatible = "hisilicon,hi655x-regulator";
+				regulator-name = "ldo7";
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <3300000>;
+				regulator-valid-modes-mask = <0x0a>;
+				regulator-enable-ramp-delay = <120>;
+			};
+
+			ldo10: ldo10@a29 {
+				compatible = "hisilicon,hi655x-regulator";
+				regulator-name = "ldo10";
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <3000000>;
+				regulator-valid-modes-mask = <0x0a>;
+				regulator-enable-ramp-delay = <360>;
+			};
+
+			ldo13: ldo13@a32 {
+				compatible = "hisilicon,hi655x-regulator";
+				regulator-name = "ldo13";
+				regulator-min-microvolt = <1600000>;
+				regulator-max-microvolt = <1950000>;
+				regulator-enable-ramp-delay = <120>;
+			};
+
+			ldo14: ldo14@a33 {
+				compatible = "hisilicon,hi655x-regulator";
+				regulator-name = "ldo14";
+				regulator-min-microvolt = <2500000>;
+				regulator-max-microvolt = <3200000>;
+				regulator-enable-ramp-delay = <120>;
+			};
+
+			ldo15: ldo15@a34 {
+				compatible = "hisilicon,hi655x-regulator";
+				regulator-name = "ldo15";
+				regulator-min-microvolt = <1600000>;
+				regulator-max-microvolt = <1950000>;
+				regulator-boot-on;
+				regulator-always-on;
+				regulator-enable-ramp-delay = <120>;
+			};
+
+			ldo17: ldo17@a36 {
+				compatible = "hisilicon,hi655x-regulator";
+				regulator-name = "ldo17";
+				regulator-min-microvolt = <2500000>;
+				regulator-max-microvolt = <3200000>;
+				regulator-enable-ramp-delay = <120>;
+			};
+
+			ldo19: ldo19@a38 {
+				compatible = "hisilicon,hi655x-regulator";
+				regulator-name = "ldo19";
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <3000000>;
+				regulator-enable-ramp-delay = <360>;
+			};
+
+			ldo21: ldo21@a40 {
+				compatible = "hisilicon,hi655x-regulator";
+				regulator-name = "ldo21";
+				regulator-min-microvolt = <1650000>;
+				regulator-max-microvolt = <2000000>;
+				regulator-always-on;
+				regulator-valid-modes-mask = <0x02>;
+				regulator-enable-ramp-delay = <120>;
+			};
+
+			ldo22: ldo22@a41 {
+				compatible = "hisilicon,hi655x-regulator";
+				regulator-name = "ldo22";
+				regulator-min-microvolt = <900000>;
+				regulator-max-microvolt = <1200000>;
+				regulator-boot-on;
+				regulator-always-on;
+				regulator-valid-modes-mask = <0x02>;
+				regulator-enable-ramp-delay = <120>;
+			       };
+		};
 	};
 };
-- 
1.9.1


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

* Re: [PATCH v4 3/5] mfd: hi655x: Add hi665x pmic driver
  2016-01-04 12:27 ` [PATCH v4 3/5] mfd: hi655x: Add hi665x pmic driver Chen Feng
@ 2016-01-04 18:45   ` kbuild test robot
  2016-01-04 20:02   ` kbuild test robot
  1 sibling, 0 replies; 13+ messages in thread
From: kbuild test robot @ 2016-01-04 18:45 UTC (permalink / raw)
  To: Chen Feng
  Cc: kbuild-all, lee.jones, lgirdwood, broonie, linux-kernel,
	puck.chen, yudongbin, saberlily.xia, suzhuangluan,
	kong.kongxinwei, xuyiping, z.liuxinliang, puck.chenfeng,
	weidong2, w.f, qijiwen, peter.panshilin, dan.zhao, linuxarm,
	liguozhu, shimingxing, albert.lubing, oliver.fu, haojian.zhuang

[-- Attachment #1: Type: text/plain, Size: 2437 bytes --]

Hi Chen,

[auto build test ERROR on v4.4-rc8]
[also build test ERROR on next-20160104]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Chen-Feng/Add-Support-for-Hi6220-PMIC-Hi6553-MFD-Core/20160104-203635
config: tile-allmodconfig (attached as .config)
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=tile 

All error/warnings (new ones prefixed by >>):

>> drivers/mfd/hi655x-pmic.c:156:1: warning: data definition has no type or storage class [enabled by default]
>> drivers/mfd/hi655x-pmic.c:156:1: error: type defaults to 'int' in declaration of 'module_init'
>> drivers/mfd/hi655x-pmic.c:156:1: warning: parameter names (without types) in function declaration [enabled by default]
>> drivers/mfd/hi655x-pmic.c:156:1: warning: data definition has no type or storage class [enabled by default]
>> drivers/mfd/hi655x-pmic.c:156:1: error: type defaults to 'int' in declaration of 'module_exit'
>> drivers/mfd/hi655x-pmic.c:156:1: warning: parameter names (without types) in function declaration [enabled by default]
>> drivers/mfd/hi655x-pmic.c:158:15: error: expected declaration specifiers or '...' before string constant
   drivers/mfd/hi655x-pmic.c:159:20: error: expected declaration specifiers or '...' before string constant
   drivers/mfd/hi655x-pmic.c:160:16: error: expected declaration specifiers or '...' before string constant
   drivers/mfd/hi655x-pmic.c:156:1: warning: 'hi655x_pmic_driver_init' defined but not used
   drivers/mfd/hi655x-pmic.c:156:1: warning: 'hi655x_pmic_driver_exit' defined but not used
   cc1: some warnings being treated as errors

vim +156 drivers/mfd/hi655x-pmic.c

   150		.driver	= {
   151			.name =	"hi655x-pmic",
   152			.of_match_table = of_hi655x_pmic_match_tbl,
   153		},
   154		.probe  = hi655x_pmic_probe,
   155	};
 > 156	module_platform_driver(hi655x_pmic_driver);
   157	
 > 158	MODULE_AUTHOR("Chen Feng <puck.chen@hisilicon.com>");
   159	MODULE_DESCRIPTION("Hisi hi655x pmic driver");
   160	MODULE_LICENSE("GPL v2");

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 42142 bytes --]

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

* Re: [PATCH v4 3/5] mfd: hi655x: Add hi665x pmic driver
  2016-01-04 12:27 ` [PATCH v4 3/5] mfd: hi655x: Add hi665x pmic driver Chen Feng
  2016-01-04 18:45   ` kbuild test robot
@ 2016-01-04 20:02   ` kbuild test robot
  2016-01-11  5:49     ` Lee Jones
  1 sibling, 1 reply; 13+ messages in thread
From: kbuild test robot @ 2016-01-04 20:02 UTC (permalink / raw)
  To: Chen Feng
  Cc: kbuild-all, lee.jones, lgirdwood, broonie, linux-kernel,
	puck.chen, yudongbin, saberlily.xia, suzhuangluan,
	kong.kongxinwei, xuyiping, z.liuxinliang, puck.chenfeng,
	weidong2, w.f, qijiwen, peter.panshilin, dan.zhao, linuxarm,
	liguozhu, shimingxing, albert.lubing, oliver.fu, haojian.zhuang

[-- Attachment #1: Type: text/plain, Size: 9568 bytes --]

Hi Chen,

[auto build test WARNING on v4.4-rc8]
[also build test WARNING on next-20160104]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Chen-Feng/Add-Support-for-Hi6220-PMIC-Hi6553-MFD-Core/20160104-203635
config: parisc-allmodconfig (attached as .config)
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=parisc 

All warnings (new ones prefixed by >>):

   In file included from include/linux/platform_device.h:14:0,
                    from drivers/mfd/hi655x-pmic.c:19:
   include/linux/device.h:1329:1: warning: data definition has no type or storage class
    module_init(__driver##_init); \
    ^
   include/linux/platform_device.h:222:2: note: in expansion of macro 'module_driver'
     module_driver(__platform_driver, platform_driver_register, \
     ^
>> drivers/mfd/hi655x-pmic.c:156:1: note: in expansion of macro 'module_platform_driver'
    module_platform_driver(hi655x_pmic_driver);
    ^
   include/linux/device.h:1329:1: error: type defaults to 'int' in declaration of 'module_init' [-Werror=implicit-int]
    module_init(__driver##_init); \
    ^
   include/linux/platform_device.h:222:2: note: in expansion of macro 'module_driver'
     module_driver(__platform_driver, platform_driver_register, \
     ^
>> drivers/mfd/hi655x-pmic.c:156:1: note: in expansion of macro 'module_platform_driver'
    module_platform_driver(hi655x_pmic_driver);
    ^
   drivers/mfd/hi655x-pmic.c:156:1: warning: parameter names (without types) in function declaration
   In file included from include/linux/platform_device.h:14:0,
                    from drivers/mfd/hi655x-pmic.c:19:
   include/linux/device.h:1334:1: warning: data definition has no type or storage class
    module_exit(__driver##_exit);
    ^
   include/linux/platform_device.h:222:2: note: in expansion of macro 'module_driver'
     module_driver(__platform_driver, platform_driver_register, \
     ^
>> drivers/mfd/hi655x-pmic.c:156:1: note: in expansion of macro 'module_platform_driver'
    module_platform_driver(hi655x_pmic_driver);
    ^
   include/linux/device.h:1334:1: error: type defaults to 'int' in declaration of 'module_exit' [-Werror=implicit-int]
    module_exit(__driver##_exit);
    ^
   include/linux/platform_device.h:222:2: note: in expansion of macro 'module_driver'
     module_driver(__platform_driver, platform_driver_register, \
     ^
>> drivers/mfd/hi655x-pmic.c:156:1: note: in expansion of macro 'module_platform_driver'
    module_platform_driver(hi655x_pmic_driver);
    ^
   drivers/mfd/hi655x-pmic.c:156:1: warning: parameter names (without types) in function declaration
   drivers/mfd/hi655x-pmic.c:158:15: error: expected declaration specifiers or '...' before string constant
    MODULE_AUTHOR("Chen Feng <puck.chen@hisilicon.com>");
                  ^
   drivers/mfd/hi655x-pmic.c:159:20: error: expected declaration specifiers or '...' before string constant
    MODULE_DESCRIPTION("Hisi hi655x pmic driver");
                       ^
   drivers/mfd/hi655x-pmic.c:160:16: error: expected declaration specifiers or '...' before string constant
    MODULE_LICENSE("GPL v2");
                   ^
   In file included from include/linux/platform_device.h:14:0,
                    from drivers/mfd/hi655x-pmic.c:19:
   drivers/mfd/hi655x-pmic.c:156:24: warning: 'hi655x_pmic_driver_init' defined but not used [-Wunused-function]
    module_platform_driver(hi655x_pmic_driver);
                           ^
   include/linux/device.h:1325:19: note: in definition of macro 'module_driver'
    static int __init __driver##_init(void) \
                      ^
>> drivers/mfd/hi655x-pmic.c:156:1: note: in expansion of macro 'module_platform_driver'
    module_platform_driver(hi655x_pmic_driver);
    ^
   drivers/mfd/hi655x-pmic.c:156:24: warning: 'hi655x_pmic_driver_exit' defined but not used [-Wunused-function]
    module_platform_driver(hi655x_pmic_driver);
                           ^
   include/linux/device.h:1330:20: note: in definition of macro 'module_driver'
    static void __exit __driver##_exit(void) \
                       ^
>> drivers/mfd/hi655x-pmic.c:156:1: note: in expansion of macro 'module_platform_driver'
    module_platform_driver(hi655x_pmic_driver);
    ^
   cc1: some warnings being treated as errors

vim +/module_platform_driver +156 drivers/mfd/hi655x-pmic.c

    13	
    14	#include <linux/io.h>
    15	#include <linux/interrupt.h>
    16	#include <linux/init.h>
    17	#include <linux/gpio.h>
    18	#include <linux/of_gpio.h>
  > 19	#include <linux/platform_device.h>
    20	#include <linux/of_platform.h>
    21	#include <linux/mfd/hi655x-pmic.h>
    22	#include <linux/regmap.h>
    23	
    24	static const struct of_device_id of_hi655x_pmic_child_match_tbl[] = {
    25		{ .compatible = "hisilicon,hi655x-regulator", },
    26		{},
    27	};
    28	
    29	static const struct of_device_id of_hi655x_pmic_match_tbl[] = {
    30		{ .compatible = "hisilicon,hi655x-pmic", },
    31		{},
    32	};
    33	
    34	static const struct regmap_irq hi655x_irqs[] = {
    35		{ .reg_offset = 0, .mask = OTMP_D1R_INT },
    36		{ .reg_offset = 0, .mask = VSYS_2P5_R_INT },
    37		{ .reg_offset = 0, .mask = VSYS_UV_D3R_INT },
    38		{ .reg_offset = 0, .mask = VSYS_6P0_D200UR_INT },
    39		{ .reg_offset = 0, .mask = PWRON_D4SR_INT },
    40		{ .reg_offset = 0, .mask = PWRON_D20F_INT },
    41		{ .reg_offset = 0, .mask = PWRON_D20R_INT },
    42		{ .reg_offset = 0, .mask = RESERVE_INT },
    43	};
    44	
    45	static const struct regmap_irq_chip hi655x_irq_chip = {
    46		.name = "hi655x-pmic",
    47		.irqs = hi655x_irqs,
    48		.num_regs = 1,
    49		.num_irqs = ARRAY_SIZE(hi655x_irqs),
    50		.status_base = HI655X_IRQ_STAT_BASE,
    51		.mask_base = HI655X_IRQ_MASK_BASE,
    52	};
    53	
    54	static unsigned int hi655x_pmic_get_version(struct hi655x_pmic *pmic)
    55	{
    56		u32 val;
    57	
    58		regmap_read(pmic->regmap,
    59			    HI655X_BUS_ADDR(HI655X_VER_REG), &val);
    60	
    61		return val;
    62	}
    63	
    64	static struct regmap_config hi655x_regmap_config = {
    65		.reg_bits = 32,
    66		.reg_stride = HI655X_STRIDE,
    67		.val_bits = 8,
    68		.max_register = HI655X_BUS_ADDR(0xFFF),
    69	};
    70	
    71	static void hi655x_local_irq_clear(struct regmap *map)
    72	{
    73		int i;
    74	
    75		regmap_write(map, HI655X_ANA_IRQM_BASE, HI655X_IRQ_CLR);
    76		for (i = 0; i < HI655X_IRQ_ARRAY; i++) {
    77			regmap_write(map, HI655X_IRQ_STAT_BASE + i * HI655X_STRIDE,
    78				     HI655X_IRQ_CLR);
    79		}
    80	}
    81	
    82	static int hi655x_pmic_probe(struct platform_device *pdev)
    83	{
    84		int ret;
    85		struct hi655x_pmic *pmic;
    86		struct device *dev = &pdev->dev;
    87		struct device_node *np = dev->of_node;
    88		void __iomem *base;
    89	
    90		pmic = devm_kzalloc(dev, sizeof(*pmic), GFP_KERNEL);
    91		pmic->dev = dev;
    92	
    93		pmic->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    94		if (!pmic->res) {
    95			dev_err(dev, "platform_get_resource err\n");
    96			return -ENOENT;
    97		}
    98		base = devm_ioremap_resource(dev, pmic->res);
    99		if (!base) {
   100			dev_err(dev, "cannot map register memory\n");
   101			return -ENOMEM;
   102		}
   103		pmic->regmap = devm_regmap_init_mmio_clk(dev, NULL, base,
   104							 &hi655x_regmap_config);
   105	
   106		pmic->ver = hi655x_pmic_get_version(pmic);
   107		if ((pmic->ver < PMU_VER_START) || (pmic->ver > PMU_VER_END)) {
   108			dev_warn(dev, "it is wrong pmu version\n");
   109			return -EINVAL;
   110		}
   111	
   112		hi655x_local_irq_clear(pmic->regmap);
   113	
   114		pmic->gpio = of_get_named_gpio(np, "pmic-gpios", 0);
   115		if (!gpio_is_valid(pmic->gpio)) {
   116			dev_err(dev, "cannot get the pmic-gpios\n");
   117			return -ENODEV;
   118		}
   119	
   120		ret = devm_gpio_request_one(dev, pmic->gpio, GPIOF_IN, "hi655x_pmic_irq");
   121		if (ret < 0) {
   122			dev_err(dev, "failed to request gpio %d  ret = %d\n",
   123				pmic->gpio, ret);
   124			return ret;
   125		}
   126	
   127		ret = regmap_add_irq_chip(pmic->regmap, gpio_to_irq(pmic->gpio),
   128					  IRQF_TRIGGER_LOW | IRQF_NO_SUSPEND, 0,
   129					  &hi655x_irq_chip, &pmic->irq_data);
   130		if (ret) {
   131			dev_err(dev, "add pmic irq chip error! ret %d\n", ret);
   132			return ret;
   133		}
   134	
   135		/* bind pmic to device */
   136		platform_set_drvdata(pdev, pmic);
   137	
   138		/* populate sub nodes */
   139		ret = of_platform_populate(np, of_hi655x_pmic_child_match_tbl,
   140					   NULL, dev);
   141		if (ret) {
   142			regmap_del_irq_chip(pmic->irq, pmic->irq_data);
   143			return ret;
   144		}
   145	
   146		return 0;
   147	}
   148	
   149	static struct platform_driver hi655x_pmic_driver = {
   150		.driver	= {
   151			.name =	"hi655x-pmic",
   152			.of_match_table = of_hi655x_pmic_match_tbl,
   153		},
   154		.probe  = hi655x_pmic_probe,
   155	};
 > 156	module_platform_driver(hi655x_pmic_driver);
   157	
   158	MODULE_AUTHOR("Chen Feng <puck.chen@hisilicon.com>");
   159	MODULE_DESCRIPTION("Hisi hi655x pmic driver");

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 42716 bytes --]

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

* Re: [PATCH v4 4/5] regulator: add regulator driver of hi655x pmic
  2016-01-04 12:27 ` [PATCH v4 4/5] regulator: add regulator driver of hi655x pmic Chen Feng
@ 2016-01-05 15:44   ` Mark Brown
  2016-01-07  3:35     ` chenfeng
  0 siblings, 1 reply; 13+ messages in thread
From: Mark Brown @ 2016-01-05 15:44 UTC (permalink / raw)
  To: Chen Feng
  Cc: lee.jones, lgirdwood, linux-kernel, yudongbin, saberlily.xia,
	suzhuangluan, kong.kongxinwei, xuyiping, z.liuxinliang,
	puck.chenfeng, weidong2, w.f, qijiwen, peter.panshilin, dan.zhao,
	linuxarm, liguozhu, shimingxing, albert.lubing, oliver.fu,
	haojian.zhuang

[-- Attachment #1: Type: text/plain, Size: 2353 bytes --]

On Mon, Jan 04, 2016 at 08:27:51PM +0800, Chen Feng wrote:

> +/*LDO 2 & LDO 14*/

Please use the normal kernel coding style for comments, I'm surprised
checkpatch didn't warn you about this.

> +static const unsigned int ldo2_voltages[] = {
> +	2500000, 2600000, 2700000, 2800000,
> +	2900000, 3000000, 3100000, 3200000,

This looks like a linear range from 2.5V in steps of 100mV?  A linear
range is better than a table since values can be mapped directly without
having to scan a table.

> +/*LDO7 & LDO10*/
> +static const unsigned int ldo7_voltages[] = {
> +	1800000, 1850000, 2850000, 2900000,
> +	3000000, 3100000, 3200000, 3300000,

This is the sort of thing a voltage table is for where the voltages
aren't evenly spaced and don't map onto a formula.

> +static const struct of_device_id of_hi655x_regulator_match_tbl[] = {
> +	{
> +		.compatible = "hisilicon,hi655x-regulator",
> +	},
> +};
> +MODULE_DEVICE_TABLE(of, of_hi655x_regulator_match_tbl);

A couple of problems here.  One is that the compatible strings should be
for specific devices, not use a wildcard.  The other is that since this
is part of a PMIC and we already have a compatible string for the PMIC
so this is really just a set of properties for that device rather than a
totally separate device - we're not achieving any real reuse over
multiple devices or anything.

> +	for (i = 0; i < ARRAY_SIZE(regulators); i++) {
> +		if (!of_node_cmp(np->name, regulators[i].rdesc.name))
> +			break;
> +	}
> +
> +	if (i == ARRAY_SIZE(regulators)) {
> +		dev_err(dev, "error regulator %s int dts\n", np->name);
> +		return -ENODEV;
> +	}
> +
> +	regulator = &regulators[i];
> +	init_data = of_get_regulator_init_data(dev, np,
> +					       &regulator->rdesc);
> +	if (!init_data)
> +		return -EINVAL;

Don't open code this, use the standard support with of_match and
regulators_node.

> +	config.dev = dev;
> +	config.init_data = init_data;
> +	config.driver_data = regulator;
> +	config.regmap = pmic->regmap;
> +	config.of_node = pdev->dev.of_node;

> +	rdev = devm_regulator_register(dev, &regulator->rdesc,
> +				       &config);
> +	if (IS_ERR(rdev))
> +		return PTR_ERR(rdev);

Though this looks like it's trying to have a device per regulator which
is an unusual pattern and if we are doing that then relying on the node
name to figure out which device this is a bit broken.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

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

* Re: [PATCH v4 2/5] doc: bindings: Document for hi655x regulator driver
  2016-01-04 12:27 ` [PATCH v4 2/5] doc: bindings: Document for hi655x regulator driver Chen Feng
@ 2016-01-05 15:47   ` Mark Brown
  2016-01-07  3:36     ` chenfeng
  0 siblings, 1 reply; 13+ messages in thread
From: Mark Brown @ 2016-01-05 15:47 UTC (permalink / raw)
  To: Chen Feng
  Cc: lee.jones, lgirdwood, linux-kernel, yudongbin, saberlily.xia,
	suzhuangluan, kong.kongxinwei, xuyiping, z.liuxinliang,
	puck.chenfeng, weidong2, w.f, qijiwen, peter.panshilin, dan.zhao,
	linuxarm, liguozhu, shimingxing, albert.lubing, oliver.fu,
	haojian.zhuang

[-- Attachment #1: Type: text/plain, Size: 383 bytes --]

On Mon, Jan 04, 2016 at 08:27:49PM +0800, Chen Feng wrote:
> Add Document for hi655x pmic regulator driver

As indicated in the driver review this seems to be a bit of an unusual
binding that I think needs reworking, also it needs a bit more detail -
for example, listing which regulator names are valid.

Please also use subject lines reflecting the normal style for the
subsystem.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

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

* Re: [PATCH v4 4/5] regulator: add regulator driver of hi655x pmic
  2016-01-05 15:44   ` Mark Brown
@ 2016-01-07  3:35     ` chenfeng
  0 siblings, 0 replies; 13+ messages in thread
From: chenfeng @ 2016-01-07  3:35 UTC (permalink / raw)
  To: Mark Brown
  Cc: lee.jones, lgirdwood, linux-kernel, yudongbin, saberlily.xia,
	suzhuangluan, kong.kongxinwei, xuyiping, z.liuxinliang,
	puck.chenfeng, weidong2, w.f, qijiwen, peter.panshilin, dan.zhao,
	linuxarm, liguozhu, shimingxing, albert.lubing, oliver.fu,
	haojian.zhuang



On 2016/1/5 23:44, Mark Brown wrote:
> On Mon, Jan 04, 2016 at 08:27:51PM +0800, Chen Feng wrote:
> 
>> +/*LDO 2 & LDO 14*/
> 
> Please use the normal kernel coding style for comments, I'm surprised
> checkpatch didn't warn you about this.
> 
ok,thanks!
>> +static const unsigned int ldo2_voltages[] = {
>> +	2500000, 2600000, 2700000, 2800000,
>> +	2900000, 3000000, 3100000, 3200000,
> 
> This looks like a linear range from 2.5V in steps of 100mV?  A linear
> range is better than a table since values can be mapped directly without
> having to scan a table.
> 
Agree with you.

>> +/*LDO7 & LDO10*/
>> +static const unsigned int ldo7_voltages[] = {
>> +	1800000, 1850000, 2850000, 2900000,
>> +	3000000, 3100000, 3200000, 3300000,
> 
> This is the sort of thing a voltage table is for where the voltages
> aren't evenly spaced and don't map onto a formula.
> 
>> +static const struct of_device_id of_hi655x_regulator_match_tbl[] = {
>> +	{
>> +		.compatible = "hisilicon,hi655x-regulator",
>> +	},
>> +};
>> +MODULE_DEVICE_TABLE(of, of_hi655x_regulator_match_tbl);
> 
> A couple of problems here.  One is that the compatible strings should be
> for specific devices, not use a wildcard.  The other is that since this
> is part of a PMIC and we already have a compatible string for the PMIC
> so this is really just a set of properties for that device rather than a
> totally separate device - we're not achieving any real reuse over
> multiple devices or anything.
ok.
> 
>> +	for (i = 0; i < ARRAY_SIZE(regulators); i++) {
>> +		if (!of_node_cmp(np->name, regulators[i].rdesc.name))
>> +			break;
>> +	}
>> +
>> +	if (i == ARRAY_SIZE(regulators)) {
>> +		dev_err(dev, "error regulator %s int dts\n", np->name);
>> +		return -ENODEV;
>> +	}
>> +
>> +	regulator = &regulators[i];
>> +	init_data = of_get_regulator_init_data(dev, np,
>> +					       &regulator->rdesc);
>> +	if (!init_data)
>> +		return -EINVAL;
> 
> Don't open code this, use the standard support with of_match and
> regulators_node.
> 
>> +	config.dev = dev;
>> +	config.init_data = init_data;
>> +	config.driver_data = regulator;
>> +	config.regmap = pmic->regmap;
>> +	config.of_node = pdev->dev.of_node;
> 
>> +	rdev = devm_regulator_register(dev, &regulator->rdesc,
>> +				       &config);
>> +	if (IS_ERR(rdev))
>> +		return PTR_ERR(rdev);
> 
> Though this looks like it's trying to have a device per regulator which
> is an unusual pattern and if we are doing that then relying on the node
> name to figure out which device this is a bit broken.
> 
ok, I will fix the patch and resend it.


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

* Re: [PATCH v4 2/5] doc: bindings: Document for hi655x regulator driver
  2016-01-05 15:47   ` Mark Brown
@ 2016-01-07  3:36     ` chenfeng
  0 siblings, 0 replies; 13+ messages in thread
From: chenfeng @ 2016-01-07  3:36 UTC (permalink / raw)
  To: Mark Brown
  Cc: lee.jones, lgirdwood, linux-kernel, yudongbin, saberlily.xia,
	suzhuangluan, kong.kongxinwei, xuyiping, z.liuxinliang,
	puck.chenfeng, weidong2, w.f, qijiwen, peter.panshilin, dan.zhao,
	linuxarm, liguozhu, shimingxing, albert.lubing, oliver.fu,
	haojian.zhuang



On 2016/1/5 23:47, Mark Brown wrote:
> On Mon, Jan 04, 2016 at 08:27:49PM +0800, Chen Feng wrote:
>> Add Document for hi655x pmic regulator driver
> 
> As indicated in the driver review this seems to be a bit of an unusual
> binding that I think needs reworking, also it needs a bit more detail -
> for example, listing which regulator names are valid.
> 
> Please also use subject lines reflecting the normal style for the
> subsystem.
> 
OK,Thanks.


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

* Re: [PATCH v4 3/5] mfd: hi655x: Add hi665x pmic driver
  2016-01-04 20:02   ` kbuild test robot
@ 2016-01-11  5:49     ` Lee Jones
  0 siblings, 0 replies; 13+ messages in thread
From: Lee Jones @ 2016-01-11  5:49 UTC (permalink / raw)
  To: kbuild test robot
  Cc: Chen Feng, kbuild-all, lgirdwood, broonie, linux-kernel,
	yudongbin, saberlily.xia, suzhuangluan, kong.kongxinwei,
	xuyiping, z.liuxinliang, puck.chenfeng, weidong2, w.f, qijiwen,
	peter.panshilin, dan.zhao, linuxarm, liguozhu, shimingxing,
	albert.lubing, oliver.fu, haojian.zhuang

Obviously I am unable to accept (or even review) this patch until
these issues are resolved.  Please fix and resubmit the set.

On Tue, 05 Jan 2016, kbuild test robot wrote:
> [auto build test WARNING on v4.4-rc8]
> [also build test WARNING on next-20160104]
> [if your patch is applied to the wrong git tree, please drop us a note to help improving the system]
> 
> url:    https://github.com/0day-ci/linux/commits/Chen-Feng/Add-Support-for-Hi6220-PMIC-Hi6553-MFD-Core/20160104-203635
> config: parisc-allmodconfig (attached as .config)
> reproduce:
>         wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
>         chmod +x ~/bin/make.cross
>         # save the attached .config to linux build tree
>         make.cross ARCH=parisc 
> 
> All warnings (new ones prefixed by >>):
> 
>    In file included from include/linux/platform_device.h:14:0,
>                     from drivers/mfd/hi655x-pmic.c:19:
>    include/linux/device.h:1329:1: warning: data definition has no type or storage class
>     module_init(__driver##_init); \
>     ^
>    include/linux/platform_device.h:222:2: note: in expansion of macro 'module_driver'
>      module_driver(__platform_driver, platform_driver_register, \
>      ^
> >> drivers/mfd/hi655x-pmic.c:156:1: note: in expansion of macro 'module_platform_driver'
>     module_platform_driver(hi655x_pmic_driver);
>     ^
>    include/linux/device.h:1329:1: error: type defaults to 'int' in declaration of 'module_init' [-Werror=implicit-int]
>     module_init(__driver##_init); \
>     ^
>    include/linux/platform_device.h:222:2: note: in expansion of macro 'module_driver'
>      module_driver(__platform_driver, platform_driver_register, \
>      ^
> >> drivers/mfd/hi655x-pmic.c:156:1: note: in expansion of macro 'module_platform_driver'
>     module_platform_driver(hi655x_pmic_driver);
>     ^
>    drivers/mfd/hi655x-pmic.c:156:1: warning: parameter names (without types) in function declaration
>    In file included from include/linux/platform_device.h:14:0,
>                     from drivers/mfd/hi655x-pmic.c:19:
>    include/linux/device.h:1334:1: warning: data definition has no type or storage class
>     module_exit(__driver##_exit);
>     ^
>    include/linux/platform_device.h:222:2: note: in expansion of macro 'module_driver'
>      module_driver(__platform_driver, platform_driver_register, \
>      ^
> >> drivers/mfd/hi655x-pmic.c:156:1: note: in expansion of macro 'module_platform_driver'
>     module_platform_driver(hi655x_pmic_driver);
>     ^
>    include/linux/device.h:1334:1: error: type defaults to 'int' in declaration of 'module_exit' [-Werror=implicit-int]
>     module_exit(__driver##_exit);
>     ^
>    include/linux/platform_device.h:222:2: note: in expansion of macro 'module_driver'
>      module_driver(__platform_driver, platform_driver_register, \
>      ^
> >> drivers/mfd/hi655x-pmic.c:156:1: note: in expansion of macro 'module_platform_driver'
>     module_platform_driver(hi655x_pmic_driver);
>     ^
>    drivers/mfd/hi655x-pmic.c:156:1: warning: parameter names (without types) in function declaration
>    drivers/mfd/hi655x-pmic.c:158:15: error: expected declaration specifiers or '...' before string constant
>     MODULE_AUTHOR("Chen Feng <puck.chen@hisilicon.com>");
>                   ^
>    drivers/mfd/hi655x-pmic.c:159:20: error: expected declaration specifiers or '...' before string constant
>     MODULE_DESCRIPTION("Hisi hi655x pmic driver");
>                        ^
>    drivers/mfd/hi655x-pmic.c:160:16: error: expected declaration specifiers or '...' before string constant
>     MODULE_LICENSE("GPL v2");
>                    ^
>    In file included from include/linux/platform_device.h:14:0,
>                     from drivers/mfd/hi655x-pmic.c:19:
>    drivers/mfd/hi655x-pmic.c:156:24: warning: 'hi655x_pmic_driver_init' defined but not used [-Wunused-function]
>     module_platform_driver(hi655x_pmic_driver);
>                            ^
>    include/linux/device.h:1325:19: note: in definition of macro 'module_driver'
>     static int __init __driver##_init(void) \
>                       ^
> >> drivers/mfd/hi655x-pmic.c:156:1: note: in expansion of macro 'module_platform_driver'
>     module_platform_driver(hi655x_pmic_driver);
>     ^
>    drivers/mfd/hi655x-pmic.c:156:24: warning: 'hi655x_pmic_driver_exit' defined but not used [-Wunused-function]
>     module_platform_driver(hi655x_pmic_driver);
>                            ^
>    include/linux/device.h:1330:20: note: in definition of macro 'module_driver'
>     static void __exit __driver##_exit(void) \
>                        ^
> >> drivers/mfd/hi655x-pmic.c:156:1: note: in expansion of macro 'module_platform_driver'
>     module_platform_driver(hi655x_pmic_driver);
>     ^
>    cc1: some warnings being treated as errors
> 
> vim +/module_platform_driver +156 drivers/mfd/hi655x-pmic.c
> 
>     13	
>     14	#include <linux/io.h>
>     15	#include <linux/interrupt.h>
>     16	#include <linux/init.h>
>     17	#include <linux/gpio.h>
>     18	#include <linux/of_gpio.h>
>   > 19	#include <linux/platform_device.h>
>     20	#include <linux/of_platform.h>
>     21	#include <linux/mfd/hi655x-pmic.h>
>     22	#include <linux/regmap.h>
>     23	
>     24	static const struct of_device_id of_hi655x_pmic_child_match_tbl[] = {
>     25		{ .compatible = "hisilicon,hi655x-regulator", },
>     26		{},
>     27	};
>     28	
>     29	static const struct of_device_id of_hi655x_pmic_match_tbl[] = {
>     30		{ .compatible = "hisilicon,hi655x-pmic", },
>     31		{},
>     32	};
>     33	
>     34	static const struct regmap_irq hi655x_irqs[] = {
>     35		{ .reg_offset = 0, .mask = OTMP_D1R_INT },
>     36		{ .reg_offset = 0, .mask = VSYS_2P5_R_INT },
>     37		{ .reg_offset = 0, .mask = VSYS_UV_D3R_INT },
>     38		{ .reg_offset = 0, .mask = VSYS_6P0_D200UR_INT },
>     39		{ .reg_offset = 0, .mask = PWRON_D4SR_INT },
>     40		{ .reg_offset = 0, .mask = PWRON_D20F_INT },
>     41		{ .reg_offset = 0, .mask = PWRON_D20R_INT },
>     42		{ .reg_offset = 0, .mask = RESERVE_INT },
>     43	};
>     44	
>     45	static const struct regmap_irq_chip hi655x_irq_chip = {
>     46		.name = "hi655x-pmic",
>     47		.irqs = hi655x_irqs,
>     48		.num_regs = 1,
>     49		.num_irqs = ARRAY_SIZE(hi655x_irqs),
>     50		.status_base = HI655X_IRQ_STAT_BASE,
>     51		.mask_base = HI655X_IRQ_MASK_BASE,
>     52	};
>     53	
>     54	static unsigned int hi655x_pmic_get_version(struct hi655x_pmic *pmic)
>     55	{
>     56		u32 val;
>     57	
>     58		regmap_read(pmic->regmap,
>     59			    HI655X_BUS_ADDR(HI655X_VER_REG), &val);
>     60	
>     61		return val;
>     62	}
>     63	
>     64	static struct regmap_config hi655x_regmap_config = {
>     65		.reg_bits = 32,
>     66		.reg_stride = HI655X_STRIDE,
>     67		.val_bits = 8,
>     68		.max_register = HI655X_BUS_ADDR(0xFFF),
>     69	};
>     70	
>     71	static void hi655x_local_irq_clear(struct regmap *map)
>     72	{
>     73		int i;
>     74	
>     75		regmap_write(map, HI655X_ANA_IRQM_BASE, HI655X_IRQ_CLR);
>     76		for (i = 0; i < HI655X_IRQ_ARRAY; i++) {
>     77			regmap_write(map, HI655X_IRQ_STAT_BASE + i * HI655X_STRIDE,
>     78				     HI655X_IRQ_CLR);
>     79		}
>     80	}
>     81	
>     82	static int hi655x_pmic_probe(struct platform_device *pdev)
>     83	{
>     84		int ret;
>     85		struct hi655x_pmic *pmic;
>     86		struct device *dev = &pdev->dev;
>     87		struct device_node *np = dev->of_node;
>     88		void __iomem *base;
>     89	
>     90		pmic = devm_kzalloc(dev, sizeof(*pmic), GFP_KERNEL);
>     91		pmic->dev = dev;
>     92	
>     93		pmic->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>     94		if (!pmic->res) {
>     95			dev_err(dev, "platform_get_resource err\n");
>     96			return -ENOENT;
>     97		}
>     98		base = devm_ioremap_resource(dev, pmic->res);
>     99		if (!base) {
>    100			dev_err(dev, "cannot map register memory\n");
>    101			return -ENOMEM;
>    102		}
>    103		pmic->regmap = devm_regmap_init_mmio_clk(dev, NULL, base,
>    104							 &hi655x_regmap_config);
>    105	
>    106		pmic->ver = hi655x_pmic_get_version(pmic);
>    107		if ((pmic->ver < PMU_VER_START) || (pmic->ver > PMU_VER_END)) {
>    108			dev_warn(dev, "it is wrong pmu version\n");
>    109			return -EINVAL;
>    110		}
>    111	
>    112		hi655x_local_irq_clear(pmic->regmap);
>    113	
>    114		pmic->gpio = of_get_named_gpio(np, "pmic-gpios", 0);
>    115		if (!gpio_is_valid(pmic->gpio)) {
>    116			dev_err(dev, "cannot get the pmic-gpios\n");
>    117			return -ENODEV;
>    118		}
>    119	
>    120		ret = devm_gpio_request_one(dev, pmic->gpio, GPIOF_IN, "hi655x_pmic_irq");
>    121		if (ret < 0) {
>    122			dev_err(dev, "failed to request gpio %d  ret = %d\n",
>    123				pmic->gpio, ret);
>    124			return ret;
>    125		}
>    126	
>    127		ret = regmap_add_irq_chip(pmic->regmap, gpio_to_irq(pmic->gpio),
>    128					  IRQF_TRIGGER_LOW | IRQF_NO_SUSPEND, 0,
>    129					  &hi655x_irq_chip, &pmic->irq_data);
>    130		if (ret) {
>    131			dev_err(dev, "add pmic irq chip error! ret %d\n", ret);
>    132			return ret;
>    133		}
>    134	
>    135		/* bind pmic to device */
>    136		platform_set_drvdata(pdev, pmic);
>    137	
>    138		/* populate sub nodes */
>    139		ret = of_platform_populate(np, of_hi655x_pmic_child_match_tbl,
>    140					   NULL, dev);
>    141		if (ret) {
>    142			regmap_del_irq_chip(pmic->irq, pmic->irq_data);
>    143			return ret;
>    144		}
>    145	
>    146		return 0;
>    147	}
>    148	
>    149	static struct platform_driver hi655x_pmic_driver = {
>    150		.driver	= {
>    151			.name =	"hi655x-pmic",
>    152			.of_match_table = of_hi655x_pmic_match_tbl,
>    153		},
>    154		.probe  = hi655x_pmic_probe,
>    155	};
>  > 156	module_platform_driver(hi655x_pmic_driver);
>    157	
>    158	MODULE_AUTHOR("Chen Feng <puck.chen@hisilicon.com>");
>    159	MODULE_DESCRIPTION("Hisi hi655x pmic driver");
> 
> ---
> 0-DAY kernel test infrastructure                Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all                   Intel Corporation



-- 
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] 13+ messages in thread

end of thread, other threads:[~2016-01-11  5:49 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-01-04 12:27 [PATCH v4 0/5] Add Support for Hi6220 PMIC Hi6553 MFD Core Chen Feng
2016-01-04 12:27 ` [PATCH v4 1/5] doc: bindings: Add document for mfd hi665x PMIC Chen Feng
2016-01-04 12:27 ` [PATCH v4 2/5] doc: bindings: Document for hi655x regulator driver Chen Feng
2016-01-05 15:47   ` Mark Brown
2016-01-07  3:36     ` chenfeng
2016-01-04 12:27 ` [PATCH v4 3/5] mfd: hi655x: Add hi665x pmic driver Chen Feng
2016-01-04 18:45   ` kbuild test robot
2016-01-04 20:02   ` kbuild test robot
2016-01-11  5:49     ` Lee Jones
2016-01-04 12:27 ` [PATCH v4 4/5] regulator: add regulator driver of hi655x pmic Chen Feng
2016-01-05 15:44   ` Mark Brown
2016-01-07  3:35     ` chenfeng
2016-01-04 12:27 ` [PATCH v4 5/5] hisilicon/dts: Add hi655x pmic dts node Chen Feng

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