Messages in this thread | | | From | Javier Martinez Canillas <> | Subject | [RFC PATCH 0/5] add gpio_chip_ops to hold GPIO operations | Date | Tue, 8 Apr 2014 20:20:10 +0200 |
| |
In the kernel there are basically two patterns to implement object oriented code in C. You can either embedded a set of function pointers in a struct along with other members or have a separate virtual function table (vtable) structure that hold all the functions and only store a pointer to that vtable on our particular object.
The struct gpio_chip uses the former approach, but I don't know if that is a design decision or is just that this code predates the fact that the separate structure pattern is now so popular. Since the having a the operations on a different structure has a number of benefits:
- A clean separation between state (fields) and operations (functions). - Size reduction of struct gpio_chip since will only hold one pointer. - These functions are not supposed to change at runtime so the const qualifier can be used to prevent pointers modification during execution. - Similar drivers for a chip family can reuse their function vtable.
There is a drawback though which is that now two memory accesses are needed to execute a GPIO operation since an additional level of indirection is introduced but that should be minimized due temporal and spatial memory locality.
So this is an RFC patch-set to add a virtual table to be used by GPIO chip controllers and consist of the following patches:
Javier Martinez Canillas (5): gpio: add a vtable to abstract GPIO controller operations gpiolib: set gpio_chip operations on add using a gpio_chip_ops gpio: omap: convert driver to use gpio_chip_ops gpio: twl4030: convert driver to use gpio_chip_ops gpio: switch to use struct struct gpio_chip_ops
drivers/gpio/gpio-omap.c | 19 ++++++++----- drivers/gpio/gpio-twl4030.c | 10 +++++-- drivers/gpio/gpiolib.c | 64 ++++++++++++++++++++--------------------- include/linux/gpio/driver.h | 69 +++++++++++++++++++++++++++------------------ 4 files changed, 93 insertions(+), 69 deletions(-)
The patch-set is not a complete one though since only the GPIO OMAP and GPIO TWL4030 drivers have been converted so I could test it on my platform (DM3730 OMAP IGEPv2 board).
But I preferred to send an early RFC than changing every single driver before discussing if doing the split is worth it or not.
To not break git bisect-ability, I added some patches that are transitional changes. If you have a better suggestion on how to handle that please let me know.
Thanks a lot and best regards, Javier
-- 1.9.0
| |