* [PATCH] gpio: ge: Convert to platform driver
@ 2014-03-30 5:14 Alexander Shiyan
2014-04-02 9:41 ` Alexandre Courbot
2014-04-10 16:30 ` Linus Walleij
0 siblings, 2 replies; 5+ messages in thread
From: Alexander Shiyan @ 2014-03-30 5:14 UTC (permalink / raw)
To: linux-gpio
Cc: Alexandre Courbot, Linus Walleij, linuxppc-dev, Alexander Shiyan
This patch converts GE I/O FPGA GPIO driver to platform driver.
Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
---
Only compile tested.
---
drivers/gpio/gpio-ge.c | 176 ++++++++++++++++---------------------------------
1 file changed, 58 insertions(+), 118 deletions(-)
diff --git a/drivers/gpio/gpio-ge.c b/drivers/gpio/gpio-ge.c
index 7b95a4a..93efb29 100644
--- a/drivers/gpio/gpio-ge.c
+++ b/drivers/gpio/gpio-ge.c
@@ -18,15 +18,9 @@
*/
#include <linux/kernel.h>
-#include <linux/compiler.h>
-#include <linux/init.h>
#include <linux/io.h>
-#include <linux/of.h>
#include <linux/of_device.h>
-#include <linux/of_platform.h>
#include <linux/of_gpio.h>
-#include <linux/gpio.h>
-#include <linux/slab.h>
#include <linux/module.h>
#define GEF_GPIO_DIRECT 0x00
@@ -39,28 +33,28 @@
#define GEF_GPIO_OVERRUN 0x1C
#define GEF_GPIO_MODE 0x20
-static void _gef_gpio_set(void __iomem *reg, unsigned int offset, int value)
+static void gef_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
{
+ struct of_mm_gpio_chip *mmchip = to_of_mm_gpio_chip(chip);
unsigned int data;
- data = ioread32be(reg);
+ data = ioread32be(mmchip->regs + GEF_GPIO_OUT);
/* value: 0=low; 1=high */
- if (value & 0x1)
- data = data | (0x1 << offset);
+ if (value)
+ data = data | BIT(offset);
else
- data = data & ~(0x1 << offset);
+ data = data & ~BIT(offset);
- iowrite32be(data, reg);
+ iowrite32be(data, mmchip->regs + GEF_GPIO_OUT);
}
-
static int gef_gpio_dir_in(struct gpio_chip *chip, unsigned offset)
{
unsigned int data;
struct of_mm_gpio_chip *mmchip = to_of_mm_gpio_chip(chip);
data = ioread32be(mmchip->regs + GEF_GPIO_DIRECT);
- data = data | (0x1 << offset);
+ data = data | BIT(offset);
iowrite32be(data, mmchip->regs + GEF_GPIO_DIRECT);
return 0;
@@ -71,11 +65,11 @@ static int gef_gpio_dir_out(struct gpio_chip *chip, unsigned offset, int value)
unsigned int data;
struct of_mm_gpio_chip *mmchip = to_of_mm_gpio_chip(chip);
- /* Set direction before switching to input */
- _gef_gpio_set(mmchip->regs + GEF_GPIO_OUT, offset, value);
+ /* Set value before switching to output */
+ gef_gpio_set(mmchip->regs + GEF_GPIO_OUT, offset, value);
data = ioread32be(mmchip->regs + GEF_GPIO_DIRECT);
- data = data & ~(0x1 << offset);
+ data = data & ~BIT(offset);
iowrite32be(data, mmchip->regs + GEF_GPIO_DIRECT);
return 0;
@@ -83,116 +77,62 @@ static int gef_gpio_dir_out(struct gpio_chip *chip, unsigned offset, int value)
static int gef_gpio_get(struct gpio_chip *chip, unsigned offset)
{
- unsigned int data;
- int state = 0;
struct of_mm_gpio_chip *mmchip = to_of_mm_gpio_chip(chip);
- data = ioread32be(mmchip->regs + GEF_GPIO_IN);
- state = (int)((data >> offset) & 0x1);
-
- return state;
+ return !!(ioread32be(mmchip->regs + GEF_GPIO_IN) & BIT(offset));
}
-static void gef_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
+static const struct of_device_id gef_gpio_ids[] = {
+ {
+ .compatible = "gef,sbc610-gpio",
+ .data = (void *)19,
+ }, {
+ .compatible = "gef,sbc310-gpio",
+ .data = (void *)6,
+ }, {
+ .compatible = "ge,imp3a-gpio",
+ .data = (void *)16,
+ },
+ { }
+};
+MODULE_DEVICE_TABLE(of, gef_gpio_ids);
+
+static int gef_gpio_probe(struct platform_device *pdev)
{
- struct of_mm_gpio_chip *mmchip = to_of_mm_gpio_chip(chip);
+ const struct of_device_id *of_id =
+ of_match_device(gef_gpio_ids, &pdev->dev);
+ struct of_mm_gpio_chip *mmchip;
- _gef_gpio_set(mmchip->regs + GEF_GPIO_OUT, offset, value);
-}
+ if (!of_id)
+ return -ENOSYS;
-static int __init gef_gpio_init(void)
-{
- struct device_node *np;
- int retval;
- struct of_mm_gpio_chip *gef_gpio_chip;
-
- for_each_compatible_node(np, NULL, "gef,sbc610-gpio") {
-
- pr_debug("%s: Initialising GEF GPIO\n", np->full_name);
-
- /* Allocate chip structure */
- gef_gpio_chip = kzalloc(sizeof(*gef_gpio_chip), GFP_KERNEL);
- if (!gef_gpio_chip) {
- pr_err("%s: Unable to allocate structure\n",
- np->full_name);
- continue;
- }
-
- /* Setup pointers to chip functions */
- gef_gpio_chip->gc.of_gpio_n_cells = 2;
- gef_gpio_chip->gc.ngpio = 19;
- gef_gpio_chip->gc.direction_input = gef_gpio_dir_in;
- gef_gpio_chip->gc.direction_output = gef_gpio_dir_out;
- gef_gpio_chip->gc.get = gef_gpio_get;
- gef_gpio_chip->gc.set = gef_gpio_set;
-
- /* This function adds a memory mapped GPIO chip */
- retval = of_mm_gpiochip_add(np, gef_gpio_chip);
- if (retval) {
- kfree(gef_gpio_chip);
- pr_err("%s: Unable to add GPIO\n", np->full_name);
- }
- }
-
- for_each_compatible_node(np, NULL, "gef,sbc310-gpio") {
-
- pr_debug("%s: Initialising GEF GPIO\n", np->full_name);
-
- /* Allocate chip structure */
- gef_gpio_chip = kzalloc(sizeof(*gef_gpio_chip), GFP_KERNEL);
- if (!gef_gpio_chip) {
- pr_err("%s: Unable to allocate structure\n",
- np->full_name);
- continue;
- }
-
- /* Setup pointers to chip functions */
- gef_gpio_chip->gc.of_gpio_n_cells = 2;
- gef_gpio_chip->gc.ngpio = 6;
- gef_gpio_chip->gc.direction_input = gef_gpio_dir_in;
- gef_gpio_chip->gc.direction_output = gef_gpio_dir_out;
- gef_gpio_chip->gc.get = gef_gpio_get;
- gef_gpio_chip->gc.set = gef_gpio_set;
-
- /* This function adds a memory mapped GPIO chip */
- retval = of_mm_gpiochip_add(np, gef_gpio_chip);
- if (retval) {
- kfree(gef_gpio_chip);
- pr_err("%s: Unable to add GPIO\n", np->full_name);
- }
- }
-
- for_each_compatible_node(np, NULL, "ge,imp3a-gpio") {
-
- pr_debug("%s: Initialising GE GPIO\n", np->full_name);
-
- /* Allocate chip structure */
- gef_gpio_chip = kzalloc(sizeof(*gef_gpio_chip), GFP_KERNEL);
- if (!gef_gpio_chip) {
- pr_err("%s: Unable to allocate structure\n",
- np->full_name);
- continue;
- }
-
- /* Setup pointers to chip functions */
- gef_gpio_chip->gc.of_gpio_n_cells = 2;
- gef_gpio_chip->gc.ngpio = 16;
- gef_gpio_chip->gc.direction_input = gef_gpio_dir_in;
- gef_gpio_chip->gc.direction_output = gef_gpio_dir_out;
- gef_gpio_chip->gc.get = gef_gpio_get;
- gef_gpio_chip->gc.set = gef_gpio_set;
-
- /* This function adds a memory mapped GPIO chip */
- retval = of_mm_gpiochip_add(np, gef_gpio_chip);
- if (retval) {
- kfree(gef_gpio_chip);
- pr_err("%s: Unable to add GPIO\n", np->full_name);
- }
- }
+ mmchip = devm_kzalloc(&pdev->dev, sizeof(*mmchip), GFP_KERNEL);
+ if (!mmchip)
+ return -ENOMEM;
- return 0;
+ /* Setup pointers to chip functions */
+ mmchip->gc.ngpio = (u16)(uintptr_t)of_id->data;
+ mmchip->gc.of_gpio_n_cells = 2;
+ mmchip->gc.direction_input = gef_gpio_dir_in;
+ mmchip->gc.direction_output = gef_gpio_dir_out;
+ mmchip->gc.get = gef_gpio_get;
+ mmchip->gc.set = gef_gpio_set;
+
+ platform_set_drvdata(pdev, mmchip);
+
+ /* This function adds a memory mapped GPIO chip */
+ return of_mm_gpiochip_add(pdev->dev.of_node, mmchip);
+};
+
+static struct platform_driver gef_gpio_driver = {
+ .driver = {
+ .name = "gef-gpio",
+ .owner = THIS_MODULE,
+ .of_match_table = gef_gpio_ids,
+ },
+ .probe = gef_gpio_probe,
};
-arch_initcall(gef_gpio_init);
+module_platform_driver(gef_gpio_driver);
MODULE_DESCRIPTION("GE I/O FPGA GPIO driver");
MODULE_AUTHOR("Martyn Welch <martyn.welch@ge.com");
--
1.8.3.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] gpio: ge: Convert to platform driver
2014-03-30 5:14 [PATCH] gpio: ge: Convert to platform driver Alexander Shiyan
@ 2014-04-02 9:41 ` Alexandre Courbot
2014-04-02 10:13 ` Alexander Shiyan
2014-04-10 16:30 ` Linus Walleij
1 sibling, 1 reply; 5+ messages in thread
From: Alexandre Courbot @ 2014-04-02 9:41 UTC (permalink / raw)
To: Alexander Shiyan; +Cc: linux-gpio@vger.kernel.org, Linus Walleij, linuxppc-dev
On Sun, Mar 30, 2014 at 2:14 PM, Alexander Shiyan <shc_work@mail.ru> wrote:
> This patch converts GE I/O FPGA GPIO driver to platform driver.
>
> Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
> ---
> Only compile tested.
Could we get a couple of Tested-by by people who can try this patch?
It greatly simplifies the driver, but we need to make sure it doesn't
break anything before going further...
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] gpio: ge: Convert to platform driver
2014-04-02 9:41 ` Alexandre Courbot
@ 2014-04-02 10:13 ` Alexander Shiyan
0 siblings, 0 replies; 5+ messages in thread
From: Alexander Shiyan @ 2014-04-02 10:13 UTC (permalink / raw)
To: Alexandre Courbot; +Cc: linux-gpio@vger.kernel.org, Linus Walleij, linuxppc-dev
V2VkLCAyIEFwciAyMDE0IDE4OjQxOjU1ICswOTAwINC+0YIgQWxleGFuZHJlIENvdXJib3QgPGdu
dXJvdUBnbWFpbC5jb20+Ogo+IE9uIFN1biwgTWFyIDMwLCAyMDE0IGF0IDI6MTQgUE0sIEFsZXhh
bmRlciBTaGl5YW4gPHNoY193b3JrQG1haWwucnU+IHdyb3RlOgo+ID4gVGhpcyBwYXRjaCBjb252
ZXJ0cyBHRSBJL08gRlBHQSBHUElPIGRyaXZlciB0byBwbGF0Zm9ybSBkcml2ZXIuCj4gPgo+ID4g
U2lnbmVkLW9mZi1ieTogQWxleGFuZGVyIFNoaXlhbiA8c2hjX3dvcmtAbWFpbC5ydT4KPiA+IC0t
LQo+ID4gT25seSBjb21waWxlIHRlc3RlZC4KPiAKPiBDb3VsZCB3ZSBnZXQgYSBjb3VwbGUgb2Yg
VGVzdGVkLWJ5IGJ5IHBlb3BsZSB3aG8gY2FuIHRyeSB0aGlzIHBhdGNoPwo+IEl0IGdyZWF0bHkg
c2ltcGxpZmllcyB0aGUgZHJpdmVyLCBidXQgd2UgbmVlZCB0byBtYWtlIHN1cmUgaXQgZG9lc24n
dAo+IGJyZWFrIGFueXRoaW5nIGJlZm9yZSBnb2luZyBmdXJ0aGVyLi4uCgpZZWFoLCBJJ20gd2Fp
dCBmb3IgdGhpcyB0b28uIEluIGFueSBjYXNlLCBJIHdhbnQgdG8gc3VibWl0IHYyIGEgYml0IGxh
dGVyLgoKLS0tCgo=
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] gpio: ge: Convert to platform driver
2014-03-30 5:14 [PATCH] gpio: ge: Convert to platform driver Alexander Shiyan
2014-04-02 9:41 ` Alexandre Courbot
@ 2014-04-10 16:30 ` Linus Walleij
2014-04-10 16:37 ` Alexander Shiyan
1 sibling, 1 reply; 5+ messages in thread
From: Linus Walleij @ 2014-04-10 16:30 UTC (permalink / raw)
To: Alexander Shiyan
Cc: linux-gpio@vger.kernel.org, linuxppc-dev@lists.ozlabs.org list,
Alexandre Courbot
On Sun, Mar 30, 2014 at 7:14 AM, Alexander Shiyan <shc_work@mail.ru> wrote:
> This patch converts GE I/O FPGA GPIO driver to platform driver.
>
> Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
> ---
> Only compile tested.
Isn't it necessary to also patch affected platforms to add this
device either as platform device or in their device trees?
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] gpio: ge: Convert to platform driver
2014-04-10 16:30 ` Linus Walleij
@ 2014-04-10 16:37 ` Alexander Shiyan
0 siblings, 0 replies; 5+ messages in thread
From: Alexander Shiyan @ 2014-04-10 16:37 UTC (permalink / raw)
To: Linus Walleij
Cc: linux-gpio@vger.kernel.org, linuxppc-dev@lists.ozlabs.org list,
Alexandre Courbot
VGh1LCAxMCBBcHIgMjAxNCAxODozMDoxNiArMDIwMCDQvtGCIExpbnVzIFdhbGxlaWogPGxpbnVz
LndhbGxlaWpAbGluYXJvLm9yZz46Cj4gT24gU3VuLCBNYXIgMzAsIDIwMTQgYXQgNzoxNCBBTSwg
QWxleGFuZGVyIFNoaXlhbiA8c2hjX3dvcmtAbWFpbC5ydT4gd3JvdGU6Cj4gCj4gPiBUaGlzIHBh
dGNoIGNvbnZlcnRzIEdFIEkvTyBGUEdBIEdQSU8gZHJpdmVyIHRvIHBsYXRmb3JtIGRyaXZlci4K
PiA+Cj4gPiBTaWduZWQtb2ZmLWJ5OiBBbGV4YW5kZXIgU2hpeWFuIDxzaGNfd29ya0BtYWlsLnJ1
Pgo+ID4gLS0tCj4gPiBPbmx5IGNvbXBpbGUgdGVzdGVkLgo+IAo+IElzbid0IGl0IG5lY2Vzc2Fy
eSB0byBhbHNvIHBhdGNoIGFmZmVjdGVkIHBsYXRmb3JtcyB0byBhZGQgdGhpcwo+IGRldmljZSBl
aXRoZXIgYXMgcGxhdGZvcm0gZGV2aWNlIG9yIGluIHRoZWlyIGRldmljZSB0cmVlcz8KClRoZSBk
ZXZpY2UgaXMgYWxyZWFkeSBpbiB0aGUgdHJlZSwgYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlKi5k
dHMgZm9yIGV4YW1wbGUuCkluIGFueSBjYXNlLCBhcyBJIGhhdmUgc2FpZCwgSSB3aWxsIGRvIGEg
c2Vjb25kIHZlcnNpb24sIGFzIHRoaXMgY29udGFpbnMgc29tZQppbmNvbnNpc3RlbmNpZXMuCgot
LS0KCg==
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-04-10 16:42 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-03-30 5:14 [PATCH] gpio: ge: Convert to platform driver Alexander Shiyan
2014-04-02 9:41 ` Alexandre Courbot
2014-04-02 10:13 ` Alexander Shiyan
2014-04-10 16:30 ` Linus Walleij
2014-04-10 16:37 ` Alexander Shiyan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).