lkml.org 
[lkml]   [2011]   [Feb]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [PATCH] msm: gpiomux: Remove GPIOMUX_VALID and merge config enums
    From
    On Fri, Feb 25, 2011 at 12:19 PM, Rohit Vaswani <rvaswani@codeaurora.org> wrote:
    > Remove GPIOMUX_VALID, simplify the API, and absorb the complexity
    > of determining which gpiomux configs are used and which are
    > not back into the gpiomux implementation where it belongs.
    > Allow NULL settings to be represented appropriately.
    > The configuration enumerations represent a single abstraction
    > and were needlessly split. As such, collapse the conflicting
    > abstractions into a consistent one and move the implementation
    > complexity down into the implementation (where it belongs) and
    > away from the interface (where it doesn't belong).
    >
    > Signed-off-by: Rohit Vaswani <rvaswani@codeaurora.org>
    > ---
    >  arch/arm/mach-msm/board-msm7x30.c |   23 +++++++--
    >  arch/arm/mach-msm/board-qsd8x50.c |   17 +++++--
    >  arch/arm/mach-msm/gpiomux-v1.c    |    9 ++-
    >  arch/arm/mach-msm/gpiomux-v1.h    |   59 ----------------------
    >  arch/arm/mach-msm/gpiomux-v2.c    |    8 ++-
    >  arch/arm/mach-msm/gpiomux-v2.h    |   59 ----------------------
    >  arch/arm/mach-msm/gpiomux.c       |   77 +++++++++++++++++-------------
    >  arch/arm/mach-msm/gpiomux.h       |   96
    > +++++++++++++++++++++++-------------
    >  8 files changed, 145 insertions(+), 203 deletions(-)
    >  delete mode 100644 arch/arm/mach-msm/gpiomux-v1.h
    >  delete mode 100644 arch/arm/mach-msm/gpiomux-v2.h
    >
    > diff --git a/arch/arm/mach-msm/board-msm7x30.c
    > b/arch/arm/mach-msm/board-msm7x30.c
    > index 59b91de..4223329 100644
    > --- a/arch/arm/mach-msm/board-msm7x30.c
    > +++ b/arch/arm/mach-msm/board-msm7x30.c
    > @@ -39,8 +39,11 @@
    >  #include "gpiomux.h"
    >  #include "proc_comm.h"
    >
    > -#define UART2_SUSPENDED (GPIOMUX_DRV_2MA | GPIOMUX_PULL_DOWN |\
    > -            GPIOMUX_FUNC_2 | GPIOMUX_VALID)
    > +static struct gpiomux_setting uart2_suspended = {
    > +    .func = GPIOMUX_FUNC_2,
    > +    .drv = GPIOMUX_DRV_2MA,
    > +    .pull = GPIOMUX_PULL_DOWN,
    > +};
    >
    >  extern struct sys_timer msm_timer;
    >
    > @@ -59,19 +62,27 @@ static struct msm_otg_platform_data msm_otg_pdata = {
    >  struct msm_gpiomux_config msm7x30_uart2_configs[] __initdata = {
    >     {
    >         .gpio = 49, /* UART2 RFR */
    > -        .suspended = UART2_SUSPENDED,
    > +        .settings = {
    > +            [GPIOMUX_SUSPENDED] = &uart2_suspended,
    > +        },
    >     },
    >     {
    >         .gpio = 50, /* UART2 CTS */
    > -        .suspended = UART2_SUSPENDED,
    > +        .settings = {
    > +            [GPIOMUX_SUSPENDED] = &uart2_suspended,
    > +        },
    >     },
    >     {
    >         .gpio = 51, /* UART2 RX */
    > -        .suspended = UART2_SUSPENDED,
    > +        .settings = {
    > +            [GPIOMUX_SUSPENDED] = &uart2_suspended,
    > +        },
    >     },
    >     {
    >         .gpio = 52, /* UART2 TX */
    > -        .suspended = UART2_SUSPENDED,
    > +        .settings = {
    > +            [GPIOMUX_SUSPENDED] = &uart2_suspended,
    > +        },
    >     },
    >  };
    >
    > diff --git a/arch/arm/mach-msm/board-qsd8x50.c
    > b/arch/arm/mach-msm/board-qsd8x50.c
    > index 33ab1fe..d665b0e 100644
    > --- a/arch/arm/mach-msm/board-qsd8x50.c
    > +++ b/arch/arm/mach-msm/board-qsd8x50.c
    > @@ -38,19 +38,26 @@
    >  #include "devices.h"
    >  #include "gpiomux.h"
    >
    > -#define UART3_SUSPENDED (GPIOMUX_DRV_2MA | GPIOMUX_PULL_DOWN |\
    > -            GPIOMUX_FUNC_1 | GPIOMUX_VALID)
    > +static struct gpiomux_setting uart3_suspended = {
    > +    .drv = GPIOMUX_DRV_2MA,
    > +    .pull = GPIOMUX_PULL_DOWN,
    > +    .func = GPIOMUX_FUNC_1,
    > +};
    >
    >  extern struct sys_timer msm_timer;
    >
    > -struct msm_gpiomux_config qsd8x50_uart3_configs[] __initdata = {
    > +struct msm_gpiomux_config qsd8x50_uart3_configs[] = {
    >     {
    >         .gpio = 86, /* UART3 RX */
    > -        .suspended = UART3_SUSPENDED,
    > +        .settings = {
    > +            [GPIOMUX_SUSPENDED] = &uart3_suspended,
    > +        },
    >     },
    >     {
    >         .gpio = 87, /* UART3 TX */
    > -        .suspended = UART3_SUSPENDED,
    > +        .settings = {
    > +            [GPIOMUX_SUSPENDED] = &uart3_suspended,
    > +        },
    >     },
    >  };

    I think this new interface is way too verbose and will quickly get
    unwieldy for configurations that have more than a few pins. For
    instance, imagine what the above would look like when muxing a 24bit
    LCD pin list...

    How about adding a "bool valid" to gpiomux_setting, and convert the
    "sets" array to an array of settings and not pointers to settings.
    This will allow us to do (in gpiomux.h):

    struct msm_gpiomux_rec {
     struct gpiomux_setting sets[GPIOMUX_NSETTINGS];
    int ref;
    };
    struct gpiomux_setting {
    enum gpiomux_func func;
    enum gpiomux_drv  drv;
    enum gpiomux_pull pull;
    bool valid;
    };
    This way, I can do something like (very rough):

    #define GPIOMUX_SET(func,drv,pull) { \
    .func = GPIOMUX_##func, \
    .drv = GPIOMUX_##drv, \
    .pull = GPIOMUX_##pull, \
    .valid = true, \
    }
    #define GPIOMUX_SET_NONE { .valid = false, }
    #define GPIOMUX_CFG(g, active, suspended) { \
    .gpio = g, \
    .sets = { \
    [GPIOMUX_ACTIVE] = active, \
    [GPIOMUX_SUSPENDED] = suspended, \
    }, \
    }
    This will then allow me to define the uart3 pinmuxing in my board file
    as follows:

    struct msm_gpiomux_rec uart3_mux_cfg[] = {
    GPIOMUX_CFG(86, GPIOMUX_SET_NONE,
    GPIOMUX_SET(FUNC_1, DRV_2MA, PULL_DOWN)),
    GPIOMUX_CFG(87, GPIOMUX_SET_NONE,
    GPIOMUX_SET(FUNC_1, DRV_2MA, PULL_DOWN)),
    };
    Thoughts?

    --Dima

    >
    > diff --git a/arch/arm/mach-msm/gpiomux-v1.c b/arch/arm/mach-msm/gpiomux-v1.c
    > index 27de2ab..a9525c2 100644
    > --- a/arch/arm/mach-msm/gpiomux-v1.c
    > +++ b/arch/arm/mach-msm/gpiomux-v1.c
    > @@ -18,13 +18,16 @@
    >  #include "gpiomux.h"
    >  #include "proc_comm.h"
    >
    > -void __msm_gpiomux_write(unsigned gpio, gpiomux_config_t val)
    > +void __msm_gpiomux_write(unsigned gpio, struct gpiomux_setting val)
    >  {
    > -    unsigned tlmm_config  = (val & ~GPIOMUX_CTL_MASK) |
    > -                ((gpio & 0x3ff) << 4);
    > +    unsigned tlmm_config;
    >     unsigned tlmm_disable = 0;
    >     int rc;
    >
    > +    tlmm_config  = (val.drv << 17) |
    > +        (val.pull << 15) |
    > +        ((gpio & 0x3ff) << 4) |
    > +        val.func;
    >     rc = msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX,
    > &tlmm_config, &tlmm_disable);
    >     if (rc)
    > diff --git a/arch/arm/mach-msm/gpiomux-v1.h b/arch/arm/mach-msm/gpiomux-v1.h
    > deleted file mode 100644
    > index 96ad5fa..0000000
    > --- a/arch/arm/mach-msm/gpiomux-v1.h
    > +++ /dev/null
    > @@ -1,59 +0,0 @@
    > -/* Copyright (c) 2010, Code Aurora Forum. All rights reserved.
    > - *
    > - * This program is free software; you can redistribute it and/or modify
    > - * it under the terms of the GNU General Public License version 2 and
    > - * only version 2 as published by the Free Software Foundation.
    > - *
    > - * 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., 51 Franklin Street, Fifth Floor, Boston, MA
    > - * 02110-1301, USA.
    > - */
    > -#ifndef __ARCH_ARM_MACH_MSM_GPIOMUX_V1_H
    > -#define __ARCH_ARM_MACH_MSM_GPIOMUX_V1_H
    > -
    > -typedef u32 gpiomux_config_t;
    > -
    > -enum {
    > -    GPIOMUX_DRV_2MA  = 0UL << 17,
    > -    GPIOMUX_DRV_4MA  = 1UL << 17,
    > -    GPIOMUX_DRV_6MA  = 2UL << 17,
    > -    GPIOMUX_DRV_8MA  = 3UL << 17,
    > -    GPIOMUX_DRV_10MA = 4UL << 17,
    > -    GPIOMUX_DRV_12MA = 5UL << 17,
    > -    GPIOMUX_DRV_14MA = 6UL << 17,
    > -    GPIOMUX_DRV_16MA = 7UL << 17,
    > -};
    > -
    > -enum {
    > -    GPIOMUX_FUNC_GPIO = 0UL,
    > -    GPIOMUX_FUNC_1    = 1UL,
    > -    GPIOMUX_FUNC_2    = 2UL,
    > -    GPIOMUX_FUNC_3    = 3UL,
    > -    GPIOMUX_FUNC_4    = 4UL,
    > -    GPIOMUX_FUNC_5    = 5UL,
    > -    GPIOMUX_FUNC_6    = 6UL,
    > -    GPIOMUX_FUNC_7    = 7UL,
    > -    GPIOMUX_FUNC_8    = 8UL,
    > -    GPIOMUX_FUNC_9    = 9UL,
    > -    GPIOMUX_FUNC_A    = 10UL,
    > -    GPIOMUX_FUNC_B    = 11UL,
    > -    GPIOMUX_FUNC_C    = 12UL,
    > -    GPIOMUX_FUNC_D    = 13UL,
    > -    GPIOMUX_FUNC_E    = 14UL,
    > -    GPIOMUX_FUNC_F    = 15UL,
    > -};
    > -
    > -enum {
    > -    GPIOMUX_PULL_NONE   = 0UL << 15,
    > -    GPIOMUX_PULL_DOWN   = 1UL << 15,
    > -    GPIOMUX_PULL_KEEPER = 2UL << 15,
    > -    GPIOMUX_PULL_UP     = 3UL << 15,
    > -};
    > -
    > -#endif
    > diff --git a/arch/arm/mach-msm/gpiomux-v2.c b/arch/arm/mach-msm/gpiomux-v2.c
    > index 273396d..0a04d60 100644
    > --- a/arch/arm/mach-msm/gpiomux-v2.c
    > +++ b/arch/arm/mach-msm/gpiomux-v2.c
    > @@ -18,8 +18,10 @@
    >  #include <mach/msm_iomap.h>
    >  #include "gpiomux.h"
    >
    > -void __msm_gpiomux_write(unsigned gpio, gpiomux_config_t val)
    > +void __msm_gpiomux_write(unsigned gpio, struct gpiomux_setting val)
    >  {
    > -    writel(val & ~GPIOMUX_CTL_MASK,
    > -           MSM_TLMM_BASE + 0x1000 + (0x10 * gpio));
    > +    uint32_t bits;
    > +
    > +    bits = (val.drv << 6) | (val.func << 2) | val.pull;
    > +    writel(bits, MSM_TLMM_BASE + 0x1000 + (0x10 * gpio));
    >  }
    > diff --git a/arch/arm/mach-msm/gpiomux-v2.h b/arch/arm/mach-msm/gpiomux-v2.h
    > deleted file mode 100644
    > index a7dec1ea..0000000
    > --- a/arch/arm/mach-msm/gpiomux-v2.h
    > +++ /dev/null
    > @@ -1,59 +0,0 @@
    > -/* Copyright (c) 2010, Code Aurora Forum. All rights reserved.
    > - *
    > - * This program is free software; you can redistribute it and/or modify
    > - * it under the terms of the GNU General Public License version 2 and
    > - * only version 2 as published by the Free Software Foundation.
    > - *
    > - * 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., 51 Franklin Street, Fifth Floor, Boston, MA
    > - * 02110-1301, USA.
    > - */
    > -#ifndef __ARCH_ARM_MACH_MSM_GPIOMUX_V2_H
    > -#define __ARCH_ARM_MACH_MSM_GPIOMUX_V2_H
    > -
    > -typedef u16 gpiomux_config_t;
    > -
    > -enum {
    > -    GPIOMUX_DRV_2MA  = 0UL << 6,
    > -    GPIOMUX_DRV_4MA  = 1UL << 6,
    > -    GPIOMUX_DRV_6MA  = 2UL << 6,
    > -    GPIOMUX_DRV_8MA  = 3UL << 6,
    > -    GPIOMUX_DRV_10MA = 4UL << 6,
    > -    GPIOMUX_DRV_12MA = 5UL << 6,
    > -    GPIOMUX_DRV_14MA = 6UL << 6,
    > -    GPIOMUX_DRV_16MA = 7UL << 6,
    > -};
    > -
    > -enum {
    > -    GPIOMUX_FUNC_GPIO = 0UL << 2,
    > -    GPIOMUX_FUNC_1    = 1UL << 2,
    > -    GPIOMUX_FUNC_2    = 2UL << 2,
    > -    GPIOMUX_FUNC_3    = 3UL << 2,
    > -    GPIOMUX_FUNC_4    = 4UL << 2,
    > -    GPIOMUX_FUNC_5    = 5UL << 2,
    > -    GPIOMUX_FUNC_6    = 6UL << 2,
    > -    GPIOMUX_FUNC_7    = 7UL << 2,
    > -    GPIOMUX_FUNC_8    = 8UL << 2,
    > -    GPIOMUX_FUNC_9    = 9UL << 2,
    > -    GPIOMUX_FUNC_A    = 10UL << 2,
    > -    GPIOMUX_FUNC_B    = 11UL << 2,
    > -    GPIOMUX_FUNC_C    = 12UL << 2,
    > -    GPIOMUX_FUNC_D    = 13UL << 2,
    > -    GPIOMUX_FUNC_E    = 14UL << 2,
    > -    GPIOMUX_FUNC_F    = 15UL << 2,
    > -};
    > -
    > -enum {
    > -    GPIOMUX_PULL_NONE   = 0UL,
    > -    GPIOMUX_PULL_DOWN   = 1UL,
    > -    GPIOMUX_PULL_KEEPER = 2UL,
    > -    GPIOMUX_PULL_UP     = 3UL,
    > -};
    > -
    > -#endif
    > diff --git a/arch/arm/mach-msm/gpiomux.c b/arch/arm/mach-msm/gpiomux.c
    > index 9ef9864..1ca26ec 100644
    > --- a/arch/arm/mach-msm/gpiomux.c
    > +++ b/arch/arm/mach-msm/gpiomux.c
    > @@ -20,21 +20,21 @@
    >  #include "gpiomux.h"
    >
    >  struct msm_gpiomux_rec {
    > -    gpiomux_config_t active;
    > -    gpiomux_config_t suspended;
    > -    int              ref;
    > +    struct gpiomux_setting *sets[GPIOMUX_NSETTINGS];
    > +    int ref;
    >  };
    >  static DEFINE_SPINLOCK(gpiomux_lock);
    >  static struct msm_gpiomux_rec *msm_gpiomux_recs;
    > +static struct gpiomux_setting *msm_gpiomux_sets;
    >  static unsigned msm_gpiomux_ngpio;
    >
    > -int msm_gpiomux_write(unsigned gpio,
    > -              gpiomux_config_t active,
    > -              gpiomux_config_t suspended)
    > +int msm_gpiomux_write(unsigned gpio, enum msm_gpiomux_setting which,
    > +    struct gpiomux_setting *setting)
    >  {
    > -    struct msm_gpiomux_rec *cfg = msm_gpiomux_recs + gpio;
    > +    struct msm_gpiomux_rec *rec = msm_gpiomux_recs + gpio;
    > +    unsigned set_slot = gpio * GPIOMUX_NSETTINGS + which;
    >     unsigned long irq_flags;
    > -    gpiomux_config_t setting;
    > +    struct gpiomux_setting *new_set;
    >
    >     if (!msm_gpiomux_recs)
    >         return -EFAULT;
    > @@ -44,15 +44,17 @@ int msm_gpiomux_write(unsigned gpio,
    >
    >     spin_lock_irqsave(&gpiomux_lock, irq_flags);
    >
    > -    if (active & GPIOMUX_VALID)
    > -        cfg->active = active;
    > -
    > -    if (suspended & GPIOMUX_VALID)
    > -        cfg->suspended = suspended;
    > +    if (setting) {
    > +        msm_gpiomux_sets[set_slot] = *setting;
    > +        rec->sets[which] = &msm_gpiomux_sets[set_slot];
    > +    } else {
    > +        rec->sets[which] = NULL;
    > +    }
    >
    > -    setting = cfg->ref ? active : suspended;
    > -    if (setting & GPIOMUX_VALID)
    > -        __msm_gpiomux_write(gpio, setting);
    > +    new_set = rec->ref ? rec->sets[GPIOMUX_ACTIVE] :
    > +        rec->sets[GPIOMUX_SUSPENDED];
    > +    if (new_set)
    > +        __msm_gpiomux_write(gpio, *new_set);
    >
    >     spin_unlock_irqrestore(&gpiomux_lock, irq_flags);
    >     return 0;
    > @@ -61,7 +63,7 @@ EXPORT_SYMBOL(msm_gpiomux_write);
    >
    >  int msm_gpiomux_get(unsigned gpio)
    >  {
    > -    struct msm_gpiomux_rec *cfg = msm_gpiomux_recs + gpio;
    > +    struct msm_gpiomux_rec *rec = msm_gpiomux_recs + gpio;
    >     unsigned long irq_flags;
    >
    >     if (!msm_gpiomux_recs)
    > @@ -71,8 +73,8 @@ int msm_gpiomux_get(unsigned gpio)
    >         return -EINVAL;
    >
    >     spin_lock_irqsave(&gpiomux_lock, irq_flags);
    > -    if (cfg->ref++ == 0 && cfg->active & GPIOMUX_VALID)
    > -        __msm_gpiomux_write(gpio, cfg->active);
    > +    if (rec->ref++ == 0 && rec->sets[GPIOMUX_ACTIVE])
    > +        __msm_gpiomux_write(gpio, *rec->sets[GPIOMUX_ACTIVE]);
    >     spin_unlock_irqrestore(&gpiomux_lock, irq_flags);
    >     return 0;
    >  }
    > @@ -80,7 +82,7 @@ EXPORT_SYMBOL(msm_gpiomux_get);
    >
    >  int msm_gpiomux_put(unsigned gpio)
    >  {
    > -    struct msm_gpiomux_rec *cfg = msm_gpiomux_recs + gpio;
    > +    struct msm_gpiomux_rec *rec = msm_gpiomux_recs + gpio;
    >     unsigned long irq_flags;
    >
    >     if (!msm_gpiomux_recs)
    > @@ -90,9 +92,9 @@ int msm_gpiomux_put(unsigned gpio)
    >         return -EINVAL;
    >
    >     spin_lock_irqsave(&gpiomux_lock, irq_flags);
    > -    BUG_ON(cfg->ref == 0);
    > -    if (--cfg->ref == 0 && cfg->suspended & GPIOMUX_VALID)
    > -        __msm_gpiomux_write(gpio, cfg->suspended);
    > +    BUG_ON(rec->ref == 0);
    > +    if (--rec->ref == 0 && rec->sets[GPIOMUX_SUSPENDED])
    > +        __msm_gpiomux_write(gpio, *rec->sets[GPIOMUX_SUSPENDED]);
    >     spin_unlock_irqrestore(&gpiomux_lock, irq_flags);
    >     return 0;
    >  }
    > @@ -111,6 +113,17 @@ int msm_gpiomux_init(size_t ngpio)
    >     if (!msm_gpiomux_recs)
    >         return -ENOMEM;
    >
    > +    /* There is no need to zero this memory, as clients will be blindly
    > +     * installing settings on top of it.
    > +     */
    > +    msm_gpiomux_sets = kmalloc(sizeof(struct gpiomux_setting) * ngpio *
    > +        GPIOMUX_NSETTINGS, GFP_KERNEL);
    > +    if (!msm_gpiomux_sets) {
    > +        kfree(msm_gpiomux_recs);
    > +        msm_gpiomux_recs = NULL;
    > +        return -ENOMEM;
    > +    }
    > +
    >     msm_gpiomux_ngpio = ngpio;
    >
    >     return 0;
    > @@ -119,18 +132,16 @@ EXPORT_SYMBOL(msm_gpiomux_init);
    >
    >  void msm_gpiomux_install(struct msm_gpiomux_config *configs, unsigned
    > nconfigs)
    >  {
    > -    unsigned n;
    > +    unsigned c, s;
    >     int rc;
    >
    > -    if (!msm_gpiomux_recs)
    > -        return;
    > -
    > -    for (n = 0; n < nconfigs; ++n) {
    > -        rc = msm_gpiomux_write(configs[n].gpio,
    > -                       configs[n].active,
    > -                       configs[n].suspended);
    > -        if (rc)
    > -            pr_err("%s: write failure: %d\n", __func__, rc);
    > +    for (c = 0; c < nconfigs; ++c) {
    > +        for (s = 0; s < GPIOMUX_NSETTINGS; ++s) {
    > +            rc = msm_gpiomux_write(configs[c].gpio, s,
    > +                configs[c].settings[s]);
    > +            if (rc)
    > +                pr_err("%s: write failure: %d\n", __func__, rc);
    > +        }
    >     }
    >  }
    >  EXPORT_SYMBOL(msm_gpiomux_install);
    > diff --git a/arch/arm/mach-msm/gpiomux.h b/arch/arm/mach-msm/gpiomux.h
    > index 38bf511..bd8d6c2 100644
    > --- a/arch/arm/mach-msm/gpiomux.h
    > +++ b/arch/arm/mach-msm/gpiomux.h
    > @@ -20,44 +20,73 @@
    >  #include <linux/bitops.h>
    >  #include <linux/errno.h>
    >
    > -#if defined(CONFIG_MSM_V2_TLMM)
    > -#include "gpiomux-v2.h"
    > -#else
    > -#include "gpiomux-v1.h"
    > -#endif
    > +enum msm_gpiomux_setting {
    > +    GPIOMUX_ACTIVE = 0,
    > +    GPIOMUX_SUSPENDED,
    > +    GPIOMUX_NSETTINGS
    > +};
    > +
    > +enum gpiomux_drv {
    > +    GPIOMUX_DRV_2MA = 0,
    > +    GPIOMUX_DRV_4MA,
    > +    GPIOMUX_DRV_6MA,
    > +    GPIOMUX_DRV_8MA,
    > +    GPIOMUX_DRV_10MA,
    > +    GPIOMUX_DRV_12MA,
    > +    GPIOMUX_DRV_14MA,
    > +    GPIOMUX_DRV_16MA,
    > +};
    > +
    > +enum gpiomux_func {
    > +    GPIOMUX_FUNC_GPIO = 0,
    > +    GPIOMUX_FUNC_1,
    > +    GPIOMUX_FUNC_2,
    > +    GPIOMUX_FUNC_3,
    > +    GPIOMUX_FUNC_4,
    > +    GPIOMUX_FUNC_5,
    > +    GPIOMUX_FUNC_6,
    > +    GPIOMUX_FUNC_7,
    > +    GPIOMUX_FUNC_8,
    > +    GPIOMUX_FUNC_9,
    > +    GPIOMUX_FUNC_A,
    > +    GPIOMUX_FUNC_B,
    > +    GPIOMUX_FUNC_C,
    > +    GPIOMUX_FUNC_D,
    > +    GPIOMUX_FUNC_E,
    > +    GPIOMUX_FUNC_F,
    > +};
    > +
    > +enum gpiomux_pull {
    > +    GPIOMUX_PULL_NONE = 0,
    > +    GPIOMUX_PULL_DOWN,
    > +    GPIOMUX_PULL_KEEPER,
    > +    GPIOMUX_PULL_UP,
    > +};
    > +
    > +struct gpiomux_setting {
    > +    enum gpiomux_func func;
    > +    enum gpiomux_drv  drv;
    > +    enum gpiomux_pull pull;
    > +};
    >
    >  /**
    >  * struct msm_gpiomux_config: gpiomux settings for one gpio line.
    >  *
    > - * A complete gpiomux config is the bitwise-or of a drive-strength,
    > + * A complete gpiomux setting is the combination of a drive-strength,
    >  * function, and pull.  For functions other than GPIO, the OE
    >  * is hard-wired according to the function.  For GPIO mode,
    >  * OE is controlled by gpiolib.
    >  *
    > - * Available settings differ by target; see the gpiomux header
    > - * specific to your target arch for available configurations.
    > - *
    >  * @gpio: The index number of the gpio being described.
    > - * @active: The configuration to be installed when the line is
    > - * active, or its reference count is > 0.
    > - * @suspended: The configuration to be installed when the line
    > - * is suspended, or its reference count is 0.
    > + * @settings: The settings to be installed, specifically:
    > + *           GPIOMUX_ACTIVE: The setting to be installed when the
    > + *           line is active, or its reference count is > 0.
    > + *           GPIOMUX_SUSPENDED: The setting to be installed when
    > + *           the line is suspended, or its reference count is 0.
    >  */
    >  struct msm_gpiomux_config {
    > -    unsigned         gpio;
    > -    gpiomux_config_t active;
    > -    gpiomux_config_t suspended;
    > -};
    > -
    > -/**
    > - * @GPIOMUX_VALID:    If set, the config field contains 'good data'.
    > - *                      The absence of this bit will prevent the gpiomux
    > - *            system from applying the configuration under all
    > - *            circumstances.
    > - */
    > -enum {
    > -    GPIOMUX_VALID     = BIT(sizeof(gpiomux_config_t) * BITS_PER_BYTE - 1),
    > -    GPIOMUX_CTL_MASK = GPIOMUX_VALID,
    > +    unsigned gpio;
    > +    struct gpiomux_setting *settings[GPIOMUX_NSETTINGS];
    >  };
    >
    >  #ifdef CONFIG_MSM_GPIOMUX
    > @@ -79,12 +108,10 @@ int __must_check msm_gpiomux_get(unsigned gpio);
    >  /* Decrement a gpio's reference count, possibly suspending the line. */
    >  int msm_gpiomux_put(unsigned gpio);
    >
    > -/* Install a new configuration to the gpio line.  To avoid overwriting
    > - * a configuration, leave the VALID bit out.
    > +/* Install a new setting in a gpio.  To erase a slot, use NULL.
    >  */
    > -int msm_gpiomux_write(unsigned gpio,
    > -              gpiomux_config_t active,
    > -              gpiomux_config_t suspended);
    > +int msm_gpiomux_write(unsigned gpio, enum msm_gpiomux_setting which,
    > +    struct gpiomux_setting *setting);
    >
    >  /* Architecture-internal function for use by the framework only.
    >  * This function can assume the following:
    > @@ -94,7 +121,7 @@ int msm_gpiomux_write(unsigned gpio,
    >  * This function is not for public consumption.  External users
    >  * should use msm_gpiomux_write.
    >  */
    > -void __msm_gpiomux_write(unsigned gpio, gpiomux_config_t val);
    > +void __msm_gpiomux_write(unsigned gpio, struct gpiomux_setting val);
    >  #else
    >  static inline int msm_gpiomux_init(size_t ngpio)
    >  {
    > @@ -115,8 +142,7 @@ static inline int msm_gpiomux_put(unsigned gpio)
    >  }
    >
    >  static inline int msm_gpiomux_write(unsigned gpio,
    > -                    gpiomux_config_t active,
    > -                    gpiomux_config_t suspended)
    > +    enum msm_gpiomux_setting which, struct gpiomux_setting *setting)
    >  {
    >     return -ENOSYS;
    >  }
    > --
    > 1.7.3.3
    >
    >
    > Thanks,
    > Rohit Vaswani
    >
    > --
    > Sent by an employee of the Qualcomm Innovation Center, Inc.
    > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
    >
    >
    --
    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: 2011-02-26 02:23    [from the cache]
    ©2003-2014 Jasper Spaans. hosted at Digital Ocean