-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
msm: add gpiomux api for gpio multiplex & configuration.
Add the 'gpiomux' api, which addresses the following shortcomings of existing tlmm api: - gpio power-collapse, which is managed by a peripheral processor on other targets, must be managed by the application processor on the 8x60. - The enable/disable flag of the legacy gpio_tlmm_config api is not applicable on the 8x60, and causes confusion. - The gpio 'direction' bits are meaningless for all func_sel configurations except for generic-gpio mode (func_sel 0), in which case the gpio_direction_* functions should be used. Having these bits in the tlmm api leads to confusion and misuse of the gpiolib api, and they have been removed in gpiomux. - The functional api of the legacy system ran contrary to the typical use-case, which is a single massive configuration at boot. Rather than forcing hundreds of 'config' function calls, the new api allows data to be configured with a single table. gpiomux_get and gpiomux_put are meant to be called automatically when gpio_request and gpio_free are called, giving automatic gpiomux/tlmm control to those drivers/lines with simple power profiles - in the simplest cases, an entry in the gpiomux table and the correct usage of gpiolib is all that is required to get proper gpio power control. Signed-off-by: Gregory Bean <gbean@codeaurora.org> Signed-off-by: Daniel Walker <dwalker@codeaurora.org>
- Loading branch information
Gregory Bean
authored and
Daniel Walker
committed
Oct 6, 2010
1 parent
846afbd
commit 1963a2a
Showing
13 changed files
with
482 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -106,4 +106,6 @@ config MSM_SMD_PKG3 | |
config MSM_SMD | ||
bool | ||
|
||
config MSM_V2_TLMM | ||
bool | ||
endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
/* 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. | ||
*/ | ||
#include "gpiomux.h" | ||
|
||
struct msm_gpiomux_config msm_gpiomux_configs[GPIOMUX_NGPIOS] = {}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
/* 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. | ||
*/ | ||
#include "gpiomux.h" | ||
|
||
struct msm_gpiomux_config msm_gpiomux_configs[GPIOMUX_NGPIOS] = {}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
/* 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. | ||
*/ | ||
#include "gpiomux.h" | ||
|
||
struct msm_gpiomux_config msm_gpiomux_configs[GPIOMUX_NGPIOS] = {}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
/* 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. | ||
*/ | ||
#include <linux/kernel.h> | ||
#include "gpiomux.h" | ||
#include "proc_comm.h" | ||
|
||
void __msm_gpiomux_write(unsigned gpio, gpiomux_config_t val) | ||
{ | ||
unsigned tlmm_config = (val & ~GPIOMUX_CTL_MASK) | | ||
((gpio & 0x3ff) << 4); | ||
unsigned tlmm_disable = 0; | ||
int rc; | ||
|
||
rc = msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, | ||
&tlmm_config, &tlmm_disable); | ||
if (rc) | ||
pr_err("%s: unexpected proc_comm failure %d: %08x %08x\n", | ||
__func__, rc, tlmm_config, tlmm_disable); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
/* 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 | ||
|
||
#if defined(CONFIG_ARCH_MSM7X30) | ||
#define GPIOMUX_NGPIOS 182 | ||
#elif defined(CONFIG_ARCH_QSD8X50) | ||
#define GPIOMUX_NGPIOS 165 | ||
#else | ||
#define GPIOMUX_NGPIOS 133 | ||
#endif | ||
|
||
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
/* 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. | ||
*/ | ||
#include <linux/io.h> | ||
#include <mach/msm_iomap.h> | ||
#include "gpiomux.h" | ||
|
||
void __msm_gpiomux_write(unsigned gpio, gpiomux_config_t val) | ||
{ | ||
writel(val & ~GPIOMUX_CTL_MASK, | ||
MSM_TLMM_BASE + 0x1000 + (0x10 * gpio)); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
/* 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 | ||
|
||
#define GPIOMUX_NGPIOS 173 | ||
|
||
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
/* 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. | ||
*/ | ||
#include <linux/module.h> | ||
#include <linux/spinlock.h> | ||
#include "gpiomux.h" | ||
|
||
static DEFINE_SPINLOCK(gpiomux_lock); | ||
|
||
int msm_gpiomux_write(unsigned gpio, | ||
gpiomux_config_t active, | ||
gpiomux_config_t suspended) | ||
{ | ||
struct msm_gpiomux_config *cfg = msm_gpiomux_configs + gpio; | ||
unsigned long irq_flags; | ||
gpiomux_config_t setting; | ||
|
||
if (gpio >= GPIOMUX_NGPIOS) | ||
return -EINVAL; | ||
|
||
spin_lock_irqsave(&gpiomux_lock, irq_flags); | ||
|
||
if (active & GPIOMUX_VALID) | ||
cfg->active = active; | ||
|
||
if (suspended & GPIOMUX_VALID) | ||
cfg->suspended = suspended; | ||
|
||
setting = cfg->ref ? active : suspended; | ||
if (setting & GPIOMUX_VALID) | ||
__msm_gpiomux_write(gpio, setting); | ||
|
||
spin_unlock_irqrestore(&gpiomux_lock, irq_flags); | ||
return 0; | ||
} | ||
EXPORT_SYMBOL(msm_gpiomux_write); | ||
|
||
int msm_gpiomux_get(unsigned gpio) | ||
{ | ||
struct msm_gpiomux_config *cfg = msm_gpiomux_configs + gpio; | ||
unsigned long irq_flags; | ||
|
||
if (gpio >= GPIOMUX_NGPIOS) | ||
return -EINVAL; | ||
|
||
spin_lock_irqsave(&gpiomux_lock, irq_flags); | ||
if (cfg->ref++ == 0 && cfg->active & GPIOMUX_VALID) | ||
__msm_gpiomux_write(gpio, cfg->active); | ||
spin_unlock_irqrestore(&gpiomux_lock, irq_flags); | ||
return 0; | ||
} | ||
EXPORT_SYMBOL(msm_gpiomux_get); | ||
|
||
int msm_gpiomux_put(unsigned gpio) | ||
{ | ||
struct msm_gpiomux_config *cfg = msm_gpiomux_configs + gpio; | ||
unsigned long irq_flags; | ||
|
||
if (gpio >= GPIOMUX_NGPIOS) | ||
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); | ||
spin_unlock_irqrestore(&gpiomux_lock, irq_flags); | ||
return 0; | ||
} | ||
EXPORT_SYMBOL(msm_gpiomux_put); | ||
|
||
static int __init gpiomux_init(void) | ||
{ | ||
unsigned n; | ||
|
||
for (n = 0; n < GPIOMUX_NGPIOS; ++n) { | ||
msm_gpiomux_configs[n].ref = 0; | ||
if (!(msm_gpiomux_configs[n].suspended & GPIOMUX_VALID)) | ||
continue; | ||
__msm_gpiomux_write(n, msm_gpiomux_configs[n].suspended); | ||
} | ||
return 0; | ||
} | ||
postcore_initcall(gpiomux_init); |
Oops, something went wrong.