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


Headers
-------

  See include/asm-arm/arch-s3c2410/regs-gpio.h for the list
  of GPIO pins, and the configuration values for them. This
  is included by using #include <asm/arch/regs-gpio.h>

  The GPIO management functions are defined in the hardware
  header include/asm-arm/arch-s3c2410/hardware.h which can be
  included by #include <asm/arch/hardware.h>

  A useful amount of documentation can be found in the hardware
  header on how the GPIO functions (and others) work.

  Whilst a number of these functions do make some checks on what
  is passed to them, for speed of use, they may not always ensure
  that the user supplied data to them is correct.


PIN Numbers
-----------

  Each pin has an unique number associated with it in regs-gpio.h,
  eg S3C2410_GPA0 or S3C2410_GPF1. These defines are used to tell
  the GPIO functions which pin is to be used.


Configuring a pin
-----------------

  The following function allows the configuration of a given pin to
  be changed.

    void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function);

  Eg:

     s3c2410_gpio_cfgpin(S3C2410_GPA0, S3C2410_GPA0_ADDR0);
     s3c2410_gpio_cfgpin(S3C2410_GPE8, S3C2410_GPE8_SDDAT1);

   which would turn GPA0 into the lowest Address line A0, and set
   GPE8 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:

  s3c2410_gpio_getcfg(unsigned int pin);

  The return value will be from the same set of values which can be
  passed to s3c2410_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 s3c2410_gpio_pullup(unsigned int pin, unsigned int to);

  Where the to value is zero to set the pull-up off, and 1 to enable
  the specified pull-up. Any other values are currently undefined.


Getting the state of a PIN
--------------------------

  The state of a pin can be read by using the function:

    unsigned int s3c2410_gpio_getpin(unsigned int pin);

  This will return either zero or non-zero. Do not count on this
  function returning 1 if the pin is set.


Setting the state of a PIN
--------------------------

  The value an pin is outputing can be modified by using the following:

    void s3c2410_gpio_setpin(unsigned int pin, unsigned int to);

  Which sets the given pin to the value. Use 0 to write 0, and 1 to
  set the output to 1.


Getting the IRQ number associated with a PIN
--------------------------------------------

  The following function can map the given pin number to an IRQ
  number to pass to the IRQ system.

   int s3c2410_gpio_getirq(unsigned int pin);

  Note, not all pins have an IRQ.


Authour
-------


Ben Dooks, 03 October 2004
(c) 2004 Ben Dooks, Simtec Electronics
