1f517afd5SLaurence Withers /* 2f517afd5SLaurence Withers * GPIO driver for TI DaVinci DA8xx SOCs. 3f517afd5SLaurence Withers * 4f517afd5SLaurence Withers * (C) Copyright 2011 Guralp Systems Ltd. 5f517afd5SLaurence Withers * Laurence Withers <lwithers@guralp.com> 6f517afd5SLaurence Withers * 7f517afd5SLaurence Withers * This program is free software; you can redistribute it and/or 8f517afd5SLaurence Withers * modify it under the terms of the GNU General Public License as 9f517afd5SLaurence Withers * published by the Free Software Foundation; either version 2 of 10f517afd5SLaurence Withers * the License, or (at your option) any later version. 11f517afd5SLaurence Withers * 12f517afd5SLaurence Withers * This program is distributed in the hope that it will be useful, 13f517afd5SLaurence Withers * but WITHOUT ANY WARRANTY; without even the implied warranty of 14f517afd5SLaurence Withers * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15f517afd5SLaurence Withers * GNU General Public License for more details. 16f517afd5SLaurence Withers * 17f517afd5SLaurence Withers * You should have received a copy of the GNU General Public License 18f517afd5SLaurence Withers * along with this program; if not, write to the Free Software 19f517afd5SLaurence Withers * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 20f517afd5SLaurence Withers * MA 02111-1307 USA 21f517afd5SLaurence Withers */ 22f517afd5SLaurence Withers 23f517afd5SLaurence Withers #include <common.h> 24f517afd5SLaurence Withers #include <asm/io.h> 25f517afd5SLaurence Withers #include <asm/gpio.h> 26f517afd5SLaurence Withers #include <asm/arch/hardware.h> 27f517afd5SLaurence Withers #include <asm/arch/davinci_misc.h> 28f517afd5SLaurence Withers 29f517afd5SLaurence Withers static struct gpio_registry { 30f517afd5SLaurence Withers int is_registered; 31f517afd5SLaurence Withers char name[GPIO_NAME_SIZE]; 32f517afd5SLaurence Withers } gpio_registry[MAX_NUM_GPIOS]; 33f517afd5SLaurence Withers 34f517afd5SLaurence Withers #define pinmux(x) (&davinci_syscfg_regs->pinmux[x]) 35f517afd5SLaurence Withers 36*b9f56698STomas Novotny #if defined(CONFIG_SOC_DA8XX) && !defined(CONFIG_SOC_DA850) 37*b9f56698STomas Novotny static const struct pinmux_config gpio_pinmux[] = { 38*b9f56698STomas Novotny { pinmux(13), 8, 6 }, /* GP0[0] */ 39*b9f56698STomas Novotny { pinmux(13), 8, 7 }, 40*b9f56698STomas Novotny { pinmux(14), 8, 0 }, 41*b9f56698STomas Novotny { pinmux(14), 8, 1 }, 42*b9f56698STomas Novotny { pinmux(14), 8, 2 }, 43*b9f56698STomas Novotny { pinmux(14), 8, 3 }, 44*b9f56698STomas Novotny { pinmux(14), 8, 4 }, 45*b9f56698STomas Novotny { pinmux(14), 8, 5 }, 46*b9f56698STomas Novotny { pinmux(14), 8, 6 }, 47*b9f56698STomas Novotny { pinmux(14), 8, 7 }, 48*b9f56698STomas Novotny { pinmux(15), 8, 0 }, 49*b9f56698STomas Novotny { pinmux(15), 8, 1 }, 50*b9f56698STomas Novotny { pinmux(15), 8, 2 }, 51*b9f56698STomas Novotny { pinmux(15), 8, 3 }, 52*b9f56698STomas Novotny { pinmux(15), 8, 4 }, 53*b9f56698STomas Novotny { pinmux(15), 8, 5 }, 54*b9f56698STomas Novotny { pinmux(15), 8, 6 }, /* GP1[0] */ 55*b9f56698STomas Novotny { pinmux(15), 8, 7 }, 56*b9f56698STomas Novotny { pinmux(16), 8, 0 }, 57*b9f56698STomas Novotny { pinmux(16), 8, 1 }, 58*b9f56698STomas Novotny { pinmux(16), 8, 2 }, 59*b9f56698STomas Novotny { pinmux(16), 8, 3 }, 60*b9f56698STomas Novotny { pinmux(16), 8, 4 }, 61*b9f56698STomas Novotny { pinmux(16), 8, 5 }, 62*b9f56698STomas Novotny { pinmux(16), 8, 6 }, 63*b9f56698STomas Novotny { pinmux(16), 8, 7 }, 64*b9f56698STomas Novotny { pinmux(17), 8, 0 }, 65*b9f56698STomas Novotny { pinmux(17), 8, 1 }, 66*b9f56698STomas Novotny { pinmux(17), 8, 2 }, 67*b9f56698STomas Novotny { pinmux(17), 8, 3 }, 68*b9f56698STomas Novotny { pinmux(17), 8, 4 }, 69*b9f56698STomas Novotny { pinmux(17), 8, 5 }, 70*b9f56698STomas Novotny { pinmux(17), 8, 6 }, /* GP2[0] */ 71*b9f56698STomas Novotny { pinmux(17), 8, 7 }, 72*b9f56698STomas Novotny { pinmux(18), 8, 0 }, 73*b9f56698STomas Novotny { pinmux(18), 8, 1 }, 74*b9f56698STomas Novotny { pinmux(18), 8, 2 }, 75*b9f56698STomas Novotny { pinmux(18), 8, 3 }, 76*b9f56698STomas Novotny { pinmux(18), 8, 4 }, 77*b9f56698STomas Novotny { pinmux(18), 8, 5 }, 78*b9f56698STomas Novotny { pinmux(18), 8, 6 }, 79*b9f56698STomas Novotny { pinmux(18), 8, 7 }, 80*b9f56698STomas Novotny { pinmux(19), 8, 0 }, 81*b9f56698STomas Novotny { pinmux(9), 8, 2 }, 82*b9f56698STomas Novotny { pinmux(9), 8, 3 }, 83*b9f56698STomas Novotny { pinmux(9), 8, 4 }, 84*b9f56698STomas Novotny { pinmux(9), 8, 5 }, 85*b9f56698STomas Novotny { pinmux(9), 8, 6 }, 86*b9f56698STomas Novotny { pinmux(10), 8, 1 }, /* GP3[0] */ 87*b9f56698STomas Novotny { pinmux(10), 8, 2 }, 88*b9f56698STomas Novotny { pinmux(10), 8, 3 }, 89*b9f56698STomas Novotny { pinmux(10), 8, 4 }, 90*b9f56698STomas Novotny { pinmux(10), 8, 5 }, 91*b9f56698STomas Novotny { pinmux(10), 8, 6 }, 92*b9f56698STomas Novotny { pinmux(10), 8, 7 }, 93*b9f56698STomas Novotny { pinmux(11), 8, 0 }, 94*b9f56698STomas Novotny { pinmux(11), 8, 1 }, 95*b9f56698STomas Novotny { pinmux(11), 8, 2 }, 96*b9f56698STomas Novotny { pinmux(11), 8, 3 }, 97*b9f56698STomas Novotny { pinmux(11), 8, 4 }, 98*b9f56698STomas Novotny { pinmux(9), 8, 7 }, 99*b9f56698STomas Novotny { pinmux(2), 8, 6 }, 100*b9f56698STomas Novotny { pinmux(11), 8, 5 }, 101*b9f56698STomas Novotny { pinmux(11), 8, 6 }, 102*b9f56698STomas Novotny { pinmux(12), 8, 4 }, /* GP4[0] */ 103*b9f56698STomas Novotny { pinmux(12), 8, 5 }, 104*b9f56698STomas Novotny { pinmux(12), 8, 6 }, 105*b9f56698STomas Novotny { pinmux(12), 8, 7 }, 106*b9f56698STomas Novotny { pinmux(13), 8, 0 }, 107*b9f56698STomas Novotny { pinmux(13), 8, 1 }, 108*b9f56698STomas Novotny { pinmux(13), 8, 2 }, 109*b9f56698STomas Novotny { pinmux(13), 8, 3 }, 110*b9f56698STomas Novotny { pinmux(13), 8, 4 }, 111*b9f56698STomas Novotny { pinmux(13), 8, 5 }, 112*b9f56698STomas Novotny { pinmux(11), 8, 7 }, 113*b9f56698STomas Novotny { pinmux(12), 8, 0 }, 114*b9f56698STomas Novotny { pinmux(12), 8, 1 }, 115*b9f56698STomas Novotny { pinmux(12), 8, 2 }, 116*b9f56698STomas Novotny { pinmux(12), 8, 3 }, 117*b9f56698STomas Novotny { pinmux(9), 8, 1 }, 118*b9f56698STomas Novotny { pinmux(7), 8, 3 }, /* GP5[0] */ 119*b9f56698STomas Novotny { pinmux(7), 8, 4 }, 120*b9f56698STomas Novotny { pinmux(7), 8, 5 }, 121*b9f56698STomas Novotny { pinmux(7), 8, 6 }, 122*b9f56698STomas Novotny { pinmux(7), 8, 7 }, 123*b9f56698STomas Novotny { pinmux(8), 8, 0 }, 124*b9f56698STomas Novotny { pinmux(8), 8, 1 }, 125*b9f56698STomas Novotny { pinmux(8), 8, 2 }, 126*b9f56698STomas Novotny { pinmux(8), 8, 3 }, 127*b9f56698STomas Novotny { pinmux(8), 8, 4 }, 128*b9f56698STomas Novotny { pinmux(8), 8, 5 }, 129*b9f56698STomas Novotny { pinmux(8), 8, 6 }, 130*b9f56698STomas Novotny { pinmux(8), 8, 7 }, 131*b9f56698STomas Novotny { pinmux(9), 8, 0 }, 132*b9f56698STomas Novotny { pinmux(7), 8, 1 }, 133*b9f56698STomas Novotny { pinmux(7), 8, 2 }, 134*b9f56698STomas Novotny { pinmux(5), 8, 1 }, /* GP6[0] */ 135*b9f56698STomas Novotny { pinmux(5), 8, 2 }, 136*b9f56698STomas Novotny { pinmux(5), 8, 3 }, 137*b9f56698STomas Novotny { pinmux(5), 8, 4 }, 138*b9f56698STomas Novotny { pinmux(5), 8, 5 }, 139*b9f56698STomas Novotny { pinmux(5), 8, 6 }, 140*b9f56698STomas Novotny { pinmux(5), 8, 7 }, 141*b9f56698STomas Novotny { pinmux(6), 8, 0 }, 142*b9f56698STomas Novotny { pinmux(6), 8, 1 }, 143*b9f56698STomas Novotny { pinmux(6), 8, 2 }, 144*b9f56698STomas Novotny { pinmux(6), 8, 3 }, 145*b9f56698STomas Novotny { pinmux(6), 8, 4 }, 146*b9f56698STomas Novotny { pinmux(6), 8, 5 }, 147*b9f56698STomas Novotny { pinmux(6), 8, 6 }, 148*b9f56698STomas Novotny { pinmux(6), 8, 7 }, 149*b9f56698STomas Novotny { pinmux(7), 8, 0 }, 150*b9f56698STomas Novotny { pinmux(1), 8, 0 }, /* GP7[0] */ 151*b9f56698STomas Novotny { pinmux(1), 8, 1 }, 152*b9f56698STomas Novotny { pinmux(1), 8, 2 }, 153*b9f56698STomas Novotny { pinmux(1), 8, 3 }, 154*b9f56698STomas Novotny { pinmux(1), 8, 4 }, 155*b9f56698STomas Novotny { pinmux(1), 8, 5 }, 156*b9f56698STomas Novotny { pinmux(1), 8, 6 }, 157*b9f56698STomas Novotny { pinmux(1), 8, 7 }, 158*b9f56698STomas Novotny { pinmux(2), 8, 0 }, 159*b9f56698STomas Novotny { pinmux(2), 8, 1 }, 160*b9f56698STomas Novotny { pinmux(2), 8, 2 }, 161*b9f56698STomas Novotny { pinmux(2), 8, 3 }, 162*b9f56698STomas Novotny { pinmux(2), 8, 4 }, 163*b9f56698STomas Novotny { pinmux(2), 8, 5 }, 164*b9f56698STomas Novotny { pinmux(0), 1, 0 }, 165*b9f56698STomas Novotny { pinmux(0), 1, 1 }, 166*b9f56698STomas Novotny }; 167*b9f56698STomas Novotny #else 168f517afd5SLaurence Withers static const struct pinmux_config gpio_pinmux[] = { 169f517afd5SLaurence Withers { pinmux(1), 8, 7 }, /* GP0[0] */ 170f517afd5SLaurence Withers { pinmux(1), 8, 6 }, 171f517afd5SLaurence Withers { pinmux(1), 8, 5 }, 172f517afd5SLaurence Withers { pinmux(1), 8, 4 }, 173f517afd5SLaurence Withers { pinmux(1), 8, 3 }, 174f517afd5SLaurence Withers { pinmux(1), 8, 2 }, 175f517afd5SLaurence Withers { pinmux(1), 8, 1 }, 176f517afd5SLaurence Withers { pinmux(1), 8, 0 }, 177f517afd5SLaurence Withers { pinmux(0), 8, 7 }, 178f517afd5SLaurence Withers { pinmux(0), 8, 6 }, 179f517afd5SLaurence Withers { pinmux(0), 8, 5 }, 180f517afd5SLaurence Withers { pinmux(0), 8, 4 }, 181f517afd5SLaurence Withers { pinmux(0), 8, 3 }, 182f517afd5SLaurence Withers { pinmux(0), 8, 2 }, 183f517afd5SLaurence Withers { pinmux(0), 8, 1 }, 184f517afd5SLaurence Withers { pinmux(0), 8, 0 }, 185f517afd5SLaurence Withers { pinmux(4), 8, 7 }, /* GP1[0] */ 186f517afd5SLaurence Withers { pinmux(4), 8, 6 }, 187f517afd5SLaurence Withers { pinmux(4), 8, 5 }, 188f517afd5SLaurence Withers { pinmux(4), 8, 4 }, 189f517afd5SLaurence Withers { pinmux(4), 8, 3 }, 190f517afd5SLaurence Withers { pinmux(4), 8, 2 }, 191f517afd5SLaurence Withers { pinmux(4), 4, 1 }, 192f517afd5SLaurence Withers { pinmux(4), 4, 0 }, 193f517afd5SLaurence Withers { pinmux(3), 4, 0 }, 194f517afd5SLaurence Withers { pinmux(2), 4, 6 }, 195f517afd5SLaurence Withers { pinmux(2), 4, 5 }, 196f517afd5SLaurence Withers { pinmux(2), 4, 4 }, 197f517afd5SLaurence Withers { pinmux(2), 4, 3 }, 198f517afd5SLaurence Withers { pinmux(2), 4, 2 }, 199f517afd5SLaurence Withers { pinmux(2), 4, 1 }, 200f517afd5SLaurence Withers { pinmux(2), 8, 0 }, 201f517afd5SLaurence Withers { pinmux(6), 8, 7 }, /* GP2[0] */ 202f517afd5SLaurence Withers { pinmux(6), 8, 6 }, 203f517afd5SLaurence Withers { pinmux(6), 8, 5 }, 204f517afd5SLaurence Withers { pinmux(6), 8, 4 }, 205f517afd5SLaurence Withers { pinmux(6), 8, 3 }, 206f517afd5SLaurence Withers { pinmux(6), 8, 2 }, 207f517afd5SLaurence Withers { pinmux(6), 8, 1 }, 208f517afd5SLaurence Withers { pinmux(6), 8, 0 }, 209f517afd5SLaurence Withers { pinmux(5), 8, 7 }, 210f517afd5SLaurence Withers { pinmux(5), 8, 6 }, 211f517afd5SLaurence Withers { pinmux(5), 8, 5 }, 212f517afd5SLaurence Withers { pinmux(5), 8, 4 }, 213f517afd5SLaurence Withers { pinmux(5), 8, 3 }, 214f517afd5SLaurence Withers { pinmux(5), 8, 2 }, 215f517afd5SLaurence Withers { pinmux(5), 8, 1 }, 216f517afd5SLaurence Withers { pinmux(5), 8, 0 }, 217f517afd5SLaurence Withers { pinmux(8), 8, 7 }, /* GP3[0] */ 218f517afd5SLaurence Withers { pinmux(8), 8, 6 }, 219f517afd5SLaurence Withers { pinmux(8), 8, 5 }, 220f517afd5SLaurence Withers { pinmux(8), 8, 4 }, 221f517afd5SLaurence Withers { pinmux(8), 8, 3 }, 222f517afd5SLaurence Withers { pinmux(8), 8, 2 }, 223f517afd5SLaurence Withers { pinmux(8), 8, 1 }, 224f517afd5SLaurence Withers { pinmux(8), 8, 0 }, 225f517afd5SLaurence Withers { pinmux(7), 8, 7 }, 226f517afd5SLaurence Withers { pinmux(7), 8, 6 }, 227f517afd5SLaurence Withers { pinmux(7), 8, 5 }, 228f517afd5SLaurence Withers { pinmux(7), 8, 4 }, 229f517afd5SLaurence Withers { pinmux(7), 8, 3 }, 230f517afd5SLaurence Withers { pinmux(7), 8, 2 }, 231f517afd5SLaurence Withers { pinmux(7), 8, 1 }, 232f517afd5SLaurence Withers { pinmux(7), 8, 0 }, 233f517afd5SLaurence Withers { pinmux(10), 8, 7 }, /* GP4[0] */ 234f517afd5SLaurence Withers { pinmux(10), 8, 6 }, 235f517afd5SLaurence Withers { pinmux(10), 8, 5 }, 236f517afd5SLaurence Withers { pinmux(10), 8, 4 }, 237f517afd5SLaurence Withers { pinmux(10), 8, 3 }, 238f517afd5SLaurence Withers { pinmux(10), 8, 2 }, 239f517afd5SLaurence Withers { pinmux(10), 8, 1 }, 240f517afd5SLaurence Withers { pinmux(10), 8, 0 }, 241f517afd5SLaurence Withers { pinmux(9), 8, 7 }, 242f517afd5SLaurence Withers { pinmux(9), 8, 6 }, 243f517afd5SLaurence Withers { pinmux(9), 8, 5 }, 244f517afd5SLaurence Withers { pinmux(9), 8, 4 }, 245f517afd5SLaurence Withers { pinmux(9), 8, 3 }, 246f517afd5SLaurence Withers { pinmux(9), 8, 2 }, 247f517afd5SLaurence Withers { pinmux(9), 8, 1 }, 248f517afd5SLaurence Withers { pinmux(9), 8, 0 }, 249f517afd5SLaurence Withers { pinmux(12), 8, 7 }, /* GP5[0] */ 250f517afd5SLaurence Withers { pinmux(12), 8, 6 }, 251f517afd5SLaurence Withers { pinmux(12), 8, 5 }, 252f517afd5SLaurence Withers { pinmux(12), 8, 4 }, 253f517afd5SLaurence Withers { pinmux(12), 8, 3 }, 254f517afd5SLaurence Withers { pinmux(12), 8, 2 }, 255f517afd5SLaurence Withers { pinmux(12), 8, 1 }, 256f517afd5SLaurence Withers { pinmux(12), 8, 0 }, 257f517afd5SLaurence Withers { pinmux(11), 8, 7 }, 258f517afd5SLaurence Withers { pinmux(11), 8, 6 }, 259f517afd5SLaurence Withers { pinmux(11), 8, 5 }, 260f517afd5SLaurence Withers { pinmux(11), 8, 4 }, 261f517afd5SLaurence Withers { pinmux(11), 8, 3 }, 262f517afd5SLaurence Withers { pinmux(11), 8, 2 }, 263f517afd5SLaurence Withers { pinmux(11), 8, 1 }, 264f517afd5SLaurence Withers { pinmux(11), 8, 0 }, 265f517afd5SLaurence Withers { pinmux(19), 8, 6 }, /* GP6[0] */ 266f517afd5SLaurence Withers { pinmux(19), 8, 5 }, 267f517afd5SLaurence Withers { pinmux(19), 8, 4 }, 268f517afd5SLaurence Withers { pinmux(19), 8, 3 }, 269f517afd5SLaurence Withers { pinmux(19), 8, 2 }, 270f517afd5SLaurence Withers { pinmux(16), 8, 1 }, 271f517afd5SLaurence Withers { pinmux(14), 8, 1 }, 272f517afd5SLaurence Withers { pinmux(14), 8, 0 }, 273f517afd5SLaurence Withers { pinmux(13), 8, 7 }, 274f517afd5SLaurence Withers { pinmux(13), 8, 6 }, 275f517afd5SLaurence Withers { pinmux(13), 8, 5 }, 276f517afd5SLaurence Withers { pinmux(13), 8, 4 }, 277f517afd5SLaurence Withers { pinmux(13), 8, 3 }, 278f517afd5SLaurence Withers { pinmux(13), 8, 2 }, 279f517afd5SLaurence Withers { pinmux(13), 8, 1 }, 280f517afd5SLaurence Withers { pinmux(13), 8, 0 }, 281f517afd5SLaurence Withers { pinmux(18), 8, 1 }, /* GP7[0] */ 282f517afd5SLaurence Withers { pinmux(18), 8, 0 }, 283f517afd5SLaurence Withers { pinmux(17), 8, 7 }, 284f517afd5SLaurence Withers { pinmux(17), 8, 6 }, 285f517afd5SLaurence Withers { pinmux(17), 8, 5 }, 286f517afd5SLaurence Withers { pinmux(17), 8, 4 }, 287f517afd5SLaurence Withers { pinmux(17), 8, 3 }, 288f517afd5SLaurence Withers { pinmux(17), 8, 2 }, 289f517afd5SLaurence Withers { pinmux(17), 8, 1 }, 290f517afd5SLaurence Withers { pinmux(17), 8, 0 }, 291f517afd5SLaurence Withers { pinmux(16), 8, 7 }, 292f517afd5SLaurence Withers { pinmux(16), 8, 6 }, 293f517afd5SLaurence Withers { pinmux(16), 8, 5 }, 294f517afd5SLaurence Withers { pinmux(16), 8, 4 }, 295f517afd5SLaurence Withers { pinmux(16), 8, 3 }, 296f517afd5SLaurence Withers { pinmux(16), 8, 2 }, 297f517afd5SLaurence Withers { pinmux(19), 8, 0 }, /* GP8[0] */ 298f517afd5SLaurence Withers { pinmux(3), 4, 7 }, 299f517afd5SLaurence Withers { pinmux(3), 4, 6 }, 300f517afd5SLaurence Withers { pinmux(3), 4, 5 }, 301f517afd5SLaurence Withers { pinmux(3), 4, 4 }, 302f517afd5SLaurence Withers { pinmux(3), 4, 3 }, 303f517afd5SLaurence Withers { pinmux(3), 4, 2 }, 304f517afd5SLaurence Withers { pinmux(2), 4, 7 }, 305f517afd5SLaurence Withers { pinmux(19), 8, 1 }, 306f517afd5SLaurence Withers { pinmux(19), 8, 0 }, 307f517afd5SLaurence Withers { pinmux(18), 8, 7 }, 308f517afd5SLaurence Withers { pinmux(18), 8, 6 }, 309f517afd5SLaurence Withers { pinmux(18), 8, 5 }, 310f517afd5SLaurence Withers { pinmux(18), 8, 4 }, 311f517afd5SLaurence Withers { pinmux(18), 8, 3 }, 312f517afd5SLaurence Withers { pinmux(18), 8, 2 }, 313f517afd5SLaurence Withers }; 314*b9f56698STomas Novotny #endif 315f517afd5SLaurence Withers 316365d6070SJoe Hershberger int gpio_request(unsigned gpio, const char *label) 317f517afd5SLaurence Withers { 318365d6070SJoe Hershberger if (gpio >= MAX_NUM_GPIOS) 319f517afd5SLaurence Withers return -1; 320f517afd5SLaurence Withers 321365d6070SJoe Hershberger if (gpio_registry[gpio].is_registered) 322f517afd5SLaurence Withers return -1; 323f517afd5SLaurence Withers 324365d6070SJoe Hershberger gpio_registry[gpio].is_registered = 1; 325365d6070SJoe Hershberger strncpy(gpio_registry[gpio].name, label, GPIO_NAME_SIZE); 326365d6070SJoe Hershberger gpio_registry[gpio].name[GPIO_NAME_SIZE - 1] = 0; 327f517afd5SLaurence Withers 328365d6070SJoe Hershberger davinci_configure_pin_mux(&gpio_pinmux[gpio], 1); 329f517afd5SLaurence Withers 330f517afd5SLaurence Withers return 0; 331f517afd5SLaurence Withers } 332f517afd5SLaurence Withers 333365d6070SJoe Hershberger int gpio_free(unsigned gpio) 334f517afd5SLaurence Withers { 335365d6070SJoe Hershberger if (gpio >= MAX_NUM_GPIOS) 336365d6070SJoe Hershberger return -1; 337365d6070SJoe Hershberger 338365d6070SJoe Hershberger if (!gpio_registry[gpio].is_registered) 339365d6070SJoe Hershberger return -1; 340365d6070SJoe Hershberger 341365d6070SJoe Hershberger gpio_registry[gpio].is_registered = 0; 342365d6070SJoe Hershberger gpio_registry[gpio].name[0] = '\0'; 343365d6070SJoe Hershberger /* Do not configure as input or change pin mux here */ 344365d6070SJoe Hershberger return 0; 345f517afd5SLaurence Withers } 346f517afd5SLaurence Withers 347365d6070SJoe Hershberger int gpio_direction_input(unsigned gpio) 348f517afd5SLaurence Withers { 349f517afd5SLaurence Withers struct davinci_gpio *bank; 350f517afd5SLaurence Withers 351365d6070SJoe Hershberger bank = GPIO_BANK(gpio); 352365d6070SJoe Hershberger setbits_le32(&bank->dir, 1U << GPIO_BIT(gpio)); 353f517afd5SLaurence Withers return 0; 354f517afd5SLaurence Withers } 355f517afd5SLaurence Withers 356365d6070SJoe Hershberger int gpio_direction_output(unsigned gpio, int value) 357f517afd5SLaurence Withers { 358f517afd5SLaurence Withers struct davinci_gpio *bank; 359f517afd5SLaurence Withers 360365d6070SJoe Hershberger bank = GPIO_BANK(gpio); 361365d6070SJoe Hershberger clrbits_le32(&bank->dir, 1U << GPIO_BIT(gpio)); 362365d6070SJoe Hershberger gpio_set_value(gpio, value); 363f517afd5SLaurence Withers return 0; 364f517afd5SLaurence Withers } 365f517afd5SLaurence Withers 366365d6070SJoe Hershberger int gpio_get_value(unsigned gpio) 367f517afd5SLaurence Withers { 368f517afd5SLaurence Withers struct davinci_gpio *bank; 369f517afd5SLaurence Withers unsigned int ip; 370f517afd5SLaurence Withers 371365d6070SJoe Hershberger bank = GPIO_BANK(gpio); 372365d6070SJoe Hershberger ip = in_le32(&bank->in_data) & (1U << GPIO_BIT(gpio)); 373f517afd5SLaurence Withers return ip ? 1 : 0; 374f517afd5SLaurence Withers } 375f517afd5SLaurence Withers 376365d6070SJoe Hershberger int gpio_set_value(unsigned gpio, int value) 377f517afd5SLaurence Withers { 378f517afd5SLaurence Withers struct davinci_gpio *bank; 379f517afd5SLaurence Withers 380365d6070SJoe Hershberger bank = GPIO_BANK(gpio); 381f517afd5SLaurence Withers 382f517afd5SLaurence Withers if (value) 383365d6070SJoe Hershberger bank->set_data = 1U << GPIO_BIT(gpio); 384f517afd5SLaurence Withers else 385365d6070SJoe Hershberger bank->clr_data = 1U << GPIO_BIT(gpio); 386365d6070SJoe Hershberger 387365d6070SJoe Hershberger return 0; 388f517afd5SLaurence Withers } 389f517afd5SLaurence Withers 390f517afd5SLaurence Withers void gpio_info(void) 391f517afd5SLaurence Withers { 392365d6070SJoe Hershberger unsigned gpio, dir, val; 393f517afd5SLaurence Withers struct davinci_gpio *bank; 394f517afd5SLaurence Withers 395365d6070SJoe Hershberger for (gpio = 0; gpio < MAX_NUM_GPIOS; ++gpio) { 396365d6070SJoe Hershberger bank = GPIO_BANK(gpio); 397365d6070SJoe Hershberger dir = in_le32(&bank->dir) & (1U << GPIO_BIT(gpio)); 398365d6070SJoe Hershberger val = gpio_get_value(gpio); 399f517afd5SLaurence Withers 400f517afd5SLaurence Withers printf("% 4d: %s: %d [%c] %s\n", 401365d6070SJoe Hershberger gpio, dir ? " in" : "out", val, 402365d6070SJoe Hershberger gpio_registry[gpio].is_registered ? 'x' : ' ', 403365d6070SJoe Hershberger gpio_registry[gpio].name); 404f517afd5SLaurence Withers } 405f517afd5SLaurence Withers } 406