CRIS v32: Rewrite ARTPEC-3 gpio driver to avoid volatiles and general cleanup.

Changes as suggested by Andrew Morton, plus general cleanup to
ease later consolidation of driver into machine common driver.

- Correct parameter type of gpio_write to const char __user *
- Remove volatile from the arrays of machine dependent registers, use
readl and writel to access them instead.
- Remove useless casts of void.
- Use spin_lock_irqsave for locking.
- Break gpio_write into smaller sub-functions.
- Remove useless breaks after returns.
- Don't perform any change in IO_CFG_WRITE_MODE if values are invalid.
(previously values were set and then set to zero)
- Change cast for copy_to_user to (void __user *)
- Make file_operations gpio_fops static and const.
- Make setget_output static. (However, it's still inline since the CRIS
architecture is still not SMP, which makes the function small enough
to inline)

+174 -174
+174 -174
arch/cris/arch-v32/drivers/mach-a3/gpio.c
··· 72 72 unsigned long arg); 73 73 #endif 74 74 static int gpio_ioctl(struct inode *inode, struct file *file, 75 - unsigned int cmd, unsigned long arg); 76 - static ssize_t gpio_write(struct file *file, const char *buf, size_t count, 77 - loff_t *off); 75 + unsigned int cmd, unsigned long arg); 76 + static ssize_t gpio_write(struct file *file, const char __user *buf, 77 + size_t count, loff_t *off); 78 78 static int gpio_open(struct inode *inode, struct file *filp); 79 79 static int gpio_release(struct inode *inode, struct file *filp); 80 80 static unsigned int gpio_poll(struct file *filp, 81 - struct poll_table_struct *wait); 81 + struct poll_table_struct *wait); 82 82 83 83 /* private data per open() of this driver */ 84 84 ··· 96 96 }; 97 97 98 98 static void gpio_set_alarm(struct gpio_private *priv); 99 + static int gpio_leds_ioctl(unsigned int cmd, unsigned long arg); 100 + static int gpio_pwm_ioctl(struct gpio_private *priv, unsigned int cmd, 101 + unsigned long arg); 102 + 99 103 100 104 /* linked list of alarms to check for */ 101 105 ··· 107 103 108 104 static int wanted_interrupts; 109 105 110 - static DEFINE_SPINLOCK(alarm_lock); 106 + static DEFINE_SPINLOCK(gpio_lock); 111 107 112 108 #define NUM_PORTS (GPIO_MINOR_LAST+1) 113 109 #define GIO_REG_RD_ADDR(reg) \ 114 - (volatile unsigned long *)(regi_gio + REG_RD_ADDR_gio_##reg) 110 + (unsigned long *)(regi_gio + REG_RD_ADDR_gio_##reg) 115 111 #define GIO_REG_WR_ADDR(reg) \ 116 - (volatile unsigned long *)(regi_gio + REG_WR_ADDR_gio_##reg) 117 - unsigned long led_dummy; 118 - unsigned long port_d_dummy; /* Only input on Artpec-3 */ 119 - unsigned long port_e_dummy; /* Non existent on Artpec-3 */ 112 + (unsigned long *)(regi_gio + REG_WR_ADDR_gio_##reg) 113 + static unsigned long led_dummy; 114 + static unsigned long port_d_dummy; /* Only input on Artpec-3 */ 120 115 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO 116 + static unsigned long port_e_dummy; /* Non existent on Artpec-3 */ 121 117 static unsigned long virtual_dummy; 122 118 static unsigned long virtual_rw_pv_oe = CONFIG_ETRAX_DEF_GIO_PV_OE; 123 119 static unsigned short cached_virtual_gpio_read; 124 120 #endif 125 121 126 - static volatile unsigned long *data_out[NUM_PORTS] = { 122 + static unsigned long *data_out[NUM_PORTS] = { 127 123 GIO_REG_WR_ADDR(rw_pa_dout), 128 124 GIO_REG_WR_ADDR(rw_pb_dout), 129 125 &led_dummy, ··· 135 131 #endif 136 132 }; 137 133 138 - static volatile unsigned long *data_in[NUM_PORTS] = { 134 + static unsigned long *data_in[NUM_PORTS] = { 139 135 GIO_REG_RD_ADDR(r_pa_din), 140 136 GIO_REG_RD_ADDR(r_pb_din), 141 137 &led_dummy, ··· 171 167 #endif 172 168 }; 173 169 174 - static volatile unsigned long *dir_oe[NUM_PORTS] = { 170 + static unsigned long *dir_oe[NUM_PORTS] = { 175 171 GIO_REG_WR_ADDR(rw_pa_oe), 176 172 GIO_REG_WR_ADDR(rw_pb_oe), 177 173 &led_dummy, ··· 183 179 #endif 184 180 }; 185 181 186 - static void 187 - gpio_set_alarm(struct gpio_private *priv) 182 + static void gpio_set_alarm(struct gpio_private *priv) 188 183 { 189 184 int bit; 190 185 int intr_cfg; ··· 191 188 int pins; 192 189 unsigned long flags; 193 190 194 - local_irq_save(flags); 191 + spin_lock_irqsave(&gpio_lock, flags); 195 192 intr_cfg = REG_RD_INT(gio, regi_gio, rw_intr_cfg); 196 193 pins = REG_RD_INT(gio, regi_gio, rw_intr_pins); 197 194 mask = REG_RD_INT(gio, regi_gio, rw_intr_mask) & I2C_INTERRUPT_BITS; ··· 221 218 REG_WR_INT(gio, regi_gio, rw_intr_pins, pins); 222 219 REG_WR_INT(gio, regi_gio, rw_intr_mask, mask); 223 220 224 - local_irq_restore(flags); 221 + spin_unlock_irqrestore(&gpio_lock, flags); 225 222 } 226 223 227 - static unsigned int 228 - gpio_poll(struct file *file, struct poll_table_struct *wait) 224 + static unsigned int gpio_poll(struct file *file, struct poll_table_struct *wait) 229 225 { 230 226 unsigned int mask = 0; 231 - struct gpio_private *priv = (struct gpio_private *)file->private_data; 227 + struct gpio_private *priv = file->private_data; 232 228 unsigned long data; 233 229 unsigned long tmp; 234 230 ··· 237 235 238 236 poll_wait(file, &priv->alarm_wq, wait); 239 237 if (priv->minor <= GPIO_MINOR_D) { 240 - data = *data_in[priv->minor]; 238 + data = readl(data_in[priv->minor]); 241 239 REG_WR_INT(gio, regi_gio, rw_ack_intr, wanted_interrupts); 242 240 tmp = REG_RD_INT(gio, regi_gio, rw_intr_mask); 243 241 tmp &= I2C_INTERRUPT_BITS; ··· 253 251 return mask; 254 252 } 255 253 256 - static irqreturn_t 257 - gpio_interrupt(int irq, void *dev_id) 254 + static irqreturn_t gpio_interrupt(int irq, void *dev_id) 258 255 { 259 256 reg_gio_rw_intr_mask intr_mask; 260 257 reg_gio_r_masked_intr masked_intr; 261 258 reg_gio_rw_ack_intr ack_intr; 259 + unsigned long flags; 262 260 unsigned long tmp; 263 261 unsigned long tmp2; 264 262 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO ··· 270 268 tmp = REG_TYPE_CONV(unsigned long, reg_gio_r_masked_intr, masked_intr); 271 269 272 270 /* Find those that we have enabled */ 273 - spin_lock(&alarm_lock); 271 + spin_lock_irqsave(&gpio_lock, flags); 274 272 tmp &= wanted_interrupts; 275 - spin_unlock(&alarm_lock); 273 + spin_unlock_irqrestore(&gpio_lock, flags); 276 274 277 275 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO 278 276 /* Something changed on virtual GPIO. Interrupt is acked by ··· 306 304 return IRQ_RETVAL(tmp); 307 305 } 308 306 309 - 310 - static ssize_t gpio_write(struct file *file, const char *buf, size_t count, 311 - loff_t *off) 307 + static void gpio_write_bit(unsigned long *port, unsigned char data, int bit, 308 + unsigned char clk_mask, unsigned char data_mask) 312 309 { 313 - struct gpio_private *priv = (struct gpio_private *)file->private_data; 314 - unsigned char data, clk_mask, data_mask, write_msb; 310 + unsigned long shadow = readl(port) & ~clk_mask; 311 + writel(shadow, port); 312 + if (data & 1 << bit) 313 + shadow |= data_mask; 314 + else 315 + shadow &= ~data_mask; 316 + writel(shadow, port); 317 + /* For FPGA: min 5.0ns (DCC) before CCLK high */ 318 + shadow |= clk_mask; 319 + writel(shadow, port); 320 + } 321 + 322 + static void gpio_write_byte(struct gpio_private *priv, unsigned long *port, 323 + unsigned char data) 324 + { 325 + int i; 326 + 327 + if (priv->write_msb) 328 + for (i = 7; i >= 0; i--) 329 + gpio_write_bit(port, data, i, priv->clk_mask, 330 + priv->data_mask); 331 + else 332 + for (i = 0; i <= 7; i++) 333 + gpio_write_bit(port, data, i, priv->clk_mask, 334 + priv->data_mask); 335 + } 336 + 337 + 338 + static ssize_t gpio_write(struct file *file, const char __user *buf, 339 + size_t count, loff_t *off) 340 + { 341 + struct gpio_private *priv = file->private_data; 315 342 unsigned long flags; 316 - unsigned long shadow; 317 - volatile unsigned long *port; 318 343 ssize_t retval = count; 319 344 /* Only bits 0-7 may be used for write operations but allow all 320 345 devices except leds... */ ··· 359 330 if (!access_ok(VERIFY_READ, buf, count)) 360 331 return -EFAULT; 361 332 362 - clk_mask = priv->clk_mask; 363 - data_mask = priv->data_mask; 364 333 /* It must have been configured using the IO_CFG_WRITE_MODE */ 365 334 /* Perhaps a better error code? */ 366 - if (clk_mask == 0 || data_mask == 0) 335 + if (priv->clk_mask == 0 || priv->data_mask == 0) 367 336 return -EPERM; 368 337 369 - write_msb = priv->write_msb; 370 338 D(printk(KERN_DEBUG "gpio_write: %lu to data 0x%02X clk 0x%02X " 371 339 "msb: %i\n", 372 - count, data_mask, clk_mask, write_msb)); 373 - port = data_out[priv->minor]; 340 + count, priv->data_mask, priv->clk_mask, priv->write_msb)); 374 341 375 - while (count--) { 376 - int i; 377 - data = *buf++; 378 - if (priv->write_msb) { 379 - for (i = 7; i >= 0; i--) { 380 - local_irq_save(flags); 381 - shadow = *port; 382 - *port = shadow &= ~clk_mask; 383 - if (data & 1<<i) 384 - *port = shadow |= data_mask; 385 - else 386 - *port = shadow &= ~data_mask; 387 - /* For FPGA: min 5.0ns (DCC) before CCLK high */ 388 - *port = shadow |= clk_mask; 389 - local_irq_restore(flags); 390 - } 391 - } else { 392 - for (i = 0; i <= 7; i++) { 393 - local_irq_save(flags); 394 - shadow = *port; 395 - *port = shadow &= ~clk_mask; 396 - if (data & 1<<i) 397 - *port = shadow |= data_mask; 398 - else 399 - *port = shadow &= ~data_mask; 400 - /* For FPGA: min 5.0ns (DCC) before CCLK high */ 401 - *port = shadow |= clk_mask; 402 - local_irq_restore(flags); 403 - } 404 - } 405 - } 342 + spin_lock_irqsave(&gpio_lock, flags); 343 + 344 + while (count--) 345 + gpio_write_byte(priv, data_out[priv->minor], *buf++); 346 + 347 + spin_unlock_irqrestore(&gpio_lock, flags); 406 348 return retval; 407 349 } 408 350 409 - static int 410 - gpio_open(struct inode *inode, struct file *filp) 351 + static int gpio_open(struct inode *inode, struct file *filp) 411 352 { 412 353 struct gpio_private *priv; 413 354 int p = iminor(inode); ··· 393 394 memset(priv, 0, sizeof(*priv)); 394 395 395 396 priv->minor = p; 396 - filp->private_data = (void *)priv; 397 + filp->private_data = priv; 397 398 398 399 /* initialize the io/alarm struct, not for PWM ports though */ 399 400 if (p <= GPIO_MINOR_LAST) { ··· 406 407 init_waitqueue_head(&priv->alarm_wq); 407 408 408 409 /* link it into our alarmlist */ 409 - spin_lock_irq(&alarm_lock); 410 + spin_lock_irq(&gpio_lock); 410 411 priv->next = alarmlist; 411 412 alarmlist = priv; 412 - spin_unlock_irq(&alarm_lock); 413 + spin_unlock_irq(&gpio_lock); 413 414 } 414 415 415 416 return 0; 416 417 } 417 418 418 - static int 419 - gpio_release(struct inode *inode, struct file *filp) 419 + static int gpio_release(struct inode *inode, struct file *filp) 420 420 { 421 421 struct gpio_private *p; 422 422 struct gpio_private *todel; ··· 423 425 unsigned long a_high, a_low; 424 426 425 427 /* prepare to free private structure */ 426 - todel = (struct gpio_private *)filp->private_data; 428 + todel = filp->private_data; 427 429 428 430 /* unlink from alarmlist - only for non-PWM ports though */ 429 431 if (todel->minor <= GPIO_MINOR_LAST) { 430 - spin_lock_irq(&alarm_lock); 432 + spin_lock_irq(&gpio_lock); 431 433 p = alarmlist; 432 434 433 435 if (p == todel) ··· 461 463 a_low |= (1 << CONFIG_ETRAX_VIRTUAL_GPIO_INTERRUPT_PA_PIN); 462 464 #endif 463 465 464 - spin_unlock_irq(&alarm_lock); 466 + spin_unlock_irq(&gpio_lock); 465 467 } 466 468 kfree(todel); 467 469 ··· 480 482 unsigned long flags; 481 483 unsigned long dir_shadow; 482 484 483 - local_irq_save(flags); 484 - dir_shadow = *dir_oe[priv->minor]; 485 - dir_shadow &= ~(arg & changeable_dir[priv->minor]); 486 - *dir_oe[priv->minor] = dir_shadow; 487 - local_irq_restore(flags); 485 + spin_lock_irqsave(&gpio_lock, flags); 486 + 487 + dir_shadow = readl(dir_oe[priv->minor]) & 488 + ~(arg & changeable_dir[priv->minor]); 489 + writel(dir_shadow, dir_oe[priv->minor]); 490 + 491 + spin_unlock_irqrestore(&gpio_lock, flags); 488 492 489 493 if (priv->minor == GPIO_MINOR_C) 490 494 dir_shadow ^= 0xFFFF; /* Only 16 bits */ ··· 501 501 502 502 } /* setget_input */ 503 503 504 - inline unsigned long setget_output(struct gpio_private *priv, unsigned long arg) 504 + static inline unsigned long setget_output(struct gpio_private *priv, 505 + unsigned long arg) 505 506 { 506 507 unsigned long flags; 507 508 unsigned long dir_shadow; 508 509 509 - local_irq_save(flags); 510 - dir_shadow = *dir_oe[priv->minor]; 511 - dir_shadow |= (arg & changeable_dir[priv->minor]); 512 - *dir_oe[priv->minor] = dir_shadow; 513 - local_irq_restore(flags); 510 + spin_lock_irqsave(&gpio_lock, flags); 511 + 512 + dir_shadow = readl(dir_oe[priv->minor]) | 513 + (arg & changeable_dir[priv->minor]); 514 + writel(dir_shadow, dir_oe[priv->minor]); 515 + 516 + spin_unlock_irqrestore(&gpio_lock, flags); 514 517 return dir_shadow; 515 518 } /* setget_output */ 516 519 517 - static int 518 - gpio_leds_ioctl(unsigned int cmd, unsigned long arg); 519 - 520 - static int 521 - gpio_pwm_ioctl(struct gpio_private *priv, unsigned int cmd, unsigned long arg); 522 - 523 - static int 524 - gpio_ioctl(struct inode *inode, struct file *file, 525 - unsigned int cmd, unsigned long arg) 520 + static int gpio_ioctl(struct inode *inode, struct file *file, 521 + unsigned int cmd, unsigned long arg) 526 522 { 527 523 unsigned long flags; 528 524 unsigned long val; 529 525 unsigned long shadow; 530 - struct gpio_private *priv = (struct gpio_private *)file->private_data; 526 + struct gpio_private *priv = file->private_data; 531 527 532 528 if (_IOC_TYPE(cmd) != ETRAXGPIO_IOCTYPE) 533 - return -EINVAL; 529 + return -ENOTTY; 534 530 535 531 /* Check for special ioctl handlers first */ 536 532 ··· 545 549 switch (_IOC_NR(cmd)) { 546 550 case IO_READBITS: /* Use IO_READ_INBITS and IO_READ_OUTBITS instead */ 547 551 /* Read the port. */ 548 - return *data_in[priv->minor]; 549 - break; 552 + return readl(data_in[priv->minor]); 550 553 case IO_SETBITS: 551 - local_irq_save(flags); 554 + spin_lock_irqsave(&gpio_lock, flags); 552 555 /* Set changeable bits with a 1 in arg. */ 553 - shadow = *data_out[priv->minor]; 554 - shadow |= (arg & changeable_bits[priv->minor]); 555 - *data_out[priv->minor] = shadow; 556 - local_irq_restore(flags); 556 + shadow = readl(data_out[priv->minor]) | 557 + (arg & changeable_bits[priv->minor]); 558 + writel(shadow, data_out[priv->minor]); 559 + spin_unlock_irqrestore(&gpio_lock, flags); 557 560 break; 558 561 case IO_CLRBITS: 559 - local_irq_save(flags); 562 + spin_lock_irqsave(&gpio_lock, flags); 560 563 /* Clear changeable bits with a 1 in arg. */ 561 - shadow = *data_out[priv->minor]; 562 - shadow &= ~(arg & changeable_bits[priv->minor]); 563 - *data_out[priv->minor] = shadow; 564 - local_irq_restore(flags); 564 + shadow = readl(data_out[priv->minor]) & 565 + ~(arg & changeable_bits[priv->minor]); 566 + writel(shadow, data_out[priv->minor]); 567 + spin_unlock_irqrestore(&gpio_lock, flags); 565 568 break; 566 569 case IO_HIGHALARM: 567 570 /* Set alarm when bits with 1 in arg go high. */ ··· 580 585 break; 581 586 case IO_READDIR: /* Use IO_SETGET_INPUT/OUTPUT instead! */ 582 587 /* Read direction 0=input 1=output */ 583 - return *dir_oe[priv->minor]; 588 + return readl(dir_oe[priv->minor]); 589 + 584 590 case IO_SETINPUT: /* Use IO_SETGET_INPUT instead! */ 585 591 /* Set direction 0=unchanged 1=input, 586 592 * return mask with 1=input 587 593 */ 588 594 return setget_input(priv, arg); 589 - break; 595 + 590 596 case IO_SETOUTPUT: /* Use IO_SETGET_OUTPUT instead! */ 591 597 /* Set direction 0=unchanged 1=output, 592 598 * return mask with 1=output ··· 596 600 597 601 case IO_CFG_WRITE_MODE: 598 602 { 599 - unsigned long dir_shadow; 600 - dir_shadow = *dir_oe[priv->minor]; 603 + int res = -EPERM; 604 + unsigned long dir_shadow, clk_mask, data_mask, write_msb; 601 605 602 - priv->clk_mask = arg & 0xFF; 603 - priv->data_mask = (arg >> 8) & 0xFF; 604 - priv->write_msb = (arg >> 16) & 0x01; 606 + clk_mask = arg & 0xFF; 607 + data_mask = (arg >> 8) & 0xFF; 608 + write_msb = (arg >> 16) & 0x01; 609 + 605 610 /* Check if we're allowed to change the bits and 606 611 * the direction is correct 607 612 */ 608 - if (!((priv->clk_mask & changeable_bits[priv->minor]) && 609 - (priv->data_mask & changeable_bits[priv->minor]) && 610 - (priv->clk_mask & dir_shadow) && 611 - (priv->data_mask & dir_shadow))) { 612 - priv->clk_mask = 0; 613 - priv->data_mask = 0; 614 - return -EPERM; 613 + spin_lock_irqsave(&gpio_lock, flags); 614 + dir_shadow = readl(dir_oe[priv->minor]); 615 + if ((clk_mask & changeable_bits[priv->minor]) && 616 + (data_mask & changeable_bits[priv->minor]) && 617 + (clk_mask & dir_shadow) && 618 + (data_mask & dir_shadow)) { 619 + priv->clk_mask = clk_mask; 620 + priv->data_mask = data_mask; 621 + priv->write_msb = write_msb; 622 + res = 0; 615 623 } 616 - break; 624 + spin_unlock_irqrestore(&gpio_lock, flags); 625 + 626 + return res; 617 627 } 618 628 case IO_READ_INBITS: 619 629 /* *arg is result of reading the input pins */ 620 - val = *data_in[priv->minor]; 621 - if (copy_to_user((unsigned long *)arg, &val, sizeof(val))) 630 + val = readl(data_in[priv->minor]); 631 + if (copy_to_user((void __user *)arg, &val, sizeof(val))) 622 632 return -EFAULT; 623 633 return 0; 624 - break; 625 634 case IO_READ_OUTBITS: 626 635 /* *arg is result of reading the output shadow */ 627 636 val = *data_out[priv->minor]; 628 - if (copy_to_user((unsigned long *)arg, &val, sizeof(val))) 637 + if (copy_to_user((void __user *)arg, &val, sizeof(val))) 629 638 return -EFAULT; 630 639 break; 631 640 case IO_SETGET_INPUT: 632 641 /* bits set in *arg is set to input, 633 642 * *arg updated with current input pins. 634 643 */ 635 - if (copy_from_user(&val, (unsigned long *)arg, sizeof(val))) 644 + if (copy_from_user(&val, (void __user *)arg, sizeof(val))) 636 645 return -EFAULT; 637 646 val = setget_input(priv, val); 638 - if (copy_to_user((unsigned long *)arg, &val, sizeof(val))) 647 + if (copy_to_user((void __user *)arg, &val, sizeof(val))) 639 648 return -EFAULT; 640 649 break; 641 650 case IO_SETGET_OUTPUT: 642 651 /* bits set in *arg is set to output, 643 652 * *arg updated with current output pins. 644 653 */ 645 - if (copy_from_user(&val, (unsigned long *)arg, sizeof(val))) 654 + if (copy_from_user(&val, (void __user *)arg, sizeof(val))) 646 655 return -EFAULT; 647 656 val = setget_output(priv, val); 648 - if (copy_to_user((unsigned long *)arg, &val, sizeof(val))) 657 + if (copy_to_user((void __user *)arg, &val, sizeof(val))) 649 658 return -EFAULT; 650 659 break; 651 660 default: ··· 661 660 } 662 661 663 662 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO 664 - static int 665 - virtual_gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) 663 + static int virtual_gpio_ioctl(struct file *file, unsigned int cmd, 664 + unsigned long arg) 666 665 { 667 666 unsigned long flags; 668 667 unsigned short val; 669 668 unsigned short shadow; 670 - struct gpio_private *priv = (struct gpio_private *)file->private_data; 669 + struct gpio_private *priv = file->private_data; 671 670 672 671 switch (_IOC_NR(cmd)) { 673 672 case IO_SETBITS: 674 - local_irq_save(flags); 673 + spin_lock_irqsave(&gpio_lock, flags); 675 674 /* Set changeable bits with a 1 in arg. */ 676 675 i2c_read(VIRT_I2C_ADDR, (void *)&shadow, sizeof(shadow)); 677 - shadow |= ~*dir_oe[priv->minor]; 678 - shadow |= (arg & changeable_bits[priv->minor]); 676 + shadow |= ~readl(dir_oe[priv->minor]) | 677 + (arg & changeable_bits[priv->minor]); 679 678 i2c_write(VIRT_I2C_ADDR, (void *)&shadow, sizeof(shadow)); 680 - local_irq_restore(flags); 679 + spin_lock_irqrestore(&gpio_lock, flags); 681 680 break; 682 681 case IO_CLRBITS: 683 - local_irq_save(flags); 682 + spin_lock_irqsave(&gpio_lock, flags); 684 683 /* Clear changeable bits with a 1 in arg. */ 685 684 i2c_read(VIRT_I2C_ADDR, (void *)&shadow, sizeof(shadow)); 686 - shadow |= ~*dir_oe[priv->minor]; 687 - shadow &= ~(arg & changeable_bits[priv->minor]); 685 + shadow |= ~readl(dir_oe[priv->minor]) & 686 + ~(arg & changeable_bits[priv->minor]); 688 687 i2c_write(VIRT_I2C_ADDR, (void *)&shadow, sizeof(shadow)); 689 - local_irq_restore(flags); 688 + spin_lock_irqrestore(&gpio_lock, flags); 690 689 break; 691 690 case IO_HIGHALARM: 692 691 /* Set alarm when bits with 1 in arg go high. */ ··· 704 703 case IO_CFG_WRITE_MODE: 705 704 { 706 705 unsigned long dir_shadow; 707 - dir_shadow = *dir_oe[priv->minor]; 706 + dir_shadow = readl(dir_oe[priv->minor]); 708 707 709 708 priv->clk_mask = arg & 0xFF; 710 709 priv->data_mask = (arg >> 8) & 0xFF; ··· 724 723 } 725 724 case IO_READ_INBITS: 726 725 /* *arg is result of reading the input pins */ 727 - val = cached_virtual_gpio_read; 728 - val &= ~*dir_oe[priv->minor]; 729 - if (copy_to_user((unsigned long *)arg, &val, sizeof(val))) 726 + val = cached_virtual_gpio_read & ~readl(dir_oe[priv->minor]); 727 + if (copy_to_user((void __user *)arg, &val, sizeof(val))) 730 728 return -EFAULT; 731 729 return 0; 732 - break; 730 + 733 731 case IO_READ_OUTBITS: 734 732 /* *arg is result of reading the output shadow */ 735 733 i2c_read(VIRT_I2C_ADDR, (void *)&val, sizeof(val)); 736 - val &= *dir_oe[priv->minor]; 737 - if (copy_to_user((unsigned long *)arg, &val, sizeof(val))) 734 + val &= readl(dir_oe[priv->minor]); 735 + if (copy_to_user((void __user *)arg, &val, sizeof(val))) 738 736 return -EFAULT; 739 737 break; 740 738 case IO_SETGET_INPUT: ··· 741 741 /* bits set in *arg is set to input, 742 742 * *arg updated with current input pins. 743 743 */ 744 - unsigned short input_mask = ~*dir_oe[priv->minor]; 745 - if (copy_from_user(&val, (unsigned long *)arg, sizeof(val))) 744 + unsigned short input_mask = ~readl(dir_oe[priv->minor]); 745 + if (copy_from_user(&val, (void __user *)arg, sizeof(val))) 746 746 return -EFAULT; 747 747 val = setget_input(priv, val); 748 - if (copy_to_user((unsigned long *)arg, &val, sizeof(val))) 748 + if (copy_to_user((void __user *)arg, &val, sizeof(val))) 749 749 return -EFAULT; 750 750 if ((input_mask & val) != input_mask) { 751 751 /* Input pins changed. All ports desired as input ··· 765 765 /* bits set in *arg is set to output, 766 766 * *arg updated with current output pins. 767 767 */ 768 - if (copy_from_user(&val, (unsigned long *)arg, sizeof(val))) 768 + if (copy_from_user(&val, (void __user *)arg, sizeof(val))) 769 769 return -EFAULT; 770 770 val = setget_output(priv, val); 771 - if (copy_to_user((unsigned long *)arg, &val, sizeof(val))) 771 + if (copy_to_user((void __user *)arg, &val, sizeof(val))) 772 772 return -EFAULT; 773 773 break; 774 774 default: ··· 778 778 } 779 779 #endif /* CONFIG_ETRAX_VIRTUAL_GPIO */ 780 780 781 - static int 782 - gpio_leds_ioctl(unsigned int cmd, unsigned long arg) 781 + static int gpio_leds_ioctl(unsigned int cmd, unsigned long arg) 783 782 { 784 783 unsigned char green; 785 784 unsigned char red; ··· 828 829 struct io_pwm_set_period periods; 829 830 reg_gio_rw_pwm0_var rw_pwm_widths; 830 831 831 - if (copy_from_user(&periods, (struct io_pwm_set_period *) arg, 832 - sizeof(periods))) 832 + if (copy_from_user(&periods, (void __user *)arg, sizeof(periods))) 833 833 return -EFAULT; 834 834 if (periods.lo > 8191 || periods.hi > 8191) 835 835 return -EINVAL; ··· 854 856 return 0; 855 857 } 856 858 857 - static int 858 - gpio_pwm_ioctl(struct gpio_private *priv, unsigned int cmd, unsigned long arg) 859 + static int gpio_pwm_ioctl(struct gpio_private *priv, unsigned int cmd, 860 + unsigned long arg) 859 861 { 860 862 int pwm_port = priv->minor - GPIO_MINOR_PWM0; 861 863 ··· 872 874 return 0; 873 875 } 874 876 875 - struct file_operations gpio_fops = { 877 + static const struct file_operations gpio_fops = { 876 878 .owner = THIS_MODULE, 877 879 .poll = gpio_poll, 878 880 .ioctl = gpio_ioctl, ··· 882 884 }; 883 885 884 886 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO 885 - static void 886 - virtual_gpio_init(void) 887 + static void __init virtual_gpio_init(void) 887 888 { 888 889 reg_gio_rw_intr_cfg intr_cfg; 889 890 reg_gio_rw_intr_mask intr_mask; ··· 940 943 941 944 /* main driver initialization routine, called from mem.c */ 942 945 943 - static __init int 944 - gpio_init(void) 946 + static int __init gpio_init(void) 945 947 { 946 948 int res; 949 + 950 + printk(KERN_INFO "ETRAX FS GPIO driver v2.7, (c) 2003-2008 " 951 + "Axis Communications AB\n"); 947 952 948 953 /* do the formalities */ 949 954 ··· 962 963 CRIS_LED_DISK_READ(0); 963 964 CRIS_LED_DISK_WRITE(0); 964 965 965 - printk(KERN_INFO "ETRAX FS GPIO driver v2.6, (c) 2003-2007 " 966 - "Axis Communications AB\n"); 967 - if (request_irq(GIO_INTR_VECT, gpio_interrupt, 968 - IRQF_SHARED | IRQF_DISABLED, "gpio", &alarmlist)) 966 + int res2 = request_irq(GIO_INTR_VECT, gpio_interrupt, 967 + IRQF_SHARED | IRQF_DISABLED, "gpio", &alarmlist); 968 + if (res2) { 969 969 printk(KERN_ERR "err: irq for gpio\n"); 970 + return res2; 971 + } 970 972 971 973 /* No IRQs by default. */ 972 974 REG_WR_INT(gio, regi_gio, rw_intr_pins, 0);