]> rtime.felk.cvut.cz Git - linux-imx.git/commitdiff
mfd: Add device tree support for max77686
authorYadwinder Singh Brar <yadi.brar01@gmail.com>
Fri, 6 Jul 2012 11:32:55 +0000 (17:02 +0530)
committerSamuel Ortiz <sameo@linux.intel.com>
Mon, 9 Jul 2012 13:13:42 +0000 (15:13 +0200)
This patch adds device tree support for mfd driver and adds
Documentation/devicetree/bindings/mfd/max77686.txt.
This patch also intialize max77686 pointer to NULL in max77686_i2c_probe
to silent a compile time warning.

Signed-off-by: Yadwinder Singh Brar <yadi.brar@samsung.com>
Reviwed-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Documentation/devicetree/bindings/mfd/max77686.txt [new file with mode: 0644]
drivers/mfd/max77686.c

diff --git a/Documentation/devicetree/bindings/mfd/max77686.txt b/Documentation/devicetree/bindings/mfd/max77686.txt
new file mode 100644 (file)
index 0000000..c6a3469
--- /dev/null
@@ -0,0 +1,59 @@
+Maxim MAX77686 multi-function device
+
+MAX77686 is a Mulitifunction device with PMIC, RTC and Charger on chip. It is
+interfaced to host controller using i2c interface. PMIC and Charger submodules
+are addressed using same i2c slave address whereas RTC submodule uses
+different i2c slave address,presently for which we are statically creating i2c
+client while probing.This document describes the binding for mfd device and
+PMIC submodule.
+
+Required properties:
+- compatible : Must be "maxim,max77686";
+- reg : Specifies the i2c slave address of PMIC block.
+- interrupts : This i2c device has an IRQ line connected to the main SoC.
+- interrupt-parent : The parent interrupt controller.
+
+Optional node:
+- voltage-regulators : The regulators of max77686 have to be instantiated
+  under subnode named "voltage-regulators" using the following format.
+
+       regulator_name {
+               regulator-compatible = LDOn/BUCKn
+               standard regulator constraints....
+       };
+       refer Documentation/devicetree/bindings/regulator/regulator.txt
+
+  The regulator-compatible property of regulator should initialized with string
+to get matched with their hardware counterparts as follow:
+
+       -LDOn   :       for LDOs, where n can lie in range 1 to 26.
+                       example: LDO1, LDO2, LDO26.
+       -BUCKn  :       for BUCKs, where n can lie in range 1 to 9.
+                       example: BUCK1, BUCK5, BUCK9.
+
+Example:
+
+       max77686@09 {
+               compatible = "maxim,max77686";
+               interrupt-parent = <&wakeup_eint>;
+               interrupts = <26 0>;
+               reg = <0x09>;
+
+               voltage-regulators {
+                       ldo11_reg {
+                               regulator-compatible = "LDO11";
+                               regulator-name = "vdd_ldo11";
+                               regulator-min-microvolt = <1900000>;
+                               regulator-max-microvolt = <1900000>;
+                               regulator-always-on;
+                       };
+
+                       buck1_reg {
+                               regulator-compatible = "BUCK1";
+                               regulator-name = "vdd_mif";
+                               regulator-min-microvolt = <950000>;
+                               regulator-max-microvolt = <1300000>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                       };
+       }
index c66639d681e932d49e2f643d9ffd155b9a27196f..3e31d05906b2f7102d713d37a0131c9b58071cd8 100644 (file)
 
 #define I2C_ADDR_RTC   (0x0C >> 1)
 
+static struct of_device_id __devinitdata max77686_pmic_dt_match[] = {
+       {.compatible = "maxim,max77686",        .data = 0},
+       {},
+};
+
 static struct mfd_cell max77686_devs[] = {
        { .name = "max77686-pmic", },
        { .name = "max77686-rtc", },
@@ -44,14 +49,46 @@ static struct regmap_config max77686_regmap_config = {
        .val_bits = 8,
 };
 
+#ifdef CONFIG_OF
+static struct max77686_platform_data *max77686_i2c_parse_dt_pdata(struct device
+                                                                 *dev)
+{
+       struct max77686_platform_data *pd;
+
+       pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
+       if (!pd) {
+               dev_err(dev, "could not allocate memory for pdata\n");
+               return NULL;
+       }
+
+       dev->platform_data = pd;
+       return pd;
+}
+#else
+static struct max77686_platform_data *max77686_i2c_parse_dt_pdata(struct device
+                                                                 *dev)
+{
+       return 0;
+}
+#endif
+
 static int max77686_i2c_probe(struct i2c_client *i2c,
                              const struct i2c_device_id *id)
 {
-       struct max77686_dev *max77686;
+       struct max77686_dev *max77686 = NULL;
        struct max77686_platform_data *pdata = i2c->dev.platform_data;
        unsigned int data;
        int ret = 0;
 
+       if (i2c->dev.of_node)
+               pdata = max77686_i2c_parse_dt_pdata(&i2c->dev);
+
+       if (!pdata) {
+               ret = -EIO;
+               dev_err(&i2c->dev, "No platform data found.\n");
+               goto err;
+       }
+
        max77686 = kzalloc(sizeof(struct max77686_dev), GFP_KERNEL);
        if (max77686 == NULL)
                return -ENOMEM;
@@ -70,11 +107,6 @@ static int max77686_i2c_probe(struct i2c_client *i2c,
        max77686->i2c = i2c;
        max77686->type = id->driver_data;
 
-       if (!pdata) {
-               ret = -EIO;
-               goto err;
-       }
-
        max77686->wakeup = pdata->wakeup;
        max77686->irq_gpio = pdata->irq_gpio;
        max77686->irq = i2c->irq;
@@ -130,6 +162,7 @@ static struct i2c_driver max77686_i2c_driver = {
        .driver = {
                   .name = "max77686",
                   .owner = THIS_MODULE,
+                  .of_match_table = of_match_ptr(max77686_pmic_dt_match),
        },
        .probe = max77686_i2c_probe,
        .remove = max77686_i2c_remove,