allow coexistance of N build and AC build.
[tomato.git] / release / src-rt-6.x / linux / linux-2.6 / arch / mips / brcm-boards / bcm947xx / gen_gpio.c
blob613058ed60c2c33c58220c77436ba57d01855b0c
1 /*
2 * Generic GPIO
4 * Copyright (C) 2009, Broadcom Corporation
5 * All Rights Reserved.
6 *
7 * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
8 * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
9 * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
10 * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
12 * $Id: gen_gpio.c,v 1.1 2009/10/30 20:51:47 Exp $
16 #include <linux/module.h>
17 #include <linux/init.h>
19 #include <typedefs.h>
20 #include <bcmutils.h>
21 #include <siutils.h>
22 #include <bcmdevs.h>
25 #define BCM947XX_GENGPIO_DEBUG 0
26 #if BCM947XX_GENGPIO_DEBUG
27 //#define DBG(x...) printk(KERN_DEBUG x)
28 #define DBG(x...) printk(KERN_ERR x)
29 #else
30 #define DBG(x...)
31 #endif
35 static si_t *gpio_sih;
36 int mask;
39 static int
40 gen_gpio_init(void)
42 if (!(gpio_sih = si_kattach(SI_OSH))) {
43 DBG("%s: si_kattach failed\n", __FUNCTION__);
44 return -ENODEV;
47 si_gpiosetcore(gpio_sih);
49 return 0;
52 static void
53 gen_gpio_exit(void)
55 si_detach(gpio_sih);
58 /* GENERIC_GPIO calls */
59 int gpio_direction_input(unsigned gpio)
61 int ret;
63 ret = si_gpioouten(gpio_sih, (1<<gpio), 0, GPIO_APP_PRIORITY);
64 DBG("%s: gpio %d - input 0x%x\n", __FUNCTION__, gpio, ret);
65 return 0;
67 EXPORT_SYMBOL(gpio_direction_input);
70 int gpio_direction_output(unsigned gpio, int value)
72 int out, outen;
74 outen = si_gpioouten(gpio_sih, (1<<gpio), (1<<gpio), GPIO_APP_PRIORITY);
75 out = si_gpioout(gpio_sih, (1<<gpio), (value ? (1<<gpio) : 0), GPIO_APP_PRIORITY);
76 DBG("%s: gpio %d, value %d - out 0x%x outen 0x%x\n", __FUNCTION__, gpio, value, out, outen);
77 return 0;
79 EXPORT_SYMBOL(gpio_direction_output);
81 int gpio_get_value(unsigned int gpio)
83 uint32 get;
84 get = si_gpioin(gpio_sih);
86 get &= (1<<gpio);
88 return (get ? 1 : 0);
90 EXPORT_SYMBOL(gpio_get_value);
92 void gpio_set_value(unsigned int gpio, int value)
94 si_gpioout(gpio_sih, (1<<gpio), (value ? (1<<gpio) : 0), GPIO_APP_PRIORITY);
95 return;
97 EXPORT_SYMBOL(gpio_set_value);
99 int gpio_request(unsigned int gpio, const char *label)
101 int ret;
103 mask |= (1<<gpio);
105 ret = si_gpioreserve(gpio_sih, (1<<gpio), GPIO_APP_PRIORITY);
106 DBG("%s: gpio %d label %s mask 0x%x reserve 0x%x\n", __FUNCTION__, gpio,
107 label, mask, ret);
109 ret = si_gpiocontrol(gpio_sih, (1<<gpio), 0, GPIO_APP_PRIORITY);
110 DBG("%s: si_gpiocontrol 0x%x\n", __FUNCTION__, ret);
112 /* clear pulldown */
113 ret = si_gpiopull(gpio_sih, 1/*pulldown*/, (1<<gpio), 0);
114 DBG("%s: si_gpiopull (down) 0x%x\n", __FUNCTION__, ret);
115 /* Set pullup */
116 ret = si_gpiopull(gpio_sih, 0/*pullup*/, (1<<gpio), (1<<gpio));
117 DBG("%s: si_gpiopull (up) 0x%x\n", __FUNCTION__, ret);
119 return 0;
121 EXPORT_SYMBOL(gpio_request);
123 void gpio_free(unsigned int gpio)
125 mask &= ~(1<<gpio);
127 /* clear pullup */
128 si_gpiopull(gpio_sih, 0/*pullup*/, (1<<gpio), GPIO_APP_PRIORITY);
129 si_gpiorelease(gpio_sih, (1<<gpio), GPIO_APP_PRIORITY);
131 DBG("%s: gpio %d mask 0x%x\n", __FUNCTION__, gpio, mask);
132 return;
134 EXPORT_SYMBOL(gpio_free);
137 module_init(gen_gpio_init);
138 module_exit(gen_gpio_exit);