|
@@ -314,14 +314,11 @@ int pinmux_map_to_setting(struct pinctrl_map const *map,
|
|
|
{
|
|
|
struct pinctrl_dev *pctldev = setting->pctldev;
|
|
|
const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
|
|
|
- const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
|
|
|
char const * const *groups;
|
|
|
unsigned num_groups;
|
|
|
int ret;
|
|
|
const char *group;
|
|
|
int i;
|
|
|
- const unsigned *pins;
|
|
|
- unsigned num_pins;
|
|
|
|
|
|
if (!pmxops) {
|
|
|
dev_err(pctldev->dev, "does not support mux function\n");
|
|
@@ -376,53 +373,12 @@ int pinmux_map_to_setting(struct pinctrl_map const *map,
|
|
|
}
|
|
|
setting->data.mux.group = ret;
|
|
|
|
|
|
- ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, &pins,
|
|
|
- &num_pins);
|
|
|
- if (ret) {
|
|
|
- dev_err(pctldev->dev,
|
|
|
- "could not get pins for device %s group selector %d\n",
|
|
|
- pinctrl_dev_get_name(pctldev), setting->data.mux.group);
|
|
|
- return -ENODEV;
|
|
|
- }
|
|
|
-
|
|
|
- /* Try to allocate all pins in this group, one by one */
|
|
|
- for (i = 0; i < num_pins; i++) {
|
|
|
- ret = pin_request(pctldev, pins[i], map->dev_name, NULL);
|
|
|
- if (ret) {
|
|
|
- dev_err(pctldev->dev,
|
|
|
- "could not request pin %d on device %s\n",
|
|
|
- pins[i], pinctrl_dev_get_name(pctldev));
|
|
|
- /* On error release all taken pins */
|
|
|
- i--; /* this pin just failed */
|
|
|
- for (; i >= 0; i--)
|
|
|
- pin_free(pctldev, pins[i], NULL);
|
|
|
- return -ENODEV;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
void pinmux_free_setting(struct pinctrl_setting const *setting)
|
|
|
{
|
|
|
- struct pinctrl_dev *pctldev = setting->pctldev;
|
|
|
- const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
|
|
|
- const unsigned *pins;
|
|
|
- unsigned num_pins;
|
|
|
- int ret;
|
|
|
- int i;
|
|
|
-
|
|
|
- ret = pctlops->get_group_pins(pctldev, setting->data.mux.group,
|
|
|
- &pins, &num_pins);
|
|
|
- if (ret) {
|
|
|
- dev_err(pctldev->dev,
|
|
|
- "could not get pins for device %s group selector %d\n",
|
|
|
- pinctrl_dev_get_name(pctldev), setting->data.mux.group);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- for (i = 0; i < num_pins; i++)
|
|
|
- pin_free(pctldev, pins[i], NULL);
|
|
|
+ /* This function is currently unused */
|
|
|
}
|
|
|
|
|
|
int pinmux_enable_setting(struct pinctrl_setting const *setting)
|
|
@@ -446,6 +402,22 @@ int pinmux_enable_setting(struct pinctrl_setting const *setting)
|
|
|
num_pins = 0;
|
|
|
}
|
|
|
|
|
|
+ /* Try to allocate all pins in this group, one by one */
|
|
|
+ for (i = 0; i < num_pins; i++) {
|
|
|
+ ret = pin_request(pctldev, pins[i], setting->dev_name, NULL);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(pctldev->dev,
|
|
|
+ "could not request pin %d on device %s\n",
|
|
|
+ pins[i], pinctrl_dev_get_name(pctldev));
|
|
|
+ /* On error release all taken pins */
|
|
|
+ i--; /* this pin just failed */
|
|
|
+ for (; i >= 0; i--)
|
|
|
+ pin_free(pctldev, pins[i], NULL);
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Now that we have acquired the pins, encode the mux setting */
|
|
|
for (i = 0; i < num_pins; i++) {
|
|
|
desc = pin_desc_get(pctldev, pins[i]);
|
|
|
if (desc == NULL) {
|
|
@@ -482,6 +454,7 @@ void pinmux_disable_setting(struct pinctrl_setting const *setting)
|
|
|
num_pins = 0;
|
|
|
}
|
|
|
|
|
|
+ /* Flag the descs that no setting is active */
|
|
|
for (i = 0; i < num_pins; i++) {
|
|
|
desc = pin_desc_get(pctldev, pins[i]);
|
|
|
if (desc == NULL) {
|
|
@@ -493,6 +466,10 @@ void pinmux_disable_setting(struct pinctrl_setting const *setting)
|
|
|
desc->mux_setting = NULL;
|
|
|
}
|
|
|
|
|
|
+ /* And release the pins */
|
|
|
+ for (i = 0; i < num_pins; i++)
|
|
|
+ pin_free(pctldev, pins[i], NULL);
|
|
|
+
|
|
|
if (ops->disable)
|
|
|
ops->disable(pctldev, setting->data.mux.func, setting->data.mux.group);
|
|
|
}
|