Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[ARM] 4457/2: davinci: GPIO support

Support GPIO driver for TI DaVinci SoC

Signed-off-by: Vladimir Barinov <vbarino@ru.mvista.com>
Acked-by: David Brownell <david-b@pacbell.net>
Acked-by: Kevin Hilman <khilman@mvista.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>

authored by

Vladimir Barinov and committed by
Russell King
3d9edf09 3e062b07

+483 -1
+1
arch/arm/Kconfig
··· 384 384 bool "TI DaVinci" 385 385 select GENERIC_TIME 386 386 select GENERIC_CLOCKEVENTS 387 + select GENERIC_GPIO 387 388 help 388 389 Support for TI's DaVinci platform. 389 390
+2 -1
arch/arm/mach-davinci/Makefile
··· 4 4 # 5 5 6 6 # Common objects 7 - obj-y := time.o irq.o clock.o serial.o io.o id.o psc.o 7 + obj-y := time.o irq.o clock.o serial.o io.o id.o psc.o \ 8 + gpio.o 8 9 9 10 # Board specific 10 11 obj-$(CONFIG_MACH_DAVINCI_EVM) += board-evm.o
+286
arch/arm/mach-davinci/gpio.c
··· 1 + /* 2 + * TI DaVinci GPIO Support 3 + * 4 + * Copyright (c) 2006 David Brownell 5 + * Copyright (c) 2007, MontaVista Software, Inc. <source@mvista.com> 6 + * 7 + * This program is free software; you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License as published by 9 + * the Free Software Foundation; either version 2 of the License, or 10 + * (at your option) any later version. 11 + */ 12 + 13 + #include <linux/errno.h> 14 + #include <linux/kernel.h> 15 + #include <linux/list.h> 16 + #include <linux/module.h> 17 + #include <linux/clk.h> 18 + #include <linux/err.h> 19 + #include <linux/io.h> 20 + #include <linux/irq.h> 21 + #include <linux/bitops.h> 22 + 23 + #include <asm/arch/irqs.h> 24 + #include <asm/arch/hardware.h> 25 + #include <asm/arch/gpio.h> 26 + 27 + #include <asm/mach/irq.h> 28 + 29 + static DEFINE_SPINLOCK(gpio_lock); 30 + static DECLARE_BITMAP(gpio_in_use, DAVINCI_N_GPIO); 31 + 32 + int gpio_request(unsigned gpio, const char *tag) 33 + { 34 + if (gpio >= DAVINCI_N_GPIO) 35 + return -EINVAL; 36 + 37 + if (test_and_set_bit(gpio, gpio_in_use)) 38 + return -EBUSY; 39 + 40 + return 0; 41 + } 42 + EXPORT_SYMBOL(gpio_request); 43 + 44 + void gpio_free(unsigned gpio) 45 + { 46 + if (gpio >= DAVINCI_N_GPIO) 47 + return; 48 + 49 + clear_bit(gpio, gpio_in_use); 50 + } 51 + EXPORT_SYMBOL(gpio_free); 52 + 53 + /* create a non-inlined version */ 54 + static struct gpio_controller *__iomem gpio2controller(unsigned gpio) 55 + { 56 + return __gpio_to_controller(gpio); 57 + } 58 + 59 + /* 60 + * Assuming the pin is muxed as a gpio output, set its output value. 61 + */ 62 + void __gpio_set(unsigned gpio, int value) 63 + { 64 + struct gpio_controller *__iomem g = gpio2controller(gpio); 65 + 66 + __raw_writel(__gpio_mask(gpio), value ? &g->set_data : &g->clr_data); 67 + } 68 + EXPORT_SYMBOL(__gpio_set); 69 + 70 + 71 + /* 72 + * Read the pin's value (works even if it's set up as output); 73 + * returns zero/nonzero. 74 + * 75 + * Note that changes are synched to the GPIO clock, so reading values back 76 + * right after you've set them may give old values. 77 + */ 78 + int __gpio_get(unsigned gpio) 79 + { 80 + struct gpio_controller *__iomem g = gpio2controller(gpio); 81 + 82 + return !!(__gpio_mask(gpio) & __raw_readl(&g->in_data)); 83 + } 84 + EXPORT_SYMBOL(__gpio_get); 85 + 86 + 87 + /*--------------------------------------------------------------------------*/ 88 + 89 + /* 90 + * board setup code *MUST* set PINMUX0 and PINMUX1 as 91 + * needed, and enable the GPIO clock. 92 + */ 93 + 94 + int gpio_direction_input(unsigned gpio) 95 + { 96 + struct gpio_controller *__iomem g = gpio2controller(gpio); 97 + u32 temp; 98 + u32 mask; 99 + 100 + if (!g) 101 + return -EINVAL; 102 + 103 + spin_lock(&gpio_lock); 104 + mask = __gpio_mask(gpio); 105 + temp = __raw_readl(&g->dir); 106 + temp |= mask; 107 + __raw_writel(temp, &g->dir); 108 + spin_unlock(&gpio_lock); 109 + return 0; 110 + } 111 + EXPORT_SYMBOL(gpio_direction_input); 112 + 113 + int gpio_direction_output(unsigned gpio, int value) 114 + { 115 + struct gpio_controller *__iomem g = gpio2controller(gpio); 116 + u32 temp; 117 + u32 mask; 118 + 119 + if (!g) 120 + return -EINVAL; 121 + 122 + spin_lock(&gpio_lock); 123 + mask = __gpio_mask(gpio); 124 + temp = __raw_readl(&g->dir); 125 + temp &= ~mask; 126 + __raw_writel(mask, value ? &g->set_data : &g->clr_data); 127 + __raw_writel(temp, &g->dir); 128 + spin_unlock(&gpio_lock); 129 + return 0; 130 + } 131 + EXPORT_SYMBOL(gpio_direction_output); 132 + 133 + /* 134 + * We expect irqs will normally be set up as input pins, but they can also be 135 + * used as output pins ... which is convenient for testing. 136 + * 137 + * NOTE: GPIO0..GPIO7 also have direct INTC hookups, which work in addition 138 + * to their GPIOBNK0 irq (but with a bit less overhead). But we don't have 139 + * a good way to hook those up ... 140 + * 141 + * All those INTC hookups (GPIO0..GPIO7 plus five IRQ banks) can also 142 + * serve as EDMA event triggers. 143 + */ 144 + 145 + static void gpio_irq_disable(unsigned irq) 146 + { 147 + struct gpio_controller *__iomem g = get_irq_chip_data(irq); 148 + u32 mask = __gpio_mask(irq_to_gpio(irq)); 149 + 150 + __raw_writel(mask, &g->clr_falling); 151 + __raw_writel(mask, &g->clr_rising); 152 + } 153 + 154 + static void gpio_irq_enable(unsigned irq) 155 + { 156 + struct gpio_controller *__iomem g = get_irq_chip_data(irq); 157 + u32 mask = __gpio_mask(irq_to_gpio(irq)); 158 + 159 + if (irq_desc[irq].status & IRQ_TYPE_EDGE_FALLING) 160 + __raw_writel(mask, &g->set_falling); 161 + if (irq_desc[irq].status & IRQ_TYPE_EDGE_RISING) 162 + __raw_writel(mask, &g->set_rising); 163 + } 164 + 165 + static int gpio_irq_type(unsigned irq, unsigned trigger) 166 + { 167 + struct gpio_controller *__iomem g = get_irq_chip_data(irq); 168 + u32 mask = __gpio_mask(irq_to_gpio(irq)); 169 + 170 + if (trigger & ~(IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) 171 + return -EINVAL; 172 + 173 + irq_desc[irq].status &= ~IRQ_TYPE_SENSE_MASK; 174 + irq_desc[irq].status |= trigger; 175 + 176 + __raw_writel(mask, (trigger & IRQ_TYPE_EDGE_FALLING) 177 + ? &g->set_falling : &g->clr_falling); 178 + __raw_writel(mask, (trigger & IRQ_TYPE_EDGE_RISING) 179 + ? &g->set_rising : &g->clr_rising); 180 + return 0; 181 + } 182 + 183 + static struct irq_chip gpio_irqchip = { 184 + .name = "GPIO", 185 + .enable = gpio_irq_enable, 186 + .disable = gpio_irq_disable, 187 + .set_type = gpio_irq_type, 188 + }; 189 + 190 + static void 191 + gpio_irq_handler(unsigned irq, struct irq_desc *desc) 192 + { 193 + struct gpio_controller *__iomem g = get_irq_chip_data(irq); 194 + u32 mask = 0xffff; 195 + 196 + /* we only care about one bank */ 197 + if (irq & 1) 198 + mask <<= 16; 199 + 200 + /* temporarily mask (level sensitive) parent IRQ */ 201 + desc->chip->ack(irq); 202 + while (1) { 203 + u32 status; 204 + struct irq_desc *gpio; 205 + int n; 206 + int res; 207 + 208 + /* ack any irqs */ 209 + status = __raw_readl(&g->intstat) & mask; 210 + if (!status) 211 + break; 212 + __raw_writel(status, &g->intstat); 213 + if (irq & 1) 214 + status >>= 16; 215 + 216 + /* now demux them to the right lowlevel handler */ 217 + n = (int)get_irq_data(irq); 218 + gpio = &irq_desc[n]; 219 + while (status) { 220 + res = ffs(status); 221 + n += res; 222 + gpio += res; 223 + desc_handle_irq(n - 1, gpio - 1); 224 + status >>= res; 225 + } 226 + } 227 + desc->chip->unmask(irq); 228 + /* now it may re-trigger */ 229 + } 230 + 231 + /* 232 + * NOTE: for suspend/resume, probably best to make a sysdev (and class) 233 + * with its suspend/resume calls hooking into the results of the set_wake() 234 + * calls ... so if no gpios are wakeup events the clock can be disabled, 235 + * with outputs left at previously set levels, and so that VDD3P3V.IOPWDN0 236 + * can be set appropriately for GPIOV33 pins. 237 + */ 238 + 239 + static int __init davinci_gpio_irq_setup(void) 240 + { 241 + unsigned gpio, irq, bank; 242 + struct clk *clk; 243 + 244 + clk = clk_get(NULL, "gpio"); 245 + if (IS_ERR(clk)) { 246 + printk(KERN_ERR "Error %ld getting gpio clock?\n", 247 + PTR_ERR(clk)); 248 + return 0; 249 + } 250 + 251 + clk_enable(clk); 252 + 253 + for (gpio = 0, irq = gpio_to_irq(0), bank = IRQ_GPIOBNK0; 254 + gpio < DAVINCI_N_GPIO; bank++) { 255 + struct gpio_controller *__iomem g = gpio2controller(gpio); 256 + unsigned i; 257 + 258 + __raw_writel(~0, &g->clr_falling); 259 + __raw_writel(~0, &g->clr_rising); 260 + 261 + /* set up all irqs in this bank */ 262 + set_irq_chained_handler(bank, gpio_irq_handler); 263 + set_irq_chip_data(bank, g); 264 + set_irq_data(bank, (void *)irq); 265 + 266 + for (i = 0; i < 16 && gpio < DAVINCI_N_GPIO; 267 + i++, irq++, gpio++) { 268 + set_irq_chip(irq, &gpio_irqchip); 269 + set_irq_chip_data(irq, g); 270 + set_irq_handler(irq, handle_simple_irq); 271 + set_irq_flags(irq, IRQF_VALID); 272 + } 273 + } 274 + 275 + /* BINTEN -- per-bank interrupt enable. genirq would also let these 276 + * bits be set/cleared dynamically. 277 + */ 278 + __raw_writel(0x1f, (void *__iomem) 279 + IO_ADDRESS(DAVINCI_GPIO_BASE + 0x08)); 280 + 281 + printk(KERN_INFO "DaVinci: %d gpio irqs\n", irq - gpio_to_irq(0)); 282 + 283 + return 0; 284 + } 285 + 286 + arch_initcall(davinci_gpio_irq_setup);
+156
include/asm-arm/arch-davinci/gpio.h
··· 1 + /* 2 + * TI DaVinci GPIO Support 3 + * 4 + * Copyright (c) 2006 David Brownell 5 + * Copyright (c) 2007, MontaVista Software, Inc. <source@mvista.com> 6 + * 7 + * This program is free software; you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License as published by 9 + * the Free Software Foundation; either version 2 of the License, or 10 + * (at your option) any later version. 11 + */ 12 + 13 + #ifndef __DAVINCI_GPIO_H 14 + #define __DAVINCI_GPIO_H 15 + 16 + /* 17 + * basic gpio routines 18 + * 19 + * board-specific init should be done by arch/.../.../board-XXX.c (maybe 20 + * initializing banks together) rather than boot loaders; kexec() won't 21 + * go through boot loaders. 22 + * 23 + * the gpio clock will be turned on when gpios are used, and you may also 24 + * need to pay attention to PINMUX0 and PINMUX1 to be sure those pins are 25 + * used as gpios, not with other peripherals. 26 + * 27 + * GPIOs are numbered 0..(DAVINCI_N_GPIO-1). For documentation, and maybe 28 + * for later updates, code should write GPIO(N) or: 29 + * - GPIOV18(N) for 1.8V pins, N in 0..53; same as GPIO(0)..GPIO(53) 30 + * - GPIOV33(N) for 3.3V pins, N in 0..17; same as GPIO(54)..GPIO(70) 31 + * 32 + * For GPIO IRQs use gpio_to_irq(GPIO(N)) or gpio_to_irq(GPIOV33(N)) etc 33 + * for now, that's != GPIO(N) 34 + */ 35 + #define GPIO(X) (X) /* 0 <= X <= 70 */ 36 + #define GPIOV18(X) (X) /* 1.8V i/o; 0 <= X <= 53 */ 37 + #define GPIOV33(X) ((X)+54) /* 3.3V i/o; 0 <= X <= 17 */ 38 + 39 + struct gpio_controller { 40 + u32 dir; 41 + u32 out_data; 42 + u32 set_data; 43 + u32 clr_data; 44 + u32 in_data; 45 + u32 set_rising; 46 + u32 clr_rising; 47 + u32 set_falling; 48 + u32 clr_falling; 49 + u32 intstat; 50 + }; 51 + 52 + /* The __gpio_to_controller() and __gpio_mask() functions inline to constants 53 + * with constant parameters; or in outlined code they execute at runtime. 54 + * 55 + * You'd access the controller directly when reading or writing more than 56 + * one gpio value at a time, and to support wired logic where the value 57 + * being driven by the cpu need not match the value read back. 58 + * 59 + * These are NOT part of the cross-platform GPIO interface 60 + */ 61 + static inline struct gpio_controller *__iomem 62 + __gpio_to_controller(unsigned gpio) 63 + { 64 + void *__iomem ptr; 65 + 66 + if (gpio < 32) 67 + ptr = (void *__iomem)IO_ADDRESS(DAVINCI_GPIO_BASE + 0x10); 68 + else if (gpio < 64) 69 + ptr = (void *__iomem)IO_ADDRESS(DAVINCI_GPIO_BASE + 0x38); 70 + else if (gpio < DAVINCI_N_GPIO) 71 + ptr = (void *__iomem)IO_ADDRESS(DAVINCI_GPIO_BASE + 0x60); 72 + else 73 + ptr = NULL; 74 + return ptr; 75 + } 76 + 77 + static inline u32 __gpio_mask(unsigned gpio) 78 + { 79 + return 1 << (gpio % 32); 80 + } 81 + 82 + /* The get/set/clear functions will inline when called with constant 83 + * parameters, for low-overhead bitbanging. Illegal constant parameters 84 + * cause link-time errors. 85 + * 86 + * Otherwise, calls with variable parameters use outlined functions. 87 + */ 88 + extern int __error_inval_gpio(void); 89 + 90 + extern void __gpio_set(unsigned gpio, int value); 91 + extern int __gpio_get(unsigned gpio); 92 + 93 + static inline void gpio_set_value(unsigned gpio, int value) 94 + { 95 + if (__builtin_constant_p(value)) { 96 + struct gpio_controller *__iomem g; 97 + u32 mask; 98 + 99 + if (gpio >= DAVINCI_N_GPIO) 100 + __error_inval_gpio(); 101 + 102 + g = __gpio_to_controller(gpio); 103 + mask = __gpio_mask(gpio); 104 + if (value) 105 + __raw_writel(mask, &g->set_data); 106 + else 107 + __raw_writel(mask, &g->clr_data); 108 + return; 109 + } 110 + 111 + __gpio_set(gpio, value); 112 + } 113 + 114 + /* Returns zero or nonzero; works for gpios configured as inputs OR 115 + * as outputs. 116 + * 117 + * NOTE: changes in reported values are synchronized to the GPIO clock. 118 + * This is most easily seen after calling gpio_set_value() and then immediatly 119 + * gpio_get_value(), where the gpio_get_value() would return the old value 120 + * until the GPIO clock ticks and the new value gets latched. 121 + */ 122 + 123 + static inline int gpio_get_value(unsigned gpio) 124 + { 125 + struct gpio_controller *__iomem g; 126 + 127 + if (!__builtin_constant_p(gpio)) 128 + return __gpio_get(gpio); 129 + 130 + if (gpio >= DAVINCI_N_GPIO) 131 + return __error_inval_gpio(); 132 + 133 + g = __gpio_to_controller(gpio); 134 + return !!(__gpio_mask(gpio) & __raw_readl(&g->in_data)); 135 + } 136 + 137 + /* powerup default direction is IN */ 138 + extern int gpio_direction_input(unsigned gpio); 139 + extern int gpio_direction_output(unsigned gpio, int value); 140 + 141 + #include <asm-generic/gpio.h> /* cansleep wrappers */ 142 + 143 + extern int gpio_request(unsigned gpio, const char *tag); 144 + extern void gpio_free(unsigned gpio); 145 + 146 + static inline int gpio_to_irq(unsigned gpio) 147 + { 148 + return DAVINCI_N_AINTC_IRQ + gpio; 149 + } 150 + 151 + static inline int irq_to_gpio(unsigned irq) 152 + { 153 + return irq - DAVINCI_N_AINTC_IRQ; 154 + } 155 + 156 + #endif /* __DAVINCI_GPIO_H */
+38
include/asm-arm/arch-davinci/hardware.h
··· 11 11 #ifndef __ASM_ARCH_HARDWARE_H 12 12 #define __ASM_ARCH_HARDWARE_H 13 13 14 + /* 15 + * Base register addresses 16 + */ 17 + #define DAVINCI_DMA_3PCC_BASE (0x01C00000) 18 + #define DAVINCI_DMA_3PTC0_BASE (0x01C10000) 19 + #define DAVINCI_DMA_3PTC1_BASE (0x01C10400) 20 + #define DAVINCI_I2C_BASE (0x01C21000) 21 + #define DAVINCI_PWM0_BASE (0x01C22000) 22 + #define DAVINCI_PWM1_BASE (0x01C22400) 23 + #define DAVINCI_PWM2_BASE (0x01C22800) 24 + #define DAVINCI_SYSTEM_MODULE_BASE (0x01C40000) 25 + #define DAVINCI_PLL_CNTRL0_BASE (0x01C40800) 26 + #define DAVINCI_PLL_CNTRL1_BASE (0x01C40C00) 27 + #define DAVINCI_PWR_SLEEP_CNTRL_BASE (0x01C41000) 28 + #define DAVINCI_SYSTEM_DFT_BASE (0x01C42000) 29 + #define DAVINCI_IEEE1394_BASE (0x01C60000) 30 + #define DAVINCI_USB_OTG_BASE (0x01C64000) 31 + #define DAVINCI_CFC_ATA_BASE (0x01C66000) 32 + #define DAVINCI_SPI_BASE (0x01C66800) 33 + #define DAVINCI_GPIO_BASE (0x01C67000) 34 + #define DAVINCI_UHPI_BASE (0x01C67800) 35 + #define DAVINCI_VPSS_REGS_BASE (0x01C70000) 36 + #define DAVINCI_EMAC_CNTRL_REGS_BASE (0x01C80000) 37 + #define DAVINCI_EMAC_WRAPPER_CNTRL_REGS_BASE (0x01C81000) 38 + #define DAVINCI_EMAC_WRAPPER_RAM_BASE (0x01C82000) 39 + #define DAVINCI_MDIO_CNTRL_REGS_BASE (0x01C84000) 40 + #define DAVINCI_IMCOP_BASE (0x01CC0000) 41 + #define DAVINCI_ASYNC_EMIF_CNTRL_BASE (0x01E00000) 42 + #define DAVINCI_VLYNQ_BASE (0x01E01000) 43 + #define DAVINCI_MCBSP_BASE (0x01E02000) 44 + #define DAVINCI_MMC_SD_BASE (0x01E10000) 45 + #define DAVINCI_MS_BASE (0x01E20000) 46 + #define DAVINCI_ASYNC_EMIF_DATA_CE0_BASE (0x02000000) 47 + #define DAVINCI_ASYNC_EMIF_DATA_CE1_BASE (0x04000000) 48 + #define DAVINCI_ASYNC_EMIF_DATA_CE2_BASE (0x06000000) 49 + #define DAVINCI_ASYNC_EMIF_DATA_CE3_BASE (0x08000000) 50 + #define DAVINCI_VLYNQ_REMOTE_BASE (0x0C000000) 51 + 14 52 #endif /* __ASM_ARCH_HARDWARE_H */