Commit | Line | Data |
---|---|---|
34cc662f AJ |
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 | ||
b06f3e19 AJ |
15 | #if (BCM47XX_CHIPCO_GPIO_LINES > BCM47XX_EXTIF_GPIO_LINES) |
16 | static DECLARE_BITMAP(gpio_in_use, BCM47XX_CHIPCO_GPIO_LINES); | |
17 | #else | |
18 | static DECLARE_BITMAP(gpio_in_use, BCM47XX_EXTIF_GPIO_LINES); | |
19 | #endif | |
20 | ||
21 | int gpio_request(unsigned gpio, const char *tag) | |
34cc662f | 22 | { |
b06f3e19 AJ |
23 | if (ssb_chipco_available(&ssb_bcm47xx.chipco) && |
24 | ((unsigned)gpio >= BCM47XX_CHIPCO_GPIO_LINES)) | |
34cc662f | 25 | return -EINVAL; |
34cc662f | 26 | |
b06f3e19 AJ |
27 | if (ssb_extif_available(&ssb_bcm47xx.extif) && |
28 | ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES)) | |
29 | return -EINVAL; | |
34cc662f | 30 | |
b06f3e19 AJ |
31 | if (test_and_set_bit(gpio, gpio_in_use)) |
32 | return -EBUSY; | |
34cc662f | 33 | |
34cc662f AJ |
34 | return 0; |
35 | } | |
b06f3e19 | 36 | EXPORT_SYMBOL(gpio_request); |
34cc662f | 37 | |
b06f3e19 | 38 | void gpio_free(unsigned gpio) |
34cc662f | 39 | { |
b06f3e19 AJ |
40 | if (ssb_chipco_available(&ssb_bcm47xx.chipco) && |
41 | ((unsigned)gpio >= BCM47XX_CHIPCO_GPIO_LINES)) | |
42 | return; | |
43 | ||
44 | if (ssb_extif_available(&ssb_bcm47xx.extif) && | |
45 | ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES)) | |
46 | return; | |
47 | ||
48 | clear_bit(gpio, gpio_in_use); | |
49 | } | |
50 | EXPORT_SYMBOL(gpio_free); | |
34cc662f | 51 | |
b06f3e19 AJ |
52 | int gpio_to_irq(unsigned gpio) |
53 | { | |
54 | if (ssb_chipco_available(&ssb_bcm47xx.chipco)) | |
55 | return ssb_mips_irq(ssb_bcm47xx.chipco.dev) + 2; | |
56 | else if (ssb_extif_available(&ssb_bcm47xx.extif)) | |
57 | return ssb_mips_irq(ssb_bcm47xx.extif.dev) + 2; | |
34cc662f AJ |
58 | else |
59 | return -EINVAL; | |
34cc662f | 60 | } |
b06f3e19 | 61 | EXPORT_SYMBOL_GPL(gpio_to_irq); |
34cc662f | 62 |