Commit | Line | Data |
---|---|---|
98025c8c | 1 | S3C24XX GPIO Control |
1da177e4 LT |
2 | ==================== |
3 | ||
4 | Introduction | |
5 | ------------ | |
6 | ||
7 | The s3c2410 kernel provides an interface to configure and | |
8 | manipulate the state of the GPIO pins, and find out other | |
9 | information about them. | |
10 | ||
11 | There are a number of conditions attached to the configuration | |
12 | of the s3c2410 GPIO system, please read the Samsung provided | |
13 | data-sheet/users manual to find out the complete list. | |
14 | ||
98025c8c | 15 | See Documentation/arm/Samsung/GPIO.txt for the core implementation. |
d192baea | 16 | |
1da177e4 | 17 | |
f47c32f3 BD |
18 | GPIOLIB |
19 | ------- | |
20 | ||
21 | With the event of the GPIOLIB in drivers/gpio, support for some | |
22 | of the GPIO functions such as reading and writing a pin will | |
23 | be removed in favour of this common access method. | |
24 | ||
25 | Once all the extant drivers have been converted, the functions | |
26 | listed below will be removed (they may be marked as __deprecated | |
27 | in the near future). | |
28 | ||
70f5c9a4 BD |
29 | The following functions now either have a s3c_ specific variant |
30 | or are merged into gpiolib. See the definitions in | |
31 | arch/arm/plat-samsung/include/plat/gpio-cfg.h: | |
32 | ||
33 | s3c2410_gpio_setpin() gpio_set_value() or gpio_direction_output() | |
34 | s3c2410_gpio_getpin() gpio_get_value() or gpio_direction_input() | |
35 | s3c2410_gpio_getirq() gpio_to_irq() | |
36 | s3c2410_gpio_cfgpin() s3c_gpio_cfgpin() | |
37 | s3c2410_gpio_getcfg() s3c_gpio_getcfg() | |
38 | s3c2410_gpio_pullup() s3c_gpio_setpull() | |
f47c32f3 BD |
39 | |
40 | ||
0639b93d BD |
41 | GPIOLIB conversion |
42 | ------------------ | |
43 | ||
98025c8c SN |
44 | If you need to convert your board or driver to use gpiolib from the phased |
45 | out s3c2410 API, then here are some notes on the process. | |
0639b93d BD |
46 | |
47 | 1) If your board is exclusively using an GPIO, say to control peripheral | |
48 | power, then it will require to claim the gpio with gpio_request() before | |
49 | it can use it. | |
50 | ||
51 | It is recommended to check the return value, with at least WARN_ON() | |
52 | during initialisation. | |
53 | ||
54 | 2) The s3c2410_gpio_cfgpin() can be directly replaced with s3c_gpio_cfgpin() | |
55 | as they have the same arguments, and can either take the pin specific | |
56 | values, or the more generic special-function-number arguments. | |
57 | ||
98025c8c | 58 | 3) s3c2410_gpio_pullup() changes have the problem that whilst the |
0639b93d BD |
59 | s3c2410_gpio_pullup(x, 1) can be easily translated to the |
60 | s3c_gpio_setpull(x, S3C_GPIO_PULL_NONE), the s3c2410_gpio_pullup(x, 0) | |
61 | are not so easy. | |
62 | ||
63 | The s3c2410_gpio_pullup(x, 0) case enables the pull-up (or in the case | |
64 | of some of the devices, a pull-down) and as such the new API distinguishes | |
65 | between the UP and DOWN case. There is currently no 'just turn on' setting | |
66 | which may be required if this becomes a problem. | |
67 | ||
68 | 4) s3c2410_gpio_setpin() can be replaced by gpio_set_value(), the old call | |
69 | does not implicitly configure the relevant gpio to output. The gpio | |
70 | direction should be changed before using gpio_set_value(). | |
71 | ||
72 | 5) s3c2410_gpio_getpin() is replaceable by gpio_get_value() if the pin | |
73 | has been set to input. It is currently unknown what the behaviour is | |
74 | when using gpio_get_value() on an output pin (s3c2410_gpio_getpin | |
75 | would return the value the pin is supposed to be outputting). | |
76 | ||
98025c8c | 77 | 6) s3c2410_gpio_getirq() should be directly replaceable with the |
0639b93d BD |
78 | gpio_to_irq() call. |
79 | ||
80 | The s3c2410_gpio and gpio_ calls have always operated on the same gpio | |
81 | numberspace, so there is no problem with converting the gpio numbering | |
82 | between the calls. | |
83 | ||
84 | ||
1da177e4 LT |
85 | Headers |
86 | ------- | |
87 | ||
7a255005 | 88 | See arch/arm/mach-s3c24xx/include/mach/regs-gpio.h for the list |
1da177e4 | 89 | of GPIO pins, and the configuration values for them. This |
a09e64fb | 90 | is included by using #include <mach/regs-gpio.h> |
1da177e4 | 91 | |
1da177e4 LT |
92 | |
93 | PIN Numbers | |
94 | ----------- | |
95 | ||
96 | Each pin has an unique number associated with it in regs-gpio.h, | |
98025c8c | 97 | e.g. S3C2410_GPA(0) or S3C2410_GPF(1). These defines are used to tell |
1da177e4 LT |
98 | the GPIO functions which pin is to be used. |
99 | ||
70f5c9a4 BD |
100 | With the conversion to gpiolib, there is no longer a direct conversion |
101 | from gpio pin number to register base address as in earlier kernels. This | |
102 | is due to the number space required for newer SoCs where the later | |
103 | GPIOs are not contiguous. | |
104 | ||
1da177e4 LT |
105 | |
106 | Configuring a pin | |
107 | ----------------- | |
108 | ||
109 | The following function allows the configuration of a given pin to | |
110 | be changed. | |
111 | ||
98025c8c | 112 | void s3c_gpio_cfgpin(unsigned int pin, unsigned int function); |
1da177e4 | 113 | |
98025c8c | 114 | e.g.: |
1da177e4 | 115 | |
98025c8c SN |
116 | s3c_gpio_cfgpin(S3C2410_GPA(0), S3C_GPIO_SFN(1)); |
117 | s3c_gpio_cfgpin(S3C2410_GPE(8), S3C_GPIO_SFN(2)); | |
1da177e4 | 118 | |
070276d5 BD |
119 | which would turn GPA(0) into the lowest Address line A0, and set |
120 | GPE(8) to be connected to the SDIO/MMC controller's SDDAT1 line. | |
1da177e4 LT |
121 | |
122 | ||
123 | Reading the current configuration | |
124 | --------------------------------- | |
125 | ||
98025c8c SN |
126 | The current configuration of a pin can be read by using standard |
127 | gpiolib function: | |
1da177e4 | 128 | |
98025c8c | 129 | s3c_gpio_getcfg(unsigned int pin); |
1da177e4 LT |
130 | |
131 | The return value will be from the same set of values which can be | |
98025c8c | 132 | passed to s3c_gpio_cfgpin(). |
70f5c9a4 | 133 | |
1da177e4 LT |
134 | |
135 | Configuring a pull-up resistor | |
136 | ------------------------------ | |
137 | ||
138 | A large proportion of the GPIO pins on the S3C2410 can have weak | |
139 | pull-up resistors enabled. This can be configured by the following | |
140 | function: | |
141 | ||
98025c8c | 142 | void s3c_gpio_setpull(unsigned int pin, unsigned int to); |
1da177e4 | 143 | |
98025c8c SN |
144 | Where the to value is S3C_GPIO_PULL_NONE to set the pull-up off, |
145 | and S3C_GPIO_PULL_UP to enable the specified pull-up. Any other | |
146 | values are currently undefined. | |
1da177e4 | 147 | |
1da177e4 | 148 | |
98025c8c SN |
149 | Getting and setting the state of a PIN |
150 | -------------------------------------- | |
1da177e4 | 151 | |
98025c8c | 152 | These calls are now implemented by the relevant gpiolib calls, convert |
70f5c9a4 BD |
153 | your board or driver to use gpiolib. |
154 | ||
1da177e4 LT |
155 | |
156 | Getting the IRQ number associated with a PIN | |
157 | -------------------------------------------- | |
158 | ||
98025c8c | 159 | A standard gpiolib function can map the given pin number to an IRQ |
1da177e4 LT |
160 | number to pass to the IRQ system. |
161 | ||
98025c8c | 162 | int gpio_to_irq(unsigned int pin); |
1da177e4 LT |
163 | |
164 | Note, not all pins have an IRQ. | |
165 | ||
166 | ||
98025c8c | 167 | Author |
1da177e4 LT |
168 | ------- |
169 | ||
1da177e4 | 170 | Ben Dooks, 03 October 2004 |
50f430e3 | 171 | Copyright 2004 Ben Dooks, Simtec Electronics |