/** * 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; }
/** * 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; pctldev = get_pinctrl_dev_from_dev(NULL, dev_name); if (!pctldev) return -EINVAL; pin = pin_get_from_name(pctldev, name); if (pin < 0) return pin; return pin_config_set_for_pin(pctldev, pin, config); }
int pinconf_map_to_setting(struct pinctrl_map const *map, struct pinctrl_setting *setting) { struct pinctrl_dev *pctldev = setting->pctldev; int pin; switch (setting->type) { case PIN_MAP_TYPE_CONFIGS_PIN: pin = pin_get_from_name(pctldev, map->data.configs.group_or_pin); if (pin < 0) { dev_err(pctldev->dev, "could not map pin config for \"%s\"", map->data.configs.group_or_pin); return pin; } setting->data.configs.group_or_pin = pin; break; case PIN_MAP_TYPE_CONFIGS_GROUP: pin = pinctrl_get_group_selector(pctldev, map->data.configs.group_or_pin); if (pin < 0) { dev_err(pctldev->dev, "could not map group config for \"%s\"", map->data.configs.group_or_pin); return pin; } setting->data.configs.group_or_pin = pin; break; default: return -EINVAL; } setting->data.configs.num_configs = map->data.configs.num_configs; setting->data.configs.configs = map->data.configs.configs; return 0; }
/** * 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; }