Loading...
Note: File does not exist in v6.13.7.
1/*
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/module.h>
18#include <linux/init.h>
19#include <linux/device.h>
20
21#include <linux/io.h>
22#include <asm/coldfire.h>
23#include <asm/mcfsim.h>
24#include <asm/mcfgpio.h>
25
26int __mcfgpio_get_value(unsigned gpio)
27{
28 return mcfgpio_read(__mcfgpio_ppdr(gpio)) & mcfgpio_bit(gpio);
29}
30EXPORT_SYMBOL(__mcfgpio_get_value);
31
32void __mcfgpio_set_value(unsigned gpio, int value)
33{
34 if (gpio < MCFGPIO_SCR_START) {
35 unsigned long flags;
36 MCFGPIO_PORTTYPE data;
37
38 local_irq_save(flags);
39 data = mcfgpio_read(__mcfgpio_podr(gpio));
40 if (value)
41 data |= mcfgpio_bit(gpio);
42 else
43 data &= ~mcfgpio_bit(gpio);
44 mcfgpio_write(data, __mcfgpio_podr(gpio));
45 local_irq_restore(flags);
46 } else {
47 if (value)
48 mcfgpio_write(mcfgpio_bit(gpio),
49 MCFGPIO_SETR_PORT(gpio));
50 else
51 mcfgpio_write(~mcfgpio_bit(gpio),
52 MCFGPIO_CLRR_PORT(gpio));
53 }
54}
55EXPORT_SYMBOL(__mcfgpio_set_value);
56
57int __mcfgpio_direction_input(unsigned gpio)
58{
59 unsigned long flags;
60 MCFGPIO_PORTTYPE dir;
61
62 local_irq_save(flags);
63 dir = mcfgpio_read(__mcfgpio_pddr(gpio));
64 dir &= ~mcfgpio_bit(gpio);
65 mcfgpio_write(dir, __mcfgpio_pddr(gpio));
66 local_irq_restore(flags);
67
68 return 0;
69}
70EXPORT_SYMBOL(__mcfgpio_direction_input);
71
72int __mcfgpio_direction_output(unsigned gpio, int value)
73{
74 unsigned long flags;
75 MCFGPIO_PORTTYPE data;
76
77 local_irq_save(flags);
78 data = mcfgpio_read(__mcfgpio_pddr(gpio));
79 if (value)
80 data |= mcfgpio_bit(gpio);
81 else
82 data &= mcfgpio_bit(gpio);
83 mcfgpio_write(data, __mcfgpio_pddr(gpio));
84
85 /* now set the data to output */
86 if (gpio < MCFGPIO_SCR_START) {
87 data = mcfgpio_read(__mcfgpio_podr(gpio));
88 if (value)
89 data |= mcfgpio_bit(gpio);
90 else
91 data &= ~mcfgpio_bit(gpio);
92 mcfgpio_write(data, __mcfgpio_podr(gpio));
93 } else {
94 if (value)
95 mcfgpio_write(mcfgpio_bit(gpio),
96 MCFGPIO_SETR_PORT(gpio));
97 else
98 mcfgpio_write(~mcfgpio_bit(gpio),
99 MCFGPIO_CLRR_PORT(gpio));
100 }
101 local_irq_restore(flags);
102 return 0;
103}
104EXPORT_SYMBOL(__mcfgpio_direction_output);
105
106int __mcfgpio_request(unsigned gpio)
107{
108 return 0;
109}
110EXPORT_SYMBOL(__mcfgpio_request);
111
112void __mcfgpio_free(unsigned gpio)
113{
114 __mcfgpio_direction_input(gpio);
115}
116EXPORT_SYMBOL(__mcfgpio_free);
117
118#ifdef CONFIG_GPIOLIB
119
120int mcfgpio_direction_input(struct gpio_chip *chip, unsigned offset)
121{
122 return __mcfgpio_direction_input(offset);
123}
124
125int mcfgpio_get_value(struct gpio_chip *chip, unsigned offset)
126{
127 return __mcfgpio_get_value(offset);
128}
129
130int mcfgpio_direction_output(struct gpio_chip *chip, unsigned offset, int value)
131{
132 return __mcfgpio_direction_output(offset, value);
133}
134
135void mcfgpio_set_value(struct gpio_chip *chip, unsigned offset, int value)
136{
137 __mcfgpio_set_value(offset, value);
138}
139
140int mcfgpio_request(struct gpio_chip *chip, unsigned offset)
141{
142 return __mcfgpio_request(offset);
143}
144
145void mcfgpio_free(struct gpio_chip *chip, unsigned offset)
146{
147 __mcfgpio_free(offset);
148}
149
150struct bus_type mcfgpio_subsys = {
151 .name = "gpio",
152 .dev_name = "gpio",
153};
154
155static struct gpio_chip mcfgpio_chip = {
156 .label = "mcfgpio",
157 .request = mcfgpio_request,
158 .free = mcfgpio_free,
159 .direction_input = mcfgpio_direction_input,
160 .direction_output = mcfgpio_direction_output,
161 .get = mcfgpio_get_value,
162 .set = mcfgpio_set_value,
163 .base = 0,
164 .ngpio = MCFGPIO_PIN_MAX,
165};
166
167static int __init mcfgpio_sysinit(void)
168{
169 gpiochip_add(&mcfgpio_chip);
170 return subsys_system_register(&mcfgpio_subsys, NULL);
171}
172
173core_initcall(mcfgpio_sysinit);
174#endif