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>
18 static void of_get_regulation_constraints(struct device_node
*np
,
19 struct regulator_init_data
**init_data
)
21 const __be32
*min_uV
, *max_uV
, *uV_offset
;
22 const __be32
*min_uA
, *max_uA
;
23 struct regulation_constraints
*constraints
= &(*init_data
)->constraints
;
25 constraints
->name
= of_get_property(np
, "regulator-name", NULL
);
27 min_uV
= of_get_property(np
, "regulator-min-microvolt", NULL
);
29 constraints
->min_uV
= be32_to_cpu(*min_uV
);
30 max_uV
= of_get_property(np
, "regulator-max-microvolt", NULL
);
32 constraints
->max_uV
= be32_to_cpu(*max_uV
);
34 /* Voltage change possible? */
35 if (constraints
->min_uV
!= constraints
->max_uV
)
36 constraints
->valid_ops_mask
|= REGULATOR_CHANGE_VOLTAGE
;
37 /* Only one voltage? Then make sure it's set. */
38 if (min_uV
&& max_uV
&& constraints
->min_uV
== constraints
->max_uV
)
39 constraints
->apply_uV
= true;
41 uV_offset
= of_get_property(np
, "regulator-microvolt-offset", NULL
);
43 constraints
->uV_offset
= be32_to_cpu(*uV_offset
);
44 min_uA
= of_get_property(np
, "regulator-min-microamp", NULL
);
46 constraints
->min_uA
= be32_to_cpu(*min_uA
);
47 max_uA
= of_get_property(np
, "regulator-max-microamp", NULL
);
49 constraints
->max_uA
= be32_to_cpu(*max_uA
);
51 /* Current change possible? */
52 if (constraints
->min_uA
!= constraints
->max_uA
)
53 constraints
->valid_ops_mask
|= REGULATOR_CHANGE_CURRENT
;
55 if (of_find_property(np
, "regulator-boot-on", NULL
))
56 constraints
->boot_on
= true;
58 if (of_find_property(np
, "regulator-always-on", NULL
))
59 constraints
->always_on
= true;
60 else /* status change should be possible if not always on. */
61 constraints
->valid_ops_mask
|= REGULATOR_CHANGE_STATUS
;
65 * of_get_regulator_init_data - extract regulator_init_data structure info
66 * @dev: device requesting for regulator_init_data
68 * Populates regulator_init_data structure by extracting data from device
69 * tree node, returns a pointer to the populated struture or NULL if memory
72 struct regulator_init_data
*of_get_regulator_init_data(struct device
*dev
,
73 struct device_node
*node
)
75 struct regulator_init_data
*init_data
;
80 init_data
= devm_kzalloc(dev
, sizeof(*init_data
), GFP_KERNEL
);
82 return NULL
; /* Out of memory? */
84 of_get_regulation_constraints(node
, &init_data
);
87 EXPORT_SYMBOL_GPL(of_get_regulator_init_data
);