Merge branch 'akpm' (patches from Andrew)
[linux-2.6-microblaze.git] / drivers / regulator / of_regulator.c
index 49f6c05..f54d4f1 100644 (file)
@@ -21,6 +21,62 @@ static const char *const regulator_states[PM_SUSPEND_MAX + 1] = {
        [PM_SUSPEND_MAX]        = "regulator-state-disk",
 };
 
+static void fill_limit(int *limit, int val)
+{
+       if (val)
+               if (val == 1)
+                       *limit = REGULATOR_NOTIF_LIMIT_ENABLE;
+               else
+                       *limit = val;
+       else
+               *limit = REGULATOR_NOTIF_LIMIT_DISABLE;
+}
+
+static void of_get_regulator_prot_limits(struct device_node *np,
+                               struct regulation_constraints *constraints)
+{
+       u32 pval;
+       int i;
+       static const char *const props[] = {
+               "regulator-oc-%s-microamp",
+               "regulator-ov-%s-microvolt",
+               "regulator-temp-%s-kelvin",
+               "regulator-uv-%s-microvolt",
+       };
+       struct notification_limit *limits[] = {
+               &constraints->over_curr_limits,
+               &constraints->over_voltage_limits,
+               &constraints->temp_limits,
+               &constraints->under_voltage_limits,
+       };
+       bool set[4] = {0};
+
+       /* Protection limits: */
+       for (i = 0; i < ARRAY_SIZE(props); i++) {
+               char prop[255];
+               bool found;
+               int j;
+               static const char *const lvl[] = {
+                       "protection", "error", "warn"
+               };
+               int *l[] = {
+                       &limits[i]->prot, &limits[i]->err, &limits[i]->warn,
+               };
+
+               for (j = 0; j < ARRAY_SIZE(lvl); j++) {
+                       snprintf(prop, 255, props[i], lvl[j]);
+                       found = !of_property_read_u32(np, prop, &pval);
+                       if (found)
+                               fill_limit(l[j], pval);
+                       set[i] |= found;
+               }
+       }
+       constraints->over_current_detection = set[0];
+       constraints->over_voltage_detection = set[1];
+       constraints->over_temp_detection = set[2];
+       constraints->under_voltage_detection = set[3];
+}
+
 static int of_get_regulation_constraints(struct device *dev,
                                        struct device_node *np,
                                        struct regulator_init_data **init_data,
@@ -188,6 +244,8 @@ static int of_get_regulation_constraints(struct device *dev,
        constraints->over_current_protection = of_property_read_bool(np,
                                        "regulator-over-current-protection");
 
+       of_get_regulator_prot_limits(np, constraints);
+
        for (i = 0; i < ARRAY_SIZE(regulator_states); i++) {
                switch (i) {
                case PM_SUSPEND_MEM: