lkml.org 
[lkml]   [2007]   [Jan]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    SubjectRe: [patch 2.6.20-rc1 4/6] PXA GPIO wrappers
    Date
    For the list archives:  here's the latest version of this.
    The signed-off-by discussion is offlist right now, so this
    version has none; see what eventually merges.

    From: Philipp Zabel <philipp.zabel@gmail.com>

    Arch-neutral GPIO calls for PXA.


    Index: pxa/include/asm-arm/arch-pxa/gpio.h
    ===================================================================
    --- /dev/null 1970-01-01 00:00:00.000000000 +0000
    +++ pxa/include/asm-arm/arch-pxa/gpio.h 2007-01-01 11:23:43.000000000 -0800
    @@ -0,0 +1,97 @@
    +/*
    + * linux/include/asm-arm/arch-pxa/gpio.h
    + *
    + * PXA GPIO wrappers for arch-neutral GPIO calls
    + *
    + * Written by Philipp Zabel <philipp.zabel@gmail.com>
    + *
    + * This program is free software; you can redistribute it and/or modify
    + * it under the terms of the GNU General Public License as published by
    + * the Free Software Foundation; either version 2 of the License, or
    + * (at your option) any later version.
    + *
    + * This program is distributed in the hope that it will be useful,
    + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    + * GNU General Public License for more details.
    + *
    + * You should have received a copy of the GNU General Public License
    + * along with this program; if not, write to the Free Software
    + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    + *
    + */
    +
    +#ifndef __ASM_ARCH_PXA_GPIO_H
    +#define __ASM_ARCH_PXA_GPIO_H
    +
    +#include <asm/errno.h>
    +#include <asm/hardware.h>
    +#include <asm/irq.h>
    +
    +#include <asm/arch/pxa-regs.h>
    +
    +static inline int gpio_get_value(unsigned gpio);
    +static inline void gpio_set_value(unsigned gpio, int value);
    +
    +#include <asm-generic/gpio.h> /* cansleep wrappers */
    +
    +static inline int gpio_request(unsigned gpio, const char *label)
    +{
    + return 0;
    +}
    +
    +static inline void gpio_free(unsigned gpio)
    +{
    + return;
    +}
    +
    +static inline int gpio_direction_input(unsigned gpio)
    +{
    + return pxa_gpio_mode(gpio | GPIO_IN);
    +}
    +
    +static inline int gpio_direction_output(unsigned gpio)
    +{
    + return pxa_gpio_mode(gpio | GPIO_OUT);
    +}
    +
    +static inline int __gpio_get_value(unsigned gpio)
    +{
    + return GPLR(gpio) & GPIO_bit(gpio);
    +}
    +
    +static inline int gpio_get_value(unsigned gpio)
    +{
    + if (__builtin_constant_p(gpio))
    + return __gpio_get_value(gpio);
    + else
    + pxa_gpio_get_value(gpio);
    +}
    +
    +static inline void __gpio_set_value(unsigned gpio, int value)
    +{
    + if (value)
    + GPSR(gpio) = GPIO_bit(gpio);
    + else
    + GPCR(gpio) = GPIO_bit(gpio);
    +}
    +
    +static inline void gpio_set_value(unsigned gpio, int value)
    +{
    + if (__builtin_constant_p(gpio))
    + __gpio_set_value(gpio, value);
    + else
    + pxa_gpio_set_value(gpio, value);
    +}
    +
    +static inline int gpio_to_irq(unsigned gpio)
    +{
    + if (gpio <= PXA_LAST_GPIO)
    + return IRQ_GPIO(gpio);
    + return -EINVAL;
    +}
    +
    +#define irq_to_gpio(irq) IRQ_TO_GPIO(irq)
    +
    +
    +#endif
    Index: pxa/arch/arm/mach-pxa/generic.c
    ===================================================================
    --- pxa.orig/arch/arm/mach-pxa/generic.c 2006-12-31 17:03:59.000000000 -0800
    +++ pxa/arch/arm/mach-pxa/generic.c 2006-12-31 17:08:37.000000000 -0800
    @@ -36,6 +36,7 @@
    #include <asm/mach/map.h>

    #include <asm/arch/pxa-regs.h>
    +#include <asm/arch/gpio.h>
    #include <asm/arch/udc.h>
    #include <asm/arch/pxafb.h>
    #include <asm/arch/mmc.h>
    @@ -104,13 +105,16 @@ unsigned long long sched_clock(void)
    * Handy function to set GPIO alternate functions
    */

    -void pxa_gpio_mode(int gpio_mode)
    +int pxa_gpio_mode(int gpio_mode)
    {
    unsigned long flags;
    int gpio = gpio_mode & GPIO_MD_MASK_NR;
    int fn = (gpio_mode & GPIO_MD_MASK_FN) >> 8;
    int gafr;

    + if (gpio > PXA_LAST_GPIO)
    + return -EINVAL;
    +
    local_irq_save(flags);
    if (gpio_mode & GPIO_DFLT_LOW)
    GPCR(gpio) = GPIO_bit(gpio);
    @@ -123,11 +127,33 @@ void pxa_gpio_mode(int gpio_mode)
    gafr = GAFR(gpio) & ~(0x3 << (((gpio) & 0xf)*2));
    GAFR(gpio) = gafr | (fn << (((gpio) & 0xf)*2));
    local_irq_restore(flags);
    +
    + return 0;
    }

    EXPORT_SYMBOL(pxa_gpio_mode);

    /*
    + * Return GPIO level
    + */
    +int pxa_gpio_get_value(unsigned gpio)
    +{
    + return __gpio_get_value(gpio);
    +}
    +
    +EXPORT_SYMBOL(pxa_gpio_get_value);
    +
    +/*
    + * Set output GPIO level
    + */
    +void pxa_gpio_set_value(unsigned gpio, int value)
    +{
    + __gpio_set_value(gpio, value);
    +}
    +
    +EXPORT_SYMBOL(pxa_gpio_set_value);
    +
    +/*
    * Routine to safely enable or disable a clock in the CKEN
    */
    void pxa_set_cken(int clock, int enable)
    Index: pxa/include/asm-arm/arch-pxa/hardware.h
    ===================================================================
    --- pxa.orig/include/asm-arm/arch-pxa/hardware.h 2006-12-31 17:03:59.000000000 -0800
    +++ pxa/include/asm-arm/arch-pxa/hardware.h 2006-12-31 17:08:37.000000000 -0800
    @@ -65,7 +65,17 @@
    /*
    * Handy routine to set GPIO alternate functions
    */
    -extern void pxa_gpio_mode( int gpio_mode );
    +extern int pxa_gpio_mode( int gpio_mode );
    +
    +/*
    + * Return GPIO level, nonzero means high, zero is low
    + */
    +extern int pxa_gpio_get_value(unsigned gpio);
    +
    +/*
    + * Set output GPIO level
    + */
    +extern void pxa_gpio_set_value(unsigned gpio, int value);

    /*
    * Routine to enable or disable CKEN
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2007-01-01 21:19    [W:3.623 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site