| The U-Boot Driver Model Project | 
 | =============================== | 
 | GPIO analysis | 
 | ============= | 
 | Viktor Krivak <viktor.krivak@gmail.com> | 
 | 2012-02-24 | 
 |  | 
 | I) Overview | 
 | ----------- | 
 |  | 
 |   At this moment U-Boot provides standard API that consists of 7 functions. | 
 |  | 
 |     int  gpio_request(unsigned gpio, const char *label) | 
 |     int  gpio_free(unsigned gpio) | 
 |     int  gpio_direction_input(unsigned gpio) | 
 |     int  gpio_direction_output(unsigned gpio, int value) | 
 |     int  gpio_get_value(unsigned gpio) | 
 |     void gpio_set_value(unsigned gpio, int value) | 
 |  | 
 |   Methods "gpio_request()" and "gpio_free()" are used for claiming and releasing | 
 |   GPIOs. First one should check if the desired pin exists and if the pin wasn't | 
 |   requested already elsewhere. The method also has a label argument that can be | 
 |   used for debug purposes. The label argument should be copied into the internal | 
 |   memory, but only if the DEBUG macro is set. The "gpio_free()" is the exact | 
 |   opposite. It releases the particular pin. Other methods are used for setting | 
 |   input or output direction and obtaining or setting values of the pins. | 
 |  | 
 | II) Approach | 
 | ------------ | 
 |  | 
 |   1) Request and free GPIO | 
 |   ------------------------ | 
 |  | 
 |     The "gpio_request()" implementation is basically the same for all boards. | 
 |     The function checks if the particular GPIO is correct and checks if the | 
 |     GPIO pin is still free. If the conditions are met, the method marks the | 
 |     GPIO claimed in it's internal structure. If macro DEBUG is defined, the | 
 |     function also copies the label argument to the structure. If the pin is | 
 |     already locked, the function returns -1 and if DEBUG is defined, certain | 
 |     debug output is generated, including the contents of the label argument. | 
 |     The "gpio_free()" function releases the lock and eventually deallocates | 
 |     data used by the copied label argument. | 
 |  | 
 |   2) Internal data | 
 |   ---------------- | 
 |  | 
 |   Internal data are driver specific. They have to contain some mechanism to | 
 |   realise the locking though. This can be done for example using a bit field. | 
 |  | 
 |   3) Operations provided by the driver | 
 |   ------------------------------------ | 
 |  | 
 |   The driver operations basically meet API that is already defined and used. | 
 |   Except for "gpio_request()" and "gpio_free()", all methods can be converted in | 
 |   a simple manner. The driver provides the following structure: | 
 |  | 
 |   struct gpio_driver_ops { | 
 |     int  (*gpio_request)(struct instance *i, unsigned gpio, | 
 |                          const char *label); | 
 |     int  (*gpio_free)(struct instance *i, unsigned gpio); | 
 |     int  (*gpio_direction_input)(struct instance *i, unsigned gpio); | 
 |     int  (*gpio_direction_output)(struct instance *i, unsigned gpio, | 
 |                                   int value); | 
 |     int  (*gpio_get_value)(struct instance *i, unsigned gpio); | 
 |     void (*gpio_set_value)(struct instance *i, unsigned gpio, int value); | 
 |   } | 
 |  | 
 | III) Analysis of in-tree drivers | 
 | -------------------------------- | 
 |  | 
 |   1) altera_pio.c | 
 |   --------------- | 
 |   Meets standard API. Implements gpio_request() properly. Simple conversion | 
 |   possible. | 
 |  | 
 |   2) at91_gpio.c | 
 |   -------------- | 
 |   Don't meet standard API. Need some other methods to implement. | 
 |  | 
 |   3) da8xx_gpio.c | 
 |   --------------- | 
 |   Meets standard API. Implements gpio_request() properly. Simple conversion | 
 |   possible. | 
 |  | 
 |   4) kw_gpio.c | 
 |   ------------ | 
 |   Doesn't meet standard API. Needs some other methods to implement and move some | 
 |   methods to another file. | 
 |  | 
 |   5) mpc83xx_gpio.c | 
 |   ----------------- | 
 |   Meets standard API. Doesn't implement gpio_request() properly (only checks | 
 |   if the pin is valid). Simple conversion possible. | 
 |  | 
 |   6) mvgpio.c | 
 |   ----------- | 
 |   Meets standard API. Doesn't implement gpio_request() properly (only checks | 
 |   if the pin is valid). Simple conversion possible. | 
 |  | 
 |   7) mvgpio.h | 
 |   ----------- | 
 |   Wrong placement. Will be moved to another location. | 
 |  | 
 |   8) mvmfp.c | 
 |   ---------- | 
 |   Wrong placement. Will be moved to another location. |