]>
Commit | Line | Data |
---|---|---|
a3b8d4a5 AS |
1 | /* |
2 | * CLPS711X GPIO driver | |
3 | * | |
55fe14ab | 4 | * Copyright (C) 2012,2013 Alexander Shiyan <[email protected]> |
a3b8d4a5 AS |
5 | * |
6 | * This program is free software; you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License as published by | |
8 | * the Free Software Foundation; either version 2 of the License, or | |
9 | * (at your option) any later version. | |
10 | */ | |
11 | ||
55fe14ab | 12 | #include <linux/err.h> |
a3b8d4a5 | 13 | #include <linux/module.h> |
0f4630f3 | 14 | #include <linux/gpio/driver.h> |
a3b8d4a5 AS |
15 | #include <linux/platform_device.h> |
16 | ||
55fe14ab | 17 | static int clps711x_gpio_probe(struct platform_device *pdev) |
a3b8d4a5 | 18 | { |
a180132f | 19 | struct device_node *np = pdev->dev.of_node; |
55fe14ab | 20 | void __iomem *dat, *dir; |
0f4630f3 | 21 | struct gpio_chip *gc; |
55fe14ab | 22 | struct resource *res; |
1bdb5c8e | 23 | int err, id; |
a3b8d4a5 | 24 | |
1bdb5c8e AS |
25 | if (!np) |
26 | return -ENODEV; | |
27 | ||
28 | id = of_alias_get_id(np, "gpio"); | |
55fe14ab AS |
29 | if ((id < 0) || (id > 4)) |
30 | return -ENODEV; | |
a3b8d4a5 | 31 | |
0f4630f3 LW |
32 | gc = devm_kzalloc(&pdev->dev, sizeof(*gc), GFP_KERNEL); |
33 | if (!gc) | |
55fe14ab | 34 | return -ENOMEM; |
a3b8d4a5 | 35 | |
55fe14ab AS |
36 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
37 | dat = devm_ioremap_resource(&pdev->dev, res); | |
38 | if (IS_ERR(dat)) | |
39 | return PTR_ERR(dat); | |
40 | ||
41 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); | |
42 | dir = devm_ioremap_resource(&pdev->dev, res); | |
43 | if (IS_ERR(dir)) | |
44 | return PTR_ERR(dir); | |
45 | ||
46 | switch (id) { | |
47 | case 3: | |
48 | /* PORTD is inverted logic for direction register */ | |
0f4630f3 | 49 | err = bgpio_init(gc, &pdev->dev, 1, dat, NULL, NULL, |
55fe14ab AS |
50 | NULL, dir, 0); |
51 | break; | |
52 | default: | |
0f4630f3 | 53 | err = bgpio_init(gc, &pdev->dev, 1, dat, NULL, NULL, |
55fe14ab AS |
54 | dir, NULL, 0); |
55 | break; | |
56 | } | |
a3b8d4a5 | 57 | |
55fe14ab AS |
58 | if (err) |
59 | return err; | |
a3b8d4a5 | 60 | |
55fe14ab AS |
61 | switch (id) { |
62 | case 4: | |
63 | /* PORTE is 3 lines only */ | |
0f4630f3 | 64 | gc->ngpio = 3; |
55fe14ab AS |
65 | break; |
66 | default: | |
67 | break; | |
68 | } | |
d6a2fa04 | 69 | |
1bdb5c8e | 70 | gc->base = -1; |
0f4630f3 LW |
71 | gc->owner = THIS_MODULE; |
72 | platform_set_drvdata(pdev, gc); | |
d6a2fa04 | 73 | |
da9d6700 | 74 | return devm_gpiochip_add_data(&pdev->dev, gc, NULL); |
d6a2fa04 AS |
75 | } |
76 | ||
e8b49e07 | 77 | static const struct of_device_id __maybe_unused clps711x_gpio_ids[] = { |
1a4d458b | 78 | { .compatible = "cirrus,ep7209-gpio" }, |
a180132f AS |
79 | { } |
80 | }; | |
81 | MODULE_DEVICE_TABLE(of, clps711x_gpio_ids); | |
82 | ||
55fe14ab AS |
83 | static struct platform_driver clps711x_gpio_driver = { |
84 | .driver = { | |
a180132f | 85 | .name = "clps711x-gpio", |
e8b49e07 | 86 | .of_match_table = of_match_ptr(clps711x_gpio_ids), |
55fe14ab AS |
87 | }, |
88 | .probe = clps711x_gpio_probe, | |
a3b8d4a5 | 89 | }; |
55fe14ab | 90 | module_platform_driver(clps711x_gpio_driver); |
a3b8d4a5 | 91 | |
55fe14ab | 92 | MODULE_LICENSE("GPL"); |
a3b8d4a5 AS |
93 | MODULE_AUTHOR("Alexander Shiyan <[email protected]>"); |
94 | MODULE_DESCRIPTION("CLPS711X GPIO driver"); | |
21708c99 | 95 | MODULE_ALIAS("platform:clps711x-gpio"); |