/**
 * pinmux_request_gpio() - request pinmuxing for a GPIO pin
 * @pctldev: pin controller device affected
 * @pin: the pin to mux in for GPIO
 * @range: the applicable GPIO range
 */
int pinmux_request_gpio(struct pinctrl_dev *pctldev,
                        struct pinctrl_gpio_range *range,
                        unsigned pin, unsigned gpio)
{
    const char *owner;
    int ret;

    /* Conjure some name stating what chip and pin this is taken by */
    owner = kasprintf(GFP_KERNEL, "%s:%d", range->name, gpio);
    if (!owner)
        return -EINVAL;

    ret = pin_request(pctldev, pin, owner, range);
    if (ret < 0)
        kfree(owner);

    return ret;
}
int pinmux_request_gpio(struct pinctrl_dev *pctldev,
			struct pinctrl_gpio_range *range,
			unsigned pin, unsigned gpio)
{
	const char *owner;
	int ret;

	
	owner = kasprintf(GFP_KERNEL, "%s:%d", range->name, gpio);
	if (!owner)
		return -EINVAL;

	ret = pin_request(pctldev, pin, owner, range);
	if (ret < 0)
		kfree(owner);

	return ret;
}
int pinmux_enable_setting(struct pinctrl_setting const *setting)
{
    struct pinctrl_dev *pctldev = setting->pctldev;
    const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
    const struct pinmux_ops *ops = pctldev->desc->pmxops;
    int ret;
    const unsigned *pins;
    unsigned num_pins;
    int i;
    struct pin_desc *desc;

    ret = pctlops->get_group_pins(pctldev, setting->data.mux.group,
                                  &pins, &num_pins);
    if (ret) {
        /* errors only affect debug data, so just warn */
        dev_warn(pctldev->dev,
                 "could not get pins for group selector %d\n",
                 setting->data.mux.group);
        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));
            goto err_pin_request;
        }
    }

    /* 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) {
            dev_warn(pctldev->dev,
                     "could not get pin desc for pin %d\n",
                     pins[i]);
            continue;
        }
        desc->mux_setting = &(setting->data.mux);
    }

    ret = ops->enable(pctldev, setting->data.mux.func,
                      setting->data.mux.group);

    if (ret)
        goto err_enable;

    return 0;

err_enable:
    for (i = 0; i < num_pins; i++) {
        desc = pin_desc_get(pctldev, pins[i]);
        if (desc)
            desc->mux_setting = NULL;
    }
err_pin_request:
    /* On error release all taken pins */
    while (--i >= 0)
        pin_free(pctldev, pins[i], NULL);

    return ret;
}
int pinmux_enable_setting(struct pinctrl_setting const *setting)
{
	struct pinctrl_dev *pctldev = setting->pctldev;
	const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
	const struct pinmux_ops *ops = pctldev->desc->pmxops;
	int ret;
	const unsigned *pins;
	unsigned num_pins;
	int i;
	struct pin_desc *desc;

	ret = pctlops->get_group_pins(pctldev, setting->data.mux.group,
				      &pins, &num_pins);
	if (ret) {
		
		dev_warn(pctldev->dev,
			 "could not get pins for group selector %d\n",
			 setting->data.mux.group);
		num_pins = 0;
	}

	
	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));
			goto err_pin_request;
		}
	}

	
	for (i = 0; i < num_pins; i++) {
		desc = pin_desc_get(pctldev, pins[i]);
		if (desc == NULL) {
			dev_warn(pctldev->dev,
				 "could not get pin desc for pin %d\n",
				 pins[i]);
			continue;
		}
		desc->mux_setting = &(setting->data.mux);
	}

	ret = ops->enable(pctldev, setting->data.mux.func,
			  setting->data.mux.group);

	if (ret)
		goto err_enable;

	return 0;

err_enable:
	for (i = 0; i < num_pins; i++) {
		desc = pin_desc_get(pctldev, pins[i]);
		if (desc)
			desc->mux_setting = NULL;
	}
err_pin_request:
	
	while (--i >= 0)
		pin_free(pctldev, pins[i], NULL);

	return ret;
}