lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Fri, 25 Feb 2011 17:20:10 -0800
From:	Dima Zavin <dima@...roid.com>
To:	Rohit Vaswani <rvaswani@...eaurora.org>
Cc:	David Brown <davidb@...eaurora.org>,
	Bryan Huntsman <bryanh@...eaurora.org>,
	Russell King - ARM Linux <linux@....linux.org.uk>,
	dwalker@...o99.com, linux-arm-msm@...r.kernel.org,
	linux-arm-kernel <linux-arm-kernel@...ts.infradead.org>,
	linux-kernel@...r.kernel.org
Subject: Re: [PATCH] msm: gpiomux: Remove GPIOMUX_VALID and merge config enums

On Fri, Feb 25, 2011 at 12:19 PM, Rohit Vaswani <rvaswani@...eaurora.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@...eaurora.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@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists