linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/5] mfd: tps65912: Driver rewrite with DT support
@ 2015-10-01 20:37 Andrew F. Davis
  2015-10-01 20:37 ` [PATCH v4 1/5] Documentation: tps65912: Add DT bindings for the TPS65912 PMIC Andrew F. Davis
                   ` (4 more replies)
  0 siblings, 5 replies; 44+ messages in thread
From: Andrew F. Davis @ 2015-10-01 20:37 UTC (permalink / raw)
  To: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Mark Brown, Alexandre Courbot, Grygorii Strashko
  Cc: devicetree, linux-kernel, Andrew F. Davis

In an effort to cleanup this driver and add Device Tree support
the driver has been rewritten based on new driver styles and
modern kernel driver helpers. This has nearly halved the lines
of code while keeping all previous functionality.

Platform file based initialization has been dropped as there is
no examples of this use in the kernel.

v1 can be found here: [1] v2: [2] v3: [3]

Changes from v3:
 - Reorganized regulator driver and related DT node
 - Other small fixes as discussed in v3 thread

Changes from v2:
 - Split the series further into subsystems

Changes from v1:
 - Split the rewrite into delete/create patches
 - Several small fixes as discussed in v1 thread

[1] http://www.spinics.net/lists/devicetree/msg93863.html
[2] http://www.spinics.net/lists/devicetree/msg95003.html
[3] http://www.spinics.net/lists/devicetree/msg95133.html

Andrew F. Davis (5):
  Documentation: tps65912: Add DT bindings for the TPS65912 PMIC
  mfd: tps65912: Remove old driver in preparation for new driver
  mfd: tps65912: Add driver for the TPS65912 PMIC
  regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  gpio: tps65912: Add GPIO driver for the TPS65912 PMIC

 .../devicetree/bindings/gpio/gpio-tps65912.txt     |  16 +
 Documentation/devicetree/bindings/mfd/tps65912.txt |  51 ++
 .../bindings/regulator/tps65912-regulator.txt      |  28 +
 drivers/gpio/Kconfig                               |   2 +-
 drivers/gpio/gpio-tps65912.c                       | 290 ++++-----
 drivers/mfd/Kconfig                                |  23 +-
 drivers/mfd/Makefile                               |   3 +-
 drivers/mfd/tps65912-core.c                        | 283 ++++----
 drivers/mfd/tps65912-i2c.c                         | 221 +++----
 drivers/mfd/tps65912-irq.c                         | 217 -------
 drivers/mfd/tps65912-spi.c                         | 222 +++----
 drivers/regulator/Kconfig                          |   2 +-
 drivers/regulator/tps65912-regulator.c             | 712 +++++----------------
 include/linux/mfd/tps65912.h                       | 211 +++---
 14 files changed, 802 insertions(+), 1479 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/gpio/gpio-tps65912.txt
 create mode 100644 Documentation/devicetree/bindings/mfd/tps65912.txt
 create mode 100644 Documentation/devicetree/bindings/regulator/tps65912-regulator.txt
 rewrite drivers/gpio/gpio-tps65912.c (69%)
 rewrite drivers/mfd/tps65912-core.c (96%)
 rewrite drivers/mfd/tps65912-i2c.c (93%)
 delete mode 100644 drivers/mfd/tps65912-irq.c
 rewrite drivers/mfd/tps65912-spi.c (92%)
 rewrite drivers/regulator/tps65912-regulator.c (94%)

-- 
1.9.1


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

* [PATCH v4 1/5] Documentation: tps65912: Add DT bindings for the TPS65912 PMIC
  2015-10-01 20:37 [PATCH v4 0/5] mfd: tps65912: Driver rewrite with DT support Andrew F. Davis
@ 2015-10-01 20:37 ` Andrew F. Davis
  2015-10-01 20:37 ` [PATCH v4 2/5] mfd: tps65912: Remove old driver in preparation for new driver Andrew F. Davis
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 44+ messages in thread
From: Andrew F. Davis @ 2015-10-01 20:37 UTC (permalink / raw)
  To: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Mark Brown, Alexandre Courbot, Grygorii Strashko
  Cc: devicetree, linux-kernel, Andrew F. Davis

The TPS65912 PMIC contains several regulators and a GPIO controller.
Add bindings for the TPS65912 PMIC.

Signed-off-by: Andrew F. Davis <afd@ti.com>
---
 .../devicetree/bindings/gpio/gpio-tps65912.txt     | 16 +++++++
 Documentation/devicetree/bindings/mfd/tps65912.txt | 51 ++++++++++++++++++++++
 .../bindings/regulator/tps65912-regulator.txt      | 28 ++++++++++++
 3 files changed, 95 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/gpio/gpio-tps65912.txt
 create mode 100644 Documentation/devicetree/bindings/mfd/tps65912.txt
 create mode 100644 Documentation/devicetree/bindings/regulator/tps65912-regulator.txt

diff --git a/Documentation/devicetree/bindings/gpio/gpio-tps65912.txt b/Documentation/devicetree/bindings/gpio/gpio-tps65912.txt
new file mode 100644
index 0000000..0c5c05c4
--- /dev/null
+++ b/Documentation/devicetree/bindings/gpio/gpio-tps65912.txt
@@ -0,0 +1,16 @@
+* TPS65912 GPIO Controller bindings
+
+Required properties:
+ - compatible : Should be "ti,tps65912-gpio".
+ - gpio-controller : Marks the device node as a GPIO Controller.
+ - #gpio-cells : Should be two.  The first cell is the pin number and
+     the second cell is used to specify flags.
+     See include/dt-bindings/gpio/gpio.h for possible values.
+
+Example:
+
+	gpio4: tps65912_gpio {
+		compatible = "ti,tps65912-gpio";
+		gpio-controller;
+		#gpio-cells = <2>;
+	};
diff --git a/Documentation/devicetree/bindings/mfd/tps65912.txt b/Documentation/devicetree/bindings/mfd/tps65912.txt
new file mode 100644
index 0000000..da5804a
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/tps65912.txt
@@ -0,0 +1,51 @@
+* TPS65912 Power Management Integrated Circuit bindings
+
+Required properties:
+ - compatible : Should be "ti,tps65912".
+ - reg : Slave address or chip select number (I2C / SPI).
+ - interrupt-parent : The parent interrupt controller.
+ - interrupts : The interrupt line the device is connected to.
+ - interrupt-controller : Marks the device node as an interrupt controller.
+ - #interrupt-cells: The number of cells to describe an IRQ, this should be 2.
+     The first cell is the IRQ number.
+     The second cell is the flags, encoded as the trigger masks from
+     ../interrupt-controller/interrupts.txt
+
+Additional nodes defined in:
+ - Regulators: ../regulator/tps65912-regulator.txt
+ - GPIO: ../gpio/gpio-tps65912.txt.
+
+Example:
+
+	pmic: tps65912@2d {
+		compatible = "ti,tps65912";
+		reg = <0x2d>;
+		interrupt-parent = <&gpio1>;
+		interrupts = <28 IRQ_TYPE_LEVEL_LOW>;
+		interrupt-controller;
+		#interrupt-cells = <2>;
+
+		regulators {
+			compatible = "ti,tps65912-regulator";
+
+			dcdc1 {
+				regulator-name = "vdd_core";
+				regulator-min-microvolt = <912000>;
+				regulator-max-microvolt = <1144000>;
+				regulator-boot-on;
+				regulator-always-on;
+			};
+
+			ldo1 {
+				regulator-name = "ldo1";
+				regulator-min-microvolt = <1900000>;
+				regulator-max-microvolt = <1900000>;
+			};
+		};
+
+		gpio4: tps65912_gpio {
+			compatible = "ti,tps65912-gpio";
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+	};
diff --git a/Documentation/devicetree/bindings/regulator/tps65912-regulator.txt b/Documentation/devicetree/bindings/regulator/tps65912-regulator.txt
new file mode 100644
index 0000000..4cd05fa
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/tps65912-regulator.txt
@@ -0,0 +1,28 @@
+* TPS65912 regulator bindings
+
+Required properties:
+ - compatible: "ti,tps65912-regulator"
+ - list of regulators provided by this controller, must be named
+     after their hardware counterparts: dcdc[1-4] and ldo[1-10]
+
+Each regulator is defined using the standard binding for regulators.
+
+Example:
+
+	tps65912_regulator {
+		compatible = "ti,tps65912-regulator";
+
+		dcdc1 {
+			regulator-name = "vdd_core";
+			regulator-min-microvolt = <912000>;
+			regulator-max-microvolt = <1144000>;
+			regulator-boot-on;
+			regulator-always-on;
+		};
+
+		ldo1 {
+			regulator-name = "ldo1";
+			regulator-min-microvolt = <1900000>;
+			regulator-max-microvolt = <1900000>;
+		};
+	};
-- 
1.9.1


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

* [PATCH v4 2/5] mfd: tps65912: Remove old driver in preparation for new driver
  2015-10-01 20:37 [PATCH v4 0/5] mfd: tps65912: Driver rewrite with DT support Andrew F. Davis
  2015-10-01 20:37 ` [PATCH v4 1/5] Documentation: tps65912: Add DT bindings for the TPS65912 PMIC Andrew F. Davis
@ 2015-10-01 20:37 ` Andrew F. Davis
  2015-10-05  9:28   ` Lee Jones
  2015-10-01 20:37 ` [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC Andrew F. Davis
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 44+ messages in thread
From: Andrew F. Davis @ 2015-10-01 20:37 UTC (permalink / raw)
  To: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Mark Brown, Alexandre Courbot, Grygorii Strashko
  Cc: devicetree, linux-kernel, Andrew F. Davis

The old tps65912 driver is being replaced, delete old driver.

Signed-off-by: Andrew F. Davis <afd@ti.com>
---
 drivers/gpio/Kconfig                   |   6 -
 drivers/gpio/Makefile                  |   1 -
 drivers/gpio/gpio-tps65912.c           | 153 ----------
 drivers/mfd/Kconfig                    |  26 --
 drivers/mfd/Makefile                   |   4 -
 drivers/mfd/tps65912-core.c            | 175 -----------
 drivers/mfd/tps65912-i2c.c             | 139 ---------
 drivers/mfd/tps65912-irq.c             | 217 -------------
 drivers/mfd/tps65912-spi.c             | 141 ---------
 drivers/regulator/Kconfig              |   6 -
 drivers/regulator/Makefile             |   1 -
 drivers/regulator/tps65912-regulator.c | 541 ---------------------------------
 include/linux/mfd/tps65912.h           | 328 --------------------
 13 files changed, 1738 deletions(-)
 delete mode 100644 drivers/gpio/gpio-tps65912.c
 delete mode 100644 drivers/mfd/tps65912-core.c
 delete mode 100644 drivers/mfd/tps65912-i2c.c
 delete mode 100644 drivers/mfd/tps65912-irq.c
 delete mode 100644 drivers/mfd/tps65912-spi.c
 delete mode 100644 drivers/regulator/tps65912-regulator.c
 delete mode 100644 include/linux/mfd/tps65912.h

diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index b4fc9e4..fb28483 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -838,12 +838,6 @@ config GPIO_TPS65910
 	  Select this option to enable GPIO driver for the TPS65910
 	  chip family.
 
-config GPIO_TPS65912
-	tristate "TI TPS65912 GPIO"
-	depends on (MFD_TPS65912_I2C || MFD_TPS65912_SPI)
-	help
-	  This driver supports TPS65912 gpio chip
-
 config GPIO_TWL4030
 	tristate "TWL4030, TWL5030, and TPS659x0 GPIOs"
 	depends on TWL4030_CORE
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index f79a7c4..605bf89 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -96,7 +96,6 @@ obj-$(CONFIG_GPIO_TIMBERDALE)	+= gpio-timberdale.o
 obj-$(CONFIG_GPIO_PALMAS)	+= gpio-palmas.o
 obj-$(CONFIG_GPIO_TPS6586X)	+= gpio-tps6586x.o
 obj-$(CONFIG_GPIO_TPS65910)	+= gpio-tps65910.o
-obj-$(CONFIG_GPIO_TPS65912)	+= gpio-tps65912.o
 obj-$(CONFIG_GPIO_TS5500)	+= gpio-ts5500.o
 obj-$(CONFIG_GPIO_TWL4030)	+= gpio-twl4030.o
 obj-$(CONFIG_GPIO_TWL6040)	+= gpio-twl6040.o
diff --git a/drivers/gpio/gpio-tps65912.c b/drivers/gpio/gpio-tps65912.c
deleted file mode 100644
index 9cdbc0c..0000000
--- a/drivers/gpio/gpio-tps65912.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright 2011 Texas Instruments Inc.
- *
- * Author: Margarita Olaya <magi@slimlogic.co.uk>
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under  the terms of the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- * This driver is based on wm8350 implementation.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/errno.h>
-#include <linux/gpio.h>
-#include <linux/mfd/core.h>
-#include <linux/platform_device.h>
-#include <linux/seq_file.h>
-#include <linux/slab.h>
-#include <linux/mfd/tps65912.h>
-
-struct tps65912_gpio_data {
-	struct tps65912 *tps65912;
-	struct gpio_chip gpio_chip;
-};
-
-#define to_tgd(gc) container_of(gc, struct tps65912_gpio_data, gpio_chip)
-
-static int tps65912_gpio_get(struct gpio_chip *gc, unsigned offset)
-{
-	struct tps65912_gpio_data *tps65912_gpio = to_tgd(gc);
-	struct tps65912 *tps65912 = tps65912_gpio->tps65912;
-	int val;
-
-	val = tps65912_reg_read(tps65912, TPS65912_GPIO1 + offset);
-
-	if (val & GPIO_STS_MASK)
-		return 1;
-
-	return 0;
-}
-
-static void tps65912_gpio_set(struct gpio_chip *gc, unsigned offset,
-			      int value)
-{
-	struct tps65912_gpio_data *tps65912_gpio = to_tgd(gc);
-	struct tps65912 *tps65912 = tps65912_gpio->tps65912;
-
-	if (value)
-		tps65912_set_bits(tps65912, TPS65912_GPIO1 + offset,
-							GPIO_SET_MASK);
-	else
-		tps65912_clear_bits(tps65912, TPS65912_GPIO1 + offset,
-								GPIO_SET_MASK);
-}
-
-static int tps65912_gpio_output(struct gpio_chip *gc, unsigned offset,
-				int value)
-{
-	struct tps65912_gpio_data *tps65912_gpio = to_tgd(gc);
-	struct tps65912 *tps65912 = tps65912_gpio->tps65912;
-
-	/* Set the initial value */
-	tps65912_gpio_set(gc, offset, value);
-
-	return tps65912_set_bits(tps65912, TPS65912_GPIO1 + offset,
-								GPIO_CFG_MASK);
-}
-
-static int tps65912_gpio_input(struct gpio_chip *gc, unsigned offset)
-{
-	struct tps65912_gpio_data *tps65912_gpio = to_tgd(gc);
-	struct tps65912 *tps65912 = tps65912_gpio->tps65912;
-
-	return tps65912_clear_bits(tps65912, TPS65912_GPIO1 + offset,
-								GPIO_CFG_MASK);
-}
-
-static struct gpio_chip template_chip = {
-	.label			= "tps65912",
-	.owner			= THIS_MODULE,
-	.direction_input	= tps65912_gpio_input,
-	.direction_output	= tps65912_gpio_output,
-	.get			= tps65912_gpio_get,
-	.set			= tps65912_gpio_set,
-	.can_sleep		= true,
-	.ngpio			= 5,
-	.base			= -1,
-};
-
-static int tps65912_gpio_probe(struct platform_device *pdev)
-{
-	struct tps65912 *tps65912 = dev_get_drvdata(pdev->dev.parent);
-	struct tps65912_board *pdata = dev_get_platdata(tps65912->dev);
-	struct tps65912_gpio_data *tps65912_gpio;
-	int ret;
-
-	tps65912_gpio = devm_kzalloc(&pdev->dev, sizeof(*tps65912_gpio),
-				     GFP_KERNEL);
-	if (tps65912_gpio == NULL)
-		return -ENOMEM;
-
-	tps65912_gpio->tps65912 = tps65912;
-	tps65912_gpio->gpio_chip = template_chip;
-	tps65912_gpio->gpio_chip.dev = &pdev->dev;
-	if (pdata && pdata->gpio_base)
-		tps65912_gpio->gpio_chip.base = pdata->gpio_base;
-
-	ret = gpiochip_add(&tps65912_gpio->gpio_chip);
-	if (ret < 0) {
-		dev_err(&pdev->dev, "Failed to register gpiochip, %d\n", ret);
-		return ret;
-	}
-
-	platform_set_drvdata(pdev, tps65912_gpio);
-
-	return ret;
-}
-
-static int tps65912_gpio_remove(struct platform_device *pdev)
-{
-	struct tps65912_gpio_data  *tps65912_gpio = platform_get_drvdata(pdev);
-
-	gpiochip_remove(&tps65912_gpio->gpio_chip);
-	return 0;
-}
-
-static struct platform_driver tps65912_gpio_driver = {
-	.driver = {
-		.name = "tps65912-gpio",
-	},
-	.probe = tps65912_gpio_probe,
-	.remove = tps65912_gpio_remove,
-};
-
-static int __init tps65912_gpio_init(void)
-{
-	return platform_driver_register(&tps65912_gpio_driver);
-}
-subsys_initcall(tps65912_gpio_init);
-
-static void __exit tps65912_gpio_exit(void)
-{
-	platform_driver_unregister(&tps65912_gpio_driver);
-}
-module_exit(tps65912_gpio_exit);
-
-MODULE_AUTHOR("Margarita Olaya Cabrera <magi@slimlogic.co.uk>");
-MODULE_DESCRIPTION("GPIO interface for TPS65912 PMICs");
-MODULE_LICENSE("GPL v2");
-MODULE_ALIAS("platform:tps65912-gpio");
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 99d6367..9a8df8e 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -1167,32 +1167,6 @@ config MFD_TPS65910
 	  if you say yes here you get support for the TPS65910 series of
 	  Power Management chips.
 
-config MFD_TPS65912
-	bool "TI TPS65912 Power Management chip"
-	depends on GPIOLIB
-	select MFD_CORE
-	help
-	  If you say yes here you get support for the TPS65912 series of
-	  PM chips.
-
-config MFD_TPS65912_I2C
-	bool "TI TPS65912 Power Management chip with I2C"
-	select MFD_CORE
-	select MFD_TPS65912
-	depends on I2C=y && GPIOLIB
-	help
-	  If you say yes here you get support for the TPS65912 series of
-	  PM chips with I2C interface.
-
-config MFD_TPS65912_SPI
-	bool "TI TPS65912 Power Management chip with SPI"
-	select MFD_CORE
-	select MFD_TPS65912
-	depends on SPI_MASTER && GPIOLIB
-	help
-	  If you say yes here you get support for the TPS65912 series of
-	  PM chips with SPI interface.
-
 config MFD_TPS80031
 	bool "TI TPS80031/TPS80032 Power Management chips"
 	depends on I2C=y
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index a59e3fc..004aa76 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -69,10 +69,6 @@ obj-$(CONFIG_TPS6507X)		+= tps6507x.o
 obj-$(CONFIG_MFD_TPS65217)	+= tps65217.o
 obj-$(CONFIG_MFD_TPS65218)	+= tps65218.o
 obj-$(CONFIG_MFD_TPS65910)	+= tps65910.o
-tps65912-objs                   := tps65912-core.o tps65912-irq.o
-obj-$(CONFIG_MFD_TPS65912)	+= tps65912.o
-obj-$(CONFIG_MFD_TPS65912_I2C)	+= tps65912-i2c.o
-obj-$(CONFIG_MFD_TPS65912_SPI)  += tps65912-spi.o
 obj-$(CONFIG_MFD_TPS80031)	+= tps80031.o
 obj-$(CONFIG_MENELAUS)		+= menelaus.o
 
diff --git a/drivers/mfd/tps65912-core.c b/drivers/mfd/tps65912-core.c
deleted file mode 100644
index 1f82d60..0000000
--- a/drivers/mfd/tps65912-core.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * tps65912-core.c  --  TI TPS65912x
- *
- * Copyright 2011 Texas Instruments Inc.
- *
- * Author: Margarita Olaya Cabrera <magi@slimlogic.co.uk>
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under  the terms of the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  This driver is based on wm8350 implementation.
- */
-
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/slab.h>
-#include <linux/gpio.h>
-#include <linux/mfd/core.h>
-#include <linux/mfd/tps65912.h>
-
-static const struct mfd_cell tps65912s[] = {
-	{
-		.name = "tps65912-pmic",
-	},
-};
-
-int tps65912_set_bits(struct tps65912 *tps65912, u8 reg, u8 mask)
-{
-	u8 data;
-	int err;
-
-	mutex_lock(&tps65912->io_mutex);
-
-	err = tps65912->read(tps65912, reg, 1, &data);
-	if (err) {
-		dev_err(tps65912->dev, "Read from reg 0x%x failed\n", reg);
-		goto out;
-	}
-
-	data |= mask;
-	err = tps65912->write(tps65912, reg, 1, &data);
-	if (err)
-		dev_err(tps65912->dev, "Write to reg 0x%x failed\n", reg);
-
-out:
-	mutex_unlock(&tps65912->io_mutex);
-	return err;
-}
-EXPORT_SYMBOL_GPL(tps65912_set_bits);
-
-int tps65912_clear_bits(struct tps65912 *tps65912, u8 reg, u8 mask)
-{
-	u8 data;
-	int err;
-
-	mutex_lock(&tps65912->io_mutex);
-	err = tps65912->read(tps65912, reg, 1, &data);
-	if (err) {
-		dev_err(tps65912->dev, "Read from reg 0x%x failed\n", reg);
-		goto out;
-	}
-
-	data &= ~mask;
-	err = tps65912->write(tps65912, reg, 1, &data);
-	if (err)
-		dev_err(tps65912->dev, "Write to reg 0x%x failed\n", reg);
-
-out:
-	mutex_unlock(&tps65912->io_mutex);
-	return err;
-}
-EXPORT_SYMBOL_GPL(tps65912_clear_bits);
-
-static inline int tps65912_read(struct tps65912 *tps65912, u8 reg)
-{
-	u8 val;
-	int err;
-
-	err = tps65912->read(tps65912, reg, 1, &val);
-	if (err < 0)
-		return err;
-
-	return val;
-}
-
-static inline int tps65912_write(struct tps65912 *tps65912, u8 reg, u8 val)
-{
-	return tps65912->write(tps65912, reg, 1, &val);
-}
-
-int tps65912_reg_read(struct tps65912 *tps65912, u8 reg)
-{
-	int data;
-
-	mutex_lock(&tps65912->io_mutex);
-
-	data = tps65912_read(tps65912, reg);
-	if (data < 0)
-		dev_err(tps65912->dev, "Read from reg 0x%x failed\n", reg);
-
-	mutex_unlock(&tps65912->io_mutex);
-	return data;
-}
-EXPORT_SYMBOL_GPL(tps65912_reg_read);
-
-int tps65912_reg_write(struct tps65912 *tps65912, u8 reg, u8 val)
-{
-	int err;
-
-	mutex_lock(&tps65912->io_mutex);
-
-	err = tps65912_write(tps65912, reg, val);
-	if (err < 0)
-		dev_err(tps65912->dev, "Write for reg 0x%x failed\n", reg);
-
-	mutex_unlock(&tps65912->io_mutex);
-	return err;
-}
-EXPORT_SYMBOL_GPL(tps65912_reg_write);
-
-int tps65912_device_init(struct tps65912 *tps65912)
-{
-	struct tps65912_board *pmic_plat_data = dev_get_platdata(tps65912->dev);
-	struct tps65912_platform_data *init_data;
-	int ret, dcdc_avs, value;
-
-	init_data = kzalloc(sizeof(struct tps65912_platform_data), GFP_KERNEL);
-	if (init_data == NULL)
-		return -ENOMEM;
-
-	mutex_init(&tps65912->io_mutex);
-	dev_set_drvdata(tps65912->dev, tps65912);
-
-	dcdc_avs = (pmic_plat_data->is_dcdc1_avs << 0 |
-			pmic_plat_data->is_dcdc2_avs  << 1 |
-				pmic_plat_data->is_dcdc3_avs << 2 |
-					pmic_plat_data->is_dcdc4_avs << 3);
-	if (dcdc_avs) {
-		tps65912->read(tps65912, TPS65912_I2C_SPI_CFG, 1, &value);
-		dcdc_avs |= value;
-		tps65912->write(tps65912, TPS65912_I2C_SPI_CFG, 1, &dcdc_avs);
-	}
-
-	ret = mfd_add_devices(tps65912->dev, -1,
-			      tps65912s, ARRAY_SIZE(tps65912s),
-			      NULL, 0, NULL);
-	if (ret < 0)
-		goto err;
-
-	init_data->irq = pmic_plat_data->irq;
-	init_data->irq_base = pmic_plat_data->irq_base;
-	ret = tps65912_irq_init(tps65912, init_data->irq, init_data);
-	if (ret < 0)
-		goto err;
-
-	kfree(init_data);
-	return ret;
-
-err:
-	kfree(init_data);
-	mfd_remove_devices(tps65912->dev);
-	return ret;
-}
-
-void tps65912_device_exit(struct tps65912 *tps65912)
-{
-	mfd_remove_devices(tps65912->dev);
-	tps65912_irq_exit(tps65912);
-}
-
-MODULE_AUTHOR("Margarita Olaya	<magi@slimlogic.co.uk>");
-MODULE_DESCRIPTION("TPS65912x chip family multi-function driver");
-MODULE_LICENSE("GPL");
diff --git a/drivers/mfd/tps65912-i2c.c b/drivers/mfd/tps65912-i2c.c
deleted file mode 100644
index 7e55640..0000000
--- a/drivers/mfd/tps65912-i2c.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * tps65912-i2c.c  --  I2C access for TI TPS65912x PMIC
- *
- * Copyright 2011 Texas Instruments Inc.
- *
- * Author: Margarita Olaya Cabrera <magi@slimlogic.co.uk>
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under  the terms of the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  This driver is based on wm8350 implementation.
- */
-
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/gpio.h>
-#include <linux/i2c.h>
-#include <linux/mfd/core.h>
-#include <linux/mfd/tps65912.h>
-
-static int tps65912_i2c_read(struct tps65912 *tps65912, u8 reg,
-				  int bytes, void *dest)
-{
-	struct i2c_client *i2c = tps65912->control_data;
-	struct i2c_msg xfer[2];
-	int ret;
-
-	/* Write register */
-	xfer[0].addr = i2c->addr;
-	xfer[0].flags = 0;
-	xfer[0].len = 1;
-	xfer[0].buf = &reg;
-
-	/* Read data */
-	xfer[1].addr = i2c->addr;
-	xfer[1].flags = I2C_M_RD;
-	xfer[1].len = bytes;
-	xfer[1].buf = dest;
-
-	ret = i2c_transfer(i2c->adapter, xfer, 2);
-	if (ret == 2)
-		ret = 0;
-	else if (ret >= 0)
-		ret = -EIO;
-	return ret;
-}
-
-static int tps65912_i2c_write(struct tps65912 *tps65912, u8 reg,
-				   int bytes, void *src)
-{
-	struct i2c_client *i2c = tps65912->control_data;
-	/* we add 1 byte for device register */
-	u8 msg[TPS6591X_MAX_REGISTER + 1];
-	int ret;
-
-	if (bytes > TPS6591X_MAX_REGISTER)
-		return -EINVAL;
-
-	msg[0] = reg;
-	memcpy(&msg[1], src, bytes);
-
-	ret = i2c_master_send(i2c, msg, bytes + 1);
-	if (ret < 0)
-		return ret;
-	if (ret != bytes + 1)
-		return -EIO;
-
-	return 0;
-}
-
-static int tps65912_i2c_probe(struct i2c_client *i2c,
-			    const struct i2c_device_id *id)
-{
-	struct tps65912 *tps65912;
-
-	tps65912 = devm_kzalloc(&i2c->dev,
-				sizeof(struct tps65912), GFP_KERNEL);
-	if (tps65912 == NULL)
-		return -ENOMEM;
-
-	i2c_set_clientdata(i2c, tps65912);
-	tps65912->dev = &i2c->dev;
-	tps65912->control_data = i2c;
-	tps65912->read = tps65912_i2c_read;
-	tps65912->write = tps65912_i2c_write;
-
-	return tps65912_device_init(tps65912);
-}
-
-static int tps65912_i2c_remove(struct i2c_client *i2c)
-{
-	struct tps65912 *tps65912 = i2c_get_clientdata(i2c);
-
-	tps65912_device_exit(tps65912);
-
-	return 0;
-}
-
-static const struct i2c_device_id tps65912_i2c_id[] = {
-	{"tps65912", 0 },
-	{ }
-};
-MODULE_DEVICE_TABLE(i2c, tps65912_i2c_id);
-
-static struct i2c_driver tps65912_i2c_driver = {
-	.driver = {
-		   .name = "tps65912",
-	},
-	.probe = tps65912_i2c_probe,
-	.remove = tps65912_i2c_remove,
-	.id_table = tps65912_i2c_id,
-};
-
-static int __init tps65912_i2c_init(void)
-{
-	int ret;
-
-	ret = i2c_add_driver(&tps65912_i2c_driver);
-	if (ret != 0)
-		pr_err("Failed to register TPS65912 I2C driver: %d\n", ret);
-
-	return ret;
-}
-/* init early so consumer devices can complete system boot */
-subsys_initcall(tps65912_i2c_init);
-
-static void __exit tps65912_i2c_exit(void)
-{
-	i2c_del_driver(&tps65912_i2c_driver);
-}
-module_exit(tps65912_i2c_exit);
-
-MODULE_AUTHOR("Margarita Olaya	<magi@slimlogic.co.uk>");
-MODULE_DESCRIPTION("TPS6591x chip family multi-function driver");
-MODULE_LICENSE("GPL");
diff --git a/drivers/mfd/tps65912-irq.c b/drivers/mfd/tps65912-irq.c
deleted file mode 100644
index db2c29c..0000000
--- a/drivers/mfd/tps65912-irq.c
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * tps65912-irq.c  --  TI TPS6591x
- *
- * Copyright 2011 Texas Instruments Inc.
- *
- * Author: Margarita Olaya <magi@slimlogic.co.uk>
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under  the terms of the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- * This driver is based on wm8350 implementation.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/bug.h>
-#include <linux/device.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/gpio.h>
-#include <linux/mfd/tps65912.h>
-
-static inline int irq_to_tps65912_irq(struct tps65912 *tps65912,
-							int irq)
-{
-	return irq - tps65912->irq_base;
-}
-
-/*
- * This is a threaded IRQ handler so can access I2C/SPI.  Since the
- * IRQ handler explicitly clears the IRQ it handles the IRQ line
- * will be reasserted and the physical IRQ will be handled again if
- * another interrupt is asserted while we run - in the normal course
- * of events this is a rare occurrence so we save I2C/SPI reads. We're
- * also assuming that it's rare to get lots of interrupts firing
- * simultaneously so try to minimise I/O.
- */
-static irqreturn_t tps65912_irq(int irq, void *irq_data)
-{
-	struct tps65912 *tps65912 = irq_data;
-	u32 irq_sts;
-	u32 irq_mask;
-	u8 reg;
-	int i;
-
-
-	tps65912->read(tps65912, TPS65912_INT_STS, 1, &reg);
-	irq_sts = reg;
-	tps65912->read(tps65912, TPS65912_INT_STS2, 1, &reg);
-	irq_sts |= reg << 8;
-	tps65912->read(tps65912, TPS65912_INT_STS3, 1, &reg);
-	irq_sts |= reg << 16;
-	tps65912->read(tps65912, TPS65912_INT_STS4, 1, &reg);
-	irq_sts |= reg << 24;
-
-	tps65912->read(tps65912, TPS65912_INT_MSK, 1, &reg);
-	irq_mask = reg;
-	tps65912->read(tps65912, TPS65912_INT_MSK2, 1, &reg);
-	irq_mask |= reg << 8;
-	tps65912->read(tps65912, TPS65912_INT_MSK3, 1, &reg);
-	irq_mask |= reg << 16;
-	tps65912->read(tps65912, TPS65912_INT_MSK4, 1, &reg);
-	irq_mask |= reg << 24;
-
-	irq_sts &= ~irq_mask;
-	if (!irq_sts)
-		return IRQ_NONE;
-
-	for (i = 0; i < tps65912->irq_num; i++) {
-		if (!(irq_sts & (1 << i)))
-			continue;
-
-		handle_nested_irq(tps65912->irq_base + i);
-	}
-
-	/* Write the STS register back to clear IRQs we handled */
-	reg = irq_sts & 0xFF;
-	irq_sts >>= 8;
-	if (reg)
-		tps65912->write(tps65912, TPS65912_INT_STS, 1, &reg);
-	reg = irq_sts & 0xFF;
-	irq_sts >>= 8;
-	if (reg)
-		tps65912->write(tps65912, TPS65912_INT_STS2, 1, &reg);
-	reg = irq_sts & 0xFF;
-	irq_sts >>= 8;
-	if (reg)
-		tps65912->write(tps65912, TPS65912_INT_STS3, 1, &reg);
-	reg = irq_sts & 0xFF;
-	if (reg)
-		tps65912->write(tps65912, TPS65912_INT_STS4, 1, &reg);
-
-	return IRQ_HANDLED;
-}
-
-static void tps65912_irq_lock(struct irq_data *data)
-{
-	struct tps65912 *tps65912 = irq_data_get_irq_chip_data(data);
-
-	mutex_lock(&tps65912->irq_lock);
-}
-
-static void tps65912_irq_sync_unlock(struct irq_data *data)
-{
-	struct tps65912 *tps65912 = irq_data_get_irq_chip_data(data);
-	u32 reg_mask;
-	u8 reg;
-
-	tps65912->read(tps65912, TPS65912_INT_MSK, 1, &reg);
-	reg_mask = reg;
-	tps65912->read(tps65912, TPS65912_INT_MSK2, 1, &reg);
-	reg_mask |= reg << 8;
-	tps65912->read(tps65912, TPS65912_INT_MSK3, 1, &reg);
-	reg_mask |= reg << 16;
-	tps65912->read(tps65912, TPS65912_INT_MSK4, 1, &reg);
-	reg_mask |= reg << 24;
-
-	if (tps65912->irq_mask != reg_mask) {
-		reg = tps65912->irq_mask & 0xFF;
-		tps65912->write(tps65912, TPS65912_INT_MSK, 1, &reg);
-		reg = tps65912->irq_mask >> 8 & 0xFF;
-		tps65912->write(tps65912, TPS65912_INT_MSK2, 1, &reg);
-		reg = tps65912->irq_mask >> 16 & 0xFF;
-		tps65912->write(tps65912, TPS65912_INT_MSK3, 1, &reg);
-		reg = tps65912->irq_mask >> 24 & 0xFF;
-		tps65912->write(tps65912, TPS65912_INT_MSK4, 1, &reg);
-	}
-
-	mutex_unlock(&tps65912->irq_lock);
-}
-
-static void tps65912_irq_enable(struct irq_data *data)
-{
-	struct tps65912 *tps65912 = irq_data_get_irq_chip_data(data);
-
-	tps65912->irq_mask &= ~(1 << irq_to_tps65912_irq(tps65912, data->irq));
-}
-
-static void tps65912_irq_disable(struct irq_data *data)
-{
-	struct tps65912 *tps65912 = irq_data_get_irq_chip_data(data);
-
-	tps65912->irq_mask |= (1 << irq_to_tps65912_irq(tps65912, data->irq));
-}
-
-static struct irq_chip tps65912_irq_chip = {
-	.name = "tps65912",
-	.irq_bus_lock = tps65912_irq_lock,
-	.irq_bus_sync_unlock = tps65912_irq_sync_unlock,
-	.irq_disable = tps65912_irq_disable,
-	.irq_enable = tps65912_irq_enable,
-};
-
-int tps65912_irq_init(struct tps65912 *tps65912, int irq,
-			    struct tps65912_platform_data *pdata)
-{
-	int ret, cur_irq;
-	int flags = IRQF_ONESHOT;
-	u8 reg;
-
-	if (!irq) {
-		dev_warn(tps65912->dev, "No interrupt support, no core IRQ\n");
-		return 0;
-	}
-
-	if (!pdata || !pdata->irq_base) {
-		dev_warn(tps65912->dev, "No interrupt support, no IRQ base\n");
-		return 0;
-	}
-
-	/* Clear unattended interrupts */
-	tps65912->read(tps65912, TPS65912_INT_STS, 1, &reg);
-	tps65912->write(tps65912, TPS65912_INT_STS, 1, &reg);
-	tps65912->read(tps65912, TPS65912_INT_STS2, 1, &reg);
-	tps65912->write(tps65912, TPS65912_INT_STS2, 1, &reg);
-	tps65912->read(tps65912, TPS65912_INT_STS3, 1, &reg);
-	tps65912->write(tps65912, TPS65912_INT_STS3, 1, &reg);
-	tps65912->read(tps65912, TPS65912_INT_STS4, 1, &reg);
-	tps65912->write(tps65912, TPS65912_INT_STS4, 1, &reg);
-
-	/* Mask top level interrupts */
-	tps65912->irq_mask = 0xFFFFFFFF;
-
-	mutex_init(&tps65912->irq_lock);
-	tps65912->chip_irq = irq;
-	tps65912->irq_base = pdata->irq_base;
-
-	tps65912->irq_num = TPS65912_NUM_IRQ;
-
-	/* Register with genirq */
-	for (cur_irq = tps65912->irq_base;
-	     cur_irq < tps65912->irq_num + tps65912->irq_base;
-	     cur_irq++) {
-		irq_set_chip_data(cur_irq, tps65912);
-		irq_set_chip_and_handler(cur_irq, &tps65912_irq_chip,
-					 handle_edge_irq);
-		irq_set_nested_thread(cur_irq, 1);
-		irq_clear_status_flags(cur_irq, IRQ_NOREQUEST | IRQ_NOPROBE);
-	}
-
-	ret = request_threaded_irq(irq, NULL, tps65912_irq, flags,
-				   "tps65912", tps65912);
-
-	irq_set_irq_type(irq, IRQ_TYPE_LEVEL_LOW);
-	if (ret != 0)
-		dev_err(tps65912->dev, "Failed to request IRQ: %d\n", ret);
-
-	return ret;
-}
-
-int tps65912_irq_exit(struct tps65912 *tps65912)
-{
-	free_irq(tps65912->chip_irq, tps65912);
-	return 0;
-}
diff --git a/drivers/mfd/tps65912-spi.c b/drivers/mfd/tps65912-spi.c
deleted file mode 100644
index de60ad9..0000000
--- a/drivers/mfd/tps65912-spi.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * tps65912-spi.c  --  SPI access for TI TPS65912x PMIC
- *
- * Copyright 2011 Texas Instruments Inc.
- *
- * Author: Margarita Olaya Cabrera <magi@slimlogic.co.uk>
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under  the terms of the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  This driver is based on wm8350 implementation.
- */
-
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/gpio.h>
-#include <linux/spi/spi.h>
-#include <linux/mfd/core.h>
-#include <linux/mfd/tps65912.h>
-
-static int tps65912_spi_write(struct tps65912 *tps65912, u8 addr,
-							int bytes, void *src)
-{
-	struct spi_device *spi = tps65912->control_data;
-	u8 *data = (u8 *) src;
-	int ret;
-	/* bit 23 is the read/write bit */
-	unsigned long spi_data = 1 << 23 | addr << 15 | *data;
-	struct spi_transfer xfer;
-	struct spi_message msg;
-	u32 tx_buf;
-
-	tx_buf = spi_data;
-
-	xfer.tx_buf	= &tx_buf;
-	xfer.rx_buf	= NULL;
-	xfer.len	= sizeof(unsigned long);
-	xfer.bits_per_word = 24;
-
-	spi_message_init(&msg);
-	spi_message_add_tail(&xfer, &msg);
-
-	ret = spi_sync(spi, &msg);
-	return ret;
-}
-
-static int tps65912_spi_read(struct tps65912 *tps65912, u8 addr,
-							int bytes, void *dest)
-{
-	struct spi_device *spi = tps65912->control_data;
-	/* bit 23 is the read/write bit */
-	unsigned long spi_data = 0 << 23 | addr << 15;
-	struct spi_transfer xfer;
-	struct spi_message msg;
-	int ret;
-	u8 *data = (u8 *) dest;
-	u32 tx_buf, rx_buf;
-
-	tx_buf = spi_data;
-	rx_buf = 0;
-
-	xfer.tx_buf	= &tx_buf;
-	xfer.rx_buf	= &rx_buf;
-	xfer.len	= sizeof(unsigned long);
-	xfer.bits_per_word = 24;
-
-	spi_message_init(&msg);
-	spi_message_add_tail(&xfer, &msg);
-
-	if (spi == NULL)
-		return 0;
-
-	ret = spi_sync(spi, &msg);
-	if (ret == 0)
-		*data = (u8) (rx_buf & 0xFF);
-	return ret;
-}
-
-static int tps65912_spi_probe(struct spi_device *spi)
-{
-	struct tps65912 *tps65912;
-
-	tps65912 = devm_kzalloc(&spi->dev,
-				sizeof(struct tps65912), GFP_KERNEL);
-	if (tps65912 == NULL)
-		return -ENOMEM;
-
-	tps65912->dev = &spi->dev;
-	tps65912->control_data = spi;
-	tps65912->read = tps65912_spi_read;
-	tps65912->write = tps65912_spi_write;
-
-	spi_set_drvdata(spi, tps65912);
-
-	return tps65912_device_init(tps65912);
-}
-
-static int tps65912_spi_remove(struct spi_device *spi)
-{
-	struct tps65912 *tps65912 = spi_get_drvdata(spi);
-
-	tps65912_device_exit(tps65912);
-
-	return 0;
-}
-
-static struct spi_driver tps65912_spi_driver = {
-	.driver = {
-		.name = "tps65912",
-		.owner = THIS_MODULE,
-	},
-	.probe	= tps65912_spi_probe,
-	.remove = tps65912_spi_remove,
-};
-
-static int __init tps65912_spi_init(void)
-{
-	int ret;
-
-	ret = spi_register_driver(&tps65912_spi_driver);
-	if (ret != 0)
-		pr_err("Failed to register TPS65912 SPI driver: %d\n", ret);
-
-	return 0;
-}
-/* init early so consumer devices can complete system boot */
-subsys_initcall(tps65912_spi_init);
-
-static void __exit tps65912_spi_exit(void)
-{
-	spi_unregister_driver(&tps65912_spi_driver);
-}
-module_exit(tps65912_spi_exit);
-
-MODULE_AUTHOR("Margarita Olaya	<magi@slimlogic.co.uk>");
-MODULE_DESCRIPTION("SPI support for TPS65912 chip family mfd");
-MODULE_LICENSE("GPL");
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 64bccff..3cb2de9 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -727,12 +727,6 @@ config REGULATOR_TPS65910
 	help
 	  This driver supports TPS65910/TPS65911 voltage regulator chips.
 
-config REGULATOR_TPS65912
-	tristate "TI TPS65912 Power regulator"
-	depends on (MFD_TPS65912_I2C || MFD_TPS65912_SPI)
-	help
-	    This driver supports TPS65912 voltage regulator chip.
-
 config REGULATOR_TPS80031
 	tristate "TI TPS80031/TPS80032 power regualtor driver"
 	depends on MFD_TPS80031
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index 0f81749..222ff5f 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -91,7 +91,6 @@ obj-$(CONFIG_REGULATOR_TPS65218) += tps65218-regulator.o
 obj-$(CONFIG_REGULATOR_TPS6524X) += tps6524x-regulator.o
 obj-$(CONFIG_REGULATOR_TPS6586X) += tps6586x-regulator.o
 obj-$(CONFIG_REGULATOR_TPS65910) += tps65910-regulator.o
-obj-$(CONFIG_REGULATOR_TPS65912) += tps65912-regulator.o
 obj-$(CONFIG_REGULATOR_TPS80031) += tps80031-regulator.o
 obj-$(CONFIG_REGULATOR_TWL4030) += twl-regulator.o
 obj-$(CONFIG_REGULATOR_VEXPRESS) += vexpress.o
diff --git a/drivers/regulator/tps65912-regulator.c b/drivers/regulator/tps65912-regulator.c
deleted file mode 100644
index 9503d54..0000000
--- a/drivers/regulator/tps65912-regulator.c
+++ /dev/null
@@ -1,541 +0,0 @@
-/*
- * tps65912.c  --  TI tps65912
- *
- * Copyright 2011 Texas Instruments Inc.
- *
- * Author: Margarita Olaya Cabrera <magi@slimlogic.co.uk>
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under  the terms of the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- * This driver is based on wm8350 implementation.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/err.h>
-#include <linux/platform_device.h>
-#include <linux/regulator/driver.h>
-#include <linux/regulator/machine.h>
-#include <linux/slab.h>
-#include <linux/gpio.h>
-#include <linux/mfd/tps65912.h>
-
-/* DCDC's */
-#define TPS65912_REG_DCDC1	0
-#define TPS65912_REG_DCDC2	1
-#define TPS65912_REG_DCDC3	2
-#define TPS65912_REG_DCDC4	3
-
-/* LDOs */
-#define TPS65912_REG_LDO1	4
-#define TPS65912_REG_LDO2	5
-#define TPS65912_REG_LDO3	6
-#define TPS65912_REG_LDO4	7
-#define TPS65912_REG_LDO5	8
-#define TPS65912_REG_LDO6	9
-#define TPS65912_REG_LDO7	10
-#define TPS65912_REG_LDO8	11
-#define TPS65912_REG_LDO9	12
-#define TPS65912_REG_LDO10	13
-
-/* Number of step-down converters available */
-#define TPS65912_NUM_DCDC	4
-
-/* Number of LDO voltage regulators  available */
-#define TPS65912_NUM_LDO	10
-
-/* Number of total regulators available */
-#define TPS65912_NUM_REGULATOR		(TPS65912_NUM_DCDC + TPS65912_NUM_LDO)
-
-#define TPS65912_REG_ENABLED	0x80
-#define OP_SELREG_MASK		0x40
-#define OP_SELREG_SHIFT		6
-
-struct tps_info {
-	const char *name;
-};
-
-static struct tps_info tps65912_regs[] = {
-	{
-		.name = "DCDC1",
-	},
-	{
-		.name = "DCDC2",
-	},
-	{
-		.name = "DCDC3",
-	},
-	{
-		.name = "DCDC4",
-	},
-	{
-		.name = "LDO1",
-	},
-	{
-		.name = "LDO2",
-	},
-	{
-		.name = "LDO3",
-	},
-	{
-		.name = "LDO4",
-	},
-	{
-		.name = "LDO5",
-	},
-	{
-		.name = "LDO6",
-	},
-	{
-		.name = "LDO7",
-	},
-	{
-		.name = "LDO8",
-	},
-	{
-		.name = "LDO9",
-	},
-	{
-		.name = "LDO10",
-	},
-};
-
-struct tps65912_reg {
-	struct regulator_desc desc[TPS65912_NUM_REGULATOR];
-	struct tps65912 *mfd;
-	struct regulator_dev *rdev[TPS65912_NUM_REGULATOR];
-	struct tps_info *info[TPS65912_NUM_REGULATOR];
-	/* for read/write access */
-	struct mutex io_lock;
-	int mode;
-	int (*get_ctrl_reg)(int);
-	int dcdc_range[TPS65912_NUM_DCDC];
-	int pwm_mode_reg;
-	int eco_reg;
-};
-
-static const struct regulator_linear_range tps65912_ldo_ranges[] = {
-	REGULATOR_LINEAR_RANGE(800000, 0, 32, 25000),
-	REGULATOR_LINEAR_RANGE(1650000, 33, 60, 50000),
-	REGULATOR_LINEAR_RANGE(3100000, 61, 63, 100000),
-};
-
-static int tps65912_get_range(struct tps65912_reg *pmic, int id)
-{
-	struct tps65912 *mfd = pmic->mfd;
-	int range;
-
-	switch (id) {
-	case TPS65912_REG_DCDC1:
-		range = tps65912_reg_read(mfd, TPS65912_DCDC1_LIMIT);
-		break;
-	case TPS65912_REG_DCDC2:
-		range = tps65912_reg_read(mfd, TPS65912_DCDC2_LIMIT);
-		break;
-	case TPS65912_REG_DCDC3:
-		range = tps65912_reg_read(mfd, TPS65912_DCDC3_LIMIT);
-		break;
-	case TPS65912_REG_DCDC4:
-		range = tps65912_reg_read(mfd, TPS65912_DCDC4_LIMIT);
-		break;
-	default:
-		return 0;
-	}
-
-	if (range >= 0)
-		range = (range & DCDC_LIMIT_RANGE_MASK)
-			>> DCDC_LIMIT_RANGE_SHIFT;
-
-	pmic->dcdc_range[id] = range;
-	return range;
-}
-
-static unsigned long tps65912_vsel_to_uv_range0(u8 vsel)
-{
-	unsigned long uv;
-
-	uv = ((vsel * 12500) + 500000);
-	return uv;
-}
-
-static unsigned long tps65912_vsel_to_uv_range1(u8 vsel)
-{
-	unsigned long uv;
-
-	 uv = ((vsel * 12500) + 700000);
-	return uv;
-}
-
-static unsigned long tps65912_vsel_to_uv_range2(u8 vsel)
-{
-	unsigned long uv;
-
-	uv = ((vsel * 25000) + 500000);
-	return uv;
-}
-
-static unsigned long tps65912_vsel_to_uv_range3(u8 vsel)
-{
-	unsigned long uv;
-
-	if (vsel == 0x3f)
-		uv = 3800000;
-	else
-		uv = ((vsel * 50000) + 500000);
-
-	return uv;
-}
-
-static int tps65912_get_ctrl_register(int id)
-{
-	if (id >= TPS65912_REG_DCDC1 && id <= TPS65912_REG_LDO4)
-		return id * 3 + TPS65912_DCDC1_AVS;
-	else if (id >= TPS65912_REG_LDO5 && id <= TPS65912_REG_LDO10)
-		return id - TPS65912_REG_LDO5 + TPS65912_LDO5;
-	else
-		return -EINVAL;
-}
-
-static int tps65912_get_sel_register(struct tps65912_reg *pmic, int id)
-{
-	struct tps65912 *mfd = pmic->mfd;
-	int opvsel;
-	u8 reg = 0;
-
-	if (id >= TPS65912_REG_DCDC1 && id <= TPS65912_REG_LDO4) {
-		opvsel = tps65912_reg_read(mfd, id * 3 + TPS65912_DCDC1_OP);
-		if (opvsel & OP_SELREG_MASK)
-			reg = id * 3 + TPS65912_DCDC1_AVS;
-		else
-			reg = id * 3 + TPS65912_DCDC1_OP;
-	} else if (id >= TPS65912_REG_LDO5 && id <= TPS65912_REG_LDO10) {
-		reg = id - TPS65912_REG_LDO5 + TPS65912_LDO5;
-	} else {
-		return -EINVAL;
-	}
-
-	return reg;
-}
-
-static int tps65912_get_mode_regiters(struct tps65912_reg *pmic, int id)
-{
-	switch (id) {
-	case TPS65912_REG_DCDC1:
-		pmic->pwm_mode_reg = TPS65912_DCDC1_CTRL;
-		pmic->eco_reg = TPS65912_DCDC1_AVS;
-		break;
-	case TPS65912_REG_DCDC2:
-		pmic->pwm_mode_reg = TPS65912_DCDC2_CTRL;
-		pmic->eco_reg = TPS65912_DCDC2_AVS;
-		break;
-	case TPS65912_REG_DCDC3:
-		pmic->pwm_mode_reg = TPS65912_DCDC3_CTRL;
-		pmic->eco_reg = TPS65912_DCDC3_AVS;
-		break;
-	case TPS65912_REG_DCDC4:
-		pmic->pwm_mode_reg = TPS65912_DCDC4_CTRL;
-		pmic->eco_reg = TPS65912_DCDC4_AVS;
-		break;
-	default:
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static int tps65912_reg_is_enabled(struct regulator_dev *dev)
-{
-	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
-	struct tps65912 *mfd = pmic->mfd;
-	int reg, value, id = rdev_get_id(dev);
-
-	if (id < TPS65912_REG_DCDC1 || id > TPS65912_REG_LDO10)
-		return -EINVAL;
-
-	reg = pmic->get_ctrl_reg(id);
-	if (reg < 0)
-		return reg;
-
-	value = tps65912_reg_read(mfd, reg);
-	if (value < 0)
-		return value;
-
-	return value & TPS65912_REG_ENABLED;
-}
-
-static int tps65912_reg_enable(struct regulator_dev *dev)
-{
-	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
-	struct tps65912 *mfd = pmic->mfd;
-	int id = rdev_get_id(dev);
-	int reg;
-
-	if (id < TPS65912_REG_DCDC1 || id > TPS65912_REG_LDO10)
-		return -EINVAL;
-
-	reg = pmic->get_ctrl_reg(id);
-	if (reg < 0)
-		return reg;
-
-	return tps65912_set_bits(mfd, reg, TPS65912_REG_ENABLED);
-}
-
-static int tps65912_reg_disable(struct regulator_dev *dev)
-{
-	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
-	struct tps65912 *mfd = pmic->mfd;
-	int id = rdev_get_id(dev), reg;
-
-	reg = pmic->get_ctrl_reg(id);
-	if (reg < 0)
-		return reg;
-
-	return tps65912_clear_bits(mfd, reg, TPS65912_REG_ENABLED);
-}
-
-static int tps65912_set_mode(struct regulator_dev *dev, unsigned int mode)
-{
-	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
-	struct tps65912 *mfd = pmic->mfd;
-	int pwm_mode, eco, id = rdev_get_id(dev);
-
-	tps65912_get_mode_regiters(pmic, id);
-
-	pwm_mode = tps65912_reg_read(mfd, pmic->pwm_mode_reg);
-	eco = tps65912_reg_read(mfd, pmic->eco_reg);
-
-	pwm_mode &= DCDCCTRL_DCDC_MODE_MASK;
-	eco &= DCDC_AVS_ECO_MASK;
-
-	switch (mode) {
-	case REGULATOR_MODE_FAST:
-		/* Verify if mode alredy set */
-		if (pwm_mode && !eco)
-			break;
-		tps65912_set_bits(mfd, pmic->pwm_mode_reg, DCDCCTRL_DCDC_MODE_MASK);
-		tps65912_clear_bits(mfd, pmic->eco_reg, DCDC_AVS_ECO_MASK);
-		break;
-	case REGULATOR_MODE_NORMAL:
-	case REGULATOR_MODE_IDLE:
-		if (!pwm_mode && !eco)
-			break;
-		tps65912_clear_bits(mfd, pmic->pwm_mode_reg, DCDCCTRL_DCDC_MODE_MASK);
-		tps65912_clear_bits(mfd, pmic->eco_reg, DCDC_AVS_ECO_MASK);
-		break;
-	case REGULATOR_MODE_STANDBY:
-		if (!pwm_mode && eco)
-			break;
-		tps65912_clear_bits(mfd, pmic->pwm_mode_reg, DCDCCTRL_DCDC_MODE_MASK);
-		tps65912_set_bits(mfd, pmic->eco_reg, DCDC_AVS_ECO_MASK);
-		break;
-	default:
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static unsigned int tps65912_get_mode(struct regulator_dev *dev)
-{
-	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
-	struct tps65912 *mfd = pmic->mfd;
-	int pwm_mode, eco, mode = 0, id = rdev_get_id(dev);
-
-	tps65912_get_mode_regiters(pmic, id);
-
-	pwm_mode = tps65912_reg_read(mfd, pmic->pwm_mode_reg);
-	eco = tps65912_reg_read(mfd, pmic->eco_reg);
-
-	pwm_mode &= DCDCCTRL_DCDC_MODE_MASK;
-	eco &= DCDC_AVS_ECO_MASK;
-
-	if (pwm_mode && !eco)
-		mode = REGULATOR_MODE_FAST;
-	else if (!pwm_mode && !eco)
-		mode = REGULATOR_MODE_NORMAL;
-	else if (!pwm_mode && eco)
-		mode = REGULATOR_MODE_STANDBY;
-
-	return mode;
-}
-
-static int tps65912_list_voltage(struct regulator_dev *dev, unsigned selector)
-{
-	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
-	int range, voltage = 0, id = rdev_get_id(dev);
-
-	if (id > TPS65912_REG_DCDC4)
-		return -EINVAL;
-
-	range = pmic->dcdc_range[id];
-
-	switch (range) {
-	case 0:
-		/* 0.5 - 1.2875V in 12.5mV steps */
-		voltage = tps65912_vsel_to_uv_range0(selector);
-		break;
-	case 1:
-		/* 0.7 - 1.4875V in 12.5mV steps */
-		voltage = tps65912_vsel_to_uv_range1(selector);
-		break;
-	case 2:
-		/* 0.5 - 2.075V in 25mV steps */
-		voltage = tps65912_vsel_to_uv_range2(selector);
-		break;
-	case 3:
-		/* 0.5 - 3.8V in 50mV steps */
-		voltage = tps65912_vsel_to_uv_range3(selector);
-		break;
-	}
-	return voltage;
-}
-
-static int tps65912_get_voltage_sel(struct regulator_dev *dev)
-{
-	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
-	struct tps65912 *mfd = pmic->mfd;
-	int id = rdev_get_id(dev);
-	int reg, vsel;
-
-	reg = tps65912_get_sel_register(pmic, id);
-	if (reg < 0)
-		return reg;
-
-	vsel = tps65912_reg_read(mfd, reg);
-	vsel &= 0x3F;
-
-	return vsel;
-}
-
-static int tps65912_set_voltage_sel(struct regulator_dev *dev,
-					 unsigned selector)
-{
-	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
-	struct tps65912 *mfd = pmic->mfd;
-	int id = rdev_get_id(dev);
-	int value;
-	u8 reg;
-
-	reg = tps65912_get_sel_register(pmic, id);
-	value = tps65912_reg_read(mfd, reg);
-	value &= 0xC0;
-	return tps65912_reg_write(mfd, reg, selector | value);
-}
-
-/* Operations permitted on DCDCx */
-static struct regulator_ops tps65912_ops_dcdc = {
-	.is_enabled = tps65912_reg_is_enabled,
-	.enable = tps65912_reg_enable,
-	.disable = tps65912_reg_disable,
-	.set_mode = tps65912_set_mode,
-	.get_mode = tps65912_get_mode,
-	.get_voltage_sel = tps65912_get_voltage_sel,
-	.set_voltage_sel = tps65912_set_voltage_sel,
-	.list_voltage = tps65912_list_voltage,
-};
-
-/* Operations permitted on LDOx */
-static struct regulator_ops tps65912_ops_ldo = {
-	.is_enabled = tps65912_reg_is_enabled,
-	.enable = tps65912_reg_enable,
-	.disable = tps65912_reg_disable,
-	.get_voltage_sel = tps65912_get_voltage_sel,
-	.set_voltage_sel = tps65912_set_voltage_sel,
-	.list_voltage = regulator_list_voltage_linear_range,
-	.map_voltage = regulator_map_voltage_linear_range,
-};
-
-static int tps65912_probe(struct platform_device *pdev)
-{
-	struct tps65912 *tps65912 = dev_get_drvdata(pdev->dev.parent);
-	struct regulator_config config = { };
-	struct tps_info *info;
-	struct regulator_init_data *reg_data;
-	struct regulator_dev *rdev;
-	struct tps65912_reg *pmic;
-	struct tps65912_board *pmic_plat_data;
-	int i;
-
-	pmic_plat_data = dev_get_platdata(tps65912->dev);
-	if (!pmic_plat_data)
-		return -EINVAL;
-
-	reg_data = pmic_plat_data->tps65912_pmic_init_data;
-
-	pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL);
-	if (!pmic)
-		return -ENOMEM;
-
-	mutex_init(&pmic->io_lock);
-	pmic->mfd = tps65912;
-	platform_set_drvdata(pdev, pmic);
-
-	pmic->get_ctrl_reg = &tps65912_get_ctrl_register;
-	info = tps65912_regs;
-
-	for (i = 0; i < TPS65912_NUM_REGULATOR; i++, info++, reg_data++) {
-		int range = 0;
-		/* Register the regulators */
-		pmic->info[i] = info;
-
-		pmic->desc[i].name = info->name;
-		pmic->desc[i].id = i;
-		pmic->desc[i].n_voltages = 64;
-		if (i > TPS65912_REG_DCDC4) {
-			pmic->desc[i].ops = &tps65912_ops_ldo;
-			pmic->desc[i].linear_ranges = tps65912_ldo_ranges;
-			pmic->desc[i].n_linear_ranges =
-					ARRAY_SIZE(tps65912_ldo_ranges);
-		} else {
-			pmic->desc[i].ops = &tps65912_ops_dcdc;
-		}
-		pmic->desc[i].type = REGULATOR_VOLTAGE;
-		pmic->desc[i].owner = THIS_MODULE;
-		range = tps65912_get_range(pmic, i);
-
-		config.dev = tps65912->dev;
-		config.init_data = reg_data;
-		config.driver_data = pmic;
-
-		rdev = devm_regulator_register(&pdev->dev, &pmic->desc[i],
-					       &config);
-		if (IS_ERR(rdev)) {
-			dev_err(tps65912->dev,
-				"failed to register %s regulator\n",
-				pdev->name);
-			return PTR_ERR(rdev);
-		}
-
-		/* Save regulator for cleanup */
-		pmic->rdev[i] = rdev;
-	}
-	return 0;
-}
-
-static struct platform_driver tps65912_driver = {
-	.driver = {
-		.name = "tps65912-pmic",
-	},
-	.probe = tps65912_probe,
-};
-
-static int __init tps65912_init(void)
-{
-	return platform_driver_register(&tps65912_driver);
-}
-subsys_initcall(tps65912_init);
-
-static void __exit tps65912_cleanup(void)
-{
-	platform_driver_unregister(&tps65912_driver);
-}
-module_exit(tps65912_cleanup);
-
-MODULE_AUTHOR("Margarita Olaya Cabrera <magi@slimlogic.co.uk>");
-MODULE_DESCRIPTION("TPS65912 voltage regulator driver");
-MODULE_LICENSE("GPL v2");
-MODULE_ALIAS("platform:tps65912-pmic");
diff --git a/include/linux/mfd/tps65912.h b/include/linux/mfd/tps65912.h
deleted file mode 100644
index 6d30903..0000000
--- a/include/linux/mfd/tps65912.h
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * tps65912.h  --  TI TPS6591x
- *
- * Copyright 2011 Texas Instruments Inc.
- *
- * Author: Margarita Olaya <magi@slimlogic.co.uk>
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under  the terms of the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- */
-
-#ifndef __LINUX_MFD_TPS65912_H
-#define __LINUX_MFD_TPS65912_H
-
-/* TPS regulator type list */
-#define REGULATOR_LDO		0
-#define REGULATOR_DCDC		1
-
-/*
- * List of registers for TPS65912
- */
-
-#define TPS65912_DCDC1_CTRL		0x00
-#define TPS65912_DCDC2_CTRL		0x01
-#define TPS65912_DCDC3_CTRL		0x02
-#define TPS65912_DCDC4_CTRL		0x03
-#define TPS65912_DCDC1_OP		0x04
-#define TPS65912_DCDC1_AVS		0x05
-#define TPS65912_DCDC1_LIMIT		0x06
-#define TPS65912_DCDC2_OP		0x07
-#define TPS65912_DCDC2_AVS		0x08
-#define TPS65912_DCDC2_LIMIT		0x09
-#define TPS65912_DCDC3_OP		0x0A
-#define TPS65912_DCDC3_AVS		0x0B
-#define TPS65912_DCDC3_LIMIT		0x0C
-#define TPS65912_DCDC4_OP		0x0D
-#define TPS65912_DCDC4_AVS		0x0E
-#define TPS65912_DCDC4_LIMIT		0x0F
-#define TPS65912_LDO1_OP		0x10
-#define TPS65912_LDO1_AVS		0x11
-#define TPS65912_LDO1_LIMIT		0x12
-#define TPS65912_LDO2_OP		0x13
-#define TPS65912_LDO2_AVS		0x14
-#define TPS65912_LDO2_LIMIT		0x15
-#define TPS65912_LDO3_OP		0x16
-#define TPS65912_LDO3_AVS		0x17
-#define TPS65912_LDO3_LIMIT		0x18
-#define TPS65912_LDO4_OP		0x19
-#define TPS65912_LDO4_AVS		0x1A
-#define TPS65912_LDO4_LIMIT		0x1B
-#define TPS65912_LDO5			0x1C
-#define TPS65912_LDO6			0x1D
-#define TPS65912_LDO7			0x1E
-#define TPS65912_LDO8			0x1F
-#define TPS65912_LDO9			0x20
-#define TPS65912_LDO10			0x21
-#define TPS65912_THRM			0x22
-#define TPS65912_CLK32OUT		0x23
-#define TPS65912_DEVCTRL		0x24
-#define TPS65912_DEVCTRL2		0x25
-#define TPS65912_I2C_SPI_CFG		0x26
-#define TPS65912_KEEP_ON		0x27
-#define TPS65912_KEEP_ON2		0x28
-#define TPS65912_SET_OFF1		0x29
-#define TPS65912_SET_OFF2		0x2A
-#define TPS65912_DEF_VOLT		0x2B
-#define TPS65912_DEF_VOLT_MAPPING	0x2C
-#define TPS65912_DISCHARGE		0x2D
-#define TPS65912_DISCHARGE2		0x2E
-#define TPS65912_EN1_SET1		0x2F
-#define TPS65912_EN1_SET2		0x30
-#define TPS65912_EN2_SET1		0x31
-#define TPS65912_EN2_SET2		0x32
-#define TPS65912_EN3_SET1		0x33
-#define TPS65912_EN3_SET2		0x34
-#define TPS65912_EN4_SET1		0x35
-#define TPS65912_EN4_SET2		0x36
-#define TPS65912_PGOOD			0x37
-#define TPS65912_PGOOD2			0x38
-#define TPS65912_INT_STS		0x39
-#define TPS65912_INT_MSK		0x3A
-#define TPS65912_INT_STS2		0x3B
-#define TPS65912_INT_MSK2		0x3C
-#define TPS65912_INT_STS3		0x3D
-#define TPS65912_INT_MSK3		0x3E
-#define TPS65912_INT_STS4		0x3F
-#define TPS65912_INT_MSK4		0x40
-#define TPS65912_GPIO1			0x41
-#define TPS65912_GPIO2			0x42
-#define TPS65912_GPIO3			0x43
-#define TPS65912_GPIO4			0x44
-#define TPS65912_GPIO5			0x45
-#define TPS65912_VMON			0x46
-#define TPS65912_LEDA_CTRL1		0x47
-#define TPS65912_LEDA_CTRL2		0x48
-#define TPS65912_LEDA_CTRL3		0x49
-#define TPS65912_LEDA_CTRL4		0x4A
-#define TPS65912_LEDA_CTRL5		0x4B
-#define TPS65912_LEDA_CTRL6		0x4C
-#define TPS65912_LEDA_CTRL7		0x4D
-#define TPS65912_LEDA_CTRL8		0x4E
-#define TPS65912_LEDB_CTRL1		0x4F
-#define TPS65912_LEDB_CTRL2		0x50
-#define TPS65912_LEDB_CTRL3		0x51
-#define TPS65912_LEDB_CTRL4		0x52
-#define TPS65912_LEDB_CTRL5		0x53
-#define TPS65912_LEDB_CTRL6		0x54
-#define TPS65912_LEDB_CTRL7		0x55
-#define TPS65912_LEDB_CTRL8		0x56
-#define TPS65912_LEDC_CTRL1		0x57
-#define TPS65912_LEDC_CTRL2		0x58
-#define TPS65912_LEDC_CTRL3		0x59
-#define TPS65912_LEDC_CTRL4		0x5A
-#define TPS65912_LEDC_CTRL5		0x5B
-#define TPS65912_LEDC_CTRL6		0x5C
-#define TPS65912_LEDC_CTRL7		0x5D
-#define TPS65912_LEDC_CTRL8		0x5E
-#define TPS65912_LED_RAMP_UP_TIME	0x5F
-#define TPS65912_LED_RAMP_DOWN_TIME	0x60
-#define TPS65912_LED_SEQ_EN		0x61
-#define TPS65912_LOADSWITCH		0x62
-#define TPS65912_SPARE			0x63
-#define TPS65912_VERNUM			0x64
-#define TPS6591X_MAX_REGISTER		0x64
-
-/* IRQ Definitions */
-#define TPS65912_IRQ_PWRHOLD_F		0
-#define TPS65912_IRQ_VMON		1
-#define TPS65912_IRQ_PWRON		2
-#define TPS65912_IRQ_PWRON_LP		3
-#define TPS65912_IRQ_PWRHOLD_R		4
-#define TPS65912_IRQ_HOTDIE		5
-#define TPS65912_IRQ_GPIO1_R		6
-#define TPS65912_IRQ_GPIO1_F		7
-#define TPS65912_IRQ_GPIO2_R		8
-#define TPS65912_IRQ_GPIO2_F		9
-#define TPS65912_IRQ_GPIO3_R		10
-#define TPS65912_IRQ_GPIO3_F		11
-#define TPS65912_IRQ_GPIO4_R		12
-#define TPS65912_IRQ_GPIO4_F		13
-#define TPS65912_IRQ_GPIO5_R		14
-#define TPS65912_IRQ_GPIO5_F		15
-#define TPS65912_IRQ_PGOOD_DCDC1	16
-#define TPS65912_IRQ_PGOOD_DCDC2	17
-#define TPS65912_IRQ_PGOOD_DCDC3	18
-#define TPS65912_IRQ_PGOOD_DCDC4	19
-#define TPS65912_IRQ_PGOOD_LDO1		20
-#define TPS65912_IRQ_PGOOD_LDO2		21
-#define TPS65912_IRQ_PGOOD_LDO3		22
-#define TPS65912_IRQ_PGOOD_LDO4		23
-#define TPS65912_IRQ_PGOOD_LDO5		24
-#define TPS65912_IRQ_PGOOD_LDO6		25
-#define TPS65912_IRQ_PGOOD_LDO7		26
-#define TPS65912_IRQ_PGOOD_LD08		27
-#define TPS65912_IRQ_PGOOD_LDO9		28
-#define TPS65912_IRQ_PGOOD_LDO10	29
-
-#define TPS65912_NUM_IRQ		30
-
-/* GPIO 1 and 2 Register Definitions */
-#define GPIO_SLEEP_MASK			0x80
-#define GPIO_SLEEP_SHIFT		7
-#define GPIO_DEB_MASK			0x10
-#define GPIO_DEB_SHIFT			4
-#define GPIO_CFG_MASK			0x04
-#define GPIO_CFG_SHIFT			2
-#define GPIO_STS_MASK			0x02
-#define GPIO_STS_SHIFT			1
-#define GPIO_SET_MASK			0x01
-#define GPIO_SET_SHIFT			0
-
-/* GPIO 3 Register Definitions */
-#define GPIO3_SLEEP_MASK		0x80
-#define GPIO3_SLEEP_SHIFT		7
-#define GPIO3_SEL_MASK			0x40
-#define GPIO3_SEL_SHIFT			6
-#define GPIO3_ODEN_MASK			0x20
-#define GPIO3_ODEN_SHIFT		5
-#define GPIO3_DEB_MASK			0x10
-#define GPIO3_DEB_SHIFT			4
-#define GPIO3_PDEN_MASK			0x08
-#define GPIO3_PDEN_SHIFT		3
-#define GPIO3_CFG_MASK			0x04
-#define GPIO3_CFG_SHIFT			2
-#define GPIO3_STS_MASK			0x02
-#define GPIO3_STS_SHIFT			1
-#define GPIO3_SET_MASK			0x01
-#define GPIO3_SET_SHIFT			0
-
-/* GPIO 4 Register Definitions */
-#define GPIO4_SLEEP_MASK		0x80
-#define GPIO4_SLEEP_SHIFT		7
-#define GPIO4_SEL_MASK			0x40
-#define GPIO4_SEL_SHIFT			6
-#define GPIO4_ODEN_MASK			0x20
-#define GPIO4_ODEN_SHIFT		5
-#define GPIO4_DEB_MASK			0x10
-#define GPIO4_DEB_SHIFT			4
-#define GPIO4_PDEN_MASK			0x08
-#define GPIO4_PDEN_SHIFT		3
-#define GPIO4_CFG_MASK			0x04
-#define GPIO4_CFG_SHIFT			2
-#define GPIO4_STS_MASK			0x02
-#define GPIO4_STS_SHIFT			1
-#define GPIO4_SET_MASK			0x01
-#define GPIO4_SET_SHIFT			0
-
-/* Register THERM  (0x80) register.RegisterDescription */
-#define THERM_THERM_HD_MASK		0x20
-#define THERM_THERM_HD_SHIFT		5
-#define THERM_THERM_TS_MASK		0x10
-#define THERM_THERM_TS_SHIFT		4
-#define THERM_THERM_HDSEL_MASK		0x0C
-#define THERM_THERM_HDSEL_SHIFT		2
-#define THERM_RSVD1_MASK		0x02
-#define THERM_RSVD1_SHIFT		1
-#define THERM_THERM_STATE_MASK		0x01
-#define THERM_THERM_STATE_SHIFT		0
-
-/* Register DCDCCTRL1 register.RegisterDescription */
-#define DCDCCTRL_VCON_ENABLE_MASK	0x80
-#define DCDCCTRL_VCON_ENABLE_SHIFT	7
-#define DCDCCTRL_VCON_RANGE1_MASK	0x40
-#define DCDCCTRL_VCON_RANGE1_SHIFT	6
-#define DCDCCTRL_VCON_RANGE0_MASK	0x20
-#define DCDCCTRL_VCON_RANGE0_SHIFT	5
-#define DCDCCTRL_TSTEP2_MASK		0x10
-#define DCDCCTRL_TSTEP2_SHIFT		4
-#define DCDCCTRL_TSTEP1_MASK		0x08
-#define DCDCCTRL_TSTEP1_SHIFT		3
-#define DCDCCTRL_TSTEP0_MASK		0x04
-#define DCDCCTRL_TSTEP0_SHIFT		2
-#define DCDCCTRL_DCDC1_MODE_MASK	0x02
-#define DCDCCTRL_DCDC1_MODE_SHIFT	1
-
-/* Register DCDCCTRL2 and DCDCCTRL3 register.RegisterDescription */
-#define DCDCCTRL_TSTEP2_MASK		0x10
-#define DCDCCTRL_TSTEP2_SHIFT		4
-#define DCDCCTRL_TSTEP1_MASK		0x08
-#define DCDCCTRL_TSTEP1_SHIFT		3
-#define DCDCCTRL_TSTEP0_MASK		0x04
-#define DCDCCTRL_TSTEP0_SHIFT		2
-#define DCDCCTRL_DCDC_MODE_MASK		0x02
-#define DCDCCTRL_DCDC_MODE_SHIFT	1
-#define DCDCCTRL_RSVD0_MASK		0x01
-#define DCDCCTRL_RSVD0_SHIFT		0
-
-/* Register DCDCCTRL4 register.RegisterDescription */
-#define DCDCCTRL_RAMP_TIME_MASK		0x01
-#define DCDCCTRL_RAMP_TIME_SHIFT	0
-
-/* Register DCDCx_AVS */
-#define DCDC_AVS_ENABLE_MASK		0x80
-#define DCDC_AVS_ENABLE_SHIFT		7
-#define DCDC_AVS_ECO_MASK		0x40
-#define DCDC_AVS_ECO_SHIFT		6
-
-/* Register DCDCx_LIMIT */
-#define DCDC_LIMIT_RANGE_MASK		0xC0
-#define DCDC_LIMIT_RANGE_SHIFT		6
-#define DCDC_LIMIT_MAX_SEL_MASK		0x3F
-#define DCDC_LIMIT_MAX_SEL_SHIFT	0
-
-/**
- * struct tps65912_board
- * Board platform dat may be used to initialize regulators.
- */
-struct tps65912_board {
-	int is_dcdc1_avs;
-	int is_dcdc2_avs;
-	int is_dcdc3_avs;
-	int is_dcdc4_avs;
-	int irq;
-	int irq_base;
-	int gpio_base;
-	struct regulator_init_data *tps65912_pmic_init_data;
-};
-
-/**
- * struct tps65912 - tps65912 sub-driver chip access routines
- */
-
-struct tps65912 {
-	struct device *dev;
-	/* for read/write acces */
-	struct mutex io_mutex;
-
-	/* For device IO interfaces: I2C or SPI */
-	void *control_data;
-
-	int (*read)(struct tps65912 *tps65912, u8 reg, int size, void *dest);
-	int (*write)(struct tps65912 *tps65912, u8 reg, int size, void *src);
-
-	/* Client devices */
-	struct tps65912_pmic *pmic;
-
-	/* GPIO Handling */
-	struct gpio_chip gpio;
-
-	/* IRQ Handling */
-	struct mutex irq_lock;
-	int chip_irq;
-	int irq_base;
-	int irq_num;
-	u32 irq_mask;
-};
-
-struct tps65912_platform_data {
-	int irq;
-	int irq_base;
-};
-
-unsigned int tps_chip(void);
-
-int tps65912_set_bits(struct tps65912 *tps65912, u8 reg, u8 mask);
-int tps65912_clear_bits(struct tps65912 *tps65912, u8 reg, u8 mask);
-int tps65912_reg_read(struct tps65912 *tps65912, u8 reg);
-int tps65912_reg_write(struct tps65912 *tps65912, u8 reg, u8 val);
-int tps65912_device_init(struct tps65912 *tps65912);
-void tps65912_device_exit(struct tps65912 *tps65912);
-int tps65912_irq_init(struct tps65912 *tps65912, int irq,
-			struct tps65912_platform_data *pdata);
-int tps65912_irq_exit(struct tps65912 *tps65912);
-
-#endif /*  __LINUX_MFD_TPS65912_H */
-- 
1.9.1


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

* [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC
  2015-10-01 20:37 [PATCH v4 0/5] mfd: tps65912: Driver rewrite with DT support Andrew F. Davis
  2015-10-01 20:37 ` [PATCH v4 1/5] Documentation: tps65912: Add DT bindings for the TPS65912 PMIC Andrew F. Davis
  2015-10-01 20:37 ` [PATCH v4 2/5] mfd: tps65912: Remove old driver in preparation for new driver Andrew F. Davis
@ 2015-10-01 20:37 ` Andrew F. Davis
  2015-10-01 20:51   ` kbuild test robot
                     ` (4 more replies)
  2015-10-01 20:37 ` [PATCH v4 4/5] regulator: tps65912: Add regulator " Andrew F. Davis
  2015-10-01 20:37 ` [PATCH v4 5/5] gpio: tps65912: Add GPIO " Andrew F. Davis
  4 siblings, 5 replies; 44+ messages in thread
From: Andrew F. Davis @ 2015-10-01 20:37 UTC (permalink / raw)
  To: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Mark Brown, Alexandre Courbot, Grygorii Strashko
  Cc: devicetree, linux-kernel, Andrew F. Davis

This patch adds support for TPS65912 mfd device. It provides
communication through the I2C and SPI interfaces. It contains
the following components:

 - Regulators
 - GPIO controller

Signed-off-by: Andrew F. Davis <afd@ti.com>
---
 drivers/mfd/Kconfig          |  25 ++++
 drivers/mfd/Makefile         |   3 +
 drivers/mfd/tps65912-core.c  | 108 ++++++++++++++
 drivers/mfd/tps65912-i2c.c   |  82 ++++++++++
 drivers/mfd/tps65912-spi.c   |  81 ++++++++++
 include/linux/mfd/tps65912.h | 345 +++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 644 insertions(+)
 create mode 100644 drivers/mfd/tps65912-core.c
 create mode 100644 drivers/mfd/tps65912-i2c.c
 create mode 100644 drivers/mfd/tps65912-spi.c
 create mode 100644 include/linux/mfd/tps65912.h

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 9a8df8e..02b321f 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -1167,6 +1167,31 @@ config MFD_TPS65910
 	  if you say yes here you get support for the TPS65910 series of
 	  Power Management chips.
 
+config MFD_TPS65912
+	tristate
+	select REGMAP
+	select REGMAP_IRQ
+
+config MFD_TPS65912_I2C
+	tristate "TI TPS65912 Power Management chip with I2C"
+	select MFD_TPS65912
+	select REGMAP_I2C
+	depends on I2C
+	depends on OF || COMPILE_TEST
+	help
+	  If you say yes here you get support for the TPS65912 series of
+	  PM chips with I2C interface.
+
+config MFD_TPS65912_SPI
+	tristate "TI TPS65912 Power Management chip with SPI"
+	select MFD_TPS65912
+	select REGMAP_SPI
+	depends on SPI_MASTER
+	depends on OF || COMPILE_TEST
+	help
+	  If you say yes here you get support for the TPS65912 series of
+	  PM chips with SPI interface.
+
 config MFD_TPS80031
 	bool "TI TPS80031/TPS80032 Power Management chips"
 	depends on I2C=y
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 004aa76..49c3530 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -69,6 +69,9 @@ obj-$(CONFIG_TPS6507X)		+= tps6507x.o
 obj-$(CONFIG_MFD_TPS65217)	+= tps65217.o
 obj-$(CONFIG_MFD_TPS65218)	+= tps65218.o
 obj-$(CONFIG_MFD_TPS65910)	+= tps65910.o
+obj-$(CONFIG_MFD_TPS65912)	+= tps65912-core.o
+obj-$(CONFIG_MFD_TPS65912_I2C)	+= tps65912-i2c.o
+obj-$(CONFIG_MFD_TPS65912_SPI)  += tps65912-spi.o
 obj-$(CONFIG_MFD_TPS80031)	+= tps80031.o
 obj-$(CONFIG_MENELAUS)		+= menelaus.o
 
diff --git a/drivers/mfd/tps65912-core.c b/drivers/mfd/tps65912-core.c
new file mode 100644
index 0000000..e787950
--- /dev/null
+++ b/drivers/mfd/tps65912-core.c
@@ -0,0 +1,108 @@
+/*
+ * Core functions for TI TPS65912x PMIC
+ *
+ * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * Author: Andrew F. Davis <afd@ti.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.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether expressed or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License version 2 for more details.
+ *
+ * Based on the TPS65218 driver and the previous TPS65912 driver by
+ * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
+ */
+
+#include <linux/interrupt.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+
+#include <linux/mfd/tps65912.h>
+
+static const struct regmap_irq tps65912_irqs[] = {
+	/* INT_STS IRQs */
+	REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_F, 0, TPS65912_INT_STS_PWRHOLD_F),
+	REGMAP_IRQ_REG(TPS65912_IRQ_VMON, 0, TPS65912_INT_STS_VMON),
+	REGMAP_IRQ_REG(TPS65912_IRQ_PWRON, 0, TPS65912_INT_STS_PWRON),
+	REGMAP_IRQ_REG(TPS65912_IRQ_PWRON_LP, 0, TPS65912_INT_STS_PWRON_LP),
+	REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_R, 0, TPS65912_INT_STS_PWRHOLD_R),
+	REGMAP_IRQ_REG(TPS65912_IRQ_HOTDIE, 0, TPS65912_INT_STS_HOTDIE),
+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_R, 0, TPS65912_INT_STS_GPIO1_R),
+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_F, 0, TPS65912_INT_STS_GPIO1_F),
+	/* INT_STS2 IRQs */
+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO2_R, 1, TPS65912_INT_STS2_GPIO2_R),
+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO2_F, 1, TPS65912_INT_STS2_GPIO2_F),
+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO3_R, 1, TPS65912_INT_STS2_GPIO3_R),
+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO3_F, 1, TPS65912_INT_STS2_GPIO3_F),
+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO4_R, 1, TPS65912_INT_STS2_GPIO4_R),
+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO4_F, 1, TPS65912_INT_STS2_GPIO4_F),
+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO5_R, 1, TPS65912_INT_STS2_GPIO5_R),
+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO5_F, 1, TPS65912_INT_STS2_GPIO5_F),
+	/* INT_STS3 IRQs */
+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC1, 2, TPS65912_INT_STS3_PGOOD_DCDC1),
+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC2, 2, TPS65912_INT_STS3_PGOOD_DCDC2),
+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC3, 2, TPS65912_INT_STS3_PGOOD_DCDC3),
+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC4, 2, TPS65912_INT_STS3_PGOOD_DCDC4),
+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO1, 2, TPS65912_INT_STS3_PGOOD_LDO1),
+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO2, 2, TPS65912_INT_STS3_PGOOD_LDO2),
+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO3, 2, TPS65912_INT_STS3_PGOOD_LDO3),
+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO4, 2, TPS65912_INT_STS3_PGOOD_LDO4),
+	/* INT_STS4 IRQs */
+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO5, 3, TPS65912_INT_STS4_PGOOD_LDO5),
+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO6, 3, TPS65912_INT_STS4_PGOOD_LDO6),
+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO7, 3, TPS65912_INT_STS4_PGOOD_LDO7),
+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO8, 3, TPS65912_INT_STS4_PGOOD_LDO8),
+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO9, 3, TPS65912_INT_STS4_PGOOD_LDO9),
+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO10, 3, TPS65912_INT_STS4_PGOOD_LDO10),
+};
+
+static struct regmap_irq_chip tps65912_irq_chip = {
+	.name = "tps65912",
+	.irqs = tps65912_irqs,
+	.num_irqs = ARRAY_SIZE(tps65912_irqs),
+	.num_regs = 4,
+	.irq_reg_stride = 2,
+	.mask_base = TPS65912_INT_MSK,
+	.status_base = TPS65912_INT_STS,
+	.ack_base = TPS65912_INT_STS,
+	.init_ack_masked = true,
+};
+
+int tps65912_device_init(struct tps65912 *tps)
+{
+	int ret;
+
+	ret = regmap_add_irq_chip(tps->regmap, tps->irq, IRQF_ONESHOT, 0,
+				  &tps65912_irq_chip, &tps->irq_data);
+	if (ret < 0)
+		return ret;
+
+	ret = of_platform_populate(tps->dev->of_node, NULL, NULL, tps->dev);
+	if (ret < 0)
+		goto err_irq;
+
+	return 0;
+
+err_irq:
+	regmap_del_irq_chip(tps->irq, tps->irq_data);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(tps65912_device_init);
+
+int tps65912_device_exit(struct tps65912 *tps)
+{
+	regmap_del_irq_chip(tps->irq, tps->irq_data);
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(tps65912_device_exit);
+
+MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
+MODULE_DESCRIPTION("TPS65912x MFD Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/mfd/tps65912-i2c.c b/drivers/mfd/tps65912-i2c.c
new file mode 100644
index 0000000..bdae10b01
--- /dev/null
+++ b/drivers/mfd/tps65912-i2c.c
@@ -0,0 +1,82 @@
+/*
+ * I2C access driver for TI TPS65912x PMIC
+ *
+ * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * Author: Andrew F. Davis <afd@ti.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.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether expressed or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License version 2 for more details.
+ *
+ * Based on the TPS65218 driver and the previous TPS65912 driver by
+ * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
+ */
+
+#include <linux/i2c.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/regmap.h>
+
+#include <linux/mfd/tps65912.h>
+
+static const struct of_device_id tps65912_i2c_of_match_table[] = {
+	{ .compatible = "ti,tps65912", },
+	{ /* sentinel */ }
+};
+
+static int tps65912_i2c_probe(struct i2c_client *client,
+			      const struct i2c_device_id *ids)
+{
+	struct tps65912 *tps;
+
+	tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
+	if (!tps)
+		return -ENOMEM;
+
+	i2c_set_clientdata(client, tps);
+	tps->dev = &client->dev;
+	tps->irq = client->irq;
+
+	tps->regmap = devm_regmap_init_i2c(client, &tps65912_regmap_config);
+	if (IS_ERR(tps->regmap)) {
+		dev_err(tps->dev, "Failed to initialize register map\n");
+		return PTR_ERR(tps->regmap);
+	}
+
+	return tps65912_device_init(tps);
+}
+
+static int tps65912_i2c_remove(struct i2c_client *client)
+{
+	struct tps65912 *tps = i2c_get_clientdata(client);
+
+	return tps65912_device_exit(tps);
+}
+
+static const struct i2c_device_id tps65912_i2c_id_table[] = {
+	{ "tps65912", 0 },
+	{ /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(i2c, tps65912_i2c_id_table);
+
+static struct i2c_driver tps65912_i2c_driver = {
+	.driver		= {
+		.name	= "tps65912",
+		.of_match_table = tps65912_i2c_of_match_table,
+	},
+	.probe		= tps65912_i2c_probe,
+	.remove		= tps65912_i2c_remove,
+	.id_table       = tps65912_i2c_id_table,
+};
+
+module_i2c_driver(tps65912_i2c_driver);
+
+MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
+MODULE_DESCRIPTION("TPS65912x I2C Interface Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/mfd/tps65912-spi.c b/drivers/mfd/tps65912-spi.c
new file mode 100644
index 0000000..24c5c97
--- /dev/null
+++ b/drivers/mfd/tps65912-spi.c
@@ -0,0 +1,81 @@
+/*
+ * SPI access driver for TI TPS65912x PMIC
+ *
+ * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * Author: Andrew F. Davis <afd@ti.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.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether expressed or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License version 2 for more details.
+ *
+ * Based on the TPS65218 driver and the previous TPS65912 driver by
+ * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
+ */
+
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/regmap.h>
+#include <linux/spi/spi.h>
+
+#include <linux/mfd/tps65912.h>
+
+static const struct of_device_id tps65912_spi_of_match_table[] = {
+	{ .compatible = "ti,tps65912", },
+	{ /* sentinel */ }
+};
+
+static int tps65912_spi_probe(struct spi_device *spi)
+{
+	struct tps65912 *tps;
+
+	tps = devm_kzalloc(&spi->dev, sizeof(*tps), GFP_KERNEL);
+	if (!tps)
+		return -ENOMEM;
+
+	spi_set_drvdata(spi, tps);
+	tps->dev = &spi->dev;
+	tps->irq = spi->irq;
+
+	tps->regmap = devm_regmap_init_spi(spi, &tps65912_regmap_config);
+	if (IS_ERR(tps->regmap)) {
+		dev_err(tps->dev, "Failed to initialize register map\n");
+		return PTR_ERR(tps->regmap);
+	}
+
+	return tps65912_device_init(tps);
+}
+
+static int tps65912_spi_remove(struct spi_device *client)
+{
+	struct tps65912 *tps = spi_get_drvdata(client);
+
+	return tps65912_device_exit(tps);
+}
+
+static const struct spi_device_id tps65912_spi_id_table[] = {
+	{ "tps65912", 0 },
+	{ /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(spi, tps65912_spi_id_table);
+
+static struct spi_driver tps65912_spi_driver = {
+	.driver		= {
+		.name	= "tps65912",
+		.of_match_table = tps65912_spi_of_match_table,
+	},
+	.probe		= tps65912_spi_probe,
+	.remove		= tps65912_spi_remove,
+	.id_table       = tps65912_spi_id_table,
+};
+
+module_spi_driver(tps65912_spi_driver);
+
+MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
+MODULE_DESCRIPTION("TPS65912x SPI Interface Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/include/linux/mfd/tps65912.h b/include/linux/mfd/tps65912.h
new file mode 100644
index 0000000..8843c0d
--- /dev/null
+++ b/include/linux/mfd/tps65912.h
@@ -0,0 +1,345 @@
+/*
+ * TI TPS65912x
+ *
+ * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * Author: Andrew F. Davis <afd@ti.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.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether expressed or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License version 2 for more details.
+ *
+ * Based on the TPS65218 driver and the previous TPS65912 driver by
+ * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
+ */
+
+#ifndef __LINUX_MFD_TPS65912_H
+#define __LINUX_MFD_TPS65912_H
+
+#include <linux/device.h>
+#include <linux/regmap.h>
+#include <linux/regulator/driver.h>
+
+/* List of registers for TPS65912 */
+#define TPS65912_DCDC1_CTRL		0x00
+#define TPS65912_DCDC2_CTRL		0x01
+#define TPS65912_DCDC3_CTRL		0x02
+#define TPS65912_DCDC4_CTRL		0x03
+#define TPS65912_DCDC1_OP		0x04
+#define TPS65912_DCDC1_AVS		0x05
+#define TPS65912_DCDC1_LIMIT		0x06
+#define TPS65912_DCDC2_OP		0x07
+#define TPS65912_DCDC2_AVS		0x08
+#define TPS65912_DCDC2_LIMIT		0x09
+#define TPS65912_DCDC3_OP		0x0A
+#define TPS65912_DCDC3_AVS		0x0B
+#define TPS65912_DCDC3_LIMIT		0x0C
+#define TPS65912_DCDC4_OP		0x0D
+#define TPS65912_DCDC4_AVS		0x0E
+#define TPS65912_DCDC4_LIMIT		0x0F
+#define TPS65912_LDO1_OP		0x10
+#define TPS65912_LDO1_AVS		0x11
+#define TPS65912_LDO1_LIMIT		0x12
+#define TPS65912_LDO2_OP		0x13
+#define TPS65912_LDO2_AVS		0x14
+#define TPS65912_LDO2_LIMIT		0x15
+#define TPS65912_LDO3_OP		0x16
+#define TPS65912_LDO3_AVS		0x17
+#define TPS65912_LDO3_LIMIT		0x18
+#define TPS65912_LDO4_OP		0x19
+#define TPS65912_LDO4_AVS		0x1A
+#define TPS65912_LDO4_LIMIT		0x1B
+#define TPS65912_LDO5			0x1C
+#define TPS65912_LDO6			0x1D
+#define TPS65912_LDO7			0x1E
+#define TPS65912_LDO8			0x1F
+#define TPS65912_LDO9			0x20
+#define TPS65912_LDO10			0x21
+#define TPS65912_THRM			0x22
+#define TPS65912_CLK32OUT		0x23
+#define TPS65912_DEVCTRL		0x24
+#define TPS65912_DEVCTRL2		0x25
+#define TPS65912_I2C_SPI_CFG		0x26
+#define TPS65912_KEEP_ON		0x27
+#define TPS65912_KEEP_ON2		0x28
+#define TPS65912_SET_OFF1		0x29
+#define TPS65912_SET_OFF2		0x2A
+#define TPS65912_DEF_VOLT		0x2B
+#define TPS65912_DEF_VOLT_MAPPING	0x2C
+#define TPS65912_DISCHARGE		0x2D
+#define TPS65912_DISCHARGE2		0x2E
+#define TPS65912_EN1_SET1		0x2F
+#define TPS65912_EN1_SET2		0x30
+#define TPS65912_EN2_SET1		0x31
+#define TPS65912_EN2_SET2		0x32
+#define TPS65912_EN3_SET1		0x33
+#define TPS65912_EN3_SET2		0x34
+#define TPS65912_EN4_SET1		0x35
+#define TPS65912_EN4_SET2		0x36
+#define TPS65912_PGOOD			0x37
+#define TPS65912_PGOOD2			0x38
+#define TPS65912_INT_STS		0x39
+#define TPS65912_INT_MSK		0x3A
+#define TPS65912_INT_STS2		0x3B
+#define TPS65912_INT_MSK2		0x3C
+#define TPS65912_INT_STS3		0x3D
+#define TPS65912_INT_MSK3		0x3E
+#define TPS65912_INT_STS4		0x3F
+#define TPS65912_INT_MSK4		0x40
+#define TPS65912_GPIO1			0x41
+#define TPS65912_GPIO2			0x42
+#define TPS65912_GPIO3			0x43
+#define TPS65912_GPIO4			0x44
+#define TPS65912_GPIO5			0x45
+#define TPS65912_VMON			0x46
+#define TPS65912_LEDA_CTRL1		0x47
+#define TPS65912_LEDA_CTRL2		0x48
+#define TPS65912_LEDA_CTRL3		0x49
+#define TPS65912_LEDA_CTRL4		0x4A
+#define TPS65912_LEDA_CTRL5		0x4B
+#define TPS65912_LEDA_CTRL6		0x4C
+#define TPS65912_LEDA_CTRL7		0x4D
+#define TPS65912_LEDA_CTRL8		0x4E
+#define TPS65912_LEDB_CTRL1		0x4F
+#define TPS65912_LEDB_CTRL2		0x50
+#define TPS65912_LEDB_CTRL3		0x51
+#define TPS65912_LEDB_CTRL4		0x52
+#define TPS65912_LEDB_CTRL5		0x53
+#define TPS65912_LEDB_CTRL6		0x54
+#define TPS65912_LEDB_CTRL7		0x55
+#define TPS65912_LEDB_CTRL8		0x56
+#define TPS65912_LEDC_CTRL1		0x57
+#define TPS65912_LEDC_CTRL2		0x58
+#define TPS65912_LEDC_CTRL3		0x59
+#define TPS65912_LEDC_CTRL4		0x5A
+#define TPS65912_LEDC_CTRL5		0x5B
+#define TPS65912_LEDC_CTRL6		0x5C
+#define TPS65912_LEDC_CTRL7		0x5D
+#define TPS65912_LEDC_CTRL8		0x5E
+#define TPS65912_LED_RAMP_UP_TIME	0x5F
+#define TPS65912_LED_RAMP_DOWN_TIME	0x60
+#define TPS65912_LED_SEQ_EN		0x61
+#define TPS65912_LOADSWITCH		0x62
+#define TPS65912_SPARE			0x63
+#define TPS65912_VERNUM			0x64
+#define TPS6591X_MAX_REGISTER		0x64
+
+/* INT_STS Register field definitions */
+#define TPS65912_INT_STS_PWRHOLD_F	BIT(0)
+#define TPS65912_INT_STS_VMON		BIT(1)
+#define TPS65912_INT_STS_PWRON		BIT(2)
+#define TPS65912_INT_STS_PWRON_LP	BIT(3)
+#define TPS65912_INT_STS_PWRHOLD_R	BIT(4)
+#define TPS65912_INT_STS_HOTDIE		BIT(5)
+#define TPS65912_INT_STS_GPIO1_R	BIT(6)
+#define TPS65912_INT_STS_GPIO1_F	BIT(7)
+
+/* INT_STS Register field definitions */
+#define TPS65912_INT_STS2_GPIO2_R	BIT(0)
+#define TPS65912_INT_STS2_GPIO2_F	BIT(1)
+#define TPS65912_INT_STS2_GPIO3_R	BIT(2)
+#define TPS65912_INT_STS2_GPIO3_F	BIT(3)
+#define TPS65912_INT_STS2_GPIO4_R	BIT(4)
+#define TPS65912_INT_STS2_GPIO4_F	BIT(5)
+#define TPS65912_INT_STS2_GPIO5_R	BIT(6)
+#define TPS65912_INT_STS2_GPIO5_F	BIT(7)
+
+/* INT_STS Register field definitions */
+#define TPS65912_INT_STS3_PGOOD_DCDC1	BIT(0)
+#define TPS65912_INT_STS3_PGOOD_DCDC2	BIT(1)
+#define TPS65912_INT_STS3_PGOOD_DCDC3	BIT(2)
+#define TPS65912_INT_STS3_PGOOD_DCDC4	BIT(3)
+#define TPS65912_INT_STS3_PGOOD_LDO1	BIT(4)
+#define TPS65912_INT_STS3_PGOOD_LDO2	BIT(5)
+#define TPS65912_INT_STS3_PGOOD_LDO3	BIT(6)
+#define TPS65912_INT_STS3_PGOOD_LDO4	BIT(7)
+
+/* INT_STS Register field definitions */
+#define TPS65912_INT_STS4_PGOOD_LDO5	BIT(0)
+#define TPS65912_INT_STS4_PGOOD_LDO6	BIT(1)
+#define TPS65912_INT_STS4_PGOOD_LDO7	BIT(2)
+#define TPS65912_INT_STS4_PGOOD_LDO8	BIT(3)
+#define TPS65912_INT_STS4_PGOOD_LDO9	BIT(4)
+#define TPS65912_INT_STS4_PGOOD_LDO10	BIT(5)
+
+/* GPIO 1 and 2 Register field definitions */
+#define GPIO_SLEEP_MASK			0x80
+#define GPIO_SLEEP_SHIFT		7
+#define GPIO_DEB_MASK			0x10
+#define GPIO_DEB_SHIFT			4
+#define GPIO_CFG_MASK			0x04
+#define GPIO_CFG_SHIFT			2
+#define GPIO_STS_MASK			0x02
+#define GPIO_STS_SHIFT			1
+#define GPIO_SET_MASK			0x01
+#define GPIO_SET_SHIFT			0
+
+/* GPIO 3 Register field definitions */
+#define GPIO3_SLEEP_MASK		0x80
+#define GPIO3_SLEEP_SHIFT		7
+#define GPIO3_SEL_MASK			0x40
+#define GPIO3_SEL_SHIFT			6
+#define GPIO3_ODEN_MASK			0x20
+#define GPIO3_ODEN_SHIFT		5
+#define GPIO3_DEB_MASK			0x10
+#define GPIO3_DEB_SHIFT			4
+#define GPIO3_PDEN_MASK			0x08
+#define GPIO3_PDEN_SHIFT		3
+#define GPIO3_CFG_MASK			0x04
+#define GPIO3_CFG_SHIFT			2
+#define GPIO3_STS_MASK			0x02
+#define GPIO3_STS_SHIFT			1
+#define GPIO3_SET_MASK			0x01
+#define GPIO3_SET_SHIFT			0
+
+/* GPIO 4 Register field definitions */
+#define GPIO4_SLEEP_MASK		0x80
+#define GPIO4_SLEEP_SHIFT		7
+#define GPIO4_SEL_MASK			0x40
+#define GPIO4_SEL_SHIFT			6
+#define GPIO4_ODEN_MASK			0x20
+#define GPIO4_ODEN_SHIFT		5
+#define GPIO4_DEB_MASK			0x10
+#define GPIO4_DEB_SHIFT			4
+#define GPIO4_PDEN_MASK			0x08
+#define GPIO4_PDEN_SHIFT		3
+#define GPIO4_CFG_MASK			0x04
+#define GPIO4_CFG_SHIFT			2
+#define GPIO4_STS_MASK			0x02
+#define GPIO4_STS_SHIFT			1
+#define GPIO4_SET_MASK			0x01
+#define GPIO4_SET_SHIFT			0
+
+/* Register THERM  (0x80) register.RegisterDescription */
+#define THERM_THERM_HD_MASK		0x20
+#define THERM_THERM_HD_SHIFT		5
+#define THERM_THERM_TS_MASK		0x10
+#define THERM_THERM_TS_SHIFT		4
+#define THERM_THERM_HDSEL_MASK		0x0C
+#define THERM_THERM_HDSEL_SHIFT		2
+#define THERM_RSVD1_MASK		0x02
+#define THERM_RSVD1_SHIFT		1
+#define THERM_THERM_STATE_MASK		0x01
+#define THERM_THERM_STATE_SHIFT		0
+
+/* Register DCDCCTRL1 register.RegisterDescription */
+#define DCDCCTRL_VCON_ENABLE_MASK	0x80
+#define DCDCCTRL_VCON_ENABLE_SHIFT	7
+#define DCDCCTRL_VCON_RANGE1_MASK	0x40
+#define DCDCCTRL_VCON_RANGE1_SHIFT	6
+#define DCDCCTRL_VCON_RANGE0_MASK	0x20
+#define DCDCCTRL_VCON_RANGE0_SHIFT	5
+#define DCDCCTRL_TSTEP2_MASK		0x10
+#define DCDCCTRL_TSTEP2_SHIFT		4
+#define DCDCCTRL_TSTEP1_MASK		0x08
+#define DCDCCTRL_TSTEP1_SHIFT		3
+#define DCDCCTRL_TSTEP0_MASK		0x04
+#define DCDCCTRL_TSTEP0_SHIFT		2
+#define DCDCCTRL_DCDC1_MODE_MASK	0x02
+#define DCDCCTRL_DCDC1_MODE_SHIFT	1
+
+/* Register DCDCCTRL2 and DCDCCTRL3 register.RegisterDescription */
+#define DCDCCTRL_TSTEP2_MASK		0x10
+#define DCDCCTRL_TSTEP2_SHIFT		4
+#define DCDCCTRL_TSTEP1_MASK		0x08
+#define DCDCCTRL_TSTEP1_SHIFT		3
+#define DCDCCTRL_TSTEP0_MASK		0x04
+#define DCDCCTRL_TSTEP0_SHIFT		2
+#define DCDCCTRL_DCDC_MODE_MASK		0x02
+#define DCDCCTRL_DCDC_MODE_SHIFT	1
+#define DCDCCTRL_RSVD0_MASK		0x01
+#define DCDCCTRL_RSVD0_SHIFT		0
+
+/* Register DCDCCTRL4 register.RegisterDescription */
+#define DCDCCTRL_RAMP_TIME_MASK		0x01
+#define DCDCCTRL_RAMP_TIME_SHIFT	0
+
+/* Register DCDCx_AVS */
+#define DCDC_AVS_ENABLE_MASK		0x80
+#define DCDC_AVS_ENABLE_SHIFT		7
+#define DCDC_AVS_ECO_MASK		0x40
+#define DCDC_AVS_ECO_SHIFT		6
+
+/* Register DCDCx_LIMIT */
+#define DCDC_LIMIT_RANGE_MASK		0xC0
+#define DCDC_LIMIT_RANGE_SHIFT		6
+#define DCDC_LIMIT_MAX_SEL_MASK		0x3F
+#define DCDC_LIMIT_MAX_SEL_SHIFT	0
+
+/* Define the TPS65912 IRQ numbers */
+enum tps65912_irqs {
+	/* INT_STS registers */
+	TPS65912_IRQ_PWRHOLD_F,
+	TPS65912_IRQ_VMON,
+	TPS65912_IRQ_PWRON,
+	TPS65912_IRQ_PWRON_LP,
+	TPS65912_IRQ_PWRHOLD_R,
+	TPS65912_IRQ_HOTDIE,
+	TPS65912_IRQ_GPIO1_R,
+	TPS65912_IRQ_GPIO1_F,
+	/* INT_STS2 registers */
+	TPS65912_IRQ_GPIO2_R,
+	TPS65912_IRQ_GPIO2_F,
+	TPS65912_IRQ_GPIO3_R,
+	TPS65912_IRQ_GPIO3_F,
+	TPS65912_IRQ_GPIO4_R,
+	TPS65912_IRQ_GPIO4_F,
+	TPS65912_IRQ_GPIO5_R,
+	TPS65912_IRQ_GPIO5_F,
+	/* INT_STS3 registers */
+	TPS65912_IRQ_PGOOD_DCDC1,
+	TPS65912_IRQ_PGOOD_DCDC2,
+	TPS65912_IRQ_PGOOD_DCDC3,
+	TPS65912_IRQ_PGOOD_DCDC4,
+	TPS65912_IRQ_PGOOD_LDO1,
+	TPS65912_IRQ_PGOOD_LDO2,
+	TPS65912_IRQ_PGOOD_LDO3,
+	TPS65912_IRQ_PGOOD_LDO4,
+	/* INT_STS4 registers */
+	TPS65912_IRQ_PGOOD_LDO5,
+	TPS65912_IRQ_PGOOD_LDO6,
+	TPS65912_IRQ_PGOOD_LDO7,
+	TPS65912_IRQ_PGOOD_LDO8,
+	TPS65912_IRQ_PGOOD_LDO9,
+	TPS65912_IRQ_PGOOD_LDO10,
+};
+
+/*
+ * struct tps65912 - state holder for the tps65912 driver
+ *
+ * Device data may be used to access the TPS65912 chip
+ */
+struct tps65912 {
+	struct device *dev;
+	struct regmap *regmap;
+
+	/* IRQ Data */
+	int irq;
+	struct regmap_irq_chip_data *irq_data;
+};
+
+static const struct regmap_range tps65912_yes_ranges[] = {
+	regmap_reg_range(TPS65912_INT_STS, TPS65912_GPIO5),
+};
+
+static const struct regmap_access_table tps65912_volatile_table = {
+	.yes_ranges = tps65912_yes_ranges,
+	.n_yes_ranges = ARRAY_SIZE(tps65912_yes_ranges),
+};
+
+static const struct regmap_config tps65912_regmap_config = {
+	.reg_bits = 8,
+	.val_bits = 8,
+	.cache_type = REGCACHE_RBTREE,
+	.volatile_table = &tps65912_volatile_table,
+};
+
+int tps65912_device_init(struct tps65912 *tps);
+int tps65912_device_exit(struct tps65912 *tps);
+
+#endif /*  __LINUX_MFD_TPS65912_H */
-- 
1.9.1


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

* [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-10-01 20:37 [PATCH v4 0/5] mfd: tps65912: Driver rewrite with DT support Andrew F. Davis
                   ` (2 preceding siblings ...)
  2015-10-01 20:37 ` [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC Andrew F. Davis
@ 2015-10-01 20:37 ` Andrew F. Davis
  2015-10-02 19:21   ` Grygorii Strashko
  2015-10-22 16:47   ` Mark Brown
  2015-10-01 20:37 ` [PATCH v4 5/5] gpio: tps65912: Add GPIO " Andrew F. Davis
  4 siblings, 2 replies; 44+ messages in thread
From: Andrew F. Davis @ 2015-10-01 20:37 UTC (permalink / raw)
  To: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Mark Brown, Alexandre Courbot, Grygorii Strashko
  Cc: devicetree, linux-kernel, Andrew F. Davis

This patch adds support for TPS65912 PMIC regulators.

The regulators set consists of 4 DCDCs and 10 LDOs. The output
voltages are configurable and are meant to supply power to the
main processor and other components.

Signed-off-by: Andrew F. Davis <afd@ti.com>
---
 drivers/regulator/Kconfig              |   6 ++
 drivers/regulator/Makefile             |   1 +
 drivers/regulator/tps65912-regulator.c | 171 +++++++++++++++++++++++++++++++++
 3 files changed, 178 insertions(+)
 create mode 100644 drivers/regulator/tps65912-regulator.c

diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 3cb2de9..1dec96a 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -727,6 +727,12 @@ config REGULATOR_TPS65910
 	help
 	  This driver supports TPS65910/TPS65911 voltage regulator chips.
 
+config REGULATOR_TPS65912
+	tristate "TI TPS65912 Power regulator"
+	depends on MFD_TPS65912
+	help
+	    This driver supports TPS65912 voltage regulator chip.
+
 config REGULATOR_TPS80031
 	tristate "TI TPS80031/TPS80032 power regualtor driver"
 	depends on MFD_TPS80031
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index 222ff5f..0f81749 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -91,6 +91,7 @@ obj-$(CONFIG_REGULATOR_TPS65218) += tps65218-regulator.o
 obj-$(CONFIG_REGULATOR_TPS6524X) += tps6524x-regulator.o
 obj-$(CONFIG_REGULATOR_TPS6586X) += tps6586x-regulator.o
 obj-$(CONFIG_REGULATOR_TPS65910) += tps65910-regulator.o
+obj-$(CONFIG_REGULATOR_TPS65912) += tps65912-regulator.o
 obj-$(CONFIG_REGULATOR_TPS80031) += tps80031-regulator.o
 obj-$(CONFIG_REGULATOR_TWL4030) += twl-regulator.o
 obj-$(CONFIG_REGULATOR_VEXPRESS) += vexpress.o
diff --git a/drivers/regulator/tps65912-regulator.c b/drivers/regulator/tps65912-regulator.c
new file mode 100644
index 0000000..854c63d
--- /dev/null
+++ b/drivers/regulator/tps65912-regulator.c
@@ -0,0 +1,171 @@
+/*
+ * Regulator driver for TPS65912x PMIC
+ *
+ * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * Author: Andrew F. Davis <afd@ti.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.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether expressed or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License version 2 for more details.
+ *
+ * Based on the TPS65218 driver and the previous TPS65912 driver by
+ * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
+ */
+
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/regulator/driver.h>
+#include <linux/regulator/of_regulator.h>
+
+#include <linux/mfd/tps65912.h>
+
+enum tps65912_regulators { DCDC1, DCDC2, DCDC3, DCDC4, LDO1, LDO2, LDO3,
+	LDO4, LDO5, LDO6, LDO7, LDO8, LDO9, LDO10 };
+
+#define TPS65912_REGULATOR(_name, _id, _of_match, _ops, _vr, _er, _lr)	\
+	[_id] = {							\
+		.name			= _name,			\
+		.of_match		= of_match_ptr(_of_match),	\
+		.id			= _id,				\
+		.ops			= &_ops,			\
+		.n_voltages		= 64,				\
+		.type			= REGULATOR_VOLTAGE,		\
+		.owner			= THIS_MODULE,			\
+		.vsel_reg		= _vr,				\
+		.vsel_mask		= 0x3f,				\
+		.enable_reg		= _er,				\
+		.enable_mask		= BIT(7),			\
+		.volt_table		= NULL,				\
+		.linear_ranges		= _lr,				\
+		.n_linear_ranges	= ARRAY_SIZE(_lr),		\
+	}
+
+static const struct regulator_linear_range tps65912_dcdc_ranges[] = {
+	REGULATOR_LINEAR_RANGE(500000, 0x0, 0x3f, 50000),
+};
+
+static const struct regulator_linear_range tps65912_ldo_ranges[] = {
+	REGULATOR_LINEAR_RANGE(800000, 0x0, 0x20, 25000),
+	REGULATOR_LINEAR_RANGE(1650000, 0x21, 0x3c, 50000),
+	REGULATOR_LINEAR_RANGE(3100000, 0x3d, 0x3f, 100000),
+};
+
+/* Operations permitted on DCDCx */
+static struct regulator_ops tps65912_ops_dcdc = {
+	.is_enabled		= regulator_is_enabled_regmap,
+	.enable			= regulator_enable_regmap,
+	.disable		= regulator_disable_regmap,
+	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
+	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
+	.list_voltage		= regulator_list_voltage_linear_range,
+};
+
+/* Operations permitted on LDOx */
+static struct regulator_ops tps65912_ops_ldo = {
+	.is_enabled		= regulator_is_enabled_regmap,
+	.enable			= regulator_enable_regmap,
+	.disable		= regulator_disable_regmap,
+	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
+	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
+	.list_voltage		= regulator_list_voltage_linear_range,
+	.map_voltage		= regulator_map_voltage_linear_range,
+};
+
+static const struct regulator_desc regulators[] = {
+	TPS65912_REGULATOR("DCDC1", DCDC1, "dcdc1", tps65912_ops_dcdc,
+			   TPS65912_DCDC1_OP, TPS65912_DCDC1_CTRL,
+			   tps65912_dcdc_ranges),
+	TPS65912_REGULATOR("DCDC2", DCDC2, "dcdc2", tps65912_ops_dcdc,
+			   TPS65912_DCDC2_OP, TPS65912_DCDC2_CTRL,
+			   tps65912_dcdc_ranges),
+	TPS65912_REGULATOR("DCDC3", DCDC3, "dcdc3", tps65912_ops_dcdc,
+			   TPS65912_DCDC3_OP, TPS65912_DCDC3_CTRL,
+			   tps65912_dcdc_ranges),
+	TPS65912_REGULATOR("DCDC4", DCDC4, "dcdc4", tps65912_ops_dcdc,
+			   TPS65912_DCDC4_OP, TPS65912_DCDC4_CTRL,
+			   tps65912_dcdc_ranges),
+	TPS65912_REGULATOR("LDO1", LDO1, "ldo1", tps65912_ops_ldo,
+			   TPS65912_LDO1_OP, TPS65912_LDO1_AVS,
+			   tps65912_ldo_ranges),
+	TPS65912_REGULATOR("LDO2", LDO2, "ldo2", tps65912_ops_ldo,
+			   TPS65912_LDO2_OP, TPS65912_LDO2_AVS,
+			   tps65912_ldo_ranges),
+	TPS65912_REGULATOR("LDO3", LDO3, "ldo3", tps65912_ops_ldo,
+			   TPS65912_LDO3_OP, TPS65912_LDO3_AVS,
+			   tps65912_ldo_ranges),
+	TPS65912_REGULATOR("LDO4", LDO4, "ldo4", tps65912_ops_ldo,
+			   TPS65912_LDO4_OP, TPS65912_LDO4_AVS,
+			   tps65912_ldo_ranges),
+	TPS65912_REGULATOR("LDO5", LDO5, "ldo5", tps65912_ops_ldo,
+			   TPS65912_LDO5, TPS65912_LDO5,
+			   tps65912_ldo_ranges),
+	TPS65912_REGULATOR("LDO6", LDO6, "ldo6", tps65912_ops_ldo,
+			   TPS65912_LDO6, TPS65912_LDO6,
+			   tps65912_ldo_ranges),
+	TPS65912_REGULATOR("LDO7", LDO7, "ldo7", tps65912_ops_ldo,
+			   TPS65912_LDO7, TPS65912_LDO7,
+			   tps65912_ldo_ranges),
+	TPS65912_REGULATOR("LDO8", LDO8, "ldo8", tps65912_ops_ldo,
+			   TPS65912_LDO8, TPS65912_LDO8,
+			   tps65912_ldo_ranges),
+	TPS65912_REGULATOR("LDO9", LDO9, "ldo9", tps65912_ops_ldo,
+			   TPS65912_LDO9, TPS65912_LDO9,
+			   tps65912_ldo_ranges),
+	TPS65912_REGULATOR("LDO10", LDO10, "ldo10", tps65912_ops_ldo,
+			   TPS65912_LDO10, TPS65912_LDO10,
+			   tps65912_ldo_ranges),
+};
+
+static int tps65912_regulator_probe(struct platform_device *pdev)
+{
+	struct tps65912 *tps = dev_get_drvdata(pdev->dev.parent);
+	struct regulator_config config = { };
+	struct regulator_dev *rdev;
+	int i;
+
+	platform_set_drvdata(pdev, tps);
+
+	config.dev = &pdev->dev;
+	config.driver_data = tps;
+	config.of_node = pdev->dev.of_node;
+	config.regmap = tps->regmap;
+
+	for (i = 0; i < ARRAY_SIZE(regulators); i++) {
+		rdev = devm_regulator_register(&pdev->dev, &regulators[i],
+					       &config);
+		if (IS_ERR(rdev)) {
+			dev_err(tps->dev, "failed to register %s regulator\n",
+				pdev->name);
+			return PTR_ERR(rdev);
+		}
+	}
+
+	return 0;
+}
+
+static const struct of_device_id tps65912_regulator_of_match_table[] = {
+	{ .compatible = "ti,tps65912-regulator", },
+	{ /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, tps65912_regulator_of_match_table);
+
+static struct platform_driver tps65912_regulator_driver = {
+	.driver = {
+		.name = "tps65912-regulator",
+		.of_match_table = tps65912_regulator_of_match_table,
+	},
+	.probe = tps65912_regulator_probe,
+};
+
+module_platform_driver(tps65912_regulator_driver);
+
+MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
+MODULE_DESCRIPTION("TPS65912 voltage regulator driver");
+MODULE_LICENSE("GPL v2");
-- 
1.9.1


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

* [PATCH v4 5/5] gpio: tps65912: Add GPIO driver for the TPS65912 PMIC
  2015-10-01 20:37 [PATCH v4 0/5] mfd: tps65912: Driver rewrite with DT support Andrew F. Davis
                   ` (3 preceding siblings ...)
  2015-10-01 20:37 ` [PATCH v4 4/5] regulator: tps65912: Add regulator " Andrew F. Davis
@ 2015-10-01 20:37 ` Andrew F. Davis
  4 siblings, 0 replies; 44+ messages in thread
From: Andrew F. Davis @ 2015-10-01 20:37 UTC (permalink / raw)
  To: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Mark Brown, Alexandre Courbot, Grygorii Strashko
  Cc: devicetree, linux-kernel, Andrew F. Davis

This patch adds support for the TPS65912 PMIC GPIOs.

TPS65912 has five configurable GPIOs that can be used for several
purposes.

Signed-off-by: Andrew F. Davis <afd@ti.com>
Reviewed-by: Alexandre Courbot <acourbot@nvidia.com>
---
 drivers/gpio/Kconfig         |   6 ++
 drivers/gpio/Makefile        |   1 +
 drivers/gpio/gpio-tps65912.c | 137 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 144 insertions(+)
 create mode 100644 drivers/gpio/gpio-tps65912.c

diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index fb28483..82218fa 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -838,6 +838,12 @@ config GPIO_TPS65910
 	  Select this option to enable GPIO driver for the TPS65910
 	  chip family.
 
+config GPIO_TPS65912
+	tristate "TI TPS65912 GPIO"
+	depends on MFD_TPS65912
+	help
+	  This driver supports TPS65912 gpio chip
+
 config GPIO_TWL4030
 	tristate "TWL4030, TWL5030, and TPS659x0 GPIOs"
 	depends on TWL4030_CORE
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index 605bf89..f79a7c4 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -96,6 +96,7 @@ obj-$(CONFIG_GPIO_TIMBERDALE)	+= gpio-timberdale.o
 obj-$(CONFIG_GPIO_PALMAS)	+= gpio-palmas.o
 obj-$(CONFIG_GPIO_TPS6586X)	+= gpio-tps6586x.o
 obj-$(CONFIG_GPIO_TPS65910)	+= gpio-tps65910.o
+obj-$(CONFIG_GPIO_TPS65912)	+= gpio-tps65912.o
 obj-$(CONFIG_GPIO_TS5500)	+= gpio-ts5500.o
 obj-$(CONFIG_GPIO_TWL4030)	+= gpio-twl4030.o
 obj-$(CONFIG_GPIO_TWL6040)	+= gpio-twl6040.o
diff --git a/drivers/gpio/gpio-tps65912.c b/drivers/gpio/gpio-tps65912.c
new file mode 100644
index 0000000..096c3ea
--- /dev/null
+++ b/drivers/gpio/gpio-tps65912.c
@@ -0,0 +1,137 @@
+/*
+ * TI TPS65912x GPIO Driver
+ *
+ * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * Author: Andrew F. Davis <afd@ti.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.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether expressed or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License version 2 for more details.
+ *
+ * Based on the Arizona GPIO driver and the previous TPS65912 driver by
+ * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
+ */
+
+#include <linux/gpio.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+
+#include <linux/mfd/tps65912.h>
+
+struct tps65912_gpio {
+	struct gpio_chip gpio_chip;
+	struct tps65912 *tps;
+};
+
+#define to_tps65912_gpio(gc) container_of(gc, struct tps65912_gpio, gpio_chip)
+
+static int tps65912_gpio_get(struct gpio_chip *gc, unsigned offset)
+{
+	struct tps65912_gpio *gpio = to_tps65912_gpio(gc);
+	int ret, val;
+
+	ret = regmap_read(gpio->tps->regmap, TPS65912_GPIO1 + offset, &val);
+	if (ret < 0)
+		return ret;
+
+	return val & GPIO_STS_MASK;
+}
+
+static void tps65912_gpio_set(struct gpio_chip *gc, unsigned offset,
+			      int value)
+{
+	struct tps65912_gpio *gpio = to_tps65912_gpio(gc);
+
+	regmap_update_bits(gpio->tps->regmap, TPS65912_GPIO1 + offset,
+			   GPIO_SET_MASK, value ? GPIO_SET_MASK : 0);
+}
+
+static int tps65912_gpio_output(struct gpio_chip *gc, unsigned offset,
+				int value)
+{
+	struct tps65912_gpio *gpio = to_tps65912_gpio(gc);
+
+	/* Set the initial value */
+	tps65912_gpio_set(gc, offset, value);
+
+	return regmap_update_bits(gpio->tps->regmap, TPS65912_GPIO1 + offset,
+				  GPIO_CFG_MASK, GPIO_CFG_MASK);
+}
+
+static int tps65912_gpio_input(struct gpio_chip *gc, unsigned offset)
+{
+	struct tps65912_gpio *gpio = to_tps65912_gpio(gc);
+
+	return regmap_update_bits(gpio->tps->regmap, TPS65912_GPIO1 + offset,
+				  GPIO_CFG_MASK, 0);
+}
+
+static struct gpio_chip template_chip = {
+	.label			= "tps65912-gpio",
+	.owner			= THIS_MODULE,
+	.direction_input	= tps65912_gpio_input,
+	.direction_output	= tps65912_gpio_output,
+	.get			= tps65912_gpio_get,
+	.set			= tps65912_gpio_set,
+	.can_sleep		= true,
+	.ngpio			= 5,
+	.base			= -1,
+};
+
+static int tps65912_gpio_probe(struct platform_device *pdev)
+{
+	struct tps65912_gpio *gpio;
+	int ret;
+
+	gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL);
+	if (!gpio)
+		return -ENOMEM;
+
+	gpio->tps = dev_get_drvdata(pdev->dev.parent);
+	gpio->gpio_chip = template_chip;
+	ret = gpiochip_add(&gpio->gpio_chip);
+	if (ret < 0) {
+		dev_err(&pdev->dev, "Could not register gpiochip, %d\n", ret);
+		return ret;
+	}
+
+	platform_set_drvdata(pdev, gpio);
+
+	return 0;
+}
+
+static int tps65912_gpio_remove(struct platform_device *pdev)
+{
+	struct tps65912_gpio *gpio = platform_get_drvdata(pdev);
+
+	gpiochip_remove(&gpio->gpio_chip);
+
+	return 0;
+}
+
+static const struct of_device_id tps65912_gpio_of_match_table[] = {
+	{ .compatible = "ti,tps65912-gpio", },
+	{ /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, tps65912_gpio_of_match_table);
+
+static struct platform_driver tps65912_gpio_driver = {
+	.driver = {
+		.name = "tps65912-gpio",
+		.of_match_table = tps65912_gpio_of_match_table,
+	},
+	.probe = tps65912_gpio_probe,
+	.remove = tps65912_gpio_remove,
+};
+
+module_platform_driver(tps65912_gpio_driver);
+
+MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
+MODULE_DESCRIPTION("TPS65912 GPIO driver");
+MODULE_LICENSE("GPL v2");
-- 
1.9.1


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

* Re: [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC
  2015-10-01 20:37 ` [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC Andrew F. Davis
@ 2015-10-01 20:51   ` kbuild test robot
       [not found]     ` <20151002095859.GN12635@sirena.org.uk>
  2015-10-01 20:57   ` kbuild test robot
                     ` (3 subsequent siblings)
  4 siblings, 1 reply; 44+ messages in thread
From: kbuild test robot @ 2015-10-01 20:51 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: kbuild-all, Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell,
	Kumar Gala, Lee Jones, Mark Brown, Alexandre Courbot,
	Grygorii Strashko, devicetree, linux-kernel, Andrew F. Davis

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

Hi Andrew,

[auto build test results on v4.3-rc3 -- if it's inappropriate base, please ignore]

config: x86_64-allmodconfig (attached as .config)
reproduce:
        git checkout d617dea974adf7dc262f2d49dea24a673e0403e2
        # save the attached .config to linux build tree
        make ARCH=x86_64 

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

>> drivers/mfd/tps65912-core.c:29:2: error: implicit declaration of function 'REGMAP_IRQ_REG' [-Werror=implicit-function-declaration]
     REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_F, 0, TPS65912_INT_STS_PWRHOLD_F),
     ^
>> drivers/mfd/tps65912-core.c:29:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:29:2: note: (near initialization for 'tps65912_irqs[0].reg_offset')
   drivers/mfd/tps65912-core.c:30:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_VMON, 0, TPS65912_INT_STS_VMON),
     ^
   drivers/mfd/tps65912-core.c:30:2: note: (near initialization for 'tps65912_irqs[0].mask')
   drivers/mfd/tps65912-core.c:31:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PWRON, 0, TPS65912_INT_STS_PWRON),
     ^
   drivers/mfd/tps65912-core.c:31:2: note: (near initialization for 'tps65912_irqs[1].reg_offset')
   drivers/mfd/tps65912-core.c:32:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PWRON_LP, 0, TPS65912_INT_STS_PWRON_LP),
     ^
   drivers/mfd/tps65912-core.c:32:2: note: (near initialization for 'tps65912_irqs[1].mask')
   drivers/mfd/tps65912-core.c:33:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_R, 0, TPS65912_INT_STS_PWRHOLD_R),
     ^
   drivers/mfd/tps65912-core.c:33:2: note: (near initialization for 'tps65912_irqs[2].reg_offset')
   drivers/mfd/tps65912-core.c:34:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_HOTDIE, 0, TPS65912_INT_STS_HOTDIE),
     ^
   drivers/mfd/tps65912-core.c:34:2: note: (near initialization for 'tps65912_irqs[2].mask')
   drivers/mfd/tps65912-core.c:35:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_R, 0, TPS65912_INT_STS_GPIO1_R),
     ^
   drivers/mfd/tps65912-core.c:35:2: note: (near initialization for 'tps65912_irqs[3].reg_offset')
   drivers/mfd/tps65912-core.c:36:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_F, 0, TPS65912_INT_STS_GPIO1_F),
     ^
   drivers/mfd/tps65912-core.c:36:2: note: (near initialization for 'tps65912_irqs[3].mask')
   drivers/mfd/tps65912-core.c:38:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO2_R, 1, TPS65912_INT_STS2_GPIO2_R),
     ^
   drivers/mfd/tps65912-core.c:38:2: note: (near initialization for 'tps65912_irqs[4].reg_offset')
   drivers/mfd/tps65912-core.c:39:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO2_F, 1, TPS65912_INT_STS2_GPIO2_F),
     ^
   drivers/mfd/tps65912-core.c:39:2: note: (near initialization for 'tps65912_irqs[4].mask')
   drivers/mfd/tps65912-core.c:40:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO3_R, 1, TPS65912_INT_STS2_GPIO3_R),
     ^
   drivers/mfd/tps65912-core.c:40:2: note: (near initialization for 'tps65912_irqs[5].reg_offset')
   drivers/mfd/tps65912-core.c:41:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO3_F, 1, TPS65912_INT_STS2_GPIO3_F),
     ^
   drivers/mfd/tps65912-core.c:41:2: note: (near initialization for 'tps65912_irqs[5].mask')
   drivers/mfd/tps65912-core.c:42:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO4_R, 1, TPS65912_INT_STS2_GPIO4_R),
     ^
   drivers/mfd/tps65912-core.c:42:2: note: (near initialization for 'tps65912_irqs[6].reg_offset')
   drivers/mfd/tps65912-core.c:43:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO4_F, 1, TPS65912_INT_STS2_GPIO4_F),
     ^
   drivers/mfd/tps65912-core.c:43:2: note: (near initialization for 'tps65912_irqs[6].mask')
   drivers/mfd/tps65912-core.c:44:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO5_R, 1, TPS65912_INT_STS2_GPIO5_R),
     ^
   drivers/mfd/tps65912-core.c:44:2: note: (near initialization for 'tps65912_irqs[7].reg_offset')
   drivers/mfd/tps65912-core.c:45:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO5_F, 1, TPS65912_INT_STS2_GPIO5_F),
     ^
   drivers/mfd/tps65912-core.c:45:2: note: (near initialization for 'tps65912_irqs[7].mask')
   drivers/mfd/tps65912-core.c:47:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC1, 2, TPS65912_INT_STS3_PGOOD_DCDC1),
     ^
   drivers/mfd/tps65912-core.c:47:2: note: (near initialization for 'tps65912_irqs[8].reg_offset')
   drivers/mfd/tps65912-core.c:48:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC2, 2, TPS65912_INT_STS3_PGOOD_DCDC2),
     ^
   drivers/mfd/tps65912-core.c:48:2: note: (near initialization for 'tps65912_irqs[8].mask')
   drivers/mfd/tps65912-core.c:49:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC3, 2, TPS65912_INT_STS3_PGOOD_DCDC3),
     ^
   drivers/mfd/tps65912-core.c:49:2: note: (near initialization for 'tps65912_irqs[9].reg_offset')
   drivers/mfd/tps65912-core.c:50:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC4, 2, TPS65912_INT_STS3_PGOOD_DCDC4),
     ^
   drivers/mfd/tps65912-core.c:50:2: note: (near initialization for 'tps65912_irqs[9].mask')
   drivers/mfd/tps65912-core.c:51:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO1, 2, TPS65912_INT_STS3_PGOOD_LDO1),
     ^
   drivers/mfd/tps65912-core.c:51:2: note: (near initialization for 'tps65912_irqs[10].reg_offset')
   drivers/mfd/tps65912-core.c:52:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO2, 2, TPS65912_INT_STS3_PGOOD_LDO2),
     ^
   drivers/mfd/tps65912-core.c:52:2: note: (near initialization for 'tps65912_irqs[10].mask')
   drivers/mfd/tps65912-core.c:53:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO3, 2, TPS65912_INT_STS3_PGOOD_LDO3),
     ^
   drivers/mfd/tps65912-core.c:53:2: note: (near initialization for 'tps65912_irqs[11].reg_offset')
   drivers/mfd/tps65912-core.c:54:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO4, 2, TPS65912_INT_STS3_PGOOD_LDO4),
     ^
   drivers/mfd/tps65912-core.c:54:2: note: (near initialization for 'tps65912_irqs[11].mask')
   drivers/mfd/tps65912-core.c:56:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO5, 3, TPS65912_INT_STS4_PGOOD_LDO5),
     ^
   drivers/mfd/tps65912-core.c:56:2: note: (near initialization for 'tps65912_irqs[12].reg_offset')
   drivers/mfd/tps65912-core.c:57:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO6, 3, TPS65912_INT_STS4_PGOOD_LDO6),
     ^

vim +/REGMAP_IRQ_REG +29 drivers/mfd/tps65912-core.c

    23	#include <linux/of_device.h>
    24	
    25	#include <linux/mfd/tps65912.h>
    26	
    27	static const struct regmap_irq tps65912_irqs[] = {
    28		/* INT_STS IRQs */
  > 29		REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_F, 0, TPS65912_INT_STS_PWRHOLD_F),
    30		REGMAP_IRQ_REG(TPS65912_IRQ_VMON, 0, TPS65912_INT_STS_VMON),
    31		REGMAP_IRQ_REG(TPS65912_IRQ_PWRON, 0, TPS65912_INT_STS_PWRON),
    32		REGMAP_IRQ_REG(TPS65912_IRQ_PWRON_LP, 0, TPS65912_INT_STS_PWRON_LP),

---
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: 50042 bytes --]

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

* Re: [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC
  2015-10-01 20:37 ` [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC Andrew F. Davis
  2015-10-01 20:51   ` kbuild test robot
@ 2015-10-01 20:57   ` kbuild test robot
  2015-10-01 20:57   ` kbuild test robot
                     ` (2 subsequent siblings)
  4 siblings, 0 replies; 44+ messages in thread
From: kbuild test robot @ 2015-10-01 20:57 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: kbuild-all, Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell,
	Kumar Gala, Lee Jones, Mark Brown, Alexandre Courbot,
	Grygorii Strashko, devicetree, linux-kernel, Andrew F. Davis

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

Hi Andrew,

[auto build test results on v4.3-rc3 -- if it's inappropriate base, please ignore]

config: tile-allyesconfig (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
        git checkout d617dea974adf7dc262f2d49dea24a673e0403e2
        # save the attached .config to linux build tree
        make.cross ARCH=tile 

All warnings (new ones prefixed by >>):

   drivers/mfd/tps65912-core.c:29:2: error: implicit declaration of function 'REGMAP_IRQ_REG'
   drivers/mfd/tps65912-core.c:29:2: warning: missing braces around initializer
>> drivers/mfd/tps65912-core.c:29:2: warning: (near initialization for
   drivers/mfd/tps65912-core.c:29:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:29:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:30:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:30:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:31:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:31:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:32:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:32:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:33:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:33:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:34:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:34:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:35:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:35:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:36:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:36:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:38:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:38:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:39:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:39:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:40:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:40:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:41:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:41:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:42:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:42:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:43:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:43:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:44:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:44:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:45:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:45:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:47:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:47:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:48:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:48:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:49:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:49:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:50:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:50:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:51:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:51:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:52:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:52:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:53:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:53:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:54:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:54:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:56:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:56:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:57:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:57:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:58:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:58:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:59:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:59:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:60:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:60:2: error: (near initialization for
   drivers/mfd/tps65912-core.c:61:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:61:2: error: (near initialization for
   cc1: some warnings being treated as errors

vim +29 drivers/mfd/tps65912-core.c

    13	 * kind, whether expressed or implied; without even the implied warranty
    14	 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    15	 * GNU General Public License version 2 for more details.
    16	 *
    17	 * Based on the TPS65218 driver and the previous TPS65912 driver by
    18	 * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
    19	 */
    20	
    21	#include <linux/interrupt.h>
    22	#include <linux/module.h>
    23	#include <linux/of_device.h>
    24	
    25	#include <linux/mfd/tps65912.h>
    26	
    27	static const struct regmap_irq tps65912_irqs[] = {
    28		/* INT_STS IRQs */
  > 29		REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_F, 0, TPS65912_INT_STS_PWRHOLD_F),
    30		REGMAP_IRQ_REG(TPS65912_IRQ_VMON, 0, TPS65912_INT_STS_VMON),
    31		REGMAP_IRQ_REG(TPS65912_IRQ_PWRON, 0, TPS65912_INT_STS_PWRON),
    32		REGMAP_IRQ_REG(TPS65912_IRQ_PWRON_LP, 0, TPS65912_INT_STS_PWRON_LP),
    33		REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_R, 0, TPS65912_INT_STS_PWRHOLD_R),
    34		REGMAP_IRQ_REG(TPS65912_IRQ_HOTDIE, 0, TPS65912_INT_STS_HOTDIE),
    35		REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_R, 0, TPS65912_INT_STS_GPIO1_R),
    36		REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_F, 0, TPS65912_INT_STS_GPIO1_F),
    37		/* INT_STS2 IRQs */

---
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: 41634 bytes --]

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

* Re: [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC
  2015-10-01 20:37 ` [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC Andrew F. Davis
  2015-10-01 20:51   ` kbuild test robot
  2015-10-01 20:57   ` kbuild test robot
@ 2015-10-01 20:57   ` kbuild test robot
  2015-10-01 23:49   ` Andrew F. Davis
  2015-10-05  9:24   ` Lee Jones
  4 siblings, 0 replies; 44+ messages in thread
From: kbuild test robot @ 2015-10-01 20:57 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: kbuild-all, Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell,
	Kumar Gala, Lee Jones, Mark Brown, Alexandre Courbot,
	Grygorii Strashko, devicetree, linux-kernel, Andrew F. Davis

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

Hi Andrew,

[auto build test results on v4.3-rc3 -- if it's inappropriate base, please ignore]

config: xtensa-allyesconfig (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
        git checkout d617dea974adf7dc262f2d49dea24a673e0403e2
        # save the attached .config to linux build tree
        make.cross ARCH=xtensa 

All warnings (new ones prefixed by >>):

   drivers/mfd/tps65912-core.c:29:2: error: implicit declaration of function 'REGMAP_IRQ_REG' [-Werror=implicit-function-declaration]
     REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_F, 0, TPS65912_INT_STS_PWRHOLD_F),
     ^
>> drivers/mfd/tps65912-core.c:29:2: warning: missing braces around initializer [-Wmissing-braces]
>> drivers/mfd/tps65912-core.c:29:2: warning: (near initialization for 'tps65912_irqs[0]') [-Wmissing-braces]
   drivers/mfd/tps65912-core.c:29:2: error: initializer element is not constant
   drivers/mfd/tps65912-core.c:29:2: error: (near initialization for 'tps65912_irqs[0].reg_offset')
   drivers/mfd/tps65912-core.c:30:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_VMON, 0, TPS65912_INT_STS_VMON),
     ^
   drivers/mfd/tps65912-core.c:30:2: error: (near initialization for 'tps65912_irqs[0].mask')
   drivers/mfd/tps65912-core.c:31:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PWRON, 0, TPS65912_INT_STS_PWRON),
     ^
   drivers/mfd/tps65912-core.c:31:2: error: (near initialization for 'tps65912_irqs[1].reg_offset')
   drivers/mfd/tps65912-core.c:32:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PWRON_LP, 0, TPS65912_INT_STS_PWRON_LP),
     ^
   drivers/mfd/tps65912-core.c:32:2: error: (near initialization for 'tps65912_irqs[1].mask')
   drivers/mfd/tps65912-core.c:33:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_R, 0, TPS65912_INT_STS_PWRHOLD_R),
     ^
   drivers/mfd/tps65912-core.c:33:2: error: (near initialization for 'tps65912_irqs[2].reg_offset')
   drivers/mfd/tps65912-core.c:34:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_HOTDIE, 0, TPS65912_INT_STS_HOTDIE),
     ^
   drivers/mfd/tps65912-core.c:34:2: error: (near initialization for 'tps65912_irqs[2].mask')
   drivers/mfd/tps65912-core.c:35:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_R, 0, TPS65912_INT_STS_GPIO1_R),
     ^
   drivers/mfd/tps65912-core.c:35:2: error: (near initialization for 'tps65912_irqs[3].reg_offset')
   drivers/mfd/tps65912-core.c:36:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_F, 0, TPS65912_INT_STS_GPIO1_F),
     ^
   drivers/mfd/tps65912-core.c:36:2: error: (near initialization for 'tps65912_irqs[3].mask')
   drivers/mfd/tps65912-core.c:38:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO2_R, 1, TPS65912_INT_STS2_GPIO2_R),
     ^
   drivers/mfd/tps65912-core.c:38:2: error: (near initialization for 'tps65912_irqs[4].reg_offset')
   drivers/mfd/tps65912-core.c:39:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO2_F, 1, TPS65912_INT_STS2_GPIO2_F),
     ^
   drivers/mfd/tps65912-core.c:39:2: error: (near initialization for 'tps65912_irqs[4].mask')
   drivers/mfd/tps65912-core.c:40:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO3_R, 1, TPS65912_INT_STS2_GPIO3_R),
     ^
   drivers/mfd/tps65912-core.c:40:2: error: (near initialization for 'tps65912_irqs[5].reg_offset')
   drivers/mfd/tps65912-core.c:41:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO3_F, 1, TPS65912_INT_STS2_GPIO3_F),
     ^
   drivers/mfd/tps65912-core.c:41:2: error: (near initialization for 'tps65912_irqs[5].mask')
   drivers/mfd/tps65912-core.c:42:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO4_R, 1, TPS65912_INT_STS2_GPIO4_R),
     ^
   drivers/mfd/tps65912-core.c:42:2: error: (near initialization for 'tps65912_irqs[6].reg_offset')
   drivers/mfd/tps65912-core.c:43:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO4_F, 1, TPS65912_INT_STS2_GPIO4_F),
     ^
   drivers/mfd/tps65912-core.c:43:2: error: (near initialization for 'tps65912_irqs[6].mask')
   drivers/mfd/tps65912-core.c:44:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO5_R, 1, TPS65912_INT_STS2_GPIO5_R),
     ^
   drivers/mfd/tps65912-core.c:44:2: error: (near initialization for 'tps65912_irqs[7].reg_offset')
   drivers/mfd/tps65912-core.c:45:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_GPIO5_F, 1, TPS65912_INT_STS2_GPIO5_F),
     ^
   drivers/mfd/tps65912-core.c:45:2: error: (near initialization for 'tps65912_irqs[7].mask')
   drivers/mfd/tps65912-core.c:47:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC1, 2, TPS65912_INT_STS3_PGOOD_DCDC1),
     ^
   drivers/mfd/tps65912-core.c:47:2: error: (near initialization for 'tps65912_irqs[8].reg_offset')
   drivers/mfd/tps65912-core.c:48:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC2, 2, TPS65912_INT_STS3_PGOOD_DCDC2),
     ^
   drivers/mfd/tps65912-core.c:48:2: error: (near initialization for 'tps65912_irqs[8].mask')
   drivers/mfd/tps65912-core.c:49:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC3, 2, TPS65912_INT_STS3_PGOOD_DCDC3),
     ^
   drivers/mfd/tps65912-core.c:49:2: error: (near initialization for 'tps65912_irqs[9].reg_offset')
   drivers/mfd/tps65912-core.c:50:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC4, 2, TPS65912_INT_STS3_PGOOD_DCDC4),
     ^
   drivers/mfd/tps65912-core.c:50:2: error: (near initialization for 'tps65912_irqs[9].mask')
   drivers/mfd/tps65912-core.c:51:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO1, 2, TPS65912_INT_STS3_PGOOD_LDO1),
     ^
   drivers/mfd/tps65912-core.c:51:2: error: (near initialization for 'tps65912_irqs[10].reg_offset')
   drivers/mfd/tps65912-core.c:52:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO2, 2, TPS65912_INT_STS3_PGOOD_LDO2),
     ^
   drivers/mfd/tps65912-core.c:52:2: error: (near initialization for 'tps65912_irqs[10].mask')
   drivers/mfd/tps65912-core.c:53:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO3, 2, TPS65912_INT_STS3_PGOOD_LDO3),
     ^
   drivers/mfd/tps65912-core.c:53:2: error: (near initialization for 'tps65912_irqs[11].reg_offset')
   drivers/mfd/tps65912-core.c:54:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO4, 2, TPS65912_INT_STS3_PGOOD_LDO4),
     ^
   drivers/mfd/tps65912-core.c:54:2: error: (near initialization for 'tps65912_irqs[11].mask')
   drivers/mfd/tps65912-core.c:56:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO5, 3, TPS65912_INT_STS4_PGOOD_LDO5),
     ^
   drivers/mfd/tps65912-core.c:56:2: error: (near initialization for 'tps65912_irqs[12].reg_offset')
   drivers/mfd/tps65912-core.c:57:2: error: initializer element is not constant
     REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO6, 3, TPS65912_INT_STS4_PGOOD_LDO6),

vim +29 drivers/mfd/tps65912-core.c

    13	 * kind, whether expressed or implied; without even the implied warranty
    14	 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    15	 * GNU General Public License version 2 for more details.
    16	 *
    17	 * Based on the TPS65218 driver and the previous TPS65912 driver by
    18	 * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
    19	 */
    20	
    21	#include <linux/interrupt.h>
    22	#include <linux/module.h>
    23	#include <linux/of_device.h>
    24	
    25	#include <linux/mfd/tps65912.h>
    26	
    27	static const struct regmap_irq tps65912_irqs[] = {
    28		/* INT_STS IRQs */
  > 29		REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_F, 0, TPS65912_INT_STS_PWRHOLD_F),
    30		REGMAP_IRQ_REG(TPS65912_IRQ_VMON, 0, TPS65912_INT_STS_VMON),
    31		REGMAP_IRQ_REG(TPS65912_IRQ_PWRON, 0, TPS65912_INT_STS_PWRON),
    32		REGMAP_IRQ_REG(TPS65912_IRQ_PWRON_LP, 0, TPS65912_INT_STS_PWRON_LP),
    33		REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_R, 0, TPS65912_INT_STS_PWRHOLD_R),
    34		REGMAP_IRQ_REG(TPS65912_IRQ_HOTDIE, 0, TPS65912_INT_STS_HOTDIE),
    35		REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_R, 0, TPS65912_INT_STS_GPIO1_R),
    36		REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_F, 0, TPS65912_INT_STS_GPIO1_F),
    37		/* INT_STS2 IRQs */

---
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: 42450 bytes --]

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

* Re: [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC
  2015-10-01 20:37 ` [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC Andrew F. Davis
                     ` (2 preceding siblings ...)
  2015-10-01 20:57   ` kbuild test robot
@ 2015-10-01 23:49   ` Andrew F. Davis
  2015-10-05  9:24   ` Lee Jones
  4 siblings, 0 replies; 44+ messages in thread
From: Andrew F. Davis @ 2015-10-01 23:49 UTC (permalink / raw)
  To: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Mark Brown, Alexandre Courbot, Grygorii Strashko
  Cc: devicetree, linux-kernel

On 10/01/2015 03:37 PM, Andrew F. Davis wrote:
> This patch adds support for TPS65912 mfd device. It provides
> communication through the I2C and SPI interfaces. It contains
> the following components:
>
>   - Regulators
>   - GPIO controller
>
> Signed-off-by: Andrew F. Davis <afd@ti.com>

Forgot to mention, as the kbuild bot figured out, this patch needs
b4fe8ba ("regmap: Add generic macro to define regmap_irq")
from Lee Jones' tree to build.

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

* Re: [lkp] [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC
       [not found]     ` <20151002095859.GN12635@sirena.org.uk>
@ 2015-10-02 13:32       ` Fengguang Wu
  2015-10-02 13:47         ` Mark Brown
  0 siblings, 1 reply; 44+ messages in thread
From: Fengguang Wu @ 2015-10-02 13:32 UTC (permalink / raw)
  To: Mark Brown; +Cc: LKML

[CC LKML]

On Fri, Oct 02, 2015 at 10:58:59AM +0100, Mark Brown wrote:
> On Fri, Oct 02, 2015 at 04:51:11AM +0800, kbuild test robot wrote:
> > Hi Andrew,
> > 
> > [auto build test results on v4.3-rc3 -- if it's inappropriate base, please ignore]
> > 
> > config: x86_64-allmodconfig (attached as .config)
> > reproduce:
> >         git checkout d617dea974adf7dc262f2d49dea24a673e0403e2
> >         # save the attached .config to linux build tree
> >         make ARCH=x86_64 
> > 
> > All error/warnings (new ones prefixed by >>):
> 
> It would be good if somewhere early on in these mails the report said if
> the build failed - that's key information about how urgent issues are
> and it's not always clear if things are errors or warnings.

When the robot say "All error/warnings" it has build failure (and
possibly warnings). If there are only build warnings it'll say

All warnings (new ones prefixed by >>):

Would you like making that line more clear, or show the info
earlier in the email body or even email title? For example,
the first line could be changed to

[auto build test ERROR on v4.3-rc3 -- if it's inappropriate base, please ignore]
[auto build test WARNING on v4.3-rc3 -- if it's inappropriate base, please ignore]

depending on whether it has build failure or just warnings.

Thanks,
Fengguang

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

* Re: [lkp] [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC
  2015-10-02 13:32       ` [lkp] " Fengguang Wu
@ 2015-10-02 13:47         ` Mark Brown
  0 siblings, 0 replies; 44+ messages in thread
From: Mark Brown @ 2015-10-02 13:47 UTC (permalink / raw)
  To: Fengguang Wu; +Cc: LKML

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

On Fri, Oct 02, 2015 at 09:32:12PM +0800, Fengguang Wu wrote:
> On Fri, Oct 02, 2015 at 10:58:59AM +0100, Mark Brown wrote:

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

> > It would be good if somewhere early on in these mails the report said if
> > the build failed - that's key information about how urgent issues are
> > and it's not always clear if things are errors or warnings.

> When the robot say "All error/warnings" it has build failure (and
> possibly warnings). If there are only build warnings it'll say

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

Ah, I see - it's more clear in the warnings only case, it's less obvious
in the errors case that this message would be different if there were
only warnings.

> Would you like making that line more clear, or show the info
> earlier in the email body or even email title? For example,
> the first line could be changed to

> [auto build test ERROR on v4.3-rc3 -- if it's inappropriate base, please ignore]
> [auto build test WARNING on v4.3-rc3 -- if it's inappropriate base, please ignore]

> depending on whether it has build failure or just warnings.

That would be excellent, yes.

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

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-10-01 20:37 ` [PATCH v4 4/5] regulator: tps65912: Add regulator " Andrew F. Davis
@ 2015-10-02 19:21   ` Grygorii Strashko
  2015-10-22 16:47   ` Mark Brown
  1 sibling, 0 replies; 44+ messages in thread
From: Grygorii Strashko @ 2015-10-02 19:21 UTC (permalink / raw)
  To: Andrew F. Davis, Rob Herring, Pawel Moll, Mark Rutland,
	Ian Campbell, Kumar Gala, Lee Jones, Mark Brown,
	Alexandre Courbot
  Cc: devicetree, linux-kernel

On 10/01/2015 03:37 PM, Andrew F. Davis wrote:
> This patch adds support for TPS65912 PMIC regulators.
>
> The regulators set consists of 4 DCDCs and 10 LDOs. The output
> voltages are configurable and are meant to supply power to the
> main processor and other components.
>
> Signed-off-by: Andrew F. Davis <afd@ti.com>
> ---
>   drivers/regulator/Kconfig              |   6 ++
>   drivers/regulator/Makefile             |   1 +
>   drivers/regulator/tps65912-regulator.c | 171 +++++++++++++++++++++++++++++++++
>   3 files changed, 178 insertions(+)
>   create mode 100644 drivers/regulator/tps65912-regulator.c

Looks good for me:
Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com>

[...]

-- 
regards,
-grygorii

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

* Re: [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC
  2015-10-01 20:37 ` [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC Andrew F. Davis
                     ` (3 preceding siblings ...)
  2015-10-01 23:49   ` Andrew F. Davis
@ 2015-10-05  9:24   ` Lee Jones
  2015-10-05  9:27     ` Lee Jones
  4 siblings, 1 reply; 44+ messages in thread
From: Lee Jones @ 2015-10-05  9:24 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Mark Brown, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On Thu, 01 Oct 2015, Andrew F. Davis wrote:

> This patch adds support for TPS65912 mfd device. It provides
> communication through the I2C and SPI interfaces. It contains
> the following components:
> 
>  - Regulators
>  - GPIO controller
> 
> Signed-off-by: Andrew F. Davis <afd@ti.com>
> ---
>  drivers/mfd/Kconfig          |  25 ++++
>  drivers/mfd/Makefile         |   3 +
>  drivers/mfd/tps65912-core.c  | 108 ++++++++++++++
>  drivers/mfd/tps65912-i2c.c   |  82 ++++++++++
>  drivers/mfd/tps65912-spi.c   |  81 ++++++++++
>  include/linux/mfd/tps65912.h | 345 +++++++++++++++++++++++++++++++++++++++++++
>  6 files changed, 644 insertions(+)
>  create mode 100644 drivers/mfd/tps65912-core.c
>  create mode 100644 drivers/mfd/tps65912-i2c.c
>  create mode 100644 drivers/mfd/tps65912-spi.c
>  create mode 100644 include/linux/mfd/tps65912.h

Applied, thanks.

> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> index 9a8df8e..02b321f 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -1167,6 +1167,31 @@ config MFD_TPS65910
>  	  if you say yes here you get support for the TPS65910 series of
>  	  Power Management chips.
>  
> +config MFD_TPS65912
> +	tristate
> +	select REGMAP
> +	select REGMAP_IRQ
> +
> +config MFD_TPS65912_I2C
> +	tristate "TI TPS65912 Power Management chip with I2C"
> +	select MFD_TPS65912
> +	select REGMAP_I2C
> +	depends on I2C
> +	depends on OF || COMPILE_TEST
> +	help
> +	  If you say yes here you get support for the TPS65912 series of
> +	  PM chips with I2C interface.
> +
> +config MFD_TPS65912_SPI
> +	tristate "TI TPS65912 Power Management chip with SPI"
> +	select MFD_TPS65912
> +	select REGMAP_SPI
> +	depends on SPI_MASTER
> +	depends on OF || COMPILE_TEST
> +	help
> +	  If you say yes here you get support for the TPS65912 series of
> +	  PM chips with SPI interface.
> +
>  config MFD_TPS80031
>  	bool "TI TPS80031/TPS80032 Power Management chips"
>  	depends on I2C=y
> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> index 004aa76..49c3530 100644
> --- a/drivers/mfd/Makefile
> +++ b/drivers/mfd/Makefile
> @@ -69,6 +69,9 @@ obj-$(CONFIG_TPS6507X)		+= tps6507x.o
>  obj-$(CONFIG_MFD_TPS65217)	+= tps65217.o
>  obj-$(CONFIG_MFD_TPS65218)	+= tps65218.o
>  obj-$(CONFIG_MFD_TPS65910)	+= tps65910.o
> +obj-$(CONFIG_MFD_TPS65912)	+= tps65912-core.o
> +obj-$(CONFIG_MFD_TPS65912_I2C)	+= tps65912-i2c.o
> +obj-$(CONFIG_MFD_TPS65912_SPI)  += tps65912-spi.o
>  obj-$(CONFIG_MFD_TPS80031)	+= tps80031.o
>  obj-$(CONFIG_MENELAUS)		+= menelaus.o
>  
> diff --git a/drivers/mfd/tps65912-core.c b/drivers/mfd/tps65912-core.c
> new file mode 100644
> index 0000000..e787950
> --- /dev/null
> +++ b/drivers/mfd/tps65912-core.c
> @@ -0,0 +1,108 @@
> +/*
> + * Core functions for TI TPS65912x PMIC
> + *
> + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
> + *
> + * Author: Andrew F. Davis <afd@ti.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.
> + *
> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> + * kind, whether expressed or implied; without even the implied warranty
> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License version 2 for more details.
> + *
> + * Based on the TPS65218 driver and the previous TPS65912 driver by
> + * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> + */
> +
> +#include <linux/interrupt.h>
> +#include <linux/module.h>
> +#include <linux/of_device.h>
> +
> +#include <linux/mfd/tps65912.h>
> +
> +static const struct regmap_irq tps65912_irqs[] = {
> +	/* INT_STS IRQs */
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_F, 0, TPS65912_INT_STS_PWRHOLD_F),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_VMON, 0, TPS65912_INT_STS_VMON),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PWRON, 0, TPS65912_INT_STS_PWRON),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PWRON_LP, 0, TPS65912_INT_STS_PWRON_LP),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_R, 0, TPS65912_INT_STS_PWRHOLD_R),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_HOTDIE, 0, TPS65912_INT_STS_HOTDIE),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_R, 0, TPS65912_INT_STS_GPIO1_R),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_F, 0, TPS65912_INT_STS_GPIO1_F),
> +	/* INT_STS2 IRQs */
> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO2_R, 1, TPS65912_INT_STS2_GPIO2_R),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO2_F, 1, TPS65912_INT_STS2_GPIO2_F),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO3_R, 1, TPS65912_INT_STS2_GPIO3_R),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO3_F, 1, TPS65912_INT_STS2_GPIO3_F),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO4_R, 1, TPS65912_INT_STS2_GPIO4_R),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO4_F, 1, TPS65912_INT_STS2_GPIO4_F),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO5_R, 1, TPS65912_INT_STS2_GPIO5_R),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO5_F, 1, TPS65912_INT_STS2_GPIO5_F),
> +	/* INT_STS3 IRQs */
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC1, 2, TPS65912_INT_STS3_PGOOD_DCDC1),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC2, 2, TPS65912_INT_STS3_PGOOD_DCDC2),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC3, 2, TPS65912_INT_STS3_PGOOD_DCDC3),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC4, 2, TPS65912_INT_STS3_PGOOD_DCDC4),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO1, 2, TPS65912_INT_STS3_PGOOD_LDO1),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO2, 2, TPS65912_INT_STS3_PGOOD_LDO2),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO3, 2, TPS65912_INT_STS3_PGOOD_LDO3),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO4, 2, TPS65912_INT_STS3_PGOOD_LDO4),
> +	/* INT_STS4 IRQs */
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO5, 3, TPS65912_INT_STS4_PGOOD_LDO5),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO6, 3, TPS65912_INT_STS4_PGOOD_LDO6),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO7, 3, TPS65912_INT_STS4_PGOOD_LDO7),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO8, 3, TPS65912_INT_STS4_PGOOD_LDO8),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO9, 3, TPS65912_INT_STS4_PGOOD_LDO9),
> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO10, 3, TPS65912_INT_STS4_PGOOD_LDO10),
> +};
> +
> +static struct regmap_irq_chip tps65912_irq_chip = {
> +	.name = "tps65912",
> +	.irqs = tps65912_irqs,
> +	.num_irqs = ARRAY_SIZE(tps65912_irqs),
> +	.num_regs = 4,
> +	.irq_reg_stride = 2,
> +	.mask_base = TPS65912_INT_MSK,
> +	.status_base = TPS65912_INT_STS,
> +	.ack_base = TPS65912_INT_STS,
> +	.init_ack_masked = true,
> +};
> +
> +int tps65912_device_init(struct tps65912 *tps)
> +{
> +	int ret;
> +
> +	ret = regmap_add_irq_chip(tps->regmap, tps->irq, IRQF_ONESHOT, 0,
> +				  &tps65912_irq_chip, &tps->irq_data);
> +	if (ret < 0)
> +		return ret;
> +
> +	ret = of_platform_populate(tps->dev->of_node, NULL, NULL, tps->dev);
> +	if (ret < 0)
> +		goto err_irq;
> +
> +	return 0;
> +
> +err_irq:
> +	regmap_del_irq_chip(tps->irq, tps->irq_data);
> +
> +	return ret;
> +}
> +EXPORT_SYMBOL_GPL(tps65912_device_init);
> +
> +int tps65912_device_exit(struct tps65912 *tps)
> +{
> +	regmap_del_irq_chip(tps->irq, tps->irq_data);
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(tps65912_device_exit);
> +
> +MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
> +MODULE_DESCRIPTION("TPS65912x MFD Driver");
> +MODULE_LICENSE("GPL v2");
> diff --git a/drivers/mfd/tps65912-i2c.c b/drivers/mfd/tps65912-i2c.c
> new file mode 100644
> index 0000000..bdae10b01
> --- /dev/null
> +++ b/drivers/mfd/tps65912-i2c.c
> @@ -0,0 +1,82 @@
> +/*
> + * I2C access driver for TI TPS65912x PMIC
> + *
> + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
> + *
> + * Author: Andrew F. Davis <afd@ti.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.
> + *
> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> + * kind, whether expressed or implied; without even the implied warranty
> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License version 2 for more details.
> + *
> + * Based on the TPS65218 driver and the previous TPS65912 driver by
> + * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> + */
> +
> +#include <linux/i2c.h>
> +#include <linux/module.h>
> +#include <linux/of_device.h>
> +#include <linux/regmap.h>
> +
> +#include <linux/mfd/tps65912.h>
> +
> +static const struct of_device_id tps65912_i2c_of_match_table[] = {
> +	{ .compatible = "ti,tps65912", },
> +	{ /* sentinel */ }
> +};
> +
> +static int tps65912_i2c_probe(struct i2c_client *client,
> +			      const struct i2c_device_id *ids)
> +{
> +	struct tps65912 *tps;
> +
> +	tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
> +	if (!tps)
> +		return -ENOMEM;
> +
> +	i2c_set_clientdata(client, tps);
> +	tps->dev = &client->dev;
> +	tps->irq = client->irq;
> +
> +	tps->regmap = devm_regmap_init_i2c(client, &tps65912_regmap_config);
> +	if (IS_ERR(tps->regmap)) {
> +		dev_err(tps->dev, "Failed to initialize register map\n");
> +		return PTR_ERR(tps->regmap);
> +	}
> +
> +	return tps65912_device_init(tps);
> +}
> +
> +static int tps65912_i2c_remove(struct i2c_client *client)
> +{
> +	struct tps65912 *tps = i2c_get_clientdata(client);
> +
> +	return tps65912_device_exit(tps);
> +}
> +
> +static const struct i2c_device_id tps65912_i2c_id_table[] = {
> +	{ "tps65912", 0 },
> +	{ /* sentinel */ },
> +};
> +MODULE_DEVICE_TABLE(i2c, tps65912_i2c_id_table);
> +
> +static struct i2c_driver tps65912_i2c_driver = {
> +	.driver		= {
> +		.name	= "tps65912",
> +		.of_match_table = tps65912_i2c_of_match_table,
> +	},
> +	.probe		= tps65912_i2c_probe,
> +	.remove		= tps65912_i2c_remove,
> +	.id_table       = tps65912_i2c_id_table,
> +};
> +
> +module_i2c_driver(tps65912_i2c_driver);
> +
> +MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
> +MODULE_DESCRIPTION("TPS65912x I2C Interface Driver");
> +MODULE_LICENSE("GPL v2");
> diff --git a/drivers/mfd/tps65912-spi.c b/drivers/mfd/tps65912-spi.c
> new file mode 100644
> index 0000000..24c5c97
> --- /dev/null
> +++ b/drivers/mfd/tps65912-spi.c
> @@ -0,0 +1,81 @@
> +/*
> + * SPI access driver for TI TPS65912x PMIC
> + *
> + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
> + *
> + * Author: Andrew F. Davis <afd@ti.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.
> + *
> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> + * kind, whether expressed or implied; without even the implied warranty
> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License version 2 for more details.
> + *
> + * Based on the TPS65218 driver and the previous TPS65912 driver by
> + * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> + */
> +
> +#include <linux/module.h>
> +#include <linux/of_device.h>
> +#include <linux/regmap.h>
> +#include <linux/spi/spi.h>
> +
> +#include <linux/mfd/tps65912.h>
> +
> +static const struct of_device_id tps65912_spi_of_match_table[] = {
> +	{ .compatible = "ti,tps65912", },
> +	{ /* sentinel */ }
> +};
> +
> +static int tps65912_spi_probe(struct spi_device *spi)
> +{
> +	struct tps65912 *tps;
> +
> +	tps = devm_kzalloc(&spi->dev, sizeof(*tps), GFP_KERNEL);
> +	if (!tps)
> +		return -ENOMEM;
> +
> +	spi_set_drvdata(spi, tps);
> +	tps->dev = &spi->dev;
> +	tps->irq = spi->irq;
> +
> +	tps->regmap = devm_regmap_init_spi(spi, &tps65912_regmap_config);
> +	if (IS_ERR(tps->regmap)) {
> +		dev_err(tps->dev, "Failed to initialize register map\n");
> +		return PTR_ERR(tps->regmap);
> +	}
> +
> +	return tps65912_device_init(tps);
> +}
> +
> +static int tps65912_spi_remove(struct spi_device *client)
> +{
> +	struct tps65912 *tps = spi_get_drvdata(client);
> +
> +	return tps65912_device_exit(tps);
> +}
> +
> +static const struct spi_device_id tps65912_spi_id_table[] = {
> +	{ "tps65912", 0 },
> +	{ /* sentinel */ },
> +};
> +MODULE_DEVICE_TABLE(spi, tps65912_spi_id_table);
> +
> +static struct spi_driver tps65912_spi_driver = {
> +	.driver		= {
> +		.name	= "tps65912",
> +		.of_match_table = tps65912_spi_of_match_table,
> +	},
> +	.probe		= tps65912_spi_probe,
> +	.remove		= tps65912_spi_remove,
> +	.id_table       = tps65912_spi_id_table,
> +};
> +
> +module_spi_driver(tps65912_spi_driver);
> +
> +MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
> +MODULE_DESCRIPTION("TPS65912x SPI Interface Driver");
> +MODULE_LICENSE("GPL v2");
> diff --git a/include/linux/mfd/tps65912.h b/include/linux/mfd/tps65912.h
> new file mode 100644
> index 0000000..8843c0d
> --- /dev/null
> +++ b/include/linux/mfd/tps65912.h
> @@ -0,0 +1,345 @@
> +/*
> + * TI TPS65912x
> + *
> + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
> + *
> + * Author: Andrew F. Davis <afd@ti.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.
> + *
> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> + * kind, whether expressed or implied; without even the implied warranty
> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License version 2 for more details.
> + *
> + * Based on the TPS65218 driver and the previous TPS65912 driver by
> + * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> + */
> +
> +#ifndef __LINUX_MFD_TPS65912_H
> +#define __LINUX_MFD_TPS65912_H
> +
> +#include <linux/device.h>
> +#include <linux/regmap.h>
> +#include <linux/regulator/driver.h>
> +
> +/* List of registers for TPS65912 */
> +#define TPS65912_DCDC1_CTRL		0x00
> +#define TPS65912_DCDC2_CTRL		0x01
> +#define TPS65912_DCDC3_CTRL		0x02
> +#define TPS65912_DCDC4_CTRL		0x03
> +#define TPS65912_DCDC1_OP		0x04
> +#define TPS65912_DCDC1_AVS		0x05
> +#define TPS65912_DCDC1_LIMIT		0x06
> +#define TPS65912_DCDC2_OP		0x07
> +#define TPS65912_DCDC2_AVS		0x08
> +#define TPS65912_DCDC2_LIMIT		0x09
> +#define TPS65912_DCDC3_OP		0x0A
> +#define TPS65912_DCDC3_AVS		0x0B
> +#define TPS65912_DCDC3_LIMIT		0x0C
> +#define TPS65912_DCDC4_OP		0x0D
> +#define TPS65912_DCDC4_AVS		0x0E
> +#define TPS65912_DCDC4_LIMIT		0x0F
> +#define TPS65912_LDO1_OP		0x10
> +#define TPS65912_LDO1_AVS		0x11
> +#define TPS65912_LDO1_LIMIT		0x12
> +#define TPS65912_LDO2_OP		0x13
> +#define TPS65912_LDO2_AVS		0x14
> +#define TPS65912_LDO2_LIMIT		0x15
> +#define TPS65912_LDO3_OP		0x16
> +#define TPS65912_LDO3_AVS		0x17
> +#define TPS65912_LDO3_LIMIT		0x18
> +#define TPS65912_LDO4_OP		0x19
> +#define TPS65912_LDO4_AVS		0x1A
> +#define TPS65912_LDO4_LIMIT		0x1B
> +#define TPS65912_LDO5			0x1C
> +#define TPS65912_LDO6			0x1D
> +#define TPS65912_LDO7			0x1E
> +#define TPS65912_LDO8			0x1F
> +#define TPS65912_LDO9			0x20
> +#define TPS65912_LDO10			0x21
> +#define TPS65912_THRM			0x22
> +#define TPS65912_CLK32OUT		0x23
> +#define TPS65912_DEVCTRL		0x24
> +#define TPS65912_DEVCTRL2		0x25
> +#define TPS65912_I2C_SPI_CFG		0x26
> +#define TPS65912_KEEP_ON		0x27
> +#define TPS65912_KEEP_ON2		0x28
> +#define TPS65912_SET_OFF1		0x29
> +#define TPS65912_SET_OFF2		0x2A
> +#define TPS65912_DEF_VOLT		0x2B
> +#define TPS65912_DEF_VOLT_MAPPING	0x2C
> +#define TPS65912_DISCHARGE		0x2D
> +#define TPS65912_DISCHARGE2		0x2E
> +#define TPS65912_EN1_SET1		0x2F
> +#define TPS65912_EN1_SET2		0x30
> +#define TPS65912_EN2_SET1		0x31
> +#define TPS65912_EN2_SET2		0x32
> +#define TPS65912_EN3_SET1		0x33
> +#define TPS65912_EN3_SET2		0x34
> +#define TPS65912_EN4_SET1		0x35
> +#define TPS65912_EN4_SET2		0x36
> +#define TPS65912_PGOOD			0x37
> +#define TPS65912_PGOOD2			0x38
> +#define TPS65912_INT_STS		0x39
> +#define TPS65912_INT_MSK		0x3A
> +#define TPS65912_INT_STS2		0x3B
> +#define TPS65912_INT_MSK2		0x3C
> +#define TPS65912_INT_STS3		0x3D
> +#define TPS65912_INT_MSK3		0x3E
> +#define TPS65912_INT_STS4		0x3F
> +#define TPS65912_INT_MSK4		0x40
> +#define TPS65912_GPIO1			0x41
> +#define TPS65912_GPIO2			0x42
> +#define TPS65912_GPIO3			0x43
> +#define TPS65912_GPIO4			0x44
> +#define TPS65912_GPIO5			0x45
> +#define TPS65912_VMON			0x46
> +#define TPS65912_LEDA_CTRL1		0x47
> +#define TPS65912_LEDA_CTRL2		0x48
> +#define TPS65912_LEDA_CTRL3		0x49
> +#define TPS65912_LEDA_CTRL4		0x4A
> +#define TPS65912_LEDA_CTRL5		0x4B
> +#define TPS65912_LEDA_CTRL6		0x4C
> +#define TPS65912_LEDA_CTRL7		0x4D
> +#define TPS65912_LEDA_CTRL8		0x4E
> +#define TPS65912_LEDB_CTRL1		0x4F
> +#define TPS65912_LEDB_CTRL2		0x50
> +#define TPS65912_LEDB_CTRL3		0x51
> +#define TPS65912_LEDB_CTRL4		0x52
> +#define TPS65912_LEDB_CTRL5		0x53
> +#define TPS65912_LEDB_CTRL6		0x54
> +#define TPS65912_LEDB_CTRL7		0x55
> +#define TPS65912_LEDB_CTRL8		0x56
> +#define TPS65912_LEDC_CTRL1		0x57
> +#define TPS65912_LEDC_CTRL2		0x58
> +#define TPS65912_LEDC_CTRL3		0x59
> +#define TPS65912_LEDC_CTRL4		0x5A
> +#define TPS65912_LEDC_CTRL5		0x5B
> +#define TPS65912_LEDC_CTRL6		0x5C
> +#define TPS65912_LEDC_CTRL7		0x5D
> +#define TPS65912_LEDC_CTRL8		0x5E
> +#define TPS65912_LED_RAMP_UP_TIME	0x5F
> +#define TPS65912_LED_RAMP_DOWN_TIME	0x60
> +#define TPS65912_LED_SEQ_EN		0x61
> +#define TPS65912_LOADSWITCH		0x62
> +#define TPS65912_SPARE			0x63
> +#define TPS65912_VERNUM			0x64
> +#define TPS6591X_MAX_REGISTER		0x64
> +
> +/* INT_STS Register field definitions */
> +#define TPS65912_INT_STS_PWRHOLD_F	BIT(0)
> +#define TPS65912_INT_STS_VMON		BIT(1)
> +#define TPS65912_INT_STS_PWRON		BIT(2)
> +#define TPS65912_INT_STS_PWRON_LP	BIT(3)
> +#define TPS65912_INT_STS_PWRHOLD_R	BIT(4)
> +#define TPS65912_INT_STS_HOTDIE		BIT(5)
> +#define TPS65912_INT_STS_GPIO1_R	BIT(6)
> +#define TPS65912_INT_STS_GPIO1_F	BIT(7)
> +
> +/* INT_STS Register field definitions */
> +#define TPS65912_INT_STS2_GPIO2_R	BIT(0)
> +#define TPS65912_INT_STS2_GPIO2_F	BIT(1)
> +#define TPS65912_INT_STS2_GPIO3_R	BIT(2)
> +#define TPS65912_INT_STS2_GPIO3_F	BIT(3)
> +#define TPS65912_INT_STS2_GPIO4_R	BIT(4)
> +#define TPS65912_INT_STS2_GPIO4_F	BIT(5)
> +#define TPS65912_INT_STS2_GPIO5_R	BIT(6)
> +#define TPS65912_INT_STS2_GPIO5_F	BIT(7)
> +
> +/* INT_STS Register field definitions */
> +#define TPS65912_INT_STS3_PGOOD_DCDC1	BIT(0)
> +#define TPS65912_INT_STS3_PGOOD_DCDC2	BIT(1)
> +#define TPS65912_INT_STS3_PGOOD_DCDC3	BIT(2)
> +#define TPS65912_INT_STS3_PGOOD_DCDC4	BIT(3)
> +#define TPS65912_INT_STS3_PGOOD_LDO1	BIT(4)
> +#define TPS65912_INT_STS3_PGOOD_LDO2	BIT(5)
> +#define TPS65912_INT_STS3_PGOOD_LDO3	BIT(6)
> +#define TPS65912_INT_STS3_PGOOD_LDO4	BIT(7)
> +
> +/* INT_STS Register field definitions */
> +#define TPS65912_INT_STS4_PGOOD_LDO5	BIT(0)
> +#define TPS65912_INT_STS4_PGOOD_LDO6	BIT(1)
> +#define TPS65912_INT_STS4_PGOOD_LDO7	BIT(2)
> +#define TPS65912_INT_STS4_PGOOD_LDO8	BIT(3)
> +#define TPS65912_INT_STS4_PGOOD_LDO9	BIT(4)
> +#define TPS65912_INT_STS4_PGOOD_LDO10	BIT(5)
> +
> +/* GPIO 1 and 2 Register field definitions */
> +#define GPIO_SLEEP_MASK			0x80
> +#define GPIO_SLEEP_SHIFT		7
> +#define GPIO_DEB_MASK			0x10
> +#define GPIO_DEB_SHIFT			4
> +#define GPIO_CFG_MASK			0x04
> +#define GPIO_CFG_SHIFT			2
> +#define GPIO_STS_MASK			0x02
> +#define GPIO_STS_SHIFT			1
> +#define GPIO_SET_MASK			0x01
> +#define GPIO_SET_SHIFT			0
> +
> +/* GPIO 3 Register field definitions */
> +#define GPIO3_SLEEP_MASK		0x80
> +#define GPIO3_SLEEP_SHIFT		7
> +#define GPIO3_SEL_MASK			0x40
> +#define GPIO3_SEL_SHIFT			6
> +#define GPIO3_ODEN_MASK			0x20
> +#define GPIO3_ODEN_SHIFT		5
> +#define GPIO3_DEB_MASK			0x10
> +#define GPIO3_DEB_SHIFT			4
> +#define GPIO3_PDEN_MASK			0x08
> +#define GPIO3_PDEN_SHIFT		3
> +#define GPIO3_CFG_MASK			0x04
> +#define GPIO3_CFG_SHIFT			2
> +#define GPIO3_STS_MASK			0x02
> +#define GPIO3_STS_SHIFT			1
> +#define GPIO3_SET_MASK			0x01
> +#define GPIO3_SET_SHIFT			0
> +
> +/* GPIO 4 Register field definitions */
> +#define GPIO4_SLEEP_MASK		0x80
> +#define GPIO4_SLEEP_SHIFT		7
> +#define GPIO4_SEL_MASK			0x40
> +#define GPIO4_SEL_SHIFT			6
> +#define GPIO4_ODEN_MASK			0x20
> +#define GPIO4_ODEN_SHIFT		5
> +#define GPIO4_DEB_MASK			0x10
> +#define GPIO4_DEB_SHIFT			4
> +#define GPIO4_PDEN_MASK			0x08
> +#define GPIO4_PDEN_SHIFT		3
> +#define GPIO4_CFG_MASK			0x04
> +#define GPIO4_CFG_SHIFT			2
> +#define GPIO4_STS_MASK			0x02
> +#define GPIO4_STS_SHIFT			1
> +#define GPIO4_SET_MASK			0x01
> +#define GPIO4_SET_SHIFT			0
> +
> +/* Register THERM  (0x80) register.RegisterDescription */
> +#define THERM_THERM_HD_MASK		0x20
> +#define THERM_THERM_HD_SHIFT		5
> +#define THERM_THERM_TS_MASK		0x10
> +#define THERM_THERM_TS_SHIFT		4
> +#define THERM_THERM_HDSEL_MASK		0x0C
> +#define THERM_THERM_HDSEL_SHIFT		2
> +#define THERM_RSVD1_MASK		0x02
> +#define THERM_RSVD1_SHIFT		1
> +#define THERM_THERM_STATE_MASK		0x01
> +#define THERM_THERM_STATE_SHIFT		0
> +
> +/* Register DCDCCTRL1 register.RegisterDescription */
> +#define DCDCCTRL_VCON_ENABLE_MASK	0x80
> +#define DCDCCTRL_VCON_ENABLE_SHIFT	7
> +#define DCDCCTRL_VCON_RANGE1_MASK	0x40
> +#define DCDCCTRL_VCON_RANGE1_SHIFT	6
> +#define DCDCCTRL_VCON_RANGE0_MASK	0x20
> +#define DCDCCTRL_VCON_RANGE0_SHIFT	5
> +#define DCDCCTRL_TSTEP2_MASK		0x10
> +#define DCDCCTRL_TSTEP2_SHIFT		4
> +#define DCDCCTRL_TSTEP1_MASK		0x08
> +#define DCDCCTRL_TSTEP1_SHIFT		3
> +#define DCDCCTRL_TSTEP0_MASK		0x04
> +#define DCDCCTRL_TSTEP0_SHIFT		2
> +#define DCDCCTRL_DCDC1_MODE_MASK	0x02
> +#define DCDCCTRL_DCDC1_MODE_SHIFT	1
> +
> +/* Register DCDCCTRL2 and DCDCCTRL3 register.RegisterDescription */
> +#define DCDCCTRL_TSTEP2_MASK		0x10
> +#define DCDCCTRL_TSTEP2_SHIFT		4
> +#define DCDCCTRL_TSTEP1_MASK		0x08
> +#define DCDCCTRL_TSTEP1_SHIFT		3
> +#define DCDCCTRL_TSTEP0_MASK		0x04
> +#define DCDCCTRL_TSTEP0_SHIFT		2
> +#define DCDCCTRL_DCDC_MODE_MASK		0x02
> +#define DCDCCTRL_DCDC_MODE_SHIFT	1
> +#define DCDCCTRL_RSVD0_MASK		0x01
> +#define DCDCCTRL_RSVD0_SHIFT		0
> +
> +/* Register DCDCCTRL4 register.RegisterDescription */
> +#define DCDCCTRL_RAMP_TIME_MASK		0x01
> +#define DCDCCTRL_RAMP_TIME_SHIFT	0
> +
> +/* Register DCDCx_AVS */
> +#define DCDC_AVS_ENABLE_MASK		0x80
> +#define DCDC_AVS_ENABLE_SHIFT		7
> +#define DCDC_AVS_ECO_MASK		0x40
> +#define DCDC_AVS_ECO_SHIFT		6
> +
> +/* Register DCDCx_LIMIT */
> +#define DCDC_LIMIT_RANGE_MASK		0xC0
> +#define DCDC_LIMIT_RANGE_SHIFT		6
> +#define DCDC_LIMIT_MAX_SEL_MASK		0x3F
> +#define DCDC_LIMIT_MAX_SEL_SHIFT	0
> +
> +/* Define the TPS65912 IRQ numbers */
> +enum tps65912_irqs {
> +	/* INT_STS registers */
> +	TPS65912_IRQ_PWRHOLD_F,
> +	TPS65912_IRQ_VMON,
> +	TPS65912_IRQ_PWRON,
> +	TPS65912_IRQ_PWRON_LP,
> +	TPS65912_IRQ_PWRHOLD_R,
> +	TPS65912_IRQ_HOTDIE,
> +	TPS65912_IRQ_GPIO1_R,
> +	TPS65912_IRQ_GPIO1_F,
> +	/* INT_STS2 registers */
> +	TPS65912_IRQ_GPIO2_R,
> +	TPS65912_IRQ_GPIO2_F,
> +	TPS65912_IRQ_GPIO3_R,
> +	TPS65912_IRQ_GPIO3_F,
> +	TPS65912_IRQ_GPIO4_R,
> +	TPS65912_IRQ_GPIO4_F,
> +	TPS65912_IRQ_GPIO5_R,
> +	TPS65912_IRQ_GPIO5_F,
> +	/* INT_STS3 registers */
> +	TPS65912_IRQ_PGOOD_DCDC1,
> +	TPS65912_IRQ_PGOOD_DCDC2,
> +	TPS65912_IRQ_PGOOD_DCDC3,
> +	TPS65912_IRQ_PGOOD_DCDC4,
> +	TPS65912_IRQ_PGOOD_LDO1,
> +	TPS65912_IRQ_PGOOD_LDO2,
> +	TPS65912_IRQ_PGOOD_LDO3,
> +	TPS65912_IRQ_PGOOD_LDO4,
> +	/* INT_STS4 registers */
> +	TPS65912_IRQ_PGOOD_LDO5,
> +	TPS65912_IRQ_PGOOD_LDO6,
> +	TPS65912_IRQ_PGOOD_LDO7,
> +	TPS65912_IRQ_PGOOD_LDO8,
> +	TPS65912_IRQ_PGOOD_LDO9,
> +	TPS65912_IRQ_PGOOD_LDO10,
> +};
> +
> +/*
> + * struct tps65912 - state holder for the tps65912 driver
> + *
> + * Device data may be used to access the TPS65912 chip
> + */
> +struct tps65912 {
> +	struct device *dev;
> +	struct regmap *regmap;
> +
> +	/* IRQ Data */
> +	int irq;
> +	struct regmap_irq_chip_data *irq_data;
> +};
> +
> +static const struct regmap_range tps65912_yes_ranges[] = {
> +	regmap_reg_range(TPS65912_INT_STS, TPS65912_GPIO5),
> +};
> +
> +static const struct regmap_access_table tps65912_volatile_table = {
> +	.yes_ranges = tps65912_yes_ranges,
> +	.n_yes_ranges = ARRAY_SIZE(tps65912_yes_ranges),
> +};
> +
> +static const struct regmap_config tps65912_regmap_config = {
> +	.reg_bits = 8,
> +	.val_bits = 8,
> +	.cache_type = REGCACHE_RBTREE,
> +	.volatile_table = &tps65912_volatile_table,
> +};
> +
> +int tps65912_device_init(struct tps65912 *tps);
> +int tps65912_device_exit(struct tps65912 *tps);
> +
> +#endif /*  __LINUX_MFD_TPS65912_H */

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

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

* Re: [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC
  2015-10-05  9:24   ` Lee Jones
@ 2015-10-05  9:27     ` Lee Jones
  2015-10-12 15:06       ` Andrew F. Davis
  0 siblings, 1 reply; 44+ messages in thread
From: Lee Jones @ 2015-10-05  9:27 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Mark Brown, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On Mon, 05 Oct 2015, Lee Jones wrote:

> On Thu, 01 Oct 2015, Andrew F. Davis wrote:
> 
> > This patch adds support for TPS65912 mfd device. It provides
> > communication through the I2C and SPI interfaces. It contains
> > the following components:
> > 
> >  - Regulators
> >  - GPIO controller
> > 
> > Signed-off-by: Andrew F. Davis <afd@ti.com>
> > ---
> >  drivers/mfd/Kconfig          |  25 ++++
> >  drivers/mfd/Makefile         |   3 +
> >  drivers/mfd/tps65912-core.c  | 108 ++++++++++++++
> >  drivers/mfd/tps65912-i2c.c   |  82 ++++++++++
> >  drivers/mfd/tps65912-spi.c   |  81 ++++++++++
> >  include/linux/mfd/tps65912.h | 345 +++++++++++++++++++++++++++++++++++++++++++
> >  6 files changed, 644 insertions(+)
> >  create mode 100644 drivers/mfd/tps65912-core.c
> >  create mode 100644 drivers/mfd/tps65912-i2c.c
> >  create mode 100644 drivers/mfd/tps65912-spi.c
> >  create mode 100644 include/linux/mfd/tps65912.h
> 
> Applied, thanks.

Whoops, I forgot about the removal patch.

For this patch:
  Acked-by: Lee Jones <lee.jones@linaro.org>

Can you break up the removal patch into subsystems as well?

> > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > index 9a8df8e..02b321f 100644
> > --- a/drivers/mfd/Kconfig
> > +++ b/drivers/mfd/Kconfig
> > @@ -1167,6 +1167,31 @@ config MFD_TPS65910
> >  	  if you say yes here you get support for the TPS65910 series of
> >  	  Power Management chips.
> >  
> > +config MFD_TPS65912
> > +	tristate
> > +	select REGMAP
> > +	select REGMAP_IRQ
> > +
> > +config MFD_TPS65912_I2C
> > +	tristate "TI TPS65912 Power Management chip with I2C"
> > +	select MFD_TPS65912
> > +	select REGMAP_I2C
> > +	depends on I2C
> > +	depends on OF || COMPILE_TEST
> > +	help
> > +	  If you say yes here you get support for the TPS65912 series of
> > +	  PM chips with I2C interface.
> > +
> > +config MFD_TPS65912_SPI
> > +	tristate "TI TPS65912 Power Management chip with SPI"
> > +	select MFD_TPS65912
> > +	select REGMAP_SPI
> > +	depends on SPI_MASTER
> > +	depends on OF || COMPILE_TEST
> > +	help
> > +	  If you say yes here you get support for the TPS65912 series of
> > +	  PM chips with SPI interface.
> > +
> >  config MFD_TPS80031
> >  	bool "TI TPS80031/TPS80032 Power Management chips"
> >  	depends on I2C=y
> > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> > index 004aa76..49c3530 100644
> > --- a/drivers/mfd/Makefile
> > +++ b/drivers/mfd/Makefile
> > @@ -69,6 +69,9 @@ obj-$(CONFIG_TPS6507X)		+= tps6507x.o
> >  obj-$(CONFIG_MFD_TPS65217)	+= tps65217.o
> >  obj-$(CONFIG_MFD_TPS65218)	+= tps65218.o
> >  obj-$(CONFIG_MFD_TPS65910)	+= tps65910.o
> > +obj-$(CONFIG_MFD_TPS65912)	+= tps65912-core.o
> > +obj-$(CONFIG_MFD_TPS65912_I2C)	+= tps65912-i2c.o
> > +obj-$(CONFIG_MFD_TPS65912_SPI)  += tps65912-spi.o
> >  obj-$(CONFIG_MFD_TPS80031)	+= tps80031.o
> >  obj-$(CONFIG_MENELAUS)		+= menelaus.o
> >  
> > diff --git a/drivers/mfd/tps65912-core.c b/drivers/mfd/tps65912-core.c
> > new file mode 100644
> > index 0000000..e787950
> > --- /dev/null
> > +++ b/drivers/mfd/tps65912-core.c
> > @@ -0,0 +1,108 @@
> > +/*
> > + * Core functions for TI TPS65912x PMIC
> > + *
> > + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
> > + *
> > + * Author: Andrew F. Davis <afd@ti.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.
> > + *
> > + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> > + * kind, whether expressed or implied; without even the implied warranty
> > + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > + * GNU General Public License version 2 for more details.
> > + *
> > + * Based on the TPS65218 driver and the previous TPS65912 driver by
> > + * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> > + */
> > +
> > +#include <linux/interrupt.h>
> > +#include <linux/module.h>
> > +#include <linux/of_device.h>
> > +
> > +#include <linux/mfd/tps65912.h>
> > +
> > +static const struct regmap_irq tps65912_irqs[] = {
> > +	/* INT_STS IRQs */
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_F, 0, TPS65912_INT_STS_PWRHOLD_F),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_VMON, 0, TPS65912_INT_STS_VMON),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PWRON, 0, TPS65912_INT_STS_PWRON),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PWRON_LP, 0, TPS65912_INT_STS_PWRON_LP),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_R, 0, TPS65912_INT_STS_PWRHOLD_R),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_HOTDIE, 0, TPS65912_INT_STS_HOTDIE),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_R, 0, TPS65912_INT_STS_GPIO1_R),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_F, 0, TPS65912_INT_STS_GPIO1_F),
> > +	/* INT_STS2 IRQs */
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO2_R, 1, TPS65912_INT_STS2_GPIO2_R),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO2_F, 1, TPS65912_INT_STS2_GPIO2_F),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO3_R, 1, TPS65912_INT_STS2_GPIO3_R),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO3_F, 1, TPS65912_INT_STS2_GPIO3_F),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO4_R, 1, TPS65912_INT_STS2_GPIO4_R),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO4_F, 1, TPS65912_INT_STS2_GPIO4_F),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO5_R, 1, TPS65912_INT_STS2_GPIO5_R),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO5_F, 1, TPS65912_INT_STS2_GPIO5_F),
> > +	/* INT_STS3 IRQs */
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC1, 2, TPS65912_INT_STS3_PGOOD_DCDC1),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC2, 2, TPS65912_INT_STS3_PGOOD_DCDC2),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC3, 2, TPS65912_INT_STS3_PGOOD_DCDC3),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC4, 2, TPS65912_INT_STS3_PGOOD_DCDC4),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO1, 2, TPS65912_INT_STS3_PGOOD_LDO1),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO2, 2, TPS65912_INT_STS3_PGOOD_LDO2),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO3, 2, TPS65912_INT_STS3_PGOOD_LDO3),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO4, 2, TPS65912_INT_STS3_PGOOD_LDO4),
> > +	/* INT_STS4 IRQs */
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO5, 3, TPS65912_INT_STS4_PGOOD_LDO5),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO6, 3, TPS65912_INT_STS4_PGOOD_LDO6),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO7, 3, TPS65912_INT_STS4_PGOOD_LDO7),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO8, 3, TPS65912_INT_STS4_PGOOD_LDO8),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO9, 3, TPS65912_INT_STS4_PGOOD_LDO9),
> > +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO10, 3, TPS65912_INT_STS4_PGOOD_LDO10),
> > +};
> > +
> > +static struct regmap_irq_chip tps65912_irq_chip = {
> > +	.name = "tps65912",
> > +	.irqs = tps65912_irqs,
> > +	.num_irqs = ARRAY_SIZE(tps65912_irqs),
> > +	.num_regs = 4,
> > +	.irq_reg_stride = 2,
> > +	.mask_base = TPS65912_INT_MSK,
> > +	.status_base = TPS65912_INT_STS,
> > +	.ack_base = TPS65912_INT_STS,
> > +	.init_ack_masked = true,
> > +};
> > +
> > +int tps65912_device_init(struct tps65912 *tps)
> > +{
> > +	int ret;
> > +
> > +	ret = regmap_add_irq_chip(tps->regmap, tps->irq, IRQF_ONESHOT, 0,
> > +				  &tps65912_irq_chip, &tps->irq_data);
> > +	if (ret < 0)
> > +		return ret;
> > +
> > +	ret = of_platform_populate(tps->dev->of_node, NULL, NULL, tps->dev);
> > +	if (ret < 0)
> > +		goto err_irq;
> > +
> > +	return 0;
> > +
> > +err_irq:
> > +	regmap_del_irq_chip(tps->irq, tps->irq_data);
> > +
> > +	return ret;
> > +}
> > +EXPORT_SYMBOL_GPL(tps65912_device_init);
> > +
> > +int tps65912_device_exit(struct tps65912 *tps)
> > +{
> > +	regmap_del_irq_chip(tps->irq, tps->irq_data);
> > +
> > +	return 0;
> > +}
> > +EXPORT_SYMBOL_GPL(tps65912_device_exit);
> > +
> > +MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
> > +MODULE_DESCRIPTION("TPS65912x MFD Driver");
> > +MODULE_LICENSE("GPL v2");
> > diff --git a/drivers/mfd/tps65912-i2c.c b/drivers/mfd/tps65912-i2c.c
> > new file mode 100644
> > index 0000000..bdae10b01
> > --- /dev/null
> > +++ b/drivers/mfd/tps65912-i2c.c
> > @@ -0,0 +1,82 @@
> > +/*
> > + * I2C access driver for TI TPS65912x PMIC
> > + *
> > + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
> > + *
> > + * Author: Andrew F. Davis <afd@ti.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.
> > + *
> > + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> > + * kind, whether expressed or implied; without even the implied warranty
> > + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > + * GNU General Public License version 2 for more details.
> > + *
> > + * Based on the TPS65218 driver and the previous TPS65912 driver by
> > + * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> > + */
> > +
> > +#include <linux/i2c.h>
> > +#include <linux/module.h>
> > +#include <linux/of_device.h>
> > +#include <linux/regmap.h>
> > +
> > +#include <linux/mfd/tps65912.h>
> > +
> > +static const struct of_device_id tps65912_i2c_of_match_table[] = {
> > +	{ .compatible = "ti,tps65912", },
> > +	{ /* sentinel */ }
> > +};
> > +
> > +static int tps65912_i2c_probe(struct i2c_client *client,
> > +			      const struct i2c_device_id *ids)
> > +{
> > +	struct tps65912 *tps;
> > +
> > +	tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
> > +	if (!tps)
> > +		return -ENOMEM;
> > +
> > +	i2c_set_clientdata(client, tps);
> > +	tps->dev = &client->dev;
> > +	tps->irq = client->irq;
> > +
> > +	tps->regmap = devm_regmap_init_i2c(client, &tps65912_regmap_config);
> > +	if (IS_ERR(tps->regmap)) {
> > +		dev_err(tps->dev, "Failed to initialize register map\n");
> > +		return PTR_ERR(tps->regmap);
> > +	}
> > +
> > +	return tps65912_device_init(tps);
> > +}
> > +
> > +static int tps65912_i2c_remove(struct i2c_client *client)
> > +{
> > +	struct tps65912 *tps = i2c_get_clientdata(client);
> > +
> > +	return tps65912_device_exit(tps);
> > +}
> > +
> > +static const struct i2c_device_id tps65912_i2c_id_table[] = {
> > +	{ "tps65912", 0 },
> > +	{ /* sentinel */ },
> > +};
> > +MODULE_DEVICE_TABLE(i2c, tps65912_i2c_id_table);
> > +
> > +static struct i2c_driver tps65912_i2c_driver = {
> > +	.driver		= {
> > +		.name	= "tps65912",
> > +		.of_match_table = tps65912_i2c_of_match_table,
> > +	},
> > +	.probe		= tps65912_i2c_probe,
> > +	.remove		= tps65912_i2c_remove,
> > +	.id_table       = tps65912_i2c_id_table,
> > +};
> > +
> > +module_i2c_driver(tps65912_i2c_driver);
> > +
> > +MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
> > +MODULE_DESCRIPTION("TPS65912x I2C Interface Driver");
> > +MODULE_LICENSE("GPL v2");
> > diff --git a/drivers/mfd/tps65912-spi.c b/drivers/mfd/tps65912-spi.c
> > new file mode 100644
> > index 0000000..24c5c97
> > --- /dev/null
> > +++ b/drivers/mfd/tps65912-spi.c
> > @@ -0,0 +1,81 @@
> > +/*
> > + * SPI access driver for TI TPS65912x PMIC
> > + *
> > + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
> > + *
> > + * Author: Andrew F. Davis <afd@ti.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.
> > + *
> > + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> > + * kind, whether expressed or implied; without even the implied warranty
> > + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > + * GNU General Public License version 2 for more details.
> > + *
> > + * Based on the TPS65218 driver and the previous TPS65912 driver by
> > + * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> > + */
> > +
> > +#include <linux/module.h>
> > +#include <linux/of_device.h>
> > +#include <linux/regmap.h>
> > +#include <linux/spi/spi.h>
> > +
> > +#include <linux/mfd/tps65912.h>
> > +
> > +static const struct of_device_id tps65912_spi_of_match_table[] = {
> > +	{ .compatible = "ti,tps65912", },
> > +	{ /* sentinel */ }
> > +};
> > +
> > +static int tps65912_spi_probe(struct spi_device *spi)
> > +{
> > +	struct tps65912 *tps;
> > +
> > +	tps = devm_kzalloc(&spi->dev, sizeof(*tps), GFP_KERNEL);
> > +	if (!tps)
> > +		return -ENOMEM;
> > +
> > +	spi_set_drvdata(spi, tps);
> > +	tps->dev = &spi->dev;
> > +	tps->irq = spi->irq;
> > +
> > +	tps->regmap = devm_regmap_init_spi(spi, &tps65912_regmap_config);
> > +	if (IS_ERR(tps->regmap)) {
> > +		dev_err(tps->dev, "Failed to initialize register map\n");
> > +		return PTR_ERR(tps->regmap);
> > +	}
> > +
> > +	return tps65912_device_init(tps);
> > +}
> > +
> > +static int tps65912_spi_remove(struct spi_device *client)
> > +{
> > +	struct tps65912 *tps = spi_get_drvdata(client);
> > +
> > +	return tps65912_device_exit(tps);
> > +}
> > +
> > +static const struct spi_device_id tps65912_spi_id_table[] = {
> > +	{ "tps65912", 0 },
> > +	{ /* sentinel */ },
> > +};
> > +MODULE_DEVICE_TABLE(spi, tps65912_spi_id_table);
> > +
> > +static struct spi_driver tps65912_spi_driver = {
> > +	.driver		= {
> > +		.name	= "tps65912",
> > +		.of_match_table = tps65912_spi_of_match_table,
> > +	},
> > +	.probe		= tps65912_spi_probe,
> > +	.remove		= tps65912_spi_remove,
> > +	.id_table       = tps65912_spi_id_table,
> > +};
> > +
> > +module_spi_driver(tps65912_spi_driver);
> > +
> > +MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
> > +MODULE_DESCRIPTION("TPS65912x SPI Interface Driver");
> > +MODULE_LICENSE("GPL v2");
> > diff --git a/include/linux/mfd/tps65912.h b/include/linux/mfd/tps65912.h
> > new file mode 100644
> > index 0000000..8843c0d
> > --- /dev/null
> > +++ b/include/linux/mfd/tps65912.h
> > @@ -0,0 +1,345 @@
> > +/*
> > + * TI TPS65912x
> > + *
> > + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
> > + *
> > + * Author: Andrew F. Davis <afd@ti.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.
> > + *
> > + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> > + * kind, whether expressed or implied; without even the implied warranty
> > + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > + * GNU General Public License version 2 for more details.
> > + *
> > + * Based on the TPS65218 driver and the previous TPS65912 driver by
> > + * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> > + */
> > +
> > +#ifndef __LINUX_MFD_TPS65912_H
> > +#define __LINUX_MFD_TPS65912_H
> > +
> > +#include <linux/device.h>
> > +#include <linux/regmap.h>
> > +#include <linux/regulator/driver.h>
> > +
> > +/* List of registers for TPS65912 */
> > +#define TPS65912_DCDC1_CTRL		0x00
> > +#define TPS65912_DCDC2_CTRL		0x01
> > +#define TPS65912_DCDC3_CTRL		0x02
> > +#define TPS65912_DCDC4_CTRL		0x03
> > +#define TPS65912_DCDC1_OP		0x04
> > +#define TPS65912_DCDC1_AVS		0x05
> > +#define TPS65912_DCDC1_LIMIT		0x06
> > +#define TPS65912_DCDC2_OP		0x07
> > +#define TPS65912_DCDC2_AVS		0x08
> > +#define TPS65912_DCDC2_LIMIT		0x09
> > +#define TPS65912_DCDC3_OP		0x0A
> > +#define TPS65912_DCDC3_AVS		0x0B
> > +#define TPS65912_DCDC3_LIMIT		0x0C
> > +#define TPS65912_DCDC4_OP		0x0D
> > +#define TPS65912_DCDC4_AVS		0x0E
> > +#define TPS65912_DCDC4_LIMIT		0x0F
> > +#define TPS65912_LDO1_OP		0x10
> > +#define TPS65912_LDO1_AVS		0x11
> > +#define TPS65912_LDO1_LIMIT		0x12
> > +#define TPS65912_LDO2_OP		0x13
> > +#define TPS65912_LDO2_AVS		0x14
> > +#define TPS65912_LDO2_LIMIT		0x15
> > +#define TPS65912_LDO3_OP		0x16
> > +#define TPS65912_LDO3_AVS		0x17
> > +#define TPS65912_LDO3_LIMIT		0x18
> > +#define TPS65912_LDO4_OP		0x19
> > +#define TPS65912_LDO4_AVS		0x1A
> > +#define TPS65912_LDO4_LIMIT		0x1B
> > +#define TPS65912_LDO5			0x1C
> > +#define TPS65912_LDO6			0x1D
> > +#define TPS65912_LDO7			0x1E
> > +#define TPS65912_LDO8			0x1F
> > +#define TPS65912_LDO9			0x20
> > +#define TPS65912_LDO10			0x21
> > +#define TPS65912_THRM			0x22
> > +#define TPS65912_CLK32OUT		0x23
> > +#define TPS65912_DEVCTRL		0x24
> > +#define TPS65912_DEVCTRL2		0x25
> > +#define TPS65912_I2C_SPI_CFG		0x26
> > +#define TPS65912_KEEP_ON		0x27
> > +#define TPS65912_KEEP_ON2		0x28
> > +#define TPS65912_SET_OFF1		0x29
> > +#define TPS65912_SET_OFF2		0x2A
> > +#define TPS65912_DEF_VOLT		0x2B
> > +#define TPS65912_DEF_VOLT_MAPPING	0x2C
> > +#define TPS65912_DISCHARGE		0x2D
> > +#define TPS65912_DISCHARGE2		0x2E
> > +#define TPS65912_EN1_SET1		0x2F
> > +#define TPS65912_EN1_SET2		0x30
> > +#define TPS65912_EN2_SET1		0x31
> > +#define TPS65912_EN2_SET2		0x32
> > +#define TPS65912_EN3_SET1		0x33
> > +#define TPS65912_EN3_SET2		0x34
> > +#define TPS65912_EN4_SET1		0x35
> > +#define TPS65912_EN4_SET2		0x36
> > +#define TPS65912_PGOOD			0x37
> > +#define TPS65912_PGOOD2			0x38
> > +#define TPS65912_INT_STS		0x39
> > +#define TPS65912_INT_MSK		0x3A
> > +#define TPS65912_INT_STS2		0x3B
> > +#define TPS65912_INT_MSK2		0x3C
> > +#define TPS65912_INT_STS3		0x3D
> > +#define TPS65912_INT_MSK3		0x3E
> > +#define TPS65912_INT_STS4		0x3F
> > +#define TPS65912_INT_MSK4		0x40
> > +#define TPS65912_GPIO1			0x41
> > +#define TPS65912_GPIO2			0x42
> > +#define TPS65912_GPIO3			0x43
> > +#define TPS65912_GPIO4			0x44
> > +#define TPS65912_GPIO5			0x45
> > +#define TPS65912_VMON			0x46
> > +#define TPS65912_LEDA_CTRL1		0x47
> > +#define TPS65912_LEDA_CTRL2		0x48
> > +#define TPS65912_LEDA_CTRL3		0x49
> > +#define TPS65912_LEDA_CTRL4		0x4A
> > +#define TPS65912_LEDA_CTRL5		0x4B
> > +#define TPS65912_LEDA_CTRL6		0x4C
> > +#define TPS65912_LEDA_CTRL7		0x4D
> > +#define TPS65912_LEDA_CTRL8		0x4E
> > +#define TPS65912_LEDB_CTRL1		0x4F
> > +#define TPS65912_LEDB_CTRL2		0x50
> > +#define TPS65912_LEDB_CTRL3		0x51
> > +#define TPS65912_LEDB_CTRL4		0x52
> > +#define TPS65912_LEDB_CTRL5		0x53
> > +#define TPS65912_LEDB_CTRL6		0x54
> > +#define TPS65912_LEDB_CTRL7		0x55
> > +#define TPS65912_LEDB_CTRL8		0x56
> > +#define TPS65912_LEDC_CTRL1		0x57
> > +#define TPS65912_LEDC_CTRL2		0x58
> > +#define TPS65912_LEDC_CTRL3		0x59
> > +#define TPS65912_LEDC_CTRL4		0x5A
> > +#define TPS65912_LEDC_CTRL5		0x5B
> > +#define TPS65912_LEDC_CTRL6		0x5C
> > +#define TPS65912_LEDC_CTRL7		0x5D
> > +#define TPS65912_LEDC_CTRL8		0x5E
> > +#define TPS65912_LED_RAMP_UP_TIME	0x5F
> > +#define TPS65912_LED_RAMP_DOWN_TIME	0x60
> > +#define TPS65912_LED_SEQ_EN		0x61
> > +#define TPS65912_LOADSWITCH		0x62
> > +#define TPS65912_SPARE			0x63
> > +#define TPS65912_VERNUM			0x64
> > +#define TPS6591X_MAX_REGISTER		0x64
> > +
> > +/* INT_STS Register field definitions */
> > +#define TPS65912_INT_STS_PWRHOLD_F	BIT(0)
> > +#define TPS65912_INT_STS_VMON		BIT(1)
> > +#define TPS65912_INT_STS_PWRON		BIT(2)
> > +#define TPS65912_INT_STS_PWRON_LP	BIT(3)
> > +#define TPS65912_INT_STS_PWRHOLD_R	BIT(4)
> > +#define TPS65912_INT_STS_HOTDIE		BIT(5)
> > +#define TPS65912_INT_STS_GPIO1_R	BIT(6)
> > +#define TPS65912_INT_STS_GPIO1_F	BIT(7)
> > +
> > +/* INT_STS Register field definitions */
> > +#define TPS65912_INT_STS2_GPIO2_R	BIT(0)
> > +#define TPS65912_INT_STS2_GPIO2_F	BIT(1)
> > +#define TPS65912_INT_STS2_GPIO3_R	BIT(2)
> > +#define TPS65912_INT_STS2_GPIO3_F	BIT(3)
> > +#define TPS65912_INT_STS2_GPIO4_R	BIT(4)
> > +#define TPS65912_INT_STS2_GPIO4_F	BIT(5)
> > +#define TPS65912_INT_STS2_GPIO5_R	BIT(6)
> > +#define TPS65912_INT_STS2_GPIO5_F	BIT(7)
> > +
> > +/* INT_STS Register field definitions */
> > +#define TPS65912_INT_STS3_PGOOD_DCDC1	BIT(0)
> > +#define TPS65912_INT_STS3_PGOOD_DCDC2	BIT(1)
> > +#define TPS65912_INT_STS3_PGOOD_DCDC3	BIT(2)
> > +#define TPS65912_INT_STS3_PGOOD_DCDC4	BIT(3)
> > +#define TPS65912_INT_STS3_PGOOD_LDO1	BIT(4)
> > +#define TPS65912_INT_STS3_PGOOD_LDO2	BIT(5)
> > +#define TPS65912_INT_STS3_PGOOD_LDO3	BIT(6)
> > +#define TPS65912_INT_STS3_PGOOD_LDO4	BIT(7)
> > +
> > +/* INT_STS Register field definitions */
> > +#define TPS65912_INT_STS4_PGOOD_LDO5	BIT(0)
> > +#define TPS65912_INT_STS4_PGOOD_LDO6	BIT(1)
> > +#define TPS65912_INT_STS4_PGOOD_LDO7	BIT(2)
> > +#define TPS65912_INT_STS4_PGOOD_LDO8	BIT(3)
> > +#define TPS65912_INT_STS4_PGOOD_LDO9	BIT(4)
> > +#define TPS65912_INT_STS4_PGOOD_LDO10	BIT(5)
> > +
> > +/* GPIO 1 and 2 Register field definitions */
> > +#define GPIO_SLEEP_MASK			0x80
> > +#define GPIO_SLEEP_SHIFT		7
> > +#define GPIO_DEB_MASK			0x10
> > +#define GPIO_DEB_SHIFT			4
> > +#define GPIO_CFG_MASK			0x04
> > +#define GPIO_CFG_SHIFT			2
> > +#define GPIO_STS_MASK			0x02
> > +#define GPIO_STS_SHIFT			1
> > +#define GPIO_SET_MASK			0x01
> > +#define GPIO_SET_SHIFT			0
> > +
> > +/* GPIO 3 Register field definitions */
> > +#define GPIO3_SLEEP_MASK		0x80
> > +#define GPIO3_SLEEP_SHIFT		7
> > +#define GPIO3_SEL_MASK			0x40
> > +#define GPIO3_SEL_SHIFT			6
> > +#define GPIO3_ODEN_MASK			0x20
> > +#define GPIO3_ODEN_SHIFT		5
> > +#define GPIO3_DEB_MASK			0x10
> > +#define GPIO3_DEB_SHIFT			4
> > +#define GPIO3_PDEN_MASK			0x08
> > +#define GPIO3_PDEN_SHIFT		3
> > +#define GPIO3_CFG_MASK			0x04
> > +#define GPIO3_CFG_SHIFT			2
> > +#define GPIO3_STS_MASK			0x02
> > +#define GPIO3_STS_SHIFT			1
> > +#define GPIO3_SET_MASK			0x01
> > +#define GPIO3_SET_SHIFT			0
> > +
> > +/* GPIO 4 Register field definitions */
> > +#define GPIO4_SLEEP_MASK		0x80
> > +#define GPIO4_SLEEP_SHIFT		7
> > +#define GPIO4_SEL_MASK			0x40
> > +#define GPIO4_SEL_SHIFT			6
> > +#define GPIO4_ODEN_MASK			0x20
> > +#define GPIO4_ODEN_SHIFT		5
> > +#define GPIO4_DEB_MASK			0x10
> > +#define GPIO4_DEB_SHIFT			4
> > +#define GPIO4_PDEN_MASK			0x08
> > +#define GPIO4_PDEN_SHIFT		3
> > +#define GPIO4_CFG_MASK			0x04
> > +#define GPIO4_CFG_SHIFT			2
> > +#define GPIO4_STS_MASK			0x02
> > +#define GPIO4_STS_SHIFT			1
> > +#define GPIO4_SET_MASK			0x01
> > +#define GPIO4_SET_SHIFT			0
> > +
> > +/* Register THERM  (0x80) register.RegisterDescription */
> > +#define THERM_THERM_HD_MASK		0x20
> > +#define THERM_THERM_HD_SHIFT		5
> > +#define THERM_THERM_TS_MASK		0x10
> > +#define THERM_THERM_TS_SHIFT		4
> > +#define THERM_THERM_HDSEL_MASK		0x0C
> > +#define THERM_THERM_HDSEL_SHIFT		2
> > +#define THERM_RSVD1_MASK		0x02
> > +#define THERM_RSVD1_SHIFT		1
> > +#define THERM_THERM_STATE_MASK		0x01
> > +#define THERM_THERM_STATE_SHIFT		0
> > +
> > +/* Register DCDCCTRL1 register.RegisterDescription */
> > +#define DCDCCTRL_VCON_ENABLE_MASK	0x80
> > +#define DCDCCTRL_VCON_ENABLE_SHIFT	7
> > +#define DCDCCTRL_VCON_RANGE1_MASK	0x40
> > +#define DCDCCTRL_VCON_RANGE1_SHIFT	6
> > +#define DCDCCTRL_VCON_RANGE0_MASK	0x20
> > +#define DCDCCTRL_VCON_RANGE0_SHIFT	5
> > +#define DCDCCTRL_TSTEP2_MASK		0x10
> > +#define DCDCCTRL_TSTEP2_SHIFT		4
> > +#define DCDCCTRL_TSTEP1_MASK		0x08
> > +#define DCDCCTRL_TSTEP1_SHIFT		3
> > +#define DCDCCTRL_TSTEP0_MASK		0x04
> > +#define DCDCCTRL_TSTEP0_SHIFT		2
> > +#define DCDCCTRL_DCDC1_MODE_MASK	0x02
> > +#define DCDCCTRL_DCDC1_MODE_SHIFT	1
> > +
> > +/* Register DCDCCTRL2 and DCDCCTRL3 register.RegisterDescription */
> > +#define DCDCCTRL_TSTEP2_MASK		0x10
> > +#define DCDCCTRL_TSTEP2_SHIFT		4
> > +#define DCDCCTRL_TSTEP1_MASK		0x08
> > +#define DCDCCTRL_TSTEP1_SHIFT		3
> > +#define DCDCCTRL_TSTEP0_MASK		0x04
> > +#define DCDCCTRL_TSTEP0_SHIFT		2
> > +#define DCDCCTRL_DCDC_MODE_MASK		0x02
> > +#define DCDCCTRL_DCDC_MODE_SHIFT	1
> > +#define DCDCCTRL_RSVD0_MASK		0x01
> > +#define DCDCCTRL_RSVD0_SHIFT		0
> > +
> > +/* Register DCDCCTRL4 register.RegisterDescription */
> > +#define DCDCCTRL_RAMP_TIME_MASK		0x01
> > +#define DCDCCTRL_RAMP_TIME_SHIFT	0
> > +
> > +/* Register DCDCx_AVS */
> > +#define DCDC_AVS_ENABLE_MASK		0x80
> > +#define DCDC_AVS_ENABLE_SHIFT		7
> > +#define DCDC_AVS_ECO_MASK		0x40
> > +#define DCDC_AVS_ECO_SHIFT		6
> > +
> > +/* Register DCDCx_LIMIT */
> > +#define DCDC_LIMIT_RANGE_MASK		0xC0
> > +#define DCDC_LIMIT_RANGE_SHIFT		6
> > +#define DCDC_LIMIT_MAX_SEL_MASK		0x3F
> > +#define DCDC_LIMIT_MAX_SEL_SHIFT	0
> > +
> > +/* Define the TPS65912 IRQ numbers */
> > +enum tps65912_irqs {
> > +	/* INT_STS registers */
> > +	TPS65912_IRQ_PWRHOLD_F,
> > +	TPS65912_IRQ_VMON,
> > +	TPS65912_IRQ_PWRON,
> > +	TPS65912_IRQ_PWRON_LP,
> > +	TPS65912_IRQ_PWRHOLD_R,
> > +	TPS65912_IRQ_HOTDIE,
> > +	TPS65912_IRQ_GPIO1_R,
> > +	TPS65912_IRQ_GPIO1_F,
> > +	/* INT_STS2 registers */
> > +	TPS65912_IRQ_GPIO2_R,
> > +	TPS65912_IRQ_GPIO2_F,
> > +	TPS65912_IRQ_GPIO3_R,
> > +	TPS65912_IRQ_GPIO3_F,
> > +	TPS65912_IRQ_GPIO4_R,
> > +	TPS65912_IRQ_GPIO4_F,
> > +	TPS65912_IRQ_GPIO5_R,
> > +	TPS65912_IRQ_GPIO5_F,
> > +	/* INT_STS3 registers */
> > +	TPS65912_IRQ_PGOOD_DCDC1,
> > +	TPS65912_IRQ_PGOOD_DCDC2,
> > +	TPS65912_IRQ_PGOOD_DCDC3,
> > +	TPS65912_IRQ_PGOOD_DCDC4,
> > +	TPS65912_IRQ_PGOOD_LDO1,
> > +	TPS65912_IRQ_PGOOD_LDO2,
> > +	TPS65912_IRQ_PGOOD_LDO3,
> > +	TPS65912_IRQ_PGOOD_LDO4,
> > +	/* INT_STS4 registers */
> > +	TPS65912_IRQ_PGOOD_LDO5,
> > +	TPS65912_IRQ_PGOOD_LDO6,
> > +	TPS65912_IRQ_PGOOD_LDO7,
> > +	TPS65912_IRQ_PGOOD_LDO8,
> > +	TPS65912_IRQ_PGOOD_LDO9,
> > +	TPS65912_IRQ_PGOOD_LDO10,
> > +};
> > +
> > +/*
> > + * struct tps65912 - state holder for the tps65912 driver
> > + *
> > + * Device data may be used to access the TPS65912 chip
> > + */
> > +struct tps65912 {
> > +	struct device *dev;
> > +	struct regmap *regmap;
> > +
> > +	/* IRQ Data */
> > +	int irq;
> > +	struct regmap_irq_chip_data *irq_data;
> > +};
> > +
> > +static const struct regmap_range tps65912_yes_ranges[] = {
> > +	regmap_reg_range(TPS65912_INT_STS, TPS65912_GPIO5),
> > +};
> > +
> > +static const struct regmap_access_table tps65912_volatile_table = {
> > +	.yes_ranges = tps65912_yes_ranges,
> > +	.n_yes_ranges = ARRAY_SIZE(tps65912_yes_ranges),
> > +};
> > +
> > +static const struct regmap_config tps65912_regmap_config = {
> > +	.reg_bits = 8,
> > +	.val_bits = 8,
> > +	.cache_type = REGCACHE_RBTREE,
> > +	.volatile_table = &tps65912_volatile_table,
> > +};
> > +
> > +int tps65912_device_init(struct tps65912 *tps);
> > +int tps65912_device_exit(struct tps65912 *tps);
> > +
> > +#endif /*  __LINUX_MFD_TPS65912_H */
> 

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

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

* Re: [PATCH v4 2/5] mfd: tps65912: Remove old driver in preparation for new driver
  2015-10-01 20:37 ` [PATCH v4 2/5] mfd: tps65912: Remove old driver in preparation for new driver Andrew F. Davis
@ 2015-10-05  9:28   ` Lee Jones
  2015-10-05  9:29     ` Lee Jones
  0 siblings, 1 reply; 44+ messages in thread
From: Lee Jones @ 2015-10-05  9:28 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Mark Brown, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On Thu, 01 Oct 2015, Andrew F. Davis wrote:

> The old tps65912 driver is being replaced, delete old driver.
> 
> Signed-off-by: Andrew F. Davis <afd@ti.com>

I already Acked this in v3.

Acked-by: Lee Jones <lee.jones@linaro.org>

> ---
>  drivers/gpio/Kconfig                   |   6 -
>  drivers/gpio/Makefile                  |   1 -
>  drivers/gpio/gpio-tps65912.c           | 153 ----------
>  drivers/mfd/Kconfig                    |  26 --
>  drivers/mfd/Makefile                   |   4 -
>  drivers/mfd/tps65912-core.c            | 175 -----------
>  drivers/mfd/tps65912-i2c.c             | 139 ---------
>  drivers/mfd/tps65912-irq.c             | 217 -------------
>  drivers/mfd/tps65912-spi.c             | 141 ---------
>  drivers/regulator/Kconfig              |   6 -
>  drivers/regulator/Makefile             |   1 -
>  drivers/regulator/tps65912-regulator.c | 541 ---------------------------------
>  include/linux/mfd/tps65912.h           | 328 --------------------
>  13 files changed, 1738 deletions(-)
>  delete mode 100644 drivers/gpio/gpio-tps65912.c
>  delete mode 100644 drivers/mfd/tps65912-core.c
>  delete mode 100644 drivers/mfd/tps65912-i2c.c
>  delete mode 100644 drivers/mfd/tps65912-irq.c
>  delete mode 100644 drivers/mfd/tps65912-spi.c
>  delete mode 100644 drivers/regulator/tps65912-regulator.c
>  delete mode 100644 include/linux/mfd/tps65912.h
> 
> diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
> index b4fc9e4..fb28483 100644
> --- a/drivers/gpio/Kconfig
> +++ b/drivers/gpio/Kconfig
> @@ -838,12 +838,6 @@ config GPIO_TPS65910
>  	  Select this option to enable GPIO driver for the TPS65910
>  	  chip family.
>  
> -config GPIO_TPS65912
> -	tristate "TI TPS65912 GPIO"
> -	depends on (MFD_TPS65912_I2C || MFD_TPS65912_SPI)
> -	help
> -	  This driver supports TPS65912 gpio chip
> -
>  config GPIO_TWL4030
>  	tristate "TWL4030, TWL5030, and TPS659x0 GPIOs"
>  	depends on TWL4030_CORE
> diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
> index f79a7c4..605bf89 100644
> --- a/drivers/gpio/Makefile
> +++ b/drivers/gpio/Makefile
> @@ -96,7 +96,6 @@ obj-$(CONFIG_GPIO_TIMBERDALE)	+= gpio-timberdale.o
>  obj-$(CONFIG_GPIO_PALMAS)	+= gpio-palmas.o
>  obj-$(CONFIG_GPIO_TPS6586X)	+= gpio-tps6586x.o
>  obj-$(CONFIG_GPIO_TPS65910)	+= gpio-tps65910.o
> -obj-$(CONFIG_GPIO_TPS65912)	+= gpio-tps65912.o
>  obj-$(CONFIG_GPIO_TS5500)	+= gpio-ts5500.o
>  obj-$(CONFIG_GPIO_TWL4030)	+= gpio-twl4030.o
>  obj-$(CONFIG_GPIO_TWL6040)	+= gpio-twl6040.o
> diff --git a/drivers/gpio/gpio-tps65912.c b/drivers/gpio/gpio-tps65912.c
> deleted file mode 100644
> index 9cdbc0c..0000000
> --- a/drivers/gpio/gpio-tps65912.c
> +++ /dev/null
> @@ -1,153 +0,0 @@
> -/*
> - * Copyright 2011 Texas Instruments Inc.
> - *
> - * Author: Margarita Olaya <magi@slimlogic.co.uk>
> - *
> - *  This program is free software; you can redistribute it and/or modify it
> - *  under  the terms of the GNU General  Public License as published by the
> - *  Free Software Foundation;  either version 2 of the License, or (at your
> - *  option) any later version.
> - *
> - * This driver is based on wm8350 implementation.
> - */
> -
> -#include <linux/kernel.h>
> -#include <linux/module.h>
> -#include <linux/errno.h>
> -#include <linux/gpio.h>
> -#include <linux/mfd/core.h>
> -#include <linux/platform_device.h>
> -#include <linux/seq_file.h>
> -#include <linux/slab.h>
> -#include <linux/mfd/tps65912.h>
> -
> -struct tps65912_gpio_data {
> -	struct tps65912 *tps65912;
> -	struct gpio_chip gpio_chip;
> -};
> -
> -#define to_tgd(gc) container_of(gc, struct tps65912_gpio_data, gpio_chip)
> -
> -static int tps65912_gpio_get(struct gpio_chip *gc, unsigned offset)
> -{
> -	struct tps65912_gpio_data *tps65912_gpio = to_tgd(gc);
> -	struct tps65912 *tps65912 = tps65912_gpio->tps65912;
> -	int val;
> -
> -	val = tps65912_reg_read(tps65912, TPS65912_GPIO1 + offset);
> -
> -	if (val & GPIO_STS_MASK)
> -		return 1;
> -
> -	return 0;
> -}
> -
> -static void tps65912_gpio_set(struct gpio_chip *gc, unsigned offset,
> -			      int value)
> -{
> -	struct tps65912_gpio_data *tps65912_gpio = to_tgd(gc);
> -	struct tps65912 *tps65912 = tps65912_gpio->tps65912;
> -
> -	if (value)
> -		tps65912_set_bits(tps65912, TPS65912_GPIO1 + offset,
> -							GPIO_SET_MASK);
> -	else
> -		tps65912_clear_bits(tps65912, TPS65912_GPIO1 + offset,
> -								GPIO_SET_MASK);
> -}
> -
> -static int tps65912_gpio_output(struct gpio_chip *gc, unsigned offset,
> -				int value)
> -{
> -	struct tps65912_gpio_data *tps65912_gpio = to_tgd(gc);
> -	struct tps65912 *tps65912 = tps65912_gpio->tps65912;
> -
> -	/* Set the initial value */
> -	tps65912_gpio_set(gc, offset, value);
> -
> -	return tps65912_set_bits(tps65912, TPS65912_GPIO1 + offset,
> -								GPIO_CFG_MASK);
> -}
> -
> -static int tps65912_gpio_input(struct gpio_chip *gc, unsigned offset)
> -{
> -	struct tps65912_gpio_data *tps65912_gpio = to_tgd(gc);
> -	struct tps65912 *tps65912 = tps65912_gpio->tps65912;
> -
> -	return tps65912_clear_bits(tps65912, TPS65912_GPIO1 + offset,
> -								GPIO_CFG_MASK);
> -}
> -
> -static struct gpio_chip template_chip = {
> -	.label			= "tps65912",
> -	.owner			= THIS_MODULE,
> -	.direction_input	= tps65912_gpio_input,
> -	.direction_output	= tps65912_gpio_output,
> -	.get			= tps65912_gpio_get,
> -	.set			= tps65912_gpio_set,
> -	.can_sleep		= true,
> -	.ngpio			= 5,
> -	.base			= -1,
> -};
> -
> -static int tps65912_gpio_probe(struct platform_device *pdev)
> -{
> -	struct tps65912 *tps65912 = dev_get_drvdata(pdev->dev.parent);
> -	struct tps65912_board *pdata = dev_get_platdata(tps65912->dev);
> -	struct tps65912_gpio_data *tps65912_gpio;
> -	int ret;
> -
> -	tps65912_gpio = devm_kzalloc(&pdev->dev, sizeof(*tps65912_gpio),
> -				     GFP_KERNEL);
> -	if (tps65912_gpio == NULL)
> -		return -ENOMEM;
> -
> -	tps65912_gpio->tps65912 = tps65912;
> -	tps65912_gpio->gpio_chip = template_chip;
> -	tps65912_gpio->gpio_chip.dev = &pdev->dev;
> -	if (pdata && pdata->gpio_base)
> -		tps65912_gpio->gpio_chip.base = pdata->gpio_base;
> -
> -	ret = gpiochip_add(&tps65912_gpio->gpio_chip);
> -	if (ret < 0) {
> -		dev_err(&pdev->dev, "Failed to register gpiochip, %d\n", ret);
> -		return ret;
> -	}
> -
> -	platform_set_drvdata(pdev, tps65912_gpio);
> -
> -	return ret;
> -}
> -
> -static int tps65912_gpio_remove(struct platform_device *pdev)
> -{
> -	struct tps65912_gpio_data  *tps65912_gpio = platform_get_drvdata(pdev);
> -
> -	gpiochip_remove(&tps65912_gpio->gpio_chip);
> -	return 0;
> -}
> -
> -static struct platform_driver tps65912_gpio_driver = {
> -	.driver = {
> -		.name = "tps65912-gpio",
> -	},
> -	.probe = tps65912_gpio_probe,
> -	.remove = tps65912_gpio_remove,
> -};
> -
> -static int __init tps65912_gpio_init(void)
> -{
> -	return platform_driver_register(&tps65912_gpio_driver);
> -}
> -subsys_initcall(tps65912_gpio_init);
> -
> -static void __exit tps65912_gpio_exit(void)
> -{
> -	platform_driver_unregister(&tps65912_gpio_driver);
> -}
> -module_exit(tps65912_gpio_exit);
> -
> -MODULE_AUTHOR("Margarita Olaya Cabrera <magi@slimlogic.co.uk>");
> -MODULE_DESCRIPTION("GPIO interface for TPS65912 PMICs");
> -MODULE_LICENSE("GPL v2");
> -MODULE_ALIAS("platform:tps65912-gpio");
> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> index 99d6367..9a8df8e 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -1167,32 +1167,6 @@ config MFD_TPS65910
>  	  if you say yes here you get support for the TPS65910 series of
>  	  Power Management chips.
>  
> -config MFD_TPS65912
> -	bool "TI TPS65912 Power Management chip"
> -	depends on GPIOLIB
> -	select MFD_CORE
> -	help
> -	  If you say yes here you get support for the TPS65912 series of
> -	  PM chips.
> -
> -config MFD_TPS65912_I2C
> -	bool "TI TPS65912 Power Management chip with I2C"
> -	select MFD_CORE
> -	select MFD_TPS65912
> -	depends on I2C=y && GPIOLIB
> -	help
> -	  If you say yes here you get support for the TPS65912 series of
> -	  PM chips with I2C interface.
> -
> -config MFD_TPS65912_SPI
> -	bool "TI TPS65912 Power Management chip with SPI"
> -	select MFD_CORE
> -	select MFD_TPS65912
> -	depends on SPI_MASTER && GPIOLIB
> -	help
> -	  If you say yes here you get support for the TPS65912 series of
> -	  PM chips with SPI interface.
> -
>  config MFD_TPS80031
>  	bool "TI TPS80031/TPS80032 Power Management chips"
>  	depends on I2C=y
> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> index a59e3fc..004aa76 100644
> --- a/drivers/mfd/Makefile
> +++ b/drivers/mfd/Makefile
> @@ -69,10 +69,6 @@ obj-$(CONFIG_TPS6507X)		+= tps6507x.o
>  obj-$(CONFIG_MFD_TPS65217)	+= tps65217.o
>  obj-$(CONFIG_MFD_TPS65218)	+= tps65218.o
>  obj-$(CONFIG_MFD_TPS65910)	+= tps65910.o
> -tps65912-objs                   := tps65912-core.o tps65912-irq.o
> -obj-$(CONFIG_MFD_TPS65912)	+= tps65912.o
> -obj-$(CONFIG_MFD_TPS65912_I2C)	+= tps65912-i2c.o
> -obj-$(CONFIG_MFD_TPS65912_SPI)  += tps65912-spi.o
>  obj-$(CONFIG_MFD_TPS80031)	+= tps80031.o
>  obj-$(CONFIG_MENELAUS)		+= menelaus.o
>  
> diff --git a/drivers/mfd/tps65912-core.c b/drivers/mfd/tps65912-core.c
> deleted file mode 100644
> index 1f82d60..0000000
> --- a/drivers/mfd/tps65912-core.c
> +++ /dev/null
> @@ -1,175 +0,0 @@
> -/*
> - * tps65912-core.c  --  TI TPS65912x
> - *
> - * Copyright 2011 Texas Instruments Inc.
> - *
> - * Author: Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> - *
> - *  This program is free software; you can redistribute it and/or modify it
> - *  under  the terms of the GNU General  Public License as published by the
> - *  Free Software Foundation;  either version 2 of the License, or (at your
> - *  option) any later version.
> - *
> - *  This driver is based on wm8350 implementation.
> - */
> -
> -#include <linux/module.h>
> -#include <linux/moduleparam.h>
> -#include <linux/slab.h>
> -#include <linux/gpio.h>
> -#include <linux/mfd/core.h>
> -#include <linux/mfd/tps65912.h>
> -
> -static const struct mfd_cell tps65912s[] = {
> -	{
> -		.name = "tps65912-pmic",
> -	},
> -};
> -
> -int tps65912_set_bits(struct tps65912 *tps65912, u8 reg, u8 mask)
> -{
> -	u8 data;
> -	int err;
> -
> -	mutex_lock(&tps65912->io_mutex);
> -
> -	err = tps65912->read(tps65912, reg, 1, &data);
> -	if (err) {
> -		dev_err(tps65912->dev, "Read from reg 0x%x failed\n", reg);
> -		goto out;
> -	}
> -
> -	data |= mask;
> -	err = tps65912->write(tps65912, reg, 1, &data);
> -	if (err)
> -		dev_err(tps65912->dev, "Write to reg 0x%x failed\n", reg);
> -
> -out:
> -	mutex_unlock(&tps65912->io_mutex);
> -	return err;
> -}
> -EXPORT_SYMBOL_GPL(tps65912_set_bits);
> -
> -int tps65912_clear_bits(struct tps65912 *tps65912, u8 reg, u8 mask)
> -{
> -	u8 data;
> -	int err;
> -
> -	mutex_lock(&tps65912->io_mutex);
> -	err = tps65912->read(tps65912, reg, 1, &data);
> -	if (err) {
> -		dev_err(tps65912->dev, "Read from reg 0x%x failed\n", reg);
> -		goto out;
> -	}
> -
> -	data &= ~mask;
> -	err = tps65912->write(tps65912, reg, 1, &data);
> -	if (err)
> -		dev_err(tps65912->dev, "Write to reg 0x%x failed\n", reg);
> -
> -out:
> -	mutex_unlock(&tps65912->io_mutex);
> -	return err;
> -}
> -EXPORT_SYMBOL_GPL(tps65912_clear_bits);
> -
> -static inline int tps65912_read(struct tps65912 *tps65912, u8 reg)
> -{
> -	u8 val;
> -	int err;
> -
> -	err = tps65912->read(tps65912, reg, 1, &val);
> -	if (err < 0)
> -		return err;
> -
> -	return val;
> -}
> -
> -static inline int tps65912_write(struct tps65912 *tps65912, u8 reg, u8 val)
> -{
> -	return tps65912->write(tps65912, reg, 1, &val);
> -}
> -
> -int tps65912_reg_read(struct tps65912 *tps65912, u8 reg)
> -{
> -	int data;
> -
> -	mutex_lock(&tps65912->io_mutex);
> -
> -	data = tps65912_read(tps65912, reg);
> -	if (data < 0)
> -		dev_err(tps65912->dev, "Read from reg 0x%x failed\n", reg);
> -
> -	mutex_unlock(&tps65912->io_mutex);
> -	return data;
> -}
> -EXPORT_SYMBOL_GPL(tps65912_reg_read);
> -
> -int tps65912_reg_write(struct tps65912 *tps65912, u8 reg, u8 val)
> -{
> -	int err;
> -
> -	mutex_lock(&tps65912->io_mutex);
> -
> -	err = tps65912_write(tps65912, reg, val);
> -	if (err < 0)
> -		dev_err(tps65912->dev, "Write for reg 0x%x failed\n", reg);
> -
> -	mutex_unlock(&tps65912->io_mutex);
> -	return err;
> -}
> -EXPORT_SYMBOL_GPL(tps65912_reg_write);
> -
> -int tps65912_device_init(struct tps65912 *tps65912)
> -{
> -	struct tps65912_board *pmic_plat_data = dev_get_platdata(tps65912->dev);
> -	struct tps65912_platform_data *init_data;
> -	int ret, dcdc_avs, value;
> -
> -	init_data = kzalloc(sizeof(struct tps65912_platform_data), GFP_KERNEL);
> -	if (init_data == NULL)
> -		return -ENOMEM;
> -
> -	mutex_init(&tps65912->io_mutex);
> -	dev_set_drvdata(tps65912->dev, tps65912);
> -
> -	dcdc_avs = (pmic_plat_data->is_dcdc1_avs << 0 |
> -			pmic_plat_data->is_dcdc2_avs  << 1 |
> -				pmic_plat_data->is_dcdc3_avs << 2 |
> -					pmic_plat_data->is_dcdc4_avs << 3);
> -	if (dcdc_avs) {
> -		tps65912->read(tps65912, TPS65912_I2C_SPI_CFG, 1, &value);
> -		dcdc_avs |= value;
> -		tps65912->write(tps65912, TPS65912_I2C_SPI_CFG, 1, &dcdc_avs);
> -	}
> -
> -	ret = mfd_add_devices(tps65912->dev, -1,
> -			      tps65912s, ARRAY_SIZE(tps65912s),
> -			      NULL, 0, NULL);
> -	if (ret < 0)
> -		goto err;
> -
> -	init_data->irq = pmic_plat_data->irq;
> -	init_data->irq_base = pmic_plat_data->irq_base;
> -	ret = tps65912_irq_init(tps65912, init_data->irq, init_data);
> -	if (ret < 0)
> -		goto err;
> -
> -	kfree(init_data);
> -	return ret;
> -
> -err:
> -	kfree(init_data);
> -	mfd_remove_devices(tps65912->dev);
> -	return ret;
> -}
> -
> -void tps65912_device_exit(struct tps65912 *tps65912)
> -{
> -	mfd_remove_devices(tps65912->dev);
> -	tps65912_irq_exit(tps65912);
> -}
> -
> -MODULE_AUTHOR("Margarita Olaya	<magi@slimlogic.co.uk>");
> -MODULE_DESCRIPTION("TPS65912x chip family multi-function driver");
> -MODULE_LICENSE("GPL");
> diff --git a/drivers/mfd/tps65912-i2c.c b/drivers/mfd/tps65912-i2c.c
> deleted file mode 100644
> index 7e55640..0000000
> --- a/drivers/mfd/tps65912-i2c.c
> +++ /dev/null
> @@ -1,139 +0,0 @@
> -/*
> - * tps65912-i2c.c  --  I2C access for TI TPS65912x PMIC
> - *
> - * Copyright 2011 Texas Instruments Inc.
> - *
> - * Author: Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> - *
> - *  This program is free software; you can redistribute it and/or modify it
> - *  under  the terms of the GNU General  Public License as published by the
> - *  Free Software Foundation;  either version 2 of the License, or (at your
> - *  option) any later version.
> - *
> - *  This driver is based on wm8350 implementation.
> - */
> -
> -#include <linux/module.h>
> -#include <linux/moduleparam.h>
> -#include <linux/init.h>
> -#include <linux/slab.h>
> -#include <linux/gpio.h>
> -#include <linux/i2c.h>
> -#include <linux/mfd/core.h>
> -#include <linux/mfd/tps65912.h>
> -
> -static int tps65912_i2c_read(struct tps65912 *tps65912, u8 reg,
> -				  int bytes, void *dest)
> -{
> -	struct i2c_client *i2c = tps65912->control_data;
> -	struct i2c_msg xfer[2];
> -	int ret;
> -
> -	/* Write register */
> -	xfer[0].addr = i2c->addr;
> -	xfer[0].flags = 0;
> -	xfer[0].len = 1;
> -	xfer[0].buf = &reg;
> -
> -	/* Read data */
> -	xfer[1].addr = i2c->addr;
> -	xfer[1].flags = I2C_M_RD;
> -	xfer[1].len = bytes;
> -	xfer[1].buf = dest;
> -
> -	ret = i2c_transfer(i2c->adapter, xfer, 2);
> -	if (ret == 2)
> -		ret = 0;
> -	else if (ret >= 0)
> -		ret = -EIO;
> -	return ret;
> -}
> -
> -static int tps65912_i2c_write(struct tps65912 *tps65912, u8 reg,
> -				   int bytes, void *src)
> -{
> -	struct i2c_client *i2c = tps65912->control_data;
> -	/* we add 1 byte for device register */
> -	u8 msg[TPS6591X_MAX_REGISTER + 1];
> -	int ret;
> -
> -	if (bytes > TPS6591X_MAX_REGISTER)
> -		return -EINVAL;
> -
> -	msg[0] = reg;
> -	memcpy(&msg[1], src, bytes);
> -
> -	ret = i2c_master_send(i2c, msg, bytes + 1);
> -	if (ret < 0)
> -		return ret;
> -	if (ret != bytes + 1)
> -		return -EIO;
> -
> -	return 0;
> -}
> -
> -static int tps65912_i2c_probe(struct i2c_client *i2c,
> -			    const struct i2c_device_id *id)
> -{
> -	struct tps65912 *tps65912;
> -
> -	tps65912 = devm_kzalloc(&i2c->dev,
> -				sizeof(struct tps65912), GFP_KERNEL);
> -	if (tps65912 == NULL)
> -		return -ENOMEM;
> -
> -	i2c_set_clientdata(i2c, tps65912);
> -	tps65912->dev = &i2c->dev;
> -	tps65912->control_data = i2c;
> -	tps65912->read = tps65912_i2c_read;
> -	tps65912->write = tps65912_i2c_write;
> -
> -	return tps65912_device_init(tps65912);
> -}
> -
> -static int tps65912_i2c_remove(struct i2c_client *i2c)
> -{
> -	struct tps65912 *tps65912 = i2c_get_clientdata(i2c);
> -
> -	tps65912_device_exit(tps65912);
> -
> -	return 0;
> -}
> -
> -static const struct i2c_device_id tps65912_i2c_id[] = {
> -	{"tps65912", 0 },
> -	{ }
> -};
> -MODULE_DEVICE_TABLE(i2c, tps65912_i2c_id);
> -
> -static struct i2c_driver tps65912_i2c_driver = {
> -	.driver = {
> -		   .name = "tps65912",
> -	},
> -	.probe = tps65912_i2c_probe,
> -	.remove = tps65912_i2c_remove,
> -	.id_table = tps65912_i2c_id,
> -};
> -
> -static int __init tps65912_i2c_init(void)
> -{
> -	int ret;
> -
> -	ret = i2c_add_driver(&tps65912_i2c_driver);
> -	if (ret != 0)
> -		pr_err("Failed to register TPS65912 I2C driver: %d\n", ret);
> -
> -	return ret;
> -}
> -/* init early so consumer devices can complete system boot */
> -subsys_initcall(tps65912_i2c_init);
> -
> -static void __exit tps65912_i2c_exit(void)
> -{
> -	i2c_del_driver(&tps65912_i2c_driver);
> -}
> -module_exit(tps65912_i2c_exit);
> -
> -MODULE_AUTHOR("Margarita Olaya	<magi@slimlogic.co.uk>");
> -MODULE_DESCRIPTION("TPS6591x chip family multi-function driver");
> -MODULE_LICENSE("GPL");
> diff --git a/drivers/mfd/tps65912-irq.c b/drivers/mfd/tps65912-irq.c
> deleted file mode 100644
> index db2c29c..0000000
> --- a/drivers/mfd/tps65912-irq.c
> +++ /dev/null
> @@ -1,217 +0,0 @@
> -/*
> - * tps65912-irq.c  --  TI TPS6591x
> - *
> - * Copyright 2011 Texas Instruments Inc.
> - *
> - * Author: Margarita Olaya <magi@slimlogic.co.uk>
> - *
> - *  This program is free software; you can redistribute it and/or modify it
> - *  under  the terms of the GNU General  Public License as published by the
> - *  Free Software Foundation;  either version 2 of the License, or (at your
> - *  option) any later version.
> - *
> - * This driver is based on wm8350 implementation.
> - */
> -
> -#include <linux/kernel.h>
> -#include <linux/module.h>
> -#include <linux/bug.h>
> -#include <linux/device.h>
> -#include <linux/interrupt.h>
> -#include <linux/irq.h>
> -#include <linux/gpio.h>
> -#include <linux/mfd/tps65912.h>
> -
> -static inline int irq_to_tps65912_irq(struct tps65912 *tps65912,
> -							int irq)
> -{
> -	return irq - tps65912->irq_base;
> -}
> -
> -/*
> - * This is a threaded IRQ handler so can access I2C/SPI.  Since the
> - * IRQ handler explicitly clears the IRQ it handles the IRQ line
> - * will be reasserted and the physical IRQ will be handled again if
> - * another interrupt is asserted while we run - in the normal course
> - * of events this is a rare occurrence so we save I2C/SPI reads. We're
> - * also assuming that it's rare to get lots of interrupts firing
> - * simultaneously so try to minimise I/O.
> - */
> -static irqreturn_t tps65912_irq(int irq, void *irq_data)
> -{
> -	struct tps65912 *tps65912 = irq_data;
> -	u32 irq_sts;
> -	u32 irq_mask;
> -	u8 reg;
> -	int i;
> -
> -
> -	tps65912->read(tps65912, TPS65912_INT_STS, 1, &reg);
> -	irq_sts = reg;
> -	tps65912->read(tps65912, TPS65912_INT_STS2, 1, &reg);
> -	irq_sts |= reg << 8;
> -	tps65912->read(tps65912, TPS65912_INT_STS3, 1, &reg);
> -	irq_sts |= reg << 16;
> -	tps65912->read(tps65912, TPS65912_INT_STS4, 1, &reg);
> -	irq_sts |= reg << 24;
> -
> -	tps65912->read(tps65912, TPS65912_INT_MSK, 1, &reg);
> -	irq_mask = reg;
> -	tps65912->read(tps65912, TPS65912_INT_MSK2, 1, &reg);
> -	irq_mask |= reg << 8;
> -	tps65912->read(tps65912, TPS65912_INT_MSK3, 1, &reg);
> -	irq_mask |= reg << 16;
> -	tps65912->read(tps65912, TPS65912_INT_MSK4, 1, &reg);
> -	irq_mask |= reg << 24;
> -
> -	irq_sts &= ~irq_mask;
> -	if (!irq_sts)
> -		return IRQ_NONE;
> -
> -	for (i = 0; i < tps65912->irq_num; i++) {
> -		if (!(irq_sts & (1 << i)))
> -			continue;
> -
> -		handle_nested_irq(tps65912->irq_base + i);
> -	}
> -
> -	/* Write the STS register back to clear IRQs we handled */
> -	reg = irq_sts & 0xFF;
> -	irq_sts >>= 8;
> -	if (reg)
> -		tps65912->write(tps65912, TPS65912_INT_STS, 1, &reg);
> -	reg = irq_sts & 0xFF;
> -	irq_sts >>= 8;
> -	if (reg)
> -		tps65912->write(tps65912, TPS65912_INT_STS2, 1, &reg);
> -	reg = irq_sts & 0xFF;
> -	irq_sts >>= 8;
> -	if (reg)
> -		tps65912->write(tps65912, TPS65912_INT_STS3, 1, &reg);
> -	reg = irq_sts & 0xFF;
> -	if (reg)
> -		tps65912->write(tps65912, TPS65912_INT_STS4, 1, &reg);
> -
> -	return IRQ_HANDLED;
> -}
> -
> -static void tps65912_irq_lock(struct irq_data *data)
> -{
> -	struct tps65912 *tps65912 = irq_data_get_irq_chip_data(data);
> -
> -	mutex_lock(&tps65912->irq_lock);
> -}
> -
> -static void tps65912_irq_sync_unlock(struct irq_data *data)
> -{
> -	struct tps65912 *tps65912 = irq_data_get_irq_chip_data(data);
> -	u32 reg_mask;
> -	u8 reg;
> -
> -	tps65912->read(tps65912, TPS65912_INT_MSK, 1, &reg);
> -	reg_mask = reg;
> -	tps65912->read(tps65912, TPS65912_INT_MSK2, 1, &reg);
> -	reg_mask |= reg << 8;
> -	tps65912->read(tps65912, TPS65912_INT_MSK3, 1, &reg);
> -	reg_mask |= reg << 16;
> -	tps65912->read(tps65912, TPS65912_INT_MSK4, 1, &reg);
> -	reg_mask |= reg << 24;
> -
> -	if (tps65912->irq_mask != reg_mask) {
> -		reg = tps65912->irq_mask & 0xFF;
> -		tps65912->write(tps65912, TPS65912_INT_MSK, 1, &reg);
> -		reg = tps65912->irq_mask >> 8 & 0xFF;
> -		tps65912->write(tps65912, TPS65912_INT_MSK2, 1, &reg);
> -		reg = tps65912->irq_mask >> 16 & 0xFF;
> -		tps65912->write(tps65912, TPS65912_INT_MSK3, 1, &reg);
> -		reg = tps65912->irq_mask >> 24 & 0xFF;
> -		tps65912->write(tps65912, TPS65912_INT_MSK4, 1, &reg);
> -	}
> -
> -	mutex_unlock(&tps65912->irq_lock);
> -}
> -
> -static void tps65912_irq_enable(struct irq_data *data)
> -{
> -	struct tps65912 *tps65912 = irq_data_get_irq_chip_data(data);
> -
> -	tps65912->irq_mask &= ~(1 << irq_to_tps65912_irq(tps65912, data->irq));
> -}
> -
> -static void tps65912_irq_disable(struct irq_data *data)
> -{
> -	struct tps65912 *tps65912 = irq_data_get_irq_chip_data(data);
> -
> -	tps65912->irq_mask |= (1 << irq_to_tps65912_irq(tps65912, data->irq));
> -}
> -
> -static struct irq_chip tps65912_irq_chip = {
> -	.name = "tps65912",
> -	.irq_bus_lock = tps65912_irq_lock,
> -	.irq_bus_sync_unlock = tps65912_irq_sync_unlock,
> -	.irq_disable = tps65912_irq_disable,
> -	.irq_enable = tps65912_irq_enable,
> -};
> -
> -int tps65912_irq_init(struct tps65912 *tps65912, int irq,
> -			    struct tps65912_platform_data *pdata)
> -{
> -	int ret, cur_irq;
> -	int flags = IRQF_ONESHOT;
> -	u8 reg;
> -
> -	if (!irq) {
> -		dev_warn(tps65912->dev, "No interrupt support, no core IRQ\n");
> -		return 0;
> -	}
> -
> -	if (!pdata || !pdata->irq_base) {
> -		dev_warn(tps65912->dev, "No interrupt support, no IRQ base\n");
> -		return 0;
> -	}
> -
> -	/* Clear unattended interrupts */
> -	tps65912->read(tps65912, TPS65912_INT_STS, 1, &reg);
> -	tps65912->write(tps65912, TPS65912_INT_STS, 1, &reg);
> -	tps65912->read(tps65912, TPS65912_INT_STS2, 1, &reg);
> -	tps65912->write(tps65912, TPS65912_INT_STS2, 1, &reg);
> -	tps65912->read(tps65912, TPS65912_INT_STS3, 1, &reg);
> -	tps65912->write(tps65912, TPS65912_INT_STS3, 1, &reg);
> -	tps65912->read(tps65912, TPS65912_INT_STS4, 1, &reg);
> -	tps65912->write(tps65912, TPS65912_INT_STS4, 1, &reg);
> -
> -	/* Mask top level interrupts */
> -	tps65912->irq_mask = 0xFFFFFFFF;
> -
> -	mutex_init(&tps65912->irq_lock);
> -	tps65912->chip_irq = irq;
> -	tps65912->irq_base = pdata->irq_base;
> -
> -	tps65912->irq_num = TPS65912_NUM_IRQ;
> -
> -	/* Register with genirq */
> -	for (cur_irq = tps65912->irq_base;
> -	     cur_irq < tps65912->irq_num + tps65912->irq_base;
> -	     cur_irq++) {
> -		irq_set_chip_data(cur_irq, tps65912);
> -		irq_set_chip_and_handler(cur_irq, &tps65912_irq_chip,
> -					 handle_edge_irq);
> -		irq_set_nested_thread(cur_irq, 1);
> -		irq_clear_status_flags(cur_irq, IRQ_NOREQUEST | IRQ_NOPROBE);
> -	}
> -
> -	ret = request_threaded_irq(irq, NULL, tps65912_irq, flags,
> -				   "tps65912", tps65912);
> -
> -	irq_set_irq_type(irq, IRQ_TYPE_LEVEL_LOW);
> -	if (ret != 0)
> -		dev_err(tps65912->dev, "Failed to request IRQ: %d\n", ret);
> -
> -	return ret;
> -}
> -
> -int tps65912_irq_exit(struct tps65912 *tps65912)
> -{
> -	free_irq(tps65912->chip_irq, tps65912);
> -	return 0;
> -}
> diff --git a/drivers/mfd/tps65912-spi.c b/drivers/mfd/tps65912-spi.c
> deleted file mode 100644
> index de60ad9..0000000
> --- a/drivers/mfd/tps65912-spi.c
> +++ /dev/null
> @@ -1,141 +0,0 @@
> -/*
> - * tps65912-spi.c  --  SPI access for TI TPS65912x PMIC
> - *
> - * Copyright 2011 Texas Instruments Inc.
> - *
> - * Author: Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> - *
> - *  This program is free software; you can redistribute it and/or modify it
> - *  under  the terms of the GNU General  Public License as published by the
> - *  Free Software Foundation;  either version 2 of the License, or (at your
> - *  option) any later version.
> - *
> - *  This driver is based on wm8350 implementation.
> - */
> -
> -#include <linux/module.h>
> -#include <linux/moduleparam.h>
> -#include <linux/init.h>
> -#include <linux/slab.h>
> -#include <linux/gpio.h>
> -#include <linux/spi/spi.h>
> -#include <linux/mfd/core.h>
> -#include <linux/mfd/tps65912.h>
> -
> -static int tps65912_spi_write(struct tps65912 *tps65912, u8 addr,
> -							int bytes, void *src)
> -{
> -	struct spi_device *spi = tps65912->control_data;
> -	u8 *data = (u8 *) src;
> -	int ret;
> -	/* bit 23 is the read/write bit */
> -	unsigned long spi_data = 1 << 23 | addr << 15 | *data;
> -	struct spi_transfer xfer;
> -	struct spi_message msg;
> -	u32 tx_buf;
> -
> -	tx_buf = spi_data;
> -
> -	xfer.tx_buf	= &tx_buf;
> -	xfer.rx_buf	= NULL;
> -	xfer.len	= sizeof(unsigned long);
> -	xfer.bits_per_word = 24;
> -
> -	spi_message_init(&msg);
> -	spi_message_add_tail(&xfer, &msg);
> -
> -	ret = spi_sync(spi, &msg);
> -	return ret;
> -}
> -
> -static int tps65912_spi_read(struct tps65912 *tps65912, u8 addr,
> -							int bytes, void *dest)
> -{
> -	struct spi_device *spi = tps65912->control_data;
> -	/* bit 23 is the read/write bit */
> -	unsigned long spi_data = 0 << 23 | addr << 15;
> -	struct spi_transfer xfer;
> -	struct spi_message msg;
> -	int ret;
> -	u8 *data = (u8 *) dest;
> -	u32 tx_buf, rx_buf;
> -
> -	tx_buf = spi_data;
> -	rx_buf = 0;
> -
> -	xfer.tx_buf	= &tx_buf;
> -	xfer.rx_buf	= &rx_buf;
> -	xfer.len	= sizeof(unsigned long);
> -	xfer.bits_per_word = 24;
> -
> -	spi_message_init(&msg);
> -	spi_message_add_tail(&xfer, &msg);
> -
> -	if (spi == NULL)
> -		return 0;
> -
> -	ret = spi_sync(spi, &msg);
> -	if (ret == 0)
> -		*data = (u8) (rx_buf & 0xFF);
> -	return ret;
> -}
> -
> -static int tps65912_spi_probe(struct spi_device *spi)
> -{
> -	struct tps65912 *tps65912;
> -
> -	tps65912 = devm_kzalloc(&spi->dev,
> -				sizeof(struct tps65912), GFP_KERNEL);
> -	if (tps65912 == NULL)
> -		return -ENOMEM;
> -
> -	tps65912->dev = &spi->dev;
> -	tps65912->control_data = spi;
> -	tps65912->read = tps65912_spi_read;
> -	tps65912->write = tps65912_spi_write;
> -
> -	spi_set_drvdata(spi, tps65912);
> -
> -	return tps65912_device_init(tps65912);
> -}
> -
> -static int tps65912_spi_remove(struct spi_device *spi)
> -{
> -	struct tps65912 *tps65912 = spi_get_drvdata(spi);
> -
> -	tps65912_device_exit(tps65912);
> -
> -	return 0;
> -}
> -
> -static struct spi_driver tps65912_spi_driver = {
> -	.driver = {
> -		.name = "tps65912",
> -		.owner = THIS_MODULE,
> -	},
> -	.probe	= tps65912_spi_probe,
> -	.remove = tps65912_spi_remove,
> -};
> -
> -static int __init tps65912_spi_init(void)
> -{
> -	int ret;
> -
> -	ret = spi_register_driver(&tps65912_spi_driver);
> -	if (ret != 0)
> -		pr_err("Failed to register TPS65912 SPI driver: %d\n", ret);
> -
> -	return 0;
> -}
> -/* init early so consumer devices can complete system boot */
> -subsys_initcall(tps65912_spi_init);
> -
> -static void __exit tps65912_spi_exit(void)
> -{
> -	spi_unregister_driver(&tps65912_spi_driver);
> -}
> -module_exit(tps65912_spi_exit);
> -
> -MODULE_AUTHOR("Margarita Olaya	<magi@slimlogic.co.uk>");
> -MODULE_DESCRIPTION("SPI support for TPS65912 chip family mfd");
> -MODULE_LICENSE("GPL");
> diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
> index 64bccff..3cb2de9 100644
> --- a/drivers/regulator/Kconfig
> +++ b/drivers/regulator/Kconfig
> @@ -727,12 +727,6 @@ config REGULATOR_TPS65910
>  	help
>  	  This driver supports TPS65910/TPS65911 voltage regulator chips.
>  
> -config REGULATOR_TPS65912
> -	tristate "TI TPS65912 Power regulator"
> -	depends on (MFD_TPS65912_I2C || MFD_TPS65912_SPI)
> -	help
> -	    This driver supports TPS65912 voltage regulator chip.
> -
>  config REGULATOR_TPS80031
>  	tristate "TI TPS80031/TPS80032 power regualtor driver"
>  	depends on MFD_TPS80031
> diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
> index 0f81749..222ff5f 100644
> --- a/drivers/regulator/Makefile
> +++ b/drivers/regulator/Makefile
> @@ -91,7 +91,6 @@ obj-$(CONFIG_REGULATOR_TPS65218) += tps65218-regulator.o
>  obj-$(CONFIG_REGULATOR_TPS6524X) += tps6524x-regulator.o
>  obj-$(CONFIG_REGULATOR_TPS6586X) += tps6586x-regulator.o
>  obj-$(CONFIG_REGULATOR_TPS65910) += tps65910-regulator.o
> -obj-$(CONFIG_REGULATOR_TPS65912) += tps65912-regulator.o
>  obj-$(CONFIG_REGULATOR_TPS80031) += tps80031-regulator.o
>  obj-$(CONFIG_REGULATOR_TWL4030) += twl-regulator.o
>  obj-$(CONFIG_REGULATOR_VEXPRESS) += vexpress.o
> diff --git a/drivers/regulator/tps65912-regulator.c b/drivers/regulator/tps65912-regulator.c
> deleted file mode 100644
> index 9503d54..0000000
> --- a/drivers/regulator/tps65912-regulator.c
> +++ /dev/null
> @@ -1,541 +0,0 @@
> -/*
> - * tps65912.c  --  TI tps65912
> - *
> - * Copyright 2011 Texas Instruments Inc.
> - *
> - * Author: Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> - *
> - *  This program is free software; you can redistribute it and/or modify it
> - *  under  the terms of the GNU General  Public License as published by the
> - *  Free Software Foundation;  either version 2 of the License, or (at your
> - *  option) any later version.
> - *
> - * This driver is based on wm8350 implementation.
> - */
> -
> -#include <linux/kernel.h>
> -#include <linux/module.h>
> -#include <linux/init.h>
> -#include <linux/err.h>
> -#include <linux/platform_device.h>
> -#include <linux/regulator/driver.h>
> -#include <linux/regulator/machine.h>
> -#include <linux/slab.h>
> -#include <linux/gpio.h>
> -#include <linux/mfd/tps65912.h>
> -
> -/* DCDC's */
> -#define TPS65912_REG_DCDC1	0
> -#define TPS65912_REG_DCDC2	1
> -#define TPS65912_REG_DCDC3	2
> -#define TPS65912_REG_DCDC4	3
> -
> -/* LDOs */
> -#define TPS65912_REG_LDO1	4
> -#define TPS65912_REG_LDO2	5
> -#define TPS65912_REG_LDO3	6
> -#define TPS65912_REG_LDO4	7
> -#define TPS65912_REG_LDO5	8
> -#define TPS65912_REG_LDO6	9
> -#define TPS65912_REG_LDO7	10
> -#define TPS65912_REG_LDO8	11
> -#define TPS65912_REG_LDO9	12
> -#define TPS65912_REG_LDO10	13
> -
> -/* Number of step-down converters available */
> -#define TPS65912_NUM_DCDC	4
> -
> -/* Number of LDO voltage regulators  available */
> -#define TPS65912_NUM_LDO	10
> -
> -/* Number of total regulators available */
> -#define TPS65912_NUM_REGULATOR		(TPS65912_NUM_DCDC + TPS65912_NUM_LDO)
> -
> -#define TPS65912_REG_ENABLED	0x80
> -#define OP_SELREG_MASK		0x40
> -#define OP_SELREG_SHIFT		6
> -
> -struct tps_info {
> -	const char *name;
> -};
> -
> -static struct tps_info tps65912_regs[] = {
> -	{
> -		.name = "DCDC1",
> -	},
> -	{
> -		.name = "DCDC2",
> -	},
> -	{
> -		.name = "DCDC3",
> -	},
> -	{
> -		.name = "DCDC4",
> -	},
> -	{
> -		.name = "LDO1",
> -	},
> -	{
> -		.name = "LDO2",
> -	},
> -	{
> -		.name = "LDO3",
> -	},
> -	{
> -		.name = "LDO4",
> -	},
> -	{
> -		.name = "LDO5",
> -	},
> -	{
> -		.name = "LDO6",
> -	},
> -	{
> -		.name = "LDO7",
> -	},
> -	{
> -		.name = "LDO8",
> -	},
> -	{
> -		.name = "LDO9",
> -	},
> -	{
> -		.name = "LDO10",
> -	},
> -};
> -
> -struct tps65912_reg {
> -	struct regulator_desc desc[TPS65912_NUM_REGULATOR];
> -	struct tps65912 *mfd;
> -	struct regulator_dev *rdev[TPS65912_NUM_REGULATOR];
> -	struct tps_info *info[TPS65912_NUM_REGULATOR];
> -	/* for read/write access */
> -	struct mutex io_lock;
> -	int mode;
> -	int (*get_ctrl_reg)(int);
> -	int dcdc_range[TPS65912_NUM_DCDC];
> -	int pwm_mode_reg;
> -	int eco_reg;
> -};
> -
> -static const struct regulator_linear_range tps65912_ldo_ranges[] = {
> -	REGULATOR_LINEAR_RANGE(800000, 0, 32, 25000),
> -	REGULATOR_LINEAR_RANGE(1650000, 33, 60, 50000),
> -	REGULATOR_LINEAR_RANGE(3100000, 61, 63, 100000),
> -};
> -
> -static int tps65912_get_range(struct tps65912_reg *pmic, int id)
> -{
> -	struct tps65912 *mfd = pmic->mfd;
> -	int range;
> -
> -	switch (id) {
> -	case TPS65912_REG_DCDC1:
> -		range = tps65912_reg_read(mfd, TPS65912_DCDC1_LIMIT);
> -		break;
> -	case TPS65912_REG_DCDC2:
> -		range = tps65912_reg_read(mfd, TPS65912_DCDC2_LIMIT);
> -		break;
> -	case TPS65912_REG_DCDC3:
> -		range = tps65912_reg_read(mfd, TPS65912_DCDC3_LIMIT);
> -		break;
> -	case TPS65912_REG_DCDC4:
> -		range = tps65912_reg_read(mfd, TPS65912_DCDC4_LIMIT);
> -		break;
> -	default:
> -		return 0;
> -	}
> -
> -	if (range >= 0)
> -		range = (range & DCDC_LIMIT_RANGE_MASK)
> -			>> DCDC_LIMIT_RANGE_SHIFT;
> -
> -	pmic->dcdc_range[id] = range;
> -	return range;
> -}
> -
> -static unsigned long tps65912_vsel_to_uv_range0(u8 vsel)
> -{
> -	unsigned long uv;
> -
> -	uv = ((vsel * 12500) + 500000);
> -	return uv;
> -}
> -
> -static unsigned long tps65912_vsel_to_uv_range1(u8 vsel)
> -{
> -	unsigned long uv;
> -
> -	 uv = ((vsel * 12500) + 700000);
> -	return uv;
> -}
> -
> -static unsigned long tps65912_vsel_to_uv_range2(u8 vsel)
> -{
> -	unsigned long uv;
> -
> -	uv = ((vsel * 25000) + 500000);
> -	return uv;
> -}
> -
> -static unsigned long tps65912_vsel_to_uv_range3(u8 vsel)
> -{
> -	unsigned long uv;
> -
> -	if (vsel == 0x3f)
> -		uv = 3800000;
> -	else
> -		uv = ((vsel * 50000) + 500000);
> -
> -	return uv;
> -}
> -
> -static int tps65912_get_ctrl_register(int id)
> -{
> -	if (id >= TPS65912_REG_DCDC1 && id <= TPS65912_REG_LDO4)
> -		return id * 3 + TPS65912_DCDC1_AVS;
> -	else if (id >= TPS65912_REG_LDO5 && id <= TPS65912_REG_LDO10)
> -		return id - TPS65912_REG_LDO5 + TPS65912_LDO5;
> -	else
> -		return -EINVAL;
> -}
> -
> -static int tps65912_get_sel_register(struct tps65912_reg *pmic, int id)
> -{
> -	struct tps65912 *mfd = pmic->mfd;
> -	int opvsel;
> -	u8 reg = 0;
> -
> -	if (id >= TPS65912_REG_DCDC1 && id <= TPS65912_REG_LDO4) {
> -		opvsel = tps65912_reg_read(mfd, id * 3 + TPS65912_DCDC1_OP);
> -		if (opvsel & OP_SELREG_MASK)
> -			reg = id * 3 + TPS65912_DCDC1_AVS;
> -		else
> -			reg = id * 3 + TPS65912_DCDC1_OP;
> -	} else if (id >= TPS65912_REG_LDO5 && id <= TPS65912_REG_LDO10) {
> -		reg = id - TPS65912_REG_LDO5 + TPS65912_LDO5;
> -	} else {
> -		return -EINVAL;
> -	}
> -
> -	return reg;
> -}
> -
> -static int tps65912_get_mode_regiters(struct tps65912_reg *pmic, int id)
> -{
> -	switch (id) {
> -	case TPS65912_REG_DCDC1:
> -		pmic->pwm_mode_reg = TPS65912_DCDC1_CTRL;
> -		pmic->eco_reg = TPS65912_DCDC1_AVS;
> -		break;
> -	case TPS65912_REG_DCDC2:
> -		pmic->pwm_mode_reg = TPS65912_DCDC2_CTRL;
> -		pmic->eco_reg = TPS65912_DCDC2_AVS;
> -		break;
> -	case TPS65912_REG_DCDC3:
> -		pmic->pwm_mode_reg = TPS65912_DCDC3_CTRL;
> -		pmic->eco_reg = TPS65912_DCDC3_AVS;
> -		break;
> -	case TPS65912_REG_DCDC4:
> -		pmic->pwm_mode_reg = TPS65912_DCDC4_CTRL;
> -		pmic->eco_reg = TPS65912_DCDC4_AVS;
> -		break;
> -	default:
> -		return -EINVAL;
> -	}
> -
> -	return 0;
> -}
> -
> -static int tps65912_reg_is_enabled(struct regulator_dev *dev)
> -{
> -	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
> -	struct tps65912 *mfd = pmic->mfd;
> -	int reg, value, id = rdev_get_id(dev);
> -
> -	if (id < TPS65912_REG_DCDC1 || id > TPS65912_REG_LDO10)
> -		return -EINVAL;
> -
> -	reg = pmic->get_ctrl_reg(id);
> -	if (reg < 0)
> -		return reg;
> -
> -	value = tps65912_reg_read(mfd, reg);
> -	if (value < 0)
> -		return value;
> -
> -	return value & TPS65912_REG_ENABLED;
> -}
> -
> -static int tps65912_reg_enable(struct regulator_dev *dev)
> -{
> -	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
> -	struct tps65912 *mfd = pmic->mfd;
> -	int id = rdev_get_id(dev);
> -	int reg;
> -
> -	if (id < TPS65912_REG_DCDC1 || id > TPS65912_REG_LDO10)
> -		return -EINVAL;
> -
> -	reg = pmic->get_ctrl_reg(id);
> -	if (reg < 0)
> -		return reg;
> -
> -	return tps65912_set_bits(mfd, reg, TPS65912_REG_ENABLED);
> -}
> -
> -static int tps65912_reg_disable(struct regulator_dev *dev)
> -{
> -	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
> -	struct tps65912 *mfd = pmic->mfd;
> -	int id = rdev_get_id(dev), reg;
> -
> -	reg = pmic->get_ctrl_reg(id);
> -	if (reg < 0)
> -		return reg;
> -
> -	return tps65912_clear_bits(mfd, reg, TPS65912_REG_ENABLED);
> -}
> -
> -static int tps65912_set_mode(struct regulator_dev *dev, unsigned int mode)
> -{
> -	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
> -	struct tps65912 *mfd = pmic->mfd;
> -	int pwm_mode, eco, id = rdev_get_id(dev);
> -
> -	tps65912_get_mode_regiters(pmic, id);
> -
> -	pwm_mode = tps65912_reg_read(mfd, pmic->pwm_mode_reg);
> -	eco = tps65912_reg_read(mfd, pmic->eco_reg);
> -
> -	pwm_mode &= DCDCCTRL_DCDC_MODE_MASK;
> -	eco &= DCDC_AVS_ECO_MASK;
> -
> -	switch (mode) {
> -	case REGULATOR_MODE_FAST:
> -		/* Verify if mode alredy set */
> -		if (pwm_mode && !eco)
> -			break;
> -		tps65912_set_bits(mfd, pmic->pwm_mode_reg, DCDCCTRL_DCDC_MODE_MASK);
> -		tps65912_clear_bits(mfd, pmic->eco_reg, DCDC_AVS_ECO_MASK);
> -		break;
> -	case REGULATOR_MODE_NORMAL:
> -	case REGULATOR_MODE_IDLE:
> -		if (!pwm_mode && !eco)
> -			break;
> -		tps65912_clear_bits(mfd, pmic->pwm_mode_reg, DCDCCTRL_DCDC_MODE_MASK);
> -		tps65912_clear_bits(mfd, pmic->eco_reg, DCDC_AVS_ECO_MASK);
> -		break;
> -	case REGULATOR_MODE_STANDBY:
> -		if (!pwm_mode && eco)
> -			break;
> -		tps65912_clear_bits(mfd, pmic->pwm_mode_reg, DCDCCTRL_DCDC_MODE_MASK);
> -		tps65912_set_bits(mfd, pmic->eco_reg, DCDC_AVS_ECO_MASK);
> -		break;
> -	default:
> -		return -EINVAL;
> -	}
> -
> -	return 0;
> -}
> -
> -static unsigned int tps65912_get_mode(struct regulator_dev *dev)
> -{
> -	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
> -	struct tps65912 *mfd = pmic->mfd;
> -	int pwm_mode, eco, mode = 0, id = rdev_get_id(dev);
> -
> -	tps65912_get_mode_regiters(pmic, id);
> -
> -	pwm_mode = tps65912_reg_read(mfd, pmic->pwm_mode_reg);
> -	eco = tps65912_reg_read(mfd, pmic->eco_reg);
> -
> -	pwm_mode &= DCDCCTRL_DCDC_MODE_MASK;
> -	eco &= DCDC_AVS_ECO_MASK;
> -
> -	if (pwm_mode && !eco)
> -		mode = REGULATOR_MODE_FAST;
> -	else if (!pwm_mode && !eco)
> -		mode = REGULATOR_MODE_NORMAL;
> -	else if (!pwm_mode && eco)
> -		mode = REGULATOR_MODE_STANDBY;
> -
> -	return mode;
> -}
> -
> -static int tps65912_list_voltage(struct regulator_dev *dev, unsigned selector)
> -{
> -	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
> -	int range, voltage = 0, id = rdev_get_id(dev);
> -
> -	if (id > TPS65912_REG_DCDC4)
> -		return -EINVAL;
> -
> -	range = pmic->dcdc_range[id];
> -
> -	switch (range) {
> -	case 0:
> -		/* 0.5 - 1.2875V in 12.5mV steps */
> -		voltage = tps65912_vsel_to_uv_range0(selector);
> -		break;
> -	case 1:
> -		/* 0.7 - 1.4875V in 12.5mV steps */
> -		voltage = tps65912_vsel_to_uv_range1(selector);
> -		break;
> -	case 2:
> -		/* 0.5 - 2.075V in 25mV steps */
> -		voltage = tps65912_vsel_to_uv_range2(selector);
> -		break;
> -	case 3:
> -		/* 0.5 - 3.8V in 50mV steps */
> -		voltage = tps65912_vsel_to_uv_range3(selector);
> -		break;
> -	}
> -	return voltage;
> -}
> -
> -static int tps65912_get_voltage_sel(struct regulator_dev *dev)
> -{
> -	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
> -	struct tps65912 *mfd = pmic->mfd;
> -	int id = rdev_get_id(dev);
> -	int reg, vsel;
> -
> -	reg = tps65912_get_sel_register(pmic, id);
> -	if (reg < 0)
> -		return reg;
> -
> -	vsel = tps65912_reg_read(mfd, reg);
> -	vsel &= 0x3F;
> -
> -	return vsel;
> -}
> -
> -static int tps65912_set_voltage_sel(struct regulator_dev *dev,
> -					 unsigned selector)
> -{
> -	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
> -	struct tps65912 *mfd = pmic->mfd;
> -	int id = rdev_get_id(dev);
> -	int value;
> -	u8 reg;
> -
> -	reg = tps65912_get_sel_register(pmic, id);
> -	value = tps65912_reg_read(mfd, reg);
> -	value &= 0xC0;
> -	return tps65912_reg_write(mfd, reg, selector | value);
> -}
> -
> -/* Operations permitted on DCDCx */
> -static struct regulator_ops tps65912_ops_dcdc = {
> -	.is_enabled = tps65912_reg_is_enabled,
> -	.enable = tps65912_reg_enable,
> -	.disable = tps65912_reg_disable,
> -	.set_mode = tps65912_set_mode,
> -	.get_mode = tps65912_get_mode,
> -	.get_voltage_sel = tps65912_get_voltage_sel,
> -	.set_voltage_sel = tps65912_set_voltage_sel,
> -	.list_voltage = tps65912_list_voltage,
> -};
> -
> -/* Operations permitted on LDOx */
> -static struct regulator_ops tps65912_ops_ldo = {
> -	.is_enabled = tps65912_reg_is_enabled,
> -	.enable = tps65912_reg_enable,
> -	.disable = tps65912_reg_disable,
> -	.get_voltage_sel = tps65912_get_voltage_sel,
> -	.set_voltage_sel = tps65912_set_voltage_sel,
> -	.list_voltage = regulator_list_voltage_linear_range,
> -	.map_voltage = regulator_map_voltage_linear_range,
> -};
> -
> -static int tps65912_probe(struct platform_device *pdev)
> -{
> -	struct tps65912 *tps65912 = dev_get_drvdata(pdev->dev.parent);
> -	struct regulator_config config = { };
> -	struct tps_info *info;
> -	struct regulator_init_data *reg_data;
> -	struct regulator_dev *rdev;
> -	struct tps65912_reg *pmic;
> -	struct tps65912_board *pmic_plat_data;
> -	int i;
> -
> -	pmic_plat_data = dev_get_platdata(tps65912->dev);
> -	if (!pmic_plat_data)
> -		return -EINVAL;
> -
> -	reg_data = pmic_plat_data->tps65912_pmic_init_data;
> -
> -	pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL);
> -	if (!pmic)
> -		return -ENOMEM;
> -
> -	mutex_init(&pmic->io_lock);
> -	pmic->mfd = tps65912;
> -	platform_set_drvdata(pdev, pmic);
> -
> -	pmic->get_ctrl_reg = &tps65912_get_ctrl_register;
> -	info = tps65912_regs;
> -
> -	for (i = 0; i < TPS65912_NUM_REGULATOR; i++, info++, reg_data++) {
> -		int range = 0;
> -		/* Register the regulators */
> -		pmic->info[i] = info;
> -
> -		pmic->desc[i].name = info->name;
> -		pmic->desc[i].id = i;
> -		pmic->desc[i].n_voltages = 64;
> -		if (i > TPS65912_REG_DCDC4) {
> -			pmic->desc[i].ops = &tps65912_ops_ldo;
> -			pmic->desc[i].linear_ranges = tps65912_ldo_ranges;
> -			pmic->desc[i].n_linear_ranges =
> -					ARRAY_SIZE(tps65912_ldo_ranges);
> -		} else {
> -			pmic->desc[i].ops = &tps65912_ops_dcdc;
> -		}
> -		pmic->desc[i].type = REGULATOR_VOLTAGE;
> -		pmic->desc[i].owner = THIS_MODULE;
> -		range = tps65912_get_range(pmic, i);
> -
> -		config.dev = tps65912->dev;
> -		config.init_data = reg_data;
> -		config.driver_data = pmic;
> -
> -		rdev = devm_regulator_register(&pdev->dev, &pmic->desc[i],
> -					       &config);
> -		if (IS_ERR(rdev)) {
> -			dev_err(tps65912->dev,
> -				"failed to register %s regulator\n",
> -				pdev->name);
> -			return PTR_ERR(rdev);
> -		}
> -
> -		/* Save regulator for cleanup */
> -		pmic->rdev[i] = rdev;
> -	}
> -	return 0;
> -}
> -
> -static struct platform_driver tps65912_driver = {
> -	.driver = {
> -		.name = "tps65912-pmic",
> -	},
> -	.probe = tps65912_probe,
> -};
> -
> -static int __init tps65912_init(void)
> -{
> -	return platform_driver_register(&tps65912_driver);
> -}
> -subsys_initcall(tps65912_init);
> -
> -static void __exit tps65912_cleanup(void)
> -{
> -	platform_driver_unregister(&tps65912_driver);
> -}
> -module_exit(tps65912_cleanup);
> -
> -MODULE_AUTHOR("Margarita Olaya Cabrera <magi@slimlogic.co.uk>");
> -MODULE_DESCRIPTION("TPS65912 voltage regulator driver");
> -MODULE_LICENSE("GPL v2");
> -MODULE_ALIAS("platform:tps65912-pmic");
> diff --git a/include/linux/mfd/tps65912.h b/include/linux/mfd/tps65912.h
> deleted file mode 100644
> index 6d30903..0000000
> --- a/include/linux/mfd/tps65912.h
> +++ /dev/null
> @@ -1,328 +0,0 @@
> -/*
> - * tps65912.h  --  TI TPS6591x
> - *
> - * Copyright 2011 Texas Instruments Inc.
> - *
> - * Author: Margarita Olaya <magi@slimlogic.co.uk>
> - *
> - *  This program is free software; you can redistribute it and/or modify it
> - *  under  the terms of the GNU General  Public License as published by the
> - *  Free Software Foundation;  either version 2 of the License, or (at your
> - *  option) any later version.
> - *
> - */
> -
> -#ifndef __LINUX_MFD_TPS65912_H
> -#define __LINUX_MFD_TPS65912_H
> -
> -/* TPS regulator type list */
> -#define REGULATOR_LDO		0
> -#define REGULATOR_DCDC		1
> -
> -/*
> - * List of registers for TPS65912
> - */
> -
> -#define TPS65912_DCDC1_CTRL		0x00
> -#define TPS65912_DCDC2_CTRL		0x01
> -#define TPS65912_DCDC3_CTRL		0x02
> -#define TPS65912_DCDC4_CTRL		0x03
> -#define TPS65912_DCDC1_OP		0x04
> -#define TPS65912_DCDC1_AVS		0x05
> -#define TPS65912_DCDC1_LIMIT		0x06
> -#define TPS65912_DCDC2_OP		0x07
> -#define TPS65912_DCDC2_AVS		0x08
> -#define TPS65912_DCDC2_LIMIT		0x09
> -#define TPS65912_DCDC3_OP		0x0A
> -#define TPS65912_DCDC3_AVS		0x0B
> -#define TPS65912_DCDC3_LIMIT		0x0C
> -#define TPS65912_DCDC4_OP		0x0D
> -#define TPS65912_DCDC4_AVS		0x0E
> -#define TPS65912_DCDC4_LIMIT		0x0F
> -#define TPS65912_LDO1_OP		0x10
> -#define TPS65912_LDO1_AVS		0x11
> -#define TPS65912_LDO1_LIMIT		0x12
> -#define TPS65912_LDO2_OP		0x13
> -#define TPS65912_LDO2_AVS		0x14
> -#define TPS65912_LDO2_LIMIT		0x15
> -#define TPS65912_LDO3_OP		0x16
> -#define TPS65912_LDO3_AVS		0x17
> -#define TPS65912_LDO3_LIMIT		0x18
> -#define TPS65912_LDO4_OP		0x19
> -#define TPS65912_LDO4_AVS		0x1A
> -#define TPS65912_LDO4_LIMIT		0x1B
> -#define TPS65912_LDO5			0x1C
> -#define TPS65912_LDO6			0x1D
> -#define TPS65912_LDO7			0x1E
> -#define TPS65912_LDO8			0x1F
> -#define TPS65912_LDO9			0x20
> -#define TPS65912_LDO10			0x21
> -#define TPS65912_THRM			0x22
> -#define TPS65912_CLK32OUT		0x23
> -#define TPS65912_DEVCTRL		0x24
> -#define TPS65912_DEVCTRL2		0x25
> -#define TPS65912_I2C_SPI_CFG		0x26
> -#define TPS65912_KEEP_ON		0x27
> -#define TPS65912_KEEP_ON2		0x28
> -#define TPS65912_SET_OFF1		0x29
> -#define TPS65912_SET_OFF2		0x2A
> -#define TPS65912_DEF_VOLT		0x2B
> -#define TPS65912_DEF_VOLT_MAPPING	0x2C
> -#define TPS65912_DISCHARGE		0x2D
> -#define TPS65912_DISCHARGE2		0x2E
> -#define TPS65912_EN1_SET1		0x2F
> -#define TPS65912_EN1_SET2		0x30
> -#define TPS65912_EN2_SET1		0x31
> -#define TPS65912_EN2_SET2		0x32
> -#define TPS65912_EN3_SET1		0x33
> -#define TPS65912_EN3_SET2		0x34
> -#define TPS65912_EN4_SET1		0x35
> -#define TPS65912_EN4_SET2		0x36
> -#define TPS65912_PGOOD			0x37
> -#define TPS65912_PGOOD2			0x38
> -#define TPS65912_INT_STS		0x39
> -#define TPS65912_INT_MSK		0x3A
> -#define TPS65912_INT_STS2		0x3B
> -#define TPS65912_INT_MSK2		0x3C
> -#define TPS65912_INT_STS3		0x3D
> -#define TPS65912_INT_MSK3		0x3E
> -#define TPS65912_INT_STS4		0x3F
> -#define TPS65912_INT_MSK4		0x40
> -#define TPS65912_GPIO1			0x41
> -#define TPS65912_GPIO2			0x42
> -#define TPS65912_GPIO3			0x43
> -#define TPS65912_GPIO4			0x44
> -#define TPS65912_GPIO5			0x45
> -#define TPS65912_VMON			0x46
> -#define TPS65912_LEDA_CTRL1		0x47
> -#define TPS65912_LEDA_CTRL2		0x48
> -#define TPS65912_LEDA_CTRL3		0x49
> -#define TPS65912_LEDA_CTRL4		0x4A
> -#define TPS65912_LEDA_CTRL5		0x4B
> -#define TPS65912_LEDA_CTRL6		0x4C
> -#define TPS65912_LEDA_CTRL7		0x4D
> -#define TPS65912_LEDA_CTRL8		0x4E
> -#define TPS65912_LEDB_CTRL1		0x4F
> -#define TPS65912_LEDB_CTRL2		0x50
> -#define TPS65912_LEDB_CTRL3		0x51
> -#define TPS65912_LEDB_CTRL4		0x52
> -#define TPS65912_LEDB_CTRL5		0x53
> -#define TPS65912_LEDB_CTRL6		0x54
> -#define TPS65912_LEDB_CTRL7		0x55
> -#define TPS65912_LEDB_CTRL8		0x56
> -#define TPS65912_LEDC_CTRL1		0x57
> -#define TPS65912_LEDC_CTRL2		0x58
> -#define TPS65912_LEDC_CTRL3		0x59
> -#define TPS65912_LEDC_CTRL4		0x5A
> -#define TPS65912_LEDC_CTRL5		0x5B
> -#define TPS65912_LEDC_CTRL6		0x5C
> -#define TPS65912_LEDC_CTRL7		0x5D
> -#define TPS65912_LEDC_CTRL8		0x5E
> -#define TPS65912_LED_RAMP_UP_TIME	0x5F
> -#define TPS65912_LED_RAMP_DOWN_TIME	0x60
> -#define TPS65912_LED_SEQ_EN		0x61
> -#define TPS65912_LOADSWITCH		0x62
> -#define TPS65912_SPARE			0x63
> -#define TPS65912_VERNUM			0x64
> -#define TPS6591X_MAX_REGISTER		0x64
> -
> -/* IRQ Definitions */
> -#define TPS65912_IRQ_PWRHOLD_F		0
> -#define TPS65912_IRQ_VMON		1
> -#define TPS65912_IRQ_PWRON		2
> -#define TPS65912_IRQ_PWRON_LP		3
> -#define TPS65912_IRQ_PWRHOLD_R		4
> -#define TPS65912_IRQ_HOTDIE		5
> -#define TPS65912_IRQ_GPIO1_R		6
> -#define TPS65912_IRQ_GPIO1_F		7
> -#define TPS65912_IRQ_GPIO2_R		8
> -#define TPS65912_IRQ_GPIO2_F		9
> -#define TPS65912_IRQ_GPIO3_R		10
> -#define TPS65912_IRQ_GPIO3_F		11
> -#define TPS65912_IRQ_GPIO4_R		12
> -#define TPS65912_IRQ_GPIO4_F		13
> -#define TPS65912_IRQ_GPIO5_R		14
> -#define TPS65912_IRQ_GPIO5_F		15
> -#define TPS65912_IRQ_PGOOD_DCDC1	16
> -#define TPS65912_IRQ_PGOOD_DCDC2	17
> -#define TPS65912_IRQ_PGOOD_DCDC3	18
> -#define TPS65912_IRQ_PGOOD_DCDC4	19
> -#define TPS65912_IRQ_PGOOD_LDO1		20
> -#define TPS65912_IRQ_PGOOD_LDO2		21
> -#define TPS65912_IRQ_PGOOD_LDO3		22
> -#define TPS65912_IRQ_PGOOD_LDO4		23
> -#define TPS65912_IRQ_PGOOD_LDO5		24
> -#define TPS65912_IRQ_PGOOD_LDO6		25
> -#define TPS65912_IRQ_PGOOD_LDO7		26
> -#define TPS65912_IRQ_PGOOD_LD08		27
> -#define TPS65912_IRQ_PGOOD_LDO9		28
> -#define TPS65912_IRQ_PGOOD_LDO10	29
> -
> -#define TPS65912_NUM_IRQ		30
> -
> -/* GPIO 1 and 2 Register Definitions */
> -#define GPIO_SLEEP_MASK			0x80
> -#define GPIO_SLEEP_SHIFT		7
> -#define GPIO_DEB_MASK			0x10
> -#define GPIO_DEB_SHIFT			4
> -#define GPIO_CFG_MASK			0x04
> -#define GPIO_CFG_SHIFT			2
> -#define GPIO_STS_MASK			0x02
> -#define GPIO_STS_SHIFT			1
> -#define GPIO_SET_MASK			0x01
> -#define GPIO_SET_SHIFT			0
> -
> -/* GPIO 3 Register Definitions */
> -#define GPIO3_SLEEP_MASK		0x80
> -#define GPIO3_SLEEP_SHIFT		7
> -#define GPIO3_SEL_MASK			0x40
> -#define GPIO3_SEL_SHIFT			6
> -#define GPIO3_ODEN_MASK			0x20
> -#define GPIO3_ODEN_SHIFT		5
> -#define GPIO3_DEB_MASK			0x10
> -#define GPIO3_DEB_SHIFT			4
> -#define GPIO3_PDEN_MASK			0x08
> -#define GPIO3_PDEN_SHIFT		3
> -#define GPIO3_CFG_MASK			0x04
> -#define GPIO3_CFG_SHIFT			2
> -#define GPIO3_STS_MASK			0x02
> -#define GPIO3_STS_SHIFT			1
> -#define GPIO3_SET_MASK			0x01
> -#define GPIO3_SET_SHIFT			0
> -
> -/* GPIO 4 Register Definitions */
> -#define GPIO4_SLEEP_MASK		0x80
> -#define GPIO4_SLEEP_SHIFT		7
> -#define GPIO4_SEL_MASK			0x40
> -#define GPIO4_SEL_SHIFT			6
> -#define GPIO4_ODEN_MASK			0x20
> -#define GPIO4_ODEN_SHIFT		5
> -#define GPIO4_DEB_MASK			0x10
> -#define GPIO4_DEB_SHIFT			4
> -#define GPIO4_PDEN_MASK			0x08
> -#define GPIO4_PDEN_SHIFT		3
> -#define GPIO4_CFG_MASK			0x04
> -#define GPIO4_CFG_SHIFT			2
> -#define GPIO4_STS_MASK			0x02
> -#define GPIO4_STS_SHIFT			1
> -#define GPIO4_SET_MASK			0x01
> -#define GPIO4_SET_SHIFT			0
> -
> -/* Register THERM  (0x80) register.RegisterDescription */
> -#define THERM_THERM_HD_MASK		0x20
> -#define THERM_THERM_HD_SHIFT		5
> -#define THERM_THERM_TS_MASK		0x10
> -#define THERM_THERM_TS_SHIFT		4
> -#define THERM_THERM_HDSEL_MASK		0x0C
> -#define THERM_THERM_HDSEL_SHIFT		2
> -#define THERM_RSVD1_MASK		0x02
> -#define THERM_RSVD1_SHIFT		1
> -#define THERM_THERM_STATE_MASK		0x01
> -#define THERM_THERM_STATE_SHIFT		0
> -
> -/* Register DCDCCTRL1 register.RegisterDescription */
> -#define DCDCCTRL_VCON_ENABLE_MASK	0x80
> -#define DCDCCTRL_VCON_ENABLE_SHIFT	7
> -#define DCDCCTRL_VCON_RANGE1_MASK	0x40
> -#define DCDCCTRL_VCON_RANGE1_SHIFT	6
> -#define DCDCCTRL_VCON_RANGE0_MASK	0x20
> -#define DCDCCTRL_VCON_RANGE0_SHIFT	5
> -#define DCDCCTRL_TSTEP2_MASK		0x10
> -#define DCDCCTRL_TSTEP2_SHIFT		4
> -#define DCDCCTRL_TSTEP1_MASK		0x08
> -#define DCDCCTRL_TSTEP1_SHIFT		3
> -#define DCDCCTRL_TSTEP0_MASK		0x04
> -#define DCDCCTRL_TSTEP0_SHIFT		2
> -#define DCDCCTRL_DCDC1_MODE_MASK	0x02
> -#define DCDCCTRL_DCDC1_MODE_SHIFT	1
> -
> -/* Register DCDCCTRL2 and DCDCCTRL3 register.RegisterDescription */
> -#define DCDCCTRL_TSTEP2_MASK		0x10
> -#define DCDCCTRL_TSTEP2_SHIFT		4
> -#define DCDCCTRL_TSTEP1_MASK		0x08
> -#define DCDCCTRL_TSTEP1_SHIFT		3
> -#define DCDCCTRL_TSTEP0_MASK		0x04
> -#define DCDCCTRL_TSTEP0_SHIFT		2
> -#define DCDCCTRL_DCDC_MODE_MASK		0x02
> -#define DCDCCTRL_DCDC_MODE_SHIFT	1
> -#define DCDCCTRL_RSVD0_MASK		0x01
> -#define DCDCCTRL_RSVD0_SHIFT		0
> -
> -/* Register DCDCCTRL4 register.RegisterDescription */
> -#define DCDCCTRL_RAMP_TIME_MASK		0x01
> -#define DCDCCTRL_RAMP_TIME_SHIFT	0
> -
> -/* Register DCDCx_AVS */
> -#define DCDC_AVS_ENABLE_MASK		0x80
> -#define DCDC_AVS_ENABLE_SHIFT		7
> -#define DCDC_AVS_ECO_MASK		0x40
> -#define DCDC_AVS_ECO_SHIFT		6
> -
> -/* Register DCDCx_LIMIT */
> -#define DCDC_LIMIT_RANGE_MASK		0xC0
> -#define DCDC_LIMIT_RANGE_SHIFT		6
> -#define DCDC_LIMIT_MAX_SEL_MASK		0x3F
> -#define DCDC_LIMIT_MAX_SEL_SHIFT	0
> -
> -/**
> - * struct tps65912_board
> - * Board platform dat may be used to initialize regulators.
> - */
> -struct tps65912_board {
> -	int is_dcdc1_avs;
> -	int is_dcdc2_avs;
> -	int is_dcdc3_avs;
> -	int is_dcdc4_avs;
> -	int irq;
> -	int irq_base;
> -	int gpio_base;
> -	struct regulator_init_data *tps65912_pmic_init_data;
> -};
> -
> -/**
> - * struct tps65912 - tps65912 sub-driver chip access routines
> - */
> -
> -struct tps65912 {
> -	struct device *dev;
> -	/* for read/write acces */
> -	struct mutex io_mutex;
> -
> -	/* For device IO interfaces: I2C or SPI */
> -	void *control_data;
> -
> -	int (*read)(struct tps65912 *tps65912, u8 reg, int size, void *dest);
> -	int (*write)(struct tps65912 *tps65912, u8 reg, int size, void *src);
> -
> -	/* Client devices */
> -	struct tps65912_pmic *pmic;
> -
> -	/* GPIO Handling */
> -	struct gpio_chip gpio;
> -
> -	/* IRQ Handling */
> -	struct mutex irq_lock;
> -	int chip_irq;
> -	int irq_base;
> -	int irq_num;
> -	u32 irq_mask;
> -};
> -
> -struct tps65912_platform_data {
> -	int irq;
> -	int irq_base;
> -};
> -
> -unsigned int tps_chip(void);
> -
> -int tps65912_set_bits(struct tps65912 *tps65912, u8 reg, u8 mask);
> -int tps65912_clear_bits(struct tps65912 *tps65912, u8 reg, u8 mask);
> -int tps65912_reg_read(struct tps65912 *tps65912, u8 reg);
> -int tps65912_reg_write(struct tps65912 *tps65912, u8 reg, u8 val);
> -int tps65912_device_init(struct tps65912 *tps65912);
> -void tps65912_device_exit(struct tps65912 *tps65912);
> -int tps65912_irq_init(struct tps65912 *tps65912, int irq,
> -			struct tps65912_platform_data *pdata);
> -int tps65912_irq_exit(struct tps65912 *tps65912);
> -
> -#endif /*  __LINUX_MFD_TPS65912_H */

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

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

* Re: [PATCH v4 2/5] mfd: tps65912: Remove old driver in preparation for new driver
  2015-10-05  9:28   ` Lee Jones
@ 2015-10-05  9:29     ` Lee Jones
  2015-10-05 16:01       ` Andrew F. Davis
  0 siblings, 1 reply; 44+ messages in thread
From: Lee Jones @ 2015-10-05  9:29 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Mark Brown, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On Mon, 05 Oct 2015, Lee Jones wrote:

> On Thu, 01 Oct 2015, Andrew F. Davis wrote:
> 
> > The old tps65912 driver is being replaced, delete old driver.
> > 
> > Signed-off-by: Andrew F. Davis <afd@ti.com>
> 
> I already Acked this in v3.
> 
> Acked-by: Lee Jones <lee.jones@linaro.org>

Ack can carry, but is there any chance this can be split up for easy
digestion into the respective trees?

> > ---
> >  drivers/gpio/Kconfig                   |   6 -
> >  drivers/gpio/Makefile                  |   1 -
> >  drivers/gpio/gpio-tps65912.c           | 153 ----------
> >  drivers/mfd/Kconfig                    |  26 --
> >  drivers/mfd/Makefile                   |   4 -
> >  drivers/mfd/tps65912-core.c            | 175 -----------
> >  drivers/mfd/tps65912-i2c.c             | 139 ---------
> >  drivers/mfd/tps65912-irq.c             | 217 -------------
> >  drivers/mfd/tps65912-spi.c             | 141 ---------
> >  drivers/regulator/Kconfig              |   6 -
> >  drivers/regulator/Makefile             |   1 -
> >  drivers/regulator/tps65912-regulator.c | 541 ---------------------------------
> >  include/linux/mfd/tps65912.h           | 328 --------------------
> >  13 files changed, 1738 deletions(-)
> >  delete mode 100644 drivers/gpio/gpio-tps65912.c
> >  delete mode 100644 drivers/mfd/tps65912-core.c
> >  delete mode 100644 drivers/mfd/tps65912-i2c.c
> >  delete mode 100644 drivers/mfd/tps65912-irq.c
> >  delete mode 100644 drivers/mfd/tps65912-spi.c
> >  delete mode 100644 drivers/regulator/tps65912-regulator.c
> >  delete mode 100644 include/linux/mfd/tps65912.h
> > 
> > diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
> > index b4fc9e4..fb28483 100644
> > --- a/drivers/gpio/Kconfig
> > +++ b/drivers/gpio/Kconfig
> > @@ -838,12 +838,6 @@ config GPIO_TPS65910
> >  	  Select this option to enable GPIO driver for the TPS65910
> >  	  chip family.
> >  
> > -config GPIO_TPS65912
> > -	tristate "TI TPS65912 GPIO"
> > -	depends on (MFD_TPS65912_I2C || MFD_TPS65912_SPI)
> > -	help
> > -	  This driver supports TPS65912 gpio chip
> > -
> >  config GPIO_TWL4030
> >  	tristate "TWL4030, TWL5030, and TPS659x0 GPIOs"
> >  	depends on TWL4030_CORE
> > diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
> > index f79a7c4..605bf89 100644
> > --- a/drivers/gpio/Makefile
> > +++ b/drivers/gpio/Makefile
> > @@ -96,7 +96,6 @@ obj-$(CONFIG_GPIO_TIMBERDALE)	+= gpio-timberdale.o
> >  obj-$(CONFIG_GPIO_PALMAS)	+= gpio-palmas.o
> >  obj-$(CONFIG_GPIO_TPS6586X)	+= gpio-tps6586x.o
> >  obj-$(CONFIG_GPIO_TPS65910)	+= gpio-tps65910.o
> > -obj-$(CONFIG_GPIO_TPS65912)	+= gpio-tps65912.o
> >  obj-$(CONFIG_GPIO_TS5500)	+= gpio-ts5500.o
> >  obj-$(CONFIG_GPIO_TWL4030)	+= gpio-twl4030.o
> >  obj-$(CONFIG_GPIO_TWL6040)	+= gpio-twl6040.o
> > diff --git a/drivers/gpio/gpio-tps65912.c b/drivers/gpio/gpio-tps65912.c
> > deleted file mode 100644
> > index 9cdbc0c..0000000
> > --- a/drivers/gpio/gpio-tps65912.c
> > +++ /dev/null
> > @@ -1,153 +0,0 @@
> > -/*
> > - * Copyright 2011 Texas Instruments Inc.
> > - *
> > - * Author: Margarita Olaya <magi@slimlogic.co.uk>
> > - *
> > - *  This program is free software; you can redistribute it and/or modify it
> > - *  under  the terms of the GNU General  Public License as published by the
> > - *  Free Software Foundation;  either version 2 of the License, or (at your
> > - *  option) any later version.
> > - *
> > - * This driver is based on wm8350 implementation.
> > - */
> > -
> > -#include <linux/kernel.h>
> > -#include <linux/module.h>
> > -#include <linux/errno.h>
> > -#include <linux/gpio.h>
> > -#include <linux/mfd/core.h>
> > -#include <linux/platform_device.h>
> > -#include <linux/seq_file.h>
> > -#include <linux/slab.h>
> > -#include <linux/mfd/tps65912.h>
> > -
> > -struct tps65912_gpio_data {
> > -	struct tps65912 *tps65912;
> > -	struct gpio_chip gpio_chip;
> > -};
> > -
> > -#define to_tgd(gc) container_of(gc, struct tps65912_gpio_data, gpio_chip)
> > -
> > -static int tps65912_gpio_get(struct gpio_chip *gc, unsigned offset)
> > -{
> > -	struct tps65912_gpio_data *tps65912_gpio = to_tgd(gc);
> > -	struct tps65912 *tps65912 = tps65912_gpio->tps65912;
> > -	int val;
> > -
> > -	val = tps65912_reg_read(tps65912, TPS65912_GPIO1 + offset);
> > -
> > -	if (val & GPIO_STS_MASK)
> > -		return 1;
> > -
> > -	return 0;
> > -}
> > -
> > -static void tps65912_gpio_set(struct gpio_chip *gc, unsigned offset,
> > -			      int value)
> > -{
> > -	struct tps65912_gpio_data *tps65912_gpio = to_tgd(gc);
> > -	struct tps65912 *tps65912 = tps65912_gpio->tps65912;
> > -
> > -	if (value)
> > -		tps65912_set_bits(tps65912, TPS65912_GPIO1 + offset,
> > -							GPIO_SET_MASK);
> > -	else
> > -		tps65912_clear_bits(tps65912, TPS65912_GPIO1 + offset,
> > -								GPIO_SET_MASK);
> > -}
> > -
> > -static int tps65912_gpio_output(struct gpio_chip *gc, unsigned offset,
> > -				int value)
> > -{
> > -	struct tps65912_gpio_data *tps65912_gpio = to_tgd(gc);
> > -	struct tps65912 *tps65912 = tps65912_gpio->tps65912;
> > -
> > -	/* Set the initial value */
> > -	tps65912_gpio_set(gc, offset, value);
> > -
> > -	return tps65912_set_bits(tps65912, TPS65912_GPIO1 + offset,
> > -								GPIO_CFG_MASK);
> > -}
> > -
> > -static int tps65912_gpio_input(struct gpio_chip *gc, unsigned offset)
> > -{
> > -	struct tps65912_gpio_data *tps65912_gpio = to_tgd(gc);
> > -	struct tps65912 *tps65912 = tps65912_gpio->tps65912;
> > -
> > -	return tps65912_clear_bits(tps65912, TPS65912_GPIO1 + offset,
> > -								GPIO_CFG_MASK);
> > -}
> > -
> > -static struct gpio_chip template_chip = {
> > -	.label			= "tps65912",
> > -	.owner			= THIS_MODULE,
> > -	.direction_input	= tps65912_gpio_input,
> > -	.direction_output	= tps65912_gpio_output,
> > -	.get			= tps65912_gpio_get,
> > -	.set			= tps65912_gpio_set,
> > -	.can_sleep		= true,
> > -	.ngpio			= 5,
> > -	.base			= -1,
> > -};
> > -
> > -static int tps65912_gpio_probe(struct platform_device *pdev)
> > -{
> > -	struct tps65912 *tps65912 = dev_get_drvdata(pdev->dev.parent);
> > -	struct tps65912_board *pdata = dev_get_platdata(tps65912->dev);
> > -	struct tps65912_gpio_data *tps65912_gpio;
> > -	int ret;
> > -
> > -	tps65912_gpio = devm_kzalloc(&pdev->dev, sizeof(*tps65912_gpio),
> > -				     GFP_KERNEL);
> > -	if (tps65912_gpio == NULL)
> > -		return -ENOMEM;
> > -
> > -	tps65912_gpio->tps65912 = tps65912;
> > -	tps65912_gpio->gpio_chip = template_chip;
> > -	tps65912_gpio->gpio_chip.dev = &pdev->dev;
> > -	if (pdata && pdata->gpio_base)
> > -		tps65912_gpio->gpio_chip.base = pdata->gpio_base;
> > -
> > -	ret = gpiochip_add(&tps65912_gpio->gpio_chip);
> > -	if (ret < 0) {
> > -		dev_err(&pdev->dev, "Failed to register gpiochip, %d\n", ret);
> > -		return ret;
> > -	}
> > -
> > -	platform_set_drvdata(pdev, tps65912_gpio);
> > -
> > -	return ret;
> > -}
> > -
> > -static int tps65912_gpio_remove(struct platform_device *pdev)
> > -{
> > -	struct tps65912_gpio_data  *tps65912_gpio = platform_get_drvdata(pdev);
> > -
> > -	gpiochip_remove(&tps65912_gpio->gpio_chip);
> > -	return 0;
> > -}
> > -
> > -static struct platform_driver tps65912_gpio_driver = {
> > -	.driver = {
> > -		.name = "tps65912-gpio",
> > -	},
> > -	.probe = tps65912_gpio_probe,
> > -	.remove = tps65912_gpio_remove,
> > -};
> > -
> > -static int __init tps65912_gpio_init(void)
> > -{
> > -	return platform_driver_register(&tps65912_gpio_driver);
> > -}
> > -subsys_initcall(tps65912_gpio_init);
> > -
> > -static void __exit tps65912_gpio_exit(void)
> > -{
> > -	platform_driver_unregister(&tps65912_gpio_driver);
> > -}
> > -module_exit(tps65912_gpio_exit);
> > -
> > -MODULE_AUTHOR("Margarita Olaya Cabrera <magi@slimlogic.co.uk>");
> > -MODULE_DESCRIPTION("GPIO interface for TPS65912 PMICs");
> > -MODULE_LICENSE("GPL v2");
> > -MODULE_ALIAS("platform:tps65912-gpio");
> > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > index 99d6367..9a8df8e 100644
> > --- a/drivers/mfd/Kconfig
> > +++ b/drivers/mfd/Kconfig
> > @@ -1167,32 +1167,6 @@ config MFD_TPS65910
> >  	  if you say yes here you get support for the TPS65910 series of
> >  	  Power Management chips.
> >  
> > -config MFD_TPS65912
> > -	bool "TI TPS65912 Power Management chip"
> > -	depends on GPIOLIB
> > -	select MFD_CORE
> > -	help
> > -	  If you say yes here you get support for the TPS65912 series of
> > -	  PM chips.
> > -
> > -config MFD_TPS65912_I2C
> > -	bool "TI TPS65912 Power Management chip with I2C"
> > -	select MFD_CORE
> > -	select MFD_TPS65912
> > -	depends on I2C=y && GPIOLIB
> > -	help
> > -	  If you say yes here you get support for the TPS65912 series of
> > -	  PM chips with I2C interface.
> > -
> > -config MFD_TPS65912_SPI
> > -	bool "TI TPS65912 Power Management chip with SPI"
> > -	select MFD_CORE
> > -	select MFD_TPS65912
> > -	depends on SPI_MASTER && GPIOLIB
> > -	help
> > -	  If you say yes here you get support for the TPS65912 series of
> > -	  PM chips with SPI interface.
> > -
> >  config MFD_TPS80031
> >  	bool "TI TPS80031/TPS80032 Power Management chips"
> >  	depends on I2C=y
> > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> > index a59e3fc..004aa76 100644
> > --- a/drivers/mfd/Makefile
> > +++ b/drivers/mfd/Makefile
> > @@ -69,10 +69,6 @@ obj-$(CONFIG_TPS6507X)		+= tps6507x.o
> >  obj-$(CONFIG_MFD_TPS65217)	+= tps65217.o
> >  obj-$(CONFIG_MFD_TPS65218)	+= tps65218.o
> >  obj-$(CONFIG_MFD_TPS65910)	+= tps65910.o
> > -tps65912-objs                   := tps65912-core.o tps65912-irq.o
> > -obj-$(CONFIG_MFD_TPS65912)	+= tps65912.o
> > -obj-$(CONFIG_MFD_TPS65912_I2C)	+= tps65912-i2c.o
> > -obj-$(CONFIG_MFD_TPS65912_SPI)  += tps65912-spi.o
> >  obj-$(CONFIG_MFD_TPS80031)	+= tps80031.o
> >  obj-$(CONFIG_MENELAUS)		+= menelaus.o
> >  
> > diff --git a/drivers/mfd/tps65912-core.c b/drivers/mfd/tps65912-core.c
> > deleted file mode 100644
> > index 1f82d60..0000000
> > --- a/drivers/mfd/tps65912-core.c
> > +++ /dev/null
> > @@ -1,175 +0,0 @@
> > -/*
> > - * tps65912-core.c  --  TI TPS65912x
> > - *
> > - * Copyright 2011 Texas Instruments Inc.
> > - *
> > - * Author: Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> > - *
> > - *  This program is free software; you can redistribute it and/or modify it
> > - *  under  the terms of the GNU General  Public License as published by the
> > - *  Free Software Foundation;  either version 2 of the License, or (at your
> > - *  option) any later version.
> > - *
> > - *  This driver is based on wm8350 implementation.
> > - */
> > -
> > -#include <linux/module.h>
> > -#include <linux/moduleparam.h>
> > -#include <linux/slab.h>
> > -#include <linux/gpio.h>
> > -#include <linux/mfd/core.h>
> > -#include <linux/mfd/tps65912.h>
> > -
> > -static const struct mfd_cell tps65912s[] = {
> > -	{
> > -		.name = "tps65912-pmic",
> > -	},
> > -};
> > -
> > -int tps65912_set_bits(struct tps65912 *tps65912, u8 reg, u8 mask)
> > -{
> > -	u8 data;
> > -	int err;
> > -
> > -	mutex_lock(&tps65912->io_mutex);
> > -
> > -	err = tps65912->read(tps65912, reg, 1, &data);
> > -	if (err) {
> > -		dev_err(tps65912->dev, "Read from reg 0x%x failed\n", reg);
> > -		goto out;
> > -	}
> > -
> > -	data |= mask;
> > -	err = tps65912->write(tps65912, reg, 1, &data);
> > -	if (err)
> > -		dev_err(tps65912->dev, "Write to reg 0x%x failed\n", reg);
> > -
> > -out:
> > -	mutex_unlock(&tps65912->io_mutex);
> > -	return err;
> > -}
> > -EXPORT_SYMBOL_GPL(tps65912_set_bits);
> > -
> > -int tps65912_clear_bits(struct tps65912 *tps65912, u8 reg, u8 mask)
> > -{
> > -	u8 data;
> > -	int err;
> > -
> > -	mutex_lock(&tps65912->io_mutex);
> > -	err = tps65912->read(tps65912, reg, 1, &data);
> > -	if (err) {
> > -		dev_err(tps65912->dev, "Read from reg 0x%x failed\n", reg);
> > -		goto out;
> > -	}
> > -
> > -	data &= ~mask;
> > -	err = tps65912->write(tps65912, reg, 1, &data);
> > -	if (err)
> > -		dev_err(tps65912->dev, "Write to reg 0x%x failed\n", reg);
> > -
> > -out:
> > -	mutex_unlock(&tps65912->io_mutex);
> > -	return err;
> > -}
> > -EXPORT_SYMBOL_GPL(tps65912_clear_bits);
> > -
> > -static inline int tps65912_read(struct tps65912 *tps65912, u8 reg)
> > -{
> > -	u8 val;
> > -	int err;
> > -
> > -	err = tps65912->read(tps65912, reg, 1, &val);
> > -	if (err < 0)
> > -		return err;
> > -
> > -	return val;
> > -}
> > -
> > -static inline int tps65912_write(struct tps65912 *tps65912, u8 reg, u8 val)
> > -{
> > -	return tps65912->write(tps65912, reg, 1, &val);
> > -}
> > -
> > -int tps65912_reg_read(struct tps65912 *tps65912, u8 reg)
> > -{
> > -	int data;
> > -
> > -	mutex_lock(&tps65912->io_mutex);
> > -
> > -	data = tps65912_read(tps65912, reg);
> > -	if (data < 0)
> > -		dev_err(tps65912->dev, "Read from reg 0x%x failed\n", reg);
> > -
> > -	mutex_unlock(&tps65912->io_mutex);
> > -	return data;
> > -}
> > -EXPORT_SYMBOL_GPL(tps65912_reg_read);
> > -
> > -int tps65912_reg_write(struct tps65912 *tps65912, u8 reg, u8 val)
> > -{
> > -	int err;
> > -
> > -	mutex_lock(&tps65912->io_mutex);
> > -
> > -	err = tps65912_write(tps65912, reg, val);
> > -	if (err < 0)
> > -		dev_err(tps65912->dev, "Write for reg 0x%x failed\n", reg);
> > -
> > -	mutex_unlock(&tps65912->io_mutex);
> > -	return err;
> > -}
> > -EXPORT_SYMBOL_GPL(tps65912_reg_write);
> > -
> > -int tps65912_device_init(struct tps65912 *tps65912)
> > -{
> > -	struct tps65912_board *pmic_plat_data = dev_get_platdata(tps65912->dev);
> > -	struct tps65912_platform_data *init_data;
> > -	int ret, dcdc_avs, value;
> > -
> > -	init_data = kzalloc(sizeof(struct tps65912_platform_data), GFP_KERNEL);
> > -	if (init_data == NULL)
> > -		return -ENOMEM;
> > -
> > -	mutex_init(&tps65912->io_mutex);
> > -	dev_set_drvdata(tps65912->dev, tps65912);
> > -
> > -	dcdc_avs = (pmic_plat_data->is_dcdc1_avs << 0 |
> > -			pmic_plat_data->is_dcdc2_avs  << 1 |
> > -				pmic_plat_data->is_dcdc3_avs << 2 |
> > -					pmic_plat_data->is_dcdc4_avs << 3);
> > -	if (dcdc_avs) {
> > -		tps65912->read(tps65912, TPS65912_I2C_SPI_CFG, 1, &value);
> > -		dcdc_avs |= value;
> > -		tps65912->write(tps65912, TPS65912_I2C_SPI_CFG, 1, &dcdc_avs);
> > -	}
> > -
> > -	ret = mfd_add_devices(tps65912->dev, -1,
> > -			      tps65912s, ARRAY_SIZE(tps65912s),
> > -			      NULL, 0, NULL);
> > -	if (ret < 0)
> > -		goto err;
> > -
> > -	init_data->irq = pmic_plat_data->irq;
> > -	init_data->irq_base = pmic_plat_data->irq_base;
> > -	ret = tps65912_irq_init(tps65912, init_data->irq, init_data);
> > -	if (ret < 0)
> > -		goto err;
> > -
> > -	kfree(init_data);
> > -	return ret;
> > -
> > -err:
> > -	kfree(init_data);
> > -	mfd_remove_devices(tps65912->dev);
> > -	return ret;
> > -}
> > -
> > -void tps65912_device_exit(struct tps65912 *tps65912)
> > -{
> > -	mfd_remove_devices(tps65912->dev);
> > -	tps65912_irq_exit(tps65912);
> > -}
> > -
> > -MODULE_AUTHOR("Margarita Olaya	<magi@slimlogic.co.uk>");
> > -MODULE_DESCRIPTION("TPS65912x chip family multi-function driver");
> > -MODULE_LICENSE("GPL");
> > diff --git a/drivers/mfd/tps65912-i2c.c b/drivers/mfd/tps65912-i2c.c
> > deleted file mode 100644
> > index 7e55640..0000000
> > --- a/drivers/mfd/tps65912-i2c.c
> > +++ /dev/null
> > @@ -1,139 +0,0 @@
> > -/*
> > - * tps65912-i2c.c  --  I2C access for TI TPS65912x PMIC
> > - *
> > - * Copyright 2011 Texas Instruments Inc.
> > - *
> > - * Author: Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> > - *
> > - *  This program is free software; you can redistribute it and/or modify it
> > - *  under  the terms of the GNU General  Public License as published by the
> > - *  Free Software Foundation;  either version 2 of the License, or (at your
> > - *  option) any later version.
> > - *
> > - *  This driver is based on wm8350 implementation.
> > - */
> > -
> > -#include <linux/module.h>
> > -#include <linux/moduleparam.h>
> > -#include <linux/init.h>
> > -#include <linux/slab.h>
> > -#include <linux/gpio.h>
> > -#include <linux/i2c.h>
> > -#include <linux/mfd/core.h>
> > -#include <linux/mfd/tps65912.h>
> > -
> > -static int tps65912_i2c_read(struct tps65912 *tps65912, u8 reg,
> > -				  int bytes, void *dest)
> > -{
> > -	struct i2c_client *i2c = tps65912->control_data;
> > -	struct i2c_msg xfer[2];
> > -	int ret;
> > -
> > -	/* Write register */
> > -	xfer[0].addr = i2c->addr;
> > -	xfer[0].flags = 0;
> > -	xfer[0].len = 1;
> > -	xfer[0].buf = &reg;
> > -
> > -	/* Read data */
> > -	xfer[1].addr = i2c->addr;
> > -	xfer[1].flags = I2C_M_RD;
> > -	xfer[1].len = bytes;
> > -	xfer[1].buf = dest;
> > -
> > -	ret = i2c_transfer(i2c->adapter, xfer, 2);
> > -	if (ret == 2)
> > -		ret = 0;
> > -	else if (ret >= 0)
> > -		ret = -EIO;
> > -	return ret;
> > -}
> > -
> > -static int tps65912_i2c_write(struct tps65912 *tps65912, u8 reg,
> > -				   int bytes, void *src)
> > -{
> > -	struct i2c_client *i2c = tps65912->control_data;
> > -	/* we add 1 byte for device register */
> > -	u8 msg[TPS6591X_MAX_REGISTER + 1];
> > -	int ret;
> > -
> > -	if (bytes > TPS6591X_MAX_REGISTER)
> > -		return -EINVAL;
> > -
> > -	msg[0] = reg;
> > -	memcpy(&msg[1], src, bytes);
> > -
> > -	ret = i2c_master_send(i2c, msg, bytes + 1);
> > -	if (ret < 0)
> > -		return ret;
> > -	if (ret != bytes + 1)
> > -		return -EIO;
> > -
> > -	return 0;
> > -}
> > -
> > -static int tps65912_i2c_probe(struct i2c_client *i2c,
> > -			    const struct i2c_device_id *id)
> > -{
> > -	struct tps65912 *tps65912;
> > -
> > -	tps65912 = devm_kzalloc(&i2c->dev,
> > -				sizeof(struct tps65912), GFP_KERNEL);
> > -	if (tps65912 == NULL)
> > -		return -ENOMEM;
> > -
> > -	i2c_set_clientdata(i2c, tps65912);
> > -	tps65912->dev = &i2c->dev;
> > -	tps65912->control_data = i2c;
> > -	tps65912->read = tps65912_i2c_read;
> > -	tps65912->write = tps65912_i2c_write;
> > -
> > -	return tps65912_device_init(tps65912);
> > -}
> > -
> > -static int tps65912_i2c_remove(struct i2c_client *i2c)
> > -{
> > -	struct tps65912 *tps65912 = i2c_get_clientdata(i2c);
> > -
> > -	tps65912_device_exit(tps65912);
> > -
> > -	return 0;
> > -}
> > -
> > -static const struct i2c_device_id tps65912_i2c_id[] = {
> > -	{"tps65912", 0 },
> > -	{ }
> > -};
> > -MODULE_DEVICE_TABLE(i2c, tps65912_i2c_id);
> > -
> > -static struct i2c_driver tps65912_i2c_driver = {
> > -	.driver = {
> > -		   .name = "tps65912",
> > -	},
> > -	.probe = tps65912_i2c_probe,
> > -	.remove = tps65912_i2c_remove,
> > -	.id_table = tps65912_i2c_id,
> > -};
> > -
> > -static int __init tps65912_i2c_init(void)
> > -{
> > -	int ret;
> > -
> > -	ret = i2c_add_driver(&tps65912_i2c_driver);
> > -	if (ret != 0)
> > -		pr_err("Failed to register TPS65912 I2C driver: %d\n", ret);
> > -
> > -	return ret;
> > -}
> > -/* init early so consumer devices can complete system boot */
> > -subsys_initcall(tps65912_i2c_init);
> > -
> > -static void __exit tps65912_i2c_exit(void)
> > -{
> > -	i2c_del_driver(&tps65912_i2c_driver);
> > -}
> > -module_exit(tps65912_i2c_exit);
> > -
> > -MODULE_AUTHOR("Margarita Olaya	<magi@slimlogic.co.uk>");
> > -MODULE_DESCRIPTION("TPS6591x chip family multi-function driver");
> > -MODULE_LICENSE("GPL");
> > diff --git a/drivers/mfd/tps65912-irq.c b/drivers/mfd/tps65912-irq.c
> > deleted file mode 100644
> > index db2c29c..0000000
> > --- a/drivers/mfd/tps65912-irq.c
> > +++ /dev/null
> > @@ -1,217 +0,0 @@
> > -/*
> > - * tps65912-irq.c  --  TI TPS6591x
> > - *
> > - * Copyright 2011 Texas Instruments Inc.
> > - *
> > - * Author: Margarita Olaya <magi@slimlogic.co.uk>
> > - *
> > - *  This program is free software; you can redistribute it and/or modify it
> > - *  under  the terms of the GNU General  Public License as published by the
> > - *  Free Software Foundation;  either version 2 of the License, or (at your
> > - *  option) any later version.
> > - *
> > - * This driver is based on wm8350 implementation.
> > - */
> > -
> > -#include <linux/kernel.h>
> > -#include <linux/module.h>
> > -#include <linux/bug.h>
> > -#include <linux/device.h>
> > -#include <linux/interrupt.h>
> > -#include <linux/irq.h>
> > -#include <linux/gpio.h>
> > -#include <linux/mfd/tps65912.h>
> > -
> > -static inline int irq_to_tps65912_irq(struct tps65912 *tps65912,
> > -							int irq)
> > -{
> > -	return irq - tps65912->irq_base;
> > -}
> > -
> > -/*
> > - * This is a threaded IRQ handler so can access I2C/SPI.  Since the
> > - * IRQ handler explicitly clears the IRQ it handles the IRQ line
> > - * will be reasserted and the physical IRQ will be handled again if
> > - * another interrupt is asserted while we run - in the normal course
> > - * of events this is a rare occurrence so we save I2C/SPI reads. We're
> > - * also assuming that it's rare to get lots of interrupts firing
> > - * simultaneously so try to minimise I/O.
> > - */
> > -static irqreturn_t tps65912_irq(int irq, void *irq_data)
> > -{
> > -	struct tps65912 *tps65912 = irq_data;
> > -	u32 irq_sts;
> > -	u32 irq_mask;
> > -	u8 reg;
> > -	int i;
> > -
> > -
> > -	tps65912->read(tps65912, TPS65912_INT_STS, 1, &reg);
> > -	irq_sts = reg;
> > -	tps65912->read(tps65912, TPS65912_INT_STS2, 1, &reg);
> > -	irq_sts |= reg << 8;
> > -	tps65912->read(tps65912, TPS65912_INT_STS3, 1, &reg);
> > -	irq_sts |= reg << 16;
> > -	tps65912->read(tps65912, TPS65912_INT_STS4, 1, &reg);
> > -	irq_sts |= reg << 24;
> > -
> > -	tps65912->read(tps65912, TPS65912_INT_MSK, 1, &reg);
> > -	irq_mask = reg;
> > -	tps65912->read(tps65912, TPS65912_INT_MSK2, 1, &reg);
> > -	irq_mask |= reg << 8;
> > -	tps65912->read(tps65912, TPS65912_INT_MSK3, 1, &reg);
> > -	irq_mask |= reg << 16;
> > -	tps65912->read(tps65912, TPS65912_INT_MSK4, 1, &reg);
> > -	irq_mask |= reg << 24;
> > -
> > -	irq_sts &= ~irq_mask;
> > -	if (!irq_sts)
> > -		return IRQ_NONE;
> > -
> > -	for (i = 0; i < tps65912->irq_num; i++) {
> > -		if (!(irq_sts & (1 << i)))
> > -			continue;
> > -
> > -		handle_nested_irq(tps65912->irq_base + i);
> > -	}
> > -
> > -	/* Write the STS register back to clear IRQs we handled */
> > -	reg = irq_sts & 0xFF;
> > -	irq_sts >>= 8;
> > -	if (reg)
> > -		tps65912->write(tps65912, TPS65912_INT_STS, 1, &reg);
> > -	reg = irq_sts & 0xFF;
> > -	irq_sts >>= 8;
> > -	if (reg)
> > -		tps65912->write(tps65912, TPS65912_INT_STS2, 1, &reg);
> > -	reg = irq_sts & 0xFF;
> > -	irq_sts >>= 8;
> > -	if (reg)
> > -		tps65912->write(tps65912, TPS65912_INT_STS3, 1, &reg);
> > -	reg = irq_sts & 0xFF;
> > -	if (reg)
> > -		tps65912->write(tps65912, TPS65912_INT_STS4, 1, &reg);
> > -
> > -	return IRQ_HANDLED;
> > -}
> > -
> > -static void tps65912_irq_lock(struct irq_data *data)
> > -{
> > -	struct tps65912 *tps65912 = irq_data_get_irq_chip_data(data);
> > -
> > -	mutex_lock(&tps65912->irq_lock);
> > -}
> > -
> > -static void tps65912_irq_sync_unlock(struct irq_data *data)
> > -{
> > -	struct tps65912 *tps65912 = irq_data_get_irq_chip_data(data);
> > -	u32 reg_mask;
> > -	u8 reg;
> > -
> > -	tps65912->read(tps65912, TPS65912_INT_MSK, 1, &reg);
> > -	reg_mask = reg;
> > -	tps65912->read(tps65912, TPS65912_INT_MSK2, 1, &reg);
> > -	reg_mask |= reg << 8;
> > -	tps65912->read(tps65912, TPS65912_INT_MSK3, 1, &reg);
> > -	reg_mask |= reg << 16;
> > -	tps65912->read(tps65912, TPS65912_INT_MSK4, 1, &reg);
> > -	reg_mask |= reg << 24;
> > -
> > -	if (tps65912->irq_mask != reg_mask) {
> > -		reg = tps65912->irq_mask & 0xFF;
> > -		tps65912->write(tps65912, TPS65912_INT_MSK, 1, &reg);
> > -		reg = tps65912->irq_mask >> 8 & 0xFF;
> > -		tps65912->write(tps65912, TPS65912_INT_MSK2, 1, &reg);
> > -		reg = tps65912->irq_mask >> 16 & 0xFF;
> > -		tps65912->write(tps65912, TPS65912_INT_MSK3, 1, &reg);
> > -		reg = tps65912->irq_mask >> 24 & 0xFF;
> > -		tps65912->write(tps65912, TPS65912_INT_MSK4, 1, &reg);
> > -	}
> > -
> > -	mutex_unlock(&tps65912->irq_lock);
> > -}
> > -
> > -static void tps65912_irq_enable(struct irq_data *data)
> > -{
> > -	struct tps65912 *tps65912 = irq_data_get_irq_chip_data(data);
> > -
> > -	tps65912->irq_mask &= ~(1 << irq_to_tps65912_irq(tps65912, data->irq));
> > -}
> > -
> > -static void tps65912_irq_disable(struct irq_data *data)
> > -{
> > -	struct tps65912 *tps65912 = irq_data_get_irq_chip_data(data);
> > -
> > -	tps65912->irq_mask |= (1 << irq_to_tps65912_irq(tps65912, data->irq));
> > -}
> > -
> > -static struct irq_chip tps65912_irq_chip = {
> > -	.name = "tps65912",
> > -	.irq_bus_lock = tps65912_irq_lock,
> > -	.irq_bus_sync_unlock = tps65912_irq_sync_unlock,
> > -	.irq_disable = tps65912_irq_disable,
> > -	.irq_enable = tps65912_irq_enable,
> > -};
> > -
> > -int tps65912_irq_init(struct tps65912 *tps65912, int irq,
> > -			    struct tps65912_platform_data *pdata)
> > -{
> > -	int ret, cur_irq;
> > -	int flags = IRQF_ONESHOT;
> > -	u8 reg;
> > -
> > -	if (!irq) {
> > -		dev_warn(tps65912->dev, "No interrupt support, no core IRQ\n");
> > -		return 0;
> > -	}
> > -
> > -	if (!pdata || !pdata->irq_base) {
> > -		dev_warn(tps65912->dev, "No interrupt support, no IRQ base\n");
> > -		return 0;
> > -	}
> > -
> > -	/* Clear unattended interrupts */
> > -	tps65912->read(tps65912, TPS65912_INT_STS, 1, &reg);
> > -	tps65912->write(tps65912, TPS65912_INT_STS, 1, &reg);
> > -	tps65912->read(tps65912, TPS65912_INT_STS2, 1, &reg);
> > -	tps65912->write(tps65912, TPS65912_INT_STS2, 1, &reg);
> > -	tps65912->read(tps65912, TPS65912_INT_STS3, 1, &reg);
> > -	tps65912->write(tps65912, TPS65912_INT_STS3, 1, &reg);
> > -	tps65912->read(tps65912, TPS65912_INT_STS4, 1, &reg);
> > -	tps65912->write(tps65912, TPS65912_INT_STS4, 1, &reg);
> > -
> > -	/* Mask top level interrupts */
> > -	tps65912->irq_mask = 0xFFFFFFFF;
> > -
> > -	mutex_init(&tps65912->irq_lock);
> > -	tps65912->chip_irq = irq;
> > -	tps65912->irq_base = pdata->irq_base;
> > -
> > -	tps65912->irq_num = TPS65912_NUM_IRQ;
> > -
> > -	/* Register with genirq */
> > -	for (cur_irq = tps65912->irq_base;
> > -	     cur_irq < tps65912->irq_num + tps65912->irq_base;
> > -	     cur_irq++) {
> > -		irq_set_chip_data(cur_irq, tps65912);
> > -		irq_set_chip_and_handler(cur_irq, &tps65912_irq_chip,
> > -					 handle_edge_irq);
> > -		irq_set_nested_thread(cur_irq, 1);
> > -		irq_clear_status_flags(cur_irq, IRQ_NOREQUEST | IRQ_NOPROBE);
> > -	}
> > -
> > -	ret = request_threaded_irq(irq, NULL, tps65912_irq, flags,
> > -				   "tps65912", tps65912);
> > -
> > -	irq_set_irq_type(irq, IRQ_TYPE_LEVEL_LOW);
> > -	if (ret != 0)
> > -		dev_err(tps65912->dev, "Failed to request IRQ: %d\n", ret);
> > -
> > -	return ret;
> > -}
> > -
> > -int tps65912_irq_exit(struct tps65912 *tps65912)
> > -{
> > -	free_irq(tps65912->chip_irq, tps65912);
> > -	return 0;
> > -}
> > diff --git a/drivers/mfd/tps65912-spi.c b/drivers/mfd/tps65912-spi.c
> > deleted file mode 100644
> > index de60ad9..0000000
> > --- a/drivers/mfd/tps65912-spi.c
> > +++ /dev/null
> > @@ -1,141 +0,0 @@
> > -/*
> > - * tps65912-spi.c  --  SPI access for TI TPS65912x PMIC
> > - *
> > - * Copyright 2011 Texas Instruments Inc.
> > - *
> > - * Author: Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> > - *
> > - *  This program is free software; you can redistribute it and/or modify it
> > - *  under  the terms of the GNU General  Public License as published by the
> > - *  Free Software Foundation;  either version 2 of the License, or (at your
> > - *  option) any later version.
> > - *
> > - *  This driver is based on wm8350 implementation.
> > - */
> > -
> > -#include <linux/module.h>
> > -#include <linux/moduleparam.h>
> > -#include <linux/init.h>
> > -#include <linux/slab.h>
> > -#include <linux/gpio.h>
> > -#include <linux/spi/spi.h>
> > -#include <linux/mfd/core.h>
> > -#include <linux/mfd/tps65912.h>
> > -
> > -static int tps65912_spi_write(struct tps65912 *tps65912, u8 addr,
> > -							int bytes, void *src)
> > -{
> > -	struct spi_device *spi = tps65912->control_data;
> > -	u8 *data = (u8 *) src;
> > -	int ret;
> > -	/* bit 23 is the read/write bit */
> > -	unsigned long spi_data = 1 << 23 | addr << 15 | *data;
> > -	struct spi_transfer xfer;
> > -	struct spi_message msg;
> > -	u32 tx_buf;
> > -
> > -	tx_buf = spi_data;
> > -
> > -	xfer.tx_buf	= &tx_buf;
> > -	xfer.rx_buf	= NULL;
> > -	xfer.len	= sizeof(unsigned long);
> > -	xfer.bits_per_word = 24;
> > -
> > -	spi_message_init(&msg);
> > -	spi_message_add_tail(&xfer, &msg);
> > -
> > -	ret = spi_sync(spi, &msg);
> > -	return ret;
> > -}
> > -
> > -static int tps65912_spi_read(struct tps65912 *tps65912, u8 addr,
> > -							int bytes, void *dest)
> > -{
> > -	struct spi_device *spi = tps65912->control_data;
> > -	/* bit 23 is the read/write bit */
> > -	unsigned long spi_data = 0 << 23 | addr << 15;
> > -	struct spi_transfer xfer;
> > -	struct spi_message msg;
> > -	int ret;
> > -	u8 *data = (u8 *) dest;
> > -	u32 tx_buf, rx_buf;
> > -
> > -	tx_buf = spi_data;
> > -	rx_buf = 0;
> > -
> > -	xfer.tx_buf	= &tx_buf;
> > -	xfer.rx_buf	= &rx_buf;
> > -	xfer.len	= sizeof(unsigned long);
> > -	xfer.bits_per_word = 24;
> > -
> > -	spi_message_init(&msg);
> > -	spi_message_add_tail(&xfer, &msg);
> > -
> > -	if (spi == NULL)
> > -		return 0;
> > -
> > -	ret = spi_sync(spi, &msg);
> > -	if (ret == 0)
> > -		*data = (u8) (rx_buf & 0xFF);
> > -	return ret;
> > -}
> > -
> > -static int tps65912_spi_probe(struct spi_device *spi)
> > -{
> > -	struct tps65912 *tps65912;
> > -
> > -	tps65912 = devm_kzalloc(&spi->dev,
> > -				sizeof(struct tps65912), GFP_KERNEL);
> > -	if (tps65912 == NULL)
> > -		return -ENOMEM;
> > -
> > -	tps65912->dev = &spi->dev;
> > -	tps65912->control_data = spi;
> > -	tps65912->read = tps65912_spi_read;
> > -	tps65912->write = tps65912_spi_write;
> > -
> > -	spi_set_drvdata(spi, tps65912);
> > -
> > -	return tps65912_device_init(tps65912);
> > -}
> > -
> > -static int tps65912_spi_remove(struct spi_device *spi)
> > -{
> > -	struct tps65912 *tps65912 = spi_get_drvdata(spi);
> > -
> > -	tps65912_device_exit(tps65912);
> > -
> > -	return 0;
> > -}
> > -
> > -static struct spi_driver tps65912_spi_driver = {
> > -	.driver = {
> > -		.name = "tps65912",
> > -		.owner = THIS_MODULE,
> > -	},
> > -	.probe	= tps65912_spi_probe,
> > -	.remove = tps65912_spi_remove,
> > -};
> > -
> > -static int __init tps65912_spi_init(void)
> > -{
> > -	int ret;
> > -
> > -	ret = spi_register_driver(&tps65912_spi_driver);
> > -	if (ret != 0)
> > -		pr_err("Failed to register TPS65912 SPI driver: %d\n", ret);
> > -
> > -	return 0;
> > -}
> > -/* init early so consumer devices can complete system boot */
> > -subsys_initcall(tps65912_spi_init);
> > -
> > -static void __exit tps65912_spi_exit(void)
> > -{
> > -	spi_unregister_driver(&tps65912_spi_driver);
> > -}
> > -module_exit(tps65912_spi_exit);
> > -
> > -MODULE_AUTHOR("Margarita Olaya	<magi@slimlogic.co.uk>");
> > -MODULE_DESCRIPTION("SPI support for TPS65912 chip family mfd");
> > -MODULE_LICENSE("GPL");
> > diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
> > index 64bccff..3cb2de9 100644
> > --- a/drivers/regulator/Kconfig
> > +++ b/drivers/regulator/Kconfig
> > @@ -727,12 +727,6 @@ config REGULATOR_TPS65910
> >  	help
> >  	  This driver supports TPS65910/TPS65911 voltage regulator chips.
> >  
> > -config REGULATOR_TPS65912
> > -	tristate "TI TPS65912 Power regulator"
> > -	depends on (MFD_TPS65912_I2C || MFD_TPS65912_SPI)
> > -	help
> > -	    This driver supports TPS65912 voltage regulator chip.
> > -
> >  config REGULATOR_TPS80031
> >  	tristate "TI TPS80031/TPS80032 power regualtor driver"
> >  	depends on MFD_TPS80031
> > diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
> > index 0f81749..222ff5f 100644
> > --- a/drivers/regulator/Makefile
> > +++ b/drivers/regulator/Makefile
> > @@ -91,7 +91,6 @@ obj-$(CONFIG_REGULATOR_TPS65218) += tps65218-regulator.o
> >  obj-$(CONFIG_REGULATOR_TPS6524X) += tps6524x-regulator.o
> >  obj-$(CONFIG_REGULATOR_TPS6586X) += tps6586x-regulator.o
> >  obj-$(CONFIG_REGULATOR_TPS65910) += tps65910-regulator.o
> > -obj-$(CONFIG_REGULATOR_TPS65912) += tps65912-regulator.o
> >  obj-$(CONFIG_REGULATOR_TPS80031) += tps80031-regulator.o
> >  obj-$(CONFIG_REGULATOR_TWL4030) += twl-regulator.o
> >  obj-$(CONFIG_REGULATOR_VEXPRESS) += vexpress.o
> > diff --git a/drivers/regulator/tps65912-regulator.c b/drivers/regulator/tps65912-regulator.c
> > deleted file mode 100644
> > index 9503d54..0000000
> > --- a/drivers/regulator/tps65912-regulator.c
> > +++ /dev/null
> > @@ -1,541 +0,0 @@
> > -/*
> > - * tps65912.c  --  TI tps65912
> > - *
> > - * Copyright 2011 Texas Instruments Inc.
> > - *
> > - * Author: Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> > - *
> > - *  This program is free software; you can redistribute it and/or modify it
> > - *  under  the terms of the GNU General  Public License as published by the
> > - *  Free Software Foundation;  either version 2 of the License, or (at your
> > - *  option) any later version.
> > - *
> > - * This driver is based on wm8350 implementation.
> > - */
> > -
> > -#include <linux/kernel.h>
> > -#include <linux/module.h>
> > -#include <linux/init.h>
> > -#include <linux/err.h>
> > -#include <linux/platform_device.h>
> > -#include <linux/regulator/driver.h>
> > -#include <linux/regulator/machine.h>
> > -#include <linux/slab.h>
> > -#include <linux/gpio.h>
> > -#include <linux/mfd/tps65912.h>
> > -
> > -/* DCDC's */
> > -#define TPS65912_REG_DCDC1	0
> > -#define TPS65912_REG_DCDC2	1
> > -#define TPS65912_REG_DCDC3	2
> > -#define TPS65912_REG_DCDC4	3
> > -
> > -/* LDOs */
> > -#define TPS65912_REG_LDO1	4
> > -#define TPS65912_REG_LDO2	5
> > -#define TPS65912_REG_LDO3	6
> > -#define TPS65912_REG_LDO4	7
> > -#define TPS65912_REG_LDO5	8
> > -#define TPS65912_REG_LDO6	9
> > -#define TPS65912_REG_LDO7	10
> > -#define TPS65912_REG_LDO8	11
> > -#define TPS65912_REG_LDO9	12
> > -#define TPS65912_REG_LDO10	13
> > -
> > -/* Number of step-down converters available */
> > -#define TPS65912_NUM_DCDC	4
> > -
> > -/* Number of LDO voltage regulators  available */
> > -#define TPS65912_NUM_LDO	10
> > -
> > -/* Number of total regulators available */
> > -#define TPS65912_NUM_REGULATOR		(TPS65912_NUM_DCDC + TPS65912_NUM_LDO)
> > -
> > -#define TPS65912_REG_ENABLED	0x80
> > -#define OP_SELREG_MASK		0x40
> > -#define OP_SELREG_SHIFT		6
> > -
> > -struct tps_info {
> > -	const char *name;
> > -};
> > -
> > -static struct tps_info tps65912_regs[] = {
> > -	{
> > -		.name = "DCDC1",
> > -	},
> > -	{
> > -		.name = "DCDC2",
> > -	},
> > -	{
> > -		.name = "DCDC3",
> > -	},
> > -	{
> > -		.name = "DCDC4",
> > -	},
> > -	{
> > -		.name = "LDO1",
> > -	},
> > -	{
> > -		.name = "LDO2",
> > -	},
> > -	{
> > -		.name = "LDO3",
> > -	},
> > -	{
> > -		.name = "LDO4",
> > -	},
> > -	{
> > -		.name = "LDO5",
> > -	},
> > -	{
> > -		.name = "LDO6",
> > -	},
> > -	{
> > -		.name = "LDO7",
> > -	},
> > -	{
> > -		.name = "LDO8",
> > -	},
> > -	{
> > -		.name = "LDO9",
> > -	},
> > -	{
> > -		.name = "LDO10",
> > -	},
> > -};
> > -
> > -struct tps65912_reg {
> > -	struct regulator_desc desc[TPS65912_NUM_REGULATOR];
> > -	struct tps65912 *mfd;
> > -	struct regulator_dev *rdev[TPS65912_NUM_REGULATOR];
> > -	struct tps_info *info[TPS65912_NUM_REGULATOR];
> > -	/* for read/write access */
> > -	struct mutex io_lock;
> > -	int mode;
> > -	int (*get_ctrl_reg)(int);
> > -	int dcdc_range[TPS65912_NUM_DCDC];
> > -	int pwm_mode_reg;
> > -	int eco_reg;
> > -};
> > -
> > -static const struct regulator_linear_range tps65912_ldo_ranges[] = {
> > -	REGULATOR_LINEAR_RANGE(800000, 0, 32, 25000),
> > -	REGULATOR_LINEAR_RANGE(1650000, 33, 60, 50000),
> > -	REGULATOR_LINEAR_RANGE(3100000, 61, 63, 100000),
> > -};
> > -
> > -static int tps65912_get_range(struct tps65912_reg *pmic, int id)
> > -{
> > -	struct tps65912 *mfd = pmic->mfd;
> > -	int range;
> > -
> > -	switch (id) {
> > -	case TPS65912_REG_DCDC1:
> > -		range = tps65912_reg_read(mfd, TPS65912_DCDC1_LIMIT);
> > -		break;
> > -	case TPS65912_REG_DCDC2:
> > -		range = tps65912_reg_read(mfd, TPS65912_DCDC2_LIMIT);
> > -		break;
> > -	case TPS65912_REG_DCDC3:
> > -		range = tps65912_reg_read(mfd, TPS65912_DCDC3_LIMIT);
> > -		break;
> > -	case TPS65912_REG_DCDC4:
> > -		range = tps65912_reg_read(mfd, TPS65912_DCDC4_LIMIT);
> > -		break;
> > -	default:
> > -		return 0;
> > -	}
> > -
> > -	if (range >= 0)
> > -		range = (range & DCDC_LIMIT_RANGE_MASK)
> > -			>> DCDC_LIMIT_RANGE_SHIFT;
> > -
> > -	pmic->dcdc_range[id] = range;
> > -	return range;
> > -}
> > -
> > -static unsigned long tps65912_vsel_to_uv_range0(u8 vsel)
> > -{
> > -	unsigned long uv;
> > -
> > -	uv = ((vsel * 12500) + 500000);
> > -	return uv;
> > -}
> > -
> > -static unsigned long tps65912_vsel_to_uv_range1(u8 vsel)
> > -{
> > -	unsigned long uv;
> > -
> > -	 uv = ((vsel * 12500) + 700000);
> > -	return uv;
> > -}
> > -
> > -static unsigned long tps65912_vsel_to_uv_range2(u8 vsel)
> > -{
> > -	unsigned long uv;
> > -
> > -	uv = ((vsel * 25000) + 500000);
> > -	return uv;
> > -}
> > -
> > -static unsigned long tps65912_vsel_to_uv_range3(u8 vsel)
> > -{
> > -	unsigned long uv;
> > -
> > -	if (vsel == 0x3f)
> > -		uv = 3800000;
> > -	else
> > -		uv = ((vsel * 50000) + 500000);
> > -
> > -	return uv;
> > -}
> > -
> > -static int tps65912_get_ctrl_register(int id)
> > -{
> > -	if (id >= TPS65912_REG_DCDC1 && id <= TPS65912_REG_LDO4)
> > -		return id * 3 + TPS65912_DCDC1_AVS;
> > -	else if (id >= TPS65912_REG_LDO5 && id <= TPS65912_REG_LDO10)
> > -		return id - TPS65912_REG_LDO5 + TPS65912_LDO5;
> > -	else
> > -		return -EINVAL;
> > -}
> > -
> > -static int tps65912_get_sel_register(struct tps65912_reg *pmic, int id)
> > -{
> > -	struct tps65912 *mfd = pmic->mfd;
> > -	int opvsel;
> > -	u8 reg = 0;
> > -
> > -	if (id >= TPS65912_REG_DCDC1 && id <= TPS65912_REG_LDO4) {
> > -		opvsel = tps65912_reg_read(mfd, id * 3 + TPS65912_DCDC1_OP);
> > -		if (opvsel & OP_SELREG_MASK)
> > -			reg = id * 3 + TPS65912_DCDC1_AVS;
> > -		else
> > -			reg = id * 3 + TPS65912_DCDC1_OP;
> > -	} else if (id >= TPS65912_REG_LDO5 && id <= TPS65912_REG_LDO10) {
> > -		reg = id - TPS65912_REG_LDO5 + TPS65912_LDO5;
> > -	} else {
> > -		return -EINVAL;
> > -	}
> > -
> > -	return reg;
> > -}
> > -
> > -static int tps65912_get_mode_regiters(struct tps65912_reg *pmic, int id)
> > -{
> > -	switch (id) {
> > -	case TPS65912_REG_DCDC1:
> > -		pmic->pwm_mode_reg = TPS65912_DCDC1_CTRL;
> > -		pmic->eco_reg = TPS65912_DCDC1_AVS;
> > -		break;
> > -	case TPS65912_REG_DCDC2:
> > -		pmic->pwm_mode_reg = TPS65912_DCDC2_CTRL;
> > -		pmic->eco_reg = TPS65912_DCDC2_AVS;
> > -		break;
> > -	case TPS65912_REG_DCDC3:
> > -		pmic->pwm_mode_reg = TPS65912_DCDC3_CTRL;
> > -		pmic->eco_reg = TPS65912_DCDC3_AVS;
> > -		break;
> > -	case TPS65912_REG_DCDC4:
> > -		pmic->pwm_mode_reg = TPS65912_DCDC4_CTRL;
> > -		pmic->eco_reg = TPS65912_DCDC4_AVS;
> > -		break;
> > -	default:
> > -		return -EINVAL;
> > -	}
> > -
> > -	return 0;
> > -}
> > -
> > -static int tps65912_reg_is_enabled(struct regulator_dev *dev)
> > -{
> > -	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
> > -	struct tps65912 *mfd = pmic->mfd;
> > -	int reg, value, id = rdev_get_id(dev);
> > -
> > -	if (id < TPS65912_REG_DCDC1 || id > TPS65912_REG_LDO10)
> > -		return -EINVAL;
> > -
> > -	reg = pmic->get_ctrl_reg(id);
> > -	if (reg < 0)
> > -		return reg;
> > -
> > -	value = tps65912_reg_read(mfd, reg);
> > -	if (value < 0)
> > -		return value;
> > -
> > -	return value & TPS65912_REG_ENABLED;
> > -}
> > -
> > -static int tps65912_reg_enable(struct regulator_dev *dev)
> > -{
> > -	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
> > -	struct tps65912 *mfd = pmic->mfd;
> > -	int id = rdev_get_id(dev);
> > -	int reg;
> > -
> > -	if (id < TPS65912_REG_DCDC1 || id > TPS65912_REG_LDO10)
> > -		return -EINVAL;
> > -
> > -	reg = pmic->get_ctrl_reg(id);
> > -	if (reg < 0)
> > -		return reg;
> > -
> > -	return tps65912_set_bits(mfd, reg, TPS65912_REG_ENABLED);
> > -}
> > -
> > -static int tps65912_reg_disable(struct regulator_dev *dev)
> > -{
> > -	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
> > -	struct tps65912 *mfd = pmic->mfd;
> > -	int id = rdev_get_id(dev), reg;
> > -
> > -	reg = pmic->get_ctrl_reg(id);
> > -	if (reg < 0)
> > -		return reg;
> > -
> > -	return tps65912_clear_bits(mfd, reg, TPS65912_REG_ENABLED);
> > -}
> > -
> > -static int tps65912_set_mode(struct regulator_dev *dev, unsigned int mode)
> > -{
> > -	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
> > -	struct tps65912 *mfd = pmic->mfd;
> > -	int pwm_mode, eco, id = rdev_get_id(dev);
> > -
> > -	tps65912_get_mode_regiters(pmic, id);
> > -
> > -	pwm_mode = tps65912_reg_read(mfd, pmic->pwm_mode_reg);
> > -	eco = tps65912_reg_read(mfd, pmic->eco_reg);
> > -
> > -	pwm_mode &= DCDCCTRL_DCDC_MODE_MASK;
> > -	eco &= DCDC_AVS_ECO_MASK;
> > -
> > -	switch (mode) {
> > -	case REGULATOR_MODE_FAST:
> > -		/* Verify if mode alredy set */
> > -		if (pwm_mode && !eco)
> > -			break;
> > -		tps65912_set_bits(mfd, pmic->pwm_mode_reg, DCDCCTRL_DCDC_MODE_MASK);
> > -		tps65912_clear_bits(mfd, pmic->eco_reg, DCDC_AVS_ECO_MASK);
> > -		break;
> > -	case REGULATOR_MODE_NORMAL:
> > -	case REGULATOR_MODE_IDLE:
> > -		if (!pwm_mode && !eco)
> > -			break;
> > -		tps65912_clear_bits(mfd, pmic->pwm_mode_reg, DCDCCTRL_DCDC_MODE_MASK);
> > -		tps65912_clear_bits(mfd, pmic->eco_reg, DCDC_AVS_ECO_MASK);
> > -		break;
> > -	case REGULATOR_MODE_STANDBY:
> > -		if (!pwm_mode && eco)
> > -			break;
> > -		tps65912_clear_bits(mfd, pmic->pwm_mode_reg, DCDCCTRL_DCDC_MODE_MASK);
> > -		tps65912_set_bits(mfd, pmic->eco_reg, DCDC_AVS_ECO_MASK);
> > -		break;
> > -	default:
> > -		return -EINVAL;
> > -	}
> > -
> > -	return 0;
> > -}
> > -
> > -static unsigned int tps65912_get_mode(struct regulator_dev *dev)
> > -{
> > -	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
> > -	struct tps65912 *mfd = pmic->mfd;
> > -	int pwm_mode, eco, mode = 0, id = rdev_get_id(dev);
> > -
> > -	tps65912_get_mode_regiters(pmic, id);
> > -
> > -	pwm_mode = tps65912_reg_read(mfd, pmic->pwm_mode_reg);
> > -	eco = tps65912_reg_read(mfd, pmic->eco_reg);
> > -
> > -	pwm_mode &= DCDCCTRL_DCDC_MODE_MASK;
> > -	eco &= DCDC_AVS_ECO_MASK;
> > -
> > -	if (pwm_mode && !eco)
> > -		mode = REGULATOR_MODE_FAST;
> > -	else if (!pwm_mode && !eco)
> > -		mode = REGULATOR_MODE_NORMAL;
> > -	else if (!pwm_mode && eco)
> > -		mode = REGULATOR_MODE_STANDBY;
> > -
> > -	return mode;
> > -}
> > -
> > -static int tps65912_list_voltage(struct regulator_dev *dev, unsigned selector)
> > -{
> > -	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
> > -	int range, voltage = 0, id = rdev_get_id(dev);
> > -
> > -	if (id > TPS65912_REG_DCDC4)
> > -		return -EINVAL;
> > -
> > -	range = pmic->dcdc_range[id];
> > -
> > -	switch (range) {
> > -	case 0:
> > -		/* 0.5 - 1.2875V in 12.5mV steps */
> > -		voltage = tps65912_vsel_to_uv_range0(selector);
> > -		break;
> > -	case 1:
> > -		/* 0.7 - 1.4875V in 12.5mV steps */
> > -		voltage = tps65912_vsel_to_uv_range1(selector);
> > -		break;
> > -	case 2:
> > -		/* 0.5 - 2.075V in 25mV steps */
> > -		voltage = tps65912_vsel_to_uv_range2(selector);
> > -		break;
> > -	case 3:
> > -		/* 0.5 - 3.8V in 50mV steps */
> > -		voltage = tps65912_vsel_to_uv_range3(selector);
> > -		break;
> > -	}
> > -	return voltage;
> > -}
> > -
> > -static int tps65912_get_voltage_sel(struct regulator_dev *dev)
> > -{
> > -	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
> > -	struct tps65912 *mfd = pmic->mfd;
> > -	int id = rdev_get_id(dev);
> > -	int reg, vsel;
> > -
> > -	reg = tps65912_get_sel_register(pmic, id);
> > -	if (reg < 0)
> > -		return reg;
> > -
> > -	vsel = tps65912_reg_read(mfd, reg);
> > -	vsel &= 0x3F;
> > -
> > -	return vsel;
> > -}
> > -
> > -static int tps65912_set_voltage_sel(struct regulator_dev *dev,
> > -					 unsigned selector)
> > -{
> > -	struct tps65912_reg *pmic = rdev_get_drvdata(dev);
> > -	struct tps65912 *mfd = pmic->mfd;
> > -	int id = rdev_get_id(dev);
> > -	int value;
> > -	u8 reg;
> > -
> > -	reg = tps65912_get_sel_register(pmic, id);
> > -	value = tps65912_reg_read(mfd, reg);
> > -	value &= 0xC0;
> > -	return tps65912_reg_write(mfd, reg, selector | value);
> > -}
> > -
> > -/* Operations permitted on DCDCx */
> > -static struct regulator_ops tps65912_ops_dcdc = {
> > -	.is_enabled = tps65912_reg_is_enabled,
> > -	.enable = tps65912_reg_enable,
> > -	.disable = tps65912_reg_disable,
> > -	.set_mode = tps65912_set_mode,
> > -	.get_mode = tps65912_get_mode,
> > -	.get_voltage_sel = tps65912_get_voltage_sel,
> > -	.set_voltage_sel = tps65912_set_voltage_sel,
> > -	.list_voltage = tps65912_list_voltage,
> > -};
> > -
> > -/* Operations permitted on LDOx */
> > -static struct regulator_ops tps65912_ops_ldo = {
> > -	.is_enabled = tps65912_reg_is_enabled,
> > -	.enable = tps65912_reg_enable,
> > -	.disable = tps65912_reg_disable,
> > -	.get_voltage_sel = tps65912_get_voltage_sel,
> > -	.set_voltage_sel = tps65912_set_voltage_sel,
> > -	.list_voltage = regulator_list_voltage_linear_range,
> > -	.map_voltage = regulator_map_voltage_linear_range,
> > -};
> > -
> > -static int tps65912_probe(struct platform_device *pdev)
> > -{
> > -	struct tps65912 *tps65912 = dev_get_drvdata(pdev->dev.parent);
> > -	struct regulator_config config = { };
> > -	struct tps_info *info;
> > -	struct regulator_init_data *reg_data;
> > -	struct regulator_dev *rdev;
> > -	struct tps65912_reg *pmic;
> > -	struct tps65912_board *pmic_plat_data;
> > -	int i;
> > -
> > -	pmic_plat_data = dev_get_platdata(tps65912->dev);
> > -	if (!pmic_plat_data)
> > -		return -EINVAL;
> > -
> > -	reg_data = pmic_plat_data->tps65912_pmic_init_data;
> > -
> > -	pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL);
> > -	if (!pmic)
> > -		return -ENOMEM;
> > -
> > -	mutex_init(&pmic->io_lock);
> > -	pmic->mfd = tps65912;
> > -	platform_set_drvdata(pdev, pmic);
> > -
> > -	pmic->get_ctrl_reg = &tps65912_get_ctrl_register;
> > -	info = tps65912_regs;
> > -
> > -	for (i = 0; i < TPS65912_NUM_REGULATOR; i++, info++, reg_data++) {
> > -		int range = 0;
> > -		/* Register the regulators */
> > -		pmic->info[i] = info;
> > -
> > -		pmic->desc[i].name = info->name;
> > -		pmic->desc[i].id = i;
> > -		pmic->desc[i].n_voltages = 64;
> > -		if (i > TPS65912_REG_DCDC4) {
> > -			pmic->desc[i].ops = &tps65912_ops_ldo;
> > -			pmic->desc[i].linear_ranges = tps65912_ldo_ranges;
> > -			pmic->desc[i].n_linear_ranges =
> > -					ARRAY_SIZE(tps65912_ldo_ranges);
> > -		} else {
> > -			pmic->desc[i].ops = &tps65912_ops_dcdc;
> > -		}
> > -		pmic->desc[i].type = REGULATOR_VOLTAGE;
> > -		pmic->desc[i].owner = THIS_MODULE;
> > -		range = tps65912_get_range(pmic, i);
> > -
> > -		config.dev = tps65912->dev;
> > -		config.init_data = reg_data;
> > -		config.driver_data = pmic;
> > -
> > -		rdev = devm_regulator_register(&pdev->dev, &pmic->desc[i],
> > -					       &config);
> > -		if (IS_ERR(rdev)) {
> > -			dev_err(tps65912->dev,
> > -				"failed to register %s regulator\n",
> > -				pdev->name);
> > -			return PTR_ERR(rdev);
> > -		}
> > -
> > -		/* Save regulator for cleanup */
> > -		pmic->rdev[i] = rdev;
> > -	}
> > -	return 0;
> > -}
> > -
> > -static struct platform_driver tps65912_driver = {
> > -	.driver = {
> > -		.name = "tps65912-pmic",
> > -	},
> > -	.probe = tps65912_probe,
> > -};
> > -
> > -static int __init tps65912_init(void)
> > -{
> > -	return platform_driver_register(&tps65912_driver);
> > -}
> > -subsys_initcall(tps65912_init);
> > -
> > -static void __exit tps65912_cleanup(void)
> > -{
> > -	platform_driver_unregister(&tps65912_driver);
> > -}
> > -module_exit(tps65912_cleanup);
> > -
> > -MODULE_AUTHOR("Margarita Olaya Cabrera <magi@slimlogic.co.uk>");
> > -MODULE_DESCRIPTION("TPS65912 voltage regulator driver");
> > -MODULE_LICENSE("GPL v2");
> > -MODULE_ALIAS("platform:tps65912-pmic");
> > diff --git a/include/linux/mfd/tps65912.h b/include/linux/mfd/tps65912.h
> > deleted file mode 100644
> > index 6d30903..0000000
> > --- a/include/linux/mfd/tps65912.h
> > +++ /dev/null
> > @@ -1,328 +0,0 @@
> > -/*
> > - * tps65912.h  --  TI TPS6591x
> > - *
> > - * Copyright 2011 Texas Instruments Inc.
> > - *
> > - * Author: Margarita Olaya <magi@slimlogic.co.uk>
> > - *
> > - *  This program is free software; you can redistribute it and/or modify it
> > - *  under  the terms of the GNU General  Public License as published by the
> > - *  Free Software Foundation;  either version 2 of the License, or (at your
> > - *  option) any later version.
> > - *
> > - */
> > -
> > -#ifndef __LINUX_MFD_TPS65912_H
> > -#define __LINUX_MFD_TPS65912_H
> > -
> > -/* TPS regulator type list */
> > -#define REGULATOR_LDO		0
> > -#define REGULATOR_DCDC		1
> > -
> > -/*
> > - * List of registers for TPS65912
> > - */
> > -
> > -#define TPS65912_DCDC1_CTRL		0x00
> > -#define TPS65912_DCDC2_CTRL		0x01
> > -#define TPS65912_DCDC3_CTRL		0x02
> > -#define TPS65912_DCDC4_CTRL		0x03
> > -#define TPS65912_DCDC1_OP		0x04
> > -#define TPS65912_DCDC1_AVS		0x05
> > -#define TPS65912_DCDC1_LIMIT		0x06
> > -#define TPS65912_DCDC2_OP		0x07
> > -#define TPS65912_DCDC2_AVS		0x08
> > -#define TPS65912_DCDC2_LIMIT		0x09
> > -#define TPS65912_DCDC3_OP		0x0A
> > -#define TPS65912_DCDC3_AVS		0x0B
> > -#define TPS65912_DCDC3_LIMIT		0x0C
> > -#define TPS65912_DCDC4_OP		0x0D
> > -#define TPS65912_DCDC4_AVS		0x0E
> > -#define TPS65912_DCDC4_LIMIT		0x0F
> > -#define TPS65912_LDO1_OP		0x10
> > -#define TPS65912_LDO1_AVS		0x11
> > -#define TPS65912_LDO1_LIMIT		0x12
> > -#define TPS65912_LDO2_OP		0x13
> > -#define TPS65912_LDO2_AVS		0x14
> > -#define TPS65912_LDO2_LIMIT		0x15
> > -#define TPS65912_LDO3_OP		0x16
> > -#define TPS65912_LDO3_AVS		0x17
> > -#define TPS65912_LDO3_LIMIT		0x18
> > -#define TPS65912_LDO4_OP		0x19
> > -#define TPS65912_LDO4_AVS		0x1A
> > -#define TPS65912_LDO4_LIMIT		0x1B
> > -#define TPS65912_LDO5			0x1C
> > -#define TPS65912_LDO6			0x1D
> > -#define TPS65912_LDO7			0x1E
> > -#define TPS65912_LDO8			0x1F
> > -#define TPS65912_LDO9			0x20
> > -#define TPS65912_LDO10			0x21
> > -#define TPS65912_THRM			0x22
> > -#define TPS65912_CLK32OUT		0x23
> > -#define TPS65912_DEVCTRL		0x24
> > -#define TPS65912_DEVCTRL2		0x25
> > -#define TPS65912_I2C_SPI_CFG		0x26
> > -#define TPS65912_KEEP_ON		0x27
> > -#define TPS65912_KEEP_ON2		0x28
> > -#define TPS65912_SET_OFF1		0x29
> > -#define TPS65912_SET_OFF2		0x2A
> > -#define TPS65912_DEF_VOLT		0x2B
> > -#define TPS65912_DEF_VOLT_MAPPING	0x2C
> > -#define TPS65912_DISCHARGE		0x2D
> > -#define TPS65912_DISCHARGE2		0x2E
> > -#define TPS65912_EN1_SET1		0x2F
> > -#define TPS65912_EN1_SET2		0x30
> > -#define TPS65912_EN2_SET1		0x31
> > -#define TPS65912_EN2_SET2		0x32
> > -#define TPS65912_EN3_SET1		0x33
> > -#define TPS65912_EN3_SET2		0x34
> > -#define TPS65912_EN4_SET1		0x35
> > -#define TPS65912_EN4_SET2		0x36
> > -#define TPS65912_PGOOD			0x37
> > -#define TPS65912_PGOOD2			0x38
> > -#define TPS65912_INT_STS		0x39
> > -#define TPS65912_INT_MSK		0x3A
> > -#define TPS65912_INT_STS2		0x3B
> > -#define TPS65912_INT_MSK2		0x3C
> > -#define TPS65912_INT_STS3		0x3D
> > -#define TPS65912_INT_MSK3		0x3E
> > -#define TPS65912_INT_STS4		0x3F
> > -#define TPS65912_INT_MSK4		0x40
> > -#define TPS65912_GPIO1			0x41
> > -#define TPS65912_GPIO2			0x42
> > -#define TPS65912_GPIO3			0x43
> > -#define TPS65912_GPIO4			0x44
> > -#define TPS65912_GPIO5			0x45
> > -#define TPS65912_VMON			0x46
> > -#define TPS65912_LEDA_CTRL1		0x47
> > -#define TPS65912_LEDA_CTRL2		0x48
> > -#define TPS65912_LEDA_CTRL3		0x49
> > -#define TPS65912_LEDA_CTRL4		0x4A
> > -#define TPS65912_LEDA_CTRL5		0x4B
> > -#define TPS65912_LEDA_CTRL6		0x4C
> > -#define TPS65912_LEDA_CTRL7		0x4D
> > -#define TPS65912_LEDA_CTRL8		0x4E
> > -#define TPS65912_LEDB_CTRL1		0x4F
> > -#define TPS65912_LEDB_CTRL2		0x50
> > -#define TPS65912_LEDB_CTRL3		0x51
> > -#define TPS65912_LEDB_CTRL4		0x52
> > -#define TPS65912_LEDB_CTRL5		0x53
> > -#define TPS65912_LEDB_CTRL6		0x54
> > -#define TPS65912_LEDB_CTRL7		0x55
> > -#define TPS65912_LEDB_CTRL8		0x56
> > -#define TPS65912_LEDC_CTRL1		0x57
> > -#define TPS65912_LEDC_CTRL2		0x58
> > -#define TPS65912_LEDC_CTRL3		0x59
> > -#define TPS65912_LEDC_CTRL4		0x5A
> > -#define TPS65912_LEDC_CTRL5		0x5B
> > -#define TPS65912_LEDC_CTRL6		0x5C
> > -#define TPS65912_LEDC_CTRL7		0x5D
> > -#define TPS65912_LEDC_CTRL8		0x5E
> > -#define TPS65912_LED_RAMP_UP_TIME	0x5F
> > -#define TPS65912_LED_RAMP_DOWN_TIME	0x60
> > -#define TPS65912_LED_SEQ_EN		0x61
> > -#define TPS65912_LOADSWITCH		0x62
> > -#define TPS65912_SPARE			0x63
> > -#define TPS65912_VERNUM			0x64
> > -#define TPS6591X_MAX_REGISTER		0x64
> > -
> > -/* IRQ Definitions */
> > -#define TPS65912_IRQ_PWRHOLD_F		0
> > -#define TPS65912_IRQ_VMON		1
> > -#define TPS65912_IRQ_PWRON		2
> > -#define TPS65912_IRQ_PWRON_LP		3
> > -#define TPS65912_IRQ_PWRHOLD_R		4
> > -#define TPS65912_IRQ_HOTDIE		5
> > -#define TPS65912_IRQ_GPIO1_R		6
> > -#define TPS65912_IRQ_GPIO1_F		7
> > -#define TPS65912_IRQ_GPIO2_R		8
> > -#define TPS65912_IRQ_GPIO2_F		9
> > -#define TPS65912_IRQ_GPIO3_R		10
> > -#define TPS65912_IRQ_GPIO3_F		11
> > -#define TPS65912_IRQ_GPIO4_R		12
> > -#define TPS65912_IRQ_GPIO4_F		13
> > -#define TPS65912_IRQ_GPIO5_R		14
> > -#define TPS65912_IRQ_GPIO5_F		15
> > -#define TPS65912_IRQ_PGOOD_DCDC1	16
> > -#define TPS65912_IRQ_PGOOD_DCDC2	17
> > -#define TPS65912_IRQ_PGOOD_DCDC3	18
> > -#define TPS65912_IRQ_PGOOD_DCDC4	19
> > -#define TPS65912_IRQ_PGOOD_LDO1		20
> > -#define TPS65912_IRQ_PGOOD_LDO2		21
> > -#define TPS65912_IRQ_PGOOD_LDO3		22
> > -#define TPS65912_IRQ_PGOOD_LDO4		23
> > -#define TPS65912_IRQ_PGOOD_LDO5		24
> > -#define TPS65912_IRQ_PGOOD_LDO6		25
> > -#define TPS65912_IRQ_PGOOD_LDO7		26
> > -#define TPS65912_IRQ_PGOOD_LD08		27
> > -#define TPS65912_IRQ_PGOOD_LDO9		28
> > -#define TPS65912_IRQ_PGOOD_LDO10	29
> > -
> > -#define TPS65912_NUM_IRQ		30
> > -
> > -/* GPIO 1 and 2 Register Definitions */
> > -#define GPIO_SLEEP_MASK			0x80
> > -#define GPIO_SLEEP_SHIFT		7
> > -#define GPIO_DEB_MASK			0x10
> > -#define GPIO_DEB_SHIFT			4
> > -#define GPIO_CFG_MASK			0x04
> > -#define GPIO_CFG_SHIFT			2
> > -#define GPIO_STS_MASK			0x02
> > -#define GPIO_STS_SHIFT			1
> > -#define GPIO_SET_MASK			0x01
> > -#define GPIO_SET_SHIFT			0
> > -
> > -/* GPIO 3 Register Definitions */
> > -#define GPIO3_SLEEP_MASK		0x80
> > -#define GPIO3_SLEEP_SHIFT		7
> > -#define GPIO3_SEL_MASK			0x40
> > -#define GPIO3_SEL_SHIFT			6
> > -#define GPIO3_ODEN_MASK			0x20
> > -#define GPIO3_ODEN_SHIFT		5
> > -#define GPIO3_DEB_MASK			0x10
> > -#define GPIO3_DEB_SHIFT			4
> > -#define GPIO3_PDEN_MASK			0x08
> > -#define GPIO3_PDEN_SHIFT		3
> > -#define GPIO3_CFG_MASK			0x04
> > -#define GPIO3_CFG_SHIFT			2
> > -#define GPIO3_STS_MASK			0x02
> > -#define GPIO3_STS_SHIFT			1
> > -#define GPIO3_SET_MASK			0x01
> > -#define GPIO3_SET_SHIFT			0
> > -
> > -/* GPIO 4 Register Definitions */
> > -#define GPIO4_SLEEP_MASK		0x80
> > -#define GPIO4_SLEEP_SHIFT		7
> > -#define GPIO4_SEL_MASK			0x40
> > -#define GPIO4_SEL_SHIFT			6
> > -#define GPIO4_ODEN_MASK			0x20
> > -#define GPIO4_ODEN_SHIFT		5
> > -#define GPIO4_DEB_MASK			0x10
> > -#define GPIO4_DEB_SHIFT			4
> > -#define GPIO4_PDEN_MASK			0x08
> > -#define GPIO4_PDEN_SHIFT		3
> > -#define GPIO4_CFG_MASK			0x04
> > -#define GPIO4_CFG_SHIFT			2
> > -#define GPIO4_STS_MASK			0x02
> > -#define GPIO4_STS_SHIFT			1
> > -#define GPIO4_SET_MASK			0x01
> > -#define GPIO4_SET_SHIFT			0
> > -
> > -/* Register THERM  (0x80) register.RegisterDescription */
> > -#define THERM_THERM_HD_MASK		0x20
> > -#define THERM_THERM_HD_SHIFT		5
> > -#define THERM_THERM_TS_MASK		0x10
> > -#define THERM_THERM_TS_SHIFT		4
> > -#define THERM_THERM_HDSEL_MASK		0x0C
> > -#define THERM_THERM_HDSEL_SHIFT		2
> > -#define THERM_RSVD1_MASK		0x02
> > -#define THERM_RSVD1_SHIFT		1
> > -#define THERM_THERM_STATE_MASK		0x01
> > -#define THERM_THERM_STATE_SHIFT		0
> > -
> > -/* Register DCDCCTRL1 register.RegisterDescription */
> > -#define DCDCCTRL_VCON_ENABLE_MASK	0x80
> > -#define DCDCCTRL_VCON_ENABLE_SHIFT	7
> > -#define DCDCCTRL_VCON_RANGE1_MASK	0x40
> > -#define DCDCCTRL_VCON_RANGE1_SHIFT	6
> > -#define DCDCCTRL_VCON_RANGE0_MASK	0x20
> > -#define DCDCCTRL_VCON_RANGE0_SHIFT	5
> > -#define DCDCCTRL_TSTEP2_MASK		0x10
> > -#define DCDCCTRL_TSTEP2_SHIFT		4
> > -#define DCDCCTRL_TSTEP1_MASK		0x08
> > -#define DCDCCTRL_TSTEP1_SHIFT		3
> > -#define DCDCCTRL_TSTEP0_MASK		0x04
> > -#define DCDCCTRL_TSTEP0_SHIFT		2
> > -#define DCDCCTRL_DCDC1_MODE_MASK	0x02
> > -#define DCDCCTRL_DCDC1_MODE_SHIFT	1
> > -
> > -/* Register DCDCCTRL2 and DCDCCTRL3 register.RegisterDescription */
> > -#define DCDCCTRL_TSTEP2_MASK		0x10
> > -#define DCDCCTRL_TSTEP2_SHIFT		4
> > -#define DCDCCTRL_TSTEP1_MASK		0x08
> > -#define DCDCCTRL_TSTEP1_SHIFT		3
> > -#define DCDCCTRL_TSTEP0_MASK		0x04
> > -#define DCDCCTRL_TSTEP0_SHIFT		2
> > -#define DCDCCTRL_DCDC_MODE_MASK		0x02
> > -#define DCDCCTRL_DCDC_MODE_SHIFT	1
> > -#define DCDCCTRL_RSVD0_MASK		0x01
> > -#define DCDCCTRL_RSVD0_SHIFT		0
> > -
> > -/* Register DCDCCTRL4 register.RegisterDescription */
> > -#define DCDCCTRL_RAMP_TIME_MASK		0x01
> > -#define DCDCCTRL_RAMP_TIME_SHIFT	0
> > -
> > -/* Register DCDCx_AVS */
> > -#define DCDC_AVS_ENABLE_MASK		0x80
> > -#define DCDC_AVS_ENABLE_SHIFT		7
> > -#define DCDC_AVS_ECO_MASK		0x40
> > -#define DCDC_AVS_ECO_SHIFT		6
> > -
> > -/* Register DCDCx_LIMIT */
> > -#define DCDC_LIMIT_RANGE_MASK		0xC0
> > -#define DCDC_LIMIT_RANGE_SHIFT		6
> > -#define DCDC_LIMIT_MAX_SEL_MASK		0x3F
> > -#define DCDC_LIMIT_MAX_SEL_SHIFT	0
> > -
> > -/**
> > - * struct tps65912_board
> > - * Board platform dat may be used to initialize regulators.
> > - */
> > -struct tps65912_board {
> > -	int is_dcdc1_avs;
> > -	int is_dcdc2_avs;
> > -	int is_dcdc3_avs;
> > -	int is_dcdc4_avs;
> > -	int irq;
> > -	int irq_base;
> > -	int gpio_base;
> > -	struct regulator_init_data *tps65912_pmic_init_data;
> > -};
> > -
> > -/**
> > - * struct tps65912 - tps65912 sub-driver chip access routines
> > - */
> > -
> > -struct tps65912 {
> > -	struct device *dev;
> > -	/* for read/write acces */
> > -	struct mutex io_mutex;
> > -
> > -	/* For device IO interfaces: I2C or SPI */
> > -	void *control_data;
> > -
> > -	int (*read)(struct tps65912 *tps65912, u8 reg, int size, void *dest);
> > -	int (*write)(struct tps65912 *tps65912, u8 reg, int size, void *src);
> > -
> > -	/* Client devices */
> > -	struct tps65912_pmic *pmic;
> > -
> > -	/* GPIO Handling */
> > -	struct gpio_chip gpio;
> > -
> > -	/* IRQ Handling */
> > -	struct mutex irq_lock;
> > -	int chip_irq;
> > -	int irq_base;
> > -	int irq_num;
> > -	u32 irq_mask;
> > -};
> > -
> > -struct tps65912_platform_data {
> > -	int irq;
> > -	int irq_base;
> > -};
> > -
> > -unsigned int tps_chip(void);
> > -
> > -int tps65912_set_bits(struct tps65912 *tps65912, u8 reg, u8 mask);
> > -int tps65912_clear_bits(struct tps65912 *tps65912, u8 reg, u8 mask);
> > -int tps65912_reg_read(struct tps65912 *tps65912, u8 reg);
> > -int tps65912_reg_write(struct tps65912 *tps65912, u8 reg, u8 val);
> > -int tps65912_device_init(struct tps65912 *tps65912);
> > -void tps65912_device_exit(struct tps65912 *tps65912);
> > -int tps65912_irq_init(struct tps65912 *tps65912, int irq,
> > -			struct tps65912_platform_data *pdata);
> > -int tps65912_irq_exit(struct tps65912 *tps65912);
> > -
> > -#endif /*  __LINUX_MFD_TPS65912_H */
> 

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

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

* Re: [PATCH v4 2/5] mfd: tps65912: Remove old driver in preparation for new driver
  2015-10-05  9:29     ` Lee Jones
@ 2015-10-05 16:01       ` Andrew F. Davis
  0 siblings, 0 replies; 44+ messages in thread
From: Andrew F. Davis @ 2015-10-05 16:01 UTC (permalink / raw)
  To: Lee Jones
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Mark Brown, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

he On 10/05/2015 04:29 AM, Lee Jones wrote:
> On Mon, 05 Oct 2015, Lee Jones wrote:
>
>> On Thu, 01 Oct 2015, Andrew F. Davis wrote:
>>
>>> The old tps65912 driver is being replaced, delete old driver.
>>>
>>> Signed-off-by: Andrew F. Davis <afd@ti.com>
>>
>> I already Acked this in v3.
>>
>> Acked-by: Lee Jones <lee.jones@linaro.org>
>
> Ack can carry, but is there any chance this can be split up for easy
> digestion into the respective trees?
>

I'm not sure, the components are tightly coupled and if one tree has
different parts deleted/replaced I'm not sure if this will leave the
trees in a compilable state. I think one tree will need to take all
the parts.

If it was just adding components then this wouldn't be needed, but
having old and new together may be a problem.


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

* Re: [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC
  2015-10-05  9:27     ` Lee Jones
@ 2015-10-12 15:06       ` Andrew F. Davis
  2015-10-13  7:34         ` Lee Jones
  0 siblings, 1 reply; 44+ messages in thread
From: Andrew F. Davis @ 2015-10-12 15:06 UTC (permalink / raw)
  To: Lee Jones
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Mark Brown, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On 10/05/2015 04:27 AM, Lee Jones wrote:
> On Mon, 05 Oct 2015, Lee Jones wrote:
>
>> On Thu, 01 Oct 2015, Andrew F. Davis wrote:
>>
>>> This patch adds support for TPS65912 mfd device. It provides
>>> communication through the I2C and SPI interfaces. It contains
>>> the following components:
>>>
>>>   - Regulators
>>>   - GPIO controller
>>>
>>> Signed-off-by: Andrew F. Davis <afd@ti.com>
>>> ---
>>>   drivers/mfd/Kconfig          |  25 ++++
>>>   drivers/mfd/Makefile         |   3 +
>>>   drivers/mfd/tps65912-core.c  | 108 ++++++++++++++
>>>   drivers/mfd/tps65912-i2c.c   |  82 ++++++++++
>>>   drivers/mfd/tps65912-spi.c   |  81 ++++++++++
>>>   include/linux/mfd/tps65912.h | 345 +++++++++++++++++++++++++++++++++++++++++++
>>>   6 files changed, 644 insertions(+)
>>>   create mode 100644 drivers/mfd/tps65912-core.c
>>>   create mode 100644 drivers/mfd/tps65912-i2c.c
>>>   create mode 100644 drivers/mfd/tps65912-spi.c
>>>   create mode 100644 include/linux/mfd/tps65912.h
>>
>> Applied, thanks.
>
> Whoops, I forgot about the removal patch.
>
> For this patch:
>    Acked-by: Lee Jones <lee.jones@linaro.org>
>
> Can you break up the removal patch into subsystems as well?
>

I can if you would like, but as I responded in the other patch I
think that will cause problems as the Kconfig symbols in the new
will allow the old to be compiled and this will break build. All
the removals may have to be brought in in a single patch, again
up to you.

>>> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
>>> index 9a8df8e..02b321f 100644
>>> --- a/drivers/mfd/Kconfig
>>> +++ b/drivers/mfd/Kconfig
>>> @@ -1167,6 +1167,31 @@ config MFD_TPS65910
>>>   	  if you say yes here you get support for the TPS65910 series of
>>>   	  Power Management chips.
>>>
>>> +config MFD_TPS65912
>>> +	tristate
>>> +	select REGMAP
>>> +	select REGMAP_IRQ
>>> +
>>> +config MFD_TPS65912_I2C
>>> +	tristate "TI TPS65912 Power Management chip with I2C"
>>> +	select MFD_TPS65912
>>> +	select REGMAP_I2C
>>> +	depends on I2C
>>> +	depends on OF || COMPILE_TEST
>>> +	help
>>> +	  If you say yes here you get support for the TPS65912 series of
>>> +	  PM chips with I2C interface.
>>> +
>>> +config MFD_TPS65912_SPI
>>> +	tristate "TI TPS65912 Power Management chip with SPI"
>>> +	select MFD_TPS65912
>>> +	select REGMAP_SPI
>>> +	depends on SPI_MASTER
>>> +	depends on OF || COMPILE_TEST
>>> +	help
>>> +	  If you say yes here you get support for the TPS65912 series of
>>> +	  PM chips with SPI interface.
>>> +
>>>   config MFD_TPS80031
>>>   	bool "TI TPS80031/TPS80032 Power Management chips"
>>>   	depends on I2C=y
>>> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
>>> index 004aa76..49c3530 100644
>>> --- a/drivers/mfd/Makefile
>>> +++ b/drivers/mfd/Makefile
>>> @@ -69,6 +69,9 @@ obj-$(CONFIG_TPS6507X)		+= tps6507x.o
>>>   obj-$(CONFIG_MFD_TPS65217)	+= tps65217.o
>>>   obj-$(CONFIG_MFD_TPS65218)	+= tps65218.o
>>>   obj-$(CONFIG_MFD_TPS65910)	+= tps65910.o
>>> +obj-$(CONFIG_MFD_TPS65912)	+= tps65912-core.o
>>> +obj-$(CONFIG_MFD_TPS65912_I2C)	+= tps65912-i2c.o
>>> +obj-$(CONFIG_MFD_TPS65912_SPI)  += tps65912-spi.o
>>>   obj-$(CONFIG_MFD_TPS80031)	+= tps80031.o
>>>   obj-$(CONFIG_MENELAUS)		+= menelaus.o
>>>
>>> diff --git a/drivers/mfd/tps65912-core.c b/drivers/mfd/tps65912-core.c
>>> new file mode 100644
>>> index 0000000..e787950
>>> --- /dev/null
>>> +++ b/drivers/mfd/tps65912-core.c
>>> @@ -0,0 +1,108 @@
>>> +/*
>>> + * Core functions for TI TPS65912x PMIC
>>> + *
>>> + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
>>> + *
>>> + * Author: Andrew F. Davis <afd@ti.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.
>>> + *
>>> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
>>> + * kind, whether expressed or implied; without even the implied warranty
>>> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>> + * GNU General Public License version 2 for more details.
>>> + *
>>> + * Based on the TPS65218 driver and the previous TPS65912 driver by
>>> + * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
>>> + */
>>> +
>>> +#include <linux/interrupt.h>
>>> +#include <linux/module.h>
>>> +#include <linux/of_device.h>
>>> +
>>> +#include <linux/mfd/tps65912.h>
>>> +
>>> +static const struct regmap_irq tps65912_irqs[] = {
>>> +	/* INT_STS IRQs */
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_F, 0, TPS65912_INT_STS_PWRHOLD_F),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_VMON, 0, TPS65912_INT_STS_VMON),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PWRON, 0, TPS65912_INT_STS_PWRON),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PWRON_LP, 0, TPS65912_INT_STS_PWRON_LP),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_R, 0, TPS65912_INT_STS_PWRHOLD_R),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_HOTDIE, 0, TPS65912_INT_STS_HOTDIE),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_R, 0, TPS65912_INT_STS_GPIO1_R),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_F, 0, TPS65912_INT_STS_GPIO1_F),
>>> +	/* INT_STS2 IRQs */
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO2_R, 1, TPS65912_INT_STS2_GPIO2_R),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO2_F, 1, TPS65912_INT_STS2_GPIO2_F),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO3_R, 1, TPS65912_INT_STS2_GPIO3_R),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO3_F, 1, TPS65912_INT_STS2_GPIO3_F),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO4_R, 1, TPS65912_INT_STS2_GPIO4_R),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO4_F, 1, TPS65912_INT_STS2_GPIO4_F),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO5_R, 1, TPS65912_INT_STS2_GPIO5_R),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO5_F, 1, TPS65912_INT_STS2_GPIO5_F),
>>> +	/* INT_STS3 IRQs */
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC1, 2, TPS65912_INT_STS3_PGOOD_DCDC1),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC2, 2, TPS65912_INT_STS3_PGOOD_DCDC2),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC3, 2, TPS65912_INT_STS3_PGOOD_DCDC3),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC4, 2, TPS65912_INT_STS3_PGOOD_DCDC4),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO1, 2, TPS65912_INT_STS3_PGOOD_LDO1),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO2, 2, TPS65912_INT_STS3_PGOOD_LDO2),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO3, 2, TPS65912_INT_STS3_PGOOD_LDO3),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO4, 2, TPS65912_INT_STS3_PGOOD_LDO4),
>>> +	/* INT_STS4 IRQs */
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO5, 3, TPS65912_INT_STS4_PGOOD_LDO5),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO6, 3, TPS65912_INT_STS4_PGOOD_LDO6),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO7, 3, TPS65912_INT_STS4_PGOOD_LDO7),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO8, 3, TPS65912_INT_STS4_PGOOD_LDO8),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO9, 3, TPS65912_INT_STS4_PGOOD_LDO9),
>>> +	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO10, 3, TPS65912_INT_STS4_PGOOD_LDO10),
>>> +};
>>> +
>>> +static struct regmap_irq_chip tps65912_irq_chip = {
>>> +	.name = "tps65912",
>>> +	.irqs = tps65912_irqs,
>>> +	.num_irqs = ARRAY_SIZE(tps65912_irqs),
>>> +	.num_regs = 4,
>>> +	.irq_reg_stride = 2,
>>> +	.mask_base = TPS65912_INT_MSK,
>>> +	.status_base = TPS65912_INT_STS,
>>> +	.ack_base = TPS65912_INT_STS,
>>> +	.init_ack_masked = true,
>>> +};
>>> +
>>> +int tps65912_device_init(struct tps65912 *tps)
>>> +{
>>> +	int ret;
>>> +
>>> +	ret = regmap_add_irq_chip(tps->regmap, tps->irq, IRQF_ONESHOT, 0,
>>> +				  &tps65912_irq_chip, &tps->irq_data);
>>> +	if (ret < 0)
>>> +		return ret;
>>> +
>>> +	ret = of_platform_populate(tps->dev->of_node, NULL, NULL, tps->dev);
>>> +	if (ret < 0)
>>> +		goto err_irq;
>>> +
>>> +	return 0;
>>> +
>>> +err_irq:
>>> +	regmap_del_irq_chip(tps->irq, tps->irq_data);
>>> +
>>> +	return ret;
>>> +}
>>> +EXPORT_SYMBOL_GPL(tps65912_device_init);
>>> +
>>> +int tps65912_device_exit(struct tps65912 *tps)
>>> +{
>>> +	regmap_del_irq_chip(tps->irq, tps->irq_data);
>>> +
>>> +	return 0;
>>> +}
>>> +EXPORT_SYMBOL_GPL(tps65912_device_exit);
>>> +
>>> +MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
>>> +MODULE_DESCRIPTION("TPS65912x MFD Driver");
>>> +MODULE_LICENSE("GPL v2");
>>> diff --git a/drivers/mfd/tps65912-i2c.c b/drivers/mfd/tps65912-i2c.c
>>> new file mode 100644
>>> index 0000000..bdae10b01
>>> --- /dev/null
>>> +++ b/drivers/mfd/tps65912-i2c.c
>>> @@ -0,0 +1,82 @@
>>> +/*
>>> + * I2C access driver for TI TPS65912x PMIC
>>> + *
>>> + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
>>> + *
>>> + * Author: Andrew F. Davis <afd@ti.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.
>>> + *
>>> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
>>> + * kind, whether expressed or implied; without even the implied warranty
>>> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>> + * GNU General Public License version 2 for more details.
>>> + *
>>> + * Based on the TPS65218 driver and the previous TPS65912 driver by
>>> + * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
>>> + */
>>> +
>>> +#include <linux/i2c.h>
>>> +#include <linux/module.h>
>>> +#include <linux/of_device.h>
>>> +#include <linux/regmap.h>
>>> +
>>> +#include <linux/mfd/tps65912.h>
>>> +
>>> +static const struct of_device_id tps65912_i2c_of_match_table[] = {
>>> +	{ .compatible = "ti,tps65912", },
>>> +	{ /* sentinel */ }
>>> +};
>>> +
>>> +static int tps65912_i2c_probe(struct i2c_client *client,
>>> +			      const struct i2c_device_id *ids)
>>> +{
>>> +	struct tps65912 *tps;
>>> +
>>> +	tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
>>> +	if (!tps)
>>> +		return -ENOMEM;
>>> +
>>> +	i2c_set_clientdata(client, tps);
>>> +	tps->dev = &client->dev;
>>> +	tps->irq = client->irq;
>>> +
>>> +	tps->regmap = devm_regmap_init_i2c(client, &tps65912_regmap_config);
>>> +	if (IS_ERR(tps->regmap)) {
>>> +		dev_err(tps->dev, "Failed to initialize register map\n");
>>> +		return PTR_ERR(tps->regmap);
>>> +	}
>>> +
>>> +	return tps65912_device_init(tps);
>>> +}
>>> +
>>> +static int tps65912_i2c_remove(struct i2c_client *client)
>>> +{
>>> +	struct tps65912 *tps = i2c_get_clientdata(client);
>>> +
>>> +	return tps65912_device_exit(tps);
>>> +}
>>> +
>>> +static const struct i2c_device_id tps65912_i2c_id_table[] = {
>>> +	{ "tps65912", 0 },
>>> +	{ /* sentinel */ },
>>> +};
>>> +MODULE_DEVICE_TABLE(i2c, tps65912_i2c_id_table);
>>> +
>>> +static struct i2c_driver tps65912_i2c_driver = {
>>> +	.driver		= {
>>> +		.name	= "tps65912",
>>> +		.of_match_table = tps65912_i2c_of_match_table,
>>> +	},
>>> +	.probe		= tps65912_i2c_probe,
>>> +	.remove		= tps65912_i2c_remove,
>>> +	.id_table       = tps65912_i2c_id_table,
>>> +};
>>> +
>>> +module_i2c_driver(tps65912_i2c_driver);
>>> +
>>> +MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
>>> +MODULE_DESCRIPTION("TPS65912x I2C Interface Driver");
>>> +MODULE_LICENSE("GPL v2");
>>> diff --git a/drivers/mfd/tps65912-spi.c b/drivers/mfd/tps65912-spi.c
>>> new file mode 100644
>>> index 0000000..24c5c97
>>> --- /dev/null
>>> +++ b/drivers/mfd/tps65912-spi.c
>>> @@ -0,0 +1,81 @@
>>> +/*
>>> + * SPI access driver for TI TPS65912x PMIC
>>> + *
>>> + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
>>> + *
>>> + * Author: Andrew F. Davis <afd@ti.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.
>>> + *
>>> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
>>> + * kind, whether expressed or implied; without even the implied warranty
>>> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>> + * GNU General Public License version 2 for more details.
>>> + *
>>> + * Based on the TPS65218 driver and the previous TPS65912 driver by
>>> + * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
>>> + */
>>> +
>>> +#include <linux/module.h>
>>> +#include <linux/of_device.h>
>>> +#include <linux/regmap.h>
>>> +#include <linux/spi/spi.h>
>>> +
>>> +#include <linux/mfd/tps65912.h>
>>> +
>>> +static const struct of_device_id tps65912_spi_of_match_table[] = {
>>> +	{ .compatible = "ti,tps65912", },
>>> +	{ /* sentinel */ }
>>> +};
>>> +
>>> +static int tps65912_spi_probe(struct spi_device *spi)
>>> +{
>>> +	struct tps65912 *tps;
>>> +
>>> +	tps = devm_kzalloc(&spi->dev, sizeof(*tps), GFP_KERNEL);
>>> +	if (!tps)
>>> +		return -ENOMEM;
>>> +
>>> +	spi_set_drvdata(spi, tps);
>>> +	tps->dev = &spi->dev;
>>> +	tps->irq = spi->irq;
>>> +
>>> +	tps->regmap = devm_regmap_init_spi(spi, &tps65912_regmap_config);
>>> +	if (IS_ERR(tps->regmap)) {
>>> +		dev_err(tps->dev, "Failed to initialize register map\n");
>>> +		return PTR_ERR(tps->regmap);
>>> +	}
>>> +
>>> +	return tps65912_device_init(tps);
>>> +}
>>> +
>>> +static int tps65912_spi_remove(struct spi_device *client)
>>> +{
>>> +	struct tps65912 *tps = spi_get_drvdata(client);
>>> +
>>> +	return tps65912_device_exit(tps);
>>> +}
>>> +
>>> +static const struct spi_device_id tps65912_spi_id_table[] = {
>>> +	{ "tps65912", 0 },
>>> +	{ /* sentinel */ },
>>> +};
>>> +MODULE_DEVICE_TABLE(spi, tps65912_spi_id_table);
>>> +
>>> +static struct spi_driver tps65912_spi_driver = {
>>> +	.driver		= {
>>> +		.name	= "tps65912",
>>> +		.of_match_table = tps65912_spi_of_match_table,
>>> +	},
>>> +	.probe		= tps65912_spi_probe,
>>> +	.remove		= tps65912_spi_remove,
>>> +	.id_table       = tps65912_spi_id_table,
>>> +};
>>> +
>>> +module_spi_driver(tps65912_spi_driver);
>>> +
>>> +MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
>>> +MODULE_DESCRIPTION("TPS65912x SPI Interface Driver");
>>> +MODULE_LICENSE("GPL v2");
>>> diff --git a/include/linux/mfd/tps65912.h b/include/linux/mfd/tps65912.h
>>> new file mode 100644
>>> index 0000000..8843c0d
>>> --- /dev/null
>>> +++ b/include/linux/mfd/tps65912.h
>>> @@ -0,0 +1,345 @@
>>> +/*
>>> + * TI TPS65912x
>>> + *
>>> + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
>>> + *
>>> + * Author: Andrew F. Davis <afd@ti.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.
>>> + *
>>> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any
>>> + * kind, whether expressed or implied; without even the implied warranty
>>> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>> + * GNU General Public License version 2 for more details.
>>> + *
>>> + * Based on the TPS65218 driver and the previous TPS65912 driver by
>>> + * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
>>> + */
>>> +
>>> +#ifndef __LINUX_MFD_TPS65912_H
>>> +#define __LINUX_MFD_TPS65912_H
>>> +
>>> +#include <linux/device.h>
>>> +#include <linux/regmap.h>
>>> +#include <linux/regulator/driver.h>
>>> +
>>> +/* List of registers for TPS65912 */
>>> +#define TPS65912_DCDC1_CTRL		0x00
>>> +#define TPS65912_DCDC2_CTRL		0x01
>>> +#define TPS65912_DCDC3_CTRL		0x02
>>> +#define TPS65912_DCDC4_CTRL		0x03
>>> +#define TPS65912_DCDC1_OP		0x04
>>> +#define TPS65912_DCDC1_AVS		0x05
>>> +#define TPS65912_DCDC1_LIMIT		0x06
>>> +#define TPS65912_DCDC2_OP		0x07
>>> +#define TPS65912_DCDC2_AVS		0x08
>>> +#define TPS65912_DCDC2_LIMIT		0x09
>>> +#define TPS65912_DCDC3_OP		0x0A
>>> +#define TPS65912_DCDC3_AVS		0x0B
>>> +#define TPS65912_DCDC3_LIMIT		0x0C
>>> +#define TPS65912_DCDC4_OP		0x0D
>>> +#define TPS65912_DCDC4_AVS		0x0E
>>> +#define TPS65912_DCDC4_LIMIT		0x0F
>>> +#define TPS65912_LDO1_OP		0x10
>>> +#define TPS65912_LDO1_AVS		0x11
>>> +#define TPS65912_LDO1_LIMIT		0x12
>>> +#define TPS65912_LDO2_OP		0x13
>>> +#define TPS65912_LDO2_AVS		0x14
>>> +#define TPS65912_LDO2_LIMIT		0x15
>>> +#define TPS65912_LDO3_OP		0x16
>>> +#define TPS65912_LDO3_AVS		0x17
>>> +#define TPS65912_LDO3_LIMIT		0x18
>>> +#define TPS65912_LDO4_OP		0x19
>>> +#define TPS65912_LDO4_AVS		0x1A
>>> +#define TPS65912_LDO4_LIMIT		0x1B
>>> +#define TPS65912_LDO5			0x1C
>>> +#define TPS65912_LDO6			0x1D
>>> +#define TPS65912_LDO7			0x1E
>>> +#define TPS65912_LDO8			0x1F
>>> +#define TPS65912_LDO9			0x20
>>> +#define TPS65912_LDO10			0x21
>>> +#define TPS65912_THRM			0x22
>>> +#define TPS65912_CLK32OUT		0x23
>>> +#define TPS65912_DEVCTRL		0x24
>>> +#define TPS65912_DEVCTRL2		0x25
>>> +#define TPS65912_I2C_SPI_CFG		0x26
>>> +#define TPS65912_KEEP_ON		0x27
>>> +#define TPS65912_KEEP_ON2		0x28
>>> +#define TPS65912_SET_OFF1		0x29
>>> +#define TPS65912_SET_OFF2		0x2A
>>> +#define TPS65912_DEF_VOLT		0x2B
>>> +#define TPS65912_DEF_VOLT_MAPPING	0x2C
>>> +#define TPS65912_DISCHARGE		0x2D
>>> +#define TPS65912_DISCHARGE2		0x2E
>>> +#define TPS65912_EN1_SET1		0x2F
>>> +#define TPS65912_EN1_SET2		0x30
>>> +#define TPS65912_EN2_SET1		0x31
>>> +#define TPS65912_EN2_SET2		0x32
>>> +#define TPS65912_EN3_SET1		0x33
>>> +#define TPS65912_EN3_SET2		0x34
>>> +#define TPS65912_EN4_SET1		0x35
>>> +#define TPS65912_EN4_SET2		0x36
>>> +#define TPS65912_PGOOD			0x37
>>> +#define TPS65912_PGOOD2			0x38
>>> +#define TPS65912_INT_STS		0x39
>>> +#define TPS65912_INT_MSK		0x3A
>>> +#define TPS65912_INT_STS2		0x3B
>>> +#define TPS65912_INT_MSK2		0x3C
>>> +#define TPS65912_INT_STS3		0x3D
>>> +#define TPS65912_INT_MSK3		0x3E
>>> +#define TPS65912_INT_STS4		0x3F
>>> +#define TPS65912_INT_MSK4		0x40
>>> +#define TPS65912_GPIO1			0x41
>>> +#define TPS65912_GPIO2			0x42
>>> +#define TPS65912_GPIO3			0x43
>>> +#define TPS65912_GPIO4			0x44
>>> +#define TPS65912_GPIO5			0x45
>>> +#define TPS65912_VMON			0x46
>>> +#define TPS65912_LEDA_CTRL1		0x47
>>> +#define TPS65912_LEDA_CTRL2		0x48
>>> +#define TPS65912_LEDA_CTRL3		0x49
>>> +#define TPS65912_LEDA_CTRL4		0x4A
>>> +#define TPS65912_LEDA_CTRL5		0x4B
>>> +#define TPS65912_LEDA_CTRL6		0x4C
>>> +#define TPS65912_LEDA_CTRL7		0x4D
>>> +#define TPS65912_LEDA_CTRL8		0x4E
>>> +#define TPS65912_LEDB_CTRL1		0x4F
>>> +#define TPS65912_LEDB_CTRL2		0x50
>>> +#define TPS65912_LEDB_CTRL3		0x51
>>> +#define TPS65912_LEDB_CTRL4		0x52
>>> +#define TPS65912_LEDB_CTRL5		0x53
>>> +#define TPS65912_LEDB_CTRL6		0x54
>>> +#define TPS65912_LEDB_CTRL7		0x55
>>> +#define TPS65912_LEDB_CTRL8		0x56
>>> +#define TPS65912_LEDC_CTRL1		0x57
>>> +#define TPS65912_LEDC_CTRL2		0x58
>>> +#define TPS65912_LEDC_CTRL3		0x59
>>> +#define TPS65912_LEDC_CTRL4		0x5A
>>> +#define TPS65912_LEDC_CTRL5		0x5B
>>> +#define TPS65912_LEDC_CTRL6		0x5C
>>> +#define TPS65912_LEDC_CTRL7		0x5D
>>> +#define TPS65912_LEDC_CTRL8		0x5E
>>> +#define TPS65912_LED_RAMP_UP_TIME	0x5F
>>> +#define TPS65912_LED_RAMP_DOWN_TIME	0x60
>>> +#define TPS65912_LED_SEQ_EN		0x61
>>> +#define TPS65912_LOADSWITCH		0x62
>>> +#define TPS65912_SPARE			0x63
>>> +#define TPS65912_VERNUM			0x64
>>> +#define TPS6591X_MAX_REGISTER		0x64
>>> +
>>> +/* INT_STS Register field definitions */
>>> +#define TPS65912_INT_STS_PWRHOLD_F	BIT(0)
>>> +#define TPS65912_INT_STS_VMON		BIT(1)
>>> +#define TPS65912_INT_STS_PWRON		BIT(2)
>>> +#define TPS65912_INT_STS_PWRON_LP	BIT(3)
>>> +#define TPS65912_INT_STS_PWRHOLD_R	BIT(4)
>>> +#define TPS65912_INT_STS_HOTDIE		BIT(5)
>>> +#define TPS65912_INT_STS_GPIO1_R	BIT(6)
>>> +#define TPS65912_INT_STS_GPIO1_F	BIT(7)
>>> +
>>> +/* INT_STS Register field definitions */
>>> +#define TPS65912_INT_STS2_GPIO2_R	BIT(0)
>>> +#define TPS65912_INT_STS2_GPIO2_F	BIT(1)
>>> +#define TPS65912_INT_STS2_GPIO3_R	BIT(2)
>>> +#define TPS65912_INT_STS2_GPIO3_F	BIT(3)
>>> +#define TPS65912_INT_STS2_GPIO4_R	BIT(4)
>>> +#define TPS65912_INT_STS2_GPIO4_F	BIT(5)
>>> +#define TPS65912_INT_STS2_GPIO5_R	BIT(6)
>>> +#define TPS65912_INT_STS2_GPIO5_F	BIT(7)
>>> +
>>> +/* INT_STS Register field definitions */
>>> +#define TPS65912_INT_STS3_PGOOD_DCDC1	BIT(0)
>>> +#define TPS65912_INT_STS3_PGOOD_DCDC2	BIT(1)
>>> +#define TPS65912_INT_STS3_PGOOD_DCDC3	BIT(2)
>>> +#define TPS65912_INT_STS3_PGOOD_DCDC4	BIT(3)
>>> +#define TPS65912_INT_STS3_PGOOD_LDO1	BIT(4)
>>> +#define TPS65912_INT_STS3_PGOOD_LDO2	BIT(5)
>>> +#define TPS65912_INT_STS3_PGOOD_LDO3	BIT(6)
>>> +#define TPS65912_INT_STS3_PGOOD_LDO4	BIT(7)
>>> +
>>> +/* INT_STS Register field definitions */
>>> +#define TPS65912_INT_STS4_PGOOD_LDO5	BIT(0)
>>> +#define TPS65912_INT_STS4_PGOOD_LDO6	BIT(1)
>>> +#define TPS65912_INT_STS4_PGOOD_LDO7	BIT(2)
>>> +#define TPS65912_INT_STS4_PGOOD_LDO8	BIT(3)
>>> +#define TPS65912_INT_STS4_PGOOD_LDO9	BIT(4)
>>> +#define TPS65912_INT_STS4_PGOOD_LDO10	BIT(5)
>>> +
>>> +/* GPIO 1 and 2 Register field definitions */
>>> +#define GPIO_SLEEP_MASK			0x80
>>> +#define GPIO_SLEEP_SHIFT		7
>>> +#define GPIO_DEB_MASK			0x10
>>> +#define GPIO_DEB_SHIFT			4
>>> +#define GPIO_CFG_MASK			0x04
>>> +#define GPIO_CFG_SHIFT			2
>>> +#define GPIO_STS_MASK			0x02
>>> +#define GPIO_STS_SHIFT			1
>>> +#define GPIO_SET_MASK			0x01
>>> +#define GPIO_SET_SHIFT			0
>>> +
>>> +/* GPIO 3 Register field definitions */
>>> +#define GPIO3_SLEEP_MASK		0x80
>>> +#define GPIO3_SLEEP_SHIFT		7
>>> +#define GPIO3_SEL_MASK			0x40
>>> +#define GPIO3_SEL_SHIFT			6
>>> +#define GPIO3_ODEN_MASK			0x20
>>> +#define GPIO3_ODEN_SHIFT		5
>>> +#define GPIO3_DEB_MASK			0x10
>>> +#define GPIO3_DEB_SHIFT			4
>>> +#define GPIO3_PDEN_MASK			0x08
>>> +#define GPIO3_PDEN_SHIFT		3
>>> +#define GPIO3_CFG_MASK			0x04
>>> +#define GPIO3_CFG_SHIFT			2
>>> +#define GPIO3_STS_MASK			0x02
>>> +#define GPIO3_STS_SHIFT			1
>>> +#define GPIO3_SET_MASK			0x01
>>> +#define GPIO3_SET_SHIFT			0
>>> +
>>> +/* GPIO 4 Register field definitions */
>>> +#define GPIO4_SLEEP_MASK		0x80
>>> +#define GPIO4_SLEEP_SHIFT		7
>>> +#define GPIO4_SEL_MASK			0x40
>>> +#define GPIO4_SEL_SHIFT			6
>>> +#define GPIO4_ODEN_MASK			0x20
>>> +#define GPIO4_ODEN_SHIFT		5
>>> +#define GPIO4_DEB_MASK			0x10
>>> +#define GPIO4_DEB_SHIFT			4
>>> +#define GPIO4_PDEN_MASK			0x08
>>> +#define GPIO4_PDEN_SHIFT		3
>>> +#define GPIO4_CFG_MASK			0x04
>>> +#define GPIO4_CFG_SHIFT			2
>>> +#define GPIO4_STS_MASK			0x02
>>> +#define GPIO4_STS_SHIFT			1
>>> +#define GPIO4_SET_MASK			0x01
>>> +#define GPIO4_SET_SHIFT			0
>>> +
>>> +/* Register THERM  (0x80) register.RegisterDescription */
>>> +#define THERM_THERM_HD_MASK		0x20
>>> +#define THERM_THERM_HD_SHIFT		5
>>> +#define THERM_THERM_TS_MASK		0x10
>>> +#define THERM_THERM_TS_SHIFT		4
>>> +#define THERM_THERM_HDSEL_MASK		0x0C
>>> +#define THERM_THERM_HDSEL_SHIFT		2
>>> +#define THERM_RSVD1_MASK		0x02
>>> +#define THERM_RSVD1_SHIFT		1
>>> +#define THERM_THERM_STATE_MASK		0x01
>>> +#define THERM_THERM_STATE_SHIFT		0
>>> +
>>> +/* Register DCDCCTRL1 register.RegisterDescription */
>>> +#define DCDCCTRL_VCON_ENABLE_MASK	0x80
>>> +#define DCDCCTRL_VCON_ENABLE_SHIFT	7
>>> +#define DCDCCTRL_VCON_RANGE1_MASK	0x40
>>> +#define DCDCCTRL_VCON_RANGE1_SHIFT	6
>>> +#define DCDCCTRL_VCON_RANGE0_MASK	0x20
>>> +#define DCDCCTRL_VCON_RANGE0_SHIFT	5
>>> +#define DCDCCTRL_TSTEP2_MASK		0x10
>>> +#define DCDCCTRL_TSTEP2_SHIFT		4
>>> +#define DCDCCTRL_TSTEP1_MASK		0x08
>>> +#define DCDCCTRL_TSTEP1_SHIFT		3
>>> +#define DCDCCTRL_TSTEP0_MASK		0x04
>>> +#define DCDCCTRL_TSTEP0_SHIFT		2
>>> +#define DCDCCTRL_DCDC1_MODE_MASK	0x02
>>> +#define DCDCCTRL_DCDC1_MODE_SHIFT	1
>>> +
>>> +/* Register DCDCCTRL2 and DCDCCTRL3 register.RegisterDescription */
>>> +#define DCDCCTRL_TSTEP2_MASK		0x10
>>> +#define DCDCCTRL_TSTEP2_SHIFT		4
>>> +#define DCDCCTRL_TSTEP1_MASK		0x08
>>> +#define DCDCCTRL_TSTEP1_SHIFT		3
>>> +#define DCDCCTRL_TSTEP0_MASK		0x04
>>> +#define DCDCCTRL_TSTEP0_SHIFT		2
>>> +#define DCDCCTRL_DCDC_MODE_MASK		0x02
>>> +#define DCDCCTRL_DCDC_MODE_SHIFT	1
>>> +#define DCDCCTRL_RSVD0_MASK		0x01
>>> +#define DCDCCTRL_RSVD0_SHIFT		0
>>> +
>>> +/* Register DCDCCTRL4 register.RegisterDescription */
>>> +#define DCDCCTRL_RAMP_TIME_MASK		0x01
>>> +#define DCDCCTRL_RAMP_TIME_SHIFT	0
>>> +
>>> +/* Register DCDCx_AVS */
>>> +#define DCDC_AVS_ENABLE_MASK		0x80
>>> +#define DCDC_AVS_ENABLE_SHIFT		7
>>> +#define DCDC_AVS_ECO_MASK		0x40
>>> +#define DCDC_AVS_ECO_SHIFT		6
>>> +
>>> +/* Register DCDCx_LIMIT */
>>> +#define DCDC_LIMIT_RANGE_MASK		0xC0
>>> +#define DCDC_LIMIT_RANGE_SHIFT		6
>>> +#define DCDC_LIMIT_MAX_SEL_MASK		0x3F
>>> +#define DCDC_LIMIT_MAX_SEL_SHIFT	0
>>> +
>>> +/* Define the TPS65912 IRQ numbers */
>>> +enum tps65912_irqs {
>>> +	/* INT_STS registers */
>>> +	TPS65912_IRQ_PWRHOLD_F,
>>> +	TPS65912_IRQ_VMON,
>>> +	TPS65912_IRQ_PWRON,
>>> +	TPS65912_IRQ_PWRON_LP,
>>> +	TPS65912_IRQ_PWRHOLD_R,
>>> +	TPS65912_IRQ_HOTDIE,
>>> +	TPS65912_IRQ_GPIO1_R,
>>> +	TPS65912_IRQ_GPIO1_F,
>>> +	/* INT_STS2 registers */
>>> +	TPS65912_IRQ_GPIO2_R,
>>> +	TPS65912_IRQ_GPIO2_F,
>>> +	TPS65912_IRQ_GPIO3_R,
>>> +	TPS65912_IRQ_GPIO3_F,
>>> +	TPS65912_IRQ_GPIO4_R,
>>> +	TPS65912_IRQ_GPIO4_F,
>>> +	TPS65912_IRQ_GPIO5_R,
>>> +	TPS65912_IRQ_GPIO5_F,
>>> +	/* INT_STS3 registers */
>>> +	TPS65912_IRQ_PGOOD_DCDC1,
>>> +	TPS65912_IRQ_PGOOD_DCDC2,
>>> +	TPS65912_IRQ_PGOOD_DCDC3,
>>> +	TPS65912_IRQ_PGOOD_DCDC4,
>>> +	TPS65912_IRQ_PGOOD_LDO1,
>>> +	TPS65912_IRQ_PGOOD_LDO2,
>>> +	TPS65912_IRQ_PGOOD_LDO3,
>>> +	TPS65912_IRQ_PGOOD_LDO4,
>>> +	/* INT_STS4 registers */
>>> +	TPS65912_IRQ_PGOOD_LDO5,
>>> +	TPS65912_IRQ_PGOOD_LDO6,
>>> +	TPS65912_IRQ_PGOOD_LDO7,
>>> +	TPS65912_IRQ_PGOOD_LDO8,
>>> +	TPS65912_IRQ_PGOOD_LDO9,
>>> +	TPS65912_IRQ_PGOOD_LDO10,
>>> +};
>>> +
>>> +/*
>>> + * struct tps65912 - state holder for the tps65912 driver
>>> + *
>>> + * Device data may be used to access the TPS65912 chip
>>> + */
>>> +struct tps65912 {
>>> +	struct device *dev;
>>> +	struct regmap *regmap;
>>> +
>>> +	/* IRQ Data */
>>> +	int irq;
>>> +	struct regmap_irq_chip_data *irq_data;
>>> +};
>>> +
>>> +static const struct regmap_range tps65912_yes_ranges[] = {
>>> +	regmap_reg_range(TPS65912_INT_STS, TPS65912_GPIO5),
>>> +};
>>> +
>>> +static const struct regmap_access_table tps65912_volatile_table = {
>>> +	.yes_ranges = tps65912_yes_ranges,
>>> +	.n_yes_ranges = ARRAY_SIZE(tps65912_yes_ranges),
>>> +};
>>> +
>>> +static const struct regmap_config tps65912_regmap_config = {
>>> +	.reg_bits = 8,
>>> +	.val_bits = 8,
>>> +	.cache_type = REGCACHE_RBTREE,
>>> +	.volatile_table = &tps65912_volatile_table,
>>> +};
>>> +
>>> +int tps65912_device_init(struct tps65912 *tps);
>>> +int tps65912_device_exit(struct tps65912 *tps);
>>> +
>>> +#endif /*  __LINUX_MFD_TPS65912_H */
>>
>

-- 
Andrew F. Davis

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

* Re: [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC
  2015-10-12 15:06       ` Andrew F. Davis
@ 2015-10-13  7:34         ` Lee Jones
  0 siblings, 0 replies; 44+ messages in thread
From: Lee Jones @ 2015-10-13  7:34 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Mark Brown, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On Mon, 12 Oct 2015, Andrew F. Davis wrote:

> On 10/05/2015 04:27 AM, Lee Jones wrote:
> >On Mon, 05 Oct 2015, Lee Jones wrote:
> >
> >>On Thu, 01 Oct 2015, Andrew F. Davis wrote:
> >>
> >>>This patch adds support for TPS65912 mfd device. It provides
> >>>communication through the I2C and SPI interfaces. It contains
> >>>the following components:
> >>>
> >>>  - Regulators
> >>>  - GPIO controller
> >>>
> >>>Signed-off-by: Andrew F. Davis <afd@ti.com>
> >>>---
> >>>  drivers/mfd/Kconfig          |  25 ++++
> >>>  drivers/mfd/Makefile         |   3 +
> >>>  drivers/mfd/tps65912-core.c  | 108 ++++++++++++++
> >>>  drivers/mfd/tps65912-i2c.c   |  82 ++++++++++
> >>>  drivers/mfd/tps65912-spi.c   |  81 ++++++++++
> >>>  include/linux/mfd/tps65912.h | 345 +++++++++++++++++++++++++++++++++++++++++++
> >>>  6 files changed, 644 insertions(+)
> >>>  create mode 100644 drivers/mfd/tps65912-core.c
> >>>  create mode 100644 drivers/mfd/tps65912-i2c.c
> >>>  create mode 100644 drivers/mfd/tps65912-spi.c
> >>>  create mode 100644 include/linux/mfd/tps65912.h
> >>
> >>Applied, thanks.
> >
> >Whoops, I forgot about the removal patch.
> >
> >For this patch:
> >   Acked-by: Lee Jones <lee.jones@linaro.org>
> >
> >Can you break up the removal patch into subsystems as well?
> >
> 
> I can if you would like, but as I responded in the other patch I
> think that will cause problems as the Kconfig symbols in the new
> will allow the old to be compiled and this will break build. All
> the removals may have to be brought in in a single patch, again
> up to you.

If the other Maintainers are happy, I'll just take the set through
MFD and provide the necessaries.  Just collect the Acks you need and
I'll do the rest.

> >>>diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> >>>index 9a8df8e..02b321f 100644
> >>>--- a/drivers/mfd/Kconfig
> >>>+++ b/drivers/mfd/Kconfig
> >>>@@ -1167,6 +1167,31 @@ config MFD_TPS65910
> >>>  	  if you say yes here you get support for the TPS65910 series of
> >>>  	  Power Management chips.
> >>>
> >>>+config MFD_TPS65912
> >>>+	tristate
> >>>+	select REGMAP
> >>>+	select REGMAP_IRQ
> >>>+
> >>>+config MFD_TPS65912_I2C
> >>>+	tristate "TI TPS65912 Power Management chip with I2C"
> >>>+	select MFD_TPS65912
> >>>+	select REGMAP_I2C
> >>>+	depends on I2C
> >>>+	depends on OF || COMPILE_TEST
> >>>+	help
> >>>+	  If you say yes here you get support for the TPS65912 series of
> >>>+	  PM chips with I2C interface.
> >>>+
> >>>+config MFD_TPS65912_SPI
> >>>+	tristate "TI TPS65912 Power Management chip with SPI"
> >>>+	select MFD_TPS65912
> >>>+	select REGMAP_SPI
> >>>+	depends on SPI_MASTER
> >>>+	depends on OF || COMPILE_TEST
> >>>+	help
> >>>+	  If you say yes here you get support for the TPS65912 series of
> >>>+	  PM chips with SPI interface.
> >>>+
> >>>  config MFD_TPS80031
> >>>  	bool "TI TPS80031/TPS80032 Power Management chips"
> >>>  	depends on I2C=y
> >>>diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> >>>index 004aa76..49c3530 100644
> >>>--- a/drivers/mfd/Makefile
> >>>+++ b/drivers/mfd/Makefile
> >>>@@ -69,6 +69,9 @@ obj-$(CONFIG_TPS6507X)		+= tps6507x.o
> >>>  obj-$(CONFIG_MFD_TPS65217)	+= tps65217.o
> >>>  obj-$(CONFIG_MFD_TPS65218)	+= tps65218.o
> >>>  obj-$(CONFIG_MFD_TPS65910)	+= tps65910.o
> >>>+obj-$(CONFIG_MFD_TPS65912)	+= tps65912-core.o
> >>>+obj-$(CONFIG_MFD_TPS65912_I2C)	+= tps65912-i2c.o
> >>>+obj-$(CONFIG_MFD_TPS65912_SPI)  += tps65912-spi.o
> >>>  obj-$(CONFIG_MFD_TPS80031)	+= tps80031.o
> >>>  obj-$(CONFIG_MENELAUS)		+= menelaus.o
> >>>
> >>>diff --git a/drivers/mfd/tps65912-core.c b/drivers/mfd/tps65912-core.c
> >>>new file mode 100644
> >>>index 0000000..e787950
> >>>--- /dev/null
> >>>+++ b/drivers/mfd/tps65912-core.c
> >>>@@ -0,0 +1,108 @@
> >>>+/*
> >>>+ * Core functions for TI TPS65912x PMIC
> >>>+ *
> >>>+ * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
> >>>+ *
> >>>+ * Author: Andrew F. Davis <afd@ti.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.
> >>>+ *
> >>>+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> >>>+ * kind, whether expressed or implied; without even the implied warranty
> >>>+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> >>>+ * GNU General Public License version 2 for more details.
> >>>+ *
> >>>+ * Based on the TPS65218 driver and the previous TPS65912 driver by
> >>>+ * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> >>>+ */
> >>>+
> >>>+#include <linux/interrupt.h>
> >>>+#include <linux/module.h>
> >>>+#include <linux/of_device.h>
> >>>+
> >>>+#include <linux/mfd/tps65912.h>
> >>>+
> >>>+static const struct regmap_irq tps65912_irqs[] = {
> >>>+	/* INT_STS IRQs */
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_F, 0, TPS65912_INT_STS_PWRHOLD_F),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_VMON, 0, TPS65912_INT_STS_VMON),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PWRON, 0, TPS65912_INT_STS_PWRON),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PWRON_LP, 0, TPS65912_INT_STS_PWRON_LP),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PWRHOLD_R, 0, TPS65912_INT_STS_PWRHOLD_R),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_HOTDIE, 0, TPS65912_INT_STS_HOTDIE),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_R, 0, TPS65912_INT_STS_GPIO1_R),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO1_F, 0, TPS65912_INT_STS_GPIO1_F),
> >>>+	/* INT_STS2 IRQs */
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO2_R, 1, TPS65912_INT_STS2_GPIO2_R),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO2_F, 1, TPS65912_INT_STS2_GPIO2_F),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO3_R, 1, TPS65912_INT_STS2_GPIO3_R),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO3_F, 1, TPS65912_INT_STS2_GPIO3_F),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO4_R, 1, TPS65912_INT_STS2_GPIO4_R),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO4_F, 1, TPS65912_INT_STS2_GPIO4_F),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO5_R, 1, TPS65912_INT_STS2_GPIO5_R),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_GPIO5_F, 1, TPS65912_INT_STS2_GPIO5_F),
> >>>+	/* INT_STS3 IRQs */
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC1, 2, TPS65912_INT_STS3_PGOOD_DCDC1),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC2, 2, TPS65912_INT_STS3_PGOOD_DCDC2),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC3, 2, TPS65912_INT_STS3_PGOOD_DCDC3),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_DCDC4, 2, TPS65912_INT_STS3_PGOOD_DCDC4),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO1, 2, TPS65912_INT_STS3_PGOOD_LDO1),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO2, 2, TPS65912_INT_STS3_PGOOD_LDO2),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO3, 2, TPS65912_INT_STS3_PGOOD_LDO3),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO4, 2, TPS65912_INT_STS3_PGOOD_LDO4),
> >>>+	/* INT_STS4 IRQs */
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO5, 3, TPS65912_INT_STS4_PGOOD_LDO5),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO6, 3, TPS65912_INT_STS4_PGOOD_LDO6),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO7, 3, TPS65912_INT_STS4_PGOOD_LDO7),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO8, 3, TPS65912_INT_STS4_PGOOD_LDO8),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO9, 3, TPS65912_INT_STS4_PGOOD_LDO9),
> >>>+	REGMAP_IRQ_REG(TPS65912_IRQ_PGOOD_LDO10, 3, TPS65912_INT_STS4_PGOOD_LDO10),
> >>>+};
> >>>+
> >>>+static struct regmap_irq_chip tps65912_irq_chip = {
> >>>+	.name = "tps65912",
> >>>+	.irqs = tps65912_irqs,
> >>>+	.num_irqs = ARRAY_SIZE(tps65912_irqs),
> >>>+	.num_regs = 4,
> >>>+	.irq_reg_stride = 2,
> >>>+	.mask_base = TPS65912_INT_MSK,
> >>>+	.status_base = TPS65912_INT_STS,
> >>>+	.ack_base = TPS65912_INT_STS,
> >>>+	.init_ack_masked = true,
> >>>+};
> >>>+
> >>>+int tps65912_device_init(struct tps65912 *tps)
> >>>+{
> >>>+	int ret;
> >>>+
> >>>+	ret = regmap_add_irq_chip(tps->regmap, tps->irq, IRQF_ONESHOT, 0,
> >>>+				  &tps65912_irq_chip, &tps->irq_data);
> >>>+	if (ret < 0)
> >>>+		return ret;
> >>>+
> >>>+	ret = of_platform_populate(tps->dev->of_node, NULL, NULL, tps->dev);
> >>>+	if (ret < 0)
> >>>+		goto err_irq;
> >>>+
> >>>+	return 0;
> >>>+
> >>>+err_irq:
> >>>+	regmap_del_irq_chip(tps->irq, tps->irq_data);
> >>>+
> >>>+	return ret;
> >>>+}
> >>>+EXPORT_SYMBOL_GPL(tps65912_device_init);
> >>>+
> >>>+int tps65912_device_exit(struct tps65912 *tps)
> >>>+{
> >>>+	regmap_del_irq_chip(tps->irq, tps->irq_data);
> >>>+
> >>>+	return 0;
> >>>+}
> >>>+EXPORT_SYMBOL_GPL(tps65912_device_exit);
> >>>+
> >>>+MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
> >>>+MODULE_DESCRIPTION("TPS65912x MFD Driver");
> >>>+MODULE_LICENSE("GPL v2");
> >>>diff --git a/drivers/mfd/tps65912-i2c.c b/drivers/mfd/tps65912-i2c.c
> >>>new file mode 100644
> >>>index 0000000..bdae10b01
> >>>--- /dev/null
> >>>+++ b/drivers/mfd/tps65912-i2c.c
> >>>@@ -0,0 +1,82 @@
> >>>+/*
> >>>+ * I2C access driver for TI TPS65912x PMIC
> >>>+ *
> >>>+ * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
> >>>+ *
> >>>+ * Author: Andrew F. Davis <afd@ti.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.
> >>>+ *
> >>>+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> >>>+ * kind, whether expressed or implied; without even the implied warranty
> >>>+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> >>>+ * GNU General Public License version 2 for more details.
> >>>+ *
> >>>+ * Based on the TPS65218 driver and the previous TPS65912 driver by
> >>>+ * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> >>>+ */
> >>>+
> >>>+#include <linux/i2c.h>
> >>>+#include <linux/module.h>
> >>>+#include <linux/of_device.h>
> >>>+#include <linux/regmap.h>
> >>>+
> >>>+#include <linux/mfd/tps65912.h>
> >>>+
> >>>+static const struct of_device_id tps65912_i2c_of_match_table[] = {
> >>>+	{ .compatible = "ti,tps65912", },
> >>>+	{ /* sentinel */ }
> >>>+};
> >>>+
> >>>+static int tps65912_i2c_probe(struct i2c_client *client,
> >>>+			      const struct i2c_device_id *ids)
> >>>+{
> >>>+	struct tps65912 *tps;
> >>>+
> >>>+	tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
> >>>+	if (!tps)
> >>>+		return -ENOMEM;
> >>>+
> >>>+	i2c_set_clientdata(client, tps);
> >>>+	tps->dev = &client->dev;
> >>>+	tps->irq = client->irq;
> >>>+
> >>>+	tps->regmap = devm_regmap_init_i2c(client, &tps65912_regmap_config);
> >>>+	if (IS_ERR(tps->regmap)) {
> >>>+		dev_err(tps->dev, "Failed to initialize register map\n");
> >>>+		return PTR_ERR(tps->regmap);
> >>>+	}
> >>>+
> >>>+	return tps65912_device_init(tps);
> >>>+}
> >>>+
> >>>+static int tps65912_i2c_remove(struct i2c_client *client)
> >>>+{
> >>>+	struct tps65912 *tps = i2c_get_clientdata(client);
> >>>+
> >>>+	return tps65912_device_exit(tps);
> >>>+}
> >>>+
> >>>+static const struct i2c_device_id tps65912_i2c_id_table[] = {
> >>>+	{ "tps65912", 0 },
> >>>+	{ /* sentinel */ },
> >>>+};
> >>>+MODULE_DEVICE_TABLE(i2c, tps65912_i2c_id_table);
> >>>+
> >>>+static struct i2c_driver tps65912_i2c_driver = {
> >>>+	.driver		= {
> >>>+		.name	= "tps65912",
> >>>+		.of_match_table = tps65912_i2c_of_match_table,
> >>>+	},
> >>>+	.probe		= tps65912_i2c_probe,
> >>>+	.remove		= tps65912_i2c_remove,
> >>>+	.id_table       = tps65912_i2c_id_table,
> >>>+};
> >>>+
> >>>+module_i2c_driver(tps65912_i2c_driver);
> >>>+
> >>>+MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
> >>>+MODULE_DESCRIPTION("TPS65912x I2C Interface Driver");
> >>>+MODULE_LICENSE("GPL v2");
> >>>diff --git a/drivers/mfd/tps65912-spi.c b/drivers/mfd/tps65912-spi.c
> >>>new file mode 100644
> >>>index 0000000..24c5c97
> >>>--- /dev/null
> >>>+++ b/drivers/mfd/tps65912-spi.c
> >>>@@ -0,0 +1,81 @@
> >>>+/*
> >>>+ * SPI access driver for TI TPS65912x PMIC
> >>>+ *
> >>>+ * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
> >>>+ *
> >>>+ * Author: Andrew F. Davis <afd@ti.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.
> >>>+ *
> >>>+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> >>>+ * kind, whether expressed or implied; without even the implied warranty
> >>>+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> >>>+ * GNU General Public License version 2 for more details.
> >>>+ *
> >>>+ * Based on the TPS65218 driver and the previous TPS65912 driver by
> >>>+ * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> >>>+ */
> >>>+
> >>>+#include <linux/module.h>
> >>>+#include <linux/of_device.h>
> >>>+#include <linux/regmap.h>
> >>>+#include <linux/spi/spi.h>
> >>>+
> >>>+#include <linux/mfd/tps65912.h>
> >>>+
> >>>+static const struct of_device_id tps65912_spi_of_match_table[] = {
> >>>+	{ .compatible = "ti,tps65912", },
> >>>+	{ /* sentinel */ }
> >>>+};
> >>>+
> >>>+static int tps65912_spi_probe(struct spi_device *spi)
> >>>+{
> >>>+	struct tps65912 *tps;
> >>>+
> >>>+	tps = devm_kzalloc(&spi->dev, sizeof(*tps), GFP_KERNEL);
> >>>+	if (!tps)
> >>>+		return -ENOMEM;
> >>>+
> >>>+	spi_set_drvdata(spi, tps);
> >>>+	tps->dev = &spi->dev;
> >>>+	tps->irq = spi->irq;
> >>>+
> >>>+	tps->regmap = devm_regmap_init_spi(spi, &tps65912_regmap_config);
> >>>+	if (IS_ERR(tps->regmap)) {
> >>>+		dev_err(tps->dev, "Failed to initialize register map\n");
> >>>+		return PTR_ERR(tps->regmap);
> >>>+	}
> >>>+
> >>>+	return tps65912_device_init(tps);
> >>>+}
> >>>+
> >>>+static int tps65912_spi_remove(struct spi_device *client)
> >>>+{
> >>>+	struct tps65912 *tps = spi_get_drvdata(client);
> >>>+
> >>>+	return tps65912_device_exit(tps);
> >>>+}
> >>>+
> >>>+static const struct spi_device_id tps65912_spi_id_table[] = {
> >>>+	{ "tps65912", 0 },
> >>>+	{ /* sentinel */ },
> >>>+};
> >>>+MODULE_DEVICE_TABLE(spi, tps65912_spi_id_table);
> >>>+
> >>>+static struct spi_driver tps65912_spi_driver = {
> >>>+	.driver		= {
> >>>+		.name	= "tps65912",
> >>>+		.of_match_table = tps65912_spi_of_match_table,
> >>>+	},
> >>>+	.probe		= tps65912_spi_probe,
> >>>+	.remove		= tps65912_spi_remove,
> >>>+	.id_table       = tps65912_spi_id_table,
> >>>+};
> >>>+
> >>>+module_spi_driver(tps65912_spi_driver);
> >>>+
> >>>+MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
> >>>+MODULE_DESCRIPTION("TPS65912x SPI Interface Driver");
> >>>+MODULE_LICENSE("GPL v2");
> >>>diff --git a/include/linux/mfd/tps65912.h b/include/linux/mfd/tps65912.h
> >>>new file mode 100644
> >>>index 0000000..8843c0d
> >>>--- /dev/null
> >>>+++ b/include/linux/mfd/tps65912.h
> >>>@@ -0,0 +1,345 @@
> >>>+/*
> >>>+ * TI TPS65912x
> >>>+ *
> >>>+ * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
> >>>+ *
> >>>+ * Author: Andrew F. Davis <afd@ti.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.
> >>>+ *
> >>>+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
> >>>+ * kind, whether expressed or implied; without even the implied warranty
> >>>+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> >>>+ * GNU General Public License version 2 for more details.
> >>>+ *
> >>>+ * Based on the TPS65218 driver and the previous TPS65912 driver by
> >>>+ * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
> >>>+ */
> >>>+
> >>>+#ifndef __LINUX_MFD_TPS65912_H
> >>>+#define __LINUX_MFD_TPS65912_H
> >>>+
> >>>+#include <linux/device.h>
> >>>+#include <linux/regmap.h>
> >>>+#include <linux/regulator/driver.h>
> >>>+
> >>>+/* List of registers for TPS65912 */
> >>>+#define TPS65912_DCDC1_CTRL		0x00
> >>>+#define TPS65912_DCDC2_CTRL		0x01
> >>>+#define TPS65912_DCDC3_CTRL		0x02
> >>>+#define TPS65912_DCDC4_CTRL		0x03
> >>>+#define TPS65912_DCDC1_OP		0x04
> >>>+#define TPS65912_DCDC1_AVS		0x05
> >>>+#define TPS65912_DCDC1_LIMIT		0x06
> >>>+#define TPS65912_DCDC2_OP		0x07
> >>>+#define TPS65912_DCDC2_AVS		0x08
> >>>+#define TPS65912_DCDC2_LIMIT		0x09
> >>>+#define TPS65912_DCDC3_OP		0x0A
> >>>+#define TPS65912_DCDC3_AVS		0x0B
> >>>+#define TPS65912_DCDC3_LIMIT		0x0C
> >>>+#define TPS65912_DCDC4_OP		0x0D
> >>>+#define TPS65912_DCDC4_AVS		0x0E
> >>>+#define TPS65912_DCDC4_LIMIT		0x0F
> >>>+#define TPS65912_LDO1_OP		0x10
> >>>+#define TPS65912_LDO1_AVS		0x11
> >>>+#define TPS65912_LDO1_LIMIT		0x12
> >>>+#define TPS65912_LDO2_OP		0x13
> >>>+#define TPS65912_LDO2_AVS		0x14
> >>>+#define TPS65912_LDO2_LIMIT		0x15
> >>>+#define TPS65912_LDO3_OP		0x16
> >>>+#define TPS65912_LDO3_AVS		0x17
> >>>+#define TPS65912_LDO3_LIMIT		0x18
> >>>+#define TPS65912_LDO4_OP		0x19
> >>>+#define TPS65912_LDO4_AVS		0x1A
> >>>+#define TPS65912_LDO4_LIMIT		0x1B
> >>>+#define TPS65912_LDO5			0x1C
> >>>+#define TPS65912_LDO6			0x1D
> >>>+#define TPS65912_LDO7			0x1E
> >>>+#define TPS65912_LDO8			0x1F
> >>>+#define TPS65912_LDO9			0x20
> >>>+#define TPS65912_LDO10			0x21
> >>>+#define TPS65912_THRM			0x22
> >>>+#define TPS65912_CLK32OUT		0x23
> >>>+#define TPS65912_DEVCTRL		0x24
> >>>+#define TPS65912_DEVCTRL2		0x25
> >>>+#define TPS65912_I2C_SPI_CFG		0x26
> >>>+#define TPS65912_KEEP_ON		0x27
> >>>+#define TPS65912_KEEP_ON2		0x28
> >>>+#define TPS65912_SET_OFF1		0x29
> >>>+#define TPS65912_SET_OFF2		0x2A
> >>>+#define TPS65912_DEF_VOLT		0x2B
> >>>+#define TPS65912_DEF_VOLT_MAPPING	0x2C
> >>>+#define TPS65912_DISCHARGE		0x2D
> >>>+#define TPS65912_DISCHARGE2		0x2E
> >>>+#define TPS65912_EN1_SET1		0x2F
> >>>+#define TPS65912_EN1_SET2		0x30
> >>>+#define TPS65912_EN2_SET1		0x31
> >>>+#define TPS65912_EN2_SET2		0x32
> >>>+#define TPS65912_EN3_SET1		0x33
> >>>+#define TPS65912_EN3_SET2		0x34
> >>>+#define TPS65912_EN4_SET1		0x35
> >>>+#define TPS65912_EN4_SET2		0x36
> >>>+#define TPS65912_PGOOD			0x37
> >>>+#define TPS65912_PGOOD2			0x38
> >>>+#define TPS65912_INT_STS		0x39
> >>>+#define TPS65912_INT_MSK		0x3A
> >>>+#define TPS65912_INT_STS2		0x3B
> >>>+#define TPS65912_INT_MSK2		0x3C
> >>>+#define TPS65912_INT_STS3		0x3D
> >>>+#define TPS65912_INT_MSK3		0x3E
> >>>+#define TPS65912_INT_STS4		0x3F
> >>>+#define TPS65912_INT_MSK4		0x40
> >>>+#define TPS65912_GPIO1			0x41
> >>>+#define TPS65912_GPIO2			0x42
> >>>+#define TPS65912_GPIO3			0x43
> >>>+#define TPS65912_GPIO4			0x44
> >>>+#define TPS65912_GPIO5			0x45
> >>>+#define TPS65912_VMON			0x46
> >>>+#define TPS65912_LEDA_CTRL1		0x47
> >>>+#define TPS65912_LEDA_CTRL2		0x48
> >>>+#define TPS65912_LEDA_CTRL3		0x49
> >>>+#define TPS65912_LEDA_CTRL4		0x4A
> >>>+#define TPS65912_LEDA_CTRL5		0x4B
> >>>+#define TPS65912_LEDA_CTRL6		0x4C
> >>>+#define TPS65912_LEDA_CTRL7		0x4D
> >>>+#define TPS65912_LEDA_CTRL8		0x4E
> >>>+#define TPS65912_LEDB_CTRL1		0x4F
> >>>+#define TPS65912_LEDB_CTRL2		0x50
> >>>+#define TPS65912_LEDB_CTRL3		0x51
> >>>+#define TPS65912_LEDB_CTRL4		0x52
> >>>+#define TPS65912_LEDB_CTRL5		0x53
> >>>+#define TPS65912_LEDB_CTRL6		0x54
> >>>+#define TPS65912_LEDB_CTRL7		0x55
> >>>+#define TPS65912_LEDB_CTRL8		0x56
> >>>+#define TPS65912_LEDC_CTRL1		0x57
> >>>+#define TPS65912_LEDC_CTRL2		0x58
> >>>+#define TPS65912_LEDC_CTRL3		0x59
> >>>+#define TPS65912_LEDC_CTRL4		0x5A
> >>>+#define TPS65912_LEDC_CTRL5		0x5B
> >>>+#define TPS65912_LEDC_CTRL6		0x5C
> >>>+#define TPS65912_LEDC_CTRL7		0x5D
> >>>+#define TPS65912_LEDC_CTRL8		0x5E
> >>>+#define TPS65912_LED_RAMP_UP_TIME	0x5F
> >>>+#define TPS65912_LED_RAMP_DOWN_TIME	0x60
> >>>+#define TPS65912_LED_SEQ_EN		0x61
> >>>+#define TPS65912_LOADSWITCH		0x62
> >>>+#define TPS65912_SPARE			0x63
> >>>+#define TPS65912_VERNUM			0x64
> >>>+#define TPS6591X_MAX_REGISTER		0x64
> >>>+
> >>>+/* INT_STS Register field definitions */
> >>>+#define TPS65912_INT_STS_PWRHOLD_F	BIT(0)
> >>>+#define TPS65912_INT_STS_VMON		BIT(1)
> >>>+#define TPS65912_INT_STS_PWRON		BIT(2)
> >>>+#define TPS65912_INT_STS_PWRON_LP	BIT(3)
> >>>+#define TPS65912_INT_STS_PWRHOLD_R	BIT(4)
> >>>+#define TPS65912_INT_STS_HOTDIE		BIT(5)
> >>>+#define TPS65912_INT_STS_GPIO1_R	BIT(6)
> >>>+#define TPS65912_INT_STS_GPIO1_F	BIT(7)
> >>>+
> >>>+/* INT_STS Register field definitions */
> >>>+#define TPS65912_INT_STS2_GPIO2_R	BIT(0)
> >>>+#define TPS65912_INT_STS2_GPIO2_F	BIT(1)
> >>>+#define TPS65912_INT_STS2_GPIO3_R	BIT(2)
> >>>+#define TPS65912_INT_STS2_GPIO3_F	BIT(3)
> >>>+#define TPS65912_INT_STS2_GPIO4_R	BIT(4)
> >>>+#define TPS65912_INT_STS2_GPIO4_F	BIT(5)
> >>>+#define TPS65912_INT_STS2_GPIO5_R	BIT(6)
> >>>+#define TPS65912_INT_STS2_GPIO5_F	BIT(7)
> >>>+
> >>>+/* INT_STS Register field definitions */
> >>>+#define TPS65912_INT_STS3_PGOOD_DCDC1	BIT(0)
> >>>+#define TPS65912_INT_STS3_PGOOD_DCDC2	BIT(1)
> >>>+#define TPS65912_INT_STS3_PGOOD_DCDC3	BIT(2)
> >>>+#define TPS65912_INT_STS3_PGOOD_DCDC4	BIT(3)
> >>>+#define TPS65912_INT_STS3_PGOOD_LDO1	BIT(4)
> >>>+#define TPS65912_INT_STS3_PGOOD_LDO2	BIT(5)
> >>>+#define TPS65912_INT_STS3_PGOOD_LDO3	BIT(6)
> >>>+#define TPS65912_INT_STS3_PGOOD_LDO4	BIT(7)
> >>>+
> >>>+/* INT_STS Register field definitions */
> >>>+#define TPS65912_INT_STS4_PGOOD_LDO5	BIT(0)
> >>>+#define TPS65912_INT_STS4_PGOOD_LDO6	BIT(1)
> >>>+#define TPS65912_INT_STS4_PGOOD_LDO7	BIT(2)
> >>>+#define TPS65912_INT_STS4_PGOOD_LDO8	BIT(3)
> >>>+#define TPS65912_INT_STS4_PGOOD_LDO9	BIT(4)
> >>>+#define TPS65912_INT_STS4_PGOOD_LDO10	BIT(5)
> >>>+
> >>>+/* GPIO 1 and 2 Register field definitions */
> >>>+#define GPIO_SLEEP_MASK			0x80
> >>>+#define GPIO_SLEEP_SHIFT		7
> >>>+#define GPIO_DEB_MASK			0x10
> >>>+#define GPIO_DEB_SHIFT			4
> >>>+#define GPIO_CFG_MASK			0x04
> >>>+#define GPIO_CFG_SHIFT			2
> >>>+#define GPIO_STS_MASK			0x02
> >>>+#define GPIO_STS_SHIFT			1
> >>>+#define GPIO_SET_MASK			0x01
> >>>+#define GPIO_SET_SHIFT			0
> >>>+
> >>>+/* GPIO 3 Register field definitions */
> >>>+#define GPIO3_SLEEP_MASK		0x80
> >>>+#define GPIO3_SLEEP_SHIFT		7
> >>>+#define GPIO3_SEL_MASK			0x40
> >>>+#define GPIO3_SEL_SHIFT			6
> >>>+#define GPIO3_ODEN_MASK			0x20
> >>>+#define GPIO3_ODEN_SHIFT		5
> >>>+#define GPIO3_DEB_MASK			0x10
> >>>+#define GPIO3_DEB_SHIFT			4
> >>>+#define GPIO3_PDEN_MASK			0x08
> >>>+#define GPIO3_PDEN_SHIFT		3
> >>>+#define GPIO3_CFG_MASK			0x04
> >>>+#define GPIO3_CFG_SHIFT			2
> >>>+#define GPIO3_STS_MASK			0x02
> >>>+#define GPIO3_STS_SHIFT			1
> >>>+#define GPIO3_SET_MASK			0x01
> >>>+#define GPIO3_SET_SHIFT			0
> >>>+
> >>>+/* GPIO 4 Register field definitions */
> >>>+#define GPIO4_SLEEP_MASK		0x80
> >>>+#define GPIO4_SLEEP_SHIFT		7
> >>>+#define GPIO4_SEL_MASK			0x40
> >>>+#define GPIO4_SEL_SHIFT			6
> >>>+#define GPIO4_ODEN_MASK			0x20
> >>>+#define GPIO4_ODEN_SHIFT		5
> >>>+#define GPIO4_DEB_MASK			0x10
> >>>+#define GPIO4_DEB_SHIFT			4
> >>>+#define GPIO4_PDEN_MASK			0x08
> >>>+#define GPIO4_PDEN_SHIFT		3
> >>>+#define GPIO4_CFG_MASK			0x04
> >>>+#define GPIO4_CFG_SHIFT			2
> >>>+#define GPIO4_STS_MASK			0x02
> >>>+#define GPIO4_STS_SHIFT			1
> >>>+#define GPIO4_SET_MASK			0x01
> >>>+#define GPIO4_SET_SHIFT			0
> >>>+
> >>>+/* Register THERM  (0x80) register.RegisterDescription */
> >>>+#define THERM_THERM_HD_MASK		0x20
> >>>+#define THERM_THERM_HD_SHIFT		5
> >>>+#define THERM_THERM_TS_MASK		0x10
> >>>+#define THERM_THERM_TS_SHIFT		4
> >>>+#define THERM_THERM_HDSEL_MASK		0x0C
> >>>+#define THERM_THERM_HDSEL_SHIFT		2
> >>>+#define THERM_RSVD1_MASK		0x02
> >>>+#define THERM_RSVD1_SHIFT		1
> >>>+#define THERM_THERM_STATE_MASK		0x01
> >>>+#define THERM_THERM_STATE_SHIFT		0
> >>>+
> >>>+/* Register DCDCCTRL1 register.RegisterDescription */
> >>>+#define DCDCCTRL_VCON_ENABLE_MASK	0x80
> >>>+#define DCDCCTRL_VCON_ENABLE_SHIFT	7
> >>>+#define DCDCCTRL_VCON_RANGE1_MASK	0x40
> >>>+#define DCDCCTRL_VCON_RANGE1_SHIFT	6
> >>>+#define DCDCCTRL_VCON_RANGE0_MASK	0x20
> >>>+#define DCDCCTRL_VCON_RANGE0_SHIFT	5
> >>>+#define DCDCCTRL_TSTEP2_MASK		0x10
> >>>+#define DCDCCTRL_TSTEP2_SHIFT		4
> >>>+#define DCDCCTRL_TSTEP1_MASK		0x08
> >>>+#define DCDCCTRL_TSTEP1_SHIFT		3
> >>>+#define DCDCCTRL_TSTEP0_MASK		0x04
> >>>+#define DCDCCTRL_TSTEP0_SHIFT		2
> >>>+#define DCDCCTRL_DCDC1_MODE_MASK	0x02
> >>>+#define DCDCCTRL_DCDC1_MODE_SHIFT	1
> >>>+
> >>>+/* Register DCDCCTRL2 and DCDCCTRL3 register.RegisterDescription */
> >>>+#define DCDCCTRL_TSTEP2_MASK		0x10
> >>>+#define DCDCCTRL_TSTEP2_SHIFT		4
> >>>+#define DCDCCTRL_TSTEP1_MASK		0x08
> >>>+#define DCDCCTRL_TSTEP1_SHIFT		3
> >>>+#define DCDCCTRL_TSTEP0_MASK		0x04
> >>>+#define DCDCCTRL_TSTEP0_SHIFT		2
> >>>+#define DCDCCTRL_DCDC_MODE_MASK		0x02
> >>>+#define DCDCCTRL_DCDC_MODE_SHIFT	1
> >>>+#define DCDCCTRL_RSVD0_MASK		0x01
> >>>+#define DCDCCTRL_RSVD0_SHIFT		0
> >>>+
> >>>+/* Register DCDCCTRL4 register.RegisterDescription */
> >>>+#define DCDCCTRL_RAMP_TIME_MASK		0x01
> >>>+#define DCDCCTRL_RAMP_TIME_SHIFT	0
> >>>+
> >>>+/* Register DCDCx_AVS */
> >>>+#define DCDC_AVS_ENABLE_MASK		0x80
> >>>+#define DCDC_AVS_ENABLE_SHIFT		7
> >>>+#define DCDC_AVS_ECO_MASK		0x40
> >>>+#define DCDC_AVS_ECO_SHIFT		6
> >>>+
> >>>+/* Register DCDCx_LIMIT */
> >>>+#define DCDC_LIMIT_RANGE_MASK		0xC0
> >>>+#define DCDC_LIMIT_RANGE_SHIFT		6
> >>>+#define DCDC_LIMIT_MAX_SEL_MASK		0x3F
> >>>+#define DCDC_LIMIT_MAX_SEL_SHIFT	0
> >>>+
> >>>+/* Define the TPS65912 IRQ numbers */
> >>>+enum tps65912_irqs {
> >>>+	/* INT_STS registers */
> >>>+	TPS65912_IRQ_PWRHOLD_F,
> >>>+	TPS65912_IRQ_VMON,
> >>>+	TPS65912_IRQ_PWRON,
> >>>+	TPS65912_IRQ_PWRON_LP,
> >>>+	TPS65912_IRQ_PWRHOLD_R,
> >>>+	TPS65912_IRQ_HOTDIE,
> >>>+	TPS65912_IRQ_GPIO1_R,
> >>>+	TPS65912_IRQ_GPIO1_F,
> >>>+	/* INT_STS2 registers */
> >>>+	TPS65912_IRQ_GPIO2_R,
> >>>+	TPS65912_IRQ_GPIO2_F,
> >>>+	TPS65912_IRQ_GPIO3_R,
> >>>+	TPS65912_IRQ_GPIO3_F,
> >>>+	TPS65912_IRQ_GPIO4_R,
> >>>+	TPS65912_IRQ_GPIO4_F,
> >>>+	TPS65912_IRQ_GPIO5_R,
> >>>+	TPS65912_IRQ_GPIO5_F,
> >>>+	/* INT_STS3 registers */
> >>>+	TPS65912_IRQ_PGOOD_DCDC1,
> >>>+	TPS65912_IRQ_PGOOD_DCDC2,
> >>>+	TPS65912_IRQ_PGOOD_DCDC3,
> >>>+	TPS65912_IRQ_PGOOD_DCDC4,
> >>>+	TPS65912_IRQ_PGOOD_LDO1,
> >>>+	TPS65912_IRQ_PGOOD_LDO2,
> >>>+	TPS65912_IRQ_PGOOD_LDO3,
> >>>+	TPS65912_IRQ_PGOOD_LDO4,
> >>>+	/* INT_STS4 registers */
> >>>+	TPS65912_IRQ_PGOOD_LDO5,
> >>>+	TPS65912_IRQ_PGOOD_LDO6,
> >>>+	TPS65912_IRQ_PGOOD_LDO7,
> >>>+	TPS65912_IRQ_PGOOD_LDO8,
> >>>+	TPS65912_IRQ_PGOOD_LDO9,
> >>>+	TPS65912_IRQ_PGOOD_LDO10,
> >>>+};
> >>>+
> >>>+/*
> >>>+ * struct tps65912 - state holder for the tps65912 driver
> >>>+ *
> >>>+ * Device data may be used to access the TPS65912 chip
> >>>+ */
> >>>+struct tps65912 {
> >>>+	struct device *dev;
> >>>+	struct regmap *regmap;
> >>>+
> >>>+	/* IRQ Data */
> >>>+	int irq;
> >>>+	struct regmap_irq_chip_data *irq_data;
> >>>+};
> >>>+
> >>>+static const struct regmap_range tps65912_yes_ranges[] = {
> >>>+	regmap_reg_range(TPS65912_INT_STS, TPS65912_GPIO5),
> >>>+};
> >>>+
> >>>+static const struct regmap_access_table tps65912_volatile_table = {
> >>>+	.yes_ranges = tps65912_yes_ranges,
> >>>+	.n_yes_ranges = ARRAY_SIZE(tps65912_yes_ranges),
> >>>+};
> >>>+
> >>>+static const struct regmap_config tps65912_regmap_config = {
> >>>+	.reg_bits = 8,
> >>>+	.val_bits = 8,
> >>>+	.cache_type = REGCACHE_RBTREE,
> >>>+	.volatile_table = &tps65912_volatile_table,
> >>>+};
> >>>+
> >>>+int tps65912_device_init(struct tps65912 *tps);
> >>>+int tps65912_device_exit(struct tps65912 *tps);
> >>>+
> >>>+#endif /*  __LINUX_MFD_TPS65912_H */
> >>
> >
> 

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

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-10-01 20:37 ` [PATCH v4 4/5] regulator: tps65912: Add regulator " Andrew F. Davis
  2015-10-02 19:21   ` Grygorii Strashko
@ 2015-10-22 16:47   ` Mark Brown
  2015-10-23 12:46     ` Andrew F. Davis
  2015-11-04 15:35     ` Andrew F. Davis
  1 sibling, 2 replies; 44+ messages in thread
From: Mark Brown @ 2015-10-22 16:47 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

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

On Thu, Oct 01, 2015 at 03:37:53PM -0500, Andrew F. Davis wrote:

> +static const struct of_device_id tps65912_regulator_of_match_table[] = {
> +	{ .compatible = "ti,tps65912-regulator", },
> +	{ /* sentinel */ },
> +};
> +MODULE_DEVICE_TABLE(of, tps65912_regulator_of_match_table);

Does this IP block exist outside of the tps65912?  If not why is it
directly represented in DT?  It seems like this is describing how Linux
loads drivers not how the hardware is constructed but DT should describe
the hardware.

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

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-10-22 16:47   ` Mark Brown
@ 2015-10-23 12:46     ` Andrew F. Davis
  2015-10-23 23:18       ` Mark Brown
  2015-11-04 15:35     ` Andrew F. Davis
  1 sibling, 1 reply; 44+ messages in thread
From: Andrew F. Davis @ 2015-10-23 12:46 UTC (permalink / raw)
  To: Mark Brown
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On 10/22/2015 11:47 AM, Mark Brown wrote:
> On Thu, Oct 01, 2015 at 03:37:53PM -0500, Andrew F. Davis wrote:
>
>> +static const struct of_device_id tps65912_regulator_of_match_table[] = {
>> +	{ .compatible = "ti,tps65912-regulator", },
>> +	{ /* sentinel */ },
>> +};
>> +MODULE_DEVICE_TABLE(of, tps65912_regulator_of_match_table);
>
> Does this IP block exist outside of the tps65912?

Not that I know of yet.

> If not why is it directly represented in DT?

My logic here is that when spins of this device are released they will
add/modify/remove regulators or GPIO pins or other on chip IP, with this
we should be able to simply describe the hardware change by loading
a compatible handler module ("ti,tps65912[x]-regulator" or something),
without having to change out the core or add a bunch of checks and flags.

I know just because other drivers do it doesn't mean it's a good idea,
but this is not new for MFDs and it is done in other regulators as well
(mt6397, tps659038, qcom,spmi, etc..).

> It seems like this is describing how Linux
> loads drivers not how the hardware is constructed but DT should describe
> the hardware.
>

While I agree to a point, if we follow this to its logical conclusion we
would end up with one compatible binding per SoC and be basically back to
board files. We need some granularity, just finding out where is the issue,
I would say that as these devices belong to different subsystems and are
almost completely independent there should be no problem with having their
own compatible matched hardware sub-node.

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-10-23 12:46     ` Andrew F. Davis
@ 2015-10-23 23:18       ` Mark Brown
  2015-10-24  0:11         ` Andrew F. Davis
  0 siblings, 1 reply; 44+ messages in thread
From: Mark Brown @ 2015-10-23 23:18 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

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

On Fri, Oct 23, 2015 at 07:46:39AM -0500, Andrew F. Davis wrote:

> I know just because other drivers do it doesn't mean it's a good idea,
> but this is not new for MFDs and it is done in other regulators as well
> (mt6397, tps659038, qcom,spmi, etc..).

mt6397 doesn't do this, it doesn't have a compatible string at all (it's
doing what I'm recommending that you do).  The SPMI devices are
standalone devices, their parent device is actually functioning as a bus
controller here (it's really a microcontroller inside the SoC).  The
Palmas is part of how we realised this was a problem.

> >It seems like this is describing how Linux
> >loads drivers not how the hardware is constructed but DT should describe
> >the hardware.

> While I agree to a point, if we follow this to its logical conclusion we
> would end up with one compatible binding per SoC and be basically back to
> board files. We need some granularity, just finding out where is the issue,

The fact that the SoC DT is not distinct from the board DT is actually
one of the problems with the way we're using DT at the minute, it means
that DTBs are much less stable than they should be since we can enhance
support for SoCs but DTBs need regenerating to take advantage of it.  It
would be much better if the boards just referenced the SoC they use and
pulled in a separate definition of the SoC (DT overlays will make it
much more tractable to implement that if someone has time...).

> I would say that as these devices belong to different subsystems and are
> almost completely independent there should be no problem with having their
> own compatible matched hardware sub-node.

All it's adding is more typing for users.

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

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-10-23 23:18       ` Mark Brown
@ 2015-10-24  0:11         ` Andrew F. Davis
  2015-10-24 22:14           ` Mark Brown
  0 siblings, 1 reply; 44+ messages in thread
From: Andrew F. Davis @ 2015-10-24  0:11 UTC (permalink / raw)
  To: Mark Brown
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On 10/23/2015 06:18 PM, Mark Brown wrote:
> On Fri, Oct 23, 2015 at 07:46:39AM -0500, Andrew F. Davis wrote:
>
>> I know just because other drivers do it doesn't mean it's a good idea,
>> but this is not new for MFDs and it is done in other regulators as well
>> (mt6397, tps659038, qcom,spmi, etc..).
>
> mt6397 doesn't do this, it doesn't have a compatible string at all (it's
> doing what I'm recommending that you do).  The SPMI devices are
> standalone devices, their parent device is actually functioning as a bus
> controller here (it's really a microcontroller inside the SoC).  The
> Palmas is part of how we realised this was a problem.
>

mt6397: Documentation/devicetree/bindings/mfd/mt6397.txt
Doing exactly what I'm doing,

pmic {
	compatible = "mediatek,mt6397";

	codec: mt6397codec {
		compatible = "mediatek,mt6397-codec";
	};

	regulators {
		compatible = "mediatek,mt6397-regulator";

		buck_vpca15 {
			....

The Palmas is a great example of why this is a good idea, there are
so many spins on this common base, and look how we can re-use sub-nodes:

tps659038: tps659038@58 {
	compatible = "ti,tps659038";
	reg = <0x58>;
	...

	tps659038_pmic {
		compatible = "ti,tps659038-pmic";
		...
	};

	tps659038_rtc: tps659038_rtc {
		compatible = "ti,palmas-rtc";
		...
	};

	tps659038_pwr_button: tps659038_pwr_button {
		compatible = "ti,palmas-pwrbutton";
		...
	};

	tps659038_gpio: tps659038_gpio {
		compatible = "ti,palmas-gpio";
		...
	};
};

(from am57xx-beagle-x15.dts)

looks like only the "ti,tps659038-pmic" node needed re-made without
re-making the whole driver.

>>> It seems like this is describing how Linux
>>> loads drivers not how the hardware is constructed but DT should describe
>>> the hardware.
>
>> While I agree to a point, if we follow this to its logical conclusion we
>> would end up with one compatible binding per SoC and be basically back to
>> board files. We need some granularity, just finding out where is the issue,
>
> The fact that the SoC DT is not distinct from the board DT is actually
> one of the problems with the way we're using DT at the minute, it means
> that DTBs are much less stable than they should be since we can enhance
> support for SoCs but DTBs need regenerating to take advantage of it.  It
> would be much better if the boards just referenced the SoC they use and
> pulled in a separate definition of the SoC (DT overlays will make it
> much more tractable to implement that if someone has time...).
>

I figured this can already be done by keeping the SoC stuff in dtsi files?
Anyway DT seems to have a lot of use issues with how it is being used, but
I'm probably not a person with enough free time for fixing that.. :|

>> I would say that as these devices belong to different subsystems and are
>> almost completely independent there should be no problem with having their
>> own compatible matched hardware sub-node.
>
> All it's adding is more typing for users.
>

Well I have to match the sub-devices on something, it's ether the node name
or the compatible string, so they might have to get used to typing :)


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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-10-24  0:11         ` Andrew F. Davis
@ 2015-10-24 22:14           ` Mark Brown
  2015-10-25 20:45             ` Andrew F. Davis
  0 siblings, 1 reply; 44+ messages in thread
From: Mark Brown @ 2015-10-24 22:14 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

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

On Fri, Oct 23, 2015 at 07:11:56PM -0500, Andrew F. Davis wrote:
> On 10/23/2015 06:18 PM, Mark Brown wrote:

> >mt6397 doesn't do this, it doesn't have a compatible string at all (it's
> >doing what I'm recommending that you do).  The SPMI devices are
> >standalone devices, their parent device is actually functioning as a bus
> >controller here (it's really a microcontroller inside the SoC).  The
> >Palmas is part of how we realised this was a problem.

> mt6397: Documentation/devicetree/bindings/mfd/mt6397.txt
> Doing exactly what I'm doing,

Tbe binding document is buggy and doesn't reflect the code, there's no
compatible string in the driver.

> The Palmas is a great example of why this is a good idea, there are
> so many spins on this common base, and look how we can re-use sub-nodes:

There's no real reuse here, we have to have a table in both the MFD and
regulator listing every variant.  Remember that the only reason the user
is having to type most of those subnodes at all is that we pushed things
into the DT, if someone forgot to include one of the nodes in their
board DT then they won't be able to use the relevant feature even if
it's there.

> >The fact that the SoC DT is not distinct from the board DT is actually
> >one of the problems with the way we're using DT at the minute, it means
> >that DTBs are much less stable than they should be since we can enhance
> >support for SoCs but DTBs need regenerating to take advantage of it.  It
> >would be much better if the boards just referenced the SoC they use and
> >pulled in a separate definition of the SoC (DT overlays will make it
> >much more tractable to implement that if someone has time...).

> I figured this can already be done by keeping the SoC stuff in dtsi files?

That doesn't help with the above issue, include files get processed at
the time the binary is generated.

> Well I have to match the sub-devices on something, it's ether the node name
> or the compatible string, so they might have to get used to typing :)

No, that's not the case - remember, users don't have to write a new
driver every time they instantiate a device on a board.  They're going
to have to list the in-use regulators one way or another but if we have
the extra compatible for regulators they have to bind both the core
device (which is going to be required anyway due to the control bus) and
the subnode saying that it has regulators (which we knew anyway as soon
as we knew we had the core device).

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

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-10-24 22:14           ` Mark Brown
@ 2015-10-25 20:45             ` Andrew F. Davis
  2015-10-26  0:43               ` Mark Brown
  0 siblings, 1 reply; 44+ messages in thread
From: Andrew F. Davis @ 2015-10-25 20:45 UTC (permalink / raw)
  To: Mark Brown
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On 10/24/2015 05:14 PM, Mark Brown wrote:
> On Fri, Oct 23, 2015 at 07:11:56PM -0500, Andrew F. Davis wrote:
>> On 10/23/2015 06:18 PM, Mark Brown wrote:
>
>>> mt6397 doesn't do this, it doesn't have a compatible string at all (it's
>>> doing what I'm recommending that you do).  The SPMI devices are
>>> standalone devices, their parent device is actually functioning as a bus
>>> controller here (it's really a microcontroller inside the SoC).  The
>>> Palmas is part of how we realised this was a problem.
>
>> mt6397: Documentation/devicetree/bindings/mfd/mt6397.txt
>> Doing exactly what I'm doing,
>
> Tbe binding document is buggy and doesn't reflect the code, there's no
> compatible string in the driver.
>

Sure there is:

drivers/mfd/mt6397-core.c:48:
.of_compatible = "mediatek,mt6397-regulator",

Then mfd_add_devices uses this to find the regulator node and fill
in .of_node, then in the regulator driver:

drivers/regulator/mt6397-regulator.c:48:
.of_match = of_match_ptr(match),

which uses your helper to match the nodes in the filled in .of_node.

>> The Palmas is a great example of why this is a good idea, there are
>> so many spins on this common base, and look how we can re-use sub-nodes:
>
> There's no real reuse here, we have to have a table in both the MFD and
> regulator listing every variant.

That's not true, the only variant that needs its own table is the tps65917,
and that's for the IRQ and regulator differences. The RTC, pwrbutton, and
GPIO nodes are completely variant agnostic and their drivers are reused
by just adding their subnode to a new PMIC device node.

> Remember that the only reason the user
> is having to type most of those subnodes at all is that we pushed things
> into the DT, if someone forgot to include one of the nodes in their
> board DT then they won't be able to use the relevant feature even if
> it's there.
>

This is what DT is for, we want to push this kind of thing into DT, the
driver should not have to know the devices hardware configuration anymore
that in needs to.

>>> The fact that the SoC DT is not distinct from the board DT is actually
>>> one of the problems with the way we're using DT at the minute, it means
>>> that DTBs are much less stable than they should be since we can enhance
>>> support for SoCs but DTBs need regenerating to take advantage of it.  It
>>> would be much better if the boards just referenced the SoC they use and
>>> pulled in a separate definition of the SoC (DT overlays will make it
>>> much more tractable to implement that if someone has time...).
>
>> I figured this can already be done by keeping the SoC stuff in dtsi files?
>
> That doesn't help with the above issue, include files get processed at
> the time the binary is generated.
>

Yeah so the board DT and the SoC DT are already mostly separate, it would
then just be a matter enforcing where nodes are defined.

>> Well I have to match the sub-devices on something, it's ether the node name
>> or the compatible string, so they might have to get used to typing :)
>
> No, that's not the case - remember, users don't have to write a new
> driver every time they instantiate a device on a board.  They're going
> to have to list the in-use regulators one way or another but if we have
> the extra compatible for regulators they have to bind both the core
> device (which is going to be required anyway due to the control bus) and
> the subnode saying that it has regulators (which we knew anyway as soon
> as we knew we had the core device).
>

We don't know what sub-devices the core device has, PMICs are more like
SoCs on a bus than a regular device, the sub-parts change with every spin and
we can represent this in DT like we do with SoCs. Else we would have to have
a new core binding for every spin. We know what devices are on a particular
SoC too, but we still list them and match them in DT so some SoC driver
doesn't have to.


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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-10-25 20:45             ` Andrew F. Davis
@ 2015-10-26  0:43               ` Mark Brown
  2015-10-26 15:47                 ` Andrew F. Davis
  0 siblings, 1 reply; 44+ messages in thread
From: Mark Brown @ 2015-10-26  0:43 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

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

On Sun, Oct 25, 2015 at 03:45:43PM -0500, Andrew F. Davis wrote:
> On 10/24/2015 05:14 PM, Mark Brown wrote:

> >Tbe binding document is buggy and doesn't reflect the code, there's no
> >compatible string in the driver.

> Sure there is:

> drivers/mfd/mt6397-core.c:48:
> .of_compatible = "mediatek,mt6397-regulator",

This is in the MFD, this is not used in actual systems.

> Then mfd_add_devices uses this to find the regulator node and fill
> in .of_node, then in the regulator driver:

> drivers/regulator/mt6397-regulator.c:48:
> .of_match = of_match_ptr(match),

> which uses your helper to match the nodes in the filled in .of_node.

This is in a regulator definition, it is using the regulator framework
support for parsing DT which must be used by modern drivers.  It is not
part of how the Linux driver model device is instantiated, that is done
using the struct platform_driver which is what we are talking about
here.

Please stop this, it is getting very tiresome.  

> >No, that's not the case - remember, users don't have to write a new
> >driver every time they instantiate a device on a board.  They're going
> >to have to list the in-use regulators one way or another but if we have
> >the extra compatible for regulators they have to bind both the core
> >device (which is going to be required anyway due to the control bus) and
> >the subnode saying that it has regulators (which we knew anyway as soon
> >as we knew we had the core device).

> We don't know what sub-devices the core device has, PMICs are more like
> SoCs on a bus than a regular device, the sub-parts change with every spin and
> we can represent this in DT like we do with SoCs. Else we would have to have
> a new core binding for every spin. We know what devices are on a particular
> SoC too, but we still list them and match them in DT so some SoC driver
> doesn't have to.

PMICs are very much smaller than SoCs, and again if you're not able to
usefully represent individual IPs in the DT (as is *clearly* the case
here where you are trying to make one node for the entire collection of
regulators) we're not getting any value.

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

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-10-26  0:43               ` Mark Brown
@ 2015-10-26 15:47                 ` Andrew F. Davis
  2015-10-27  0:16                   ` Mark Brown
  0 siblings, 1 reply; 44+ messages in thread
From: Andrew F. Davis @ 2015-10-26 15:47 UTC (permalink / raw)
  To: Mark Brown
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On 10/25/2015 07:43 PM, Mark Brown wrote:
> On Sun, Oct 25, 2015 at 03:45:43PM -0500, Andrew F. Davis wrote:
>> On 10/24/2015 05:14 PM, Mark Brown wrote:
>
>>> Tbe binding document is buggy and doesn't reflect the code, there's no
>>> compatible string in the driver.
>
>> Sure there is:
>
>> drivers/mfd/mt6397-core.c:48:
>> .of_compatible = "mediatek,mt6397-regulator",
>
> This is in the MFD, this is not used in actual systems.
>

Not sure what you mean by "actual systems", it looks like these
use it?:

arch/arm/boot/dts/mt8135-evbp1.dts
arch/arm64/boot/dts/mediatek/mt8173-evb.dts

>> Then mfd_add_devices uses this to find the regulator node and fill
>> in .of_node, then in the regulator driver:
>
>> drivers/regulator/mt6397-regulator.c:48:
>> .of_match = of_match_ptr(match),
>
>> which uses your helper to match the nodes in the filled in .of_node.
>
> This is in a regulator definition, it is using the regulator framework
> support for parsing DT which must be used by modern drivers.  It is not
> part of how the Linux driver model device is instantiated, that is done
> using the struct platform_driver which is what we are talking about
> here.
>

I understand this, I thought we are talking about compatible strings in
the regulator sub-node, not how the core instantiates the sub-driver.

> Please stop this, it is getting very tiresome.
>

Sorry about that, I'm really not trying to prolong this, but I don't know
what you want. New multifunction devices have compatible strings in their
DT sub-nodes, the framework even helps support this (.of_compatible in
struct mfd_cell), I'm not doing anything new here.

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-10-26 15:47                 ` Andrew F. Davis
@ 2015-10-27  0:16                   ` Mark Brown
  2015-10-27 14:23                     ` Andrew F. Davis
  0 siblings, 1 reply; 44+ messages in thread
From: Mark Brown @ 2015-10-27  0:16 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

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

On Mon, Oct 26, 2015 at 10:47:41AM -0500, Andrew F. Davis wrote:
> On 10/25/2015 07:43 PM, Mark Brown wrote:

> >>.of_compatible = "mediatek,mt6397-regulator",

> >This is in the MFD, this is not used in actual systems.

> Not sure what you mean by "actual systems", it looks like these
> use it?:

> arch/arm/boot/dts/mt8135-evbp1.dts
> arch/arm64/boot/dts/mediatek/mt8173-evb.dts

To repeat: the regulator driver does not register a compatible string
for the device for device model probing.

> I understand this, I thought we are talking about compatible strings in
> the regulator sub-node, not how the core instantiates the sub-driver.

No, this exactly about how the device model devices are instantiated.

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

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-10-27  0:16                   ` Mark Brown
@ 2015-10-27 14:23                     ` Andrew F. Davis
  0 siblings, 0 replies; 44+ messages in thread
From: Andrew F. Davis @ 2015-10-27 14:23 UTC (permalink / raw)
  To: Mark Brown
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On 10/26/2015 07:16 PM, Mark Brown wrote:
> On Mon, Oct 26, 2015 at 10:47:41AM -0500, Andrew F. Davis wrote:
>> On 10/25/2015 07:43 PM, Mark Brown wrote:
>
>>>> .of_compatible = "mediatek,mt6397-regulator",
>
>>> This is in the MFD, this is not used in actual systems.
>
>> Not sure what you mean by "actual systems", it looks like these
>> use it?:
>
>> arch/arm/boot/dts/mt8135-evbp1.dts
>> arch/arm64/boot/dts/mediatek/mt8173-evb.dts
>
> To repeat: the regulator driver does not register a compatible string
> for the device for device model probing.
>
>> I understand this, I thought we are talking about compatible strings in
>> the regulator sub-node, not how the core instantiates the sub-driver.
>
> No, this exactly about how the device model devices are instantiated.
>

Ahh, I see, this makes more sense then, I'll re-spin this matching on
platform name.

Apologies about all this noise. :)

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-10-22 16:47   ` Mark Brown
  2015-10-23 12:46     ` Andrew F. Davis
@ 2015-11-04 15:35     ` Andrew F. Davis
  2015-11-05 10:14       ` Mark Brown
  1 sibling, 1 reply; 44+ messages in thread
From: Andrew F. Davis @ 2015-11-04 15:35 UTC (permalink / raw)
  To: Mark Brown
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On 10/22/2015 11:47 AM, Mark Brown wrote:
> On Thu, Oct 01, 2015 at 03:37:53PM -0500, Andrew F. Davis wrote:
>
>> +static const struct of_device_id tps65912_regulator_of_match_table[] = {
>> +	{ .compatible = "ti,tps65912-regulator", },
>> +	{ /* sentinel */ },
>> +};
>> +MODULE_DEVICE_TABLE(of, tps65912_regulator_of_match_table);
>
> Does this IP block exist outside of the tps65912?  If not why is it
> directly represented in DT?  It seems like this is describing how Linux
> loads drivers not how the hardware is constructed but DT should describe
> the hardware.
>

Something I just noticed, when I remove this table, module loading stops
working, even with 'MODULE_ALIAS("platform:tps65912-regulator");'. It
looks like when DT is enabled platform_uevent (drivers/base/platform.c:787)
only sends out the OF MODALIAS event then returns, not sending out the
platform event, is this desired behavior? If so then I will need this
table even though I still create the device and match it on platform
name as you suggested.

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-11-04 15:35     ` Andrew F. Davis
@ 2015-11-05 10:14       ` Mark Brown
  2015-11-05 18:04         ` Andrew F. Davis
  0 siblings, 1 reply; 44+ messages in thread
From: Mark Brown @ 2015-11-05 10:14 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

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

On Wed, Nov 04, 2015 at 09:35:26AM -0600, Andrew F. Davis wrote:

> Something I just noticed, when I remove this table, module loading stops
> working, even with 'MODULE_ALIAS("platform:tps65912-regulator");'. It
> looks like when DT is enabled platform_uevent (drivers/base/platform.c:787)
> only sends out the OF MODALIAS event then returns, not sending out the
> platform event, is this desired behavior? If so then I will need this
> table even though I still create the device and match it on platform
> name as you suggested.

That sounds like a bug to me, it'll have broken a bunch of existing
devices.

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

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-11-05 10:14       ` Mark Brown
@ 2015-11-05 18:04         ` Andrew F. Davis
  2015-11-06 10:43           ` Mark Brown
  0 siblings, 1 reply; 44+ messages in thread
From: Andrew F. Davis @ 2015-11-05 18:04 UTC (permalink / raw)
  To: Mark Brown
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On 11/05/2015 04:14 AM, Mark Brown wrote:
> On Wed, Nov 04, 2015 at 09:35:26AM -0600, Andrew F. Davis wrote:
>
>> Something I just noticed, when I remove this table, module loading stops
>> working, even with 'MODULE_ALIAS("platform:tps65912-regulator");'. It
>> looks like when DT is enabled platform_uevent (drivers/base/platform.c:787)
>> only sends out the OF MODALIAS event then returns, not sending out the
>> platform event, is this desired behavior? If so then I will need this
>> table even though I still create the device and match it on platform
>> name as you suggested.
>
> That sounds like a bug to me, it'll have broken a bunch of existing
> devices.
>

Most OF drivers have the OF MODALIAS.

'platform_uevent' can only emit one MODALIAS string per device (only
the last emitted one seems to count), so for any device with
'dev->of_node' set it will be the OF MODALIAS string. So I need
that table (to generate the OF MODALIAS) or this sub-device module
will not be loaded.

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-11-05 18:04         ` Andrew F. Davis
@ 2015-11-06 10:43           ` Mark Brown
  2015-11-06 18:10             ` Andrew F. Davis
  0 siblings, 1 reply; 44+ messages in thread
From: Mark Brown @ 2015-11-06 10:43 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

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

On Thu, Nov 05, 2015 at 12:04:00PM -0600, Andrew F. Davis wrote:
> On 11/05/2015 04:14 AM, Mark Brown wrote:

> >That sounds like a bug to me, it'll have broken a bunch of existing
> >devices.

> Most OF drivers have the OF MODALIAS.

That's nice but not relevant to non-OF devices.

> 'platform_uevent' can only emit one MODALIAS string per device (only
> the last emitted one seems to count), so for any device with
> 'dev->of_node' set it will be the OF MODALIAS string. So I need
> that table (to generate the OF MODALIAS) or this sub-device module
> will not be loaded.

No, you need to fix the bug that is causing dev->of_node to be populated
for the MFD function device.  Probably the issue is that you have put
this pointless compatible string in your DT.

Please stop this.  I don't understand why you are pushing so hard to put
the Linux device model representation of the device into DT but it's
getting very repetitive.

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

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-11-06 10:43           ` Mark Brown
@ 2015-11-06 18:10             ` Andrew F. Davis
  2015-11-06 21:16               ` Mark Brown
  0 siblings, 1 reply; 44+ messages in thread
From: Andrew F. Davis @ 2015-11-06 18:10 UTC (permalink / raw)
  To: Mark Brown
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On 11/06/2015 04:43 AM, Mark Brown wrote:
> On Thu, Nov 05, 2015 at 12:04:00PM -0600, Andrew F. Davis wrote:
>> On 11/05/2015 04:14 AM, Mark Brown wrote:
>
>>> That sounds like a bug to me, it'll have broken a bunch of existing
>>> devices.
>
>> Most OF drivers have the OF MODALIAS.
>
> That's nice but not relevant to non-OF devices.
>
>> 'platform_uevent' can only emit one MODALIAS string per device (only
>> the last emitted one seems to count), so for any device with
>> 'dev->of_node' set it will be the OF MODALIAS string. So I need
>> that table (to generate the OF MODALIAS) or this sub-device module
>> will not be loaded.
>
> No, you need to fix the bug that is causing dev->of_node to be populated
> for the MFD function device.  Probably the issue is that you have put
> this pointless compatible string in your DT.
>

If it is pointless what is the reason we have .of_compatible in mfd_cell?
How else do you want us to populate the sub-device dev->of_node? Looking
at other DT regulators a lot *do( just use an OF table, others use their
parent's dev to get of_node, why all the push back on having an OF match
table? Probe gets called with the pdev filled with its of_node to begin with.

> Please stop this.  I don't understand why you are pushing so hard to put
> the Linux device model representation of the device into DT but it's
> getting very repetitive.
>

I'm not pushing anything, this is how other sub-nodes of MFD devices are
represented, I'm not sure what you think I'm doing that is so wrong here.
No one else seems to have an issue with the DT for this device, I see no
reason the regulator node has to be different than the other sub-device
nodes.

It looks rather out of place to have regulators be singled out like this,
for instance look at the mfd_cells for drivers/mfd/rt5033.c

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-11-06 18:10             ` Andrew F. Davis
@ 2015-11-06 21:16               ` Mark Brown
  2015-11-09 17:41                 ` Andrew F. Davis
  0 siblings, 1 reply; 44+ messages in thread
From: Mark Brown @ 2015-11-06 21:16 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

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

On Fri, Nov 06, 2015 at 12:10:45PM -0600, Andrew F. Davis wrote:
> On 11/06/2015 04:43 AM, Mark Brown wrote:

> >No, you need to fix the bug that is causing dev->of_node to be populated
> >for the MFD function device.  Probably the issue is that you have put
> >this pointless compatible string in your DT.

> If it is pointless what is the reason we have .of_compatible in mfd_cell?

There are cases where it's useful where we're abstracting something and
gaining some meaningful reuse.  This really does not appear to be one of
those cases, there are no parameters in the DT and the compatible string
is the full device name.

> How else do you want us to populate the sub-device dev->of_node? Looking

You do not need to populate it.  There is no value in populating it and
as previously discussed putting the Linux driver model into DT can be
actively harmful if we change our idea of how we should model things.

> >Please stop this.  I don't understand why you are pushing so hard to put
> >the Linux device model representation of the device into DT but it's
> >getting very repetitive.

> I'm not pushing anything, this is how other sub-nodes of MFD devices are

Every time we go through this we finish the discussion and then you come
back with yet another excuse for trying to push the current Linux device
model into the DT or another version of the patch with the same problem.

> represented, I'm not sure what you think I'm doing that is so wrong here.

I am providing the same review feedback repeatedly, this is not good.

> No one else seems to have an issue with the DT for this device, I see no
> reason the regulator node has to be different than the other sub-device
> nodes.

I would prefer it if other areas where there's no reuse gained by
breaking things down and where we're just encoding the Linux driver
model into DT weren't done like that either.  Perhaps other people care
less here, perhaps they haven't been bitten by the problems that can
arise.  If I read such patches I'd probably comment on the issue but
I've got enough to do already without trying to review every single DT
binding.

> It looks rather out of place to have regulators be singled out like this,
> for instance look at the mfd_cells for drivers/mfd/rt5033.c

The fact that other people have merged imperfect code into the kernel is
not a good reason to merge even more of it when we have better tools.
Looking at that binding I'm seeing no reason why any of the subfunctions
should have compatible strings (and if we're going down the route you're
trying to go down we really ought to have something in the binding for
at least an interrupt controller in there as well...).

Seriously, please stop this - having to go through the same things
repeatedly is not helpful.

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

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-11-06 21:16               ` Mark Brown
@ 2015-11-09 17:41                 ` Andrew F. Davis
  2015-11-10  9:57                   ` Mark Brown
  0 siblings, 1 reply; 44+ messages in thread
From: Andrew F. Davis @ 2015-11-09 17:41 UTC (permalink / raw)
  To: Mark Brown
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On 11/06/2015 03:16 PM, Mark Brown wrote:
> On Fri, Nov 06, 2015 at 12:10:45PM -0600, Andrew F. Davis wrote:
>> On 11/06/2015 04:43 AM, Mark Brown wrote:
>
>>> No, you need to fix the bug that is causing dev->of_node to be populated
>>> for the MFD function device.  Probably the issue is that you have put
>>> this pointless compatible string in your DT.
>
>> If it is pointless what is the reason we have .of_compatible in mfd_cell?
>
> There are cases where it's useful where we're abstracting something and
> gaining some meaningful reuse.  This really does not appear to be one of
> those cases, there are no parameters in the DT and the compatible string
> is the full device name.
>

As before I see no reason to make that call now and limit ourselves.

>> How else do you want us to populate the sub-device dev->of_node? Looking
>
> You do not need to populate it.  There is no value in populating it and
> as previously discussed putting the Linux driver model into DT can be
> actively harmful if we change our idea of how we should model things.
>

The dev passed to regulator_register needs to have of_node populated for
your OF init_data helper to work. Devices with OF tables can just pass
their own dev. Others have to use their parents' nodes, this is a
workaround, OF devices should be probed with their of_node pre-populated.

>>> Please stop this.  I don't understand why you are pushing so hard to put
>>> the Linux device model representation of the device into DT but it's
>>> getting very repetitive.
>
>> I'm not pushing anything, this is how other sub-nodes of MFD devices are
>
> Every time we go through this we finish the discussion and then you come
> back with yet another excuse for trying to push the current Linux device
> model into the DT or another version of the patch with the same problem.
>

I keep finding different problems, do you expect me to ignore them?

>> represented, I'm not sure what you think I'm doing that is so wrong here.
>
> I am providing the same review feedback repeatedly, this is not good.
>
>> No one else seems to have an issue with the DT for this device, I see no
>> reason the regulator node has to be different than the other sub-device
>> nodes.
>
> I would prefer it if other areas where there's no reuse gained by
> breaking things down and where we're just encoding the Linux driver
> model into DT weren't done like that either.  Perhaps other people care
> less here, perhaps they haven't been bitten by the problems that can
> arise.  If I read such patches I'd probably comment on the issue but
> I've got enough to do already without trying to review every single DT
> binding.
>
>> It looks rather out of place to have regulators be singled out like this,
>> for instance look at the mfd_cells for drivers/mfd/rt5033.c
>
> The fact that other people have merged imperfect code into the kernel is
> not a good reason to merge even more of it when we have better tools.
> Looking at that binding I'm seeing no reason why any of the subfunctions
> should have compatible strings (and if we're going down the route you're
> trying to go down we really ought to have something in the binding for
> at least an interrupt controller in there as well...).
>

These are not "subfunctions" they are full drivers, they only need
register accessors passed in, they do not call the core and the core
does not call them.

If your problem is with the DT binding for this or other MFDs, then
nack *them* and explain to everyone why what they are doing is wrong
and why regulators should be special cases. Blocking the regulator
drivers to force a change in DT is not going to fix this issue.


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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-11-09 17:41                 ` Andrew F. Davis
@ 2015-11-10  9:57                   ` Mark Brown
  2015-11-10 16:47                     ` Andrew F. Davis
  0 siblings, 1 reply; 44+ messages in thread
From: Mark Brown @ 2015-11-10  9:57 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

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

On Mon, Nov 09, 2015 at 11:41:20AM -0600, Andrew F. Davis wrote:
> On 11/06/2015 03:16 PM, Mark Brown wrote:

> >There are cases where it's useful where we're abstracting something and
> >gaining some meaningful reuse.  This really does not appear to be one of
> >those cases, there are no parameters in the DT and the compatible string
> >is the full device name.

> As before I see no reason to make that call now and limit ourselves.

To repeat *yet* *again* the point is that putting the current Linux
driver model into the DT is limiting our future selves.

> >You do not need to populate it.  There is no value in populating it and
> >as previously discussed putting the Linux driver model into DT can be
> >actively harmful if we change our idea of how we should model things.

> The dev passed to regulator_register needs to have of_node populated for
> your OF init_data helper to work. Devices with OF tables can just pass
> their own dev. Others have to use their parents' nodes, this is a
> workaround, OF devices should be probed with their of_node pre-populated.

This is not a workaroud, the only reason you think it is a workaround is
the desire to directly represent the Linux device model in the DT.

> >>>Please stop this.  I don't understand why you are pushing so hard to put
> >>>the Linux device model representation of the device into DT but it's
> >>>getting very repetitive.

> >>I'm not pushing anything, this is how other sub-nodes of MFD devices are

> >Every time we go through this we finish the discussion and then you come
> >back with yet another excuse for trying to push the current Linux device
> >model into the DT or another version of the patch with the same problem.

> I keep finding different problems, do you expect me to ignore them?

You are making minor restatements of the same thing over and over again
which ignore the main feedback.

> >The fact that other people have merged imperfect code into the kernel is
> >not a good reason to merge even more of it when we have better tools.
> >Looking at that binding I'm seeing no reason why any of the subfunctions
> >should have compatible strings (and if we're going down the route you're
> >trying to go down we really ought to have something in the binding for
> >at least an interrupt controller in there as well...).

> These are not "subfunctions" they are full drivers, they only need
> register accessors passed in, they do not call the core and the core
> does not call them.

To repeat *yet* *again* they are groupings of functionality which happen
to represent the way Linux models devices right now.  There's no
generality in there, it's just a dump of the current Linux model of the
functions into the DT.

> If your problem is with the DT binding for this or other MFDs, then
> nack *them* and explain to everyone why what they are doing is wrong
> and why regulators should be special cases. Blocking the regulator
> drivers to force a change in DT is not going to fix this issue.

Of course this is a negative review of the binding!  What on earth did
you think my feedback meant?  The driver and the binding go together.

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

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-11-10  9:57                   ` Mark Brown
@ 2015-11-10 16:47                     ` Andrew F. Davis
  2015-11-10 17:04                       ` Mark Brown
  0 siblings, 1 reply; 44+ messages in thread
From: Andrew F. Davis @ 2015-11-10 16:47 UTC (permalink / raw)
  To: Mark Brown
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On 11/10/2015 03:57 AM, Mark Brown wrote:
> On Mon, Nov 09, 2015 at 11:41:20AM -0600, Andrew F. Davis wrote:
>> On 11/06/2015 03:16 PM, Mark Brown wrote:
>
>>> There are cases where it's useful where we're abstracting something and
>>> gaining some meaningful reuse.  This really does not appear to be one of
>>> those cases, there are no parameters in the DT and the compatible string
>>> is the full device name.
>
>> As before I see no reason to make that call now and limit ourselves.
>
> To repeat *yet* *again* the point is that putting the current Linux
> driver model into the DT is limiting our future selves.
>
>>> You do not need to populate it.  There is no value in populating it and
>>> as previously discussed putting the Linux driver model into DT can be
>>> actively harmful if we change our idea of how we should model things.
>
>> The dev passed to regulator_register needs to have of_node populated for
>> your OF init_data helper to work. Devices with OF tables can just pass
>> their own dev. Others have to use their parents' nodes, this is a
>> workaround, OF devices should be probed with their of_node pre-populated.
>
> This is not a workaroud, the only reason you think it is a workaround is
> the desire to directly represent the Linux device model in the DT.
>
>>>>> Please stop this.  I don't understand why you are pushing so hard to put
>>>>> the Linux device model representation of the device into DT but it's
>>>>> getting very repetitive.
>
>>>> I'm not pushing anything, this is how other sub-nodes of MFD devices are
>
>>> Every time we go through this we finish the discussion and then you come
>>> back with yet another excuse for trying to push the current Linux device
>>> model into the DT or another version of the patch with the same problem.
>
>> I keep finding different problems, do you expect me to ignore them?
>
> You are making minor restatements of the same thing over and over again
> which ignore the main feedback.
>
>>> The fact that other people have merged imperfect code into the kernel is
>>> not a good reason to merge even more of it when we have better tools.
>>> Looking at that binding I'm seeing no reason why any of the subfunctions
>>> should have compatible strings (and if we're going down the route you're
>>> trying to go down we really ought to have something in the binding for
>>> at least an interrupt controller in there as well...).
>
>> These are not "subfunctions" they are full drivers, they only need
>> register accessors passed in, they do not call the core and the core
>> does not call them.
>
> To repeat *yet* *again* they are groupings of functionality which happen
> to represent the way Linux models devices right now.  There's no
> generality in there, it's just a dump of the current Linux model of the
> functions into the DT.
>

I've made different points every time, you are repeating yourself
because you only have one counter, you don't like what you perceive as
putting the "Linux device model representation of the device into DT".
I understand this, I simply don't agree that is what is going on, or
that this way will cause us any problems in the future.

>> If your problem is with the DT binding for this or other MFDs, then
>> nack *them* and explain to everyone why what they are doing is wrong
>> and why regulators should be special cases. Blocking the regulator
>> drivers to force a change in DT is not going to fix this issue.
>
> Of course this is a negative review of the binding!  What on earth did
> you think my feedback meant?  The driver and the binding go together.
>

The bindings should be driver/platform/OS agnostic, changing the bindings
because the Linux regulator subsystem maintainer doesn't like them
in regulator drivers is then not correct.

If the binding is accepted then the regulator driver will just have
to deal with it, so as I said, why not nack the bindings patch, and
explain your objection where DT maintainers might see it.

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-11-10 16:47                     ` Andrew F. Davis
@ 2015-11-10 17:04                       ` Mark Brown
  2015-11-10 17:52                         ` Andrew F. Davis
  0 siblings, 1 reply; 44+ messages in thread
From: Mark Brown @ 2015-11-10 17:04 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

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

On Tue, Nov 10, 2015 at 10:47:33AM -0600, Andrew F. Davis wrote:
> On 11/10/2015 03:57 AM, Mark Brown wrote:

> >Of course this is a negative review of the binding!  What on earth did
> >you think my feedback meant?  The driver and the binding go together.

> The bindings should be driver/platform/OS agnostic, changing the bindings
> because the Linux regulator subsystem maintainer doesn't like them
> in regulator drivers is then not correct.

> If the binding is accepted then the regulator driver will just have
> to deal with it, so as I said, why not nack the bindings patch, and
> explain your objection where DT maintainers might see it.

If I'm not going to merge the driver because of issues in the DT code it
is vanishingly unlikely that I'm going to merge the regulator bindings
either.  I would have thought it should be clear that my review comments
cover both the manifestation of the bindings in the driver and the
bindings themselves. 

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

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-11-10 17:04                       ` Mark Brown
@ 2015-11-10 17:52                         ` Andrew F. Davis
  2015-11-10 18:44                           ` Mark Brown
  0 siblings, 1 reply; 44+ messages in thread
From: Andrew F. Davis @ 2015-11-10 17:52 UTC (permalink / raw)
  To: Mark Brown
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On 11/10/2015 11:04 AM, Mark Brown wrote:
> On Tue, Nov 10, 2015 at 10:47:33AM -0600, Andrew F. Davis wrote:
>> On 11/10/2015 03:57 AM, Mark Brown wrote:
>
>>> Of course this is a negative review of the binding!  What on earth did
>>> you think my feedback meant?  The driver and the binding go together.
>
>> The bindings should be driver/platform/OS agnostic, changing the bindings
>> because the Linux regulator subsystem maintainer doesn't like them
>> in regulator drivers is then not correct.
>
>> If the binding is accepted then the regulator driver will just have
>> to deal with it, so as I said, why not nack the bindings patch, and
>> explain your objection where DT maintainers might see it.
>
> If I'm not going to merge the driver because of issues in the DT code it
> is vanishingly unlikely that I'm going to merge the regulator bindings
> either.  I would have thought it should be clear that my review comments
> cover both the manifestation of the bindings in the driver and the
> bindings themselves.
>

Kind of an interesting situation, if I didn't have the regulator as a separate
node like you want, then I wouldn't really need a separate regulator binding Doc,
for you to merge, it could all be merged as a single MFD binding.

Anyway, All I'm trying to do here is keep things clean in the DT. We only have
one consistent option:

Match all sub parts by compatible:

tps65912: tps65912@2d {
	compatible = "ti,tps65912";
	reg = <0x58>;
	interrupts ...

	regulator {
		compatible = "ti,tps65912-regulator";
		dcdc1 {
			regulator-name = "vdd_core";
			regulator-min-microvolt = <912000>;
			regulator-max-microvolt = <1144000>;
		};
		...
	};

	pwrbutton {
		compatible = "ti,palmas-pwrbutton";
		interrupt-parent = <&tps65912>;
		interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
		wakeup-source;
		ti,palmas-long-press-seconds = <12>;
	};

	gpio {
		compatible = "ti,palmas-gpio";
		gpio-controller;
		#gpio-cells = <2>;
	};
	...
};

Or we end up with some hybrid approach, matching some on node name, others
on compatible when needed. Yes, the above matches Linux device model (still
not sure why that is such a problem?), but it also matches modular functionality
in the device.

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-11-10 17:52                         ` Andrew F. Davis
@ 2015-11-10 18:44                           ` Mark Brown
  2015-11-10 19:40                             ` Andrew F. Davis
  0 siblings, 1 reply; 44+ messages in thread
From: Mark Brown @ 2015-11-10 18:44 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

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

On Tue, Nov 10, 2015 at 11:52:12AM -0600, Andrew F. Davis wrote:

> Anyway, All I'm trying to do here is keep things clean in the DT. We only have
> one consistent option:

No, not really.

> Match all sub parts by compatible:

> Or we end up with some hybrid approach, matching some on node name, others
> on compatible when needed. Yes, the above matches Linux device model (still
> not sure why that is such a problem?), but it also matches modular functionality
> in the device.

There's also the third option where we don't have any compatible strings
in the subnodes at all.

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

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-11-10 18:44                           ` Mark Brown
@ 2015-11-10 19:40                             ` Andrew F. Davis
  2015-11-16 18:23                               ` Mark Brown
  0 siblings, 1 reply; 44+ messages in thread
From: Andrew F. Davis @ 2015-11-10 19:40 UTC (permalink / raw)
  To: Mark Brown
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

On 11/10/2015 12:44 PM, Mark Brown wrote:
> On Tue, Nov 10, 2015 at 11:52:12AM -0600, Andrew F. Davis wrote:
>
>> Anyway, All I'm trying to do here is keep things clean in the DT. We only have
>> one consistent option:
>
> No, not really.
>
>> Match all sub parts by compatible:
>
>> Or we end up with some hybrid approach, matching some on node name, others
>> on compatible when needed. Yes, the above matches Linux device model (still
>> not sure why that is such a problem?), but it also matches modular functionality
>> in the device.
>
> There's also the third option where we don't have any compatible strings
> in the subnodes at all.
>

Ok, two, but would you really want to go that way? Matching by node name costs
us all of the flexibility of DT sub-device selection. Still don't see an upside
as we would now be locked to node names instead of compatible strings to declare
component type compatibility (what they are for).

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

* Re: [PATCH v4 4/5] regulator: tps65912: Add regulator driver for the TPS65912 PMIC
  2015-11-10 19:40                             ` Andrew F. Davis
@ 2015-11-16 18:23                               ` Mark Brown
  0 siblings, 0 replies; 44+ messages in thread
From: Mark Brown @ 2015-11-16 18:23 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Lee Jones, Alexandre Courbot, Grygorii Strashko, devicetree,
	linux-kernel

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

On Tue, Nov 10, 2015 at 01:40:38PM -0600, Andrew F. Davis wrote:
> On 11/10/2015 12:44 PM, Mark Brown wrote:

> >There's also the third option where we don't have any compatible strings
> >in the subnodes at all.

> Ok, two, but would you really want to go that way? Matching by node name costs
> us all of the flexibility of DT sub-device selection. Still don't see an upside
> as we would now be locked to node names instead of compatible strings to declare
> component type compatibility (what they are for).

Yes, we should go that way.  No, there is nothing meaningful being lost
- the fact that there is zero paramterisation in the bindings and each
subfunction has the full device name as a compatible string ought to be
a big red flag here.

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

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

end of thread, other threads:[~2015-11-16 18:24 UTC | newest]

Thread overview: 44+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-01 20:37 [PATCH v4 0/5] mfd: tps65912: Driver rewrite with DT support Andrew F. Davis
2015-10-01 20:37 ` [PATCH v4 1/5] Documentation: tps65912: Add DT bindings for the TPS65912 PMIC Andrew F. Davis
2015-10-01 20:37 ` [PATCH v4 2/5] mfd: tps65912: Remove old driver in preparation for new driver Andrew F. Davis
2015-10-05  9:28   ` Lee Jones
2015-10-05  9:29     ` Lee Jones
2015-10-05 16:01       ` Andrew F. Davis
2015-10-01 20:37 ` [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC Andrew F. Davis
2015-10-01 20:51   ` kbuild test robot
     [not found]     ` <20151002095859.GN12635@sirena.org.uk>
2015-10-02 13:32       ` [lkp] " Fengguang Wu
2015-10-02 13:47         ` Mark Brown
2015-10-01 20:57   ` kbuild test robot
2015-10-01 20:57   ` kbuild test robot
2015-10-01 23:49   ` Andrew F. Davis
2015-10-05  9:24   ` Lee Jones
2015-10-05  9:27     ` Lee Jones
2015-10-12 15:06       ` Andrew F. Davis
2015-10-13  7:34         ` Lee Jones
2015-10-01 20:37 ` [PATCH v4 4/5] regulator: tps65912: Add regulator " Andrew F. Davis
2015-10-02 19:21   ` Grygorii Strashko
2015-10-22 16:47   ` Mark Brown
2015-10-23 12:46     ` Andrew F. Davis
2015-10-23 23:18       ` Mark Brown
2015-10-24  0:11         ` Andrew F. Davis
2015-10-24 22:14           ` Mark Brown
2015-10-25 20:45             ` Andrew F. Davis
2015-10-26  0:43               ` Mark Brown
2015-10-26 15:47                 ` Andrew F. Davis
2015-10-27  0:16                   ` Mark Brown
2015-10-27 14:23                     ` Andrew F. Davis
2015-11-04 15:35     ` Andrew F. Davis
2015-11-05 10:14       ` Mark Brown
2015-11-05 18:04         ` Andrew F. Davis
2015-11-06 10:43           ` Mark Brown
2015-11-06 18:10             ` Andrew F. Davis
2015-11-06 21:16               ` Mark Brown
2015-11-09 17:41                 ` Andrew F. Davis
2015-11-10  9:57                   ` Mark Brown
2015-11-10 16:47                     ` Andrew F. Davis
2015-11-10 17:04                       ` Mark Brown
2015-11-10 17:52                         ` Andrew F. Davis
2015-11-10 18:44                           ` Mark Brown
2015-11-10 19:40                             ` Andrew F. Davis
2015-11-16 18:23                               ` Mark Brown
2015-10-01 20:37 ` [PATCH v4 5/5] gpio: tps65912: Add GPIO " Andrew F. Davis

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