m68knommu: introduce macros to simplify ColdFire GPIO table initialization
[profile/ivi/kernel-x86-ivi.git] / arch / m68k / include / asm / mcfgpio.h
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 #ifndef mcfgpio_h
17 #define mcfgpio_h
18
19 #include <linux/io.h>
20 #include <asm-generic/gpio.h>
21
22 struct mcf_gpio_chip {
23         struct gpio_chip gpio_chip;
24         void __iomem *pddr;
25         void __iomem *podr;
26         void __iomem *ppdr;
27         void __iomem *setr;
28         void __iomem *clrr;
29         const u8 *gpio_to_pinmux;
30 };
31
32 int mcf_gpio_direction_input(struct gpio_chip *, unsigned);
33 int mcf_gpio_get_value(struct gpio_chip *, unsigned);
34 int mcf_gpio_direction_output(struct gpio_chip *, unsigned, int);
35 void mcf_gpio_set_value(struct gpio_chip *, unsigned, int);
36 void mcf_gpio_set_value_fast(struct gpio_chip *, unsigned, int);
37 int mcf_gpio_request(struct gpio_chip *, unsigned);
38 void mcf_gpio_free(struct gpio_chip *, unsigned);
39
40 /*
41  *      Define macros to ease the pain of setting up the GPIO tables. There
42  *      are two cases we need to deal with here, they cover all currently
43  *      available ColdFire GPIO hardware. There are of course minor differences
44  *      in the layout and number of bits in each ColdFire part, but the macros
45  *      take all that in.
46  *
47  *      Firstly is the conventional GPIO registers where we toggle individual
48  *      bits in a register, preserving the other bits in the register. For
49  *      lack of a better term I have called this the slow method.
50  */
51 #define MCFGPS(mlabel, mbase, mngpio, mpddr, mpodr, mppdr)                  \
52         {                                                                   \
53                 .gpio_chip                      = {                         \
54                         .label                  = #mlabel,                  \
55                         .request                = mcf_gpio_request,         \
56                         .free                   = mcf_gpio_free,            \
57                         .direction_input        = mcf_gpio_direction_input, \
58                         .direction_output       = mcf_gpio_direction_output,\
59                         .get                    = mcf_gpio_get_value,       \
60                         .set                    = mcf_gpio_set_value,       \
61                         .base                   = mbase,                    \
62                         .ngpio                  = mngpio,                   \
63                 },                                                          \
64                 .pddr           = (void __iomem *) mpddr,                   \
65                 .podr           = (void __iomem *) mpodr,                   \
66                 .ppdr           = (void __iomem *) mppdr,                   \
67         }
68
69 /*
70  *      Secondly is the faster case, where we have set and clear registers
71  *      that allow us to set or clear a bit with a single write, not having
72  *      to worry about preserving other bits.
73  */
74 #define MCFGPF(mlabel, mbase, mngpio)                                       \
75         {                                                                   \
76                 .gpio_chip                      = {                         \
77                         .label                  = #mlabel,                  \
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,  \
84                         .base                   = mbase,                    \
85                         .ngpio                  = mngpio,                   \
86                 },                                                          \
87                 .pddr           = (void __iomem *) MCFGPIO_PDDR_##mlabel,   \
88                 .podr           = (void __iomem *) MCFGPIO_PODR_##mlabel,   \
89                 .ppdr           = (void __iomem *) MCFGPIO_PPDSDR_##mlabel, \
90                 .setr           = (void __iomem *) MCFGPIO_PPDSDR_##mlabel, \
91                 .clrr           = (void __iomem *) MCFGPIO_PCLRR_##mlabel,  \
92         }
93
94 #endif