This patch adds Device Tree support to max8952 regulator driver.
Signed-off-by: Tomasz Figa t.f...@samsung.com
Signed-off-by: Kyungmin Park kyungmin.p...@samsung.com
---
.../devicetree/bindings/regulator/max8952.txt | 52
drivers/regulator/max8952.c| 70 ++
include/linux/regulator/max8952.h | 8 +--
3 files changed, 126 insertions(+), 4 deletions(-)
create mode 100644 Documentation/devicetree/bindings/regulator/max8952.txt
diff --git a/Documentation/devicetree/bindings/regulator/max8952.txt
b/Documentation/devicetree/bindings/regulator/max8952.txt
new file mode 100644
index 000..866fcdd
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/max8952.txt
@@ -0,0 +1,52 @@
+Maxim MAX8952 voltage regulator
+
+Required properties:
+- compatible: must be equal to maxim,max8952
+- reg: I2C slave address, usually 0x60
+- max8952,dvs-mode-microvolt: array of 4 integer values defining DVS voltages
+ in microvolts. All values must be from range 77, 140
+- any required generic properties defined in regulator.txt
+
+Optional properties:
+- max8952,vid-gpios: array of two GPIO pins used for DVS voltage selection
+- max8952,en-gpio: GPIO used to control enable status of regulator
+- max8952,default-mode: index of default DVS voltage, from 0, 3 range
+- max8952,sync-freq: sync frequency, must be one of following values:
+- 0: 26 MHz
+- 1: 13 MHz
+- 2: 19.2 MHz
+ Defaults to 26 MHz if not specified.
+- max8952,ramp-speed: voltage ramp speed, must be one of following values:
+- 0: 32mV/us
+- 1: 16mV/us
+- 2: 8mV/us
+- 3: 4mV/us
+- 4: 2mV/us
+- 5: 1mV/us
+- 6: 0.5mV/us
+- 7: 0.25mV/us
+ Defaults to 32mV/us if not specified.
+- any available generic properties defined in regulator.txt
+
+Example:
+
+ vdd_arm_reg: pmic@60 {
+ compatible = maxim,max8952;
+ reg = 0x60;
+
+ /* max8952-specific properties */
+ max8952,vid-gpios = gpx0 3 0, gpx0 4 0;
+ max8952,en-gpio = gpx0 1 0;
+ max8952,default-mode = 0;
+ max8952,dvs-mode-microvolt = 125, 120,
+ 105, 95;
+ max8952,sync-freq = 0;
+ max8952,ramp-speed = 0;
+
+ /* generic regulator properties */
+ regulator-name = vdd_arm;
+ regulator-min-microvolt = 77;
+ regulator-max-microvolt = 140;
+ regulator-always-on;
+ regulator-boot-on;
+ };
diff --git a/drivers/regulator/max8952.c b/drivers/regulator/max8952.c
index 100b917..4259c78 100644
--- a/drivers/regulator/max8952.c
+++ b/drivers/regulator/max8952.c
@@ -28,6 +28,9 @@
#include linux/regulator/max8952.h
#include linux/gpio.h
#include linux/io.h
+#include linux/of.h
+#include linux/of_gpio.h
+#include linux/regulator/of_regulator.h
#include linux/slab.h
/* Registers */
@@ -126,6 +129,69 @@ static const struct regulator_desc regulator = {
.owner = THIS_MODULE,
};
+#ifdef CONFIG_OF
+static struct of_device_id max8952_dt_match[] = {
+ { .compatible = maxim,max8952 },
+ {},
+};
+MODULE_DEVICE_TABLE(of, max8952_dt_match);
+
+static struct max8952_platform_data *max8952_parse_dt(struct device *dev)
+{
+ struct max8952_platform_data *pd;
+ struct device_node *np = dev-of_node;
+ int ret;
+ int i;
+
+ pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
+ if (!pd) {
+ dev_err(dev, Failed to allocate platform data\n);
+ return NULL;
+ }
+
+ pd-gpio_vid0 = of_get_named_gpio(np, max8952,vid-gpios, 0);
+ pd-gpio_vid1 = of_get_named_gpio(np, max8952,vid-gpios, 1);
+ pd-gpio_en = of_get_named_gpio(np, max8952,en-gpio, 0);
+
+ if (of_property_read_u32(np, max8952,default-mode, pd-default_mode))
+ dev_warn(dev, Default mode not specified, assuming 0\n);
+
+ ret = of_property_read_u32_array(np, max8952,dvs-mode-microvolt,
+ pd-dvs_mode, ARRAY_SIZE(pd-dvs_mode));
+ if (ret) {
+ dev_err(dev, max8952,dvs-mode-microvolt property not
specified);
+ return NULL;
+ }
+
+ for (i = 0; i ARRAY_SIZE(pd-dvs_mode); ++i) {
+ if (pd-dvs_mode[i] 77 || pd-dvs_mode[i] 140) {
+ dev_err(dev, DVS voltage %d out of range\n, i);
+ return NULL;
+ }
+ pd-dvs_mode[i] = (pd-dvs_mode[i] - 77) / 1;
+ }
+
+ if (of_property_read_u32(np, max8952,sync-freq, pd-sync_freq))
+ dev_warn(dev, max8952,sync-freq property not specified,
defaulting to 26MHz\n);
+
+ if (of_property_read_u32(np, max8952,ramp-speed, pd-ramp_speed))
+ dev_warn(dev, max8952,ramp-speed property