Commit 706e8520 authored by Chanho Park's avatar Chanho Park Committed by Linus Walleij

pinctrl: correct a offset while enumerating pins

This patch modifies a offset while enumerating pins to support a
partial pin space. If we use a pin number for enumerating pins,
the pin space always starts with zero base. Indeed, we always check
the pin is in the pin space. An extreme example, there is only two pins.
One is 0. Another is 1000. We always enumerate whole offsets until 1000.
For solving this problem, we use the offset of the pin array instead
of the zero-based pin number.
Signed-off-by: default avatarChanho Park <chanho61.park@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
[Restored sparse pin space comment]
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent e6337c3c
...@@ -102,12 +102,13 @@ struct pin_desc *pin_desc_get(struct pinctrl_dev *pctldev, unsigned int pin) ...@@ -102,12 +102,13 @@ struct pin_desc *pin_desc_get(struct pinctrl_dev *pctldev, unsigned int pin)
*/ */
int pin_get_from_name(struct pinctrl_dev *pctldev, const char *name) int pin_get_from_name(struct pinctrl_dev *pctldev, const char *name)
{ {
unsigned pin; unsigned i, pin;
/* The highest pin number need to be included in the loop, thus <= */ /* The pin number can be retrived from the pin controller descriptor */
for (pin = 0; pin <= pctldev->desc->maxpin; pin++) { for (i = 0; i < pctldev->desc->npins; i++) {
struct pin_desc *desc; struct pin_desc *desc;
pin = pctldev->desc->pins[i].number;
desc = pin_desc_get(pctldev, pin); desc = pin_desc_get(pctldev, pin);
/* Pin space may be sparse */ /* Pin space may be sparse */
if (desc == NULL) if (desc == NULL)
...@@ -350,15 +351,16 @@ static int pinctrl_pins_show(struct seq_file *s, void *what) ...@@ -350,15 +351,16 @@ static int pinctrl_pins_show(struct seq_file *s, void *what)
{ {
struct pinctrl_dev *pctldev = s->private; struct pinctrl_dev *pctldev = s->private;
const struct pinctrl_ops *ops = pctldev->desc->pctlops; const struct pinctrl_ops *ops = pctldev->desc->pctlops;
unsigned pin; unsigned i, pin;
seq_printf(s, "registered pins: %d\n", pctldev->desc->npins); seq_printf(s, "registered pins: %d\n", pctldev->desc->npins);
seq_printf(s, "max pin number: %d\n", pctldev->desc->maxpin); seq_printf(s, "max pin number: %d\n", pctldev->desc->maxpin);
/* The highest pin number need to be included in the loop, thus <= */ /* The pin number can be retrived from the pin controller descriptor */
for (pin = 0; pin <= pctldev->desc->maxpin; pin++) { for (i = 0; i < pctldev->desc->npins; i++) {
struct pin_desc *desc; struct pin_desc *desc;
pin = pctldev->desc->pins[i].number;
desc = pin_desc_get(pctldev, pin); desc = pin_desc_get(pctldev, pin);
/* Pin space may be sparse */ /* Pin space may be sparse */
if (desc == NULL) if (desc == NULL)
......
...@@ -230,17 +230,18 @@ static void pinconf_dump_pin(struct pinctrl_dev *pctldev, ...@@ -230,17 +230,18 @@ static void pinconf_dump_pin(struct pinctrl_dev *pctldev,
static int pinconf_pins_show(struct seq_file *s, void *what) static int pinconf_pins_show(struct seq_file *s, void *what)
{ {
struct pinctrl_dev *pctldev = s->private; struct pinctrl_dev *pctldev = s->private;
unsigned pin; unsigned i, pin;
seq_puts(s, "Pin config settings per pin\n"); seq_puts(s, "Pin config settings per pin\n");
seq_puts(s, "Format: pin (name): pinmux setting array\n"); seq_puts(s, "Format: pin (name): pinmux setting array\n");
/* The highest pin number need to be included in the loop, thus <= */ /* The pin number can be retrived from the pin controller descriptor */
for (pin = 0; pin <= pctldev->desc->maxpin; pin++) { for (i = 0; pin < pctldev->desc->npins; i++) {
struct pin_desc *desc; struct pin_desc *desc;
pin = pctldev->desc->pins[i].number;
desc = pin_desc_get(pctldev, pin); desc = pin_desc_get(pctldev, pin);
/* Pin space may be sparse */ /* Skip if we cannot search the pin */
if (desc == NULL) if (desc == NULL)
continue; continue;
......
...@@ -1063,18 +1063,19 @@ static int pinmux_functions_show(struct seq_file *s, void *what) ...@@ -1063,18 +1063,19 @@ static int pinmux_functions_show(struct seq_file *s, void *what)
static int pinmux_pins_show(struct seq_file *s, void *what) static int pinmux_pins_show(struct seq_file *s, void *what)
{ {
struct pinctrl_dev *pctldev = s->private; struct pinctrl_dev *pctldev = s->private;
unsigned pin; unsigned i, pin;
seq_puts(s, "Pinmux settings per pin\n"); seq_puts(s, "Pinmux settings per pin\n");
seq_puts(s, "Format: pin (name): pinmuxfunction\n"); seq_puts(s, "Format: pin (name): pinmuxfunction\n");
/* The highest pin number need to be included in the loop, thus <= */ /* The pin number can be retrived from the pin controller descriptor */
for (pin = 0; pin <= pctldev->desc->maxpin; pin++) { for (i = 0; i < pctldev->desc->npins; i++) {
struct pin_desc *desc; struct pin_desc *desc;
pin = pctldev->desc->pins[i].number;
desc = pin_desc_get(pctldev, pin); desc = pin_desc_get(pctldev, pin);
/* Pin space may be sparse */ /* Skip if we cannot search the pin */
if (desc == NULL) if (desc == NULL)
continue; continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment