diff options
author | Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> | 2015-01-18 06:39:32 -0500 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2015-01-20 05:19:01 -0500 |
commit | 98686d9a52eeeab83a33fca5c19448954d109458 (patch) | |
tree | 98131a7804fdc378c388499050dc56c69bf43388 /drivers/gpio | |
parent | ff00be69fd95ea02b1274ea2ea1474727adeffd5 (diff) |
gpio: mpc8xxx: Convert to platform device interface.
This way we do not need to transverse the device tree manually.
Cc: Grant Likely <grant.likely@linaro.org>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: devicetree@vger.kernel.org
Acked-by: Peter Korsgaard <peter@korsgaard.com>
Acked-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/gpio')
-rw-r--r-- | drivers/gpio/gpio-mpc8xxx.c | 48 |
1 files changed, 22 insertions, 26 deletions
diff --git a/drivers/gpio/gpio-mpc8xxx.c b/drivers/gpio/gpio-mpc8xxx.c index d1ff879e6ff2..57eb794b6fc9 100644 --- a/drivers/gpio/gpio-mpc8xxx.c +++ b/drivers/gpio/gpio-mpc8xxx.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/of.h> | 15 | #include <linux/of.h> |
16 | #include <linux/of_gpio.h> | 16 | #include <linux/of_gpio.h> |
17 | #include <linux/of_irq.h> | 17 | #include <linux/of_irq.h> |
18 | #include <linux/of_platform.h> | ||
18 | #include <linux/gpio.h> | 19 | #include <linux/gpio.h> |
19 | #include <linux/slab.h> | 20 | #include <linux/slab.h> |
20 | #include <linux/irq.h> | 21 | #include <linux/irq.h> |
@@ -342,8 +343,9 @@ static struct of_device_id mpc8xxx_gpio_ids[] __initdata = { | |||
342 | {} | 343 | {} |
343 | }; | 344 | }; |
344 | 345 | ||
345 | static void __init mpc8xxx_add_controller(struct device_node *np) | 346 | static int mpc8xxx_probe(struct platform_device *pdev) |
346 | { | 347 | { |
348 | struct device_node *np = pdev->dev.of_node; | ||
347 | struct mpc8xxx_gpio_chip *mpc8xxx_gc; | 349 | struct mpc8xxx_gpio_chip *mpc8xxx_gc; |
348 | struct of_mm_gpio_chip *mm_gc; | 350 | struct of_mm_gpio_chip *mm_gc; |
349 | struct gpio_chip *gc; | 351 | struct gpio_chip *gc; |
@@ -351,11 +353,9 @@ static void __init mpc8xxx_add_controller(struct device_node *np) | |||
351 | unsigned hwirq; | 353 | unsigned hwirq; |
352 | int ret; | 354 | int ret; |
353 | 355 | ||
354 | mpc8xxx_gc = kzalloc(sizeof(*mpc8xxx_gc), GFP_KERNEL); | 356 | mpc8xxx_gc = devm_kzalloc(&pdev->dev, sizeof(*mpc8xxx_gc), GFP_KERNEL); |
355 | if (!mpc8xxx_gc) { | 357 | if (!mpc8xxx_gc) |
356 | ret = -ENOMEM; | 358 | return -ENOMEM; |
357 | goto err; | ||
358 | } | ||
359 | 359 | ||
360 | spin_lock_init(&mpc8xxx_gc->lock); | 360 | spin_lock_init(&mpc8xxx_gc->lock); |
361 | 361 | ||
@@ -375,16 +375,16 @@ static void __init mpc8xxx_add_controller(struct device_node *np) | |||
375 | 375 | ||
376 | ret = of_mm_gpiochip_add(np, mm_gc); | 376 | ret = of_mm_gpiochip_add(np, mm_gc); |
377 | if (ret) | 377 | if (ret) |
378 | goto err; | 378 | return ret; |
379 | 379 | ||
380 | hwirq = irq_of_parse_and_map(np, 0); | 380 | hwirq = irq_of_parse_and_map(np, 0); |
381 | if (hwirq == NO_IRQ) | 381 | if (hwirq == NO_IRQ) |
382 | goto skip_irq; | 382 | return 0; |
383 | 383 | ||
384 | mpc8xxx_gc->irq = irq_domain_add_linear(np, MPC8XXX_GPIO_PINS, | 384 | mpc8xxx_gc->irq = irq_domain_add_linear(np, MPC8XXX_GPIO_PINS, |
385 | &mpc8xxx_gpio_irq_ops, mpc8xxx_gc); | 385 | &mpc8xxx_gpio_irq_ops, mpc8xxx_gc); |
386 | if (!mpc8xxx_gc->irq) | 386 | if (!mpc8xxx_gc->irq) |
387 | goto skip_irq; | 387 | return 0; |
388 | 388 | ||
389 | id = of_match_node(mpc8xxx_gpio_ids, np); | 389 | id = of_match_node(mpc8xxx_gpio_ids, np); |
390 | if (id) | 390 | if (id) |
@@ -397,24 +397,20 @@ static void __init mpc8xxx_add_controller(struct device_node *np) | |||
397 | irq_set_handler_data(hwirq, mpc8xxx_gc); | 397 | irq_set_handler_data(hwirq, mpc8xxx_gc); |
398 | irq_set_chained_handler(hwirq, mpc8xxx_gpio_irq_cascade); | 398 | irq_set_chained_handler(hwirq, mpc8xxx_gpio_irq_cascade); |
399 | 399 | ||
400 | skip_irq: | 400 | return 0; |
401 | return; | ||
402 | |||
403 | err: | ||
404 | pr_err("%s: registration failed with status %d\n", | ||
405 | np->full_name, ret); | ||
406 | kfree(mpc8xxx_gc); | ||
407 | |||
408 | return; | ||
409 | } | 401 | } |
410 | 402 | ||
411 | static int __init mpc8xxx_add_gpiochips(void) | 403 | static struct platform_driver mpc8xxx_plat_driver = { |
412 | { | 404 | .probe = mpc8xxx_probe, |
413 | struct device_node *np; | 405 | .driver = { |
414 | 406 | .name = "gpio-mpc8xxx", | |
415 | for_each_matching_node(np, mpc8xxx_gpio_ids) | 407 | .of_match_table = mpc8xxx_gpio_ids, |
416 | mpc8xxx_add_controller(np); | 408 | }, |
409 | }; | ||
417 | 410 | ||
418 | return 0; | 411 | static int __init mpc8xxx_init(void) |
412 | { | ||
413 | return platform_driver_register(&mpc8xxx_plat_driver); | ||
419 | } | 414 | } |
420 | arch_initcall(mpc8xxx_add_gpiochips); | 415 | |
416 | arch_initcall(mpc8xxx_init); | ||