1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+ 2f517afd5SLaurence Withers /* 3f517afd5SLaurence Withers * GPIO driver for TI DaVinci DA8xx SOCs. 4f517afd5SLaurence Withers * 5f517afd5SLaurence Withers * (C) Copyright 2011 Guralp Systems Ltd. 6f517afd5SLaurence Withers * Laurence Withers <lwithers@guralp.com> 7f517afd5SLaurence Withers */ 8f517afd5SLaurence Withers 9f517afd5SLaurence Withers #include <common.h> 10f517afd5SLaurence Withers #include <asm/io.h> 11f517afd5SLaurence Withers #include <asm/gpio.h> 12f517afd5SLaurence Withers #include <asm/arch/hardware.h> 13f517afd5SLaurence Withers #include <asm/arch/davinci_misc.h> 14f517afd5SLaurence Withers 15f517afd5SLaurence Withers static struct gpio_registry { 16f517afd5SLaurence Withers int is_registered; 17f517afd5SLaurence Withers char name[GPIO_NAME_SIZE]; 18f517afd5SLaurence Withers } gpio_registry[MAX_NUM_GPIOS]; 19f517afd5SLaurence Withers 2003414ac4SHolger Hans Peter Freyther #if defined(CONFIG_SOC_DA8XX) 21f517afd5SLaurence Withers #define pinmux(x) (&davinci_syscfg_regs->pinmux[x]) 22f517afd5SLaurence Withers 23b9f56698STomas Novotny #if defined(CONFIG_SOC_DA8XX) && !defined(CONFIG_SOC_DA850) 24b9f56698STomas Novotny static const struct pinmux_config gpio_pinmux[] = { 25b9f56698STomas Novotny { pinmux(13), 8, 6 }, /* GP0[0] */ 26b9f56698STomas Novotny { pinmux(13), 8, 7 }, 27b9f56698STomas Novotny { pinmux(14), 8, 0 }, 28b9f56698STomas Novotny { pinmux(14), 8, 1 }, 29b9f56698STomas Novotny { pinmux(14), 8, 2 }, 30b9f56698STomas Novotny { pinmux(14), 8, 3 }, 31b9f56698STomas Novotny { pinmux(14), 8, 4 }, 32b9f56698STomas Novotny { pinmux(14), 8, 5 }, 33b9f56698STomas Novotny { pinmux(14), 8, 6 }, 34b9f56698STomas Novotny { pinmux(14), 8, 7 }, 35b9f56698STomas Novotny { pinmux(15), 8, 0 }, 36b9f56698STomas Novotny { pinmux(15), 8, 1 }, 37b9f56698STomas Novotny { pinmux(15), 8, 2 }, 38b9f56698STomas Novotny { pinmux(15), 8, 3 }, 39b9f56698STomas Novotny { pinmux(15), 8, 4 }, 40b9f56698STomas Novotny { pinmux(15), 8, 5 }, 41b9f56698STomas Novotny { pinmux(15), 8, 6 }, /* GP1[0] */ 42b9f56698STomas Novotny { pinmux(15), 8, 7 }, 43b9f56698STomas Novotny { pinmux(16), 8, 0 }, 44b9f56698STomas Novotny { pinmux(16), 8, 1 }, 45b9f56698STomas Novotny { pinmux(16), 8, 2 }, 46b9f56698STomas Novotny { pinmux(16), 8, 3 }, 47b9f56698STomas Novotny { pinmux(16), 8, 4 }, 48b9f56698STomas Novotny { pinmux(16), 8, 5 }, 49b9f56698STomas Novotny { pinmux(16), 8, 6 }, 50b9f56698STomas Novotny { pinmux(16), 8, 7 }, 51b9f56698STomas Novotny { pinmux(17), 8, 0 }, 52b9f56698STomas Novotny { pinmux(17), 8, 1 }, 53b9f56698STomas Novotny { pinmux(17), 8, 2 }, 54b9f56698STomas Novotny { pinmux(17), 8, 3 }, 55b9f56698STomas Novotny { pinmux(17), 8, 4 }, 56b9f56698STomas Novotny { pinmux(17), 8, 5 }, 57b9f56698STomas Novotny { pinmux(17), 8, 6 }, /* GP2[0] */ 58b9f56698STomas Novotny { pinmux(17), 8, 7 }, 59b9f56698STomas Novotny { pinmux(18), 8, 0 }, 60b9f56698STomas Novotny { pinmux(18), 8, 1 }, 61b9f56698STomas Novotny { pinmux(18), 8, 2 }, 62b9f56698STomas Novotny { pinmux(18), 8, 3 }, 63b9f56698STomas Novotny { pinmux(18), 8, 4 }, 64b9f56698STomas Novotny { pinmux(18), 8, 5 }, 65b9f56698STomas Novotny { pinmux(18), 8, 6 }, 66b9f56698STomas Novotny { pinmux(18), 8, 7 }, 67b9f56698STomas Novotny { pinmux(19), 8, 0 }, 68b9f56698STomas Novotny { pinmux(9), 8, 2 }, 69b9f56698STomas Novotny { pinmux(9), 8, 3 }, 70b9f56698STomas Novotny { pinmux(9), 8, 4 }, 71b9f56698STomas Novotny { pinmux(9), 8, 5 }, 72b9f56698STomas Novotny { pinmux(9), 8, 6 }, 73b9f56698STomas Novotny { pinmux(10), 8, 1 }, /* GP3[0] */ 74b9f56698STomas Novotny { pinmux(10), 8, 2 }, 75b9f56698STomas Novotny { pinmux(10), 8, 3 }, 76b9f56698STomas Novotny { pinmux(10), 8, 4 }, 77b9f56698STomas Novotny { pinmux(10), 8, 5 }, 78b9f56698STomas Novotny { pinmux(10), 8, 6 }, 79b9f56698STomas Novotny { pinmux(10), 8, 7 }, 80b9f56698STomas Novotny { pinmux(11), 8, 0 }, 81b9f56698STomas Novotny { pinmux(11), 8, 1 }, 82b9f56698STomas Novotny { pinmux(11), 8, 2 }, 83b9f56698STomas Novotny { pinmux(11), 8, 3 }, 84b9f56698STomas Novotny { pinmux(11), 8, 4 }, 85b9f56698STomas Novotny { pinmux(9), 8, 7 }, 86b9f56698STomas Novotny { pinmux(2), 8, 6 }, 87b9f56698STomas Novotny { pinmux(11), 8, 5 }, 88b9f56698STomas Novotny { pinmux(11), 8, 6 }, 89b9f56698STomas Novotny { pinmux(12), 8, 4 }, /* GP4[0] */ 90b9f56698STomas Novotny { pinmux(12), 8, 5 }, 91b9f56698STomas Novotny { pinmux(12), 8, 6 }, 92b9f56698STomas Novotny { pinmux(12), 8, 7 }, 93b9f56698STomas Novotny { pinmux(13), 8, 0 }, 94b9f56698STomas Novotny { pinmux(13), 8, 1 }, 95b9f56698STomas Novotny { pinmux(13), 8, 2 }, 96b9f56698STomas Novotny { pinmux(13), 8, 3 }, 97b9f56698STomas Novotny { pinmux(13), 8, 4 }, 98b9f56698STomas Novotny { pinmux(13), 8, 5 }, 99b9f56698STomas Novotny { pinmux(11), 8, 7 }, 100b9f56698STomas Novotny { pinmux(12), 8, 0 }, 101b9f56698STomas Novotny { pinmux(12), 8, 1 }, 102b9f56698STomas Novotny { pinmux(12), 8, 2 }, 103b9f56698STomas Novotny { pinmux(12), 8, 3 }, 104b9f56698STomas Novotny { pinmux(9), 8, 1 }, 105b9f56698STomas Novotny { pinmux(7), 8, 3 }, /* GP5[0] */ 106b9f56698STomas Novotny { pinmux(7), 8, 4 }, 107b9f56698STomas Novotny { pinmux(7), 8, 5 }, 108b9f56698STomas Novotny { pinmux(7), 8, 6 }, 109b9f56698STomas Novotny { pinmux(7), 8, 7 }, 110b9f56698STomas Novotny { pinmux(8), 8, 0 }, 111b9f56698STomas Novotny { pinmux(8), 8, 1 }, 112b9f56698STomas Novotny { pinmux(8), 8, 2 }, 113b9f56698STomas Novotny { pinmux(8), 8, 3 }, 114b9f56698STomas Novotny { pinmux(8), 8, 4 }, 115b9f56698STomas Novotny { pinmux(8), 8, 5 }, 116b9f56698STomas Novotny { pinmux(8), 8, 6 }, 117b9f56698STomas Novotny { pinmux(8), 8, 7 }, 118b9f56698STomas Novotny { pinmux(9), 8, 0 }, 119b9f56698STomas Novotny { pinmux(7), 8, 1 }, 120b9f56698STomas Novotny { pinmux(7), 8, 2 }, 121b9f56698STomas Novotny { pinmux(5), 8, 1 }, /* GP6[0] */ 122b9f56698STomas Novotny { pinmux(5), 8, 2 }, 123b9f56698STomas Novotny { pinmux(5), 8, 3 }, 124b9f56698STomas Novotny { pinmux(5), 8, 4 }, 125b9f56698STomas Novotny { pinmux(5), 8, 5 }, 126b9f56698STomas Novotny { pinmux(5), 8, 6 }, 127b9f56698STomas Novotny { pinmux(5), 8, 7 }, 128b9f56698STomas Novotny { pinmux(6), 8, 0 }, 129b9f56698STomas Novotny { pinmux(6), 8, 1 }, 130b9f56698STomas Novotny { pinmux(6), 8, 2 }, 131b9f56698STomas Novotny { pinmux(6), 8, 3 }, 132b9f56698STomas Novotny { pinmux(6), 8, 4 }, 133b9f56698STomas Novotny { pinmux(6), 8, 5 }, 134b9f56698STomas Novotny { pinmux(6), 8, 6 }, 135b9f56698STomas Novotny { pinmux(6), 8, 7 }, 136b9f56698STomas Novotny { pinmux(7), 8, 0 }, 137b9f56698STomas Novotny { pinmux(1), 8, 0 }, /* GP7[0] */ 138b9f56698STomas Novotny { pinmux(1), 8, 1 }, 139b9f56698STomas Novotny { pinmux(1), 8, 2 }, 140b9f56698STomas Novotny { pinmux(1), 8, 3 }, 141b9f56698STomas Novotny { pinmux(1), 8, 4 }, 142b9f56698STomas Novotny { pinmux(1), 8, 5 }, 143b9f56698STomas Novotny { pinmux(1), 8, 6 }, 144b9f56698STomas Novotny { pinmux(1), 8, 7 }, 145b9f56698STomas Novotny { pinmux(2), 8, 0 }, 146b9f56698STomas Novotny { pinmux(2), 8, 1 }, 147b9f56698STomas Novotny { pinmux(2), 8, 2 }, 148b9f56698STomas Novotny { pinmux(2), 8, 3 }, 149b9f56698STomas Novotny { pinmux(2), 8, 4 }, 150b9f56698STomas Novotny { pinmux(2), 8, 5 }, 151b9f56698STomas Novotny { pinmux(0), 1, 0 }, 152b9f56698STomas Novotny { pinmux(0), 1, 1 }, 153b9f56698STomas Novotny }; 15476b40ab4STom Rini #else /* CONFIG_SOC_DA8XX && CONFIG_SOC_DA850 */ 155f517afd5SLaurence Withers static const struct pinmux_config gpio_pinmux[] = { 156f517afd5SLaurence Withers { pinmux(1), 8, 7 }, /* GP0[0] */ 157f517afd5SLaurence Withers { pinmux(1), 8, 6 }, 158f517afd5SLaurence Withers { pinmux(1), 8, 5 }, 159f517afd5SLaurence Withers { pinmux(1), 8, 4 }, 160f517afd5SLaurence Withers { pinmux(1), 8, 3 }, 161f517afd5SLaurence Withers { pinmux(1), 8, 2 }, 162f517afd5SLaurence Withers { pinmux(1), 8, 1 }, 163f517afd5SLaurence Withers { pinmux(1), 8, 0 }, 164f517afd5SLaurence Withers { pinmux(0), 8, 7 }, 165f517afd5SLaurence Withers { pinmux(0), 8, 6 }, 166f517afd5SLaurence Withers { pinmux(0), 8, 5 }, 167f517afd5SLaurence Withers { pinmux(0), 8, 4 }, 168f517afd5SLaurence Withers { pinmux(0), 8, 3 }, 169f517afd5SLaurence Withers { pinmux(0), 8, 2 }, 170f517afd5SLaurence Withers { pinmux(0), 8, 1 }, 171f517afd5SLaurence Withers { pinmux(0), 8, 0 }, 172f517afd5SLaurence Withers { pinmux(4), 8, 7 }, /* GP1[0] */ 173f517afd5SLaurence Withers { pinmux(4), 8, 6 }, 174f517afd5SLaurence Withers { pinmux(4), 8, 5 }, 175f517afd5SLaurence Withers { pinmux(4), 8, 4 }, 176f517afd5SLaurence Withers { pinmux(4), 8, 3 }, 177f517afd5SLaurence Withers { pinmux(4), 8, 2 }, 178f517afd5SLaurence Withers { pinmux(4), 4, 1 }, 179f517afd5SLaurence Withers { pinmux(4), 4, 0 }, 180f517afd5SLaurence Withers { pinmux(3), 4, 0 }, 181f517afd5SLaurence Withers { pinmux(2), 4, 6 }, 182f517afd5SLaurence Withers { pinmux(2), 4, 5 }, 183f517afd5SLaurence Withers { pinmux(2), 4, 4 }, 184f517afd5SLaurence Withers { pinmux(2), 4, 3 }, 185f517afd5SLaurence Withers { pinmux(2), 4, 2 }, 186f517afd5SLaurence Withers { pinmux(2), 4, 1 }, 187f517afd5SLaurence Withers { pinmux(2), 8, 0 }, 188f517afd5SLaurence Withers { pinmux(6), 8, 7 }, /* GP2[0] */ 189f517afd5SLaurence Withers { pinmux(6), 8, 6 }, 190f517afd5SLaurence Withers { pinmux(6), 8, 5 }, 191f517afd5SLaurence Withers { pinmux(6), 8, 4 }, 192f517afd5SLaurence Withers { pinmux(6), 8, 3 }, 193f517afd5SLaurence Withers { pinmux(6), 8, 2 }, 194f517afd5SLaurence Withers { pinmux(6), 8, 1 }, 195f517afd5SLaurence Withers { pinmux(6), 8, 0 }, 196f517afd5SLaurence Withers { pinmux(5), 8, 7 }, 197f517afd5SLaurence Withers { pinmux(5), 8, 6 }, 198f517afd5SLaurence Withers { pinmux(5), 8, 5 }, 199f517afd5SLaurence Withers { pinmux(5), 8, 4 }, 200f517afd5SLaurence Withers { pinmux(5), 8, 3 }, 201f517afd5SLaurence Withers { pinmux(5), 8, 2 }, 202f517afd5SLaurence Withers { pinmux(5), 8, 1 }, 203f517afd5SLaurence Withers { pinmux(5), 8, 0 }, 204f517afd5SLaurence Withers { pinmux(8), 8, 7 }, /* GP3[0] */ 205f517afd5SLaurence Withers { pinmux(8), 8, 6 }, 206f517afd5SLaurence Withers { pinmux(8), 8, 5 }, 207f517afd5SLaurence Withers { pinmux(8), 8, 4 }, 208f517afd5SLaurence Withers { pinmux(8), 8, 3 }, 209f517afd5SLaurence Withers { pinmux(8), 8, 2 }, 210f517afd5SLaurence Withers { pinmux(8), 8, 1 }, 211f517afd5SLaurence Withers { pinmux(8), 8, 0 }, 212f517afd5SLaurence Withers { pinmux(7), 8, 7 }, 213f517afd5SLaurence Withers { pinmux(7), 8, 6 }, 214f517afd5SLaurence Withers { pinmux(7), 8, 5 }, 215f517afd5SLaurence Withers { pinmux(7), 8, 4 }, 216f517afd5SLaurence Withers { pinmux(7), 8, 3 }, 217f517afd5SLaurence Withers { pinmux(7), 8, 2 }, 218f517afd5SLaurence Withers { pinmux(7), 8, 1 }, 219f517afd5SLaurence Withers { pinmux(7), 8, 0 }, 220f517afd5SLaurence Withers { pinmux(10), 8, 7 }, /* GP4[0] */ 221f517afd5SLaurence Withers { pinmux(10), 8, 6 }, 222f517afd5SLaurence Withers { pinmux(10), 8, 5 }, 223f517afd5SLaurence Withers { pinmux(10), 8, 4 }, 224f517afd5SLaurence Withers { pinmux(10), 8, 3 }, 225f517afd5SLaurence Withers { pinmux(10), 8, 2 }, 226f517afd5SLaurence Withers { pinmux(10), 8, 1 }, 227f517afd5SLaurence Withers { pinmux(10), 8, 0 }, 228f517afd5SLaurence Withers { pinmux(9), 8, 7 }, 229f517afd5SLaurence Withers { pinmux(9), 8, 6 }, 230f517afd5SLaurence Withers { pinmux(9), 8, 5 }, 231f517afd5SLaurence Withers { pinmux(9), 8, 4 }, 232f517afd5SLaurence Withers { pinmux(9), 8, 3 }, 233f517afd5SLaurence Withers { pinmux(9), 8, 2 }, 234f517afd5SLaurence Withers { pinmux(9), 8, 1 }, 235f517afd5SLaurence Withers { pinmux(9), 8, 0 }, 236f517afd5SLaurence Withers { pinmux(12), 8, 7 }, /* GP5[0] */ 237f517afd5SLaurence Withers { pinmux(12), 8, 6 }, 238f517afd5SLaurence Withers { pinmux(12), 8, 5 }, 239f517afd5SLaurence Withers { pinmux(12), 8, 4 }, 240f517afd5SLaurence Withers { pinmux(12), 8, 3 }, 241f517afd5SLaurence Withers { pinmux(12), 8, 2 }, 242f517afd5SLaurence Withers { pinmux(12), 8, 1 }, 243f517afd5SLaurence Withers { pinmux(12), 8, 0 }, 244f517afd5SLaurence Withers { pinmux(11), 8, 7 }, 245f517afd5SLaurence Withers { pinmux(11), 8, 6 }, 246f517afd5SLaurence Withers { pinmux(11), 8, 5 }, 247f517afd5SLaurence Withers { pinmux(11), 8, 4 }, 248f517afd5SLaurence Withers { pinmux(11), 8, 3 }, 249f517afd5SLaurence Withers { pinmux(11), 8, 2 }, 250f517afd5SLaurence Withers { pinmux(11), 8, 1 }, 251f517afd5SLaurence Withers { pinmux(11), 8, 0 }, 252f517afd5SLaurence Withers { pinmux(19), 8, 6 }, /* GP6[0] */ 253f517afd5SLaurence Withers { pinmux(19), 8, 5 }, 254f517afd5SLaurence Withers { pinmux(19), 8, 4 }, 255f517afd5SLaurence Withers { pinmux(19), 8, 3 }, 256f517afd5SLaurence Withers { pinmux(19), 8, 2 }, 257f517afd5SLaurence Withers { pinmux(16), 8, 1 }, 258f517afd5SLaurence Withers { pinmux(14), 8, 1 }, 259f517afd5SLaurence Withers { pinmux(14), 8, 0 }, 260f517afd5SLaurence Withers { pinmux(13), 8, 7 }, 261f517afd5SLaurence Withers { pinmux(13), 8, 6 }, 262f517afd5SLaurence Withers { pinmux(13), 8, 5 }, 263f517afd5SLaurence Withers { pinmux(13), 8, 4 }, 264f517afd5SLaurence Withers { pinmux(13), 8, 3 }, 265f517afd5SLaurence Withers { pinmux(13), 8, 2 }, 266f517afd5SLaurence Withers { pinmux(13), 8, 1 }, 267f517afd5SLaurence Withers { pinmux(13), 8, 0 }, 268f517afd5SLaurence Withers { pinmux(18), 8, 1 }, /* GP7[0] */ 269f517afd5SLaurence Withers { pinmux(18), 8, 0 }, 270f517afd5SLaurence Withers { pinmux(17), 8, 7 }, 271f517afd5SLaurence Withers { pinmux(17), 8, 6 }, 272f517afd5SLaurence Withers { pinmux(17), 8, 5 }, 273f517afd5SLaurence Withers { pinmux(17), 8, 4 }, 274f517afd5SLaurence Withers { pinmux(17), 8, 3 }, 275f517afd5SLaurence Withers { pinmux(17), 8, 2 }, 276f517afd5SLaurence Withers { pinmux(17), 8, 1 }, 277f517afd5SLaurence Withers { pinmux(17), 8, 0 }, 278f517afd5SLaurence Withers { pinmux(16), 8, 7 }, 279f517afd5SLaurence Withers { pinmux(16), 8, 6 }, 280f517afd5SLaurence Withers { pinmux(16), 8, 5 }, 281f517afd5SLaurence Withers { pinmux(16), 8, 4 }, 282f517afd5SLaurence Withers { pinmux(16), 8, 3 }, 283f517afd5SLaurence Withers { pinmux(16), 8, 2 }, 284f517afd5SLaurence Withers { pinmux(19), 8, 0 }, /* GP8[0] */ 285f517afd5SLaurence Withers { pinmux(3), 4, 7 }, 286f517afd5SLaurence Withers { pinmux(3), 4, 6 }, 287f517afd5SLaurence Withers { pinmux(3), 4, 5 }, 288f517afd5SLaurence Withers { pinmux(3), 4, 4 }, 289f517afd5SLaurence Withers { pinmux(3), 4, 3 }, 290f517afd5SLaurence Withers { pinmux(3), 4, 2 }, 291f517afd5SLaurence Withers { pinmux(2), 4, 7 }, 292f517afd5SLaurence Withers { pinmux(19), 8, 1 }, 293f517afd5SLaurence Withers { pinmux(19), 8, 0 }, 294f517afd5SLaurence Withers { pinmux(18), 8, 7 }, 295f517afd5SLaurence Withers { pinmux(18), 8, 6 }, 296f517afd5SLaurence Withers { pinmux(18), 8, 5 }, 297f517afd5SLaurence Withers { pinmux(18), 8, 4 }, 298f517afd5SLaurence Withers { pinmux(18), 8, 3 }, 299f517afd5SLaurence Withers { pinmux(18), 8, 2 }, 300f517afd5SLaurence Withers }; 30176b40ab4STom Rini #endif /* CONFIG_SOC_DA8XX && !CONFIG_SOC_DA850 */ 30276b40ab4STom Rini #else /* !CONFIG_SOC_DA8XX */ 30303414ac4SHolger Hans Peter Freyther #define davinci_configure_pin_mux(a, b) 30476b40ab4STom Rini #endif /* CONFIG_SOC_DA8XX */ 305f517afd5SLaurence Withers 306365d6070SJoe Hershberger int gpio_request(unsigned gpio, const char *label) 307f517afd5SLaurence Withers { 308365d6070SJoe Hershberger if (gpio >= MAX_NUM_GPIOS) 309f517afd5SLaurence Withers return -1; 310f517afd5SLaurence Withers 311365d6070SJoe Hershberger if (gpio_registry[gpio].is_registered) 312f517afd5SLaurence Withers return -1; 313f517afd5SLaurence Withers 314365d6070SJoe Hershberger gpio_registry[gpio].is_registered = 1; 315365d6070SJoe Hershberger strncpy(gpio_registry[gpio].name, label, GPIO_NAME_SIZE); 316365d6070SJoe Hershberger gpio_registry[gpio].name[GPIO_NAME_SIZE - 1] = 0; 317f517afd5SLaurence Withers 318365d6070SJoe Hershberger davinci_configure_pin_mux(&gpio_pinmux[gpio], 1); 319f517afd5SLaurence Withers 320f517afd5SLaurence Withers return 0; 321f517afd5SLaurence Withers } 322f517afd5SLaurence Withers 323365d6070SJoe Hershberger int gpio_free(unsigned gpio) 324f517afd5SLaurence Withers { 325365d6070SJoe Hershberger if (gpio >= MAX_NUM_GPIOS) 326365d6070SJoe Hershberger return -1; 327365d6070SJoe Hershberger 328365d6070SJoe Hershberger if (!gpio_registry[gpio].is_registered) 329365d6070SJoe Hershberger return -1; 330365d6070SJoe Hershberger 331365d6070SJoe Hershberger gpio_registry[gpio].is_registered = 0; 332365d6070SJoe Hershberger gpio_registry[gpio].name[0] = '\0'; 333365d6070SJoe Hershberger /* Do not configure as input or change pin mux here */ 334365d6070SJoe Hershberger return 0; 335f517afd5SLaurence Withers } 336f517afd5SLaurence Withers 337365d6070SJoe Hershberger int gpio_direction_input(unsigned gpio) 338f517afd5SLaurence Withers { 339f517afd5SLaurence Withers struct davinci_gpio *bank; 340f517afd5SLaurence Withers 341365d6070SJoe Hershberger bank = GPIO_BANK(gpio); 342365d6070SJoe Hershberger setbits_le32(&bank->dir, 1U << GPIO_BIT(gpio)); 343f517afd5SLaurence Withers return 0; 344f517afd5SLaurence Withers } 345f517afd5SLaurence Withers 346365d6070SJoe Hershberger int gpio_direction_output(unsigned gpio, int value) 347f517afd5SLaurence Withers { 348f517afd5SLaurence Withers struct davinci_gpio *bank; 349f517afd5SLaurence Withers 350365d6070SJoe Hershberger bank = GPIO_BANK(gpio); 351365d6070SJoe Hershberger clrbits_le32(&bank->dir, 1U << GPIO_BIT(gpio)); 352365d6070SJoe Hershberger gpio_set_value(gpio, value); 353f517afd5SLaurence Withers return 0; 354f517afd5SLaurence Withers } 355f517afd5SLaurence Withers 356365d6070SJoe Hershberger int gpio_get_value(unsigned gpio) 357f517afd5SLaurence Withers { 358f517afd5SLaurence Withers struct davinci_gpio *bank; 359f517afd5SLaurence Withers unsigned int ip; 360f517afd5SLaurence Withers 361365d6070SJoe Hershberger bank = GPIO_BANK(gpio); 362365d6070SJoe Hershberger ip = in_le32(&bank->in_data) & (1U << GPIO_BIT(gpio)); 363f517afd5SLaurence Withers return ip ? 1 : 0; 364f517afd5SLaurence Withers } 365f517afd5SLaurence Withers 366365d6070SJoe Hershberger int gpio_set_value(unsigned gpio, int value) 367f517afd5SLaurence Withers { 368f517afd5SLaurence Withers struct davinci_gpio *bank; 369f517afd5SLaurence Withers 370365d6070SJoe Hershberger bank = GPIO_BANK(gpio); 371f517afd5SLaurence Withers 372f517afd5SLaurence Withers if (value) 373365d6070SJoe Hershberger bank->set_data = 1U << GPIO_BIT(gpio); 374f517afd5SLaurence Withers else 375365d6070SJoe Hershberger bank->clr_data = 1U << GPIO_BIT(gpio); 376365d6070SJoe Hershberger 377365d6070SJoe Hershberger return 0; 378f517afd5SLaurence Withers } 379f517afd5SLaurence Withers 380f517afd5SLaurence Withers void gpio_info(void) 381f517afd5SLaurence Withers { 382365d6070SJoe Hershberger unsigned gpio, dir, val; 383f517afd5SLaurence Withers struct davinci_gpio *bank; 384f517afd5SLaurence Withers 385365d6070SJoe Hershberger for (gpio = 0; gpio < MAX_NUM_GPIOS; ++gpio) { 386365d6070SJoe Hershberger bank = GPIO_BANK(gpio); 387365d6070SJoe Hershberger dir = in_le32(&bank->dir) & (1U << GPIO_BIT(gpio)); 388365d6070SJoe Hershberger val = gpio_get_value(gpio); 389f517afd5SLaurence Withers 390f517afd5SLaurence Withers printf("% 4d: %s: %d [%c] %s\n", 391365d6070SJoe Hershberger gpio, dir ? " in" : "out", val, 392365d6070SJoe Hershberger gpio_registry[gpio].is_registered ? 'x' : ' ', 393365d6070SJoe Hershberger gpio_registry[gpio].name); 394f517afd5SLaurence Withers } 395f517afd5SLaurence Withers } 396