summaryrefslogtreecommitdiff
path: root/packages/linux/linux-2.6.18/gpio-dev-robustness.patch
diff options
context:
space:
mode:
authorDenys Dmytriyenko <denis@denix.org>2009-03-17 14:32:59 -0400
committerDenys Dmytriyenko <denis@denix.org>2009-03-17 14:32:59 -0400
commit709c4d66e0b107ca606941b988bad717c0b45d9b (patch)
tree37ee08b1eb308f3b2b6426d5793545c38396b838 /packages/linux/linux-2.6.18/gpio-dev-robustness.patch
parentfa6cd5a3b993f16c27de4ff82b42684516d433ba (diff)
rename packages/ to recipes/ per earlier agreement
See links below for more details: http://thread.gmane.org/gmane.comp.handhelds.openembedded/21326 http://thread.gmane.org/gmane.comp.handhelds.openembedded/21816 Signed-off-by: Denys Dmytriyenko <denis@denix.org> Acked-by: Mike Westerhof <mwester@dls.net> Acked-by: Philip Balister <philip@balister.org> Acked-by: Khem Raj <raj.khem@gmail.com> Acked-by: Marcin Juszkiewicz <hrw@openembedded.org> Acked-by: Koen Kooi <koen@openembedded.org> Acked-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
Diffstat (limited to 'packages/linux/linux-2.6.18/gpio-dev-robustness.patch')
-rw-r--r--packages/linux/linux-2.6.18/gpio-dev-robustness.patch204
1 files changed, 0 insertions, 204 deletions
diff --git a/packages/linux/linux-2.6.18/gpio-dev-robustness.patch b/packages/linux/linux-2.6.18/gpio-dev-robustness.patch
deleted file mode 100644
index 56ef0ebc6c..0000000000
--- a/packages/linux/linux-2.6.18/gpio-dev-robustness.patch
+++ /dev/null
@@ -1,204 +0,0 @@
-Make the GPIO /dev interface a bit more robust
-
-Instead of allocating gpio resources on-the-fly as the files are
-written, defer it until enable is set to 1 and disallow updates to
-any of the other files while enable=1.
-
-Otherwise, the number of checks in each _store function will rapidly
-approach insanity.
----
- arch/avr32/mach-at32ap/pio.c | 99 ++++++++++++++++++-------------------------
- 1 file changed, 43 insertions(+), 56 deletions(-)
-
-Index: linux-2.6.18-avr32/arch/avr32/mach-at32ap/pio.c
-===================================================================
---- linux-2.6.18-avr32.orig/arch/avr32/mach-at32ap/pio.c 2006-11-29 17:10:54.000000000 +0100
-+++ linux-2.6.18-avr32/arch/avr32/mach-at32ap/pio.c 2006-11-29 18:11:38.000000000 +0100
-@@ -124,13 +124,6 @@ static unsigned int pio_id(struct pio_de
- return pio - pio_dev;
- }
-
--static void __enable_gpio(struct pio_device *pio, u32 mask)
--{
-- pio_writel(pio, PUER, mask);
-- pio_writel(pio, ODR, mask);
-- pio_writel(pio, PER, mask);
--}
--
- static void __disable_gpio(struct pio_device *pio, u32 mask)
- {
- pio_writel(pio, PUER, mask);
-@@ -251,11 +244,12 @@ static dev_t gpio_devt;
- struct gpio_item {
- spinlock_t lock;
-
-- /* Too bad we don't have committable items... */
-- int enabled;
--
- struct pio_device *pio;
-+
-+ int enabled;
-+ int pio_id;
- u32 pin_mask;
-+ u32 oe_mask;
-
- int id;
- struct class_device *gpio_dev;
-@@ -339,10 +333,7 @@ static struct gpio_item *to_gpio_item(st
-
- static ssize_t gpio_show_gpio_id(struct gpio_item *gpio, char *page)
- {
-- if (gpio->pio)
-- return sprintf(page, "%u\n", pio_id(gpio->pio));
-- else
-- return sprintf(page, "-1\n");
-+ return sprintf(page, "%d\n", gpio->pio_id);
- }
-
- static ssize_t gpio_store_gpio_id(struct gpio_item *gpio,
-@@ -361,7 +352,7 @@ static ssize_t gpio_store_gpio_id(struct
- if (!gpio->enabled) {
- ret = -ENXIO;
- if ((id < MAX_NR_PIO_DEVICES) && pio_dev[id].regs) {
-- gpio->pio = &pio_dev[id];
-+ gpio->pio_id = id;
- ret = count;
- }
- }
-@@ -378,9 +369,7 @@ static ssize_t gpio_show_pin_mask(struct
- static ssize_t gpio_store_pin_mask(struct gpio_item *gpio,
- const char *page, size_t count)
- {
-- struct pio_device *pio;
-- u32 old_mask, new_mask;
-- u32 old, new;
-+ u32 new_mask;
- char *p = (char *)page;
- ssize_t ret = -EINVAL;
-
-@@ -388,47 +377,21 @@ static ssize_t gpio_store_pin_mask(struc
- if (!p || (*p && (*p != '\n')))
- return -EINVAL;
-
-- /*
-- * Must have a PIO before we can start allocating pins, but we
-- * must not be live.
-- */
-+ /* Can't update the pin mask while live. */
- spin_lock(&gpio->lock);
-- pio = gpio->pio;
-- if (!pio || gpio->enabled)
-- goto out;
--
-- ret = -EBUSY;
-- old_mask = gpio->pin_mask;
-- do {
-- old = pio->pinmux_mask;
-- if ((old & ~old_mask) & new_mask)
-- goto out;
--
-- new = (old & ~old_mask) | new_mask;
-- } while (cmpxchg(&pio->pinmux_mask, old, new) != old);
--
-- gpio->pin_mask = new_mask;
-- __disable_gpio(pio, old_mask);
-- __enable_gpio(pio, new_mask);
-- ret = count;
--
--out:
-+ if (!gpio->enabled) {
-+ gpio->oe_mask &= new_mask;
-+ gpio->pin_mask = new_mask;
-+ ret = count;
-+ }
- spin_unlock(&gpio->lock);
-+
- return ret;
- }
-
- static ssize_t gpio_show_oe_mask(struct gpio_item *gpio, char *page)
- {
-- u32 mask = 0;
--
-- spin_lock(&gpio->lock);
-- if (gpio->pio) {
-- mask = pio_readl(gpio->pio, OSR);
-- mask &= gpio->pin_mask;
-- }
-- spin_unlock(&gpio->lock);
--
-- return sprintf(page, "0x%08x\n", mask);
-+ return sprintf(page, "0x%08x\n", gpio->oe_mask);
- }
-
- static ssize_t gpio_store_oe_mask(struct gpio_item *gpio,
-@@ -443,10 +406,8 @@ static ssize_t gpio_store_oe_mask(struct
- return -EINVAL;
-
- spin_lock(&gpio->lock);
-- if (gpio->pio) {
-- mask &= gpio->pin_mask;
-- pio_writel(gpio->pio, ODR, mask ^ gpio->pin_mask);
-- pio_writel(gpio->pio, OER, mask);
-+ if (!gpio->enabled) {
-+ gpio->oe_mask = mask & gpio->pin_mask;
- ret = count;
- }
- spin_unlock(&gpio->lock);
-@@ -462,6 +423,8 @@ static ssize_t gpio_show_enabled(struct
- static ssize_t gpio_store_enabled(struct gpio_item *gpio,
- const char *page, size_t count)
- {
-+ struct pio_device *pio;
-+ u32 old, new;
- char *p = (char *)page;
- int enabled;
- int ret;
-@@ -482,6 +445,12 @@ static ssize_t gpio_store_enabled(struct
- if (!enabled) {
- class_device_unregister(gpio->gpio_dev);
- cdev_del(&gpio->char_dev);
-+ __disable_gpio(gpio->pio, gpio->pin_mask);
-+ pio_dealloc_mask(gpio->pio, gpio->pin_mask);
-+ gpio->pio = NULL;
-+ } else {
-+ if (gpio->pio_id < 0 || !gpio->pin_mask)
-+ return -ENODEV;
- }
-
- /* Disallow any updates to gpio_id or pin_mask */
-@@ -492,6 +461,20 @@ static ssize_t gpio_store_enabled(struct
- if (!enabled)
- return count;
-
-+ /* Now, try to allocate the pins */
-+ ret = -EBUSY;
-+ pio = gpio->pio = &pio_dev[gpio->pio_id];
-+ do {
-+ old = pio->pinmux_mask;
-+ if (old & gpio->pin_mask)
-+ goto err_alloc_pins;
-+
-+ new = old | gpio->pin_mask;
-+ } while (cmpxchg(&pio->pinmux_mask, old, new) != old);
-+
-+ pio_writel(pio, OER, gpio->oe_mask);
-+ pio_writel(pio, PER, gpio->pin_mask);
-+
- cdev_init(&gpio->char_dev, &gpio_dev_fops);
- gpio->char_dev.owner = THIS_MODULE;
- ret = cdev_add(&gpio->char_dev, MKDEV(MAJOR(gpio_devt), gpio->id), 1);
-@@ -516,9 +499,13 @@ static ssize_t gpio_store_enabled(struct
- err_class_dev:
- cdev_del(&gpio->char_dev);
- err_cdev_add:
-+ __disable_gpio(pio, gpio->pin_mask);
-+ pio_dealloc_mask(pio, gpio->pin_mask);
-+err_alloc_pins:
- spin_lock(&gpio->lock);
- gpio->enabled = 0;
- spin_unlock(&gpio->lock);
-+ gpio->pio = NULL;
-
- return ret;
- }