1f80cb526SLinus Walleij /* 2f80cb526SLinus Walleij * arch/arm/mach-lpc32xx/gpiolib.c 3f80cb526SLinus Walleij * 4f80cb526SLinus Walleij * Author: Kevin Wells <kevin.wells@nxp.com> 5f80cb526SLinus Walleij * 6f80cb526SLinus Walleij * Copyright (C) 2010 NXP Semiconductors 7f80cb526SLinus Walleij * 8f80cb526SLinus Walleij * This program is free software; you can redistribute it and/or modify 9f80cb526SLinus Walleij * it under the terms of the GNU General Public License as published by 10f80cb526SLinus Walleij * the Free Software Foundation; either version 2 of the License, or 11f80cb526SLinus Walleij * (at your option) any later version. 12f80cb526SLinus Walleij * 13f80cb526SLinus Walleij * This program is distributed in the hope that it will be useful, 14f80cb526SLinus Walleij * but WITHOUT ANY WARRANTY; without even the implied warranty of 15f80cb526SLinus Walleij * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16f80cb526SLinus Walleij * GNU General Public License for more details. 17f80cb526SLinus Walleij */ 18f80cb526SLinus Walleij 19f80cb526SLinus Walleij #include <linux/kernel.h> 20f80cb526SLinus Walleij #include <linux/init.h> 21f80cb526SLinus Walleij #include <linux/io.h> 22f80cb526SLinus Walleij #include <linux/errno.h> 23f80cb526SLinus Walleij #include <linux/gpio.h> 24f80cb526SLinus Walleij 25f80cb526SLinus Walleij #include <mach/hardware.h> 26f80cb526SLinus Walleij #include <mach/platform.h> 27f80cb526SLinus Walleij 28f80cb526SLinus Walleij #define LPC32XX_GPIO_P3_INP_STATE _GPREG(0x000) 29f80cb526SLinus Walleij #define LPC32XX_GPIO_P3_OUTP_SET _GPREG(0x004) 30f80cb526SLinus Walleij #define LPC32XX_GPIO_P3_OUTP_CLR _GPREG(0x008) 31f80cb526SLinus Walleij #define LPC32XX_GPIO_P3_OUTP_STATE _GPREG(0x00C) 32f80cb526SLinus Walleij #define LPC32XX_GPIO_P2_DIR_SET _GPREG(0x010) 33f80cb526SLinus Walleij #define LPC32XX_GPIO_P2_DIR_CLR _GPREG(0x014) 34f80cb526SLinus Walleij #define LPC32XX_GPIO_P2_DIR_STATE _GPREG(0x018) 35f80cb526SLinus Walleij #define LPC32XX_GPIO_P2_INP_STATE _GPREG(0x01C) 36f80cb526SLinus Walleij #define LPC32XX_GPIO_P2_OUTP_SET _GPREG(0x020) 37f80cb526SLinus Walleij #define LPC32XX_GPIO_P2_OUTP_CLR _GPREG(0x024) 38f80cb526SLinus Walleij #define LPC32XX_GPIO_P2_MUX_SET _GPREG(0x028) 39f80cb526SLinus Walleij #define LPC32XX_GPIO_P2_MUX_CLR _GPREG(0x02C) 40f80cb526SLinus Walleij #define LPC32XX_GPIO_P2_MUX_STATE _GPREG(0x030) 41f80cb526SLinus Walleij #define LPC32XX_GPIO_P0_INP_STATE _GPREG(0x040) 42f80cb526SLinus Walleij #define LPC32XX_GPIO_P0_OUTP_SET _GPREG(0x044) 43f80cb526SLinus Walleij #define LPC32XX_GPIO_P0_OUTP_CLR _GPREG(0x048) 44f80cb526SLinus Walleij #define LPC32XX_GPIO_P0_OUTP_STATE _GPREG(0x04C) 45f80cb526SLinus Walleij #define LPC32XX_GPIO_P0_DIR_SET _GPREG(0x050) 46f80cb526SLinus Walleij #define LPC32XX_GPIO_P0_DIR_CLR _GPREG(0x054) 47f80cb526SLinus Walleij #define LPC32XX_GPIO_P0_DIR_STATE _GPREG(0x058) 48f80cb526SLinus Walleij #define LPC32XX_GPIO_P1_INP_STATE _GPREG(0x060) 49f80cb526SLinus Walleij #define LPC32XX_GPIO_P1_OUTP_SET _GPREG(0x064) 50f80cb526SLinus Walleij #define LPC32XX_GPIO_P1_OUTP_CLR _GPREG(0x068) 51f80cb526SLinus Walleij #define LPC32XX_GPIO_P1_OUTP_STATE _GPREG(0x06C) 52f80cb526SLinus Walleij #define LPC32XX_GPIO_P1_DIR_SET _GPREG(0x070) 53f80cb526SLinus Walleij #define LPC32XX_GPIO_P1_DIR_CLR _GPREG(0x074) 54f80cb526SLinus Walleij #define LPC32XX_GPIO_P1_DIR_STATE _GPREG(0x078) 55f80cb526SLinus Walleij 56f80cb526SLinus Walleij #define GPIO012_PIN_TO_BIT(x) (1 << (x)) 57f80cb526SLinus Walleij #define GPIO3_PIN_TO_BIT(x) (1 << ((x) + 25)) 58f80cb526SLinus Walleij #define GPO3_PIN_TO_BIT(x) (1 << (x)) 59f80cb526SLinus Walleij #define GPIO012_PIN_IN_SEL(x, y) (((x) >> (y)) & 1) 60f80cb526SLinus Walleij #define GPIO3_PIN_IN_SHIFT(x) ((x) == 5 ? 24 : 10 + (x)) 61f80cb526SLinus Walleij #define GPIO3_PIN_IN_SEL(x, y) ((x) >> GPIO3_PIN_IN_SHIFT(y)) 62f80cb526SLinus Walleij #define GPIO3_PIN5_IN_SEL(x) (((x) >> 24) & 1) 63f80cb526SLinus Walleij #define GPI3_PIN_IN_SEL(x, y) (((x) >> (y)) & 1) 64f80cb526SLinus Walleij 65f80cb526SLinus Walleij struct gpio_regs { 66f80cb526SLinus Walleij void __iomem *inp_state; 67f80cb526SLinus Walleij void __iomem *outp_set; 68f80cb526SLinus Walleij void __iomem *outp_clr; 69f80cb526SLinus Walleij void __iomem *dir_set; 70f80cb526SLinus Walleij void __iomem *dir_clr; 71f80cb526SLinus Walleij }; 72f80cb526SLinus Walleij 73f80cb526SLinus Walleij /* 74f80cb526SLinus Walleij * GPIO names 75f80cb526SLinus Walleij */ 76f80cb526SLinus Walleij static const char *gpio_p0_names[LPC32XX_GPIO_P0_MAX] = { 77f80cb526SLinus Walleij "p0.0", "p0.1", "p0.2", "p0.3", 78f80cb526SLinus Walleij "p0.4", "p0.5", "p0.6", "p0.7" 79f80cb526SLinus Walleij }; 80f80cb526SLinus Walleij 81f80cb526SLinus Walleij static const char *gpio_p1_names[LPC32XX_GPIO_P1_MAX] = { 82f80cb526SLinus Walleij "p1.0", "p1.1", "p1.2", "p1.3", 83f80cb526SLinus Walleij "p1.4", "p1.5", "p1.6", "p1.7", 84f80cb526SLinus Walleij "p1.8", "p1.9", "p1.10", "p1.11", 85f80cb526SLinus Walleij "p1.12", "p1.13", "p1.14", "p1.15", 86f80cb526SLinus Walleij "p1.16", "p1.17", "p1.18", "p1.19", 87f80cb526SLinus Walleij "p1.20", "p1.21", "p1.22", "p1.23", 88f80cb526SLinus Walleij }; 89f80cb526SLinus Walleij 90f80cb526SLinus Walleij static const char *gpio_p2_names[LPC32XX_GPIO_P2_MAX] = { 91f80cb526SLinus Walleij "p2.0", "p2.1", "p2.2", "p2.3", 92f80cb526SLinus Walleij "p2.4", "p2.5", "p2.6", "p2.7", 93f80cb526SLinus Walleij "p2.8", "p2.9", "p2.10", "p2.11", 94f80cb526SLinus Walleij "p2.12" 95f80cb526SLinus Walleij }; 96f80cb526SLinus Walleij 97f80cb526SLinus Walleij static const char *gpio_p3_names[LPC32XX_GPIO_P3_MAX] = { 98f80cb526SLinus Walleij "gpi000", "gpio01", "gpio02", "gpio03", 99f80cb526SLinus Walleij "gpio04", "gpio05" 100f80cb526SLinus Walleij }; 101f80cb526SLinus Walleij 102f80cb526SLinus Walleij static const char *gpi_p3_names[LPC32XX_GPI_P3_MAX] = { 103f80cb526SLinus Walleij "gpi00", "gpi01", "gpi02", "gpi03", 104f80cb526SLinus Walleij "gpi04", "gpi05", "gpi06", "gpi07", 105f80cb526SLinus Walleij "gpi08", "gpi09", NULL, NULL, 106f80cb526SLinus Walleij NULL, NULL, NULL, "gpi15", 107f80cb526SLinus Walleij "gpi16", "gpi17", "gpi18", "gpi19", 108f80cb526SLinus Walleij "gpi20", "gpi21", "gpi22", "gpi23", 109f80cb526SLinus Walleij "gpi24", "gpi25", "gpi26", "gpi27" 110f80cb526SLinus Walleij }; 111f80cb526SLinus Walleij 112f80cb526SLinus Walleij static const char *gpo_p3_names[LPC32XX_GPO_P3_MAX] = { 113f80cb526SLinus Walleij "gpo00", "gpo01", "gpo02", "gpo03", 114f80cb526SLinus Walleij "gpo04", "gpo05", "gpo06", "gpo07", 115f80cb526SLinus Walleij "gpo08", "gpo09", "gpo10", "gpo11", 116f80cb526SLinus Walleij "gpo12", "gpo13", "gpo14", "gpo15", 117f80cb526SLinus Walleij "gpo16", "gpo17", "gpo18", "gpo19", 118f80cb526SLinus Walleij "gpo20", "gpo21", "gpo22", "gpo23" 119f80cb526SLinus Walleij }; 120f80cb526SLinus Walleij 121f80cb526SLinus Walleij static struct gpio_regs gpio_grp_regs_p0 = { 122f80cb526SLinus Walleij .inp_state = LPC32XX_GPIO_P0_INP_STATE, 123f80cb526SLinus Walleij .outp_set = LPC32XX_GPIO_P0_OUTP_SET, 124f80cb526SLinus Walleij .outp_clr = LPC32XX_GPIO_P0_OUTP_CLR, 125f80cb526SLinus Walleij .dir_set = LPC32XX_GPIO_P0_DIR_SET, 126f80cb526SLinus Walleij .dir_clr = LPC32XX_GPIO_P0_DIR_CLR, 127f80cb526SLinus Walleij }; 128f80cb526SLinus Walleij 129f80cb526SLinus Walleij static struct gpio_regs gpio_grp_regs_p1 = { 130f80cb526SLinus Walleij .inp_state = LPC32XX_GPIO_P1_INP_STATE, 131f80cb526SLinus Walleij .outp_set = LPC32XX_GPIO_P1_OUTP_SET, 132f80cb526SLinus Walleij .outp_clr = LPC32XX_GPIO_P1_OUTP_CLR, 133f80cb526SLinus Walleij .dir_set = LPC32XX_GPIO_P1_DIR_SET, 134f80cb526SLinus Walleij .dir_clr = LPC32XX_GPIO_P1_DIR_CLR, 135f80cb526SLinus Walleij }; 136f80cb526SLinus Walleij 137f80cb526SLinus Walleij static struct gpio_regs gpio_grp_regs_p2 = { 138f80cb526SLinus Walleij .inp_state = LPC32XX_GPIO_P2_INP_STATE, 139f80cb526SLinus Walleij .outp_set = LPC32XX_GPIO_P2_OUTP_SET, 140f80cb526SLinus Walleij .outp_clr = LPC32XX_GPIO_P2_OUTP_CLR, 141f80cb526SLinus Walleij .dir_set = LPC32XX_GPIO_P2_DIR_SET, 142f80cb526SLinus Walleij .dir_clr = LPC32XX_GPIO_P2_DIR_CLR, 143f80cb526SLinus Walleij }; 144f80cb526SLinus Walleij 145f80cb526SLinus Walleij static struct gpio_regs gpio_grp_regs_p3 = { 146f80cb526SLinus Walleij .inp_state = LPC32XX_GPIO_P3_INP_STATE, 147f80cb526SLinus Walleij .outp_set = LPC32XX_GPIO_P3_OUTP_SET, 148f80cb526SLinus Walleij .outp_clr = LPC32XX_GPIO_P3_OUTP_CLR, 149f80cb526SLinus Walleij .dir_set = LPC32XX_GPIO_P2_DIR_SET, 150f80cb526SLinus Walleij .dir_clr = LPC32XX_GPIO_P2_DIR_CLR, 151f80cb526SLinus Walleij }; 152f80cb526SLinus Walleij 153f80cb526SLinus Walleij struct lpc32xx_gpio_chip { 154f80cb526SLinus Walleij struct gpio_chip chip; 155f80cb526SLinus Walleij struct gpio_regs *gpio_grp; 156f80cb526SLinus Walleij }; 157f80cb526SLinus Walleij 158f80cb526SLinus Walleij static inline struct lpc32xx_gpio_chip *to_lpc32xx_gpio( 159f80cb526SLinus Walleij struct gpio_chip *gpc) 160f80cb526SLinus Walleij { 161f80cb526SLinus Walleij return container_of(gpc, struct lpc32xx_gpio_chip, chip); 162f80cb526SLinus Walleij } 163f80cb526SLinus Walleij 164f80cb526SLinus Walleij static void __set_gpio_dir_p012(struct lpc32xx_gpio_chip *group, 165f80cb526SLinus Walleij unsigned pin, int input) 166f80cb526SLinus Walleij { 167f80cb526SLinus Walleij if (input) 168f80cb526SLinus Walleij __raw_writel(GPIO012_PIN_TO_BIT(pin), 169f80cb526SLinus Walleij group->gpio_grp->dir_clr); 170f80cb526SLinus Walleij else 171f80cb526SLinus Walleij __raw_writel(GPIO012_PIN_TO_BIT(pin), 172f80cb526SLinus Walleij group->gpio_grp->dir_set); 173f80cb526SLinus Walleij } 174f80cb526SLinus Walleij 175f80cb526SLinus Walleij static void __set_gpio_dir_p3(struct lpc32xx_gpio_chip *group, 176f80cb526SLinus Walleij unsigned pin, int input) 177f80cb526SLinus Walleij { 178f80cb526SLinus Walleij u32 u = GPIO3_PIN_TO_BIT(pin); 179f80cb526SLinus Walleij 180f80cb526SLinus Walleij if (input) 181f80cb526SLinus Walleij __raw_writel(u, group->gpio_grp->dir_clr); 182f80cb526SLinus Walleij else 183f80cb526SLinus Walleij __raw_writel(u, group->gpio_grp->dir_set); 184f80cb526SLinus Walleij } 185f80cb526SLinus Walleij 186f80cb526SLinus Walleij static void __set_gpio_level_p012(struct lpc32xx_gpio_chip *group, 187f80cb526SLinus Walleij unsigned pin, int high) 188f80cb526SLinus Walleij { 189f80cb526SLinus Walleij if (high) 190f80cb526SLinus Walleij __raw_writel(GPIO012_PIN_TO_BIT(pin), 191f80cb526SLinus Walleij group->gpio_grp->outp_set); 192f80cb526SLinus Walleij else 193f80cb526SLinus Walleij __raw_writel(GPIO012_PIN_TO_BIT(pin), 194f80cb526SLinus Walleij group->gpio_grp->outp_clr); 195f80cb526SLinus Walleij } 196f80cb526SLinus Walleij 197f80cb526SLinus Walleij static void __set_gpio_level_p3(struct lpc32xx_gpio_chip *group, 198f80cb526SLinus Walleij unsigned pin, int high) 199f80cb526SLinus Walleij { 200f80cb526SLinus Walleij u32 u = GPIO3_PIN_TO_BIT(pin); 201f80cb526SLinus Walleij 202f80cb526SLinus Walleij if (high) 203f80cb526SLinus Walleij __raw_writel(u, group->gpio_grp->outp_set); 204f80cb526SLinus Walleij else 205f80cb526SLinus Walleij __raw_writel(u, group->gpio_grp->outp_clr); 206f80cb526SLinus Walleij } 207f80cb526SLinus Walleij 208f80cb526SLinus Walleij static void __set_gpo_level_p3(struct lpc32xx_gpio_chip *group, 209f80cb526SLinus Walleij unsigned pin, int high) 210f80cb526SLinus Walleij { 211f80cb526SLinus Walleij if (high) 212f80cb526SLinus Walleij __raw_writel(GPO3_PIN_TO_BIT(pin), group->gpio_grp->outp_set); 213f80cb526SLinus Walleij else 214f80cb526SLinus Walleij __raw_writel(GPO3_PIN_TO_BIT(pin), group->gpio_grp->outp_clr); 215f80cb526SLinus Walleij } 216f80cb526SLinus Walleij 217f80cb526SLinus Walleij static int __get_gpio_state_p012(struct lpc32xx_gpio_chip *group, 218f80cb526SLinus Walleij unsigned pin) 219f80cb526SLinus Walleij { 220f80cb526SLinus Walleij return GPIO012_PIN_IN_SEL(__raw_readl(group->gpio_grp->inp_state), 221f80cb526SLinus Walleij pin); 222f80cb526SLinus Walleij } 223f80cb526SLinus Walleij 224f80cb526SLinus Walleij static int __get_gpio_state_p3(struct lpc32xx_gpio_chip *group, 225f80cb526SLinus Walleij unsigned pin) 226f80cb526SLinus Walleij { 227f80cb526SLinus Walleij int state = __raw_readl(group->gpio_grp->inp_state); 228f80cb526SLinus Walleij 229f80cb526SLinus Walleij /* 230f80cb526SLinus Walleij * P3 GPIO pin input mapping is not contiguous, GPIOP3-0..4 is mapped 231f80cb526SLinus Walleij * to bits 10..14, while GPIOP3-5 is mapped to bit 24. 232f80cb526SLinus Walleij */ 233f80cb526SLinus Walleij return GPIO3_PIN_IN_SEL(state, pin); 234f80cb526SLinus Walleij } 235f80cb526SLinus Walleij 236f80cb526SLinus Walleij static int __get_gpi_state_p3(struct lpc32xx_gpio_chip *group, 237f80cb526SLinus Walleij unsigned pin) 238f80cb526SLinus Walleij { 239f80cb526SLinus Walleij return GPI3_PIN_IN_SEL(__raw_readl(group->gpio_grp->inp_state), pin); 240f80cb526SLinus Walleij } 241f80cb526SLinus Walleij 242f80cb526SLinus Walleij /* 243f80cb526SLinus Walleij * GENERIC_GPIO primitives. 244f80cb526SLinus Walleij */ 245f80cb526SLinus Walleij static int lpc32xx_gpio_dir_input_p012(struct gpio_chip *chip, 246f80cb526SLinus Walleij unsigned pin) 247f80cb526SLinus Walleij { 248f80cb526SLinus Walleij struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip); 249f80cb526SLinus Walleij 250f80cb526SLinus Walleij __set_gpio_dir_p012(group, pin, 1); 251f80cb526SLinus Walleij 252f80cb526SLinus Walleij return 0; 253f80cb526SLinus Walleij } 254f80cb526SLinus Walleij 255f80cb526SLinus Walleij static int lpc32xx_gpio_dir_input_p3(struct gpio_chip *chip, 256f80cb526SLinus Walleij unsigned pin) 257f80cb526SLinus Walleij { 258f80cb526SLinus Walleij struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip); 259f80cb526SLinus Walleij 260f80cb526SLinus Walleij __set_gpio_dir_p3(group, pin, 1); 261f80cb526SLinus Walleij 262f80cb526SLinus Walleij return 0; 263f80cb526SLinus Walleij } 264f80cb526SLinus Walleij 265f80cb526SLinus Walleij static int lpc32xx_gpio_dir_in_always(struct gpio_chip *chip, 266f80cb526SLinus Walleij unsigned pin) 267f80cb526SLinus Walleij { 268f80cb526SLinus Walleij return 0; 269f80cb526SLinus Walleij } 270f80cb526SLinus Walleij 271f80cb526SLinus Walleij static int lpc32xx_gpio_get_value_p012(struct gpio_chip *chip, unsigned pin) 272f80cb526SLinus Walleij { 273f80cb526SLinus Walleij struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip); 274f80cb526SLinus Walleij 275f80cb526SLinus Walleij return __get_gpio_state_p012(group, pin); 276f80cb526SLinus Walleij } 277f80cb526SLinus Walleij 278f80cb526SLinus Walleij static int lpc32xx_gpio_get_value_p3(struct gpio_chip *chip, unsigned pin) 279f80cb526SLinus Walleij { 280f80cb526SLinus Walleij struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip); 281f80cb526SLinus Walleij 282f80cb526SLinus Walleij return __get_gpio_state_p3(group, pin); 283f80cb526SLinus Walleij } 284f80cb526SLinus Walleij 285f80cb526SLinus Walleij static int lpc32xx_gpi_get_value(struct gpio_chip *chip, unsigned pin) 286f80cb526SLinus Walleij { 287f80cb526SLinus Walleij struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip); 288f80cb526SLinus Walleij 289f80cb526SLinus Walleij return __get_gpi_state_p3(group, pin); 290f80cb526SLinus Walleij } 291f80cb526SLinus Walleij 292f80cb526SLinus Walleij static int lpc32xx_gpio_dir_output_p012(struct gpio_chip *chip, unsigned pin, 293f80cb526SLinus Walleij int value) 294f80cb526SLinus Walleij { 295f80cb526SLinus Walleij struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip); 296f80cb526SLinus Walleij 297f80cb526SLinus Walleij __set_gpio_dir_p012(group, pin, 0); 298f80cb526SLinus Walleij 299f80cb526SLinus Walleij return 0; 300f80cb526SLinus Walleij } 301f80cb526SLinus Walleij 302f80cb526SLinus Walleij static int lpc32xx_gpio_dir_output_p3(struct gpio_chip *chip, unsigned pin, 303f80cb526SLinus Walleij int value) 304f80cb526SLinus Walleij { 305f80cb526SLinus Walleij struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip); 306f80cb526SLinus Walleij 307f80cb526SLinus Walleij __set_gpio_dir_p3(group, pin, 0); 308f80cb526SLinus Walleij 309f80cb526SLinus Walleij return 0; 310f80cb526SLinus Walleij } 311f80cb526SLinus Walleij 312f80cb526SLinus Walleij static int lpc32xx_gpio_dir_out_always(struct gpio_chip *chip, unsigned pin, 313f80cb526SLinus Walleij int value) 314f80cb526SLinus Walleij { 315f80cb526SLinus Walleij return 0; 316f80cb526SLinus Walleij } 317f80cb526SLinus Walleij 318f80cb526SLinus Walleij static void lpc32xx_gpio_set_value_p012(struct gpio_chip *chip, unsigned pin, 319f80cb526SLinus Walleij int value) 320f80cb526SLinus Walleij { 321f80cb526SLinus Walleij struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip); 322f80cb526SLinus Walleij 323f80cb526SLinus Walleij __set_gpio_level_p012(group, pin, value); 324f80cb526SLinus Walleij } 325f80cb526SLinus Walleij 326f80cb526SLinus Walleij static void lpc32xx_gpio_set_value_p3(struct gpio_chip *chip, unsigned pin, 327f80cb526SLinus Walleij int value) 328f80cb526SLinus Walleij { 329f80cb526SLinus Walleij struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip); 330f80cb526SLinus Walleij 331f80cb526SLinus Walleij __set_gpio_level_p3(group, pin, value); 332f80cb526SLinus Walleij } 333f80cb526SLinus Walleij 334f80cb526SLinus Walleij static void lpc32xx_gpo_set_value(struct gpio_chip *chip, unsigned pin, 335f80cb526SLinus Walleij int value) 336f80cb526SLinus Walleij { 337f80cb526SLinus Walleij struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip); 338f80cb526SLinus Walleij 339f80cb526SLinus Walleij __set_gpo_level_p3(group, pin, value); 340f80cb526SLinus Walleij } 341f80cb526SLinus Walleij 342f80cb526SLinus Walleij static int lpc32xx_gpio_request(struct gpio_chip *chip, unsigned pin) 343f80cb526SLinus Walleij { 344f80cb526SLinus Walleij if (pin < chip->ngpio) 345f80cb526SLinus Walleij return 0; 346f80cb526SLinus Walleij 347f80cb526SLinus Walleij return -EINVAL; 348f80cb526SLinus Walleij } 349f80cb526SLinus Walleij 350f80cb526SLinus Walleij static struct lpc32xx_gpio_chip lpc32xx_gpiochip[] = { 351f80cb526SLinus Walleij { 352f80cb526SLinus Walleij .chip = { 353f80cb526SLinus Walleij .label = "gpio_p0", 354f80cb526SLinus Walleij .direction_input = lpc32xx_gpio_dir_input_p012, 355f80cb526SLinus Walleij .get = lpc32xx_gpio_get_value_p012, 356f80cb526SLinus Walleij .direction_output = lpc32xx_gpio_dir_output_p012, 357f80cb526SLinus Walleij .set = lpc32xx_gpio_set_value_p012, 358f80cb526SLinus Walleij .request = lpc32xx_gpio_request, 359f80cb526SLinus Walleij .base = LPC32XX_GPIO_P0_GRP, 360f80cb526SLinus Walleij .ngpio = LPC32XX_GPIO_P0_MAX, 361f80cb526SLinus Walleij .names = gpio_p0_names, 362f80cb526SLinus Walleij .can_sleep = 0, 363f80cb526SLinus Walleij }, 364f80cb526SLinus Walleij .gpio_grp = &gpio_grp_regs_p0, 365f80cb526SLinus Walleij }, 366f80cb526SLinus Walleij { 367f80cb526SLinus Walleij .chip = { 368f80cb526SLinus Walleij .label = "gpio_p1", 369f80cb526SLinus Walleij .direction_input = lpc32xx_gpio_dir_input_p012, 370f80cb526SLinus Walleij .get = lpc32xx_gpio_get_value_p012, 371f80cb526SLinus Walleij .direction_output = lpc32xx_gpio_dir_output_p012, 372f80cb526SLinus Walleij .set = lpc32xx_gpio_set_value_p012, 373f80cb526SLinus Walleij .request = lpc32xx_gpio_request, 374f80cb526SLinus Walleij .base = LPC32XX_GPIO_P1_GRP, 375f80cb526SLinus Walleij .ngpio = LPC32XX_GPIO_P1_MAX, 376f80cb526SLinus Walleij .names = gpio_p1_names, 377f80cb526SLinus Walleij .can_sleep = 0, 378f80cb526SLinus Walleij }, 379f80cb526SLinus Walleij .gpio_grp = &gpio_grp_regs_p1, 380f80cb526SLinus Walleij }, 381f80cb526SLinus Walleij { 382f80cb526SLinus Walleij .chip = { 383f80cb526SLinus Walleij .label = "gpio_p2", 384f80cb526SLinus Walleij .direction_input = lpc32xx_gpio_dir_input_p012, 385f80cb526SLinus Walleij .get = lpc32xx_gpio_get_value_p012, 386f80cb526SLinus Walleij .direction_output = lpc32xx_gpio_dir_output_p012, 387f80cb526SLinus Walleij .set = lpc32xx_gpio_set_value_p012, 388f80cb526SLinus Walleij .request = lpc32xx_gpio_request, 389f80cb526SLinus Walleij .base = LPC32XX_GPIO_P2_GRP, 390f80cb526SLinus Walleij .ngpio = LPC32XX_GPIO_P2_MAX, 391f80cb526SLinus Walleij .names = gpio_p2_names, 392f80cb526SLinus Walleij .can_sleep = 0, 393f80cb526SLinus Walleij }, 394f80cb526SLinus Walleij .gpio_grp = &gpio_grp_regs_p2, 395f80cb526SLinus Walleij }, 396f80cb526SLinus Walleij { 397f80cb526SLinus Walleij .chip = { 398f80cb526SLinus Walleij .label = "gpio_p3", 399f80cb526SLinus Walleij .direction_input = lpc32xx_gpio_dir_input_p3, 400f80cb526SLinus Walleij .get = lpc32xx_gpio_get_value_p3, 401f80cb526SLinus Walleij .direction_output = lpc32xx_gpio_dir_output_p3, 402f80cb526SLinus Walleij .set = lpc32xx_gpio_set_value_p3, 403f80cb526SLinus Walleij .request = lpc32xx_gpio_request, 404f80cb526SLinus Walleij .base = LPC32XX_GPIO_P3_GRP, 405f80cb526SLinus Walleij .ngpio = LPC32XX_GPIO_P3_MAX, 406f80cb526SLinus Walleij .names = gpio_p3_names, 407f80cb526SLinus Walleij .can_sleep = 0, 408f80cb526SLinus Walleij }, 409f80cb526SLinus Walleij .gpio_grp = &gpio_grp_regs_p3, 410f80cb526SLinus Walleij }, 411f80cb526SLinus Walleij { 412f80cb526SLinus Walleij .chip = { 413f80cb526SLinus Walleij .label = "gpi_p3", 414f80cb526SLinus Walleij .direction_input = lpc32xx_gpio_dir_in_always, 415f80cb526SLinus Walleij .get = lpc32xx_gpi_get_value, 416f80cb526SLinus Walleij .request = lpc32xx_gpio_request, 417f80cb526SLinus Walleij .base = LPC32XX_GPI_P3_GRP, 418f80cb526SLinus Walleij .ngpio = LPC32XX_GPI_P3_MAX, 419f80cb526SLinus Walleij .names = gpi_p3_names, 420f80cb526SLinus Walleij .can_sleep = 0, 421f80cb526SLinus Walleij }, 422f80cb526SLinus Walleij .gpio_grp = &gpio_grp_regs_p3, 423f80cb526SLinus Walleij }, 424f80cb526SLinus Walleij { 425f80cb526SLinus Walleij .chip = { 426f80cb526SLinus Walleij .label = "gpo_p3", 427f80cb526SLinus Walleij .direction_output = lpc32xx_gpio_dir_out_always, 428f80cb526SLinus Walleij .set = lpc32xx_gpo_set_value, 429f80cb526SLinus Walleij .request = lpc32xx_gpio_request, 430f80cb526SLinus Walleij .base = LPC32XX_GPO_P3_GRP, 431f80cb526SLinus Walleij .ngpio = LPC32XX_GPO_P3_MAX, 432f80cb526SLinus Walleij .names = gpo_p3_names, 433f80cb526SLinus Walleij .can_sleep = 0, 434f80cb526SLinus Walleij }, 435f80cb526SLinus Walleij .gpio_grp = &gpio_grp_regs_p3, 436f80cb526SLinus Walleij }, 437f80cb526SLinus Walleij }; 438f80cb526SLinus Walleij 439f80cb526SLinus Walleij void __init lpc32xx_gpio_init(void) 440f80cb526SLinus Walleij { 441f80cb526SLinus Walleij int i; 442f80cb526SLinus Walleij 443f80cb526SLinus Walleij for (i = 0; i < ARRAY_SIZE(lpc32xx_gpiochip); i++) 444f80cb526SLinus Walleij gpiochip_add(&lpc32xx_gpiochip[i].chip); 445f80cb526SLinus Walleij } 446