]> Pileus Git - ~andy/linux/blobdiff - arch/powerpc/sysdev/qe_lib/gpio.c
Merge branch 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[~andy/linux] / arch / powerpc / sysdev / qe_lib / gpio.c
index e23f23cf9f5c85d5e6295f4393c1db9e733a816f..521e67a49dc4075355c4f78811c0b877ab48b8d2 100644 (file)
@@ -139,14 +139,10 @@ struct qe_pin {
 struct qe_pin *qe_pin_request(struct device_node *np, int index)
 {
        struct qe_pin *qe_pin;
-       struct device_node *gpio_np;
        struct gpio_chip *gc;
        struct of_mm_gpio_chip *mm_gc;
        struct qe_gpio_chip *qe_gc;
        int err;
-       int size;
-       const void *gpio_spec;
-       const u32 *gpio_cells;
        unsigned long flags;
 
        qe_pin = kzalloc(sizeof(*qe_pin), GFP_KERNEL);
@@ -155,45 +151,25 @@ struct qe_pin *qe_pin_request(struct device_node *np, int index)
                return ERR_PTR(-ENOMEM);
        }
 
-       err = of_parse_phandles_with_args(np, "gpios", "#gpio-cells", index,
-                                         &gpio_np, &gpio_spec);
-       if (err) {
-               pr_debug("%s: can't parse gpios property\n", __func__);
+       err = of_get_gpio(np, index);
+       if (err < 0)
+               goto err0;
+       gc = gpio_to_chip(err);
+       if (WARN_ON(!gc))
                goto err0;
-       }
 
-       if (!of_device_is_compatible(gpio_np, "fsl,mpc8323-qe-pario-bank")) {
+       if (!of_device_is_compatible(gc->of_node, "fsl,mpc8323-qe-pario-bank")) {
                pr_debug("%s: tried to get a non-qe pin\n", __func__);
                err = -EINVAL;
-               goto err1;
-       }
-
-       gc = of_node_to_gpiochip(gpio_np);
-       if (!gc) {
-               pr_debug("%s: gpio controller %s isn't registered\n",
-                        np->full_name, gpio_np->full_name);
-               err = -ENODEV;
-               goto err1;
-       }
-
-       gpio_cells = of_get_property(gpio_np, "#gpio-cells", &size);
-       if (!gpio_cells || size != sizeof(*gpio_cells) ||
-                       *gpio_cells != gc->of_gpio_n_cells) {
-               pr_debug("%s: wrong #gpio-cells for %s\n",
-                        np->full_name, gpio_np->full_name);
-               err = -EINVAL;
-               goto err1;
+               goto err0;
        }
 
-       err = gc->of_xlate(gc, np, gpio_spec, NULL);
-       if (err < 0)
-               goto err1;
-
        mm_gc = to_of_mm_gpio_chip(gc);
        qe_gc = to_qe_gpio_chip(mm_gc);
 
        spin_lock_irqsave(&qe_gc->lock, flags);
 
+       err -= gc->base;
        if (test_and_set_bit(QE_PIN_REQUESTED, &qe_gc->pin_flags[err]) == 0) {
                qe_pin->controller = qe_gc;
                qe_pin->num = err;
@@ -206,8 +182,6 @@ struct qe_pin *qe_pin_request(struct device_node *np, int index)
 
        if (!err)
                return qe_pin;
-err1:
-       of_node_put(gpio_np);
 err0:
        kfree(qe_pin);
        pr_debug("%s failed with status %d\n", __func__, err);