Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
[linux-2.6] / arch / mips / bcm47xx / gpio.c
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * Copyright (C) 2007 Aurelien Jarno <aurelien@aurel32.net>
7  */
8
9 #include <linux/ssb/ssb.h>
10 #include <linux/ssb/ssb_driver_chipcommon.h>
11 #include <linux/ssb/ssb_driver_extif.h>
12 #include <asm/mach-bcm47xx/bcm47xx.h>
13 #include <asm/mach-bcm47xx/gpio.h>
14
15 int bcm47xx_gpio_to_irq(unsigned gpio)
16 {
17         if (ssb_bcm47xx.chipco.dev)
18                 return ssb_mips_irq(ssb_bcm47xx.chipco.dev) + 2;
19         else if (ssb_bcm47xx.extif.dev)
20                 return ssb_mips_irq(ssb_bcm47xx.extif.dev) + 2;
21         else
22                 return -EINVAL;
23 }
24 EXPORT_SYMBOL_GPL(bcm47xx_gpio_to_irq);
25
26 int bcm47xx_gpio_get_value(unsigned gpio)
27 {
28         if (ssb_bcm47xx.chipco.dev)
29                 return ssb_chipco_gpio_in(&ssb_bcm47xx.chipco, 1 << gpio);
30         else if (ssb_bcm47xx.extif.dev)
31                 return ssb_extif_gpio_in(&ssb_bcm47xx.extif, 1 << gpio);
32         else
33                 return 0;
34 }
35 EXPORT_SYMBOL_GPL(bcm47xx_gpio_get_value);
36
37 void bcm47xx_gpio_set_value(unsigned gpio, int value)
38 {
39         if (ssb_bcm47xx.chipco.dev)
40                 ssb_chipco_gpio_out(&ssb_bcm47xx.chipco,
41                                     1 << gpio,
42                                     value ? 1 << gpio : 0);
43         else if (ssb_bcm47xx.extif.dev)
44                 ssb_extif_gpio_out(&ssb_bcm47xx.extif,
45                                    1 << gpio,
46                                    value ? 1 << gpio : 0);
47 }
48 EXPORT_SYMBOL_GPL(bcm47xx_gpio_set_value);
49
50 int bcm47xx_gpio_direction_input(unsigned gpio)
51 {
52         if (ssb_bcm47xx.chipco.dev && (gpio < BCM47XX_CHIPCO_GPIO_LINES))
53                 ssb_chipco_gpio_outen(&ssb_bcm47xx.chipco,
54                                       1 << gpio, 0);
55         else if (ssb_bcm47xx.extif.dev && (gpio < BCM47XX_EXTIF_GPIO_LINES))
56                 ssb_extif_gpio_outen(&ssb_bcm47xx.extif,
57                                      1 << gpio, 0);
58         else
59                 return -EINVAL;
60         return 0;
61 }
62 EXPORT_SYMBOL_GPL(bcm47xx_gpio_direction_input);
63
64 int bcm47xx_gpio_direction_output(unsigned gpio, int value)
65 {
66         bcm47xx_gpio_set_value(gpio, value);
67
68         if (ssb_bcm47xx.chipco.dev && (gpio < BCM47XX_CHIPCO_GPIO_LINES))
69                 ssb_chipco_gpio_outen(&ssb_bcm47xx.chipco,
70                                       1 << gpio, 1 << gpio);
71         else if (ssb_bcm47xx.extif.dev && (gpio < BCM47XX_EXTIF_GPIO_LINES))
72                 ssb_extif_gpio_outen(&ssb_bcm47xx.extif,
73                                      1 << gpio, 1 << gpio);
74         else
75                 return -EINVAL;
76         return 0;
77 }
78 EXPORT_SYMBOL_GPL(bcm47xx_gpio_direction_output);
79