Loading drivers/pinctrl/pinctrl-abx500.c +87 −27 Original line number Diff line number Diff line Loading @@ -134,8 +134,8 @@ static int abx500_gpio_get_bit(struct gpio_chip *chip, u8 reg, if (ret < 0) dev_err(pct->dev, "%s read reg =%x, offset=%x failed\n", __func__, reg, offset); "%s read reg =%x, offset=%x failed (%d)\n", __func__, reg, offset, ret); return ret; } Loading @@ -151,7 +151,8 @@ static int abx500_gpio_set_bits(struct gpio_chip *chip, u8 reg, ret = abx500_mask_and_set_register_interruptible(pct->dev, AB8500_MISC, reg, BIT(pos), val << pos); if (ret < 0) dev_err(pct->dev, "%s write failed\n", __func__); dev_err(pct->dev, "%s write reg, %x offset %x failed (%d)\n", __func__, reg, offset, ret); return ret; } Loading @@ -171,10 +172,8 @@ static int abx500_gpio_get(struct gpio_chip *chip, unsigned offset) ret = abx500_gpio_get_bit(chip, AB8500_GPIO_DIR1_REG, gpio_offset, &is_out); if (ret < 0) { dev_err(pct->dev, "%s failed\n", __func__); return ret; } if (ret < 0) goto out; if (is_out) ret = abx500_gpio_get_bit(chip, AB8500_GPIO_OUT1_REG, Loading @@ -182,8 +181,9 @@ static int abx500_gpio_get(struct gpio_chip *chip, unsigned offset) else ret = abx500_gpio_get_bit(chip, AB8500_GPIO_IN1_REG, gpio_offset, &bit); out: if (ret < 0) { dev_err(pct->dev, "%s failed\n", __func__); dev_err(pct->dev, "%s failed (%d)\n", __func__, ret); return ret; } Loading @@ -197,7 +197,7 @@ static void abx500_gpio_set(struct gpio_chip *chip, unsigned offset, int val) ret = abx500_gpio_set_bits(chip, AB8500_GPIO_OUT1_REG, offset, val); if (ret < 0) dev_err(pct->dev, "%s write failed\n", __func__); dev_err(pct->dev, "%s write failed (%d)\n", __func__, ret); } static int abx500_get_pull_updown(struct abx500_pinctrl *pct, int offset, Loading Loading @@ -294,7 +294,7 @@ static int abx500_gpio_direction_output(struct gpio_chip *chip, offset, ABX500_GPIO_OUTPUT); if (ret < 0) return ret; goto out; /* disable pull down */ ret = abx500_gpio_set_bits(chip, Loading @@ -302,7 +302,7 @@ static int abx500_gpio_direction_output(struct gpio_chip *chip, offset, ABX500_GPIO_PULL_NONE); if (ret < 0) return ret; goto out; /* if supported, disable both pull down and pull up */ gpio = offset + 1; Loading @@ -310,7 +310,10 @@ static int abx500_gpio_direction_output(struct gpio_chip *chip, ret = abx500_set_pull_updown(pct, gpio, ABX500_GPIO_PULL_NONE); if (ret < 0) } out: if (ret < 0) { dev_err(pct->dev, "%s failed (%d)\n", __func__, ret); return ret; } Loading Loading @@ -409,10 +412,16 @@ static int abx500_set_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, if (af.alt_bit1 != UNUSED) { ret = abx500_gpio_set_bits(chip, AB8500_GPIO_SEL1_REG, offset, 0); if (ret < 0) goto out; ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG, af.alt_bit1, !!(af.alta_val && BIT(0))); if (ret < 0) goto out; if (af.alt_bit2 != UNUSED) ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG, Loading @@ -426,8 +435,14 @@ static int abx500_set_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, case ABX500_ALT_B: ret = abx500_gpio_set_bits(chip, AB8500_GPIO_SEL1_REG, offset, 0); if (ret < 0) goto out; ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG, af.alt_bit1, !!(af.altb_val && BIT(0))); if (ret < 0) goto out; if (af.alt_bit2 != UNUSED) ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG, Loading @@ -438,8 +453,14 @@ static int abx500_set_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, case ABX500_ALT_C: ret = abx500_gpio_set_bits(chip, AB8500_GPIO_SEL1_REG, offset, 0); if (ret < 0) goto out; ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG, af.alt_bit2, !!(af.altc_val && BIT(0))); if (ret < 0) goto out; ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG, af.alt_bit2, !!(af.altc_val && BIT(1))); break; Loading @@ -449,11 +470,14 @@ static int abx500_set_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, return -EINVAL; } out: if (ret < 0) dev_err(pct->dev, "%s failed (%d)\n", __func__, ret); return ret; } static u8 abx500_get_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, static int abx500_get_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, unsigned gpio) { u8 mode; Loading @@ -464,6 +488,7 @@ static u8 abx500_get_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, struct alternate_functions af = pct->soc->alternate_functions[gpio]; /* on ABx5xx, there is no GPIO0, so adjust the offset */ unsigned offset = gpio - 1; int ret; /* * if gpiosel_bit is set to unused, Loading @@ -473,8 +498,11 @@ static u8 abx500_get_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, return ABX500_DEFAULT; /* read GpioSelx register */ abx500_gpio_get_bit(chip, AB8500_GPIO_SEL1_REG + (offset / 8), ret = abx500_gpio_get_bit(chip, AB8500_GPIO_SEL1_REG + (offset / 8), af.gpiosel_bit, &bit_mode); if (ret < 0) goto out; mode = bit_mode; /* sanity check */ Loading Loading @@ -506,14 +534,19 @@ static u8 abx500_get_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, * pin use the AlternatFunction register * read alt_bit1 value */ abx500_gpio_get_bit(chip, AB8500_GPIO_ALTFUN_REG, ret = abx500_gpio_get_bit(chip, AB8500_GPIO_ALTFUN_REG, af.alt_bit1, &alt_bit1); if (ret < 0) goto out; if (af.alt_bit2 != UNUSED) if (af.alt_bit2 != UNUSED) { /* read alt_bit2 value */ abx500_gpio_get_bit(chip, AB8500_GPIO_ALTFUN_REG, af.alt_bit2, ret = abx500_gpio_get_bit(chip, AB8500_GPIO_ALTFUN_REG, af.alt_bit2, &alt_bit2); else if (ret < 0) goto out; } else alt_bit2 = 0; mode = (alt_bit2 << 1) + alt_bit1; Loading @@ -523,6 +556,10 @@ static u8 abx500_get_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, return ABX500_ALT_B; else return ABX500_ALT_C; out: dev_err(pct->dev, "%s failed (%d)\n", __func__, ret); return ret; } #ifdef CONFIG_DEBUG_FS Loading @@ -541,6 +578,7 @@ static void abx500_gpio_dbg_show_one(struct seq_file *s, bool is_out; bool pd; enum abx500_gpio_pull_updown pud = 0; int ret; const char *modes[] = { [ABX500_DEFAULT] = "default", Loading @@ -556,7 +594,10 @@ static void abx500_gpio_dbg_show_one(struct seq_file *s, [ABX500_GPIO_PULL_UP] = "pull up", }; abx500_gpio_get_bit(chip, AB8500_GPIO_DIR1_REG, gpio_offset, &is_out); ret = abx500_gpio_get_bit(chip, AB8500_GPIO_DIR1_REG, gpio_offset, &is_out); if (ret < 0) goto out; seq_printf(s, " gpio-%-3d (%-20.20s) %-3s", gpio, label ?: "(none)", Loading @@ -564,11 +605,17 @@ static void abx500_gpio_dbg_show_one(struct seq_file *s, if (!is_out) { if (abx500_pullud_supported(chip, offset)) { abx500_get_pull_updown(pct, offset, &pud); ret = abx500_get_pull_updown(pct, offset, &pud); if (ret < 0) goto out; seq_printf(s, " %-9s", pull_up_down[pud]); } else { abx500_gpio_get_bit(chip, AB8500_GPIO_PUD1_REG, ret = abx500_gpio_get_bit(chip, AB8500_GPIO_PUD1_REG, gpio_offset, &pd); if (ret < 0) goto out; seq_printf(s, " %-9s", pull_up_down[pd]); } } else Loading @@ -578,6 +625,10 @@ static void abx500_gpio_dbg_show_one(struct seq_file *s, mode = abx500_get_mode(pctldev, chip, offset); seq_printf(s, " %s", (mode < 0) ? "unknown" : modes[mode]); out: if (ret < 0) dev_err(pct->dev, "%s failed (%d)\n", __func__, ret); } static void abx500_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) Loading Loading @@ -681,6 +732,9 @@ static int abx500_pmx_enable(struct pinctrl_dev *pctldev, unsigned function, ret = abx500_set_mode(pctldev, chip, g->pins[i], g->altsetting); } if (ret < 0) dev_err(pct->dev, "%s failed (%d)\n", __func__, ret); return ret; } Loading Loading @@ -729,10 +783,8 @@ static int abx500_gpio_request_enable(struct pinctrl_dev *pctldev, ret = abx500_set_mode(pct->pctldev, &pct->chip, offset, p->altfunc); if (ret < 0) { if (ret < 0) dev_err(pct->dev, "%s setting altfunc failed\n", __func__); return ret; } return ret; } Loading Loading @@ -1009,6 +1061,8 @@ static int abx500_pin_config_set(struct pinctrl_dev *pctldev, switch (param) { case PIN_CONFIG_BIAS_DISABLE: ret = abx500_gpio_direction_input(chip, offset); if (ret < 0) goto out; /* * Some chips only support pull down, while some actually * support both pull up and pull down. Such chips have Loading @@ -1028,6 +1082,8 @@ static int abx500_pin_config_set(struct pinctrl_dev *pctldev, case PIN_CONFIG_BIAS_PULL_DOWN: ret = abx500_gpio_direction_input(chip, offset); if (ret < 0) goto out; /* * if argument = 1 set the pull down * else clear the pull down Loading @@ -1050,6 +1106,8 @@ static int abx500_pin_config_set(struct pinctrl_dev *pctldev, case PIN_CONFIG_BIAS_PULL_UP: ret = abx500_gpio_direction_input(chip, offset); if (ret < 0) goto out; /* * if argument = 1 set the pull up * else clear the pull up Loading @@ -1070,12 +1128,14 @@ static int abx500_pin_config_set(struct pinctrl_dev *pctldev, case PIN_CONFIG_OUTPUT: ret = abx500_gpio_direction_output(chip, offset, argument); break; default: dev_err(chip->dev, "illegal configuration requested\n"); } out: if (ret < 0) dev_err(pct->dev, "%s failed (%d)\n", __func__, ret); return ret; } Loading Loading
drivers/pinctrl/pinctrl-abx500.c +87 −27 Original line number Diff line number Diff line Loading @@ -134,8 +134,8 @@ static int abx500_gpio_get_bit(struct gpio_chip *chip, u8 reg, if (ret < 0) dev_err(pct->dev, "%s read reg =%x, offset=%x failed\n", __func__, reg, offset); "%s read reg =%x, offset=%x failed (%d)\n", __func__, reg, offset, ret); return ret; } Loading @@ -151,7 +151,8 @@ static int abx500_gpio_set_bits(struct gpio_chip *chip, u8 reg, ret = abx500_mask_and_set_register_interruptible(pct->dev, AB8500_MISC, reg, BIT(pos), val << pos); if (ret < 0) dev_err(pct->dev, "%s write failed\n", __func__); dev_err(pct->dev, "%s write reg, %x offset %x failed (%d)\n", __func__, reg, offset, ret); return ret; } Loading @@ -171,10 +172,8 @@ static int abx500_gpio_get(struct gpio_chip *chip, unsigned offset) ret = abx500_gpio_get_bit(chip, AB8500_GPIO_DIR1_REG, gpio_offset, &is_out); if (ret < 0) { dev_err(pct->dev, "%s failed\n", __func__); return ret; } if (ret < 0) goto out; if (is_out) ret = abx500_gpio_get_bit(chip, AB8500_GPIO_OUT1_REG, Loading @@ -182,8 +181,9 @@ static int abx500_gpio_get(struct gpio_chip *chip, unsigned offset) else ret = abx500_gpio_get_bit(chip, AB8500_GPIO_IN1_REG, gpio_offset, &bit); out: if (ret < 0) { dev_err(pct->dev, "%s failed\n", __func__); dev_err(pct->dev, "%s failed (%d)\n", __func__, ret); return ret; } Loading @@ -197,7 +197,7 @@ static void abx500_gpio_set(struct gpio_chip *chip, unsigned offset, int val) ret = abx500_gpio_set_bits(chip, AB8500_GPIO_OUT1_REG, offset, val); if (ret < 0) dev_err(pct->dev, "%s write failed\n", __func__); dev_err(pct->dev, "%s write failed (%d)\n", __func__, ret); } static int abx500_get_pull_updown(struct abx500_pinctrl *pct, int offset, Loading Loading @@ -294,7 +294,7 @@ static int abx500_gpio_direction_output(struct gpio_chip *chip, offset, ABX500_GPIO_OUTPUT); if (ret < 0) return ret; goto out; /* disable pull down */ ret = abx500_gpio_set_bits(chip, Loading @@ -302,7 +302,7 @@ static int abx500_gpio_direction_output(struct gpio_chip *chip, offset, ABX500_GPIO_PULL_NONE); if (ret < 0) return ret; goto out; /* if supported, disable both pull down and pull up */ gpio = offset + 1; Loading @@ -310,7 +310,10 @@ static int abx500_gpio_direction_output(struct gpio_chip *chip, ret = abx500_set_pull_updown(pct, gpio, ABX500_GPIO_PULL_NONE); if (ret < 0) } out: if (ret < 0) { dev_err(pct->dev, "%s failed (%d)\n", __func__, ret); return ret; } Loading Loading @@ -409,10 +412,16 @@ static int abx500_set_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, if (af.alt_bit1 != UNUSED) { ret = abx500_gpio_set_bits(chip, AB8500_GPIO_SEL1_REG, offset, 0); if (ret < 0) goto out; ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG, af.alt_bit1, !!(af.alta_val && BIT(0))); if (ret < 0) goto out; if (af.alt_bit2 != UNUSED) ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG, Loading @@ -426,8 +435,14 @@ static int abx500_set_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, case ABX500_ALT_B: ret = abx500_gpio_set_bits(chip, AB8500_GPIO_SEL1_REG, offset, 0); if (ret < 0) goto out; ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG, af.alt_bit1, !!(af.altb_val && BIT(0))); if (ret < 0) goto out; if (af.alt_bit2 != UNUSED) ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG, Loading @@ -438,8 +453,14 @@ static int abx500_set_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, case ABX500_ALT_C: ret = abx500_gpio_set_bits(chip, AB8500_GPIO_SEL1_REG, offset, 0); if (ret < 0) goto out; ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG, af.alt_bit2, !!(af.altc_val && BIT(0))); if (ret < 0) goto out; ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG, af.alt_bit2, !!(af.altc_val && BIT(1))); break; Loading @@ -449,11 +470,14 @@ static int abx500_set_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, return -EINVAL; } out: if (ret < 0) dev_err(pct->dev, "%s failed (%d)\n", __func__, ret); return ret; } static u8 abx500_get_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, static int abx500_get_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, unsigned gpio) { u8 mode; Loading @@ -464,6 +488,7 @@ static u8 abx500_get_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, struct alternate_functions af = pct->soc->alternate_functions[gpio]; /* on ABx5xx, there is no GPIO0, so adjust the offset */ unsigned offset = gpio - 1; int ret; /* * if gpiosel_bit is set to unused, Loading @@ -473,8 +498,11 @@ static u8 abx500_get_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, return ABX500_DEFAULT; /* read GpioSelx register */ abx500_gpio_get_bit(chip, AB8500_GPIO_SEL1_REG + (offset / 8), ret = abx500_gpio_get_bit(chip, AB8500_GPIO_SEL1_REG + (offset / 8), af.gpiosel_bit, &bit_mode); if (ret < 0) goto out; mode = bit_mode; /* sanity check */ Loading Loading @@ -506,14 +534,19 @@ static u8 abx500_get_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, * pin use the AlternatFunction register * read alt_bit1 value */ abx500_gpio_get_bit(chip, AB8500_GPIO_ALTFUN_REG, ret = abx500_gpio_get_bit(chip, AB8500_GPIO_ALTFUN_REG, af.alt_bit1, &alt_bit1); if (ret < 0) goto out; if (af.alt_bit2 != UNUSED) if (af.alt_bit2 != UNUSED) { /* read alt_bit2 value */ abx500_gpio_get_bit(chip, AB8500_GPIO_ALTFUN_REG, af.alt_bit2, ret = abx500_gpio_get_bit(chip, AB8500_GPIO_ALTFUN_REG, af.alt_bit2, &alt_bit2); else if (ret < 0) goto out; } else alt_bit2 = 0; mode = (alt_bit2 << 1) + alt_bit1; Loading @@ -523,6 +556,10 @@ static u8 abx500_get_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip, return ABX500_ALT_B; else return ABX500_ALT_C; out: dev_err(pct->dev, "%s failed (%d)\n", __func__, ret); return ret; } #ifdef CONFIG_DEBUG_FS Loading @@ -541,6 +578,7 @@ static void abx500_gpio_dbg_show_one(struct seq_file *s, bool is_out; bool pd; enum abx500_gpio_pull_updown pud = 0; int ret; const char *modes[] = { [ABX500_DEFAULT] = "default", Loading @@ -556,7 +594,10 @@ static void abx500_gpio_dbg_show_one(struct seq_file *s, [ABX500_GPIO_PULL_UP] = "pull up", }; abx500_gpio_get_bit(chip, AB8500_GPIO_DIR1_REG, gpio_offset, &is_out); ret = abx500_gpio_get_bit(chip, AB8500_GPIO_DIR1_REG, gpio_offset, &is_out); if (ret < 0) goto out; seq_printf(s, " gpio-%-3d (%-20.20s) %-3s", gpio, label ?: "(none)", Loading @@ -564,11 +605,17 @@ static void abx500_gpio_dbg_show_one(struct seq_file *s, if (!is_out) { if (abx500_pullud_supported(chip, offset)) { abx500_get_pull_updown(pct, offset, &pud); ret = abx500_get_pull_updown(pct, offset, &pud); if (ret < 0) goto out; seq_printf(s, " %-9s", pull_up_down[pud]); } else { abx500_gpio_get_bit(chip, AB8500_GPIO_PUD1_REG, ret = abx500_gpio_get_bit(chip, AB8500_GPIO_PUD1_REG, gpio_offset, &pd); if (ret < 0) goto out; seq_printf(s, " %-9s", pull_up_down[pd]); } } else Loading @@ -578,6 +625,10 @@ static void abx500_gpio_dbg_show_one(struct seq_file *s, mode = abx500_get_mode(pctldev, chip, offset); seq_printf(s, " %s", (mode < 0) ? "unknown" : modes[mode]); out: if (ret < 0) dev_err(pct->dev, "%s failed (%d)\n", __func__, ret); } static void abx500_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) Loading Loading @@ -681,6 +732,9 @@ static int abx500_pmx_enable(struct pinctrl_dev *pctldev, unsigned function, ret = abx500_set_mode(pctldev, chip, g->pins[i], g->altsetting); } if (ret < 0) dev_err(pct->dev, "%s failed (%d)\n", __func__, ret); return ret; } Loading Loading @@ -729,10 +783,8 @@ static int abx500_gpio_request_enable(struct pinctrl_dev *pctldev, ret = abx500_set_mode(pct->pctldev, &pct->chip, offset, p->altfunc); if (ret < 0) { if (ret < 0) dev_err(pct->dev, "%s setting altfunc failed\n", __func__); return ret; } return ret; } Loading Loading @@ -1009,6 +1061,8 @@ static int abx500_pin_config_set(struct pinctrl_dev *pctldev, switch (param) { case PIN_CONFIG_BIAS_DISABLE: ret = abx500_gpio_direction_input(chip, offset); if (ret < 0) goto out; /* * Some chips only support pull down, while some actually * support both pull up and pull down. Such chips have Loading @@ -1028,6 +1082,8 @@ static int abx500_pin_config_set(struct pinctrl_dev *pctldev, case PIN_CONFIG_BIAS_PULL_DOWN: ret = abx500_gpio_direction_input(chip, offset); if (ret < 0) goto out; /* * if argument = 1 set the pull down * else clear the pull down Loading @@ -1050,6 +1106,8 @@ static int abx500_pin_config_set(struct pinctrl_dev *pctldev, case PIN_CONFIG_BIAS_PULL_UP: ret = abx500_gpio_direction_input(chip, offset); if (ret < 0) goto out; /* * if argument = 1 set the pull up * else clear the pull up Loading @@ -1070,12 +1128,14 @@ static int abx500_pin_config_set(struct pinctrl_dev *pctldev, case PIN_CONFIG_OUTPUT: ret = abx500_gpio_direction_output(chip, offset, argument); break; default: dev_err(chip->dev, "illegal configuration requested\n"); } out: if (ret < 0) dev_err(pct->dev, "%s failed (%d)\n", __func__, ret); return ret; } Loading