static int sh_gpio_get_value(struct pinmux_info *gpioc, unsigned gpio) { struct pinmux_data_reg *dr = NULL; int bit = 0; if (!gpioc || get_data_reg(gpioc, gpio, &dr, &bit) != 0) return -1; return gpio_read_bit(dr, bit); }
static void sh_gpio_set_value(struct pinmux_info *gpioc, unsigned gpio, int value) { struct pinmux_data_reg *dr = NULL; int bit = 0; if (!gpioc || get_data_reg(gpioc, gpio, &dr, &bit) != 0) BUG(); else gpio_write_bit(dr, bit, value); }
static int sh_gpio_get_value(struct pinmux_info *gpioc, unsigned gpio) { struct pinmux_data_reg *dr = NULL; int bit = 0; if (!gpioc || get_data_reg(gpioc, gpio, &dr, &bit) != 0) { BUG(); return 0; } return gpio_read_reg(dr->reg, dr->reg_width, 1, bit); }
static int __gpio_get_set_value(struct pinmux_info *gpioc, unsigned gpio, int value, int do_write) { struct pinmux_data_reg *dr = NULL; int bit = 0; if (get_data_reg(gpioc, gpio, &dr, &bit) != 0) BUG(); else value = read_write_reg(dr->reg, dr->reg_width, 1, bit, !!value, do_write); return value; }
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 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; }