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

Configure Feed

Select the types of activity you want to include in your feed.

at v3.1-rc8 697 lines 19 kB view raw
1/* 2 * U300 GPIO module. 3 * 4 * Copyright (C) 2007-2009 ST-Ericsson AB 5 * License terms: GNU General Public License (GPL) version 2 6 * This can driver either of the two basic GPIO cores 7 * available in the U300 platforms: 8 * COH 901 335 - Used in DB3150 (U300 1.0) and DB3200 (U330 1.0) 9 * COH 901 571/3 - Used in DB3210 (U365 2.0) and DB3350 (U335 1.0) 10 * Notice that you also have inline macros in <asm-arch/gpio.h> 11 * Author: Linus Walleij <linus.walleij@stericsson.com> 12 * Author: Jonas Aaberg <jonas.aberg@stericsson.com> 13 * 14 */ 15#include <linux/module.h> 16#include <linux/interrupt.h> 17#include <linux/delay.h> 18#include <linux/errno.h> 19#include <linux/io.h> 20#include <linux/clk.h> 21#include <linux/err.h> 22#include <linux/platform_device.h> 23#include <linux/gpio.h> 24 25/* Reference to GPIO block clock */ 26static struct clk *clk; 27 28/* Memory resource */ 29static struct resource *memres; 30static void __iomem *virtbase; 31static struct device *gpiodev; 32 33struct u300_gpio_port { 34 const char *name; 35 int irq; 36 int number; 37}; 38 39 40static struct u300_gpio_port gpio_ports[] = { 41 { 42 .name = "gpio0", 43 .number = 0, 44 }, 45 { 46 .name = "gpio1", 47 .number = 1, 48 }, 49 { 50 .name = "gpio2", 51 .number = 2, 52 }, 53#ifdef U300_COH901571_3 54 { 55 .name = "gpio3", 56 .number = 3, 57 }, 58 { 59 .name = "gpio4", 60 .number = 4, 61 }, 62#ifdef CONFIG_MACH_U300_BS335 63 { 64 .name = "gpio5", 65 .number = 5, 66 }, 67 { 68 .name = "gpio6", 69 .number = 6, 70 }, 71#endif 72#endif 73 74}; 75 76 77#ifdef U300_COH901571_3 78 79/* Default input value */ 80#define DEFAULT_OUTPUT_LOW 0 81#define DEFAULT_OUTPUT_HIGH 1 82 83/* GPIO Pull-Up status */ 84#define DISABLE_PULL_UP 0 85#define ENABLE_PULL_UP 1 86 87#define GPIO_NOT_USED 0 88#define GPIO_IN 1 89#define GPIO_OUT 2 90 91struct u300_gpio_configuration_data { 92 unsigned char pin_usage; 93 unsigned char default_output_value; 94 unsigned char pull_up; 95}; 96 97/* Initial configuration */ 98const struct u300_gpio_configuration_data 99u300_gpio_config[U300_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = { 100#ifdef CONFIG_MACH_U300_BS335 101 /* Port 0, pins 0-7 */ 102 { 103 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 104 {GPIO_OUT, DEFAULT_OUTPUT_HIGH, DISABLE_PULL_UP}, 105 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 106 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 107 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 108 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 109 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 110 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP} 111 }, 112 /* Port 1, pins 0-7 */ 113 { 114 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 115 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 116 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 117 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 118 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 119 {GPIO_OUT, DEFAULT_OUTPUT_HIGH, DISABLE_PULL_UP}, 120 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 121 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP} 122 }, 123 /* Port 2, pins 0-7 */ 124 { 125 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 126 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 127 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 128 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 129 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 130 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 131 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 132 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP} 133 }, 134 /* Port 3, pins 0-7 */ 135 { 136 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 137 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 138 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 139 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 140 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 141 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 142 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 143 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP} 144 }, 145 /* Port 4, pins 0-7 */ 146 { 147 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 148 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 149 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 150 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 151 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 152 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 153 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 154 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP} 155 }, 156 /* Port 5, pins 0-7 */ 157 { 158 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 159 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 160 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 161 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 162 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 163 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 164 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 165 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP} 166 }, 167 /* Port 6, pind 0-7 */ 168 { 169 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 170 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 171 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 172 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 173 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 174 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 175 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 176 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP} 177 } 178#endif 179 180#ifdef CONFIG_MACH_U300_BS365 181 /* Port 0, pins 0-7 */ 182 { 183 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 184 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 185 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 186 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 187 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 188 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 189 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 190 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP} 191 }, 192 /* Port 1, pins 0-7 */ 193 { 194 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 195 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 196 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 197 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 198 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 199 {GPIO_OUT, DEFAULT_OUTPUT_HIGH, DISABLE_PULL_UP}, 200 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 201 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP} 202 }, 203 /* Port 2, pins 0-7 */ 204 { 205 {GPIO_IN, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 206 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 207 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 208 {GPIO_OUT, DEFAULT_OUTPUT_LOW, DISABLE_PULL_UP}, 209 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 210 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 211 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 212 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP} 213 }, 214 /* Port 3, pins 0-7 */ 215 { 216 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 217 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 218 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 219 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 220 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 221 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 222 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 223 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP} 224 }, 225 /* Port 4, pins 0-7 */ 226 { 227 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 228 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 229 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 230 {GPIO_IN, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 231 /* These 4 pins doesn't exist on DB3210 */ 232 {GPIO_OUT, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 233 {GPIO_OUT, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 234 {GPIO_OUT, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP}, 235 {GPIO_OUT, DEFAULT_OUTPUT_LOW, ENABLE_PULL_UP} 236 } 237#endif 238}; 239#endif 240 241 242/* No users == we can power down GPIO */ 243static int gpio_users; 244 245struct gpio_struct { 246 int (*callback)(void *); 247 void *data; 248 int users; 249}; 250 251static struct gpio_struct gpio_pin[U300_GPIO_MAX]; 252 253/* 254 * Let drivers register callback in order to get notified when there is 255 * an interrupt on the gpio pin 256 */ 257int gpio_register_callback(unsigned gpio, int (*func)(void *arg), void *data) 258{ 259 if (gpio_pin[gpio].callback) 260 dev_warn(gpiodev, "%s: WARNING: callback already " 261 "registered for gpio pin#%d\n", __func__, gpio); 262 gpio_pin[gpio].callback = func; 263 gpio_pin[gpio].data = data; 264 265 return 0; 266} 267EXPORT_SYMBOL(gpio_register_callback); 268 269int gpio_unregister_callback(unsigned gpio) 270{ 271 if (!gpio_pin[gpio].callback) 272 dev_warn(gpiodev, "%s: WARNING: callback already " 273 "unregistered for gpio pin#%d\n", __func__, gpio); 274 gpio_pin[gpio].callback = NULL; 275 gpio_pin[gpio].data = NULL; 276 277 return 0; 278} 279EXPORT_SYMBOL(gpio_unregister_callback); 280 281/* Non-zero means valid */ 282int gpio_is_valid(int number) 283{ 284 if (number >= 0 && 285 number < (U300_GPIO_NUM_PORTS * U300_GPIO_PINS_PER_PORT)) 286 return 1; 287 return 0; 288} 289EXPORT_SYMBOL(gpio_is_valid); 290 291int gpio_request(unsigned gpio, const char *label) 292{ 293 if (gpio_pin[gpio].users) 294 return -EINVAL; 295 else 296 gpio_pin[gpio].users++; 297 298 gpio_users++; 299 300 return 0; 301} 302EXPORT_SYMBOL(gpio_request); 303 304void gpio_free(unsigned gpio) 305{ 306 gpio_users--; 307 gpio_pin[gpio].users--; 308 if (unlikely(gpio_pin[gpio].users < 0)) { 309 dev_warn(gpiodev, "warning: gpio#%d release mismatch\n", 310 gpio); 311 gpio_pin[gpio].users = 0; 312 } 313 314 return; 315} 316EXPORT_SYMBOL(gpio_free); 317 318/* This returns zero or nonzero */ 319int gpio_get_value(unsigned gpio) 320{ 321 return readl(virtbase + U300_GPIO_PXPDIR + 322 PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING) & (1 << (gpio & 0x07)); 323} 324EXPORT_SYMBOL(gpio_get_value); 325 326/* 327 * We hope that the compiler will optimize away the unused branch 328 * in case "value" is a constant 329 */ 330void gpio_set_value(unsigned gpio, int value) 331{ 332 u32 val; 333 unsigned long flags; 334 335 local_irq_save(flags); 336 if (value) { 337 /* set */ 338 val = readl(virtbase + U300_GPIO_PXPDOR + 339 PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING) 340 & (1 << (gpio & 0x07)); 341 writel(val | (1 << (gpio & 0x07)), virtbase + 342 U300_GPIO_PXPDOR + 343 PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING); 344 } else { 345 /* clear */ 346 val = readl(virtbase + U300_GPIO_PXPDOR + 347 PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING) 348 & (1 << (gpio & 0x07)); 349 writel(val & ~(1 << (gpio & 0x07)), virtbase + 350 U300_GPIO_PXPDOR + 351 PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING); 352 } 353 local_irq_restore(flags); 354} 355EXPORT_SYMBOL(gpio_set_value); 356 357int gpio_direction_input(unsigned gpio) 358{ 359 unsigned long flags; 360 u32 val; 361 362 if (gpio > U300_GPIO_MAX) 363 return -EINVAL; 364 365 local_irq_save(flags); 366 val = readl(virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) * 367 U300_GPIO_PORTX_SPACING); 368 /* Mask out this pin*/ 369 val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK << ((gpio & 0x07) << 1)); 370 /* This is not needed since it sets the bits to zero.*/ 371 /* val |= (U300_GPIO_PXPCR_PIN_MODE_INPUT << (gpio*2)); */ 372 writel(val, virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) * 373 U300_GPIO_PORTX_SPACING); 374 local_irq_restore(flags); 375 return 0; 376} 377EXPORT_SYMBOL(gpio_direction_input); 378 379int gpio_direction_output(unsigned gpio, int value) 380{ 381 unsigned long flags; 382 u32 val; 383 384 if (gpio > U300_GPIO_MAX) 385 return -EINVAL; 386 387 local_irq_save(flags); 388 val = readl(virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) * 389 U300_GPIO_PORTX_SPACING); 390 /* Mask out this pin */ 391 val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK << ((gpio & 0x07) << 1)); 392 /* 393 * FIXME: configure for push/pull, open drain or open source per pin 394 * in setup. The current driver will only support push/pull. 395 */ 396 val |= (U300_GPIO_PXPCR_PIN_MODE_OUTPUT_PUSH_PULL 397 << ((gpio & 0x07) << 1)); 398 writel(val, virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) * 399 U300_GPIO_PORTX_SPACING); 400 gpio_set_value(gpio, value); 401 local_irq_restore(flags); 402 return 0; 403} 404EXPORT_SYMBOL(gpio_direction_output); 405 406/* 407 * Enable an IRQ, edge is rising edge (!= 0) or falling edge (==0). 408 */ 409void enable_irq_on_gpio_pin(unsigned gpio, int edge) 410{ 411 u32 val; 412 unsigned long flags; 413 local_irq_save(flags); 414 415 val = readl(virtbase + U300_GPIO_PXIEN + PIN_TO_PORT(gpio) * 416 U300_GPIO_PORTX_SPACING); 417 val |= (1 << (gpio & 0x07)); 418 writel(val, virtbase + U300_GPIO_PXIEN + PIN_TO_PORT(gpio) * 419 U300_GPIO_PORTX_SPACING); 420 val = readl(virtbase + U300_GPIO_PXICR + PIN_TO_PORT(gpio) * 421 U300_GPIO_PORTX_SPACING); 422 if (edge) 423 val |= (1 << (gpio & 0x07)); 424 else 425 val &= ~(1 << (gpio & 0x07)); 426 writel(val, virtbase + U300_GPIO_PXICR + PIN_TO_PORT(gpio) * 427 U300_GPIO_PORTX_SPACING); 428 local_irq_restore(flags); 429} 430EXPORT_SYMBOL(enable_irq_on_gpio_pin); 431 432void disable_irq_on_gpio_pin(unsigned gpio) 433{ 434 u32 val; 435 unsigned long flags; 436 437 local_irq_save(flags); 438 val = readl(virtbase + U300_GPIO_PXIEN + PIN_TO_PORT(gpio) * 439 U300_GPIO_PORTX_SPACING); 440 val &= ~(1 << (gpio & 0x07)); 441 writel(val, virtbase + U300_GPIO_PXIEN + PIN_TO_PORT(gpio) * 442 U300_GPIO_PORTX_SPACING); 443 local_irq_restore(flags); 444} 445EXPORT_SYMBOL(disable_irq_on_gpio_pin); 446 447/* Enable (value == 0) or disable (value == 1) internal pullup */ 448void gpio_pullup(unsigned gpio, int value) 449{ 450 u32 val; 451 unsigned long flags; 452 453 local_irq_save(flags); 454 if (value) { 455 val = readl(virtbase + U300_GPIO_PXPER + PIN_TO_PORT(gpio) * 456 U300_GPIO_PORTX_SPACING); 457 writel(val | (1 << (gpio & 0x07)), virtbase + U300_GPIO_PXPER + 458 PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING); 459 } else { 460 val = readl(virtbase + U300_GPIO_PXPER + PIN_TO_PORT(gpio) * 461 U300_GPIO_PORTX_SPACING); 462 writel(val & ~(1 << (gpio & 0x07)), virtbase + U300_GPIO_PXPER + 463 PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING); 464 } 465 local_irq_restore(flags); 466} 467EXPORT_SYMBOL(gpio_pullup); 468 469static irqreturn_t gpio_irq_handler(int irq, void *dev_id) 470{ 471 struct u300_gpio_port *port = dev_id; 472 u32 val; 473 int pin; 474 475 /* Read event register */ 476 val = readl(virtbase + U300_GPIO_PXIEV + port->number * 477 U300_GPIO_PORTX_SPACING); 478 /* Mask with enable register */ 479 val &= readl(virtbase + U300_GPIO_PXIEV + port->number * 480 U300_GPIO_PORTX_SPACING); 481 /* Mask relevant bits */ 482 val &= U300_GPIO_PXIEV_ALL_IRQ_EVENT_MASK; 483 /* ACK IRQ (clear event) */ 484 writel(val, virtbase + U300_GPIO_PXIEV + port->number * 485 U300_GPIO_PORTX_SPACING); 486 /* Print message */ 487 while (val != 0) { 488 unsigned gpio; 489 490 pin = __ffs(val); 491 /* mask off this pin */ 492 val &= ~(1 << pin); 493 gpio = (port->number << 3) + pin; 494 495 if (gpio_pin[gpio].callback) 496 (void)gpio_pin[gpio].callback(gpio_pin[gpio].data); 497 else 498 dev_dbg(gpiodev, "stray GPIO IRQ on line %d\n", 499 gpio); 500 } 501 return IRQ_HANDLED; 502} 503 504static void gpio_set_initial_values(void) 505{ 506#ifdef U300_COH901571_3 507 int i, j; 508 unsigned long flags; 509 u32 val; 510 511 /* Write default values to all pins */ 512 for (i = 0; i < U300_GPIO_NUM_PORTS; i++) { 513 val = 0; 514 for (j = 0; j < 8; j++) 515 val |= (u32) (u300_gpio_config[i][j].default_output_value != DEFAULT_OUTPUT_LOW) << j; 516 local_irq_save(flags); 517 writel(val, virtbase + U300_GPIO_PXPDOR + i * U300_GPIO_PORTX_SPACING); 518 local_irq_restore(flags); 519 } 520 521 /* 522 * Put all pins that are set to either 'GPIO_OUT' or 'GPIO_NOT_USED' 523 * to output and 'GPIO_IN' to input for each port. And initialize 524 * default value on outputs. 525 */ 526 for (i = 0; i < U300_GPIO_NUM_PORTS; i++) { 527 for (j = 0; j < U300_GPIO_PINS_PER_PORT; j++) { 528 local_irq_save(flags); 529 val = readl(virtbase + U300_GPIO_PXPCR + 530 i * U300_GPIO_PORTX_SPACING); 531 /* Mask out this pin */ 532 val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK << (j << 1)); 533 534 if (u300_gpio_config[i][j].pin_usage != GPIO_IN) 535 val |= (U300_GPIO_PXPCR_PIN_MODE_OUTPUT_PUSH_PULL << (j << 1)); 536 writel(val, virtbase + U300_GPIO_PXPCR + 537 i * U300_GPIO_PORTX_SPACING); 538 local_irq_restore(flags); 539 } 540 } 541 542 /* Enable or disable the internal pull-ups in the GPIO ASIC block */ 543 for (i = 0; i < U300_GPIO_MAX; i++) { 544 val = 0; 545 for (j = 0; j < 8; j++) 546 val |= (u32)((u300_gpio_config[i][j].pull_up == DISABLE_PULL_UP) << j); 547 local_irq_save(flags); 548 writel(val, virtbase + U300_GPIO_PXPER + i * U300_GPIO_PORTX_SPACING); 549 local_irq_restore(flags); 550 } 551#endif 552} 553 554static int __init gpio_probe(struct platform_device *pdev) 555{ 556 u32 val; 557 int err = 0; 558 int i; 559 int num_irqs; 560 561 gpiodev = &pdev->dev; 562 memset(gpio_pin, 0, sizeof(gpio_pin)); 563 564 /* Get GPIO clock */ 565 clk = clk_get(&pdev->dev, NULL); 566 if (IS_ERR(clk)) { 567 err = PTR_ERR(clk); 568 dev_err(gpiodev, "could not get GPIO clock\n"); 569 goto err_no_clk; 570 } 571 err = clk_enable(clk); 572 if (err) { 573 dev_err(gpiodev, "could not enable GPIO clock\n"); 574 goto err_no_clk_enable; 575 } 576 577 memres = platform_get_resource(pdev, IORESOURCE_MEM, 0); 578 if (!memres) 579 goto err_no_resource; 580 581 if (!request_mem_region(memres->start, resource_size(memres), 582 "GPIO Controller")) { 583 err = -ENODEV; 584 goto err_no_ioregion; 585 } 586 587 virtbase = ioremap(memres->start, resource_size(memres)); 588 if (!virtbase) { 589 err = -ENOMEM; 590 goto err_no_ioremap; 591 } 592 dev_info(gpiodev, "remapped 0x%08x to %p\n", 593 memres->start, virtbase); 594 595#ifdef U300_COH901335 596 dev_info(gpiodev, "initializing GPIO Controller COH 901 335\n"); 597 /* Turn on the GPIO block */ 598 writel(U300_GPIO_CR_BLOCK_CLOCK_ENABLE, virtbase + U300_GPIO_CR); 599#endif 600 601#ifdef U300_COH901571_3 602 dev_info(gpiodev, "initializing GPIO Controller COH 901 571/3\n"); 603 val = readl(virtbase + U300_GPIO_CR); 604 dev_info(gpiodev, "COH901571/3 block version: %d, " \ 605 "number of cores: %d\n", 606 ((val & 0x0000FE00) >> 9), 607 ((val & 0x000001FC) >> 2)); 608 writel(U300_GPIO_CR_BLOCK_CLKRQ_ENABLE, virtbase + U300_GPIO_CR); 609#endif 610 611 gpio_set_initial_values(); 612 613 for (num_irqs = 0 ; num_irqs < U300_GPIO_NUM_PORTS; num_irqs++) { 614 615 gpio_ports[num_irqs].irq = 616 platform_get_irq_byname(pdev, 617 gpio_ports[num_irqs].name); 618 619 err = request_irq(gpio_ports[num_irqs].irq, 620 gpio_irq_handler, IRQF_DISABLED, 621 gpio_ports[num_irqs].name, 622 &gpio_ports[num_irqs]); 623 if (err) { 624 dev_err(gpiodev, "cannot allocate IRQ for %s!\n", 625 gpio_ports[num_irqs].name); 626 goto err_no_irq; 627 } 628 /* Turns off PortX_irq_force */ 629 writel(0x0, virtbase + U300_GPIO_PXIFR + 630 num_irqs * U300_GPIO_PORTX_SPACING); 631 } 632 633 return 0; 634 635 err_no_irq: 636 for (i = 0; i < num_irqs; i++) 637 free_irq(gpio_ports[i].irq, &gpio_ports[i]); 638 iounmap(virtbase); 639 err_no_ioremap: 640 release_mem_region(memres->start, resource_size(memres)); 641 err_no_ioregion: 642 err_no_resource: 643 clk_disable(clk); 644 err_no_clk_enable: 645 clk_put(clk); 646 err_no_clk: 647 dev_info(gpiodev, "module ERROR:%d\n", err); 648 return err; 649} 650 651static int __exit gpio_remove(struct platform_device *pdev) 652{ 653 int i; 654 655 /* Turn off the GPIO block */ 656 writel(0x00000000U, virtbase + U300_GPIO_CR); 657 for (i = 0 ; i < U300_GPIO_NUM_PORTS; i++) 658 free_irq(gpio_ports[i].irq, &gpio_ports[i]); 659 iounmap(virtbase); 660 release_mem_region(memres->start, resource_size(memres)); 661 clk_disable(clk); 662 clk_put(clk); 663 return 0; 664} 665 666static struct platform_driver gpio_driver = { 667 .driver = { 668 .name = "u300-gpio", 669 }, 670 .remove = __exit_p(gpio_remove), 671}; 672 673 674static int __init u300_gpio_init(void) 675{ 676 return platform_driver_probe(&gpio_driver, gpio_probe); 677} 678 679static void __exit u300_gpio_exit(void) 680{ 681 platform_driver_unregister(&gpio_driver); 682} 683 684arch_initcall(u300_gpio_init); 685module_exit(u300_gpio_exit); 686 687MODULE_AUTHOR("Linus Walleij <linus.walleij@stericsson.com>"); 688 689#ifdef U300_COH901571_3 690MODULE_DESCRIPTION("ST-Ericsson AB COH 901 571/3 GPIO driver"); 691#endif 692 693#ifdef U300_COH901335 694MODULE_DESCRIPTION("ST-Ericsson AB COH 901 335 GPIO driver"); 695#endif 696 697MODULE_LICENSE("GPL");