Skip to content

Commit

Permalink
gpiolib: use gpio_chips list in sysfs ops
Browse files Browse the repository at this point in the history
This makes the code both simpler and faster compared to parsing the GPIO
number space.

Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
  • Loading branch information
Alexandre Courbot authored and Grant Likely committed Feb 9, 2013
1 parent 125eef9 commit cb1650d
Showing 1 changed file with 10 additions and 27 deletions.
37 changes: 10 additions & 27 deletions drivers/gpio/gpiolib.c
Original file line number Diff line number Diff line change
Expand Up @@ -1890,45 +1890,28 @@ static void gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip)
static void *gpiolib_seq_start(struct seq_file *s, loff_t *pos)
{
struct gpio_chip *chip = NULL;
unsigned int gpio;
void *ret = NULL;
loff_t index = 0;
loff_t index = *pos;

/* REVISIT this isn't locked against gpio_chip removal ... */

for (gpio = 0; gpio_is_valid(gpio); gpio++) {
if (gpio_desc[gpio].chip == chip)
continue;

chip = gpio_desc[gpio].chip;
if (!chip)
continue;

if (index++ >= *pos) {
ret = chip;
break;
}
}

s->private = "";

return ret;
list_for_each_entry(chip, &gpio_chips, list)
if (index-- == 0)
return chip;

return NULL;
}

static void *gpiolib_seq_next(struct seq_file *s, void *v, loff_t *pos)
{
struct gpio_chip *chip = v;
unsigned int gpio;
void *ret = NULL;

/* skip GPIOs provided by the current chip */
for (gpio = chip->base + chip->ngpio; gpio_is_valid(gpio); gpio++) {
chip = gpio_desc[gpio].chip;
if (chip) {
ret = chip;
break;
}
}
if (list_is_last(&chip->list, &gpio_chips))
ret = NULL;
else
ret = list_entry(chip->list.next, struct gpio_chip, list);

s->private = "\n";
++*pos;
Expand Down

0 comments on commit cb1650d

Please sign in to comment.