Blame view

drivers/gpio/gpio-ge.c 2.72 KB
965dc5fc5   Martyn Welch   powerpc/86xx: Bas...
1
  /*
948e78c3f   Martyn Welch   powerpc/86xx: Ren...
2
   * Driver for GE FPGA based GPIO
965dc5fc5   Martyn Welch   powerpc/86xx: Bas...
3
   *
948e78c3f   Martyn Welch   powerpc/86xx: Ren...
4
   * Author: Martyn Welch <martyn.welch@ge.com>
965dc5fc5   Martyn Welch   powerpc/86xx: Bas...
5
   *
948e78c3f   Martyn Welch   powerpc/86xx: Ren...
6
   * 2008 (c) GE Intelligent Platforms Embedded Systems, Inc.
965dc5fc5   Martyn Welch   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   Martyn Welch   gpio: Move GE GPI...
17
   * the I/O interrupt controllers mask to stop them propergating
965dc5fc5   Martyn Welch   powerpc/86xx: Bas...
18
19
20
   */
  
  #include <linux/kernel.h>
965dc5fc5   Martyn Welch   powerpc/86xx: Bas...
21
  #include <linux/io.h>
a0b66e3f5   Kamlakant Patel   gpio: ge: fix com...
22
  #include <linux/slab.h>
965dc5fc5   Martyn Welch   powerpc/86xx: Bas...
23
  #include <linux/of_device.h>
965dc5fc5   Martyn Welch   powerpc/86xx: Bas...
24
  #include <linux/of_gpio.h>
866010fb7   Kamlakant Patel   gpio: ge: convert...
25
  #include <linux/of_address.h>
7dfe293cf   Paul Gortmaker   powerpc: Fix up m...
26
  #include <linux/module.h>
0f4630f37   Linus Walleij   gpio: generic: fa...
27
  #include <linux/gpio/driver.h>
965dc5fc5   Martyn Welch   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   Alexander Shiyan   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   Martyn Welch   powerpc/86xx: Bas...
52

9dacc6de4   Alexander Shiyan   gpio: ge: Convert...
53
  static int __init gef_gpio_probe(struct platform_device *pdev)
965dc5fc5   Martyn Welch   powerpc/86xx: Bas...
54
  {
9dacc6de4   Alexander Shiyan   gpio: ge: Convert...
55
56
  	const struct of_device_id *of_id =
  		of_match_device(gef_gpio_ids, &pdev->dev);
0f4630f37   Linus Walleij   gpio: generic: fa...
57
  	struct gpio_chip *gc;
866010fb7   Kamlakant Patel   gpio: ge: convert...
58
59
  	void __iomem *regs;
  	int ret;
9dacc6de4   Alexander Shiyan   gpio: ge: Convert...
60

0f4630f37   Linus Walleij   gpio: generic: fa...
61
62
  	gc = devm_kzalloc(&pdev->dev, sizeof(*gc), GFP_KERNEL);
  	if (!gc)
9dacc6de4   Alexander Shiyan   gpio: ge: Convert...
63
  		return -ENOMEM;
866010fb7   Kamlakant Patel   gpio: ge: convert...
64
65
66
  	regs = of_iomap(pdev->dev.of_node, 0);
  	if (!regs)
  		return -ENOMEM;
0f4630f37   Linus Walleij   gpio: generic: fa...
67
  	ret = bgpio_init(gc, &pdev->dev, 4, regs + GEF_GPIO_IN,
866010fb7   Kamlakant Patel   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   Alexander Shiyan   gpio: ge: Convert...
75
  	/* Setup pointers to chip functions */
0f4630f37   Linus Walleij   gpio: generic: fa...
76
  	gc->label = devm_kstrdup(&pdev->dev, pdev->dev.of_node->full_name,
74b18de94   Axel Lin   gpio: ge: Convert...
77
  				     GFP_KERNEL);
0f4630f37   Linus Walleij   gpio: generic: fa...
78
  	if (!gc->label) {
74b18de94   Axel Lin   gpio: ge: Convert...
79
  		ret = -ENOMEM;
866010fb7   Kamlakant Patel   gpio: ge: convert...
80
  		goto err0;
74b18de94   Axel Lin   gpio: ge: Convert...
81
  	}
866010fb7   Kamlakant Patel   gpio: ge: convert...
82

0f4630f37   Linus Walleij   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   Alexander Shiyan   gpio: ge: Convert...
87
88
  
  	/* This function adds a memory mapped GPIO chip */
ad2261ca7   Laxman Dewangan   gpio: ge: Use dev...
89
  	ret = devm_gpiochip_add_data(&pdev->dev, gc, NULL);
866010fb7   Kamlakant Patel   gpio: ge: convert...
90
  	if (ret)
74b18de94   Axel Lin   gpio: ge: Convert...
91
  		goto err0;
866010fb7   Kamlakant Patel   gpio: ge: convert...
92
93
  
  	return 0;
866010fb7   Kamlakant Patel   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   Alexander Shiyan   gpio: ge: Convert...
100
  };
e041013ac   Martyn Welch   powerpc/85xx: Boa...
101

9dacc6de4   Alexander Shiyan   gpio: ge: Convert...
102
103
104
  static struct platform_driver gef_gpio_driver = {
  	.driver = {
  		.name		= "gef-gpio",
9dacc6de4   Alexander Shiyan   gpio: ge: Convert...
105
106
  		.of_match_table	= gef_gpio_ids,
  	},
965dc5fc5   Martyn Welch   powerpc/86xx: Bas...
107
  };
9dacc6de4   Alexander Shiyan   gpio: ge: Convert...
108
  module_platform_driver_probe(gef_gpio_driver, gef_gpio_probe);
965dc5fc5   Martyn Welch   powerpc/86xx: Bas...
109

948e78c3f   Martyn Welch   powerpc/86xx: Ren...
110
111
  MODULE_DESCRIPTION("GE I/O FPGA GPIO driver");
  MODULE_AUTHOR("Martyn Welch <martyn.welch@ge.com");
965dc5fc5   Martyn Welch   powerpc/86xx: Bas...
112
  MODULE_LICENSE("GPL");