Re: [PATCH 2/2] regulator: max8952: Add Device Tree support

2013-04-05 Thread Mark Brown
On Thu, Apr 04, 2013 at 06:17:20PM +0200, Tomasz Figa wrote:

 + if (of_property_read_u32(np, max8952,ramp-speed, pd-ramp_speed))
 + dev_warn(dev, max8952,ramp-speed property not specified, 
 defaulting to 32mV/us\n);

Applied both, though the above warning seems a bit harsh - it seems like
assuming a worst case ramp rate ought to be totally safe and just a
minor performance issue so silently accepted.


signature.asc
Description: Digital signature


[PATCH 2/2] regulator: max8952: Add Device Tree support

2013-04-04 Thread Tomasz Figa
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