blob: 35a3283bce20d03c3f831d7f2518442426da3044 [file] [log] [blame]
Vadim Bendebury476f7312014-04-08 18:45:46 -07001/*
2 * Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in
11 * the documentation and/or other materials provided with the
12 * distribution.
13 * * Neither the name of Google, Inc. nor the names of its contributors
14 * may be used to endorse or promote products derived from this
15 * software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
20 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
21 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
23 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
24 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
27 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 */
30
Furquan Shaikh9d91aba2014-04-10 20:35:05 -070031#include <arch/io.h>
Julius Wernereaa9c452014-09-24 15:40:49 -070032#include <gpio.h>
Julius Werner73d1ed62014-10-20 13:20:49 -070033#include <soc/iomap.h>
Furquan Shaikh9d91aba2014-04-10 20:35:05 -070034
35/*******************************************************
36Function description: check for invalid GPIO #
37Arguments :
38gpio_t gpio - Gpio number
39
40Return : GPIO Valid(0)/Invalid(1)
41*******************************************************/
42
43static inline int gpio_not_valid(gpio_t gpio)
44{
45 return (gpio > GPIO_MAX_NUM);
46}
47
Vadim Bendebury476f7312014-04-08 18:45:46 -070048
49/*******************************************************
50Function description: configure GPIO functinality
51Arguments :
Furquan Shaikh9d91aba2014-04-10 20:35:05 -070052gpio_t gpio - Gpio number
Vadim Bendeburyd36ef6a2014-07-25 17:34:42 -070053unsigned func - Functionality number
54unsigned pull - pull up/down, no pull range(0-3)
55unsigned drvstr - range (0 - 7)-> (2- 16)MA steps of 2
56unsigned enable - 0 Disable, 1 - Enable.
Vadim Bendebury476f7312014-04-08 18:45:46 -070057
58Return : None
59*******************************************************/
60
61
Vadim Bendeburyd36ef6a2014-07-25 17:34:42 -070062void gpio_tlmm_config_set(gpio_t gpio, unsigned func,
63 unsigned pull, unsigned drvstr,
64 unsigned enable)
Vadim Bendebury476f7312014-04-08 18:45:46 -070065{
Vadim Bendeburyd36ef6a2014-07-25 17:34:42 -070066 unsigned val = 0;
Furquan Shaikh9d91aba2014-04-10 20:35:05 -070067
68 if (gpio_not_valid(gpio))
69 return;
70
71 val |= (pull & GPIO_CFG_PULL_MASK) << GPIO_CFG_PULL_SHIFT;
72 val |= (func & GPIO_CFG_FUNC_MASK) << GPIO_CFG_FUNC_SHIFT;
73 val |= (drvstr & GPIO_CFG_DRV_MASK) << GPIO_CFG_DRV_SHIFT;
74 val |= (enable & GPIO_CFG_OE_MASK) << GPIO_CFG_OE_SHIFT;
Vadim Bendeburyd36ef6a2014-07-25 17:34:42 -070075
Julius Werner2f37bd62015-02-19 14:51:15 -080076 write32(GPIO_CONFIG_ADDR(gpio), val);
Vadim Bendebury476f7312014-04-08 18:45:46 -070077}
78
Furquan Shaikh9d91aba2014-04-10 20:35:05 -070079/*******************************************************
80Function description: Get GPIO configuration
81Arguments :
82gpio_t gpio - Gpio number
Vadim Bendeburyd36ef6a2014-07-25 17:34:42 -070083unsigned *func - Functionality number
84unsigned *pull - pull up/down, no pull range(0-3)
85unsigned *drvstr - range (0 - 7)-> (2- 16)MA steps of 2
86unsigned *enable - 0 - Disable, 1- Enable.
Furquan Shaikh9d91aba2014-04-10 20:35:05 -070087
88Return : None
89*******************************************************/
90
91
Vadim Bendeburyd36ef6a2014-07-25 17:34:42 -070092void gpio_tlmm_config_get(gpio_t gpio, unsigned *func,
93 unsigned *pull, unsigned *drvstr,
94 unsigned *enable)
Furquan Shaikh9d91aba2014-04-10 20:35:05 -070095{
Vadim Bendeburyd36ef6a2014-07-25 17:34:42 -070096 unsigned val;
97 void *addr = GPIO_CONFIG_ADDR(gpio);
Furquan Shaikh9d91aba2014-04-10 20:35:05 -070098
99 if (gpio_not_valid(gpio))
100 return;
101
Julius Werner2f37bd62015-02-19 14:51:15 -0800102 val = read32(addr);
Furquan Shaikh9d91aba2014-04-10 20:35:05 -0700103
104 *pull = (val >> GPIO_CFG_PULL_SHIFT) & GPIO_CFG_PULL_MASK;
105 *func = (val >> GPIO_CFG_FUNC_SHIFT) & GPIO_CFG_FUNC_MASK;
106 *drvstr = (val >> GPIO_CFG_DRV_SHIFT) & GPIO_CFG_DRV_MASK;
107 *enable = (val >> GPIO_CFG_OE_SHIFT) & GPIO_CFG_OE_MASK;
108}
109
110/*******************************************************
Furquan Shaikh9d91aba2014-04-10 20:35:05 -0700111Function description: get GPIO IO functinality details
112Arguments :
113gpio_t gpio - Gpio number
Vadim Bendeburyd36ef6a2014-07-25 17:34:42 -0700114unsigned *in - Value of GPIO input
115unsigned *out - Value of GPIO output
Furquan Shaikh9d91aba2014-04-10 20:35:05 -0700116
117Return : None
118*******************************************************/
Julius Wernereaa9c452014-09-24 15:40:49 -0700119int gpio_get(gpio_t gpio)
Furquan Shaikh9d91aba2014-04-10 20:35:05 -0700120{
Vadim Bendeburyd36ef6a2014-07-25 17:34:42 -0700121 if (gpio_not_valid(gpio))
122 return -1;
Furquan Shaikh9d91aba2014-04-10 20:35:05 -0700123
Vadim Bendeburyd36ef6a2014-07-25 17:34:42 -0700124
Julius Werner2f37bd62015-02-19 14:51:15 -0800125 return (read32(GPIO_IN_OUT_ADDR(gpio)) >> GPIO_IO_IN_SHIFT) &
Vadim Bendeburyd36ef6a2014-07-25 17:34:42 -0700126 GPIO_IO_IN_MASK;
127}
128
Julius Wernereaa9c452014-09-24 15:40:49 -0700129void gpio_set(gpio_t gpio, int value)
Vadim Bendeburyd36ef6a2014-07-25 17:34:42 -0700130{
Furquan Shaikh9d91aba2014-04-10 20:35:05 -0700131 if (gpio_not_valid(gpio))
132 return;
133
Julius Werner2f37bd62015-02-19 14:51:15 -0800134 write32(GPIO_IN_OUT_ADDR(gpio), (value & 1) << GPIO_IO_OUT_SHIFT);
Furquan Shaikh9d91aba2014-04-10 20:35:05 -0700135}
Vadim Bendeburyd36ef6a2014-07-25 17:34:42 -0700136
137void gpio_input_pulldown(gpio_t gpio)
138{
139 gpio_tlmm_config_set(gpio, GPIO_FUNC_DISABLE,
140 GPIO_PULL_DOWN, GPIO_2MA, GPIO_DISABLE);
141}
142
143void gpio_input_pullup(gpio_t gpio)
144{
145 gpio_tlmm_config_set(gpio, GPIO_FUNC_DISABLE,
146 GPIO_PULL_UP, GPIO_2MA, GPIO_DISABLE);
147}
148
149void gpio_input(gpio_t gpio)
150{
151 gpio_tlmm_config_set(gpio, GPIO_FUNC_DISABLE,
152 GPIO_NO_PULL, GPIO_2MA, GPIO_DISABLE);
153}