diff options
author | sfking@fdwdc.com <sfking@fdwdc.com> | 2009-06-19 21:11:00 -0400 |
---|---|---|
committer | Greg Ungerer <gerg@uclinux.org> | 2009-09-09 22:01:22 -0400 |
commit | af39bb8b07af83b579c90c09ba3943123cdb4132 (patch) | |
tree | 8c1965a7a7d6ba09344549410e3ee476af8ffb1d /arch/m68knommu | |
parent | 74fca6a42863ffacaf7ba6f1936a9f228950f657 (diff) |
core generic GPIO support for Freescale Coldfire processors.
This adds the basic infrastructure used by all of the different Coldfire CPUs.
Signed-off-by: Steven King <sfking@fdwdc.com>
Signed-off-by: Greg Ungerer <gerg@uclinux.org>
Diffstat (limited to 'arch/m68knommu')
-rw-r--r-- | arch/m68knommu/Kconfig | 6 | ||||
-rw-r--r-- | arch/m68knommu/platform/coldfire/Makefile | 1 | ||||
-rw-r--r-- | arch/m68knommu/platform/coldfire/gpio.c | 127 | ||||
-rw-r--r-- | arch/m68knommu/platform/coldfire/pinmux.c | 28 |
4 files changed, 162 insertions, 0 deletions
diff --git a/arch/m68knommu/Kconfig b/arch/m68knommu/Kconfig index 534376299a99..e2201b90aa22 100644 --- a/arch/m68knommu/Kconfig +++ b/arch/m68knommu/Kconfig | |||
@@ -47,6 +47,10 @@ config GENERIC_FIND_NEXT_BIT | |||
47 | bool | 47 | bool |
48 | default y | 48 | default y |
49 | 49 | ||
50 | config GENERIC_GPIO | ||
51 | bool | ||
52 | default n | ||
53 | |||
50 | config GENERIC_HWEIGHT | 54 | config GENERIC_HWEIGHT |
51 | bool | 55 | bool |
52 | default y | 56 | default y |
@@ -182,6 +186,8 @@ config M527x | |||
182 | config COLDFIRE | 186 | config COLDFIRE |
183 | bool | 187 | bool |
184 | depends on (M5206 || M5206e || M520x || M523x || M5249 || M527x || M5272 || M528x || M5307 || M532x || M5407) | 188 | depends on (M5206 || M5206e || M520x || M523x || M5249 || M527x || M5272 || M528x || M5307 || M532x || M5407) |
189 | select GENERIC_GPIO | ||
190 | select ARCH_REQUIRE_GPIOLIB | ||
185 | default y | 191 | default y |
186 | 192 | ||
187 | config CLOCK_SET | 193 | config CLOCK_SET |
diff --git a/arch/m68knommu/platform/coldfire/Makefile b/arch/m68knommu/platform/coldfire/Makefile index 1bcb9372353f..2667323c7fee 100644 --- a/arch/m68knommu/platform/coldfire/Makefile +++ b/arch/m68knommu/platform/coldfire/Makefile | |||
@@ -27,4 +27,5 @@ obj-$(CONFIG_M5307) += timers.o | |||
27 | obj-$(CONFIG_M532x) += timers.o | 27 | obj-$(CONFIG_M532x) += timers.o |
28 | obj-$(CONFIG_M5407) += timers.o | 28 | obj-$(CONFIG_M5407) += timers.o |
29 | 29 | ||
30 | obj-y += pinmux.o gpio.o | ||
30 | extra-y := head.o | 31 | extra-y := head.o |
diff --git a/arch/m68knommu/platform/coldfire/gpio.c b/arch/m68knommu/platform/coldfire/gpio.c new file mode 100644 index 000000000000..ff0045793450 --- /dev/null +++ b/arch/m68knommu/platform/coldfire/gpio.c | |||
@@ -0,0 +1,127 @@ | |||
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/init.h> | ||
18 | #include <linux/sysdev.h> | ||
19 | |||
20 | #include <asm/gpio.h> | ||
21 | #include <asm/pinmux.h> | ||
22 | #include <asm/mcfgpio.h> | ||
23 | |||
24 | #define MCF_CHIP(chip) container_of(chip, struct mcf_gpio_chip, gpio_chip) | ||
25 | |||
26 | int mcf_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | ||
27 | { | ||
28 | unsigned long flags; | ||
29 | MCFGPIO_PORTTYPE dir; | ||
30 | struct mcf_gpio_chip *mcf_chip = MCF_CHIP(chip); | ||
31 | |||
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); | ||
37 | |||
38 | return 0; | ||
39 | } | ||
40 | |||
41 | int mcf_gpio_get_value(struct gpio_chip *chip, unsigned offset) | ||
42 | { | ||
43 | struct mcf_gpio_chip *mcf_chip = MCF_CHIP(chip); | ||
44 | |||
45 | return mcfgpio_read(mcf_chip->ppdr) & mcfgpio_bit(chip->base + offset); | ||
46 | } | ||
47 | |||
48 | int mcf_gpio_direction_output(struct gpio_chip *chip, unsigned offset, | ||
49 | int value) | ||
50 | { | ||
51 | unsigned long flags; | ||
52 | MCFGPIO_PORTTYPE data; | ||
53 | struct mcf_gpio_chip *mcf_chip = MCF_CHIP(chip); | ||
54 | |||
55 | local_irq_save(flags); | ||
56 | /* write the value to the output latch */ | ||
57 | data = mcfgpio_read(mcf_chip->podr); | ||
58 | if (value) | ||
59 | data |= mcfgpio_bit(chip->base + offset); | ||
60 | else | ||
61 | data &= ~mcfgpio_bit(chip->base + offset); | ||
62 | mcfgpio_write(data, mcf_chip->podr); | ||
63 | |||
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); | ||
69 | |||
70 | return 0; | ||
71 | } | ||
72 | |||
73 | void mcf_gpio_set_value(struct gpio_chip *chip, unsigned offset, int value) | ||
74 | { | ||
75 | struct mcf_gpio_chip *mcf_chip = MCF_CHIP(chip); | ||
76 | |||
77 | unsigned long flags; | ||
78 | MCFGPIO_PORTTYPE data; | ||
79 | |||
80 | local_irq_save(flags); | ||
81 | data = mcfgpio_read(mcf_chip->podr); | ||
82 | if (value) | ||
83 | data |= mcfgpio_bit(chip->base + offset); | ||
84 | else | ||
85 | data &= ~mcfgpio_bit(chip->base + offset); | ||
86 | mcfgpio_write(data, mcf_chip->podr); | ||
87 | local_irq_restore(flags); | ||
88 | } | ||
89 | |||
90 | void mcf_gpio_set_value_fast(struct gpio_chip *chip, unsigned offset, int value) | ||
91 | { | ||
92 | struct mcf_gpio_chip *mcf_chip = MCF_CHIP(chip); | ||
93 | |||
94 | if (value) | ||
95 | mcfgpio_write(mcfgpio_bit(chip->base + offset), mcf_chip->setr); | ||
96 | else | ||
97 | mcfgpio_write(~mcfgpio_bit(chip->base + offset), mcf_chip->clrr); | ||
98 | } | ||
99 | |||
100 | int mcf_gpio_request(struct gpio_chip *chip, unsigned offset) | ||
101 | { | ||
102 | struct mcf_gpio_chip *mcf_chip = MCF_CHIP(chip); | ||
103 | |||
104 | return mcf_chip->gpio_to_pinmux ? | ||
105 | mcf_pinmux_request(mcf_chip->gpio_to_pinmux[offset], 0) : 0; | ||
106 | } | ||
107 | |||
108 | void mcf_gpio_free(struct gpio_chip *chip, unsigned offset) | ||
109 | { | ||
110 | struct mcf_gpio_chip *mcf_chip = MCF_CHIP(chip); | ||
111 | |||
112 | mcf_gpio_direction_input(chip, offset); | ||
113 | |||
114 | if (mcf_chip->gpio_to_pinmux) | ||
115 | mcf_pinmux_release(mcf_chip->gpio_to_pinmux[offset], 0); | ||
116 | } | ||
117 | |||
118 | struct sysdev_class mcf_gpio_sysclass = { | ||
119 | .name = "gpio", | ||
120 | }; | ||
121 | |||
122 | static int __init mcf_gpio_sysinit(void) | ||
123 | { | ||
124 | return sysdev_class_register(&mcf_gpio_sysclass); | ||
125 | } | ||
126 | |||
127 | core_initcall(mcf_gpio_sysinit); | ||
diff --git a/arch/m68knommu/platform/coldfire/pinmux.c b/arch/m68knommu/platform/coldfire/pinmux.c new file mode 100644 index 000000000000..8c62b825939f --- /dev/null +++ b/arch/m68knommu/platform/coldfire/pinmux.c | |||
@@ -0,0 +1,28 @@ | |||
1 | /* | ||
2 | * Coldfire generic GPIO pinmux 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 | |||
17 | #include <linux/kernel.h> | ||
18 | |||
19 | #include <asm/pinmux.h> | ||
20 | |||
21 | int mcf_pinmux_request(unsigned pinmux, unsigned func) | ||
22 | { | ||
23 | return 0; | ||
24 | } | ||
25 | |||
26 | void mcf_pinmux_release(unsigned pinmux, unsigned func) | ||
27 | { | ||
28 | } | ||