Merge branch 'acpi-battery'
[deliverable/linux.git] / drivers / regulator / palmas-regulator.c
index 6efc7ee8aea30f8ea1307e7e84b91a9901899808..f11d41dad9c13b9d581fe6fa122f1898bc140e55 100644 (file)
@@ -944,6 +944,8 @@ static int palmas_ldo_registration(struct palmas_pmic *pmic,
                        if (id == PALMAS_REG_LDO9) {
                                desc->ops = &palmas_ops_ldo9;
                                desc->bypass_reg = desc->enable_reg;
+                               desc->bypass_val_on =
+                                               PALMAS_LDO9_CTRL_LDO_BYPASS_EN;
                                desc->bypass_mask =
                                                PALMAS_LDO9_CTRL_LDO_BYPASS_EN;
                        }
@@ -1055,6 +1057,8 @@ static int tps65917_ldo_registration(struct palmas_pmic *pmic,
                            id == TPS65917_REG_LDO2) {
                                desc->ops = &tps65917_ops_ldo_1_2;
                                desc->bypass_reg = desc->enable_reg;
+                               desc->bypass_val_on =
+                                               TPS65917_LDO1_CTRL_BYPASS_EN;
                                desc->bypass_mask =
                                                TPS65917_LDO1_CTRL_BYPASS_EN;
                        }
@@ -1206,6 +1210,7 @@ static int palmas_smps_registration(struct palmas_pmic *pmic,
                                desc->enable_mask = SMPS10_BOOST_EN;
                        desc->bypass_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE,
                                                            PALMAS_SMPS10_CTRL);
+                       desc->bypass_val_on = SMPS10_BYPASS_EN;
                        desc->bypass_mask = SMPS10_BYPASS_EN;
                        desc->min_uV = 3750000;
                        desc->uV_step = 1250000;
@@ -1462,10 +1467,10 @@ static struct palmas_pmic_driver_data tps65917_ddata = {
        .ldo_register = tps65917_ldo_registration,
 };
 
-static void palmas_dt_to_pdata(struct device *dev,
-                              struct device_node *node,
-                              struct palmas_pmic_platform_data *pdata,
-                              struct palmas_pmic_driver_data *ddata)
+static int palmas_dt_to_pdata(struct device *dev,
+                             struct device_node *node,
+                             struct palmas_pmic_platform_data *pdata,
+                             struct palmas_pmic_driver_data *ddata)
 {
        struct device_node *regulators;
        u32 prop;
@@ -1474,7 +1479,7 @@ static void palmas_dt_to_pdata(struct device *dev,
        regulators = of_get_child_by_name(node, "regulators");
        if (!regulators) {
                dev_info(dev, "regulator node not found\n");
-               return;
+               return 0;
        }
 
        ret = of_regulator_match(dev, regulators, ddata->palmas_matches,
@@ -1482,25 +1487,29 @@ static void palmas_dt_to_pdata(struct device *dev,
        of_node_put(regulators);
        if (ret < 0) {
                dev_err(dev, "Error parsing regulator init data: %d\n", ret);
-               return;
+               return 0;
        }
 
        for (idx = 0; idx < ddata->max_reg; idx++) {
-               if (!ddata->palmas_matches[idx].init_data ||
-                   !ddata->palmas_matches[idx].of_node)
-                       continue;
+               static struct of_regulator_match *match;
+               struct palmas_reg_init *rinit;
+               struct device_node *np;
 
-               pdata->reg_data[idx] = ddata->palmas_matches[idx].init_data;
+               match = &ddata->palmas_matches[idx];
+               np = match->of_node;
 
-               pdata->reg_init[idx] = devm_kzalloc(dev,
-                               sizeof(struct palmas_reg_init), GFP_KERNEL);
+               if (!match->init_data || !np)
+                       continue;
+
+               rinit = devm_kzalloc(dev, sizeof(*rinit), GFP_KERNEL);
+               if (!rinit)
+                       return -ENOMEM;
 
-               pdata->reg_init[idx]->warm_reset =
-                       of_property_read_bool(ddata->palmas_matches[idx].of_node,
-                                             "ti,warm-reset");
+               pdata->reg_data[idx] = match->init_data;
+               pdata->reg_init[idx] = rinit;
 
-               ret = of_property_read_u32(ddata->palmas_matches[idx].of_node,
-                                          "ti,roof-floor", &prop);
+               rinit->warm_reset = of_property_read_bool(np, "ti,warm-reset");
+               ret = of_property_read_u32(np, "ti,roof-floor", &prop);
                /* EINVAL: Property not found */
                if (ret != -EINVAL) {
                        int econtrol;
@@ -1522,31 +1531,29 @@ static void palmas_dt_to_pdata(struct device *dev,
                                        WARN_ON(1);
                                        dev_warn(dev,
                                                 "%s: Invalid roof-floor option: %u\n",
-                                            palmas_matches[idx].name, prop);
+                                                match->name, prop);
                                        break;
                                }
                        }
-                       pdata->reg_init[idx]->roof_floor = econtrol;
+                       rinit->roof_floor = econtrol;
                }
 
-               ret = of_property_read_u32(ddata->palmas_matches[idx].of_node,
-                                          "ti,mode-sleep", &prop);
+               ret = of_property_read_u32(np, "ti,mode-sleep", &prop);
                if (!ret)
-                       pdata->reg_init[idx]->mode_sleep = prop;
+                       rinit->mode_sleep = prop;
 
-               ret = of_property_read_bool(ddata->palmas_matches[idx].of_node,
-                                           "ti,smps-range");
+               ret = of_property_read_bool(np, "ti,smps-range");
                if (ret)
-                       pdata->reg_init[idx]->vsel =
-                               PALMAS_SMPS12_VOLTAGE_RANGE;
+                       rinit->vsel = PALMAS_SMPS12_VOLTAGE_RANGE;
 
                if (idx == PALMAS_REG_LDO8)
                        pdata->enable_ldo8_tracking = of_property_read_bool(
-                                               ddata->palmas_matches[idx].of_node,
-                                               "ti,enable-ldo8-tracking");
+                                               np, "ti,enable-ldo8-tracking");
        }
 
        pdata->ldo6_vibrator = of_property_read_bool(node, "ti,ldo6-vibrator");
+
+       return 0;
 }
 
 static const struct of_device_id of_palmas_match_tbl[] = {
@@ -1628,7 +1635,9 @@ static int palmas_regulators_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, pmic);
        pmic->palmas->pmic_ddata = driver_data;
 
-       palmas_dt_to_pdata(&pdev->dev, node, pdata, driver_data);
+       ret = palmas_dt_to_pdata(&pdev->dev, node, pdata, driver_data);
+       if (ret)
+               return ret;
 
        ret = palmas_smps_read(palmas, PALMAS_SMPS_CTRL, &reg);
        if (ret)
This page took 0.028386 seconds and 5 git commands to generate.