2 * Coldfire generic GPIO support.
4 * (C) Copyright 2009, Steven King <sfking@fdwdc.com>
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.
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.
16 #include <linux/kernel.h>
17 #include <linux/module.h>
18 #include <linux/init.h>
19 #include <linux/device.h>
22 #include <asm/coldfire.h>
23 #include <asm/mcfsim.h>
24 #include <asm/mcfgpio.h>
26 int __mcfgpio_get_value(unsigned gpio
)
28 return mcfgpio_read(__mcfgpio_ppdr(gpio
)) & mcfgpio_bit(gpio
);
30 EXPORT_SYMBOL(__mcfgpio_get_value
);
32 void __mcfgpio_set_value(unsigned gpio
, int value
)
34 if (gpio
< MCFGPIO_SCR_START
) {
36 MCFGPIO_PORTTYPE data
;
38 local_irq_save(flags
);
39 data
= mcfgpio_read(__mcfgpio_podr(gpio
));
41 data
|= mcfgpio_bit(gpio
);
43 data
&= ~mcfgpio_bit(gpio
);
44 mcfgpio_write(data
, __mcfgpio_podr(gpio
));
45 local_irq_restore(flags
);
48 mcfgpio_write(mcfgpio_bit(gpio
),
49 MCFGPIO_SETR_PORT(gpio
));
51 mcfgpio_write(~mcfgpio_bit(gpio
),
52 MCFGPIO_CLRR_PORT(gpio
));
55 EXPORT_SYMBOL(__mcfgpio_set_value
);
57 int __mcfgpio_direction_input(unsigned gpio
)
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
);
70 EXPORT_SYMBOL(__mcfgpio_direction_input
);
72 int __mcfgpio_direction_output(unsigned gpio
, int value
)
75 MCFGPIO_PORTTYPE data
;
77 local_irq_save(flags
);
78 data
= mcfgpio_read(__mcfgpio_pddr(gpio
));
80 data
|= mcfgpio_bit(gpio
);
82 data
&= mcfgpio_bit(gpio
);
83 mcfgpio_write(data
, __mcfgpio_pddr(gpio
));
85 /* now set the data to output */
86 if (gpio
< MCFGPIO_SCR_START
) {
87 data
= mcfgpio_read(__mcfgpio_podr(gpio
));
89 data
|= mcfgpio_bit(gpio
);
91 data
&= ~mcfgpio_bit(gpio
);
92 mcfgpio_write(data
, __mcfgpio_podr(gpio
));
95 mcfgpio_write(mcfgpio_bit(gpio
),
96 MCFGPIO_SETR_PORT(gpio
));
98 mcfgpio_write(~mcfgpio_bit(gpio
),
99 MCFGPIO_CLRR_PORT(gpio
));
101 local_irq_restore(flags
);
104 EXPORT_SYMBOL(__mcfgpio_direction_output
);
106 int __mcfgpio_request(unsigned gpio
)
110 EXPORT_SYMBOL(__mcfgpio_request
);
112 void __mcfgpio_free(unsigned gpio
)
114 __mcfgpio_direction_input(gpio
);
116 EXPORT_SYMBOL(__mcfgpio_free
);
118 #ifdef CONFIG_GPIOLIB
120 int mcfgpio_direction_input(struct gpio_chip
*chip
, unsigned offset
)
122 return __mcfgpio_direction_input(offset
);
125 int mcfgpio_get_value(struct gpio_chip
*chip
, unsigned offset
)
127 return __mcfgpio_get_value(offset
);
130 int mcfgpio_direction_output(struct gpio_chip
*chip
, unsigned offset
, int value
)
132 return __mcfgpio_direction_output(offset
, value
);
135 void mcfgpio_set_value(struct gpio_chip
*chip
, unsigned offset
, int value
)
137 __mcfgpio_set_value(offset
, value
);
140 int mcfgpio_request(struct gpio_chip
*chip
, unsigned offset
)
142 return __mcfgpio_request(offset
);
145 void mcfgpio_free(struct gpio_chip
*chip
, unsigned offset
)
147 __mcfgpio_free(offset
);
150 struct bus_type mcfgpio_subsys
= {
155 static struct gpio_chip mcfgpio_chip
= {
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
,
164 .ngpio
= MCFGPIO_PIN_MAX
,
167 static int __init
mcfgpio_sysinit(void)
169 gpiochip_add(&mcfgpio_chip
);
170 return subsys_system_register(&mcfgpio_subsys
, NULL
);
173 core_initcall(mcfgpio_sysinit
);