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 | ||
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 |