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