2 * OF helpers for regulator framework
4 * Copyright (C) 2011 Texas Instruments, Inc.
5 * Rajendra Nayak <rnayak@ti.com>
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.
13 #include <linux/module.h>
14 #include <linux/slab.h>
16 #include <linux/regulator/machine.h>
17 #include <linux/regulator/of_regulator.h>
19 static void of_get_regulation_constraints(struct device_node
*np
,
20 struct regulator_init_data
**init_data
)
22 const __be32
*min_uV
, *max_uV
;
23 struct regulation_constraints
*constraints
= &(*init_data
)->constraints
;
27 constraints
->name
= of_get_property(np
, "regulator-name", NULL
);
29 min_uV
= of_get_property(np
, "regulator-min-microvolt", NULL
);
31 constraints
->min_uV
= be32_to_cpu(*min_uV
);
32 max_uV
= of_get_property(np
, "regulator-max-microvolt", NULL
);
34 constraints
->max_uV
= be32_to_cpu(*max_uV
);
36 /* Voltage change possible? */
37 if (constraints
->min_uV
!= constraints
->max_uV
)
38 constraints
->valid_ops_mask
|= REGULATOR_CHANGE_VOLTAGE
;
39 /* Only one voltage? Then make sure it's set. */
40 if (min_uV
&& max_uV
&& constraints
->min_uV
== constraints
->max_uV
)
41 constraints
->apply_uV
= true;
43 if (!of_property_read_u32(np
, "regulator-microvolt-offset", &pval
))
44 constraints
->uV_offset
= pval
;
45 if (!of_property_read_u32(np
, "regulator-min-microamp", &pval
))
46 constraints
->min_uA
= pval
;
47 if (!of_property_read_u32(np
, "regulator-max-microamp", &pval
))
48 constraints
->max_uA
= pval
;
50 /* Current change possible? */
51 if (constraints
->min_uA
!= constraints
->max_uA
)
52 constraints
->valid_ops_mask
|= REGULATOR_CHANGE_CURRENT
;
54 constraints
->boot_on
= of_property_read_bool(np
, "regulator-boot-on");
55 constraints
->always_on
= of_property_read_bool(np
, "regulator-always-on");
56 if (!constraints
->always_on
) /* status change should be possible. */
57 constraints
->valid_ops_mask
|= REGULATOR_CHANGE_STATUS
;
59 if (of_property_read_bool(np
, "regulator-allow-bypass"))
60 constraints
->valid_ops_mask
|= REGULATOR_CHANGE_BYPASS
;
62 ret
= of_property_read_u32(np
, "regulator-ramp-delay", &pval
);
65 constraints
->ramp_delay
= pval
;
67 constraints
->ramp_disable
= true;
70 ret
= of_property_read_u32(np
, "regulator-enable-ramp-delay", &pval
);
72 constraints
->enable_time
= pval
;
76 * of_get_regulator_init_data - extract regulator_init_data structure info
77 * @dev: device requesting for regulator_init_data
79 * Populates regulator_init_data structure by extracting data from device
80 * tree node, returns a pointer to the populated struture or NULL if memory
83 struct regulator_init_data
*of_get_regulator_init_data(struct device
*dev
,
84 struct device_node
*node
)
86 struct regulator_init_data
*init_data
;
91 init_data
= devm_kzalloc(dev
, sizeof(*init_data
), GFP_KERNEL
);
93 return NULL
; /* Out of memory? */
95 of_get_regulation_constraints(node
, &init_data
);
98 EXPORT_SYMBOL_GPL(of_get_regulator_init_data
);
100 struct devm_of_regulator_matches
{
101 struct of_regulator_match
*matches
;
102 unsigned int num_matches
;
105 static void devm_of_regulator_put_matches(struct device
*dev
, void *res
)
107 struct devm_of_regulator_matches
*devm_matches
= res
;
110 for (i
= 0; i
< devm_matches
->num_matches
; i
++)
111 of_node_put(devm_matches
->matches
[i
].of_node
);
115 * of_regulator_match - extract multiple regulator init data from device tree.
116 * @dev: device requesting the data
117 * @node: parent device node of the regulators
118 * @matches: match table for the regulators
119 * @num_matches: number of entries in match table
121 * This function uses a match table specified by the regulator driver to
122 * parse regulator init data from the device tree. @node is expected to
123 * contain a set of child nodes, each providing the init data for one
124 * regulator. The data parsed from a child node will be matched to a regulator
125 * based on either the deprecated property regulator-compatible if present,
126 * or otherwise the child node's name. Note that the match table is modified
127 * in place and an additional of_node reference is taken for each matched
130 * Returns the number of matches found or a negative error code on failure.
132 int of_regulator_match(struct device
*dev
, struct device_node
*node
,
133 struct of_regulator_match
*matches
,
134 unsigned int num_matches
)
136 unsigned int count
= 0;
139 struct device_node
*child
;
140 struct devm_of_regulator_matches
*devm_matches
;
145 devm_matches
= devres_alloc(devm_of_regulator_put_matches
,
146 sizeof(struct devm_of_regulator_matches
),
151 devm_matches
->matches
= matches
;
152 devm_matches
->num_matches
= num_matches
;
154 devres_add(dev
, devm_matches
);
156 for (i
= 0; i
< num_matches
; i
++) {
157 struct of_regulator_match
*match
= &matches
[i
];
158 match
->init_data
= NULL
;
159 match
->of_node
= NULL
;
162 for_each_child_of_node(node
, child
) {
163 name
= of_get_property(child
,
164 "regulator-compatible", NULL
);
167 for (i
= 0; i
< num_matches
; i
++) {
168 struct of_regulator_match
*match
= &matches
[i
];
172 if (strcmp(match
->name
, name
))
176 of_get_regulator_init_data(dev
, child
);
177 if (!match
->init_data
) {
179 "failed to parse DT for regulator %s\n",
183 match
->of_node
= of_node_get(child
);
191 EXPORT_SYMBOL_GPL(of_regulator_match
);