Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 294078
b: refs/heads/master
c: 1681f5a
h: refs/heads/master
v: v3
  • Loading branch information
Stephen Warren authored and Linus Walleij committed Feb 24, 2012
1 parent ce22544 commit 1ea1e11
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 69 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: f7b9006f4598dd252dca5225f3cf88179c36276f
refs/heads/master: 1681f5ae4ca25bddb6f7b6d4f463cc83e3d1ad01
15 changes: 5 additions & 10 deletions trunk/Documentation/pinctrl.txt
Original file line number Diff line number Diff line change
Expand Up @@ -494,14 +494,10 @@ Definitions:
{"map-i2c0", i2c0, pinctrl0, fi2c0, gi2c0}
}

Every map must be assigned a symbolic name, pin controller and function.
The group is not compulsory - if it is omitted the first group presented by
the driver as applicable for the function will be selected, which is
useful for simple cases.

The device name is present in map entries tied to specific devices. Maps
without device names are referred to as SYSTEM pinmuxes, such as can be taken
by the machine implementation on boot and not tied to any specific device.
Every map must be assigned a state name, pin controller, device and
function. The group is not compulsory - if it is omitted the first group
presented by the driver as applicable for the function will be selected,
which is useful for simple cases.

It is possible to map several groups to the same combination of device,
pin controller and function. This is for cases where a certain function on
Expand Down Expand Up @@ -983,8 +979,7 @@ after this you should be able to see this in the debugfs listing of all pins.
System pin control hogging
==========================

A system pin control map entry, i.e. a pin control setting that does not have
a device associated with it, can be hogged by the core when the pin controller
Pin control map entries can be hogged by the core when the pin controller
is registered. This means that the core will attempt to call pinctrl_get() and
pinctrl_enable() on it immediately after the pin control device has been
registered.
Expand Down
73 changes: 22 additions & 51 deletions trunk/drivers/pinctrl/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -479,24 +479,21 @@ EXPORT_SYMBOL_GPL(pinctrl_gpio_direction_output);
static struct pinctrl *pinctrl_get_locked(struct device *dev, const char *name)
{
struct pinctrl_dev *pctldev = NULL;
const char *devname = NULL;
const char *devname;
struct pinctrl *p;
bool found_map;
unsigned num_maps = 0;
int ret = -ENODEV;
struct pinctrl_maps *maps_node;
int i;
struct pinctrl_map const *map;

/* We must have dev or ID or both */
if (!dev && !name)
/* We must have a dev name */
if (WARN_ON(!dev))
return ERR_PTR(-EINVAL);

if (dev)
devname = dev_name(dev);
devname = dev_name(dev);

pr_debug("get pin control handle %s for device %s\n", name,
devname ? devname : "(none)");
pr_debug("get pin control handle device %s state %s\n", devname, name);

/*
* create the state cookie holder struct pinctrl for each
Expand All @@ -511,8 +508,6 @@ static struct pinctrl *pinctrl_get_locked(struct device *dev, const char *name)

/* Iterate over the pin control maps to locate the right ones */
for_each_maps(maps_node, i, map) {
found_map = false;

/*
* First, try to find the pctldev given in the map
*/
Expand All @@ -529,6 +524,10 @@ static struct pinctrl *pinctrl_get_locked(struct device *dev, const char *name)
pr_debug("in map, found pctldev %s to handle function %s",
dev_name(pctldev->dev), map->function);

/* Map must be for this device */
if (strcmp(map->dev_name, devname))
continue;

/*
* If we're looking for a specific named map, this must match,
* else we loop and look for the next.
Expand All @@ -540,30 +539,12 @@ static struct pinctrl *pinctrl_get_locked(struct device *dev, const char *name)
continue;
}

/*
* This is for the case where no device name is given, we
* already know that the function name matches from above
* code.
*/
if (!map->dev_name && (name != NULL))
found_map = true;

/* If the mapping has a device set up it must match */
if (map->dev_name &&
(!devname || !strcmp(map->dev_name, devname)))
/* MATCH! */
found_map = true;

/* If this map is applicable, then apply it */
if (found_map) {
ret = pinmux_apply_muxmap(pctldev, p, dev,
devname, map);
if (ret) {
kfree(p);
return ERR_PTR(ret);
}
num_maps++;
ret = pinmux_apply_muxmap(pctldev, p, dev, devname, map);
if (ret) {
kfree(p);
return ERR_PTR(ret);
}
num_maps++;
}

/*
Expand All @@ -578,9 +559,7 @@ static struct pinctrl *pinctrl_get_locked(struct device *dev, const char *name)
dev_info(dev, "zero maps found for mapping %s\n", name);

pr_debug("found %u mux maps for device %s, UD %s\n",
num_maps,
devname ? devname : "(anonymous)",
name ? name : "(undefined)");
num_maps, devname, name ? name : "(undefined)");

/* Add the pinmux to the global list */
mutex_lock(&pinctrl_list_mutex);
Expand Down Expand Up @@ -707,14 +686,11 @@ int pinctrl_register_mappings(struct pinctrl_map const *maps,
return -EINVAL;
}

if (!maps[i].dev_name)
pr_debug("add system map %s function %s with no device\n",
maps[i].name,
maps[i].function);
else
pr_debug("register map %s, function %s\n",
maps[i].name,
maps[i].function);
if (!maps[i].dev_name) {
pr_err("failed to register map %s (%d): no device given\n",
maps[i].name, i);
return -EINVAL;
}
}

maps_node = kzalloc(sizeof(*maps_node), GFP_KERNEL);
Expand Down Expand Up @@ -938,13 +914,8 @@ static int pinctrl_maps_show(struct seq_file *s, void *what)
mutex_lock(&pinctrl_maps_mutex);
for_each_maps(maps_node, i, map) {
seq_printf(s, "%s:\n", map->name);
if (map->dev_name)
seq_printf(s, " device: %s\n",
map->dev_name);
else
seq_printf(s, " SYSTEM MUX\n");
seq_printf(s, " controlling device %s\n",
map->ctrl_dev_name);
seq_printf(s, " device: %s\n", map->dev_name);
seq_printf(s, " controlling device %s\n", map->ctrl_dev_name);
seq_printf(s, " function: %s\n", map->function);
seq_printf(s, " group: %s\n", map->group ? map->group :
"(default)");
Expand Down
7 changes: 0 additions & 7 deletions trunk/include/linux/pinctrl/machine.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,6 @@ struct pinctrl_map {
#define PIN_MAP(a, b, c, d) \
{ .name = a, .ctrl_dev_name = b, .function = c, .dev_name = d }

/*
* Convenience macro to map a system function onto a certain pinctrl device.
* System functions are not assigned to a particular device.
*/
#define PIN_MAP_SYS(a, b, c) \
{ .name = a, .ctrl_dev_name = b, .function = c }

/*
* Convenience macro to map a system function onto a certain pinctrl device,
* to be hogged by the pin control core until the system shuts down.
Expand Down

0 comments on commit 1ea1e11

Please sign in to comment.