linux/arch/m68k/include/asm/gpio.h
<<
>>
Prefs
   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