1606f7047SAlbert ARIBAUD \(3ADEV\) /* 2606f7047SAlbert ARIBAUD \(3ADEV\) * LPC32xxGPIO driver 3606f7047SAlbert ARIBAUD \(3ADEV\) * 4606f7047SAlbert ARIBAUD \(3ADEV\) * (C) Copyright 2014 DENX Software Engineering GmbH 5606f7047SAlbert ARIBAUD \(3ADEV\) * Written-by: Albert ARIBAUD <albert.aribaud@3adev.fr> 6606f7047SAlbert ARIBAUD \(3ADEV\) * 7606f7047SAlbert ARIBAUD \(3ADEV\) * SPDX-License-Identifier: GPL-2.0+ 8606f7047SAlbert ARIBAUD \(3ADEV\) */ 9606f7047SAlbert ARIBAUD \(3ADEV\) 10606f7047SAlbert ARIBAUD \(3ADEV\) #include <asm/io.h> 11606f7047SAlbert ARIBAUD \(3ADEV\) #include <asm/arch-lpc32xx/cpu.h> 12606f7047SAlbert ARIBAUD \(3ADEV\) #include <asm/arch-lpc32xx/gpio.h> 13606f7047SAlbert ARIBAUD \(3ADEV\) #include <asm-generic/gpio.h> 14606f7047SAlbert ARIBAUD \(3ADEV\) #include <dm.h> 15606f7047SAlbert ARIBAUD \(3ADEV\) 16606f7047SAlbert ARIBAUD \(3ADEV\) /** 17606f7047SAlbert ARIBAUD \(3ADEV\) * LPC32xx GPIOs work in banks but are non-homogeneous: 18606f7047SAlbert ARIBAUD \(3ADEV\) * - each bank holds a different number of GPIOs 19606f7047SAlbert ARIBAUD \(3ADEV\) * - some GPIOs are input/ouput, some input only, some output only; 20606f7047SAlbert ARIBAUD \(3ADEV\) * - some GPIOs have different meanings as an input and as an output; 21606f7047SAlbert ARIBAUD \(3ADEV\) * - some GPIOs are controlled on a given port and bit index, but 22606f7047SAlbert ARIBAUD \(3ADEV\) * read on another one. 23606f7047SAlbert ARIBAUD \(3ADEV\) * 24606f7047SAlbert ARIBAUD \(3ADEV\) * In order to keep this code simple, GPIOS are considered here as 25606f7047SAlbert ARIBAUD \(3ADEV\) * homogeneous and linear, from 0 to 127. 26606f7047SAlbert ARIBAUD \(3ADEV\) * 27606f7047SAlbert ARIBAUD \(3ADEV\) * ** WARNING #1 ** 28606f7047SAlbert ARIBAUD \(3ADEV\) * 29606f7047SAlbert ARIBAUD \(3ADEV\) * Client code is responsible for properly using valid GPIO numbers, 30606f7047SAlbert ARIBAUD \(3ADEV\) * including cases where a single physical GPIO has differing numbers 31606f7047SAlbert ARIBAUD \(3ADEV\) * for setting its direction, reading it and/or writing to it. 32606f7047SAlbert ARIBAUD \(3ADEV\) * 33606f7047SAlbert ARIBAUD \(3ADEV\) * ** WARNING #2 ** 34606f7047SAlbert ARIBAUD \(3ADEV\) * 35606f7047SAlbert ARIBAUD \(3ADEV\) * Please read NOTE in description of lpc32xx_gpio_get_function(). 36606f7047SAlbert ARIBAUD \(3ADEV\) */ 37606f7047SAlbert ARIBAUD \(3ADEV\) 38606f7047SAlbert ARIBAUD \(3ADEV\) #define LPC32XX_GPIOS 128 39606f7047SAlbert ARIBAUD \(3ADEV\) 40*1f9e5e22SAxel Lin struct lpc32xx_gpio_priv { 41606f7047SAlbert ARIBAUD \(3ADEV\) struct gpio_regs *regs; 42606f7047SAlbert ARIBAUD \(3ADEV\) /* GPIO FUNCTION: SEE WARNING #2 */ 43606f7047SAlbert ARIBAUD \(3ADEV\) signed char function[LPC32XX_GPIOS]; 44606f7047SAlbert ARIBAUD \(3ADEV\) }; 45606f7047SAlbert ARIBAUD \(3ADEV\) 46606f7047SAlbert ARIBAUD \(3ADEV\) /** 47606f7047SAlbert ARIBAUD \(3ADEV\) * We have 4 GPIO ports of 32 bits each 48606f7047SAlbert ARIBAUD \(3ADEV\) */ 49606f7047SAlbert ARIBAUD \(3ADEV\) 50606f7047SAlbert ARIBAUD \(3ADEV\) #define MAX_GPIO 128 51606f7047SAlbert ARIBAUD \(3ADEV\) 52606f7047SAlbert ARIBAUD \(3ADEV\) #define GPIO_TO_PORT(gpio) ((gpio / 32) & 3) 53606f7047SAlbert ARIBAUD \(3ADEV\) #define GPIO_TO_RANK(gpio) (gpio % 32) 54606f7047SAlbert ARIBAUD \(3ADEV\) #define GPIO_TO_MASK(gpio) (1 << (gpio % 32)) 55606f7047SAlbert ARIBAUD \(3ADEV\) 56606f7047SAlbert ARIBAUD \(3ADEV\) /** 57606f7047SAlbert ARIBAUD \(3ADEV\) * Configure a GPIO number 'offset' as input 58606f7047SAlbert ARIBAUD \(3ADEV\) */ 59606f7047SAlbert ARIBAUD \(3ADEV\) 60606f7047SAlbert ARIBAUD \(3ADEV\) static int lpc32xx_gpio_direction_input(struct udevice *dev, unsigned offset) 61606f7047SAlbert ARIBAUD \(3ADEV\) { 62606f7047SAlbert ARIBAUD \(3ADEV\) int port, mask; 63*1f9e5e22SAxel Lin struct lpc32xx_gpio_priv *gpio_priv = dev_get_priv(dev); 64*1f9e5e22SAxel Lin struct gpio_regs *regs = gpio_priv->regs; 65606f7047SAlbert ARIBAUD \(3ADEV\) 66606f7047SAlbert ARIBAUD \(3ADEV\) port = GPIO_TO_PORT(offset); 67606f7047SAlbert ARIBAUD \(3ADEV\) mask = GPIO_TO_MASK(offset); 68606f7047SAlbert ARIBAUD \(3ADEV\) 69606f7047SAlbert ARIBAUD \(3ADEV\) switch (port) { 70606f7047SAlbert ARIBAUD \(3ADEV\) case 0: 71606f7047SAlbert ARIBAUD \(3ADEV\) writel(mask, ®s->p0_dir_clr); 72606f7047SAlbert ARIBAUD \(3ADEV\) break; 73606f7047SAlbert ARIBAUD \(3ADEV\) case 1: 74606f7047SAlbert ARIBAUD \(3ADEV\) writel(mask, ®s->p1_dir_clr); 75606f7047SAlbert ARIBAUD \(3ADEV\) break; 76606f7047SAlbert ARIBAUD \(3ADEV\) case 2: 77606f7047SAlbert ARIBAUD \(3ADEV\) /* ports 2 and 3 share a common direction */ 78606f7047SAlbert ARIBAUD \(3ADEV\) case 3: 79606f7047SAlbert ARIBAUD \(3ADEV\) writel(mask, ®s->p2_p3_dir_clr); 80606f7047SAlbert ARIBAUD \(3ADEV\) break; 81606f7047SAlbert ARIBAUD \(3ADEV\) default: 82606f7047SAlbert ARIBAUD \(3ADEV\) return -1; 83606f7047SAlbert ARIBAUD \(3ADEV\) } 84606f7047SAlbert ARIBAUD \(3ADEV\) 85606f7047SAlbert ARIBAUD \(3ADEV\) /* GPIO FUNCTION: SEE WARNING #2 */ 86*1f9e5e22SAxel Lin gpio_priv->function[offset] = GPIOF_INPUT; 87606f7047SAlbert ARIBAUD \(3ADEV\) 88606f7047SAlbert ARIBAUD \(3ADEV\) return 0; 89606f7047SAlbert ARIBAUD \(3ADEV\) } 90606f7047SAlbert ARIBAUD \(3ADEV\) 91606f7047SAlbert ARIBAUD \(3ADEV\) /** 92606f7047SAlbert ARIBAUD \(3ADEV\) * Get the value of a GPIO 93606f7047SAlbert ARIBAUD \(3ADEV\) */ 94606f7047SAlbert ARIBAUD \(3ADEV\) 95606f7047SAlbert ARIBAUD \(3ADEV\) static int lpc32xx_gpio_get_value(struct udevice *dev, unsigned offset) 96606f7047SAlbert ARIBAUD \(3ADEV\) { 97606f7047SAlbert ARIBAUD \(3ADEV\) int port, rank, mask, value; 98*1f9e5e22SAxel Lin struct lpc32xx_gpio_priv *gpio_priv = dev_get_priv(dev); 99*1f9e5e22SAxel Lin struct gpio_regs *regs = gpio_priv->regs; 100606f7047SAlbert ARIBAUD \(3ADEV\) 101606f7047SAlbert ARIBAUD \(3ADEV\) port = GPIO_TO_PORT(offset); 102606f7047SAlbert ARIBAUD \(3ADEV\) 103606f7047SAlbert ARIBAUD \(3ADEV\) switch (port) { 104606f7047SAlbert ARIBAUD \(3ADEV\) case 0: 105606f7047SAlbert ARIBAUD \(3ADEV\) value = readl(®s->p0_inp_state); 106606f7047SAlbert ARIBAUD \(3ADEV\) break; 107606f7047SAlbert ARIBAUD \(3ADEV\) case 1: 108606f7047SAlbert ARIBAUD \(3ADEV\) value = readl(®s->p1_inp_state); 109606f7047SAlbert ARIBAUD \(3ADEV\) break; 110606f7047SAlbert ARIBAUD \(3ADEV\) case 2: 111606f7047SAlbert ARIBAUD \(3ADEV\) value = readl(®s->p2_inp_state); 112606f7047SAlbert ARIBAUD \(3ADEV\) break; 113606f7047SAlbert ARIBAUD \(3ADEV\) case 3: 114606f7047SAlbert ARIBAUD \(3ADEV\) value = readl(®s->p3_inp_state); 115606f7047SAlbert ARIBAUD \(3ADEV\) break; 116606f7047SAlbert ARIBAUD \(3ADEV\) default: 117606f7047SAlbert ARIBAUD \(3ADEV\) return -1; 118606f7047SAlbert ARIBAUD \(3ADEV\) } 119606f7047SAlbert ARIBAUD \(3ADEV\) 120606f7047SAlbert ARIBAUD \(3ADEV\) rank = GPIO_TO_RANK(offset); 121606f7047SAlbert ARIBAUD \(3ADEV\) mask = GPIO_TO_MASK(offset); 122606f7047SAlbert ARIBAUD \(3ADEV\) 123606f7047SAlbert ARIBAUD \(3ADEV\) return (value & mask) >> rank; 124606f7047SAlbert ARIBAUD \(3ADEV\) } 125606f7047SAlbert ARIBAUD \(3ADEV\) 126606f7047SAlbert ARIBAUD \(3ADEV\) /** 127606f7047SAlbert ARIBAUD \(3ADEV\) * Set a GPIO 128606f7047SAlbert ARIBAUD \(3ADEV\) */ 129606f7047SAlbert ARIBAUD \(3ADEV\) 130606f7047SAlbert ARIBAUD \(3ADEV\) static int gpio_set(struct udevice *dev, unsigned gpio) 131606f7047SAlbert ARIBAUD \(3ADEV\) { 132606f7047SAlbert ARIBAUD \(3ADEV\) int port, mask; 133*1f9e5e22SAxel Lin struct lpc32xx_gpio_priv *gpio_priv = dev_get_priv(dev); 134*1f9e5e22SAxel Lin struct gpio_regs *regs = gpio_priv->regs; 135606f7047SAlbert ARIBAUD \(3ADEV\) 136606f7047SAlbert ARIBAUD \(3ADEV\) port = GPIO_TO_PORT(gpio); 137606f7047SAlbert ARIBAUD \(3ADEV\) mask = GPIO_TO_MASK(gpio); 138606f7047SAlbert ARIBAUD \(3ADEV\) 139606f7047SAlbert ARIBAUD \(3ADEV\) switch (port) { 140606f7047SAlbert ARIBAUD \(3ADEV\) case 0: 141606f7047SAlbert ARIBAUD \(3ADEV\) writel(mask, ®s->p0_outp_set); 142606f7047SAlbert ARIBAUD \(3ADEV\) break; 143606f7047SAlbert ARIBAUD \(3ADEV\) case 1: 144606f7047SAlbert ARIBAUD \(3ADEV\) writel(mask, ®s->p1_outp_set); 145606f7047SAlbert ARIBAUD \(3ADEV\) break; 146606f7047SAlbert ARIBAUD \(3ADEV\) case 2: 147606f7047SAlbert ARIBAUD \(3ADEV\) writel(mask, ®s->p2_outp_set); 148606f7047SAlbert ARIBAUD \(3ADEV\) break; 149606f7047SAlbert ARIBAUD \(3ADEV\) case 3: 150606f7047SAlbert ARIBAUD \(3ADEV\) writel(mask, ®s->p3_outp_set); 151606f7047SAlbert ARIBAUD \(3ADEV\) break; 152606f7047SAlbert ARIBAUD \(3ADEV\) default: 153606f7047SAlbert ARIBAUD \(3ADEV\) return -1; 154606f7047SAlbert ARIBAUD \(3ADEV\) } 155606f7047SAlbert ARIBAUD \(3ADEV\) return 0; 156606f7047SAlbert ARIBAUD \(3ADEV\) } 157606f7047SAlbert ARIBAUD \(3ADEV\) 158606f7047SAlbert ARIBAUD \(3ADEV\) /** 159606f7047SAlbert ARIBAUD \(3ADEV\) * Clear a GPIO 160606f7047SAlbert ARIBAUD \(3ADEV\) */ 161606f7047SAlbert ARIBAUD \(3ADEV\) 162606f7047SAlbert ARIBAUD \(3ADEV\) static int gpio_clr(struct udevice *dev, unsigned gpio) 163606f7047SAlbert ARIBAUD \(3ADEV\) { 164606f7047SAlbert ARIBAUD \(3ADEV\) int port, mask; 165*1f9e5e22SAxel Lin struct lpc32xx_gpio_priv *gpio_priv = dev_get_priv(dev); 166*1f9e5e22SAxel Lin struct gpio_regs *regs = gpio_priv->regs; 167606f7047SAlbert ARIBAUD \(3ADEV\) 168606f7047SAlbert ARIBAUD \(3ADEV\) port = GPIO_TO_PORT(gpio); 169606f7047SAlbert ARIBAUD \(3ADEV\) mask = GPIO_TO_MASK(gpio); 170606f7047SAlbert ARIBAUD \(3ADEV\) 171606f7047SAlbert ARIBAUD \(3ADEV\) switch (port) { 172606f7047SAlbert ARIBAUD \(3ADEV\) case 0: 173606f7047SAlbert ARIBAUD \(3ADEV\) writel(mask, ®s->p0_outp_clr); 174606f7047SAlbert ARIBAUD \(3ADEV\) break; 175606f7047SAlbert ARIBAUD \(3ADEV\) case 1: 176606f7047SAlbert ARIBAUD \(3ADEV\) writel(mask, ®s->p1_outp_clr); 177606f7047SAlbert ARIBAUD \(3ADEV\) break; 178606f7047SAlbert ARIBAUD \(3ADEV\) case 2: 179606f7047SAlbert ARIBAUD \(3ADEV\) writel(mask, ®s->p2_outp_clr); 180606f7047SAlbert ARIBAUD \(3ADEV\) break; 181606f7047SAlbert ARIBAUD \(3ADEV\) case 3: 182606f7047SAlbert ARIBAUD \(3ADEV\) writel(mask, ®s->p3_outp_clr); 183606f7047SAlbert ARIBAUD \(3ADEV\) break; 184606f7047SAlbert ARIBAUD \(3ADEV\) default: 185606f7047SAlbert ARIBAUD \(3ADEV\) return -1; 186606f7047SAlbert ARIBAUD \(3ADEV\) } 187606f7047SAlbert ARIBAUD \(3ADEV\) return 0; 188606f7047SAlbert ARIBAUD \(3ADEV\) } 189606f7047SAlbert ARIBAUD \(3ADEV\) 190606f7047SAlbert ARIBAUD \(3ADEV\) /** 191606f7047SAlbert ARIBAUD \(3ADEV\) * Set the value of a GPIO 192606f7047SAlbert ARIBAUD \(3ADEV\) */ 193606f7047SAlbert ARIBAUD \(3ADEV\) 194606f7047SAlbert ARIBAUD \(3ADEV\) static int lpc32xx_gpio_set_value(struct udevice *dev, unsigned offset, 195606f7047SAlbert ARIBAUD \(3ADEV\) int value) 196606f7047SAlbert ARIBAUD \(3ADEV\) { 197606f7047SAlbert ARIBAUD \(3ADEV\) if (value) 198606f7047SAlbert ARIBAUD \(3ADEV\) return gpio_set(dev, offset); 199606f7047SAlbert ARIBAUD \(3ADEV\) else 200606f7047SAlbert ARIBAUD \(3ADEV\) return gpio_clr(dev, offset); 201606f7047SAlbert ARIBAUD \(3ADEV\) } 202606f7047SAlbert ARIBAUD \(3ADEV\) 203606f7047SAlbert ARIBAUD \(3ADEV\) /** 204606f7047SAlbert ARIBAUD \(3ADEV\) * Configure a GPIO number 'offset' as output with given initial value. 205606f7047SAlbert ARIBAUD \(3ADEV\) */ 206606f7047SAlbert ARIBAUD \(3ADEV\) 207606f7047SAlbert ARIBAUD \(3ADEV\) static int lpc32xx_gpio_direction_output(struct udevice *dev, unsigned offset, 208606f7047SAlbert ARIBAUD \(3ADEV\) int value) 209606f7047SAlbert ARIBAUD \(3ADEV\) { 210606f7047SAlbert ARIBAUD \(3ADEV\) int port, mask; 211*1f9e5e22SAxel Lin struct lpc32xx_gpio_priv *gpio_priv = dev_get_priv(dev); 212*1f9e5e22SAxel Lin struct gpio_regs *regs = gpio_priv->regs; 213606f7047SAlbert ARIBAUD \(3ADEV\) 214606f7047SAlbert ARIBAUD \(3ADEV\) port = GPIO_TO_PORT(offset); 215606f7047SAlbert ARIBAUD \(3ADEV\) mask = GPIO_TO_MASK(offset); 216606f7047SAlbert ARIBAUD \(3ADEV\) 217606f7047SAlbert ARIBAUD \(3ADEV\) switch (port) { 218606f7047SAlbert ARIBAUD \(3ADEV\) case 0: 219606f7047SAlbert ARIBAUD \(3ADEV\) writel(mask, ®s->p0_dir_set); 220606f7047SAlbert ARIBAUD \(3ADEV\) break; 221606f7047SAlbert ARIBAUD \(3ADEV\) case 1: 222606f7047SAlbert ARIBAUD \(3ADEV\) writel(mask, ®s->p1_dir_set); 223606f7047SAlbert ARIBAUD \(3ADEV\) break; 224606f7047SAlbert ARIBAUD \(3ADEV\) case 2: 225606f7047SAlbert ARIBAUD \(3ADEV\) /* ports 2 and 3 share a common direction */ 226606f7047SAlbert ARIBAUD \(3ADEV\) case 3: 227606f7047SAlbert ARIBAUD \(3ADEV\) writel(mask, ®s->p2_p3_dir_set); 228606f7047SAlbert ARIBAUD \(3ADEV\) break; 229606f7047SAlbert ARIBAUD \(3ADEV\) default: 230606f7047SAlbert ARIBAUD \(3ADEV\) return -1; 231606f7047SAlbert ARIBAUD \(3ADEV\) } 232606f7047SAlbert ARIBAUD \(3ADEV\) 233606f7047SAlbert ARIBAUD \(3ADEV\) /* GPIO FUNCTION: SEE WARNING #2 */ 234*1f9e5e22SAxel Lin gpio_priv->function[offset] = GPIOF_OUTPUT; 235606f7047SAlbert ARIBAUD \(3ADEV\) 236606f7047SAlbert ARIBAUD \(3ADEV\) return lpc32xx_gpio_set_value(dev, offset, value); 237606f7047SAlbert ARIBAUD \(3ADEV\) } 238606f7047SAlbert ARIBAUD \(3ADEV\) 239606f7047SAlbert ARIBAUD \(3ADEV\) /** 240606f7047SAlbert ARIBAUD \(3ADEV\) * GPIO functions are supposed to be computed from their current 241606f7047SAlbert ARIBAUD \(3ADEV\) * configuration, but that's way too complicated in LPC32XX. A simpler 242606f7047SAlbert ARIBAUD \(3ADEV\) * approach is used, where the GPIO functions are cached in an array. 243606f7047SAlbert ARIBAUD \(3ADEV\) * When the GPIO is in use, its function is either "input" or "output" 244606f7047SAlbert ARIBAUD \(3ADEV\) * depending on its direction, otherwise its function is "unknown". 245606f7047SAlbert ARIBAUD \(3ADEV\) * 246606f7047SAlbert ARIBAUD \(3ADEV\) * ** NOTE ** 247606f7047SAlbert ARIBAUD \(3ADEV\) * 248606f7047SAlbert ARIBAUD \(3ADEV\) * THIS APPROACH WAS CHOSEN DU TO THE COMPLEX NATURE OF THE LPC32XX 249606f7047SAlbert ARIBAUD \(3ADEV\) * GPIOS; DO NOT TAKE THIS AS AN EXAMPLE FOR NEW CODE. 250606f7047SAlbert ARIBAUD \(3ADEV\) */ 251606f7047SAlbert ARIBAUD \(3ADEV\) 252606f7047SAlbert ARIBAUD \(3ADEV\) static int lpc32xx_gpio_get_function(struct udevice *dev, unsigned offset) 253606f7047SAlbert ARIBAUD \(3ADEV\) { 254*1f9e5e22SAxel Lin struct lpc32xx_gpio_priv *gpio_priv = dev_get_priv(dev); 255*1f9e5e22SAxel Lin return gpio_priv->function[offset]; 256606f7047SAlbert ARIBAUD \(3ADEV\) } 257606f7047SAlbert ARIBAUD \(3ADEV\) 258606f7047SAlbert ARIBAUD \(3ADEV\) static const struct dm_gpio_ops gpio_lpc32xx_ops = { 259606f7047SAlbert ARIBAUD \(3ADEV\) .direction_input = lpc32xx_gpio_direction_input, 260606f7047SAlbert ARIBAUD \(3ADEV\) .direction_output = lpc32xx_gpio_direction_output, 261606f7047SAlbert ARIBAUD \(3ADEV\) .get_value = lpc32xx_gpio_get_value, 262606f7047SAlbert ARIBAUD \(3ADEV\) .set_value = lpc32xx_gpio_set_value, 263606f7047SAlbert ARIBAUD \(3ADEV\) .get_function = lpc32xx_gpio_get_function, 264606f7047SAlbert ARIBAUD \(3ADEV\) }; 265606f7047SAlbert ARIBAUD \(3ADEV\) 266606f7047SAlbert ARIBAUD \(3ADEV\) static int lpc32xx_gpio_probe(struct udevice *dev) 267606f7047SAlbert ARIBAUD \(3ADEV\) { 268*1f9e5e22SAxel Lin struct lpc32xx_gpio_priv *gpio_priv = dev_get_priv(dev); 269606f7047SAlbert ARIBAUD \(3ADEV\) struct gpio_dev_priv *uc_priv = dev->uclass_priv; 270606f7047SAlbert ARIBAUD \(3ADEV\) 271606f7047SAlbert ARIBAUD \(3ADEV\) if (dev->of_offset == -1) { 272606f7047SAlbert ARIBAUD \(3ADEV\) /* Tell the uclass how many GPIOs we have */ 273606f7047SAlbert ARIBAUD \(3ADEV\) uc_priv->gpio_count = LPC32XX_GPIOS; 274606f7047SAlbert ARIBAUD \(3ADEV\) } 275606f7047SAlbert ARIBAUD \(3ADEV\) 276606f7047SAlbert ARIBAUD \(3ADEV\) /* set base address for GPIO registers */ 277*1f9e5e22SAxel Lin gpio_priv->regs = (struct gpio_regs *)GPIO_BASE; 278606f7047SAlbert ARIBAUD \(3ADEV\) 279606f7047SAlbert ARIBAUD \(3ADEV\) /* all GPIO functions are unknown until requested */ 280606f7047SAlbert ARIBAUD \(3ADEV\) /* GPIO FUNCTION: SEE WARNING #2 */ 281*1f9e5e22SAxel Lin memset(gpio_priv->function, GPIOF_UNKNOWN, sizeof(gpio_priv->function)); 282606f7047SAlbert ARIBAUD \(3ADEV\) 283606f7047SAlbert ARIBAUD \(3ADEV\) return 0; 284606f7047SAlbert ARIBAUD \(3ADEV\) } 285606f7047SAlbert ARIBAUD \(3ADEV\) 286606f7047SAlbert ARIBAUD \(3ADEV\) U_BOOT_DRIVER(gpio_lpc32xx) = { 287606f7047SAlbert ARIBAUD \(3ADEV\) .name = "gpio_lpc32xx", 288606f7047SAlbert ARIBAUD \(3ADEV\) .id = UCLASS_GPIO, 289606f7047SAlbert ARIBAUD \(3ADEV\) .ops = &gpio_lpc32xx_ops, 290606f7047SAlbert ARIBAUD \(3ADEV\) .probe = lpc32xx_gpio_probe, 291*1f9e5e22SAxel Lin .priv_auto_alloc_size = sizeof(struct lpc32xx_gpio_priv), 292606f7047SAlbert ARIBAUD \(3ADEV\) }; 293