Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
of_regulator.c
Go to the documentation of this file.
1 /*
2  * OF helpers for regulator framework
3  *
4  * Copyright (C) 2011 Texas Instruments, Inc.
5  * Rajendra Nayak <[email protected]>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  */
12 
13 #include <linux/module.h>
14 #include <linux/slab.h>
15 #include <linux/of.h>
18 
19 static void of_get_regulation_constraints(struct device_node *np,
20  struct regulator_init_data **init_data)
21 {
22  const __be32 *min_uV, *max_uV, *uV_offset;
23  const __be32 *min_uA, *max_uA, *ramp_delay;
24  struct regulation_constraints *constraints = &(*init_data)->constraints;
25 
26  constraints->name = of_get_property(np, "regulator-name", NULL);
27 
28  min_uV = of_get_property(np, "regulator-min-microvolt", NULL);
29  if (min_uV)
30  constraints->min_uV = be32_to_cpu(*min_uV);
31  max_uV = of_get_property(np, "regulator-max-microvolt", NULL);
32  if (max_uV)
33  constraints->max_uV = be32_to_cpu(*max_uV);
34 
35  /* Voltage change possible? */
36  if (constraints->min_uV != constraints->max_uV)
38  /* Only one voltage? Then make sure it's set. */
39  if (min_uV && max_uV && constraints->min_uV == constraints->max_uV)
40  constraints->apply_uV = true;
41 
42  uV_offset = of_get_property(np, "regulator-microvolt-offset", NULL);
43  if (uV_offset)
44  constraints->uV_offset = be32_to_cpu(*uV_offset);
45  min_uA = of_get_property(np, "regulator-min-microamp", NULL);
46  if (min_uA)
47  constraints->min_uA = be32_to_cpu(*min_uA);
48  max_uA = of_get_property(np, "regulator-max-microamp", NULL);
49  if (max_uA)
50  constraints->max_uA = be32_to_cpu(*max_uA);
51 
52  /* Current change possible? */
53  if (constraints->min_uA != constraints->max_uA)
55 
56  if (of_find_property(np, "regulator-boot-on", NULL))
57  constraints->boot_on = true;
58 
59  if (of_find_property(np, "regulator-always-on", NULL))
60  constraints->always_on = true;
61  else /* status change should be possible if not always on. */
63 
64  ramp_delay = of_get_property(np, "regulator-ramp-delay", NULL);
65  if (ramp_delay)
66  constraints->ramp_delay = be32_to_cpu(*ramp_delay);
67 }
68 
78  struct device_node *node)
79 {
80  struct regulator_init_data *init_data;
81 
82  if (!node)
83  return NULL;
84 
85  init_data = devm_kzalloc(dev, sizeof(*init_data), GFP_KERNEL);
86  if (!init_data)
87  return NULL; /* Out of memory? */
88 
89  of_get_regulation_constraints(node, &init_data);
90  return init_data;
91 }
93 
112  struct of_regulator_match *matches,
113  unsigned int num_matches)
114 {
115  unsigned int count = 0;
116  unsigned int i;
117  const char *name;
118  struct device_node *child;
119 
120  if (!dev || !node)
121  return -EINVAL;
122 
123  for_each_child_of_node(node, child) {
124  name = of_get_property(child,
125  "regulator-compatible", NULL);
126  if (!name)
127  name = child->name;
128  for (i = 0; i < num_matches; i++) {
129  struct of_regulator_match *match = &matches[i];
130  if (match->of_node)
131  continue;
132 
133  if (strcmp(match->name, name))
134  continue;
135 
136  match->init_data =
137  of_get_regulator_init_data(dev, child);
138  if (!match->init_data) {
139  dev_err(dev,
140  "failed to parse DT for regulator %s\n",
141  child->name);
142  return -EINVAL;
143  }
144  match->of_node = child;
145  count++;
146  break;
147  }
148  }
149 
150  return count;
151 }