|
@@ -139,14 +139,10 @@ struct qe_pin {
|
|
struct qe_pin *qe_pin_request(struct device_node *np, int index)
|
|
struct qe_pin *qe_pin_request(struct device_node *np, int index)
|
|
{
|
|
{
|
|
struct qe_pin *qe_pin;
|
|
struct qe_pin *qe_pin;
|
|
- struct device_node *gpio_np;
|
|
|
|
struct gpio_chip *gc;
|
|
struct gpio_chip *gc;
|
|
struct of_mm_gpio_chip *mm_gc;
|
|
struct of_mm_gpio_chip *mm_gc;
|
|
struct qe_gpio_chip *qe_gc;
|
|
struct qe_gpio_chip *qe_gc;
|
|
int err;
|
|
int err;
|
|
- int size;
|
|
|
|
- const void *gpio_spec;
|
|
|
|
- const u32 *gpio_cells;
|
|
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
|
|
qe_pin = kzalloc(sizeof(*qe_pin), GFP_KERNEL);
|
|
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);
|
|
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;
|
|
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__);
|
|
pr_debug("%s: tried to get a non-qe pin\n", __func__);
|
|
err = -EINVAL;
|
|
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);
|
|
mm_gc = to_of_mm_gpio_chip(gc);
|
|
qe_gc = to_qe_gpio_chip(mm_gc);
|
|
qe_gc = to_qe_gpio_chip(mm_gc);
|
|
|
|
|
|
spin_lock_irqsave(&qe_gc->lock, flags);
|
|
spin_lock_irqsave(&qe_gc->lock, flags);
|
|
|
|
|
|
|
|
+ err -= gc->base;
|
|
if (test_and_set_bit(QE_PIN_REQUESTED, &qe_gc->pin_flags[err]) == 0) {
|
|
if (test_and_set_bit(QE_PIN_REQUESTED, &qe_gc->pin_flags[err]) == 0) {
|
|
qe_pin->controller = qe_gc;
|
|
qe_pin->controller = qe_gc;
|
|
qe_pin->num = err;
|
|
qe_pin->num = err;
|
|
@@ -206,8 +182,6 @@ struct qe_pin *qe_pin_request(struct device_node *np, int index)
|
|
|
|
|
|
if (!err)
|
|
if (!err)
|
|
return qe_pin;
|
|
return qe_pin;
|
|
-err1:
|
|
|
|
- of_node_put(gpio_np);
|
|
|
|
err0:
|
|
err0:
|
|
kfree(qe_pin);
|
|
kfree(qe_pin);
|
|
pr_debug("%s failed with status %d\n", __func__, err);
|
|
pr_debug("%s failed with status %d\n", __func__, err);
|