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 95