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