Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 165371
b: refs/heads/master
c: 40f9244
h: refs/heads/master
i:
  165369: 7bcad17
  165367: 643c760
v: v3
  • Loading branch information
Mark Brown authored and Liam Girdwood committed Sep 22, 2009
1 parent 2c7955f commit 3ab31c7
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 16 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a5d2abce4373810c0109c5939c0094ac16698625
refs/heads/master: 40f9244f4da8976eeb6d5ed6313c635ba238a9d3
62 changes: 48 additions & 14 deletions trunk/drivers/regulator/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ static int has_full_constraints;
*/
struct regulator_map {
struct list_head list;
struct device *dev;
const char *dev_name; /* The dev_name() for the consumer */
const char *supply;
struct regulator_dev *regulator;
};
Expand Down Expand Up @@ -857,23 +857,33 @@ static int set_supply(struct regulator_dev *rdev,
* set_consumer_device_supply: Bind a regulator to a symbolic supply
* @rdev: regulator source
* @consumer_dev: device the supply applies to
* @consumer_dev_name: dev_name() string for device supply applies to
* @supply: symbolic name for supply
*
* Allows platform initialisation code to map physical regulator
* sources to symbolic names for supplies for use by devices. Devices
* should use these symbolic names to request regulators, avoiding the
* need to provide board-specific regulator names as platform data.
*
* Only one of consumer_dev and consumer_dev_name may be specified.
*/
static int set_consumer_device_supply(struct regulator_dev *rdev,
struct device *consumer_dev, const char *supply)
struct device *consumer_dev, const char *consumer_dev_name,
const char *supply)
{
struct regulator_map *node;

if (consumer_dev && consumer_dev_name)
return -EINVAL;

if (!consumer_dev_name && consumer_dev)
consumer_dev_name = dev_name(consumer_dev);

if (supply == NULL)
return -EINVAL;

list_for_each_entry(node, &regulator_map_list, list) {
if (consumer_dev != node->dev)
if (consumer_dev_name != node->dev_name)
continue;
if (strcmp(node->supply, supply) != 0)
continue;
Expand All @@ -891,25 +901,38 @@ static int set_consumer_device_supply(struct regulator_dev *rdev,
return -ENOMEM;

node->regulator = rdev;
node->dev = consumer_dev;
node->dev_name = kstrdup(consumer_dev_name, GFP_KERNEL);
node->supply = supply;

if (node->dev_name == NULL) {
kfree(node);
return -ENOMEM;
}

list_add(&node->list, &regulator_map_list);
return 0;
}

static void unset_consumer_device_supply(struct regulator_dev *rdev,
struct device *consumer_dev)
const char *consumer_dev_name, struct device *consumer_dev)
{
struct regulator_map *node, *n;

if (consumer_dev && !consumer_dev_name)
consumer_dev_name = dev_name(consumer_dev);

list_for_each_entry_safe(node, n, &regulator_map_list, list) {
if (rdev == node->regulator &&
consumer_dev == node->dev) {
list_del(&node->list);
kfree(node);
return;
}
if (rdev != node->regulator)
continue;

if (consumer_dev_name && node->dev_name &&
strcmp(consumer_dev_name, node->dev_name))
continue;

list_del(&node->list);
kfree(node->dev_name);
kfree(node);
return;
}
}

Expand All @@ -920,6 +943,7 @@ static void unset_regulator_supplies(struct regulator_dev *rdev)
list_for_each_entry_safe(node, n, &regulator_map_list, list) {
if (rdev == node->regulator) {
list_del(&node->list);
kfree(node->dev_name);
kfree(node);
return;
}
Expand Down Expand Up @@ -1019,17 +1043,25 @@ struct regulator *regulator_get(struct device *dev, const char *id)
struct regulator_dev *rdev;
struct regulator_map *map;
struct regulator *regulator = ERR_PTR(-ENODEV);
const char *devname = NULL;

if (id == NULL) {
printk(KERN_ERR "regulator: get() with no identifier\n");
return regulator;
}

if (dev)
devname = dev_name(dev);

mutex_lock(&regulator_list_mutex);

list_for_each_entry(map, &regulator_map_list, list) {
if (dev == map->dev &&
strcmp(map->supply, id) == 0) {
/* If the mapping has a device set up it must match */
if (map->dev_name &&
(!devname || strcmp(map->dev_name, devname)))
continue;

if (strcmp(map->supply, id) == 0) {
rdev = map->regulator;
goto found;
}
Expand Down Expand Up @@ -2091,11 +2123,13 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,
for (i = 0; i < init_data->num_consumer_supplies; i++) {
ret = set_consumer_device_supply(rdev,
init_data->consumer_supplies[i].dev,
init_data->consumer_supplies[i].dev_name,
init_data->consumer_supplies[i].supply);
if (ret < 0) {
for (--i; i >= 0; i--)
unset_consumer_device_supply(rdev,
init_data->consumer_supplies[i].dev);
init_data->consumer_supplies[i].dev_name,
init_data->consumer_supplies[i].dev);
goto scrub;
}
}
Expand Down
7 changes: 6 additions & 1 deletion trunk/include/linux/regulator/machine.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,13 +126,18 @@ struct regulation_constraints {
/**
* struct regulator_consumer_supply - supply -> device mapping
*
* This maps a supply name to a device.
* This maps a supply name to a device. Only one of dev or dev_name
* can be specified. Use of dev_name allows support for buses which
* make struct device available late such as I2C and is the preferred
* form.
*
* @dev: Device structure for the consumer.
* @dev_name: Result of dev_name() for the consumer.
* @supply: Name for the supply.
*/
struct regulator_consumer_supply {
struct device *dev; /* consumer */
const char *dev_name; /* dev_name() for consumer */
const char *supply; /* consumer supply - e.g. "vcc" */
};

Expand Down

0 comments on commit 3ab31c7

Please sign in to comment.