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 coldfire_gpio_h 17#define coldfire_gpio_h 18 19#include <linux/io.h> 20#include <asm/coldfire.h> 21#include <asm/mcfsim.h> 22#include <asm/mcfgpio.h> 23/* 24 * The Generic GPIO functions 25 * 26 * If the gpio is a compile time constant and is one of the Coldfire gpios, 27 * use the inline version, otherwise dispatch thru gpiolib. 28 */ 29 30static inline int gpio_get_value(unsigned gpio) 31{ 32 if (__builtin_constant_p(gpio) && gpio < MCFGPIO_PIN_MAX) 33 return mcfgpio_read(__mcfgpio_ppdr(gpio)) & mcfgpio_bit(gpio); 34 else 35 return __gpio_get_value(gpio); 36} 37 38static inline void gpio_set_value(unsigned gpio, int value) 39{ 40 if (__builtin_constant_p(gpio) && gpio < MCFGPIO_PIN_MAX) { 41 if (gpio < MCFGPIO_SCR_START) { 42 unsigned long flags; 43 MCFGPIO_PORTTYPE data; 44 45 local_irq_save(flags); 46 data = mcfgpio_read(__mcfgpio_podr(gpio)); 47 if (value) 48 data |= mcfgpio_bit(gpio); 49 else 50 data &= ~mcfgpio_bit(gpio); 51 mcfgpio_write(data, __mcfgpio_podr(gpio)); 52 local_irq_restore(flags); 53 } else { 54 if (value) 55 mcfgpio_write(mcfgpio_bit(gpio), 56 MCFGPIO_SETR_PORT(gpio)); 57 else 58 mcfgpio_write(~mcfgpio_bit(gpio), 59 MCFGPIO_CLRR_PORT(gpio)); 60 } 61 } else 62 __gpio_set_value(gpio, value); 63} 64 65static inline int gpio_to_irq(unsigned gpio) 66{ 67#if defined(MCFGPIO_IRQ_MIN) 68 if ((gpio >= MCFGPIO_IRQ_MIN) && (gpio < MCFGPIO_IRQ_MAX)) 69#else 70 if (gpio < MCFGPIO_IRQ_MAX) 71#endif 72 return gpio + MCFGPIO_IRQ_VECBASE; 73 else 74 return __gpio_to_irq(gpio); 75} 76 77static inline int irq_to_gpio(unsigned irq) 78{ 79 return (irq >= MCFGPIO_IRQ_VECBASE && 80 irq < (MCFGPIO_IRQ_VECBASE + MCFGPIO_IRQ_MAX)) ? 81 irq - MCFGPIO_IRQ_VECBASE : -ENXIO; 82} 83 84static inline int gpio_cansleep(unsigned gpio) 85{ 86 return gpio < MCFGPIO_PIN_MAX ? 0 : __gpio_cansleep(gpio); 87} 88 89#ifndef CONFIG_GPIOLIB 90static inline int gpio_request_one(unsigned gpio, unsigned long flags, const char *label) 91{ 92 int err; 93 94 err = gpio_request(gpio, label); 95 if (err) 96 return err; 97 98 if (flags & GPIOF_DIR_IN) 99 err = gpio_direction_input(gpio); 100 else 101 err = gpio_direction_output(gpio, 102 (flags & GPIOF_INIT_HIGH) ? 1 : 0); 103 104 if (err) 105 gpio_free(gpio); 106 107 return err; 108} 109#endif /* !CONFIG_GPIOLIB */ 110#endif 111