====================
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.rst 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 while 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
