From: Bamvor Jian Zhang <bamvor.zhangjian@linaro.org>
To: linux-gpio@vger.kernel.org
Cc: linus.walleij@linaro.org, broonie@kernel.org,
Bamvor Jian Zhang <bamvor.zhangjian@linaro.org>
Subject: [PATCH V2 1/2] gpiolib: improve overlap check of range of gpio
Date: Mon, 16 Nov 2015 13:02:46 +0800 [thread overview]
Message-ID: <1447650167-29070-2-git-send-email-bamvor.zhangjian@linaro.org> (raw)
In-Reply-To: <1447650167-29070-1-git-send-email-bamvor.zhangjian@linaro.org>
There are limitations for the current checker:
1. Could not check the overlap if the new gpiochip is the secondly
gpiochip.
2. Could not check the overlap if the new gpiochip is overlap
with the left of gpiochip. E.g. if we insert [c, d] between
[a,b] and [e, f], and e >= c + d, it will successful even if
c < a + b.
3. Allow overlap of base of different gpiochip.
This patch fix these issues by checking the overlap of both right and
left gpiochip in the same loop statement.
Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@linaro.org>
---
drivers/gpio/gpiolib.c | 59 ++++++++++++++++++++++++++++++++++----------------
1 file changed, 40 insertions(+), 19 deletions(-)
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 6798355..270d60b 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -182,7 +182,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_direction);
/*
* Add a new chip to the global chips list, keeping the list of chips sorted
- * by base order.
+ * by range(means [base, base + ngpio - 1]) order.
*
* Return -EBUSY if the new chip overlaps with some other chip's integer
* space.
@@ -190,31 +190,52 @@ EXPORT_SYMBOL_GPL(gpiod_get_direction);
static int gpiochip_add_to_list(struct gpio_chip *chip)
{
struct list_head *pos;
- struct gpio_chip *_chip;
- int err = 0;
+ struct gpio_chip *iterator;
+ struct gpio_chip *previous = NULL;
+ int ret = 0;
- /* find where to insert our chip */
- list_for_each(pos, &gpio_chips) {
- _chip = list_entry(pos, struct gpio_chip, list);
- /* shall we insert before _chip? */
- if (_chip->base >= chip->base + chip->ngpio)
- break;
+ if (list_empty(&gpio_chips)) {
+ pos = gpio_chips.next;
+ goto found;
}
- /* are we stepping on the chip right before? */
- if (pos != &gpio_chips && pos->prev != &gpio_chips) {
- _chip = list_entry(pos->prev, struct gpio_chip, list);
- if (_chip->base + _chip->ngpio > chip->base) {
- dev_err(chip->dev,
- "GPIO integer space overlap, cannot add chip\n");
- err = -EBUSY;
+ list_for_each(pos, &gpio_chips) {
+ iterator = list_entry(pos, struct gpio_chip, list);
+ if (iterator->base >= chip->base + chip->ngpio) {
+ /*
+ * Iterator is the first GPIO chip so there is no
+ * previous one
+ */
+ if (previous == NULL) {
+ goto found;
+ } else {
+ /*
+ * We found a valid range(means
+ * [base, base + ngpio - 1]) between previous
+ * and iterator chip.
+ */
+ if (previous->base + previous->ngpio
+ <= chip->base)
+ goto found;
+ }
}
+ previous = iterator;
}
+ /* We are beyond the last chip in the list */
+ if (iterator->base + iterator->ngpio <= chip->base)
+ goto found;
+
+ dev_err(chip->dev,
+ "GPIO integer space overlap, cannot add chip\n");
+ goto err;
- if (!err)
- list_add_tail(&chip->list, pos);
+found:
+ list_add_tail(&chip->list, pos);
+ return ret;
- return err;
+err:
+ ret = -EBUSY;
+ return ret;
}
/**
--
2.1.4
next prev parent reply other threads:[~2015-11-16 5:03 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-16 5:02 [PATCH V2 0/2] Fix bugs in the insertion of gpiochip Bamvor Jian Zhang
2015-11-16 5:02 ` Bamvor Jian Zhang [this message]
2015-11-17 14:14 ` [PATCH V2 1/2] gpiolib: improve overlap check of range of gpio Linus Walleij
2015-11-17 14:47 ` Bamvor Zhang Jian
2015-11-16 5:02 ` [PATCH V2 2/2] gpiolib: do not allow to insert an empty gpiochip Bamvor Jian Zhang
2015-11-17 14:16 ` Linus Walleij
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1447650167-29070-2-git-send-email-bamvor.zhangjian@linaro.org \
--to=bamvor.zhangjian@linaro.org \
--cc=broonie@kernel.org \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).