Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1237710 > unrolled thread
| Started by | "Andrew F. Davis" <afd@ti.com> |
|---|---|
| First post | 2015-10-01 22:40 +0200 |
| Last post | 2015-10-05 18:10 +0200 |
| Articles | 10 — 4 participants |
Back to article view | Back to linux.kernel
[PATCH v4 0/5] mfd: tps65912: Driver rewrite with DT support "Andrew F. Davis" <afd@ti.com> - 2015-10-01 22:40 +0200
[PATCH v4 1/5] Documentation: tps65912: Add DT bindings for the TPS65912 PMIC "Andrew F. Davis" <afd@ti.com> - 2015-10-01 22:40 +0200
[PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC "Andrew F. Davis" <afd@ti.com> - 2015-10-01 22:40 +0200
Re: [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC "Andrew F. Davis" <afd@ti.com> - 2015-10-02 02:00 +0200
Re: [lkp] [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC Fengguang Wu <fengguang.wu@intel.com> - 2015-10-02 15:40 +0200
Re: [lkp] [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC Mark Brown <broonie@kernel.org> - 2015-10-02 15:50 +0200
Re: [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC Lee Jones <lee.jones@linaro.org> - 2015-10-05 11:30 +0200
Re: [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC Lee Jones <lee.jones@linaro.org> - 2015-10-05 11:30 +0200
[PATCH v4 5/5] gpio: tps65912: Add GPIO driver for the TPS65912 PMIC "Andrew F. Davis" <afd@ti.com> - 2015-10-01 22:50 +0200
Re: [PATCH v4 2/5] mfd: tps65912: Remove old driver in preparation for new driver "Andrew F. Davis" <afd@ti.com> - 2015-10-05 18:10 +0200
| From | "Andrew F. Davis" <afd@ti.com> |
|---|---|
| Date | 2015-10-01 22:40 +0200 |
| Subject | [PATCH v4 0/5] mfd: tps65912: Driver rewrite with DT support |
| Message-ID | <qeSNX-71t-3@gated-at.bofh.it> |
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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | "Andrew F. Davis" <afd@ti.com> |
|---|---|
| Date | 2015-10-01 22:40 +0200 |
| Subject | [PATCH v4 1/5] Documentation: tps65912: Add DT bindings for the TPS65912 PMIC |
| Message-ID | <qeSNY-71t-15@gated-at.bofh.it> |
| In reply to | #1237710 |
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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Andrew F. Davis" <afd@ti.com> |
|---|---|
| Date | 2015-10-01 22:40 +0200 |
| Subject | [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC |
| Message-ID | <qeSNY-71t-21@gated-at.bofh.it> |
| In reply to | #1237710 |
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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Andrew F. Davis" <afd@ti.com> |
|---|---|
| Date | 2015-10-02 02:00 +0200 |
| Subject | Re: [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC |
| Message-ID | <qeVVv-37f-1@gated-at.bofh.it> |
| In reply to | #1237713 |
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.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Fengguang Wu <fengguang.wu@intel.com> |
|---|---|
| Date | 2015-10-02 15:40 +0200 |
| Subject | Re: [lkp] [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC |
| Message-ID | <qf8J3-4MS-1@gated-at.bofh.it> |
| In reply to | #1237713 |
[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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Mark Brown <broonie@kernel.org> |
|---|---|
| Date | 2015-10-02 15:50 +0200 |
| Subject | Re: [lkp] [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC |
| Message-ID | <qf8SJ-4YE-11@gated-at.bofh.it> |
| In reply to | #1238215 |
[Multipart message — attachments visible in raw view] — view raw
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.
[toc] | [prev] | [next] | [standalone]
| From | Lee Jones <lee.jones@linaro.org> |
|---|---|
| Date | 2015-10-05 11:30 +0200 |
| Subject | Re: [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC |
| Message-ID | <qgafM-3de-13@gated-at.bofh.it> |
| In reply to | #1237713 |
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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Lee Jones <lee.jones@linaro.org> |
|---|---|
| Date | 2015-10-05 11:30 +0200 |
| Subject | Re: [PATCH v4 3/5] mfd: tps65912: Add driver for the TPS65912 PMIC |
| Message-ID | <qgafM-3de-33@gated-at.bofh.it> |
| In reply to | #1239382 |
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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Andrew F. Davis" <afd@ti.com> |
|---|---|
| Date | 2015-10-01 22:50 +0200 |
| Subject | [PATCH v4 5/5] gpio: tps65912: Add GPIO driver for the TPS65912 PMIC |
| Message-ID | <qeSXE-7fI-17@gated-at.bofh.it> |
| In reply to | #1237710 |
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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Andrew F. Davis" <afd@ti.com> |
|---|---|
| Date | 2015-10-05 18:10 +0200 |
| Subject | Re: [PATCH v4 2/5] mfd: tps65912: Remove old driver in preparation for new driver |
| Message-ID | <qgguS-3OH-31@gated-at.bofh.it> |
| In reply to | #1237710 |
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. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web