static int sh_gpio_request(struct gpio_chip *chip, unsigned offset) { struct pinmux_info *gpioc = chip_to_pinmux(chip); struct pinmux_data_reg *dummy; unsigned long flags; int i, ret, pinmux_type; ret = -EINVAL; if (!gpioc) goto err_out; spin_lock_irqsave(&gpio_lock, flags); if ((gpioc->gpios[offset].flags & PINMUX_FLAG_TYPE) != PINMUX_TYPE_NONE) goto err_unlock; /* setup pin function here if no data is associated with pin */ if (get_data_reg(gpioc, offset, &dummy, &i) != 0) pinmux_type = PINMUX_TYPE_FUNCTION; else pinmux_type = PINMUX_TYPE_GPIO; if (pinmux_type == PINMUX_TYPE_FUNCTION) { if (pinmux_config_gpio(gpioc, offset, pinmux_type, GPIO_CFG_DRYRUN) != 0) goto err_unlock; if (pinmux_config_gpio(gpioc, offset, pinmux_type, GPIO_CFG_REQ) != 0) BUG(); } gpioc->gpios[offset].flags &= ~PINMUX_FLAG_TYPE; gpioc->gpios[offset].flags |= pinmux_type; ret = 0; err_unlock: spin_unlock_irqrestore(&gpio_lock, flags); err_out: return ret; }
int __gpio_request(unsigned gpio) { struct pinmux_info *gpioc = gpio_controller(gpio); struct pinmux_data_reg *dummy; unsigned long flags; int i, ret, pinmux_type; ret = -EINVAL; if (!gpioc) goto err_out; spin_lock_irqsave(&gpio_lock, flags); if ((gpioc->gpios[gpio].flags & PINMUX_FLAG_TYPE) != PINMUX_TYPE_NONE) goto err_unlock; /* setup pin function here if no data is associated with pin */ if (get_data_reg(gpioc, gpio, &dummy, &i) != 0) pinmux_type = PINMUX_TYPE_FUNCTION; else pinmux_type = PINMUX_TYPE_GPIO; if (pinmux_type == PINMUX_TYPE_FUNCTION) { if (pinmux_config_gpio(gpioc, gpio, pinmux_type, GPIO_CFG_DRYRUN) != 0) goto err_unlock; if (pinmux_config_gpio(gpioc, gpio, pinmux_type, GPIO_CFG_REQ) != 0) BUG(); } gpioc->gpios[gpio].flags = pinmux_type; ret = 0; err_unlock: spin_unlock_irqrestore(&gpio_lock, flags); err_out: return ret; }
static int pinmux_direction(struct pinmux_info *gpioc, unsigned gpio, int new_pinmux_type) { int pinmux_type; int ret = -EINVAL; if (!gpioc) goto err_out; pinmux_type = gpioc->gpios[gpio].flags & PINMUX_FLAG_TYPE; switch (pinmux_type) { case PINMUX_TYPE_GPIO: break; case PINMUX_TYPE_OUTPUT: case PINMUX_TYPE_INPUT: case PINMUX_TYPE_INPUT_PULLUP: case PINMUX_TYPE_INPUT_PULLDOWN: pinmux_config_gpio(gpioc, gpio, pinmux_type, GPIO_CFG_FREE); break; default: goto err_out; } if (pinmux_config_gpio(gpioc, gpio, new_pinmux_type, GPIO_CFG_DRYRUN) != 0) goto err_out; if (pinmux_config_gpio(gpioc, gpio, new_pinmux_type, GPIO_CFG_REQ) != 0) BUG(); gpioc->gpios[gpio].flags &= ~PINMUX_FLAG_TYPE; gpioc->gpios[gpio].flags |= new_pinmux_type; ret = 0; err_out: return ret; }
static void sh_gpio_free(unsigned offset) { int pinmux_type; if (!gpioc) return; pinmux_type = gpioc->gpios[offset].flags & PINMUX_FLAG_TYPE; pinmux_config_gpio(gpioc, offset, pinmux_type, GPIO_CFG_FREE); gpioc->gpios[offset].flags &= ~PINMUX_FLAG_TYPE; gpioc->gpios[offset].flags |= PINMUX_TYPE_NONE; }
static int sh_gpio_request(unsigned offset) { struct pinmux_data_reg *dummy; int i, ret, pinmux_type; ret = -1; if (!gpioc) goto err_out; if ((gpioc->gpios[offset].flags & PINMUX_FLAG_TYPE) != PINMUX_TYPE_NONE) goto err_out; /* setup pin function here if no data is associated with pin */ if (get_data_reg(gpioc, offset, &dummy, &i) != 0) pinmux_type = PINMUX_TYPE_FUNCTION; else pinmux_type = PINMUX_TYPE_GPIO; if (pinmux_type == PINMUX_TYPE_FUNCTION) { if (pinmux_config_gpio(gpioc, offset, pinmux_type, GPIO_CFG_DRYRUN) != 0) goto err_out; if (pinmux_config_gpio(gpioc, offset, pinmux_type, GPIO_CFG_REQ) != 0) BUG(); } gpioc->gpios[offset].flags &= ~PINMUX_FLAG_TYPE; gpioc->gpios[offset].flags |= pinmux_type; ret = 0; err_out: return ret; }
void gpio_free(unsigned gpio) { struct pinmux_info *gpioc = gpio_controller(gpio); unsigned long flags; int pinmux_type; if (!gpioc) return; spin_lock_irqsave(&gpio_lock, flags); pinmux_type = gpioc->gpios[gpio].flags & PINMUX_FLAG_TYPE; pinmux_config_gpio(gpioc, gpio, pinmux_type, GPIO_CFG_FREE); gpioc->gpios[gpio].flags = PINMUX_TYPE_NONE; spin_unlock_irqrestore(&gpio_lock, flags); }
static void sh_gpio_free(struct gpio_chip *chip, unsigned offset) { struct pinmux_info *gpioc = chip_to_pinmux(chip); unsigned long flags; int pinmux_type; if (!gpioc) return; spin_lock_irqsave(&gpio_lock, flags); pinmux_type = gpioc->gpios[offset].flags & PINMUX_FLAG_TYPE; pinmux_config_gpio(gpioc, offset, pinmux_type, GPIO_CFG_FREE); gpioc->gpios[offset].flags &= ~PINMUX_FLAG_TYPE; gpioc->gpios[offset].flags |= PINMUX_TYPE_NONE; spin_unlock_irqrestore(&gpio_lock, flags); }