summaryrefslogtreecommitdiff
path: root/arch/arm/mach-imx/include/mach/gpio.h
blob: 502d5aa2c093dad2b00acd22e5564bbfad7a21a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#ifndef _IMX_GPIO_H

#include <linux/kernel.h>
#include <mach/imx-regs.h>

#define IMX_GPIO_ALLOC_MODE_NORMAL	0
#define IMX_GPIO_ALLOC_MODE_NO_ALLOC	1
#define IMX_GPIO_ALLOC_MODE_TRY_ALLOC	2
#define IMX_GPIO_ALLOC_MODE_ALLOC_ONLY	4
#define IMX_GPIO_ALLOC_MODE_RELEASE	8

extern int imx_gpio_request(unsigned gpio, const char *label);

extern void imx_gpio_free(unsigned gpio);

extern int imx_gpio_setup_multiple_pins(const int *pin_list, unsigned count,
					int alloc_mode, const char *label);

extern int imx_gpio_direction_input(unsigned gpio);

extern int imx_gpio_direction_output(unsigned gpio, int value);

extern void __imx_gpio_set_value(unsigned gpio, int value);

static inline int imx_gpio_get_value(unsigned gpio)
{
	return SSR(gpio >> GPIO_PORT_SHIFT) & (1 << (gpio & GPIO_PIN_MASK));
}

static inline void imx_gpio_set_value_inline(unsigned gpio, int value)
{
	unsigned long flags;

	raw_local_irq_save(flags);
	if(value)
		DR(gpio >> GPIO_PORT_SHIFT) |= (1 << (gpio & GPIO_PIN_MASK));
	else
		DR(gpio >> GPIO_PORT_SHIFT) &= ~(1 << (gpio & GPIO_PIN_MASK));
	raw_local_irq_restore(flags);
}

static inline void imx_gpio_set_value(unsigned gpio, int value)
{
	if(__builtin_constant_p(gpio))
		imx_gpio_set_value_inline(gpio, value);
	else
		__imx_gpio_set_value(gpio, value);
}

extern int imx_gpio_to_irq(unsigned gpio);

extern int imx_irq_to_gpio(unsigned irq);

/*-------------------------------------------------------------------------*/

/* Wrappers for "new style" GPIO calls. These calls i.MX specific versions
 * to allow future extension of GPIO logic.
 */

static inline int gpio_request(unsigned gpio, const char *label)
{
	return imx_gpio_request(gpio, label);
}

static inline void gpio_free(unsigned gpio)
{
	might_sleep();

	imx_gpio_free(gpio);
}

static inline  int gpio_direction_input(unsigned gpio)
{
	return imx_gpio_direction_input(gpio);
}

static inline int gpio_direction_output(unsigned gpio, int value)
{
	return imx_gpio_direction_output(gpio, value);
}

static inline int gpio_get_value(unsigned gpio)
{
	return imx_gpio_get_value(gpio);
}

static inline void gpio_set_value(unsigned gpio, int value)
{
	imx_gpio_set_value(gpio, value);
}

#include <asm-generic/gpio.h>		/* cansleep wrappers */

static inline int gpio_to_irq(unsigned gpio)
{
	return imx_gpio_to_irq(gpio);
}

static inline int irq_to_gpio(unsigned irq)
{
	return imx_irq_to_gpio(irq);
}


#endif