[PATCH v4 3/5] regulator: add bcm590xx regulator driver

2014-03-11 Thread Matt Porter
Add a regulator driver for the BCM590xx PMU voltage regulators.
The driver supports LDOs and DCDCs in normal mode only. There is
no support for low-power mode or power sequencing.

Signed-off-by: Matt Porter 
Reviewed-by: Tim Kryger 
Reviewed-by: Markus Mayer 
---
 drivers/regulator/Kconfig  |   8 +
 drivers/regulator/Makefile |   1 +
 drivers/regulator/bcm590xx-regulator.c | 413 +
 3 files changed, 422 insertions(+)
 create mode 100644 drivers/regulator/bcm590xx-regulator.c

diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 6a79328..1169a42 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -139,6 +139,14 @@ config REGULATOR_AS3722
  AS3722 PMIC. This will enable support for all the software
  controllable DCDC/LDO regulators.
 
+config REGULATOR_BCM590XX
+   tristate "Broadcom BCM590xx PMU Regulators"
+   depends on MFD_BCM590XX
+   help
+ This driver provides support for the voltage regulators on the
+ BCM590xx PMUs. This will enable support for the software
+ controllable LDO/Switching regulators.
+
 config REGULATOR_DA903X
tristate "Dialog Semiconductor DA9030/DA9034 regulators"
depends on PMIC_DA903X
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index 979f9dd..e1ab514 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -20,6 +20,7 @@ obj-$(CONFIG_REGULATOR_ANATOP) += anatop-regulator.o
 obj-$(CONFIG_REGULATOR_ARIZONA) += arizona-micsupp.o arizona-ldo1.o
 obj-$(CONFIG_REGULATOR_AS3711) += as3711-regulator.o
 obj-$(CONFIG_REGULATOR_AS3722) += as3722-regulator.o
+obj-$(CONFIG_REGULATOR_BCM590XX) += bcm590xx-regulator.o
 obj-$(CONFIG_REGULATOR_DA903X) += da903x.o
 obj-$(CONFIG_REGULATOR_DA9052) += da9052-regulator.o
 obj-$(CONFIG_REGULATOR_DA9055) += da9055-regulator.o
