diff options
author | Jesper Nilsson <jesper.nilsson@axis.com> | 2008-02-06 08:52:40 -0500 |
---|---|---|
committer | Jesper Nilsson <jesper.nilsson@axis.com> | 2008-02-08 05:16:45 -0500 |
commit | ad433f2368c37a64d119a997a0530cc28b9a5566 (patch) | |
tree | 6bd274f8e7fdc867e393bd145b3cee4cf923a674 /arch/cris/arch-v10/drivers/gpio.c | |
parent | 5efa1d1c940f07e79469e20db2b7a73c44180e82 (diff) |
CRIS v10: Cleanup of drivers/gpio.c
- Change parameters of gpio_write (const char * buf -> const char __user *buf)
- Don't initialize static variables to zero.
- Remove useless casts from void.
- Change name of interrupt routine (gpio_pa_interrupt -> gpio_interrupt)
- Use kzmalloc instead of allocating memory and zeroing it manually.
- Correct casts for copy_to_user and copy_from_user to (void __user *)
- Make file_operations gpio_fops static.
- Make ioif_watcher static, not used outside this file.
Diffstat (limited to 'arch/cris/arch-v10/drivers/gpio.c')
-rw-r--r-- | arch/cris/arch-v10/drivers/gpio.c | 61 |
1 files changed, 29 insertions, 32 deletions
diff --git a/arch/cris/arch-v10/drivers/gpio.c b/arch/cris/arch-v10/drivers/gpio.c index 26ae11be208d..68a998bd1069 100644 --- a/arch/cris/arch-v10/drivers/gpio.c +++ b/arch/cris/arch-v10/drivers/gpio.c | |||
@@ -46,9 +46,9 @@ static wait_queue_head_t *gpio_wq; | |||
46 | #endif | 46 | #endif |
47 | 47 | ||
48 | static int gpio_ioctl(struct inode *inode, struct file *file, | 48 | static int gpio_ioctl(struct inode *inode, struct file *file, |
49 | unsigned int cmd, unsigned long arg); | 49 | unsigned int cmd, unsigned long arg); |
50 | static ssize_t gpio_write(struct file * file, const char * buf, size_t count, | 50 | static ssize_t gpio_write(struct file *file, const char __user *buf, |
51 | loff_t *off); | 51 | size_t count, loff_t *off); |
52 | static int gpio_open(struct inode *inode, struct file *filp); | 52 | static int gpio_open(struct inode *inode, struct file *filp); |
53 | static int gpio_release(struct inode *inode, struct file *filp); | 53 | static int gpio_release(struct inode *inode, struct file *filp); |
54 | static unsigned int gpio_poll(struct file *filp, struct poll_table_struct *wait); | 54 | static unsigned int gpio_poll(struct file *filp, struct poll_table_struct *wait); |
@@ -74,10 +74,10 @@ struct gpio_private { | |||
74 | 74 | ||
75 | /* linked list of alarms to check for */ | 75 | /* linked list of alarms to check for */ |
76 | 76 | ||
77 | static struct gpio_private *alarmlist = 0; | 77 | static struct gpio_private *alarmlist; |
78 | 78 | ||
79 | static int gpio_some_alarms = 0; /* Set if someone uses alarm */ | 79 | static int gpio_some_alarms; /* Set if someone uses alarm */ |
80 | static unsigned long gpio_pa_irq_enabled_mask = 0; | 80 | static unsigned long gpio_pa_irq_enabled_mask; |
81 | 81 | ||
82 | static DEFINE_SPINLOCK(gpio_lock); /* Protect directions etc */ | 82 | static DEFINE_SPINLOCK(gpio_lock); /* Protect directions etc */ |
83 | 83 | ||
@@ -145,7 +145,7 @@ static unsigned long dir_g_shadow; /* 1=output */ | |||
145 | static unsigned int gpio_poll(struct file *file, poll_table *wait) | 145 | static unsigned int gpio_poll(struct file *file, poll_table *wait) |
146 | { | 146 | { |
147 | unsigned int mask = 0; | 147 | unsigned int mask = 0; |
148 | struct gpio_private *priv = (struct gpio_private *)file->private_data; | 148 | struct gpio_private *priv = file->private_data; |
149 | unsigned long data; | 149 | unsigned long data; |
150 | unsigned long flags; | 150 | unsigned long flags; |
151 | 151 | ||
@@ -222,7 +222,7 @@ gpio_poll_timer_interrupt(int irq, void *dev_id) | |||
222 | } | 222 | } |
223 | 223 | ||
224 | static irqreturn_t | 224 | static irqreturn_t |
225 | gpio_pa_interrupt(int irq, void *dev_id) | 225 | gpio_interrupt(int irq, void *dev_id) |
226 | { | 226 | { |
227 | unsigned long tmp; | 227 | unsigned long tmp; |
228 | unsigned long flags; | 228 | unsigned long flags; |
@@ -272,10 +272,10 @@ static void gpio_write_byte(struct gpio_private *priv, unsigned char data) | |||
272 | gpio_write_bit(priv, data, i); | 272 | gpio_write_bit(priv, data, i); |
273 | } | 273 | } |
274 | 274 | ||
275 | static ssize_t gpio_write(struct file * file, const char * buf, size_t count, | 275 | static ssize_t gpio_write(struct file *file, const char __user *buf, |
276 | loff_t *off) | 276 | size_t count, loff_t *off) |
277 | { | 277 | { |
278 | struct gpio_private *priv = (struct gpio_private *)file->private_data; | 278 | struct gpio_private *priv = file->private_data; |
279 | unsigned long flags; | 279 | unsigned long flags; |
280 | ssize_t retval = count; | 280 | ssize_t retval = count; |
281 | 281 | ||
@@ -318,13 +318,11 @@ gpio_open(struct inode *inode, struct file *filp) | |||
318 | if (p > GPIO_MINOR_LAST) | 318 | if (p > GPIO_MINOR_LAST) |
319 | return -EINVAL; | 319 | return -EINVAL; |
320 | 320 | ||
321 | priv = kmalloc(sizeof(struct gpio_private), GFP_KERNEL); | 321 | priv = kzalloc(sizeof(struct gpio_private), GFP_KERNEL); |
322 | 322 | ||
323 | if (!priv) | 323 | if (!priv) |
324 | return -ENOMEM; | 324 | return -ENOMEM; |
325 | 325 | ||
326 | memset(priv, 0, sizeof(*priv)); | ||
327 | |||
328 | priv->minor = p; | 326 | priv->minor = p; |
329 | 327 | ||
330 | /* initialize the io/alarm struct */ | 328 | /* initialize the io/alarm struct */ |
@@ -351,7 +349,7 @@ gpio_open(struct inode *inode, struct file *filp) | |||
351 | priv->data_mask = 0; | 349 | priv->data_mask = 0; |
352 | init_waitqueue_head(&priv->alarm_wq); | 350 | init_waitqueue_head(&priv->alarm_wq); |
353 | 351 | ||
354 | filp->private_data = (void *)priv; | 352 | filp->private_data = priv; |
355 | 353 | ||
356 | /* link it into our alarmlist */ | 354 | /* link it into our alarmlist */ |
357 | spin_lock_irqsave(&gpio_lock, flags); | 355 | spin_lock_irqsave(&gpio_lock, flags); |
@@ -372,7 +370,7 @@ gpio_release(struct inode *inode, struct file *filp) | |||
372 | spin_lock_irqsave(&gpio_lock, flags); | 370 | spin_lock_irqsave(&gpio_lock, flags); |
373 | 371 | ||
374 | p = alarmlist; | 372 | p = alarmlist; |
375 | todel = (struct gpio_private *)filp->private_data; | 373 | todel = filp->private_data; |
376 | 374 | ||
377 | /* unlink from alarmlist and free the private structure */ | 375 | /* unlink from alarmlist and free the private structure */ |
378 | 376 | ||
@@ -511,7 +509,7 @@ gpio_ioctl(struct inode *inode, struct file *file, | |||
511 | unsigned long val; | 509 | unsigned long val; |
512 | int ret = 0; | 510 | int ret = 0; |
513 | 511 | ||
514 | struct gpio_private *priv = (struct gpio_private *)file->private_data; | 512 | struct gpio_private *priv = file->private_data; |
515 | if (_IOC_TYPE(cmd) != ETRAXGPIO_IOCTYPE) | 513 | if (_IOC_TYPE(cmd) != ETRAXGPIO_IOCTYPE) |
516 | return -EINVAL; | 514 | return -EINVAL; |
517 | 515 | ||
@@ -633,7 +631,7 @@ gpio_ioctl(struct inode *inode, struct file *file, | |||
633 | } else if (priv->minor == GPIO_MINOR_G) { | 631 | } else if (priv->minor == GPIO_MINOR_G) { |
634 | val = *R_PORT_G_DATA; | 632 | val = *R_PORT_G_DATA; |
635 | } | 633 | } |
636 | if (copy_to_user((unsigned long*)arg, &val, sizeof(val))) | 634 | if (copy_to_user((void __user *)arg, &val, sizeof(val))) |
637 | ret = -EFAULT; | 635 | ret = -EFAULT; |
638 | break; | 636 | break; |
639 | case IO_READ_OUTBITS: | 637 | case IO_READ_OUTBITS: |
@@ -643,32 +641,32 @@ gpio_ioctl(struct inode *inode, struct file *file, | |||
643 | } else if (priv->minor == GPIO_MINOR_G) { | 641 | } else if (priv->minor == GPIO_MINOR_G) { |
644 | val = port_g_data_shadow; | 642 | val = port_g_data_shadow; |
645 | } | 643 | } |
646 | if (copy_to_user((unsigned long*)arg, &val, sizeof(val))) | 644 | if (copy_to_user((void __user *)arg, &val, sizeof(val))) |
647 | ret = -EFAULT; | 645 | ret = -EFAULT; |
648 | break; | 646 | break; |
649 | case IO_SETGET_INPUT: | 647 | case IO_SETGET_INPUT: |
650 | /* bits set in *arg is set to input, | 648 | /* bits set in *arg is set to input, |
651 | * *arg updated with current input pins. | 649 | * *arg updated with current input pins. |
652 | */ | 650 | */ |
653 | if (copy_from_user(&val, (unsigned long*)arg, sizeof(val))) | 651 | if (copy_from_user(&val, (void __user *)arg, sizeof(val))) |
654 | { | 652 | { |
655 | ret = -EFAULT; | 653 | ret = -EFAULT; |
656 | break; | 654 | break; |
657 | } | 655 | } |
658 | val = setget_input(priv, val); | 656 | val = setget_input(priv, val); |
659 | if (copy_to_user((unsigned long*)arg, &val, sizeof(val))) | 657 | if (copy_to_user((void __user *)arg, &val, sizeof(val))) |
660 | ret = -EFAULT; | 658 | ret = -EFAULT; |
661 | break; | 659 | break; |
662 | case IO_SETGET_OUTPUT: | 660 | case IO_SETGET_OUTPUT: |
663 | /* bits set in *arg is set to output, | 661 | /* bits set in *arg is set to output, |
664 | * *arg updated with current output pins. | 662 | * *arg updated with current output pins. |
665 | */ | 663 | */ |
666 | if (copy_from_user(&val, (unsigned long *)arg, sizeof(val))) { | 664 | if (copy_from_user(&val, (void __user *)arg, sizeof(val))) { |
667 | ret = -EFAULT; | 665 | ret = -EFAULT; |
668 | break; | 666 | break; |
669 | } | 667 | } |
670 | val = setget_output(priv, val); | 668 | val = setget_output(priv, val); |
671 | if (copy_to_user((unsigned long*)arg, &val, sizeof(val))) | 669 | if (copy_to_user((void __user *)arg, &val, sizeof(val))) |
672 | ret = -EFAULT; | 670 | ret = -EFAULT; |
673 | break; | 671 | break; |
674 | default: | 672 | default: |
@@ -711,7 +709,7 @@ gpio_leds_ioctl(unsigned int cmd, unsigned long arg) | |||
711 | return 0; | 709 | return 0; |
712 | } | 710 | } |
713 | 711 | ||
714 | const struct file_operations gpio_fops = { | 712 | static const struct file_operations gpio_fops = { |
715 | .owner = THIS_MODULE, | 713 | .owner = THIS_MODULE, |
716 | .poll = gpio_poll, | 714 | .poll = gpio_poll, |
717 | .ioctl = gpio_ioctl, | 715 | .ioctl = gpio_ioctl, |
@@ -720,10 +718,10 @@ const struct file_operations gpio_fops = { | |||
720 | .release = gpio_release, | 718 | .release = gpio_release, |
721 | }; | 719 | }; |
722 | 720 | ||
723 | void ioif_watcher(const unsigned int gpio_in_available, | 721 | static void ioif_watcher(const unsigned int gpio_in_available, |
724 | const unsigned int gpio_out_available, | 722 | const unsigned int gpio_out_available, |
725 | const unsigned char pa_available, | 723 | const unsigned char pa_available, |
726 | const unsigned char pb_available) | 724 | const unsigned char pb_available) |
727 | { | 725 | { |
728 | unsigned long int flags; | 726 | unsigned long int flags; |
729 | 727 | ||
@@ -770,8 +768,7 @@ void ioif_watcher(const unsigned int gpio_in_available, | |||
770 | 768 | ||
771 | /* main driver initialization routine, called from mem.c */ | 769 | /* main driver initialization routine, called from mem.c */ |
772 | 770 | ||
773 | static __init int | 771 | static int __init gpio_init(void) |
774 | gpio_init(void) | ||
775 | { | 772 | { |
776 | int res; | 773 | int res; |
777 | #if defined (CONFIG_ETRAX_CSP0_LEDS) | 774 | #if defined (CONFIG_ETRAX_CSP0_LEDS) |
@@ -817,7 +814,7 @@ gpio_init(void) | |||
817 | printk(KERN_CRIT "err: timer0 irq for gpio\n"); | 814 | printk(KERN_CRIT "err: timer0 irq for gpio\n"); |
818 | return res; | 815 | return res; |
819 | } | 816 | } |
820 | res = request_irq(PA_IRQ_NBR, gpio_pa_interrupt, | 817 | res = request_irq(PA_IRQ_NBR, gpio_interrupt, |
821 | IRQF_SHARED | IRQF_DISABLED, "gpio PA", gpio_name); | 818 | IRQF_SHARED | IRQF_DISABLED, "gpio PA", gpio_name); |
822 | if (res) | 819 | if (res) |
823 | printk(KERN_CRIT "err: PA irq for gpio\n"); | 820 | printk(KERN_CRIT "err: PA irq for gpio\n"); |
@@ -826,5 +823,5 @@ gpio_init(void) | |||
826 | } | 823 | } |
827 | 824 | ||
828 | /* this makes sure that gpio_init is called during kernel boot */ | 825 | /* this makes sure that gpio_init is called during kernel boot */ |
829 | |||
830 | module_init(gpio_init); | 826 | module_init(gpio_init); |
827 | |||