[PATCH] msm: gpiomux: Remove GPIOMUX_VALID and merge config enums
Dima Zavin
dima at android.com
Fri Feb 25 20:20:10 EST 2011
On Fri, Feb 25, 2011 at 12:19 PM, Rohit Vaswani <rvaswani at 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 at 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.
>
>
More information about the linux-arm-kernel
mailing list