blob: 9bcc3e4b60c582950a9e8698bb63b883452d56b5 [file] [log] [blame]
sfking@fdwdc.comafde8562009-06-19 18:11:03 -07001/*
2 * Coldfire generic GPIO support
3 *
4 * (C) Copyright 2009, Steven King <sfking@fdwdc.com>
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; version 2 of the License.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14*/
15
16#include <linux/kernel.h>
17#include <linux/init.h>
18
19#include <asm/coldfire.h>
20#include <asm/mcfsim.h>
21#include <asm/mcfgpio.h>
22
23static struct mcf_gpio_chip mcf_gpio_chips[] = {
24 {
25 .gpio_chip = {
26 .label = "PIRQ",
27 .request = mcf_gpio_request,
28 .free = mcf_gpio_free,
29 .direction_input = mcf_gpio_direction_input,
30 .direction_output = mcf_gpio_direction_output,
31 .get = mcf_gpio_get_value,
32 .set = mcf_gpio_set_value,
33 .ngpio = 8,
34 },
Greg Ungerer9516de42011-03-09 08:59:35 +100035 .pddr = (void __iomem *) MCFEPORT_EPDDR,
36 .podr = (void __iomem *) MCFEPORT_EPDR,
37 .ppdr = (void __iomem *) MCFEPORT_EPPDR,
sfking@fdwdc.comafde8562009-06-19 18:11:03 -070038 },
39 {
40 .gpio_chip = {
sfking@fdwdc.comafde8562009-06-19 18:11:03 -070041 .label = "CS",
42 .request = mcf_gpio_request,
43 .free = mcf_gpio_free,
44 .direction_input = mcf_gpio_direction_input,
45 .direction_output = mcf_gpio_direction_output,
46 .get = mcf_gpio_get_value,
47 .set = mcf_gpio_set_value_fast,
Peter Turczak89127ed2011-08-09 14:11:19 +100048 .base = 9,
sfking@fdwdc.comafde8562009-06-19 18:11:03 -070049 .ngpio = 3,
50 },
Greg Ungerer9516de42011-03-09 08:59:35 +100051 .pddr = (void __iomem *) MCFGPIO_PDDR_CS,
52 .podr = (void __iomem *) MCFGPIO_PODR_CS,
53 .ppdr = (void __iomem *) MCFGPIO_PPDSDR_CS,
54 .setr = (void __iomem *) MCFGPIO_PPDSDR_CS,
55 .clrr = (void __iomem *) MCFGPIO_PCLRR_CS,
sfking@fdwdc.comafde8562009-06-19 18:11:03 -070056 },
57 {
58 .gpio_chip = {
59 .label = "FECI2C",
60 .request = mcf_gpio_request,
61 .free = mcf_gpio_free,
62 .direction_input = mcf_gpio_direction_input,
63 .direction_output = mcf_gpio_direction_output,
64 .get = mcf_gpio_get_value,
65 .set = mcf_gpio_set_value_fast,
Peter Turczak89127ed2011-08-09 14:11:19 +100066 .base = 16,
sfking@fdwdc.comafde8562009-06-19 18:11:03 -070067 .ngpio = 4,
68 },
Greg Ungerer9516de42011-03-09 08:59:35 +100069 .pddr = (void __iomem *) MCFGPIO_PDDR_FECI2C,
70 .podr = (void __iomem *) MCFGPIO_PODR_FECI2C,
71 .ppdr = (void __iomem *) MCFGPIO_PPDSDR_FECI2C,
72 .setr = (void __iomem *) MCFGPIO_PPDSDR_FECI2C,
73 .clrr = (void __iomem *) MCFGPIO_PCLRR_FECI2C,
sfking@fdwdc.comafde8562009-06-19 18:11:03 -070074 },
75 {
76 .gpio_chip = {
77 .label = "QSPI",
78 .request = mcf_gpio_request,
79 .free = mcf_gpio_free,
80 .direction_input = mcf_gpio_direction_input,
81 .direction_output = mcf_gpio_direction_output,
82 .get = mcf_gpio_get_value,
83 .set = mcf_gpio_set_value_fast,
Peter Turczak89127ed2011-08-09 14:11:19 +100084 .base = 24,
sfking@fdwdc.comafde8562009-06-19 18:11:03 -070085 .ngpio = 4,
86 },
Greg Ungerer9516de42011-03-09 08:59:35 +100087 .pddr = (void __iomem *) MCFGPIO_PDDR_QSPI,
88 .podr = (void __iomem *) MCFGPIO_PODR_QSPI,
89 .ppdr = (void __iomem *) MCFGPIO_PPDSDR_QSPI,
90 .setr = (void __iomem *) MCFGPIO_PPDSDR_QSPI,
91 .clrr = (void __iomem *) MCFGPIO_PCLRR_QSPI,
sfking@fdwdc.comafde8562009-06-19 18:11:03 -070092 },
93 {
94 .gpio_chip = {
95 .label = "TIMER",
96 .request = mcf_gpio_request,
97 .free = mcf_gpio_free,
98 .direction_input = mcf_gpio_direction_input,
99 .direction_output = mcf_gpio_direction_output,
100 .get = mcf_gpio_get_value,
101 .set = mcf_gpio_set_value_fast,
Peter Turczak89127ed2011-08-09 14:11:19 +1000102 .base = 32,
sfking@fdwdc.comafde8562009-06-19 18:11:03 -0700103 .ngpio = 4,
104 },
Greg Ungerer9516de42011-03-09 08:59:35 +1000105 .pddr = (void __iomem *) MCFGPIO_PDDR_TIMER,
106 .podr = (void __iomem *) MCFGPIO_PODR_TIMER,
107 .ppdr = (void __iomem *) MCFGPIO_PPDSDR_TIMER,
108 .setr = (void __iomem *) MCFGPIO_PPDSDR_TIMER,
109 .clrr = (void __iomem *) MCFGPIO_PCLRR_TIMER,
sfking@fdwdc.comafde8562009-06-19 18:11:03 -0700110 },
111 {
112 .gpio_chip = {
113 .label = "UART",
114 .request = mcf_gpio_request,
115 .free = mcf_gpio_free,
116 .direction_input = mcf_gpio_direction_input,
117 .direction_output = mcf_gpio_direction_output,
118 .get = mcf_gpio_get_value,
119 .set = mcf_gpio_set_value_fast,
Peter Turczak89127ed2011-08-09 14:11:19 +1000120 .base = 40,
sfking@fdwdc.comafde8562009-06-19 18:11:03 -0700121 .ngpio = 8,
122 },
Greg Ungerer9516de42011-03-09 08:59:35 +1000123 .pddr = (void __iomem *) MCFGPIO_PDDR_UART,
124 .podr = (void __iomem *) MCFGPIO_PODR_UART,
125 .ppdr = (void __iomem *) MCFGPIO_PPDSDR_UART,
126 .setr = (void __iomem *) MCFGPIO_PPDSDR_UART,
127 .clrr = (void __iomem *) MCFGPIO_PCLRR_UART,
sfking@fdwdc.comafde8562009-06-19 18:11:03 -0700128 },
129 {
130 .gpio_chip = {
131 .label = "FECH",
132 .request = mcf_gpio_request,
133 .free = mcf_gpio_free,
134 .direction_input = mcf_gpio_direction_input,
135 .direction_output = mcf_gpio_direction_output,
136 .get = mcf_gpio_get_value,
137 .set = mcf_gpio_set_value_fast,
Peter Turczak89127ed2011-08-09 14:11:19 +1000138 .base = 48,
sfking@fdwdc.comafde8562009-06-19 18:11:03 -0700139 .ngpio = 8,
140 },
Greg Ungerer9516de42011-03-09 08:59:35 +1000141 .pddr = (void __iomem *) MCFGPIO_PDDR_FECH,
142 .podr = (void __iomem *) MCFGPIO_PODR_FECH,
143 .ppdr = (void __iomem *) MCFGPIO_PPDSDR_FECH,
144 .setr = (void __iomem *) MCFGPIO_PPDSDR_FECH,
145 .clrr = (void __iomem *) MCFGPIO_PCLRR_FECH,
sfking@fdwdc.comafde8562009-06-19 18:11:03 -0700146 },
147 {
148 .gpio_chip = {
149 .label = "FECL",
150 .request = mcf_gpio_request,
151 .free = mcf_gpio_free,
152 .direction_input = mcf_gpio_direction_input,
153 .direction_output = mcf_gpio_direction_output,
154 .get = mcf_gpio_get_value,
155 .set = mcf_gpio_set_value_fast,
Peter Turczak89127ed2011-08-09 14:11:19 +1000156 .base = 56,
sfking@fdwdc.comafde8562009-06-19 18:11:03 -0700157 .ngpio = 8,
158 },
Greg Ungerer9516de42011-03-09 08:59:35 +1000159 .pddr = (void __iomem *) MCFGPIO_PDDR_FECL,
160 .podr = (void __iomem *) MCFGPIO_PODR_FECL,
161 .ppdr = (void __iomem *) MCFGPIO_PPDSDR_FECL,
162 .setr = (void __iomem *) MCFGPIO_PPDSDR_FECL,
163 .clrr = (void __iomem *) MCFGPIO_PCLRR_FECL,
sfking@fdwdc.comafde8562009-06-19 18:11:03 -0700164 },
165};
166
167static int __init mcf_gpio_init(void)
168{
169 unsigned i = 0;
170 while (i < ARRAY_SIZE(mcf_gpio_chips))
171 (void)gpiochip_add((struct gpio_chip *)&mcf_gpio_chips[i++]);
172 return 0;
173}
174
175core_initcall(mcf_gpio_init);