| S3C24XX GPIO Control |
| ==================== |
| |
| Introduction |
| ------------ |
| |
| The s3c2410 kernel provides an interface to configure and |
| manipulate the state of the GPIO pins, and find out other |
| information about them. |
| |
| There are a number of conditions attached to the configuration |
| of the s3c2410 GPIO system, please read the Samsung provided |
| data-sheet/users manual to find out the complete list. |
| |
| See Documentation/arm/Samsung/GPIO.txt for the core implementation. |
| |
| |
| GPIOLIB |
| ------- |
| |
| With the event of the GPIOLIB in drivers/gpio, support for some |
| of the GPIO functions such as reading and writing a pin will |
| be removed in favour of this common access method. |
| |
| Once all the extant drivers have been converted, the functions |
| listed below will be removed (they may be marked as __deprecated |
| in the near future). |
| |
| The following functions now either have a s3c_ specific variant |
| or are merged into gpiolib. See the definitions in |
| arch/arm/plat-samsung/include/plat/gpio-cfg.h: |
| |
| s3c2410_gpio_setpin() gpio_set_value() or gpio_direction_output() |
| s3c2410_gpio_getpin() gpio_get_value() or gpio_direction_input() |
| s3c2410_gpio_getirq() gpio_to_irq() |
| s3c2410_gpio_cfgpin() s3c_gpio_cfgpin() |
| s3c2410_gpio_getcfg() s3c_gpio_getcfg() |
| s3c2410_gpio_pullup() s3c_gpio_setpull() |
| |
| |
| GPIOLIB conversion |
| ------------------ |
| |
| If you need to convert your board or driver to use gpiolib from the phased |
| out s3c2410 API, then here are some notes on the process. |
| |
| 1) If your board is exclusively using an GPIO, say to control peripheral |
| power, then it will require to claim the gpio with gpio_request() before |
| it can use it. |
| |
| It is recommended to check the return value, with at least WARN_ON() |
| during initialisation. |
| |
| 2) The s3c2410_gpio_cfgpin() can be directly replaced with s3c_gpio_cfgpin() |
| as they have the same arguments, and can either take the pin specific |
| values, or the more generic special-function-number arguments. |
| |
| 3) s3c2410_gpio_pullup() changes have the problem that whilst the |
| s3c2410_gpio_pullup(x, 1) can be easily translated to the |
| s3c_gpio_setpull(x, S3C_GPIO_PULL_NONE), the s3c2410_gpio_pullup(x, 0) |
| are not so easy. |
| |
| The s3c2410_gpio_pullup(x, 0) case enables the pull-up (or in the case |
| of some of the devices, a pull-down) and as such the new API distinguishes |
| between the UP and DOWN case. There is currently no 'just turn on' setting |
| which may be required if this becomes a problem. |
| |
| 4) s3c2410_gpio_setpin() can be replaced by gpio_set_value(), the old call |
| does not implicitly configure the relevant gpio to output. The gpio |
| direction should be changed before using gpio_set_value(). |
| |
| 5) s3c2410_gpio_getpin() is replaceable by gpio_get_value() if the pin |
| has been set to input. It is currently unknown what the behaviour is |
| when using gpio_get_value() on an output pin (s3c2410_gpio_getpin |
| would return the value the pin is supposed to be outputting). |
| |
| 6) s3c2410_gpio_getirq() should be directly replaceable with the |
| gpio_to_irq() call. |
| |
| The s3c2410_gpio and gpio_ calls have always operated on the same gpio |
| numberspace, so there is no problem with converting the gpio numbering |
| between the calls. |
| |
| |
| Headers |
| ------- |
| |
| See arch/arm/mach-s3c24xx/include/mach/regs-gpio.h for the list |
| of GPIO pins, and the configuration values for them. This |
| is included by using #include <mach/regs-gpio.h> |
| |
| |
| PIN Numbers |
| ----------- |
| |
| Each pin has an unique number associated with it in regs-gpio.h, |
| e.g. S3C2410_GPA(0) or S3C2410_GPF(1). These defines are used to tell |
| the GPIO functions which pin is to be used. |
| |
| With the conversion to gpiolib, there is no longer a direct conversion |
| from gpio pin number to register base address as in earlier kernels. This |
| is due to the number space required for newer SoCs where the later |
| GPIOs are not contiguous. |
| |
| |
| Configuring a pin |
| ----------------- |
| |
| The following function allows the configuration of a given pin to |
| be changed. |
| |
| void s3c_gpio_cfgpin(unsigned int pin, unsigned int function); |
| |
| e.g.: |
| |
| s3c_gpio_cfgpin(S3C2410_GPA(0), S3C_GPIO_SFN(1)); |
| s3c_gpio_cfgpin(S3C2410_GPE(8), S3C_GPIO_SFN(2)); |
| |
| which would turn GPA(0) into the lowest Address line A0, and set |
| GPE(8) to be connected to the SDIO/MMC controller's SDDAT1 line. |
| |
| |
| Reading the current configuration |
| --------------------------------- |
| |
| The current configuration of a pin can be read by using standard |
| gpiolib function: |
| |
| s3c_gpio_getcfg(unsigned int pin); |
| |
| The return value will be from the same set of values which can be |
| passed to s3c_gpio_cfgpin(). |
| |
| |
| Configuring a pull-up resistor |
| ------------------------------ |
| |
| A large proportion of the GPIO pins on the S3C2410 can have weak |
| pull-up resistors enabled. This can be configured by the following |
| function: |
| |
| void s3c_gpio_setpull(unsigned int pin, unsigned int to); |
| |
| Where the to value is S3C_GPIO_PULL_NONE to set the pull-up off, |
| and S3C_GPIO_PULL_UP to enable the specified pull-up. Any other |
| values are currently undefined. |
| |
| |
| Getting and setting the state of a PIN |
| -------------------------------------- |
| |
| These calls are now implemented by the relevant gpiolib calls, convert |
| your board or driver to use gpiolib. |
| |
| |
| Getting the IRQ number associated with a PIN |
| -------------------------------------------- |
| |
| A standard gpiolib function can map the given pin number to an IRQ |
| number to pass to the IRQ system. |
| |
| int gpio_to_irq(unsigned int pin); |
| |
| Note, not all pins have an IRQ. |
| |
| |
| Author |
| ------- |
| |
| Ben Dooks, 03 October 2004 |
| Copyright 2004 Ben Dooks, Simtec Electronics |