1/* linux/arch/arm/mach-msm/gpio.c 2 * 3 * Copyright (C) 2007 Google, Inc. 4 * Copyright (c) 2009, Code Aurora Forum. All rights reserved. 5 * 6 * This software is licensed under the terms of the GNU General Public 7 * License version 2, as published by the Free Software Foundation, and 8 * may be copied, distributed, and modified under those terms. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 */ 16 17#include <linux/module.h> 18#include <mach/gpio.h> 19#include "proc_comm.h" 20 21int gpio_tlmm_config(unsigned config, unsigned disable) 22{ 23 return msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &config, &disable); 24} 25EXPORT_SYMBOL(gpio_tlmm_config); 26 27int msm_gpios_enable(const struct msm_gpio *table, int size) 28{ 29 int rc; 30 int i; 31 const struct msm_gpio *g; 32 for (i = 0; i < size; i++) { 33 g = table + i; 34 rc = gpio_tlmm_config(g->gpio_cfg, GPIO_ENABLE); 35 if (rc) { 36 pr_err("gpio_tlmm_config(0x%08x, GPIO_ENABLE)" 37 " <%s> failed: %d\n", 38 g->gpio_cfg, g->label ?: "?", rc); 39 pr_err("pin %d func %d dir %d pull %d drvstr %d\n", 40 GPIO_PIN(g->gpio_cfg), GPIO_FUNC(g->gpio_cfg), 41 GPIO_DIR(g->gpio_cfg), GPIO_PULL(g->gpio_cfg), 42 GPIO_DRVSTR(g->gpio_cfg)); 43 goto err; 44 } 45 } 46 return 0; 47err: 48 msm_gpios_disable(table, i); 49 return rc; 50} 51EXPORT_SYMBOL(msm_gpios_enable); 52 53void msm_gpios_disable(const struct msm_gpio *table, int size) 54{ 55 int rc; 56 int i; 57 const struct msm_gpio *g; 58 for (i = size-1; i >= 0; i--) { 59 g = table + i; 60 rc = gpio_tlmm_config(g->gpio_cfg, GPIO_DISABLE); 61 if (rc) { 62 pr_err("gpio_tlmm_config(0x%08x, GPIO_DISABLE)" 63 " <%s> failed: %d\n", 64 g->gpio_cfg, g->label ?: "?", rc); 65 pr_err("pin %d func %d dir %d pull %d drvstr %d\n", 66 GPIO_PIN(g->gpio_cfg), GPIO_FUNC(g->gpio_cfg), 67 GPIO_DIR(g->gpio_cfg), GPIO_PULL(g->gpio_cfg), 68 GPIO_DRVSTR(g->gpio_cfg)); 69 } 70 } 71} 72EXPORT_SYMBOL(msm_gpios_disable); 73 74int msm_gpios_request_enable(const struct msm_gpio *table, int size) 75{ 76 int rc = msm_gpios_enable(table, size); 77 return rc; 78} 79EXPORT_SYMBOL(msm_gpios_request_enable); 80 81void msm_gpios_disable_free(const struct msm_gpio *table, int size) 82{ 83 msm_gpios_disable(table, size); 84} 85EXPORT_SYMBOL(msm_gpios_disable_free); 86