Blame view
drivers/gpio/gpio-ge.c
2.72 KB
965dc5fc5 powerpc/86xx: Bas... |
1 |
/* |
948e78c3f powerpc/86xx: Ren... |
2 |
* Driver for GE FPGA based GPIO |
965dc5fc5 powerpc/86xx: Bas... |
3 |
* |
948e78c3f powerpc/86xx: Ren... |
4 |
* Author: Martyn Welch <martyn.welch@ge.com> |
965dc5fc5 powerpc/86xx: Bas... |
5 |
* |
948e78c3f powerpc/86xx: Ren... |
6 |
* 2008 (c) GE Intelligent Platforms Embedded Systems, Inc. |
965dc5fc5 powerpc/86xx: Bas... |
7 8 9 10 11 12 13 14 15 16 |
* * This file is licensed under the terms of the GNU General Public License * version 2. This program is licensed "as is" without any warranty of any * kind, whether express or implied. */ /* TODO * * Configuration of output modes (totem-pole/open-drain) * Interrupt configuration - interrupts are always generated the FPGA relies on |
6518bb69f gpio: Move GE GPI... |
17 |
* the I/O interrupt controllers mask to stop them propergating |
965dc5fc5 powerpc/86xx: Bas... |
18 19 20 |
*/ #include <linux/kernel.h> |
965dc5fc5 powerpc/86xx: Bas... |
21 |
#include <linux/io.h> |
a0b66e3f5 gpio: ge: fix com... |
22 |
#include <linux/slab.h> |
965dc5fc5 powerpc/86xx: Bas... |
23 |
#include <linux/of_device.h> |
965dc5fc5 powerpc/86xx: Bas... |
24 |
#include <linux/of_gpio.h> |
866010fb7 gpio: ge: convert... |
25 |
#include <linux/of_address.h> |
7dfe293cf powerpc: Fix up m... |
26 |
#include <linux/module.h> |
0f4630f37 gpio: generic: fa... |
27 |
#include <linux/gpio/driver.h> |
965dc5fc5 powerpc/86xx: Bas... |
28 29 30 31 32 33 34 35 36 37 |
#define GEF_GPIO_DIRECT 0x00 #define GEF_GPIO_IN 0x04 #define GEF_GPIO_OUT 0x08 #define GEF_GPIO_TRIG 0x0C #define GEF_GPIO_POLAR_A 0x10 #define GEF_GPIO_POLAR_B 0x14 #define GEF_GPIO_INT_STAT 0x18 #define GEF_GPIO_OVERRUN 0x1C #define GEF_GPIO_MODE 0x20 |
9dacc6de4 gpio: ge: Convert... |
38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
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); |
965dc5fc5 powerpc/86xx: Bas... |
52 |
|
9dacc6de4 gpio: ge: Convert... |
53 |
static int __init gef_gpio_probe(struct platform_device *pdev) |
965dc5fc5 powerpc/86xx: Bas... |
54 |
{ |
9dacc6de4 gpio: ge: Convert... |
55 56 |
const struct of_device_id *of_id = of_match_device(gef_gpio_ids, &pdev->dev); |
0f4630f37 gpio: generic: fa... |
57 |
struct gpio_chip *gc; |
866010fb7 gpio: ge: convert... |
58 59 |
void __iomem *regs; int ret; |
9dacc6de4 gpio: ge: Convert... |
60 |
|
0f4630f37 gpio: generic: fa... |
61 62 |
gc = devm_kzalloc(&pdev->dev, sizeof(*gc), GFP_KERNEL); if (!gc) |
9dacc6de4 gpio: ge: Convert... |
63 |
return -ENOMEM; |
866010fb7 gpio: ge: convert... |
64 65 66 |
regs = of_iomap(pdev->dev.of_node, 0); if (!regs) return -ENOMEM; |
0f4630f37 gpio: generic: fa... |
67 |
ret = bgpio_init(gc, &pdev->dev, 4, regs + GEF_GPIO_IN, |
866010fb7 gpio: ge: convert... |
68 69 70 71 72 73 74 |
regs + GEF_GPIO_OUT, NULL, NULL, regs + GEF_GPIO_DIRECT, BGPIOF_BIG_ENDIAN_BYTE_ORDER); if (ret) { dev_err(&pdev->dev, "bgpio_init failed "); goto err0; } |
9dacc6de4 gpio: ge: Convert... |
75 |
/* Setup pointers to chip functions */ |
0f4630f37 gpio: generic: fa... |
76 |
gc->label = devm_kstrdup(&pdev->dev, pdev->dev.of_node->full_name, |
74b18de94 gpio: ge: Convert... |
77 |
GFP_KERNEL); |
0f4630f37 gpio: generic: fa... |
78 |
if (!gc->label) { |
74b18de94 gpio: ge: Convert... |
79 |
ret = -ENOMEM; |
866010fb7 gpio: ge: convert... |
80 |
goto err0; |
74b18de94 gpio: ge: Convert... |
81 |
} |
866010fb7 gpio: ge: convert... |
82 |
|
0f4630f37 gpio: generic: fa... |
83 84 85 86 |
gc->base = -1; gc->ngpio = (u16)(uintptr_t)of_id->data; gc->of_gpio_n_cells = 2; gc->of_node = pdev->dev.of_node; |
9dacc6de4 gpio: ge: Convert... |
87 88 |
/* This function adds a memory mapped GPIO chip */ |
ad2261ca7 gpio: ge: Use dev... |
89 |
ret = devm_gpiochip_add_data(&pdev->dev, gc, NULL); |
866010fb7 gpio: ge: convert... |
90 |
if (ret) |
74b18de94 gpio: ge: Convert... |
91 |
goto err0; |
866010fb7 gpio: ge: convert... |
92 93 |
return 0; |
866010fb7 gpio: ge: convert... |
94 95 96 97 98 99 |
err0: iounmap(regs); pr_err("%s: GPIO chip registration failed ", pdev->dev.of_node->full_name); return ret; |
9dacc6de4 gpio: ge: Convert... |
100 |
}; |
e041013ac powerpc/85xx: Boa... |
101 |
|
9dacc6de4 gpio: ge: Convert... |
102 103 104 |
static struct platform_driver gef_gpio_driver = { .driver = { .name = "gef-gpio", |
9dacc6de4 gpio: ge: Convert... |
105 106 |
.of_match_table = gef_gpio_ids, }, |
965dc5fc5 powerpc/86xx: Bas... |
107 |
}; |
9dacc6de4 gpio: ge: Convert... |
108 |
module_platform_driver_probe(gef_gpio_driver, gef_gpio_probe); |
965dc5fc5 powerpc/86xx: Bas... |
109 |
|
948e78c3f powerpc/86xx: Ren... |
110 111 |
MODULE_DESCRIPTION("GE I/O FPGA GPIO driver"); MODULE_AUTHOR("Martyn Welch <martyn.welch@ge.com"); |
965dc5fc5 powerpc/86xx: Bas... |
112 |
MODULE_LICENSE("GPL"); |