linux/arch/mips/include/asm/mach-au1x00/gpio-au1300.h
<<
>>
Prefs
   1/*
   2 * gpio-au1300.h -- GPIO control for Au1300 GPIC and compatibles.
   3 *
   4 * Copyright (c) 2009-2011 Manuel Lauss <manuel.lauss@googlemail.com>
   5 */
   6
   7#ifndef _GPIO_AU1300_H_
   8#define _GPIO_AU1300_H_
   9
  10#include <asm/addrspace.h>
  11#include <asm/io.h>
  12#include <asm/mach-au1x00/au1000.h>
  13
  14struct gpio;
  15struct gpio_chip;
  16
  17/* with the current GPIC design, up to 128 GPIOs are possible.
  18 * The only implementation so far is in the Au1300, which has 75 externally
  19 * available GPIOs.
  20 */
  21#define AU1300_GPIO_BASE        0
  22#define AU1300_GPIO_NUM         75
  23#define AU1300_GPIO_MAX         (AU1300_GPIO_BASE + AU1300_GPIO_NUM - 1)
  24
  25#define AU1300_GPIC_ADDR        \
  26        (void __iomem *)KSEG1ADDR(AU1300_GPIC_PHYS_ADDR)
  27
  28static inline int au1300_gpio_get_value(unsigned int gpio)
  29{
  30        void __iomem *roff = AU1300_GPIC_ADDR;
  31        int bit;
  32
  33        gpio -= AU1300_GPIO_BASE;
  34        roff += GPIC_GPIO_BANKOFF(gpio);
  35        bit = GPIC_GPIO_TO_BIT(gpio);
  36        return __raw_readl(roff + AU1300_GPIC_PINVAL) & bit;
  37}
  38
  39static inline int au1300_gpio_direction_input(unsigned int gpio)
  40{
  41        void __iomem *roff = AU1300_GPIC_ADDR;
  42        unsigned long bit;
  43
  44        gpio -= AU1300_GPIO_BASE;
  45
  46        roff += GPIC_GPIO_BANKOFF(gpio);
  47        bit = GPIC_GPIO_TO_BIT(gpio);
  48        __raw_writel(bit, roff + AU1300_GPIC_DEVCLR);
  49        wmb();
  50
  51        return 0;
  52}
  53
  54static inline int au1300_gpio_set_value(unsigned int gpio, int v)
  55{
  56        void __iomem *roff = AU1300_GPIC_ADDR;
  57        unsigned long bit;
  58
  59        gpio -= AU1300_GPIO_BASE;
  60
  61        roff += GPIC_GPIO_BANKOFF(gpio);
  62        bit = GPIC_GPIO_TO_BIT(gpio);
  63        __raw_writel(bit, roff + (v ? AU1300_GPIC_PINVAL
  64                                    : AU1300_GPIC_PINVALCLR));
  65        wmb();
  66
  67        return 0;
  68}
  69
  70static inline int au1300_gpio_direction_output(unsigned int gpio, int v)
  71{
  72        /* hw switches to output automatically */
  73        return au1300_gpio_set_value(gpio, v);
  74}
  75
  76static inline int au1300_gpio_to_irq(unsigned int gpio)
  77{
  78        return AU1300_FIRST_INT + (gpio - AU1300_GPIO_BASE);
  79}
  80
  81static inline int au1300_irq_to_gpio(unsigned int irq)
  82{
  83        return (irq - AU1300_FIRST_INT) + AU1300_GPIO_BASE;
  84}
  85
  86static inline int au1300_gpio_is_valid(unsigned int gpio)
  87{
  88        int ret;
  89
  90        switch (alchemy_get_cputype()) {
  91        case ALCHEMY_CPU_AU1300:
  92                ret = ((gpio >= AU1300_GPIO_BASE) && (gpio <= AU1300_GPIO_MAX));
  93                break;
  94        default:
  95                ret = 0;
  96        }
  97        return ret;
  98}
  99
 100static inline int au1300_gpio_cansleep(unsigned int gpio)
 101{
 102        return 0;
 103}
 104
 105/* hardware remembers gpio 0-63 levels on powerup */
 106static inline int au1300_gpio_getinitlvl(unsigned int gpio)
 107{
 108        void __iomem *roff = AU1300_GPIC_ADDR;
 109        unsigned long v;
 110
 111        if (unlikely(gpio > 63))
 112                return 0;
 113        else if (gpio > 31) {
 114                gpio -= 32;
 115                roff += 4;
 116        }
 117
 118        v = __raw_readl(roff + AU1300_GPIC_RSTVAL);
 119        return (v >> gpio) & 1;
 120}
 121
 122/**********************************************************************/
 123
 124/* Linux gpio framework integration.
 125*
 126* 4 use cases of Alchemy GPIOS:
 127*(1) GPIOLIB=y, ALCHEMY_GPIO_INDIRECT=y:
 128*       Board must register gpiochips.
 129*(2) GPIOLIB=y, ALCHEMY_GPIO_INDIRECT=n:
 130*       A gpiochip for the 75 GPIOs is registered.
 131*
 132*(3) GPIOLIB=n, ALCHEMY_GPIO_INDIRECT=y:
 133*       the boards' gpio.h must provide the linux gpio wrapper functions,
 134*
 135*(4) GPIOLIB=n, ALCHEMY_GPIO_INDIRECT=n:
 136*       inlinable gpio functions are provided which enable access to the
 137*       Au1300 gpios only by using the numbers straight out of the data-
 138*       sheets.
 139
 140* Cases 1 and 3 are intended for boards which want to provide their own
 141* GPIO namespace and -operations (i.e. for example you have 8 GPIOs
 142* which are in part provided by spare Au1300 GPIO pins and in part by
 143* an external FPGA but you still want them to be accessible in linux
 144* as gpio0-7. The board can of course use the alchemy_gpioX_* functions
 145* as required).
 146*/
 147
 148#ifndef CONFIG_GPIOLIB
 149
 150#ifdef CONFIG_ALCHEMY_GPIOINT_AU1300
 151
 152#ifndef CONFIG_ALCHEMY_GPIO_INDIRECT    /* case (4) */
 153
 154static inline int gpio_direction_input(unsigned int gpio)
 155{
 156        return au1300_gpio_direction_input(gpio);
 157}
 158
 159static inline int gpio_direction_output(unsigned int gpio, int v)
 160{
 161        return au1300_gpio_direction_output(gpio, v);
 162}
 163
 164static inline int gpio_get_value(unsigned int gpio)
 165{
 166        return au1300_gpio_get_value(gpio);
 167}
 168
 169static inline void gpio_set_value(unsigned int gpio, int v)
 170{
 171        au1300_gpio_set_value(gpio, v);
 172}
 173
 174static inline int gpio_get_value_cansleep(unsigned gpio)
 175{
 176        return gpio_get_value(gpio);
 177}
 178
 179static inline void gpio_set_value_cansleep(unsigned gpio, int value)
 180{
 181        gpio_set_value(gpio, value);
 182}
 183
 184static inline int gpio_is_valid(unsigned int gpio)
 185{
 186        return au1300_gpio_is_valid(gpio);
 187}
 188
 189static inline int gpio_cansleep(unsigned int gpio)
 190{
 191        return au1300_gpio_cansleep(gpio);
 192}
 193
 194static inline int gpio_to_irq(unsigned int gpio)
 195{
 196        return au1300_gpio_to_irq(gpio);
 197}
 198
 199static inline int irq_to_gpio(unsigned int irq)
 200{
 201        return au1300_irq_to_gpio(irq);
 202}
 203
 204static inline int gpio_request(unsigned int gpio, const char *label)
 205{
 206        return 0;
 207}
 208
 209static inline int gpio_request_one(unsigned gpio,
 210                                        unsigned long flags, const char *label)
 211{
 212        return 0;
 213}
 214
 215static inline int gpio_request_array(struct gpio *array, size_t num)
 216{
 217        return 0;
 218}
 219
 220static inline void gpio_free(unsigned gpio)
 221{
 222}
 223
 224static inline void gpio_free_array(struct gpio *array, size_t num)
 225{
 226}
 227
 228static inline int gpio_set_debounce(unsigned gpio, unsigned debounce)
 229{
 230        return -ENOSYS;
 231}
 232
 233static inline void gpio_unexport(unsigned gpio)
 234{
 235}
 236
 237static inline int gpio_export(unsigned gpio, bool direction_may_change)
 238{
 239        return -ENOSYS;
 240}
 241
 242static inline int gpio_sysfs_set_active_low(unsigned gpio, int value)
 243{
 244        return -ENOSYS;
 245}
 246
 247static inline int gpio_export_link(struct device *dev, const char *name,
 248                                   unsigned gpio)
 249{
 250        return -ENOSYS;
 251}
 252
 253#endif  /* !CONFIG_ALCHEMY_GPIO_INDIRECT */
 254
 255#endif  /* CONFIG_ALCHEMY_GPIOINT_AU1300 */
 256
 257#endif  /* CONFIG GPIOLIB */
 258
 259#endif /* _GPIO_AU1300_H_ */
 260