summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Courbot <acourbot@nvidia.com>2013-02-03 01:29:27 +0900
committerGrant Likely <grant.likely@secretlab.ca>2013-02-09 09:30:17 +0000
commitcb1650d4e0da27e88c1a1bd8fe98c40ae1a5d313 (patch)
tree576d50b4561c435bb0ffaeac2e49570482fe5111
parent125eef96f6cfadddbac8f6b9fccc9848988e7c6e (diff)
downloadlinux-cb1650d4e0da27e88c1a1bd8fe98c40ae1a5d313.tar.gz
gpiolib: use gpio_chips list in sysfs ops
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>
-rw-r--r--drivers/gpio/gpiolib.c37
1 files changed, 10 insertions, 27 deletions
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 5a79cb955d9f..585d7c3ce12e 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -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;