diff --git a/drivers/regulator/bcm590xx-regulator.c 
b/drivers/regulator/bcm590xx-regulator.c
new file mode 100644
index 000..e6b2e8e
--- /dev/null
+++ b/drivers/regulator/bcm590xx-regulator.c
@@ -0,0 +1,413 @@
+/*
+ * Broadcom BCM590xx regulator driver
+ *
+ * Copyright 2014 Linaro Limited
+ * Author: Matt Porter 
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under  the terms of the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the License, or (at your
+ * option) any later version.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+/* Register defs */
+#define BCM590XX_RFLDOPMCTRL1  0x60
+#define BCM590XX_IOSR1PMCTRL1  0x7a
+#define BCM590XX_IOSR2PMCTRL1  0x7c
+#define BCM590XX_CSRPMCTRL10x7e
+#define BCM590XX_SDSR1PMCTRL1  0x82
+#define BCM590XX_SDSR2PMCTRL1  0x86
+#define BCM590XX_MSRPMCTRL10x8a
+#define BCM590XX_VSRPMCTRL10x8e
+#define BCM590XX_REG_ENABLEBIT(7)
+
+#define BCM590XX_RFLDOCTRL 0x96
+#define BCM590XX_CSRVOUT1  0xc0
+#define BCM590XX_LDO_VSEL_MASK GENMASK(5, 3)
+#define BCM590XX_SR_VSEL_MASK  GENMASK(5, 0)
+
+/* LDO regulator IDs */
+#define BCM590XX_REG_RFLDO 0
+#define BCM590XX_REG_CAMLDO1   1
+#define BCM590XX_REG_CAMLDO2   2
+#define BCM590XX_REG_SIMLDO1   3
+#define BCM590XX_REG_SIMLDO2   4
+#define BCM590XX_REG_SDLDO 5
+#define BCM590XX_REG_SDXLDO6
+#define BCM590XX_REG_MMCLDO1   7
+#define BCM590XX_REG_MMCLDO2   8
+#define BCM590XX_REG_AUDLDO9
+#define BCM590XX_REG_MICLDO10
+#define BCM590XX_REG_USBLDO11
+#define BCM590XX_REG_VIBLDO12
+
+/* DCDC regulator IDs */
+#define BCM590XX_REG_CSR   13
+#define BCM590XX_REG_IOSR1 14
+#define BCM590XX_REG_IOSR2 15
+#define BCM590XX_REG_MSR   16
+#define BCM590XX_REG_SDSR1 17
+#define BCM590XX_REG_SDSR2 18
+#define BCM590XX_REG_VSR   19
+
+#define BCM590XX_NUM_REGS  20
+
+#define BCM590XX_REG_IS_LDO(n) (n < BCM590XX_REG_CSR)
+
+struct bcm590xx_board {
+   struct regulator_init_data *bcm590xx_pmu_init_data[BCM590XX_NUM_REGS];
+};
+
+/* LDO group A: supported voltages in microvolts */
+static const unsigned int ldo_a_table[] = {
+   120, 180, 250, 270, 280,
+   290, 300, 330,
+};
+
+/* LDO group C: supported voltages in microvolts */
+static const unsigned int ldo_c_table[] = {
+   310, 180, 250, 270, 280,
+   290, 300, 330,
+};
+
+/* DCDC group CSR: supported voltages in microvolts */
+static const struct regulator_linear_range dcdc_csr_ranges[] = {
+   REGULATOR_LINEAR_RANGE(86, 2, 50, 1),
+   REGULATOR_LINEAR_RANGE(136, 51, 55, 2),
+   REGULATOR_LINEAR_RANGE(90, 56, 63, 0),
+};
+
+/* DCDC group IOSR1: supported voltages in microvolts */
+static const struct regulator_linear_range dcdc_iosr1_ranges[] = {
+   REGULATOR_LINEAR_RANGE(86, 2, 51, 1),
+   REGULATOR_LINEAR_RANGE(150, 

[PATCH v4 3/5] regulator: add bcm590xx regulator driver

2014-03-11 Thread Matt Porter
Add a regulator driver for the BCM590xx PMU voltage regulators.
The driver supports LDOs and DCDCs in normal mode only. There is
no support for low-power mode or power sequencing.

Signed-off-by: Matt Porter mpor...@linaro.org
Reviewed-by: Tim Kryger tim.kry...@linaro.org
Reviewed-by: Markus Mayer markus.ma...@linaro.org
---
 drivers/regulator/Kconfig  |   8 +
 drivers/regulator/Makefile |   1 +
 drivers/regulator/bcm590xx-regulator.c | 413 +
 3 files changed, 422 insertions(+)
 create mode 100644 drivers/regulator/bcm590xx-regulator.c

diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 6a79328..1169a42 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -139,6 +139,14 @@ config REGULATOR_AS3722
  AS3722 PMIC. This will enable support for all the software
  controllable DCDC/LDO regulators.
 
+config REGULATOR_BCM590XX
+   tristate Broadcom BCM590xx PMU Regulators
+   depends on MFD_BCM590XX
+   help
+ This driver provides support for the voltage regulators on the
+ BCM590xx PMUs. This will enable support for the software
+ controllable LDO/Switching regulators.
+
 config REGULATOR_DA903X
tristate Dialog Semiconductor DA9030/DA9034 regulators
depends on PMIC_DA903X
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index 979f9dd..e1ab514 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -20,6 +20,7 @@ obj-$(CONFIG_REGULATOR_ANATOP) += anatop-regulator.o
 obj-$(CONFIG_REGULATOR_ARIZONA) += arizona-micsupp.o arizona-ldo1.o
 obj-$(CONFIG_REGULATOR_AS3711) += as3711-regulator.o
 obj-$(CONFIG_REGULATOR_AS3722) += as3722-regulator.o
+obj-$(CONFIG_REGULATOR_BCM590XX) += bcm590xx-regulator.o
 obj-$(CONFIG_REGULATOR_DA903X) += da903x.o
 obj-$(CONFIG_REGULATOR_DA9052) += da9052-regulator.o
 obj-$(CONFIG_REGULATOR_DA9055) += da9055-regulator.o
diff --git a/drivers/regulator/bcm590xx-regulator.c 
b/drivers/regulator/bcm590xx-regulator.c
new file mode 100644
index 000..e6b2e8e
--- /dev/null
+++ b/drivers/regulator/bcm590xx-regulator.c
@@ -0,0 +1,413 @@
+/*
+ * Broadcom BCM590xx regulator driver
+ *
+ * Copyright 2014 Linaro Limited
+ * Author: Matt Porter mpor...@linaro.org
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under  the terms of the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the License, or (at your
+ * option) any later version.
+ */
+
+#include linux/err.h
+#include linux/init.h
+#include linux/kernel.h
+#include linux/mfd/bcm590xx.h
+#include linux/module.h
+#include linux/of.h
+#include linux/platform_device.h
+#include linux/regulator/driver.h
+#include linux/regulator/machine.h
+#include linux/regulator/of_regulator.h
+#include linux/slab.h
+
+/* Register defs */
+#define BCM590XX_RFLDOPMCTRL1  0x60
+#define BCM590XX_IOSR1PMCTRL1  0x7a
+#define BCM590XX_IOSR2PMCTRL1  0x7c
+#define BCM590XX_CSRPMCTRL10x7e
+#define BCM590XX_SDSR1PMCTRL1  0x82
+#define BCM590XX_SDSR2PMCTRL1  0x86
+#define BCM590XX_MSRPMCTRL10x8a
+#define BCM590XX_VSRPMCTRL10x8e
+#define BCM590XX_REG_ENABLEBIT(7)
+
+#define BCM590XX_RFLDOCTRL 0x96
+#define BCM590XX_CSRVOUT1  0xc0
+#define BCM590XX_LDO_VSEL_MASK GENMASK(5, 3)
+#define BCM590XX_SR_VSEL_MASK  GENMASK(5, 0)
+
+/* LDO regulator IDs */
+#define BCM590XX_REG_RFLDO 0
+#define BCM590XX_REG_CAMLDO1   1
+#define BCM590XX_REG_CAMLDO2   2
+#define BCM590XX_REG_SIMLDO1   3
+#define BCM590XX_REG_SIMLDO2   4
+#define BCM590XX_REG_SDLDO 5
+#define BCM590XX_REG_SDXLDO6
+#define BCM590XX_REG_MMCLDO1   7
+#define BCM590XX_REG_MMCLDO2   8
+#define BCM590XX_REG_AUDLDO9
+#define BCM590XX_REG_MICLDO10
+#define BCM590XX_REG_USBLDO11
+#define BCM590XX_REG_VIBLDO12
+
+/* DCDC regulator IDs */
+#define BCM590XX_REG_CSR   13
+#define BCM590XX_REG_IOSR1 14
+#define BCM590XX_REG_IOSR2 15
+#define BCM590XX_REG_MSR   16
+#define BCM590XX_REG_SDSR1 17
+#define BCM590XX_REG_SDSR2 18
+#define BCM590XX_REG_VSR   19
+
+#define BCM590XX_NUM_REGS  20
+
+#define BCM590XX_REG_IS_LDO(n) (n  BCM590XX_REG_CSR)
+
+struct bcm590xx_board {
+   struct regulator_init_data *bcm590xx_pmu_init_data[BCM590XX_NUM_REGS];
+};
+
+/* LDO group A: supported voltages in microvolts */
+static const unsigned int ldo_a_table[] = {
+   120, 180, 250, 270, 280,
+   290, 300, 330,
+};
+
+/* LDO group C: supported voltages in microvolts */
+static const unsigned int ldo_c_table[] = {
+   310, 180, 250, 270, 280,
+   290, 300, 330,
+};
+
+/* DCDC group CSR: supported voltages in microvolts */
+static const struct regulator_linear_range dcdc_csr_ranges[] = {
+   REGULATOR_LINEAR_RANGE(86, 2, 50, 1),
+   REGULATOR_LINEAR_RANGE(136, 51, 55, 2),
+