linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/6] Add RK818 PMIC support
@ 2016-04-15  9:16 Wadim Egorov
  2016-04-15  9:16 ` [PATCH 1/6] mfd: RK808: Make RK808 generic, rename rk808.c to rk8xx.c Wadim Egorov
                   ` (5 more replies)
  0 siblings, 6 replies; 13+ messages in thread
From: Wadim Egorov @ 2016-04-15  9:16 UTC (permalink / raw)
  To: linux-kernel, linux-arm-kernel, linux-clk, rtc-linux, linux-rockchip
  Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak, linux,
	mturquette, sboyd, lee.jones, lgirdwood, broonie, a.zummo,
	alexandre.belloni, dianders, zyw, arnd, k.kozlowski, javier,
	kgene, olof, geert+renesas, sjoerd.simons, treding,
	public_timo.s

Hi,

I just renamed now the RK808 mfd and regulator drivers.

Patch 4 is a cosmetic patch for the regulator driver.

Unfortunately I have no hardware with a RK808 PMIC, so I can not test this part.

Regards,
Wadim


Changes since RFC:
* split up in more patches: renaming + adding new driver
* renamed rk808.c driver -> rk8xx.c
* renamed rk808-regulator.c driver -> rk8xx-regulator.c

Wadim Egorov (6):
  mfd: RK808: Make RK808 generic, rename rk808.c to rk8xx.c
  mfd: RK808: Add RK818 support
  regulator: rk808: Make rk808 generic, rename rk808-regulator.c
  regulator: rk8xx: Migrate to regulator core's simplified DT parsing
    code
  regulator: rk8xx: Add regulator driver for RK818
  mfd: dt-bindings: Add RK818 device tree bindings document

 Documentation/devicetree/bindings/mfd/rk808.txt    |  37 +-
 arch/arm/configs/multi_v7_defconfig                |   4 +-
 drivers/clk/Kconfig                                |   2 +-
 drivers/mfd/Kconfig                                |   6 +-
 drivers/mfd/Makefile                               |   2 +-
 drivers/mfd/rk808.c                                | 276 -------------
 drivers/mfd/rk8xx.c                                | 436 ++++++++++++++++++++
 drivers/regulator/Kconfig                          |   6 +-
 drivers/regulator/Makefile                         |   2 +-
 .../{rk808-regulator.c => rk8xx-regulator.c}       | 451 ++++++++++++---------
 drivers/rtc/Kconfig                                |   2 +-
 include/linux/mfd/rk808.h                          | 183 ++++++++-
 12 files changed, 906 insertions(+), 501 deletions(-)
 delete mode 100644 drivers/mfd/rk808.c
 create mode 100644 drivers/mfd/rk8xx.c
 rename drivers/regulator/{rk808-regulator.c => rk8xx-regulator.c} (57%)

-- 
1.9.1

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

* [PATCH 1/6] mfd: RK808: Make RK808 generic, rename rk808.c to rk8xx.c
  2016-04-15  9:16 [PATCH 0/6] Add RK818 PMIC support Wadim Egorov
@ 2016-04-15  9:16 ` Wadim Egorov
  2016-04-15  9:16 ` [PATCH 2/6] mfd: RK808: Add RK818 support Wadim Egorov
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: Wadim Egorov @ 2016-04-15  9:16 UTC (permalink / raw)
  To: linux-kernel, linux-arm-kernel, linux-clk, rtc-linux, linux-rockchip
  Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak, linux,
	mturquette, sboyd, lee.jones, lgirdwood, broonie, a.zummo,
	alexandre.belloni, dianders, zyw, arnd, k.kozlowski, javier,
	kgene, olof, geert+renesas, sjoerd.simons, treding,
	public_timo.s

Basically this patch just renames the RK808 driver so we can use this driver
for more than one RK8XX PMIC later.

Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
---
 arch/arm/configs/multi_v7_defconfig |  2 +-
 drivers/clk/Kconfig                 |  2 +-
 drivers/mfd/Kconfig                 |  4 +-
 drivers/mfd/Makefile                |  2 +-
 drivers/mfd/{rk808.c => rk8xx.c}    | 88 ++++++++++++++++++-------------------
 drivers/regulator/Kconfig           |  2 +-
 drivers/rtc/Kconfig                 |  2 +-
 7 files changed, 51 insertions(+), 51 deletions(-)
 rename drivers/mfd/{rk808.c => rk8xx.c} (73%)

diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig
index 2823490..ca995e9 100644
--- a/arch/arm/configs/multi_v7_defconfig
+++ b/arch/arm/configs/multi_v7_defconfig
@@ -454,7 +454,7 @@ CONFIG_MFD_MAX77686=y
 CONFIG_MFD_MAX77693=y
 CONFIG_MFD_MAX8907=y
 CONFIG_MFD_MAX8997=y
-CONFIG_MFD_RK808=y
+CONFIG_MFD_RK8XX=y
 CONFIG_MFD_PM8921_CORE=y
 CONFIG_MFD_QCOM_RPM=y
 CONFIG_MFD_SPMI_PMIC=y
diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index 16f7d33..c2fd078 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -50,7 +50,7 @@ config COMMON_CLK_MAX77802
 
 config COMMON_CLK_RK808
 	tristate "Clock driver for RK808"
-	depends on MFD_RK808
+	depends on MFD_RK8XX
 	---help---
 	  This driver supports RK808 crystal oscillator clock. These
 	  multi-function devices have two fixed-rate oscillators,
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index eea61e3..dd585cb 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -813,8 +813,8 @@ config MFD_RC5T583
 	  Additional drivers must be enabled in order to use the
 	  different functionality of the device.
 
-config MFD_RK808
-	tristate "Rockchip RK808 Power Management chip"
+config MFD_RK8XX
+	tristate "Rockchip RK8XX Power Management chip"
 	depends on I2C && OF
 	select MFD_CORE
 	select REGMAP_I2C
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 5eaa6465d..dd9963f8 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -182,7 +182,7 @@ obj-$(CONFIG_MFD_INTEL_MSIC)	+= intel_msic.o
 obj-$(CONFIG_MFD_PALMAS)	+= palmas.o
 obj-$(CONFIG_MFD_VIPERBOARD)    += viperboard.o
 obj-$(CONFIG_MFD_RC5T583)	+= rc5t583.o rc5t583-irq.o
-obj-$(CONFIG_MFD_RK808)		+= rk808.o
+obj-$(CONFIG_MFD_RK8XX)		+= rk8xx.o
 obj-$(CONFIG_MFD_RN5T618)	+= rn5t618.o
 obj-$(CONFIG_MFD_SEC_CORE)	+= sec-core.o sec-irq.o
 obj-$(CONFIG_MFD_SYSCON)	+= syscon.o
diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk8xx.c
similarity index 73%
rename from drivers/mfd/rk808.c
rename to drivers/mfd/rk8xx.c
index 4b1e439..f68648e 100644
--- a/drivers/mfd/rk808.c
+++ b/drivers/mfd/rk8xx.c
@@ -1,5 +1,5 @@
 /*
- * MFD core driver for Rockchip RK808
+ * MFD core driver for Rockchip RK8XX
  *
  * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
  *
@@ -23,13 +23,13 @@
 #include <linux/module.h>
 #include <linux/regmap.h>
 
-struct rk808_reg_data {
+struct rk8xx_reg_data {
 	int addr;
 	int mask;
 	int value;
 };
 
-static bool rk808_is_volatile_reg(struct device *dev, unsigned int reg)
+static bool rk8xx_is_volatile_reg(struct device *dev, unsigned int reg)
 {
 	/*
 	 * Notes:
@@ -62,7 +62,7 @@ static const struct regmap_config rk808_regmap_config = {
 	.val_bits = 8,
 	.max_register = RK808_IO_POL_REG,
 	.cache_type = REGCACHE_RBTREE,
-	.volatile_reg = rk808_is_volatile_reg,
+	.volatile_reg = rk8xx_is_volatile_reg,
 };
 
 static struct resource rtc_resources[] = {
@@ -83,7 +83,7 @@ static const struct mfd_cell rk808s[] = {
 	},
 };
 
-static const struct rk808_reg_data pre_init_reg[] = {
+static const struct rk8xx_reg_data pre_init_reg[] = {
 	{ RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK,  BUCK_ILMIN_150MA },
 	{ RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK,  BUCK_ILMIN_200MA },
 	{ RK808_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },
@@ -148,30 +148,30 @@ static struct regmap_irq_chip rk808_irq_chip = {
 	.init_ack_masked = true,
 };
 
-static struct i2c_client *rk808_i2c_client;
-static void rk808_device_shutdown(void)
+static struct i2c_client *rk8xx_i2c_client;
+static void rk8xx_device_shutdown(void)
 {
 	int ret;
-	struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
+	struct rk808 *rk8xx = i2c_get_clientdata(rk8xx_i2c_client);
 
-	if (!rk808) {
-		dev_warn(&rk808_i2c_client->dev,
-			 "have no rk808, so do nothing here\n");
+	if (!rk8xx) {
+		dev_warn(&rk8xx_i2c_client->dev,
+			 "have no rk8xx, so do nothing here\n");
 		return;
 	}
 
-	ret = regmap_update_bits(rk808->regmap,
+	ret = regmap_update_bits(rk8xx->regmap,
 				 RK808_DEVCTRL_REG,
 				 DEV_OFF_RST, DEV_OFF_RST);
 	if (ret)
-		dev_err(&rk808_i2c_client->dev, "power off error!\n");
+		dev_err(&rk8xx_i2c_client->dev, "power off error!\n");
 }
 
-static int rk808_probe(struct i2c_client *client,
+static int rk8xx_probe(struct i2c_client *client,
 		       const struct i2c_device_id *id)
 {
 	struct device_node *np = client->dev.of_node;
-	struct rk808 *rk808;
+	struct rk808 *rk8xx;
 	int pm_off = 0;
 	int ret;
 	int i;
@@ -181,18 +181,18 @@ static int rk808_probe(struct i2c_client *client,
 		return -EINVAL;
 	}
 
-	rk808 = devm_kzalloc(&client->dev, sizeof(*rk808), GFP_KERNEL);
-	if (!rk808)
+	rk8xx = devm_kzalloc(&client->dev, sizeof(*rk8xx), GFP_KERNEL);
+	if (!rk8xx)
 		return -ENOMEM;
 
-	rk808->regmap = devm_regmap_init_i2c(client, &rk808_regmap_config);
-	if (IS_ERR(rk808->regmap)) {
+	rk8xx->regmap = devm_regmap_init_i2c(client, &rk808_regmap_config);
+	if (IS_ERR(rk8xx->regmap)) {
 		dev_err(&client->dev, "regmap initialization failed\n");
-		return PTR_ERR(rk808->regmap);
+		return PTR_ERR(rk8xx->regmap);
 	}
 
 	for (i = 0; i < ARRAY_SIZE(pre_init_reg); i++) {
-		ret = regmap_update_bits(rk808->regmap, pre_init_reg[i].addr,
+		ret = regmap_update_bits(rk8xx->regmap, pre_init_reg[i].addr,
 					 pre_init_reg[i].mask,
 					 pre_init_reg[i].value);
 		if (ret) {
@@ -202,20 +202,20 @@ static int rk808_probe(struct i2c_client *client,
 		}
 	}
 
-	ret = regmap_add_irq_chip(rk808->regmap, client->irq,
+	ret = regmap_add_irq_chip(rk8xx->regmap, client->irq,
 				  IRQF_ONESHOT, -1,
-				  &rk808_irq_chip, &rk808->irq_data);
+				  &rk808_irq_chip, &rk8xx->irq_data);
 	if (ret) {
 		dev_err(&client->dev, "Failed to add irq_chip %d\n", ret);
 		return ret;
 	}
 
-	rk808->i2c = client;
-	i2c_set_clientdata(client, rk808);
+	rk8xx->i2c = client;
+	i2c_set_clientdata(client, rk8xx);
 
 	ret = mfd_add_devices(&client->dev, -1,
 			      rk808s, ARRAY_SIZE(rk808s),
-			      NULL, 0, regmap_irq_get_domain(rk808->irq_data));
+			      NULL, 0, regmap_irq_get_domain(rk8xx->irq_data));
 	if (ret) {
 		dev_err(&client->dev, "failed to add MFD devices %d\n", ret);
 		goto err_irq;
@@ -224,53 +224,53 @@ static int rk808_probe(struct i2c_client *client,
 	pm_off = of_property_read_bool(np,
 				"rockchip,system-power-controller");
 	if (pm_off && !pm_power_off) {
-		rk808_i2c_client = client;
-		pm_power_off = rk808_device_shutdown;
+		rk8xx_i2c_client = client;
+		pm_power_off = rk8xx_device_shutdown;
 	}
 
 	return 0;
 
 err_irq:
-	regmap_del_irq_chip(client->irq, rk808->irq_data);
+	regmap_del_irq_chip(client->irq, rk8xx->irq_data);
 	return ret;
 }
 
-static int rk808_remove(struct i2c_client *client)
+static int rk8xx_remove(struct i2c_client *client)
 {
-	struct rk808 *rk808 = i2c_get_clientdata(client);
+	struct rk808 *rk8xx = i2c_get_clientdata(client);
 
-	regmap_del_irq_chip(client->irq, rk808->irq_data);
+	regmap_del_irq_chip(client->irq, rk8xx->irq_data);
 	mfd_remove_devices(&client->dev);
 	pm_power_off = NULL;
 
 	return 0;
 }
 
-static const struct of_device_id rk808_of_match[] = {
+static const struct of_device_id rk8xx_of_match[] = {
 	{ .compatible = "rockchip,rk808" },
 	{ },
 };
-MODULE_DEVICE_TABLE(of, rk808_of_match);
+MODULE_DEVICE_TABLE(of, rk8xx_of_match);
 
-static const struct i2c_device_id rk808_ids[] = {
+static const struct i2c_device_id rk8xx_ids[] = {
 	{ "rk808" },
 	{ },
 };
-MODULE_DEVICE_TABLE(i2c, rk808_ids);
+MODULE_DEVICE_TABLE(i2c, rk8xx_ids);
 
-static struct i2c_driver rk808_i2c_driver = {
+static struct i2c_driver rk8xx_i2c_driver = {
 	.driver = {
-		.name = "rk808",
-		.of_match_table = rk808_of_match,
+		.name = "rk8xx",
+		.of_match_table = rk8xx_of_match,
 	},
-	.probe    = rk808_probe,
-	.remove   = rk808_remove,
-	.id_table = rk808_ids,
+	.probe    = rk8xx_probe,
+	.remove   = rk8xx_remove,
+	.id_table = rk8xx_ids,
 };
 
-module_i2c_driver(rk808_i2c_driver);
+module_i2c_driver(rk8xx_i2c_driver);
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
 MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
-MODULE_DESCRIPTION("RK808 PMIC driver");
+MODULE_DESCRIPTION("RK8XX PMIC driver");
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index c77dc08..f834079 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -610,7 +610,7 @@ config REGULATOR_RC5T583
 
 config REGULATOR_RK808
 	tristate "Rockchip RK808 Power regulators"
-	depends on MFD_RK808
+	depends on MFD_RK8XX
 	help
 	  Select this option to enable the power regulator of ROCKCHIP
 	  PMIC RK808.
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index 3e84315..e7cadc3 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -325,7 +325,7 @@ config RTC_DRV_MAX77686
 
 config RTC_DRV_RK808
 	tristate "Rockchip RK808 RTC"
-	depends on MFD_RK808
+	depends on MFD_RK8XX
 	help
 	  If you say yes here you will get support for the
 	  RTC of RK808 PMIC.
-- 
1.9.1

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

* [PATCH 2/6] mfd: RK808: Add RK818 support
  2016-04-15  9:16 [PATCH 0/6] Add RK818 PMIC support Wadim Egorov
  2016-04-15  9:16 ` [PATCH 1/6] mfd: RK808: Make RK808 generic, rename rk808.c to rk8xx.c Wadim Egorov
@ 2016-04-15  9:16 ` Wadim Egorov
  2016-04-15  9:16 ` [PATCH 3/6] regulator: rk808: Make rk808 generic, rename rk808-regulator.c Wadim Egorov
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: Wadim Egorov @ 2016-04-15  9:16 UTC (permalink / raw)
  To: linux-kernel, linux-arm-kernel, linux-clk, rtc-linux, linux-rockchip
  Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak, linux,
	mturquette, sboyd, lee.jones, lgirdwood, broonie, a.zummo,
	alexandre.belloni, dianders, zyw, arnd, k.kozlowski, javier,
	kgene, olof, geert+renesas, sjoerd.simons, treding,
	public_timo.s

The RK818 chip is a power management IC for multimedia and handheld
devices. It contains the following components:

- Regulators
- RTC
- Clkout
- battery support

Both chips RK808 and RK818 are using a similar register map.
So we can reuse the RTC and Clkout functionality.

Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
---
Changes since RFC:
* fixed copyright format
* using BIT() for register masks
* removed dev_info from probe which said device was found
* removed filename from header file
* fixed all RK8XX/rk8xx wildcards
---
 drivers/mfd/Kconfig       |   2 +-
 drivers/mfd/rk8xx.c       | 228 +++++++++++++++++++++++++++++++++++++++-------
 include/linux/mfd/rk808.h | 183 +++++++++++++++++++++++++++++++++++--
 3 files changed, 369 insertions(+), 44 deletions(-)

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index dd585cb..130703b 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -820,7 +820,7 @@ config MFD_RK8XX
 	select REGMAP_I2C
 	select REGMAP_IRQ
 	help
-	  If you say yes here you get support for the RK808
+	  If you say yes here you get support for the RK808 and RK818
 	  Power Management chips.
 	  This driver provides common support for accessing the device
 	  through I2C interface. The device supports multiple sub-devices
diff --git a/drivers/mfd/rk8xx.c b/drivers/mfd/rk8xx.c
index f68648e..57fee1e 100644
--- a/drivers/mfd/rk8xx.c
+++ b/drivers/mfd/rk8xx.c
@@ -6,6 +6,10 @@
  * Author: Chris Zhong <zyw@rock-chips.com>
  * Author: Zhang Qing <zhangqing@rock-chips.com>
  *
+ * Copyright (C) 2016 PHYTEC Messtechnik GmbH
+ *
+ * Author: Wadim Egorov <w.egorov@phytec.de>
+ *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
  * version 2, as published by the Free Software Foundation.
@@ -22,12 +26,7 @@
 #include <linux/mfd/core.h>
 #include <linux/module.h>
 #include <linux/regmap.h>
-
-struct rk8xx_reg_data {
-	int addr;
-	int mask;
-	int value;
-};
+#include <linux/of_device.h>
 
 static bool rk8xx_is_volatile_reg(struct device *dev, unsigned int reg)
 {
@@ -57,6 +56,14 @@ static bool rk8xx_is_volatile_reg(struct device *dev, unsigned int reg)
 	return false;
 }
 
+static const struct regmap_config rk818_regmap_config = {
+	.reg_bits = 8,
+	.val_bits = 8,
+	.max_register = RK818_USB_CTRL_REG,
+	.cache_type = REGCACHE_RBTREE,
+	.volatile_reg = rk8xx_is_volatile_reg,
+};
+
 static const struct regmap_config rk808_regmap_config = {
 	.reg_bits = 8,
 	.val_bits = 8,
@@ -83,7 +90,17 @@ static const struct mfd_cell rk808s[] = {
 	},
 };
 
-static const struct rk8xx_reg_data pre_init_reg[] = {
+static const struct mfd_cell rk818s[] = {
+	{ .name = "rk808-clkout", },
+	{ .name = "rk808-regulator", },
+	{
+		.name = "rk808-rtc",
+		.num_resources = ARRAY_SIZE(rtc_resources),
+		.resources = &rtc_resources[0],
+	},
+};
+
+static const struct rk8xx_reg_data rk808_pre_init_reg[] = {
 	{ RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK,  BUCK_ILMIN_150MA },
 	{ RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK,  BUCK_ILMIN_200MA },
 	{ RK808_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },
@@ -94,6 +111,22 @@ static const struct rk8xx_reg_data pre_init_reg[] = {
 						    VB_LO_SEL_3500MV },
 };
 
+static const struct rk8xx_reg_data rk818_pre_init_reg[] = {
+	{ RK818_USB_CTRL_REG,	RK818_USB_ILIM_SEL_MASK,
+						RK818_USB_ILMIN_2000MA },
+	/* close charger when usb lower then 3.4V */
+	{ RK818_USB_CTRL_REG,	RK818_USB_CHG_SD_VSEL_MASK, (0x7 << 4) },
+	/* no action when vref */
+	{ RK818_H5V_EN_REG,	BIT(1),		RK818_REF_RDY_CTRL },
+	/* enable HDMI 5V */
+	{ RK818_H5V_EN_REG,	BIT(0),		RK818_H5V_EN },
+	/* improve efficiency */
+	{ RK818_BUCK2_CONFIG_REG, BUCK2_RATE_MASK,	BUCK_ILMIN_250MA },
+	{ RK818_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK,	BUCK_ILMIN_250MA },
+	{ RK818_BOOST_CONFIG_REG, BOOST_ILMIN_MASK,	BOOST_ILMIN_100MA },
+	{ RK808_VB_MON_REG,	MASK_ALL,	VB_LO_ACT | VB_LO_SEL_3500MV },
+};
+
 static const struct regmap_irq rk808_irqs[] = {
 	/* INT_STS */
 	[RK808_IRQ_VOUT_LO] = {
@@ -136,6 +169,76 @@ static const struct regmap_irq rk808_irqs[] = {
 	},
 };
 
+static const struct regmap_irq rk818_irqs[] = {
+	/* INT_STS */
+	[RK818_IRQ_VOUT_LO] = {
+		.mask = RK818_IRQ_VOUT_LO_MSK,
+		.reg_offset = 0,
+	},
+	[RK818_IRQ_VB_LO] = {
+		.mask = RK818_IRQ_VB_LO_MSK,
+		.reg_offset = 0,
+	},
+	[RK818_IRQ_PWRON] = {
+		.mask = RK818_IRQ_PWRON_MSK,
+		.reg_offset = 0,
+	},
+	[RK818_IRQ_PWRON_LP] = {
+		.mask = RK818_IRQ_PWRON_LP_MSK,
+		.reg_offset = 0,
+	},
+	[RK818_IRQ_HOTDIE] = {
+		.mask = RK818_IRQ_HOTDIE_MSK,
+		.reg_offset = 0,
+	},
+	[RK818_IRQ_RTC_ALARM] = {
+		.mask = RK818_IRQ_RTC_ALARM_MSK,
+		.reg_offset = 0,
+	},
+	[RK818_IRQ_RTC_PERIOD] = {
+		.mask = RK818_IRQ_RTC_PERIOD_MSK,
+		.reg_offset = 0,
+	},
+	[RK818_IRQ_USB_OV] = {
+		.mask = RK818_IRQ_USB_OV_MSK,
+		.reg_offset = 0,
+	},
+
+	/* INT_STS2 */
+	[RK818_IRQ_PLUG_IN] = {
+		.mask = RK818_IRQ_PLUG_IN_MSK,
+		.reg_offset = 1,
+	},
+	[RK818_IRQ_PLUG_OUT] = {
+		.mask = RK818_IRQ_PLUG_OUT_MSK,
+		.reg_offset = 1,
+	},
+	[RK818_IRQ_CHG_OK] = {
+		.mask = RK818_IRQ_CHG_OK_MSK,
+		.reg_offset = 1,
+	},
+	[RK818_IRQ_CHG_TE] = {
+		.mask = RK818_IRQ_CHG_TE_MSK,
+		.reg_offset = 1,
+	},
+	[RK818_IRQ_CHG_TS1] = {
+		.mask = RK818_IRQ_CHG_TS1_MSK,
+		.reg_offset = 1,
+	},
+	[RK818_IRQ_TS2] = {
+		.mask = RK818_IRQ_TS2_MSK,
+		.reg_offset = 1,
+	},
+	[RK818_IRQ_CHG_CVTLIM] = {
+		.mask = RK818_IRQ_CHG_CVTLIM_MSK,
+		.reg_offset = 1,
+	},
+	[RK818_IRQ_DISCHG_ILIM] = {
+		.mask = RK818_IRQ_DISCHG_ILIM_MSK,
+		.reg_offset = 1,
+	},
+};
+
 static struct regmap_irq_chip rk808_irq_chip = {
 	.name = "rk808",
 	.irqs = rk808_irqs,
@@ -148,6 +251,18 @@ static struct regmap_irq_chip rk808_irq_chip = {
 	.init_ack_masked = true,
 };
 
+static struct regmap_irq_chip rk818_irq_chip = {
+	.name = "rk818",
+	.irqs = rk818_irqs,
+	.num_irqs = ARRAY_SIZE(rk818_irqs),
+	.num_regs = 2,
+	.irq_reg_stride = 2,
+	.status_base = RK818_INT_STS_REG1,
+	.mask_base = RK818_INT_STS_MSK_REG1,
+	.ack_base = RK818_INT_STS_REG1,
+	.init_ack_masked = true,
+};
+
 static struct i2c_client *rk8xx_i2c_client;
 static void rk8xx_device_shutdown(void)
 {
@@ -167,8 +282,51 @@ static void rk8xx_device_shutdown(void)
 		dev_err(&rk8xx_i2c_client->dev, "power off error!\n");
 }
 
+static const struct of_device_id rk8xx_of_match[] = {
+	{ .compatible = "rockchip,rk808", .data = (void *) RK808_ID },
+	{ .compatible = "rockchip,rk818", .data = (void *) RK818_ID },
+	{ },
+};
+MODULE_DEVICE_TABLE(of, rk8xx_of_match);
+
+static int rk8xx_match_device(struct rk808 *rk8xx, struct device *dev)
+{
+	const struct of_device_id *of_id;
+
+	of_id = of_match_device(rk8xx_of_match, dev);
+	if (!of_id) {
+		dev_err(dev, "Unable to match OF ID\n");
+		return -ENODEV;
+	}
+	rk8xx->variant = (long) of_id->data;
+
+	switch (rk8xx->variant) {
+	case RK808_ID:
+		rk8xx->nr_cells = ARRAY_SIZE(rk808s);
+		rk8xx->cells = rk808s;
+		rk8xx->regmap_cfg = &rk808_regmap_config;
+		rk8xx->regmap_irq_chip = &rk808_irq_chip;
+		rk8xx->pre_init_reg = rk808_pre_init_reg;
+		rk8xx->nr_pre_init_regs = ARRAY_SIZE(rk808_pre_init_reg);
+		break;
+	case RK818_ID:
+		rk8xx->nr_cells = ARRAY_SIZE(rk818s);
+		rk8xx->cells = rk818s;
+		rk8xx->regmap_cfg = &rk818_regmap_config;
+		rk8xx->regmap_irq_chip = &rk818_irq_chip;
+		rk8xx->pre_init_reg = rk818_pre_init_reg;
+		rk8xx->nr_pre_init_regs = ARRAY_SIZE(rk818_pre_init_reg);
+		break;
+	default:
+		dev_err(dev, "unsupported RK8XX ID %lu\n", rk8xx->variant);
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
 static int rk8xx_probe(struct i2c_client *client,
-		       const struct i2c_device_id *id)
+			const struct i2c_device_id *id)
 {
 	struct device_node *np = client->dev.of_node;
 	struct rk808 *rk8xx;
@@ -176,45 +334,51 @@ static int rk8xx_probe(struct i2c_client *client,
 	int ret;
 	int i;
 
-	if (!client->irq) {
-		dev_err(&client->dev, "No interrupt support, no core IRQ\n");
-		return -EINVAL;
-	}
-
 	rk8xx = devm_kzalloc(&client->dev, sizeof(*rk8xx), GFP_KERNEL);
 	if (!rk8xx)
 		return -ENOMEM;
 
-	rk8xx->regmap = devm_regmap_init_i2c(client, &rk808_regmap_config);
+	ret = rk8xx_match_device(rk8xx, &client->dev);
+	if (ret)
+		return ret;
+
+	rk8xx->i2c = client;
+	i2c_set_clientdata(client, rk8xx);
+
+	rk8xx->regmap = devm_regmap_init_i2c(client, rk8xx->regmap_cfg);
 	if (IS_ERR(rk8xx->regmap)) {
 		dev_err(&client->dev, "regmap initialization failed\n");
 		return PTR_ERR(rk8xx->regmap);
 	}
 
-	for (i = 0; i < ARRAY_SIZE(pre_init_reg); i++) {
-		ret = regmap_update_bits(rk8xx->regmap, pre_init_reg[i].addr,
-					 pre_init_reg[i].mask,
-					 pre_init_reg[i].value);
-		if (ret) {
-			dev_err(&client->dev,
-				"0x%x write err\n", pre_init_reg[i].addr);
-			return ret;
-		}
+	if (!client->irq) {
+		dev_err(&client->dev, "No interrupt support, no core IRQ\n");
+		return -EINVAL;
 	}
 
 	ret = regmap_add_irq_chip(rk8xx->regmap, client->irq,
 				  IRQF_ONESHOT, -1,
-				  &rk808_irq_chip, &rk8xx->irq_data);
+				  rk8xx->regmap_irq_chip, &rk8xx->irq_data);
 	if (ret) {
 		dev_err(&client->dev, "Failed to add irq_chip %d\n", ret);
 		return ret;
 	}
 
-	rk8xx->i2c = client;
-	i2c_set_clientdata(client, rk8xx);
+	for (i = 0; i < rk8xx->nr_pre_init_regs; i++) {
+		ret = regmap_update_bits(rk8xx->regmap,
+					rk8xx->pre_init_reg[i].addr,
+					rk8xx->pre_init_reg[i].mask,
+					rk8xx->pre_init_reg[i].value);
+		if (ret) {
+			dev_err(&client->dev,
+				"0x%x write err\n",
+				rk8xx->pre_init_reg[i].addr);
+			return ret;
+		}
+	}
 
-	ret = mfd_add_devices(&client->dev, -1,
-			      rk808s, ARRAY_SIZE(rk808s),
+	ret = mfd_add_devices(&client->dev, PLATFORM_DEVID_NONE,
+			      rk8xx->cells, rk8xx->nr_cells,
 			      NULL, 0, regmap_irq_get_domain(rk8xx->irq_data));
 	if (ret) {
 		dev_err(&client->dev, "failed to add MFD devices %d\n", ret);
@@ -246,14 +410,9 @@ static int rk8xx_remove(struct i2c_client *client)
 	return 0;
 }
 
-static const struct of_device_id rk8xx_of_match[] = {
-	{ .compatible = "rockchip,rk808" },
-	{ },
-};
-MODULE_DEVICE_TABLE(of, rk8xx_of_match);
-
 static const struct i2c_device_id rk8xx_ids[] = {
 	{ "rk808" },
+	{ "rk818" },
 	{ },
 };
 MODULE_DEVICE_TABLE(i2c, rk8xx_ids);
@@ -273,4 +432,5 @@ module_i2c_driver(rk8xx_i2c_driver);
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
 MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
+MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>");
 MODULE_DESCRIPTION("RK8XX PMIC driver");
diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h
index 441b6ee..a6ce740 100644
--- a/include/linux/mfd/rk808.h
+++ b/include/linux/mfd/rk808.h
@@ -1,11 +1,15 @@
 /*
- * rk808.h for Rockchip RK808
+ * Register definitions for Rockchip's RK8XX PMIC family
  *
  * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
  *
  * Author: Chris Zhong <zyw@rock-chips.com>
  * Author: Zhang Qing <zhangqing@rock-chips.com>
  *
+ * Copyright (C) 2016 PHYTEC Messtechnik GmbH
+ *
+ * Author: Wadim Egorov <w.egorov@phytec.de>
+ *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
  * version 2, as published by the Free Software Foundation.
@@ -16,8 +20,8 @@
  * more details.
  */
 
-#ifndef __LINUX_REGULATOR_rk808_H
-#define __LINUX_REGULATOR_rk808_H
+#ifndef __LINUX_REGULATOR_RK8XX_H
+#define __LINUX_REGULATOR_RK8XX_H
 
 #include <linux/regulator/machine.h>
 #include <linux/regmap.h>
@@ -28,7 +32,7 @@
 
 #define RK808_DCDC1	0 /* (0+RK808_START) */
 #define RK808_LDO1	4 /* (4+RK808_START) */
-#define RK808_NUM_REGULATORS   14
+#define RK808_NUM_REGULATORS	14
 
 enum rk808_reg {
 	RK808_ID_DCDC1,
@@ -115,7 +119,113 @@ enum rk808_reg {
 #define RK808_INT_STS_MSK_REG2	0x4f
 #define RK808_IO_POL_REG	0x50
 
-/* IRQ Definitions */
+/* RK818 */
+#define RK818_DCDC1			0
+#define RK818_LDO1			4
+#define RK818_NUM_REGULATORS		17
+
+enum rk818_reg {
+	RK818_ID_DCDC1,
+	RK818_ID_DCDC2,
+	RK818_ID_DCDC3,
+	RK818_ID_DCDC4,
+	RK818_ID_BOOST,
+	RK818_ID_LDO1,
+	RK818_ID_LDO2,
+	RK818_ID_LDO3,
+	RK818_ID_LDO4,
+	RK818_ID_LDO5,
+	RK818_ID_LDO6,
+	RK818_ID_LDO7,
+	RK818_ID_LDO8,
+	RK818_ID_LDO9,
+	RK818_ID_SWITCH,
+	RK818_ID_HDMI_SWITCH,
+	RK818_ID_OTG_SWITCH,
+};
+
+#define RK818_SECONDS_REG		0x00
+#define RK818_MINUTES_REG		0x01
+#define RK818_HOURS_REG			0x02
+#define RK818_DAYS_REG			0x03
+#define RK818_MONTHS_REG		0x04
+#define RK818_YEARS_REG			0x05
+#define RK818_WEEKS_REG			0x06
+#define RK818_ALARM_SECONDS_REG		0x07
+#define RK818_ALARM_MINUTES_REG		0x08
+#define RK818_ALARM_HOURS_REG		0x09
+#define RK818_ALARM_DAYS_REG		0x0a
+#define RK818_ALARM_MONTHS_REG		0x0b
+#define RK818_ALARM_YEARS_REG		0x0c
+#define RK818_RTC_CTRL_REG		0x10
+#define RK818_RTC_STATUS_REG		0x11
+#define RK818_RTC_INT_REG		0x12
+#define RK818_RTC_COMP_LSB_REG		0x13
+#define RK818_RTC_COMP_MSB_REG		0x14
+#define RK818_CLK32OUT_REG		0x20
+#define RK818_VB_MON_REG		0x21
+#define RK818_THERMAL_REG		0x22
+#define RK818_DCDC_EN_REG		0x23
+#define RK818_LDO_EN_REG		0x24
+#define RK818_SLEEP_SET_OFF_REG1	0x25
+#define RK818_SLEEP_SET_OFF_REG2	0x26
+#define RK818_DCDC_UV_STS_REG		0x27
+#define RK818_DCDC_UV_ACT_REG		0x28
+#define RK818_LDO_UV_STS_REG		0x29
+#define RK818_LDO_UV_ACT_REG		0x2a
+#define RK818_DCDC_PG_REG		0x2b
+#define RK818_LDO_PG_REG		0x2c
+#define RK818_VOUT_MON_TDB_REG		0x2d
+#define RK818_BUCK1_CONFIG_REG		0x2e
+#define RK818_BUCK1_ON_VSEL_REG		0x2f
+#define RK818_BUCK1_SLP_VSEL_REG	0x30
+#define RK818_BUCK2_CONFIG_REG		0x32
+#define RK818_BUCK2_ON_VSEL_REG		0x33
+#define RK818_BUCK2_SLP_VSEL_REG	0x34
+#define RK818_BUCK3_CONFIG_REG		0x36
+#define RK818_BUCK4_CONFIG_REG		0x37
+#define RK818_BUCK4_ON_VSEL_REG		0x38
+#define RK818_BUCK4_SLP_VSEL_REG	0x39
+#define RK818_BOOST_CONFIG_REG		0x3a
+#define RK818_LDO1_ON_VSEL_REG		0x3b
+#define RK818_LDO1_SLP_VSEL_REG		0x3c
+#define RK818_LDO2_ON_VSEL_REG		0x3d
+#define RK818_LDO2_SLP_VSEL_REG		0x3e
+#define RK818_LDO3_ON_VSEL_REG		0x3f
+#define RK818_LDO3_SLP_VSEL_REG		0x40
+#define RK818_LDO4_ON_VSEL_REG		0x41
+#define RK818_LDO4_SLP_VSEL_REG		0x42
+#define RK818_LDO5_ON_VSEL_REG		0x43
+#define RK818_LDO5_SLP_VSEL_REG		0x44
+#define RK818_LDO6_ON_VSEL_REG		0x45
+#define RK818_LDO6_SLP_VSEL_REG		0x46
+#define RK818_LDO7_ON_VSEL_REG		0x47
+#define RK818_LDO7_SLP_VSEL_REG		0x48
+#define RK818_LDO8_ON_VSEL_REG		0x49
+#define RK818_LDO8_SLP_VSEL_REG		0x4a
+#define RK818_BOOST_LDO9_ON_VSEL_REG	0x54
+#define RK818_BOOST_LDO9_SLP_VSEL_REG	0x55
+#define RK818_DEVCTRL_REG		0x4b
+#define RK818_INT_STS_REG1		0X4c
+#define RK818_INT_STS_MSK_REG1		0x4d
+#define RK818_INT_STS_REG2		0x4e
+#define RK818_INT_STS_MSK_REG2		0x4f
+#define RK818_IO_POL_REG		0x50
+#define RK818_H5V_EN_REG		0x52
+#define RK818_SLEEP_SET_OFF_REG3	0x53
+#define RK818_BOOST_LDO9_ON_VSEL_REG	0x54
+#define RK818_BOOST_LDO9_SLP_VSEL_REG	0x55
+#define RK818_BOOST_CTRL_REG		0x56
+#define RK818_DCDC_ILMAX		0x90
+#define RK818_USB_CTRL_REG		0xa1
+
+#define RK818_H5V_EN			BIT(0)
+#define RK818_REF_RDY_CTRL		BIT(1)
+#define RK818_USB_ILIM_SEL_MASK		0xf
+#define RK818_USB_ILMIN_2000MA		0x7
+#define RK818_USB_CHG_SD_VSEL_MASK	0x70
+
+/* RK808 IRQ Definitions */
 #define RK808_IRQ_VOUT_LO	0
 #define RK808_IRQ_VB_LO		1
 #define RK808_IRQ_PWRON		2
@@ -137,6 +247,43 @@ enum rk808_reg {
 #define RK808_IRQ_PLUG_IN_INT_MSK	BIT(0)
 #define RK808_IRQ_PLUG_OUT_INT_MSK	BIT(1)
 
+/* RK818 IRQ Definitions */
+#define RK818_IRQ_VOUT_LO	0
+#define RK818_IRQ_VB_LO		1
+#define RK818_IRQ_PWRON		2
+#define RK818_IRQ_PWRON_LP	3
+#define RK818_IRQ_HOTDIE	4
+#define RK818_IRQ_RTC_ALARM	5
+#define RK818_IRQ_RTC_PERIOD	6
+#define RK818_IRQ_USB_OV	7
+#define RK818_IRQ_PLUG_IN	8
+#define RK818_IRQ_PLUG_OUT	9
+#define RK818_IRQ_CHG_OK	10
+#define RK818_IRQ_CHG_TE	11
+#define RK818_IRQ_CHG_TS1	12
+#define RK818_IRQ_TS2		13
+#define RK818_IRQ_CHG_CVTLIM	14
+#define RK818_IRQ_DISCHG_ILIM	7
+
+#define RK818_IRQ_VOUT_LO_MSK		BIT(0)
+#define RK818_IRQ_VB_LO_MSK		BIT(1)
+#define RK818_IRQ_PWRON_MSK		BIT(2)
+#define RK818_IRQ_PWRON_LP_MSK		BIT(3)
+#define RK818_IRQ_HOTDIE_MSK		BIT(4)
+#define RK818_IRQ_RTC_ALARM_MSK		BIT(5)
+#define RK818_IRQ_RTC_PERIOD_MSK	BIT(6)
+#define RK818_IRQ_USB_OV_MSK		BIT(7)
+#define RK818_IRQ_PLUG_IN_MSK		BIT(0)
+#define RK818_IRQ_PLUG_OUT_MSK		BIT(1)
+#define RK818_IRQ_CHG_OK_MSK		BIT(2)
+#define RK818_IRQ_CHG_TE_MSK		BIT(3)
+#define RK818_IRQ_CHG_TS1_MSK		BIT(4)
+#define RK818_IRQ_TS2_MSK		BIT(5)
+#define RK818_IRQ_CHG_CVTLIM_MSK	BIT(6)
+#define RK818_IRQ_DISCHG_ILIM_MSK	BIT(7)
+
+#define RK818_NUM_IRQ		16
+
 #define RK808_VBAT_LOW_2V8	0x00
 #define RK808_VBAT_LOW_2V9	0x01
 #define RK808_VBAT_LOW_3V0	0x02
@@ -191,9 +338,27 @@ enum {
 	BOOST_ILMIN_250MA,
 };
 
+enum {
+	RK808_ID,
+	RK818_ID,
+};
+
+struct rk8xx_reg_data {
+	int addr;
+	int mask;
+	int value;
+};
+
 struct rk808 {
-	struct i2c_client *i2c;
-	struct regmap_irq_chip_data *irq_data;
-	struct regmap *regmap;
+	struct i2c_client		*i2c;
+	struct regmap_irq_chip_data	*irq_data;
+	struct regmap			*regmap;
+	long				variant;
+	int				nr_cells;
+	const struct mfd_cell		*cells;
+	const struct regmap_config	*regmap_cfg;
+	const struct regmap_irq_chip	*regmap_irq_chip;
+	const struct rk8xx_reg_data	*pre_init_reg;
+	int				nr_pre_init_regs;
 };
-#endif /* __LINUX_REGULATOR_rk808_H */
+#endif /* __LINUX_REGULATOR_RK8XX_H */
-- 
1.9.1

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

* [PATCH 3/6] regulator: rk808: Make rk808 generic, rename rk808-regulator.c
  2016-04-15  9:16 [PATCH 0/6] Add RK818 PMIC support Wadim Egorov
  2016-04-15  9:16 ` [PATCH 1/6] mfd: RK808: Make RK808 generic, rename rk808.c to rk8xx.c Wadim Egorov
  2016-04-15  9:16 ` [PATCH 2/6] mfd: RK808: Add RK818 support Wadim Egorov
@ 2016-04-15  9:16 ` Wadim Egorov
  2016-04-15 10:26   ` Mark Brown
                     ` (2 more replies)
  2016-04-15  9:16 ` [PATCH 4/6] regulator: rk8xx: Migrate to regulator core's simplified DT parsing code Wadim Egorov
                   ` (2 subsequent siblings)
  5 siblings, 3 replies; 13+ messages in thread
From: Wadim Egorov @ 2016-04-15  9:16 UTC (permalink / raw)
  To: linux-kernel, linux-arm-kernel, linux-clk, rtc-linux, linux-rockchip
  Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak, linux,
	mturquette, sboyd, lee.jones, lgirdwood, broonie, a.zummo,
	alexandre.belloni, dianders, zyw, arnd, k.kozlowski, javier,
	kgene, olof, geert+renesas, sjoerd.simons, treding,
	public_timo.s

This patch just renames the rk808 driver so we can reuse this driver
to add more regulator devices from the RK8XX PMIC family later.

Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
---
 arch/arm/configs/multi_v7_defconfig                |  2 +-
 drivers/mfd/rk8xx.c                                |  4 +--
 drivers/regulator/Kconfig                          |  4 +--
 drivers/regulator/Makefile                         |  2 +-
 .../{rk808-regulator.c => rk8xx-regulator.c}       | 36 +++++++++++-----------
 5 files changed, 24 insertions(+), 24 deletions(-)
 rename drivers/regulator/{rk808-regulator.c => rk8xx-regulator.c} (95%)

diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig
index ca995e9..d774ba0 100644
--- a/arch/arm/configs/multi_v7_defconfig
+++ b/arch/arm/configs/multi_v7_defconfig
@@ -474,7 +474,7 @@ CONFIG_REGULATOR_AXP20X=m
 CONFIG_REGULATOR_BCM590XX=y
 CONFIG_REGULATOR_DA9210=y
 CONFIG_REGULATOR_FAN53555=y
-CONFIG_REGULATOR_RK808=y
+CONFIG_REGULATOR_RK8XX=y
 CONFIG_REGULATOR_GPIO=y
 CONFIG_MFD_SYSCON=y
 CONFIG_POWER_RESET_SYSCON=y
diff --git a/drivers/mfd/rk8xx.c b/drivers/mfd/rk8xx.c
index 57fee1e..c7990fb 100644
--- a/drivers/mfd/rk8xx.c
+++ b/drivers/mfd/rk8xx.c
@@ -82,7 +82,7 @@ static struct resource rtc_resources[] = {
 
 static const struct mfd_cell rk808s[] = {
 	{ .name = "rk808-clkout", },
-	{ .name = "rk808-regulator", },
+	{ .name = "rk8xx-regulator", },
 	{
 		.name = "rk808-rtc",
 		.num_resources = ARRAY_SIZE(rtc_resources),
@@ -92,7 +92,7 @@ static const struct mfd_cell rk808s[] = {
 
 static const struct mfd_cell rk818s[] = {
 	{ .name = "rk808-clkout", },
-	{ .name = "rk808-regulator", },
+	{ .name = "rk8xx-regulator", },
 	{
 		.name = "rk808-rtc",
 		.num_resources = ARRAY_SIZE(rtc_resources),
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index f834079..c5b525b 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -608,8 +608,8 @@ config REGULATOR_RC5T583
 	  through regulator interface. The device supports multiple DCDC/LDO
 	  outputs which can be controlled by i2c communication.
 
-config REGULATOR_RK808
-	tristate "Rockchip RK808 Power regulators"
+config REGULATOR_RK8XX
+	tristate "Rockchip RK8XX Power regulators"
 	depends on MFD_RK8XX
 	help
 	  Select this option to enable the power regulator of ROCKCHIP
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index 61bfbb9..5d6ffed 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -78,7 +78,7 @@ obj-$(CONFIG_REGULATOR_PBIAS) += pbias-regulator.o
 obj-$(CONFIG_REGULATOR_PCAP) += pcap-regulator.o
 obj-$(CONFIG_REGULATOR_PCF50633) += pcf50633-regulator.o
 obj-$(CONFIG_REGULATOR_RC5T583)  += rc5t583-regulator.o
-obj-$(CONFIG_REGULATOR_RK808)   += rk808-regulator.o
+obj-$(CONFIG_REGULATOR_RK8XX)   += rk8xx-regulator.o
 obj-$(CONFIG_REGULATOR_RN5T618) += rn5t618-regulator.o
 obj-$(CONFIG_REGULATOR_RT5033)	+= rt5033-regulator.o
 obj-$(CONFIG_REGULATOR_S2MPA01) += s2mpa01.o
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk8xx-regulator.c
similarity index 95%
rename from drivers/regulator/rk808-regulator.c
rename to drivers/regulator/rk8xx-regulator.c
index d86a3dc..fc75957 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk8xx-regulator.c
@@ -1,5 +1,5 @@
 /*
- * Regulator driver for Rockchip RK808
+ * Regulator driver for Rockchip's RK8XX PMIC family
  *
  * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
  *
@@ -523,7 +523,7 @@ static struct of_regulator_match rk808_reg_matches[] = {
 	[RK808_ID_SWITCH2]	= { .name = "SWITCH_REG2" },
 };
 
-static int rk808_regulator_dt_parse_pdata(struct device *dev,
+static int rk8xx_regulator_dt_parse_pdata(struct device *dev,
 				   struct device *client_dev,
 				   struct regmap *map,
 				   struct rk808_regulator_data *pdata)
@@ -566,12 +566,12 @@ dt_parse_end:
 	return ret;
 }
 
-static int rk808_regulator_probe(struct platform_device *pdev)
+static int rk8xx_regulator_probe(struct platform_device *pdev)
 {
-	struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent);
-	struct i2c_client *client = rk808->i2c;
+	struct rk808 *rk8xx = dev_get_drvdata(pdev->dev.parent);
+	struct i2c_client *client = rk8xx->i2c;
 	struct regulator_config config = {};
-	struct regulator_dev *rk808_rdev;
+	struct regulator_dev *rk8xx_rdev;
 	struct rk808_regulator_data *pdata;
 	int ret, i;
 
@@ -579,8 +579,8 @@ static int rk808_regulator_probe(struct platform_device *pdev)
 	if (!pdata)
 		return -ENOMEM;
 
-	ret = rk808_regulator_dt_parse_pdata(&pdev->dev, &client->dev,
-					     rk808->regmap, pdata);
+	ret = rk8xx_regulator_dt_parse_pdata(&pdev->dev, &client->dev,
+					     rk8xx->regmap, pdata);
 	if (ret < 0)
 		return ret;
 
@@ -594,34 +594,34 @@ static int rk808_regulator_probe(struct platform_device *pdev)
 
 		config.dev = &client->dev;
 		config.driver_data = pdata;
-		config.regmap = rk808->regmap;
+		config.regmap = rk8xx->regmap;
 		config.of_node = rk808_reg_matches[i].of_node;
 		config.init_data = rk808_reg_matches[i].init_data;
 
-		rk808_rdev = devm_regulator_register(&pdev->dev,
+		rk8xx_rdev = devm_regulator_register(&pdev->dev,
 						     &rk808_reg[i], &config);
-		if (IS_ERR(rk808_rdev)) {
+		if (IS_ERR(rk8xx_rdev)) {
 			dev_err(&client->dev,
 				"failed to register %d regulator\n", i);
-			return PTR_ERR(rk808_rdev);
+			return PTR_ERR(rk8xx_rdev);
 		}
 	}
 
 	return 0;
 }
 
-static struct platform_driver rk808_regulator_driver = {
-	.probe = rk808_regulator_probe,
+static struct platform_driver rk8xx_regulator_driver = {
+	.probe = rk8xx_regulator_probe,
 	.driver = {
-		.name = "rk808-regulator",
+		.name = "rk8xx-regulator",
 		.owner = THIS_MODULE,
 	},
 };
 
-module_platform_driver(rk808_regulator_driver);
+module_platform_driver(rk8xx_regulator_driver);
 
-MODULE_DESCRIPTION("regulator driver for the rk808 series PMICs");
+MODULE_DESCRIPTION("regulator driver for the rk8xx series PMICs");
 MODULE_AUTHOR("Chris Zhong<zyw@rock-chips.com>");
 MODULE_AUTHOR("Zhang Qing<zhangqing@rock-chips.com>");
 MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:rk808-regulator");
+MODULE_ALIAS("platform:rk8xx-regulator");
-- 
1.9.1

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

* [PATCH 4/6] regulator: rk8xx: Migrate to regulator core's simplified DT parsing code
  2016-04-15  9:16 [PATCH 0/6] Add RK818 PMIC support Wadim Egorov
                   ` (2 preceding siblings ...)
  2016-04-15  9:16 ` [PATCH 3/6] regulator: rk808: Make rk808 generic, rename rk808-regulator.c Wadim Egorov
@ 2016-04-15  9:16 ` Wadim Egorov
  2016-04-15  9:16 ` [PATCH 5/6] regulator: rk8xx: Add regulator driver for RK818 Wadim Egorov
  2016-04-15  9:16 ` [PATCH 6/6] mfd: dt-bindings: Add RK818 device tree bindings document Wadim Egorov
  5 siblings, 0 replies; 13+ messages in thread
From: Wadim Egorov @ 2016-04-15  9:16 UTC (permalink / raw)
  To: linux-kernel, linux-arm-kernel, linux-clk, rtc-linux, linux-rockchip
  Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak, linux,
	mturquette, sboyd, lee.jones, lgirdwood, broonie, a.zummo,
	alexandre.belloni, dianders, zyw, arnd, k.kozlowski, javier,
	kgene, olof, geert+renesas, sjoerd.simons, treding,
	public_timo.s

A common simplified DT parsing code for regulators was introduced in
commit a0c7b164ad11 ("regulator: of: Provide simplified DT parsing
method")

While at it also added RK8XX_DESC and RK8XX_DESC_SWITCH macros for the
regulator_desc struct initialization. This just makes the driver more compact.
Remove also linear ranges definitions with only one range.

Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
---
Changes since RFC:
* dropped of_regulator_match
---
 drivers/regulator/rk8xx-regulator.c | 308 +++++++++++++-----------------------
 1 file changed, 114 insertions(+), 194 deletions(-)

diff --git a/drivers/regulator/rk8xx-regulator.c b/drivers/regulator/rk8xx-regulator.c
index fc75957..4a29726 100644
--- a/drivers/regulator/rk8xx-regulator.c
+++ b/drivers/regulator/rk8xx-regulator.c
@@ -55,6 +55,42 @@
 /* max steps for increase voltage of Buck1/2, equal 100mv*/
 #define MAX_STEPS_ONE_TIME 8
 
+#define RK8XX_DESC(_id, _match, _supply, _min, _max, _step, _vreg,	\
+	_vmask, _ereg, _emask, _etime)					\
+	[_id] = {							\
+		.name		= (_match),				\
+		.supply_name	= (_supply),				\
+		.of_match	= of_match_ptr(_match),			\
+		.regulators_node = of_match_ptr("regulators"),		\
+		.type		= REGULATOR_VOLTAGE,			\
+		.id		= (_id),				\
+		.n_voltages	= (((_max) - (_min)) / (_step) + 1),	\
+		.owner		= THIS_MODULE,				\
+		.min_uV		= (_min) * 1000,			\
+		.uV_step	= (_step) * 1000,			\
+		.vsel_reg	= (_vreg),				\
+		.vsel_mask	= (_vmask),				\
+		.enable_reg	= (_ereg),				\
+		.enable_mask	= (_emask),				\
+		.enable_time	= (_etime),				\
+		.ops		= &rk808_reg_ops,			\
+	}
+
+#define RK8XX_DESC_SWITCH(_id, _match, _supply, _ereg, _emask)		\
+	[_id] = {							\
+		.name		= (_match),				\
+		.supply_name	= (_supply),				\
+		.of_match	= of_match_ptr(_match),			\
+		.regulators_node = of_match_ptr("regulators"),		\
+		.type		= REGULATOR_VOLTAGE,			\
+		.id		= (_id),				\
+		.enable_reg	= (_ereg),				\
+		.enable_mask	= (_emask),				\
+		.owner		= THIS_MODULE,				\
+		.ops		= &rk808_switch_ops			\
+	}
+
+
 struct rk808_regulator_data {
 	struct gpio_desc *dvs_gpio[2];
 };
@@ -66,27 +102,11 @@ static const int rk808_buck_config_regs[] = {
 	RK808_BUCK4_CONFIG_REG,
 };
 
-static const struct regulator_linear_range rk808_buck_voltage_ranges[] = {
-	REGULATOR_LINEAR_RANGE(712500, 0, 63, 12500),
-};
-
-static const struct regulator_linear_range rk808_buck4_voltage_ranges[] = {
-	REGULATOR_LINEAR_RANGE(1800000, 0, 15, 100000),
-};
-
-static const struct regulator_linear_range rk808_ldo_voltage_ranges[] = {
-	REGULATOR_LINEAR_RANGE(1800000, 0, 16, 100000),
-};
-
 static const struct regulator_linear_range rk808_ldo3_voltage_ranges[] = {
 	REGULATOR_LINEAR_RANGE(800000, 0, 13, 100000),
 	REGULATOR_LINEAR_RANGE(2500000, 15, 15, 0),
 };
 
-static const struct regulator_linear_range rk808_ldo6_voltage_ranges[] = {
-	REGULATOR_LINEAR_RANGE(800000, 0, 17, 100000),
-};
-
 static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev)
 {
 	struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
@@ -239,7 +259,7 @@ static int rk808_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
 				  RK808_RAMP_RATE_MASK, ramp_value);
 }
 
-static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)
+static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv)
 {
 	unsigned int reg;
 	int sel = regulator_map_voltage_linear_range(rdev, uv, uv);
@@ -254,6 +274,21 @@ static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)
 				  sel);
 }
 
+static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)
+{
+	unsigned int reg;
+	int sel = regulator_map_voltage_linear(rdev, uv, uv);
+
+	if (sel < 0)
+		return -EINVAL;
+
+	reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
+
+	return regmap_update_bits(rdev->regmap, reg,
+				  rdev->desc->vsel_mask,
+				  sel);
+}
+
 static int rk808_set_suspend_enable(struct regulator_dev *rdev)
 {
 	unsigned int reg;
@@ -291,7 +326,7 @@ static struct regulator_ops rk808_buck1_2_ops = {
 	.set_suspend_disable	= rk808_set_suspend_disable,
 };
 
-static struct regulator_ops rk808_reg_ops = {
+static struct regulator_ops rk808_reg_ops_ranges = {
 	.list_voltage		= regulator_list_voltage_linear_range,
 	.map_voltage		= regulator_map_voltage_linear_range,
 	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
@@ -299,6 +334,19 @@ static struct regulator_ops rk808_reg_ops = {
 	.enable			= regulator_enable_regmap,
 	.disable		= regulator_disable_regmap,
 	.is_enabled		= regulator_is_enabled_regmap,
+	.set_suspend_voltage	= rk808_set_suspend_voltage_range,
+	.set_suspend_enable	= rk808_set_suspend_enable,
+	.set_suspend_disable	= rk808_set_suspend_disable,
+};
+
+static struct regulator_ops rk808_reg_ops = {
+	.list_voltage		= regulator_list_voltage_linear,
+	.map_voltage		= regulator_map_voltage_linear,
+	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
+	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
+	.enable			= regulator_enable_regmap,
+	.disable		= regulator_disable_regmap,
+	.is_enabled		= regulator_is_enabled_regmap,
 	.set_suspend_voltage	= rk808_set_suspend_voltage,
 	.set_suspend_enable	= rk808_set_suspend_enable,
 	.set_suspend_disable	= rk808_set_suspend_disable,
@@ -316,12 +364,14 @@ static const struct regulator_desc rk808_reg[] = {
 	{
 		.name = "DCDC_REG1",
 		.supply_name = "vcc1",
+		.of_match = of_match_ptr("DCDC_REG1"),
+		.regulators_node = of_match_ptr("regulators"),
 		.id = RK808_ID_DCDC1,
 		.ops = &rk808_buck1_2_ops,
 		.type = REGULATOR_VOLTAGE,
+		.min_uV = 712500,
+		.uV_step = 12500,
 		.n_voltages = 64,
-		.linear_ranges = rk808_buck_voltage_ranges,
-		.n_linear_ranges = ARRAY_SIZE(rk808_buck_voltage_ranges),
 		.vsel_reg = RK808_BUCK1_ON_VSEL_REG,
 		.vsel_mask = RK808_BUCK_VSEL_MASK,
 		.enable_reg = RK808_DCDC_EN_REG,
@@ -330,12 +380,14 @@ static const struct regulator_desc rk808_reg[] = {
 	}, {
 		.name = "DCDC_REG2",
 		.supply_name = "vcc2",
+		.of_match = of_match_ptr("DCDC_REG2"),
+		.regulators_node = of_match_ptr("regulators"),
 		.id = RK808_ID_DCDC2,
 		.ops = &rk808_buck1_2_ops,
 		.type = REGULATOR_VOLTAGE,
+		.min_uV = 712500,
+		.uV_step = 12500,
 		.n_voltages = 64,
-		.linear_ranges = rk808_buck_voltage_ranges,
-		.n_linear_ranges = ARRAY_SIZE(rk808_buck_voltage_ranges),
 		.vsel_reg = RK808_BUCK2_ON_VSEL_REG,
 		.vsel_mask = RK808_BUCK_VSEL_MASK,
 		.enable_reg = RK808_DCDC_EN_REG,
@@ -344,6 +396,8 @@ static const struct regulator_desc rk808_reg[] = {
 	}, {
 		.name = "DCDC_REG3",
 		.supply_name = "vcc3",
+		.of_match = of_match_ptr("DCDC_REG3"),
+		.regulators_node = of_match_ptr("regulators"),
 		.id = RK808_ID_DCDC3,
 		.ops = &rk808_switch_ops,
 		.type = REGULATOR_VOLTAGE,
@@ -351,55 +405,23 @@ static const struct regulator_desc rk808_reg[] = {
 		.enable_reg = RK808_DCDC_EN_REG,
 		.enable_mask = BIT(2),
 		.owner = THIS_MODULE,
-	}, {
-		.name = "DCDC_REG4",
-		.supply_name = "vcc4",
-		.id = RK808_ID_DCDC4,
-		.ops = &rk808_reg_ops,
-		.type = REGULATOR_VOLTAGE,
-		.n_voltages = 16,
-		.linear_ranges = rk808_buck4_voltage_ranges,
-		.n_linear_ranges = ARRAY_SIZE(rk808_buck4_voltage_ranges),
-		.vsel_reg = RK808_BUCK4_ON_VSEL_REG,
-		.vsel_mask = RK808_BUCK4_VSEL_MASK,
-		.enable_reg = RK808_DCDC_EN_REG,
-		.enable_mask = BIT(3),
-		.owner = THIS_MODULE,
-	}, {
-		.name = "LDO_REG1",
-		.supply_name = "vcc6",
-		.id = RK808_ID_LDO1,
-		.ops = &rk808_reg_ops,
-		.type = REGULATOR_VOLTAGE,
-		.n_voltages = 17,
-		.linear_ranges = rk808_ldo_voltage_ranges,
-		.n_linear_ranges = ARRAY_SIZE(rk808_ldo_voltage_ranges),
-		.vsel_reg = RK808_LDO1_ON_VSEL_REG,
-		.vsel_mask = RK808_LDO_VSEL_MASK,
-		.enable_reg = RK808_LDO_EN_REG,
-		.enable_mask = BIT(0),
-		.enable_time = 400,
-		.owner = THIS_MODULE,
-	}, {
-		.name = "LDO_REG2",
-		.supply_name = "vcc6",
-		.id = RK808_ID_LDO2,
-		.ops = &rk808_reg_ops,
-		.type = REGULATOR_VOLTAGE,
-		.n_voltages = 17,
-		.linear_ranges = rk808_ldo_voltage_ranges,
-		.n_linear_ranges = ARRAY_SIZE(rk808_ldo_voltage_ranges),
-		.vsel_reg = RK808_LDO2_ON_VSEL_REG,
-		.vsel_mask = RK808_LDO_VSEL_MASK,
-		.enable_reg = RK808_LDO_EN_REG,
-		.enable_mask = BIT(1),
-		.enable_time = 400,
-		.owner = THIS_MODULE,
-	}, {
+	},
+	RK8XX_DESC(RK808_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3300, 100,
+		RK808_BUCK4_ON_VSEL_REG, RK808_BUCK4_VSEL_MASK,
+		RK808_DCDC_EN_REG, BIT(3), 0),
+	RK8XX_DESC(RK808_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,
+		RK808_LDO1_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+		BIT(0), 400),
+	RK8XX_DESC(RK808_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,
+		RK808_LDO2_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+		BIT(1), 400),
+	{
 		.name = "LDO_REG3",
 		.supply_name = "vcc7",
+		.of_match = of_match_ptr("LDO_REG3"),
+		.regulators_node = of_match_ptr("regulators"),
 		.id = RK808_ID_LDO3,
-		.ops = &rk808_reg_ops,
+		.ops = &rk808_reg_ops_ranges,
 		.type = REGULATOR_VOLTAGE,
 		.n_voltages = 16,
 		.linear_ranges = rk808_ldo3_voltage_ranges,
@@ -410,117 +432,26 @@ static const struct regulator_desc rk808_reg[] = {
 		.enable_mask = BIT(2),
 		.enable_time = 400,
 		.owner = THIS_MODULE,
-	}, {
-		.name = "LDO_REG4",
-		.supply_name = "vcc9",
-		.id = RK808_ID_LDO4,
-		.ops = &rk808_reg_ops,
-		.type = REGULATOR_VOLTAGE,
-		.n_voltages = 17,
-		.linear_ranges = rk808_ldo_voltage_ranges,
-		.n_linear_ranges = ARRAY_SIZE(rk808_ldo_voltage_ranges),
-		.vsel_reg = RK808_LDO4_ON_VSEL_REG,
-		.vsel_mask = RK808_LDO_VSEL_MASK,
-		.enable_reg = RK808_LDO_EN_REG,
-		.enable_mask = BIT(3),
-		.enable_time = 400,
-		.owner = THIS_MODULE,
-	}, {
-		.name = "LDO_REG5",
-		.supply_name = "vcc9",
-		.id = RK808_ID_LDO5,
-		.ops = &rk808_reg_ops,
-		.type = REGULATOR_VOLTAGE,
-		.n_voltages = 17,
-		.linear_ranges = rk808_ldo_voltage_ranges,
-		.n_linear_ranges = ARRAY_SIZE(rk808_ldo_voltage_ranges),
-		.vsel_reg = RK808_LDO5_ON_VSEL_REG,
-		.vsel_mask = RK808_LDO_VSEL_MASK,
-		.enable_reg = RK808_LDO_EN_REG,
-		.enable_mask = BIT(4),
-		.enable_time = 400,
-		.owner = THIS_MODULE,
-	}, {
-		.name = "LDO_REG6",
-		.supply_name = "vcc10",
-		.id = RK808_ID_LDO6,
-		.ops = &rk808_reg_ops,
-		.type = REGULATOR_VOLTAGE,
-		.n_voltages = 18,
-		.linear_ranges = rk808_ldo6_voltage_ranges,
-		.n_linear_ranges = ARRAY_SIZE(rk808_ldo6_voltage_ranges),
-		.vsel_reg = RK808_LDO6_ON_VSEL_REG,
-		.vsel_mask = RK808_LDO_VSEL_MASK,
-		.enable_reg = RK808_LDO_EN_REG,
-		.enable_mask = BIT(5),
-		.enable_time = 400,
-		.owner = THIS_MODULE,
-	}, {
-		.name = "LDO_REG7",
-		.supply_name = "vcc7",
-		.id = RK808_ID_LDO7,
-		.ops = &rk808_reg_ops,
-		.type = REGULATOR_VOLTAGE,
-		.n_voltages = 18,
-		.linear_ranges = rk808_ldo6_voltage_ranges,
-		.n_linear_ranges = ARRAY_SIZE(rk808_ldo6_voltage_ranges),
-		.vsel_reg = RK808_LDO7_ON_VSEL_REG,
-		.vsel_mask = RK808_LDO_VSEL_MASK,
-		.enable_reg = RK808_LDO_EN_REG,
-		.enable_mask = BIT(6),
-		.enable_time = 400,
-		.owner = THIS_MODULE,
-	}, {
-		.name = "LDO_REG8",
-		.supply_name = "vcc11",
-		.id = RK808_ID_LDO8,
-		.ops = &rk808_reg_ops,
-		.type = REGULATOR_VOLTAGE,
-		.n_voltages = 17,
-		.linear_ranges = rk808_ldo_voltage_ranges,
-		.n_linear_ranges = ARRAY_SIZE(rk808_ldo_voltage_ranges),
-		.vsel_reg = RK808_LDO8_ON_VSEL_REG,
-		.vsel_mask = RK808_LDO_VSEL_MASK,
-		.enable_reg = RK808_LDO_EN_REG,
-		.enable_mask = BIT(7),
-		.enable_time = 400,
-		.owner = THIS_MODULE,
-	}, {
-		.name = "SWITCH_REG1",
-		.supply_name = "vcc8",
-		.id = RK808_ID_SWITCH1,
-		.ops = &rk808_switch_ops,
-		.type = REGULATOR_VOLTAGE,
-		.enable_reg = RK808_DCDC_EN_REG,
-		.enable_mask = BIT(5),
-		.owner = THIS_MODULE,
-	}, {
-		.name = "SWITCH_REG2",
-		.supply_name = "vcc12",
-		.id = RK808_ID_SWITCH2,
-		.ops = &rk808_switch_ops,
-		.type = REGULATOR_VOLTAGE,
-		.enable_reg = RK808_DCDC_EN_REG,
-		.enable_mask = BIT(6),
-		.owner = THIS_MODULE,
 	},
-};
-
-static struct of_regulator_match rk808_reg_matches[] = {
-	[RK808_ID_DCDC1]	= { .name = "DCDC_REG1" },
-	[RK808_ID_DCDC2]	= { .name = "DCDC_REG2" },
-	[RK808_ID_DCDC3]	= { .name = "DCDC_REG3" },
-	[RK808_ID_DCDC4]	= { .name = "DCDC_REG4" },
-	[RK808_ID_LDO1]		= { .name = "LDO_REG1" },
-	[RK808_ID_LDO2]		= { .name = "LDO_REG2" },
-	[RK808_ID_LDO3]		= { .name = "LDO_REG3" },
-	[RK808_ID_LDO4]		= { .name = "LDO_REG4" },
-	[RK808_ID_LDO5]		= { .name = "LDO_REG5" },
-	[RK808_ID_LDO6]		= { .name = "LDO_REG6" },
-	[RK808_ID_LDO7]		= { .name = "LDO_REG7" },
-	[RK808_ID_LDO8]		= { .name = "LDO_REG8" },
-	[RK808_ID_SWITCH1]	= { .name = "SWITCH_REG1" },
-	[RK808_ID_SWITCH2]	= { .name = "SWITCH_REG2" },
+	RK8XX_DESC(RK808_ID_LDO4, "LDO_REG4", "vcc9", 1800, 3400, 100,
+		RK808_LDO4_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+		BIT(3), 400),
+	RK8XX_DESC(RK808_ID_LDO5, "LDO_REG5", "vcc9", 1800, 3400, 100,
+		RK808_LDO5_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+		BIT(4), 400),
+	RK8XX_DESC(RK808_ID_LDO6, "LDO_REG6", "vcc10", 800, 2500, 100,
+		RK808_LDO6_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+		BIT(5), 400),
+	RK8XX_DESC(RK808_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,
+		RK808_LDO7_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+		BIT(6), 400),
+	RK8XX_DESC(RK808_ID_LDO8, "LDO_REG8", "vcc11", 1800, 3400, 100,
+		RK808_LDO8_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
+		BIT(7), 400),
+	RK8XX_DESC_SWITCH(RK808_ID_SWITCH1, "SWITCH_REG1", "vcc8",
+		RK808_DCDC_EN_REG, BIT(5)),
+	RK8XX_DESC_SWITCH(RK808_ID_SWITCH2, "SWITCH_REG2", "vcc12",
+		RK808_DCDC_EN_REG, BIT(6)),
 };
 
 static int rk8xx_regulator_dt_parse_pdata(struct device *dev,
@@ -529,17 +460,12 @@ static int rk8xx_regulator_dt_parse_pdata(struct device *dev,
 				   struct rk808_regulator_data *pdata)
 {
 	struct device_node *np;
-	int tmp, ret, i;
+	int tmp, ret = 0, i;
 
 	np = of_get_child_by_name(client_dev->of_node, "regulators");
 	if (!np)
 		return -ENXIO;
 
-	ret = of_regulator_match(dev, np, rk808_reg_matches,
-				 RK808_NUM_REGULATORS);
-	if (ret < 0)
-		goto dt_parse_end;
-
 	for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
 		pdata->dvs_gpio[i] =
 			devm_gpiod_get_index_optional(client_dev, "dvs", i,
@@ -586,18 +512,12 @@ static int rk8xx_regulator_probe(struct platform_device *pdev)
 
 	platform_set_drvdata(pdev, pdata);
 
+	config.dev = &client->dev;
+	config.driver_data = pdata;
+	config.regmap = rk8xx->regmap;
+
 	/* Instantiate the regulators */
 	for (i = 0; i < RK808_NUM_REGULATORS; i++) {
-		if (!rk808_reg_matches[i].init_data ||
-		    !rk808_reg_matches[i].of_node)
-			continue;
-
-		config.dev = &client->dev;
-		config.driver_data = pdata;
-		config.regmap = rk8xx->regmap;
-		config.of_node = rk808_reg_matches[i].of_node;
-		config.init_data = rk808_reg_matches[i].init_data;
-
 		rk8xx_rdev = devm_regulator_register(&pdev->dev,
 						     &rk808_reg[i], &config);
 		if (IS_ERR(rk8xx_rdev)) {
-- 
1.9.1

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

* [PATCH 5/6] regulator: rk8xx: Add regulator driver for RK818
  2016-04-15  9:16 [PATCH 0/6] Add RK818 PMIC support Wadim Egorov
                   ` (3 preceding siblings ...)
  2016-04-15  9:16 ` [PATCH 4/6] regulator: rk8xx: Migrate to regulator core's simplified DT parsing code Wadim Egorov
@ 2016-04-15  9:16 ` Wadim Egorov
  2016-04-15  9:16 ` [PATCH 6/6] mfd: dt-bindings: Add RK818 device tree bindings document Wadim Egorov
  5 siblings, 0 replies; 13+ messages in thread
From: Wadim Egorov @ 2016-04-15  9:16 UTC (permalink / raw)
  To: linux-kernel, linux-arm-kernel, linux-clk, rtc-linux, linux-rockchip
  Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak, linux,
	mturquette, sboyd, lee.jones, lgirdwood, broonie, a.zummo,
	alexandre.belloni, dianders, zyw, arnd, k.kozlowski, javier,
	kgene, olof, geert+renesas, sjoerd.simons, treding,
	public_timo.s

Add support for the rk818 regulator. The regulator module consists
of 4 DCDCs, 9 LDOs, 1 switch and 1 BOOST converter which is used to
power OTG and HDMI5V.

The output voltages are configurable and are meant to supply power
to the main processor and other components.

Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
---
 drivers/regulator/rk8xx-regulator.c | 139 ++++++++++++++++++++++++++++++++++--
 1 file changed, 134 insertions(+), 5 deletions(-)

diff --git a/drivers/regulator/rk8xx-regulator.c b/drivers/regulator/rk8xx-regulator.c
index 4a29726..57f2c72 100644
--- a/drivers/regulator/rk8xx-regulator.c
+++ b/drivers/regulator/rk8xx-regulator.c
@@ -6,6 +6,10 @@
  * Author: Chris Zhong <zyw@rock-chips.com>
  * Author: Zhang Qing <zhangqing@rock-chips.com>
  *
+ * Copyright (C) 2016 PHYTEC Messtechnik GmbH
+ *
+ * Author: Wadim Egorov <w.egorov@phytec.de>
+ *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
  * version 2, as published by the Free Software Foundation.
@@ -32,6 +36,12 @@
 #define RK808_BUCK4_VSEL_MASK	0xf
 #define RK808_LDO_VSEL_MASK	0x1f
 
+#define RK818_BUCK_VSEL_MASK		0x3f
+#define RK818_BUCK4_VSEL_MASK		0x1f
+#define RK818_LDO_VSEL_MASK		0x1f
+#define RK818_LDO3_ON_VSEL_MASK		0xf
+#define RK818_BOOST_ON_VSEL_MASK	0xe0
+
 /* Ramp rate definitions for buck1 / buck2 only */
 #define RK808_RAMP_RATE_OFFSET		3
 #define RK808_RAMP_RATE_MASK		(3 << RK808_RAMP_RATE_OFFSET)
@@ -454,6 +464,108 @@ static const struct regulator_desc rk808_reg[] = {
 		RK808_DCDC_EN_REG, BIT(6)),
 };
 
+static const struct regulator_desc rk818_reg[] = {
+	{
+		.name = "DCDC_REG1",
+		.supply_name = "vcc1",
+		.of_match = of_match_ptr("DCDC_REG1"),
+		.regulators_node = of_match_ptr("regulators"),
+		.id = RK818_ID_DCDC1,
+		.ops = &rk808_reg_ops,
+		.type = REGULATOR_VOLTAGE,
+		.min_uV = 712500,
+		.uV_step = 12500,
+		.n_voltages = 64,
+		.vsel_reg = RK818_BUCK1_ON_VSEL_REG,
+		.vsel_mask = RK818_BUCK_VSEL_MASK,
+		.enable_reg = RK818_DCDC_EN_REG,
+		.enable_mask = BIT(0),
+		.owner = THIS_MODULE,
+	}, {
+		.name = "DCDC_REG2",
+		.supply_name = "vcc2",
+		.of_match = of_match_ptr("DCDC_REG2"),
+		.regulators_node = of_match_ptr("regulators"),
+		.id = RK818_ID_DCDC2,
+		.ops = &rk808_reg_ops,
+		.type = REGULATOR_VOLTAGE,
+		.min_uV = 712500,
+		.uV_step = 12500,
+		.n_voltages = 64,
+		.vsel_reg = RK818_BUCK2_ON_VSEL_REG,
+		.vsel_mask = RK818_BUCK_VSEL_MASK,
+		.enable_reg = RK818_DCDC_EN_REG,
+		.enable_mask = BIT(1),
+		.owner = THIS_MODULE,
+	}, {
+		.name = "DCDC_REG3",
+		.supply_name = "vcc3",
+		.of_match = of_match_ptr("DCDC_REG3"),
+		.regulators_node = of_match_ptr("regulators"),
+		.id = RK818_ID_DCDC3,
+		.ops = &rk808_switch_ops,
+		.type = REGULATOR_VOLTAGE,
+		.n_voltages = 1,
+		.enable_reg = RK818_DCDC_EN_REG,
+		.enable_mask = BIT(2),
+		.owner = THIS_MODULE,
+	},
+	RK8XX_DESC(RK818_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3600, 100,
+		RK818_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK,
+		RK818_DCDC_EN_REG, BIT(3), 0),
+	RK8XX_DESC(RK818_ID_BOOST, "DCDC_BOOST", "boost", 4700, 5400, 100,
+		RK818_BOOST_LDO9_ON_VSEL_REG, RK818_BOOST_ON_VSEL_MASK,
+		RK818_DCDC_EN_REG, BIT(4), 0),
+	RK8XX_DESC(RK818_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,
+		RK818_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+		BIT(0), 400),
+	RK8XX_DESC(RK818_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,
+		RK818_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+		BIT(1), 400),
+	{
+		.name = "LDO_REG3",
+		.supply_name = "vcc7",
+		.of_match = of_match_ptr("LDO_REG3"),
+		.regulators_node = of_match_ptr("regulators"),
+		.id = RK818_ID_LDO3,
+		.ops = &rk808_reg_ops_ranges,
+		.type = REGULATOR_VOLTAGE,
+		.n_voltages = 16,
+		.linear_ranges = rk808_ldo3_voltage_ranges,
+		.n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges),
+		.vsel_reg = RK818_LDO3_ON_VSEL_REG,
+		.vsel_mask = RK818_LDO3_ON_VSEL_MASK,
+		.enable_reg = RK818_LDO_EN_REG,
+		.enable_mask = BIT(2),
+		.enable_time = 400,
+		.owner = THIS_MODULE,
+	},
+	RK8XX_DESC(RK818_ID_LDO4, "LDO_REG4", "vcc8", 1800, 3400, 100,
+		RK818_LDO4_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+		BIT(3), 400),
+	RK8XX_DESC(RK818_ID_LDO5, "LDO_REG5", "vcc7", 1800, 3400, 100,
+		RK818_LDO5_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+		BIT(4), 400),
+	RK8XX_DESC(RK818_ID_LDO6, "LDO_REG6", "vcc8", 800, 2500, 100,
+		RK818_LDO6_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+		BIT(5), 400),
+	RK8XX_DESC(RK818_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,
+		RK818_LDO7_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+		BIT(6), 400),
+	RK8XX_DESC(RK818_ID_LDO8, "LDO_REG8", "vcc8", 1800, 3400, 100,
+		RK818_LDO8_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
+		BIT(7), 400),
+	RK8XX_DESC(RK818_ID_LDO9, "LDO_REG9", "vcc9", 1800, 3400, 100,
+		RK818_BOOST_LDO9_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
+		RK818_DCDC_EN_REG, BIT(5), 400),
+	RK8XX_DESC_SWITCH(RK818_ID_SWITCH, "SWITCH_REG", "vcc9",
+		RK818_DCDC_EN_REG, BIT(6)),
+	RK8XX_DESC_SWITCH(RK818_ID_HDMI_SWITCH, "HDMI_SWITCH", "h_5v",
+		RK818_H5V_EN_REG, BIT(0)),
+	RK8XX_DESC_SWITCH(RK818_ID_OTG_SWITCH, "OTG_SWITCH", "usb",
+		RK818_DCDC_EN_REG, BIT(7)),
+};
+
 static int rk8xx_regulator_dt_parse_pdata(struct device *dev,
 				   struct device *client_dev,
 				   struct regmap *map,
@@ -499,7 +611,8 @@ static int rk8xx_regulator_probe(struct platform_device *pdev)
 	struct regulator_config config = {};
 	struct regulator_dev *rk8xx_rdev;
 	struct rk808_regulator_data *pdata;
-	int ret, i;
+	const struct regulator_desc *regulators;
+	int ret, i, nregulators;
 
 	pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
 	if (!pdata)
@@ -512,14 +625,29 @@ static int rk8xx_regulator_probe(struct platform_device *pdev)
 
 	platform_set_drvdata(pdev, pdata);
 
+	switch (rk8xx->variant) {
+	case RK808_ID:
+		regulators = rk808_reg;
+		nregulators = RK808_NUM_REGULATORS;
+		break;
+	case RK818_ID:
+		regulators = rk818_reg;
+		nregulators = RK818_NUM_REGULATORS;
+		break;
+	default:
+		dev_err(&client->dev, "unsupported RK8XX ID %lu\n",
+			rk8xx->variant);
+		return -EINVAL;
+	}
+
 	config.dev = &client->dev;
 	config.driver_data = pdata;
 	config.regmap = rk8xx->regmap;
 
 	/* Instantiate the regulators */
-	for (i = 0; i < RK808_NUM_REGULATORS; i++) {
+	for (i = 0; i < nregulators; i++) {
 		rk8xx_rdev = devm_regulator_register(&pdev->dev,
-						     &rk808_reg[i], &config);
+						     &regulators[i], &config);
 		if (IS_ERR(rk8xx_rdev)) {
 			dev_err(&client->dev,
 				"failed to register %d regulator\n", i);
@@ -541,7 +669,8 @@ static struct platform_driver rk8xx_regulator_driver = {
 module_platform_driver(rk8xx_regulator_driver);
 
 MODULE_DESCRIPTION("regulator driver for the rk8xx series PMICs");
-MODULE_AUTHOR("Chris Zhong<zyw@rock-chips.com>");
-MODULE_AUTHOR("Zhang Qing<zhangqing@rock-chips.com>");
+MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
+MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
+MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>");
 MODULE_LICENSE("GPL");
 MODULE_ALIAS("platform:rk8xx-regulator");
-- 
1.9.1

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

* [PATCH 6/6] mfd: dt-bindings: Add RK818 device tree bindings document
  2016-04-15  9:16 [PATCH 0/6] Add RK818 PMIC support Wadim Egorov
                   ` (4 preceding siblings ...)
  2016-04-15  9:16 ` [PATCH 5/6] regulator: rk8xx: Add regulator driver for RK818 Wadim Egorov
@ 2016-04-15  9:16 ` Wadim Egorov
  5 siblings, 0 replies; 13+ messages in thread
From: Wadim Egorov @ 2016-04-15  9:16 UTC (permalink / raw)
  To: linux-kernel, linux-arm-kernel, linux-clk, rtc-linux, linux-rockchip
  Cc: robh+dt, pawel.moll, mark.rutland, ijc+devicetree, galak, linux,
	mturquette, sboyd, lee.jones, lgirdwood, broonie, a.zummo,
	alexandre.belloni, dianders, zyw, arnd, k.kozlowski, javier,
	kgene, olof, geert+renesas, sjoerd.simons, treding,
	public_timo.s

Add device tree bindings documentation for Rockchip's RK818 PMIC.

Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
---
Changes since RFC:
* fixed names and wildcards
---
 Documentation/devicetree/bindings/mfd/rk808.txt | 37 +++++++++++++++++++++++--
 1 file changed, 34 insertions(+), 3 deletions(-)

diff --git a/Documentation/devicetree/bindings/mfd/rk808.txt b/Documentation/devicetree/bindings/mfd/rk808.txt
index 4ca6aab..5a01d51 100644
--- a/Documentation/devicetree/bindings/mfd/rk808.txt
+++ b/Documentation/devicetree/bindings/mfd/rk808.txt
@@ -1,7 +1,11 @@
-RK808 Power Management Integrated Circuit
+RK8XX Power Management Integrated Circuit
+
+The rk8xx family current members:
+rk808
+rk818
 
 Required properties:
-- compatible: "rockchip,rk808"
+- compatible: "rockchip,rk808", "rockchip,rk818"
 - reg: I2C slave address
 - interrupt-parent: The parent interrupt controller.
 - interrupts: the interrupt outputs of the controller.
@@ -13,6 +17,8 @@ Optional properties:
   default output clock name
 - rockchip,system-power-controller: Telling whether or not this pmic is controlling
   the system power.
+
+Optional RK808 properties:
 - vcc1-supply:  The input supply for DCDC_REG1
 - vcc2-supply:  The input supply for DCDC_REG2
 - vcc3-supply:  The input supply for DCDC_REG3
@@ -29,7 +35,20 @@ Optional properties:
   the gpio controller. If DVS GPIOs aren't present, voltage changes will happen
   very quickly with no slow ramp time.
 
-Regulators: All the regulators of RK808 to be instantiated shall be
+Optional RK818 properties:
+- vcc1-supply:  The input supply for DCDC_REG1
+- vcc2-supply:  The input supply for DCDC_REG2
+- vcc3-supply:  The input supply for DCDC_REG3
+- vcc4-supply:  The input supply for DCDC_REG4
+- boost-supply: The input supply for DCDC_BOOST
+- vcc6-supply:  The input supply for LDO_REG1 and LDO_REG2
+- vcc7-supply:  The input supply for LDO_REG3, LDO_REG5 and LDO_REG7
+- vcc8-supply:  The input supply for LDO_REG4, LDO_REG6 and LDO_REG8
+- vcc9-supply:  The input supply for LDO_REG9 and SWITCH_REG
+- h_5v-supply:  The input supply for HDMI_SWITCH
+- usb-supply:   The input supply for OTG_SWITCH
+
+Regulators: All the regulators of RK8xx to be instantiated shall be
 listed in a child node named 'regulators'. Each regulator is represented
 by a child node of the 'regulators' node.
 
@@ -48,6 +67,18 @@ number as described in RK808 datasheet.
 	- SWITCH_REGn
 		- valid values for n are 1 to 2
 
+Following regulators of the RK818 PMIC block are supported. Note that
+the 'n' in regulator name, as in DCDC_REGn or LDOn, represents the DCDC or LDO
+number as described in RK818 datasheet.
+
+	- DCDC_REGn
+		- valid values for n are 1 to 4.
+	- LDO_REGn
+		- valid values for n are 1 to 9.
+	- SWITCH_REG
+	- HDMI_SWITCH
+	- OTG_SWITCH
+
 Standard regulator bindings are used inside regulator subnodes. Check
   Documentation/devicetree/bindings/regulator/regulator.txt
 for more details
-- 
1.9.1

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

* Re: [PATCH 3/6] regulator: rk808: Make rk808 generic, rename rk808-regulator.c
  2016-04-15  9:16 ` [PATCH 3/6] regulator: rk808: Make rk808 generic, rename rk808-regulator.c Wadim Egorov
@ 2016-04-15 10:26   ` Mark Brown
  2016-04-15 16:24     ` Alexandre Belloni
  2016-04-15 10:36   ` kbuild test robot
  2016-04-15 10:36   ` [PATCH] regulator: rk808: fix platform_no_drv_owner.cocci warnings kbuild test robot
  2 siblings, 1 reply; 13+ messages in thread
From: Mark Brown @ 2016-04-15 10:26 UTC (permalink / raw)
  To: Wadim Egorov
  Cc: linux-kernel, linux-arm-kernel, linux-clk, rtc-linux,
	linux-rockchip, robh+dt, pawel.moll, mark.rutland,
	ijc+devicetree, galak, linux, mturquette, sboyd, lee.jones,
	lgirdwood, a.zummo, alexandre.belloni, dianders, zyw, arnd,
	k.kozlowski, javier, kgene, olof, geert+renesas, sjoerd.simons,
	treding, public_timo.s

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

On Fri, Apr 15, 2016 at 11:16:27AM +0200, Wadim Egorov wrote:

> This patch just renames the rk808 driver so we can reuse this driver
> to add more regulator devices from the RK8XX PMIC family later.

We normally manage to cope fine without renaming things - it's quite
common to have drivers that were initially named after one part
supporting multiple parts, avoiding the rename makes things like
backports easier and avoids needing git log --follow and so on.

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

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

* [PATCH] regulator: rk808: fix platform_no_drv_owner.cocci warnings
  2016-04-15  9:16 ` [PATCH 3/6] regulator: rk808: Make rk808 generic, rename rk808-regulator.c Wadim Egorov
  2016-04-15 10:26   ` Mark Brown
  2016-04-15 10:36   ` kbuild test robot
@ 2016-04-15 10:36   ` kbuild test robot
  2 siblings, 0 replies; 13+ messages in thread
From: kbuild test robot @ 2016-04-15 10:36 UTC (permalink / raw)
  To: Wadim Egorov
  Cc: kbuild-all, linux-kernel, linux-arm-kernel, linux-clk, rtc-linux,
	linux-rockchip, robh+dt, pawel.moll, mark.rutland,
	ijc+devicetree, galak, linux, mturquette, sboyd, lee.jones,
	lgirdwood, broonie, a.zummo, alexandre.belloni, dianders, zyw,
	arnd, k.kozlowski, javier, kgene, olof, geert+renesas,
	sjoerd.simons, treding, public_timo.s

drivers/regulator/rk8xx-regulator.c:617:3-8: No need to set .owner here. The core will do it.

 Remove .owner field if calls are used which set it automatically

Generated by: scripts/coccinelle/api/platform_no_drv_owner.cocci

CC: Wadim Egorov <w.egorov@phytec.de>
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
---

 rk8xx-regulator.c |    1 -
 1 file changed, 1 deletion(-)

--- a/drivers/regulator/rk8xx-regulator.c
+++ b/drivers/regulator/rk8xx-regulator.c
@@ -614,7 +614,6 @@ static struct platform_driver rk8xx_regu
 	.probe = rk8xx_regulator_probe,
 	.driver = {
 		.name = "rk8xx-regulator",
-		.owner = THIS_MODULE,
 	},
 };
 

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

* Re: [PATCH 3/6] regulator: rk808: Make rk808 generic, rename rk808-regulator.c
  2016-04-15  9:16 ` [PATCH 3/6] regulator: rk808: Make rk808 generic, rename rk808-regulator.c Wadim Egorov
  2016-04-15 10:26   ` Mark Brown
@ 2016-04-15 10:36   ` kbuild test robot
  2016-04-15 10:36   ` [PATCH] regulator: rk808: fix platform_no_drv_owner.cocci warnings kbuild test robot
  2 siblings, 0 replies; 13+ messages in thread
From: kbuild test robot @ 2016-04-15 10:36 UTC (permalink / raw)
  To: Wadim Egorov
  Cc: kbuild-all, linux-kernel, linux-arm-kernel, linux-clk, rtc-linux,
	linux-rockchip, robh+dt, pawel.moll, mark.rutland,
	ijc+devicetree, galak, linux, mturquette, sboyd, lee.jones,
	lgirdwood, broonie, a.zummo, alexandre.belloni, dianders, zyw,
	arnd, k.kozlowski, javier, kgene, olof, geert+renesas,
	sjoerd.simons, treding, public_timo.s

Hi Wadim,

[auto build test WARNING on regulator/for-next]
[also build test WARNING on v4.6-rc3 next-20160414]
[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/Wadim-Egorov/Add-RK818-PMIC-support/20160415-172610
base:   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git for-next


coccinelle warnings: (new ones prefixed by >>)

>> drivers/regulator/rk8xx-regulator.c:617:3-8: No need to set .owner here. The core will do it.

Please review and possibly fold the followup patch.

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

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

* Re: [PATCH 3/6] regulator: rk808: Make rk808 generic, rename rk808-regulator.c
  2016-04-15 10:26   ` Mark Brown
@ 2016-04-15 16:24     ` Alexandre Belloni
  2016-04-18  7:25       ` Wadim Egorov
  0 siblings, 1 reply; 13+ messages in thread
From: Alexandre Belloni @ 2016-04-15 16:24 UTC (permalink / raw)
  To: Mark Brown
  Cc: Wadim Egorov, linux-kernel, linux-arm-kernel, linux-clk,
	rtc-linux, linux-rockchip, robh+dt, pawel.moll, mark.rutland,
	ijc+devicetree, galak, linux, mturquette, sboyd, lee.jones,
	lgirdwood, a.zummo, dianders, zyw, arnd, k.kozlowski, javier,
	kgene, olof, geert+renesas, sjoerd.simons, treding,
	public_timo.s

On 15/04/2016 at 11:26:02 +0100, Mark Brown wrote :
> On Fri, Apr 15, 2016 at 11:16:27AM +0200, Wadim Egorov wrote:
> 
> > This patch just renames the rk808 driver so we can reuse this driver
> > to add more regulator devices from the RK8XX PMIC family later.
> 
> We normally manage to cope fine without renaming things - it's quite
> common to have drivers that were initially named after one part
> supporting multiple parts, avoiding the rename makes things like
> backports easier and avoids needing git log --follow and so on.

I agree with that and I will also add that probably at some point in
time a new part may appear with a name matching rk8xx but may not be
compatible with the rk8xx driver and that is when the real mess starts.

Finally, renaming the config options and the modules is not nice for the
user.

-- 
Alexandre Belloni, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

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

* Re: [PATCH 3/6] regulator: rk808: Make rk808 generic, rename rk808-regulator.c
  2016-04-15 16:24     ` Alexandre Belloni
@ 2016-04-18  7:25       ` Wadim Egorov
  2016-04-18 17:03         ` Mark Brown
  0 siblings, 1 reply; 13+ messages in thread
From: Wadim Egorov @ 2016-04-18  7:25 UTC (permalink / raw)
  To: Alexandre Belloni, Mark Brown
  Cc: linux-kernel, linux-arm-kernel, linux-clk, rtc-linux,
	linux-rockchip, robh+dt, pawel.moll, mark.rutland,
	ijc+devicetree, galak, linux, mturquette, sboyd, lee.jones,
	lgirdwood, a.zummo, dianders, zyw, arnd, k.kozlowski, javier,
	kgene, olof, geert+renesas, sjoerd.simons, treding,
	public_timo.s



On 15.04.2016 18:24, Alexandre Belloni wrote:
> On 15/04/2016 at 11:26:02 +0100, Mark Brown wrote :
>> On Fri, Apr 15, 2016 at 11:16:27AM +0200, Wadim Egorov wrote:
>>
>>> This patch just renames the rk808 driver so we can reuse this driver
>>> to add more regulator devices from the RK8XX PMIC family later.
>> We normally manage to cope fine without renaming things - it's quite
>> common to have drivers that were initially named after one part
>> supporting multiple parts, avoiding the rename makes things like
>> backports easier and avoids needing git log --follow and so on.
> I agree with that and I will also add that probably at some point in
> time a new part may appear with a name matching rk8xx but may not be
> compatible with the rk8xx driver and that is when the real mess starts.
>
> Finally, renaming the config options and the modules is not nice for the
> user.
>

OK, renaming the driver and it's config options is not the best idea.
But how about renaming the variables and function names within the drivers?
It would be more clearer which driver parts are generic and are used by
multiple PMIC devices.

It seems this topic has been already discussed here [1].
So the right solution is just to rename the rk808 struct in rk808.h,
don't touch the driver names and config options and naming the
additional RK818 PMIC in the Kconfig?

[1] https://lkml.org/lkml/2015/12/31/13

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

* Re: [PATCH 3/6] regulator: rk808: Make rk808 generic, rename rk808-regulator.c
  2016-04-18  7:25       ` Wadim Egorov
@ 2016-04-18 17:03         ` Mark Brown
  0 siblings, 0 replies; 13+ messages in thread
From: Mark Brown @ 2016-04-18 17:03 UTC (permalink / raw)
  To: Wadim Egorov
  Cc: Alexandre Belloni, linux-kernel, linux-arm-kernel, linux-clk,
	rtc-linux, linux-rockchip, robh+dt, pawel.moll, mark.rutland,
	ijc+devicetree, galak, linux, mturquette, sboyd, lee.jones,
	lgirdwood, a.zummo, dianders, zyw, arnd, k.kozlowski, javier,
	kgene, olof, geert+renesas, sjoerd.simons, treding,
	public_timo.s

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

On Mon, Apr 18, 2016 at 09:25:57AM +0200, Wadim Egorov wrote:

> It seems this topic has been already discussed here [1].
> So the right solution is just to rename the rk808 struct in rk808.h,
> don't touch the driver names and config options and naming the
> additional RK818 PMIC in the Kconfig?

Something like that, yes.  If it's really useful for clarification some
renaming of code might be useful.

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

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

end of thread, other threads:[~2016-04-18 17:03 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-04-15  9:16 [PATCH 0/6] Add RK818 PMIC support Wadim Egorov
2016-04-15  9:16 ` [PATCH 1/6] mfd: RK808: Make RK808 generic, rename rk808.c to rk8xx.c Wadim Egorov
2016-04-15  9:16 ` [PATCH 2/6] mfd: RK808: Add RK818 support Wadim Egorov
2016-04-15  9:16 ` [PATCH 3/6] regulator: rk808: Make rk808 generic, rename rk808-regulator.c Wadim Egorov
2016-04-15 10:26   ` Mark Brown
2016-04-15 16:24     ` Alexandre Belloni
2016-04-18  7:25       ` Wadim Egorov
2016-04-18 17:03         ` Mark Brown
2016-04-15 10:36   ` kbuild test robot
2016-04-15 10:36   ` [PATCH] regulator: rk808: fix platform_no_drv_owner.cocci warnings kbuild test robot
2016-04-15  9:16 ` [PATCH 4/6] regulator: rk8xx: Migrate to regulator core's simplified DT parsing code Wadim Egorov
2016-04-15  9:16 ` [PATCH 5/6] regulator: rk8xx: Add regulator driver for RK818 Wadim Egorov
2016-04-15  9:16 ` [PATCH 6/6] mfd: dt-bindings: Add RK818 device tree bindings document Wadim Egorov

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).