void pinconf_show_map(struct seq_file *s, struct pinctrl_map const *map) { struct pinctrl_dev *pctldev; const struct pinconf_ops *confops; int i; pctldev = get_pinctrl_dev_from_devname(map->ctrl_dev_name); if (pctldev) confops = pctldev->desc->confops; else confops = NULL; switch (map->type) { case PIN_MAP_TYPE_CONFIGS_PIN: seq_printf(s, "pin "); break; case PIN_MAP_TYPE_CONFIGS_GROUP: seq_printf(s, "group "); break; default: break; } seq_printf(s, "%s\n", map->data.configs.group_or_pin); for (i = 0; i < map->data.configs.num_configs; i++) { seq_printf(s, "config "); if (confops && confops->pin_config_config_dbg_show) confops->pin_config_config_dbg_show(pctldev, s, map->data.configs.configs[i]); else seq_printf(s, "%08lx", map->data.configs.configs[i]); seq_printf(s, "\n"); } }
/** * pin_config_set() - set the configuration of a single pin parameter * @dev_name: name of pin controller device for this pin * @name: name of the pin to set the config for * @config: the config in this argument will contain the desired pin state, it * can be used directly by drivers as a numeral, or it can be dereferenced * to any struct. */ int pin_config_set(const char *dev_name, const char *name, unsigned long config) { struct pinctrl_dev *pctldev; int pin, ret; mutex_lock(&pinctrl_mutex); pctldev = get_pinctrl_dev_from_devname(dev_name); if (!pctldev) { ret = -EINVAL; goto unlock; } pin = pin_get_from_name(pctldev, name); if (pin < 0) { ret = pin; goto unlock; } ret = pin_config_set_for_pin(pctldev, pin, config); unlock: mutex_unlock(&pinctrl_mutex); return ret; }
void pinconf_show_map(struct seq_file *s, struct pinctrl_map const *map) { struct pinctrl_dev *pctldev; pctldev = get_pinctrl_dev_from_devname(map->ctrl_dev_name); switch (map->type) { case PIN_MAP_TYPE_CONFIGS_PIN: seq_printf(s, "pin "); break; case PIN_MAP_TYPE_CONFIGS_GROUP: seq_printf(s, "group "); break; default: break; } seq_printf(s, "%s\n", map->data.configs.group_or_pin); pinconf_show_config(s, pctldev, map->data.configs.configs, map->data.configs.num_configs); }
int pin_config_group_get(const char *dev_name, const char *pin_group, unsigned long *config) { struct pinctrl_dev *pctldev; const struct pinconf_ops *ops; int selector, ret; pctldev = get_pinctrl_dev_from_devname(dev_name); if (!pctldev) { ret = -EINVAL; return ret; } mutex_lock(&pctldev->mutex); ops = pctldev->desc->confops; if (!ops || !ops->pin_config_group_get) { dev_dbg(pctldev->dev, "cannot get configuration for pin " "group, missing group config get function in " "driver\n"); ret = -ENOTSUPP; goto unlock; } selector = pinctrl_get_group_selector(pctldev, pin_group); if (selector < 0) { ret = selector; goto unlock; } ret = ops->pin_config_group_get(pctldev, selector, config); unlock: mutex_unlock(&pctldev->mutex); return ret; }
/** * pin_config_get() - get the configuration of a single pin parameter * @dev_name: name of the pin controller device for this pin * @name: name of the pin to get the config for * @config: the config pointed to by this argument will be filled in with the * current pin state, it can be used directly by drivers as a numeral, or * it can be dereferenced to any struct. */ int pin_config_get(const char *dev_name, const char *name, unsigned long *config) { struct pinctrl_dev *pctldev; int pin; pctldev = get_pinctrl_dev_from_devname(dev_name); if (!pctldev) { pin = -EINVAL; return pin; } mutex_lock(&pctldev->mutex); pin = pin_get_from_name(pctldev, name); if (pin < 0) goto unlock; pin = pin_config_get_for_pin(pctldev, pin, config); unlock: mutex_unlock(&pctldev->mutex); return pin; }
int pin_config_group_set(const char *dev_name, const char *pin_group, unsigned long config) { struct pinctrl_dev *pctldev; const struct pinconf_ops *ops; const struct pinctrl_ops *pctlops; int selector; const unsigned *pins; unsigned num_pins; int ret; int i; mutex_lock(&pinctrl_mutex); pctldev = get_pinctrl_dev_from_devname(dev_name); if (!pctldev) { ret = -EINVAL; goto unlock; } ops = pctldev->desc->confops; pctlops = pctldev->desc->pctlops; if (!ops || (!ops->pin_config_group_set && !ops->pin_config_set)) { dev_err(pctldev->dev, "cannot configure pin group, missing " "config function in driver\n"); ret = -EINVAL; goto unlock; } selector = pinctrl_get_group_selector(pctldev, pin_group); if (selector < 0) { ret = selector; goto unlock; } ret = pctlops->get_group_pins(pctldev, selector, &pins, &num_pins); if (ret) { dev_err(pctldev->dev, "cannot configure pin group, error " "getting pins\n"); goto unlock; } /* * If the pin controller supports handling entire groups we use that * capability. */ if (ops->pin_config_group_set) { ret = ops->pin_config_group_set(pctldev, selector, config); /* * If the pin controller prefer that a certain group be handled * pin-by-pin as well, it returns -EAGAIN. */ if (ret != -EAGAIN) goto unlock; } /* * If the controller cannot handle entire groups, we configure each pin * individually. */ if (!ops->pin_config_set) { ret = 0; goto unlock; } for (i = 0; i < num_pins; i++) { ret = ops->pin_config_set(pctldev, pins[i], config); if (ret < 0) goto unlock; } ret = 0; unlock: mutex_unlock(&pinctrl_mutex); return ret; }