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/init.h>
18 #include <linux/sysdev.h>
21 #include <asm/pinmux.h>
22 #include <asm/mcfgpio.h>
24 #define MCF_CHIP(chip) container_of(chip, struct mcf_gpio_chip, gpio_chip)
26 int mcf_gpio_direction_input(struct gpio_chip
*chip
, unsigned offset
)
30 struct mcf_gpio_chip
*mcf_chip
= MCF_CHIP(chip
);
32 local_irq_save(flags
);
33 dir
= mcfgpio_read(mcf_chip
->pddr
);
34 dir
&= ~mcfgpio_bit(chip
->base
+ offset
);
35 mcfgpio_write(dir
, mcf_chip
->pddr
);
36 local_irq_restore(flags
);
41 int mcf_gpio_get_value(struct gpio_chip
*chip
, unsigned offset
)
43 struct mcf_gpio_chip
*mcf_chip
= MCF_CHIP(chip
);
45 return mcfgpio_read(mcf_chip
->ppdr
) & mcfgpio_bit(chip
->base
+ offset
);
48 int mcf_gpio_direction_output(struct gpio_chip
*chip
, unsigned offset
,
52 MCFGPIO_PORTTYPE data
;
53 struct mcf_gpio_chip
*mcf_chip
= MCF_CHIP(chip
);
55 local_irq_save(flags
);
56 /* write the value to the output latch */
57 data
= mcfgpio_read(mcf_chip
->podr
);
59 data
|= mcfgpio_bit(chip
->base
+ offset
);
61 data
&= ~mcfgpio_bit(chip
->base
+ offset
);
62 mcfgpio_write(data
, mcf_chip
->podr
);
64 /* now set the direction to output */
65 data
= mcfgpio_read(mcf_chip
->pddr
);
66 data
|= mcfgpio_bit(chip
->base
+ offset
);
67 mcfgpio_write(data
, mcf_chip
->pddr
);
68 local_irq_restore(flags
);
73 void mcf_gpio_set_value(struct gpio_chip
*chip
, unsigned offset
, int value
)
75 struct mcf_gpio_chip
*mcf_chip
= MCF_CHIP(chip
);
78 MCFGPIO_PORTTYPE data
;
80 local_irq_save(flags
);
81 data
= mcfgpio_read(mcf_chip
->podr
);
83 data
|= mcfgpio_bit(chip
->base
+ offset
);
85 data
&= ~mcfgpio_bit(chip
->base
+ offset
);
86 mcfgpio_write(data
, mcf_chip
->podr
);
87 local_irq_restore(flags
);
90 void mcf_gpio_set_value_fast(struct gpio_chip
*chip
, unsigned offset
, int value
)
92 struct mcf_gpio_chip
*mcf_chip
= MCF_CHIP(chip
);
95 mcfgpio_write(mcfgpio_bit(chip
->base
+ offset
), mcf_chip
->setr
);
97 mcfgpio_write(~mcfgpio_bit(chip
->base
+ offset
), mcf_chip
->clrr
);
100 int mcf_gpio_request(struct gpio_chip
*chip
, unsigned offset
)
102 struct mcf_gpio_chip
*mcf_chip
= MCF_CHIP(chip
);
104 return mcf_chip
->gpio_to_pinmux
?
105 mcf_pinmux_request(mcf_chip
->gpio_to_pinmux
[offset
], 0) : 0;
108 void mcf_gpio_free(struct gpio_chip
*chip
, unsigned offset
)
110 struct mcf_gpio_chip
*mcf_chip
= MCF_CHIP(chip
);
112 mcf_gpio_direction_input(chip
, offset
);
114 if (mcf_chip
->gpio_to_pinmux
)
115 mcf_pinmux_release(mcf_chip
->gpio_to_pinmux
[offset
], 0);
118 struct sysdev_class mcf_gpio_sysclass
= {
122 static int __init
mcf_gpio_sysinit(void)
124 return sysdev_class_register(&mcf_gpio_sysclass
);
127 core_initcall(mcf_gpio_sysinit
);