diff options
| author | Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> | 2021-05-27 17:39:49 +0200 |
|---|---|---|
| committer | Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> | 2021-05-27 17:57:11 +0200 |
| commit | 69954ce752c5f7e04031b4462aac691e8bcfa754 (patch) | |
| tree | daca0390bff43b57ca9c12f1da2c7b31c1c3fd59 | |
| parent | d3e14e1304c074084b0da8465a7b27115720b7b5 (diff) | |
| download | exynos-gpio-tool-69954ce752c5f7e04031b4462aac691e8bcfa754.tar.gz exynos-gpio-tool-69954ce752c5f7e04031b4462aac691e8bcfa754.tar.bz2 exynos-gpio-tool-69954ce752c5f7e04031b4462aac691e8bcfa754.zip | |
dump_gpio_infos: convert to use an unified mmap
Running the tests end up calling mmap once per test, while it
could be called only once.
Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
| -rw-r--r-- | exynos4412_gpios.c | 5 | ||||
| -rw-r--r-- | exynos4412_gpios.h | 3 | ||||
| -rw-r--r-- | main.c | 56 | ||||
| -rw-r--r-- | modem_gpios_data.c | 12 | ||||
| -rw-r--r-- | modem_gpios_data.h | 7 |
5 files changed, 61 insertions, 22 deletions
diff --git a/exynos4412_gpios.c b/exynos4412_gpios.c index 85b2776..e9f23f5 100644 --- a/exynos4412_gpios.c +++ b/exynos4412_gpios.c @@ -63,7 +63,8 @@ void *mmap_gpio_hardware_blocks(int debug, char *devmem, int fd, } int dump_gpio_infos(int debug, char *devmem, int fd, size_t page_size, - char *bank, uint32_t gpio_offset) + void *gpio_hardware_blocks_addr, char *bank, + uint32_t gpio_offset) { uint32_t *addr; int rc; @@ -81,7 +82,7 @@ int dump_gpio_infos(int debug, char *devmem, int fd, size_t page_size, } - addr = mmap_gpio_hardware_blocks(debug, devmem, fd, page_size) + offset; + addr = gpio_hardware_blocks_addr + offset; if (debug) { printf("%s: Mapped at %p\n", __func__, addr); diff --git a/exynos4412_gpios.h b/exynos4412_gpios.h index a1b17b2..44c00fc 100644 --- a/exynos4412_gpios.h +++ b/exynos4412_gpios.h @@ -21,7 +21,8 @@ #include <stdint.h> int dump_gpio_infos(int debug, char *devmem, int fd, size_t page_size, - char *bank, uint32_t gpio_offset); + void *gpio_hardware_blocks_addr, char *bank, + uint32_t gpio_offset); int gpio_get_direction(char *devmem, int fd, size_t page_size, char *bank, uint32_t gpio_offset); int gpio_get_output_value(char *devmem, int fd, size_t page_size, char *bank, @@ -51,11 +51,13 @@ int usage(char* progname) return 0; } -int dump_flash_gpio_status(int debug, char* devmem, int fd, size_t page_size) +int dump_flash_gpio_status(int debug, char* devmem, int fd, size_t page_size, + void *gpio_hardware_blocks_addr) { int rc; - rc = dump_gpio_infos(debug, devmem, fd, page_size, "gpj1", 1); + rc = dump_gpio_infos(debug, devmem, fd, page_size, + gpio_hardware_blocks_addr, "gpj1", 1); if (rc == -1) { printf("dump_gpio_infos failed with error %d\n", rc); @@ -66,11 +68,13 @@ int dump_flash_gpio_status(int debug, char* devmem, int fd, size_t page_size) return 0; } -int dump_flash_gps_status(int debug, char* devmem, int fd, size_t page_size) +int dump_flash_gps_status(int debug, char* devmem, int fd, size_t page_size, + void *gpio_hardware_blocks_addr) { int rc; - rc = dump_gpio_infos(debug, devmem, fd, page_size, "gpl2", 1); + rc = dump_gpio_infos(debug, devmem, fd, page_size, + gpio_hardware_blocks_addr, "gpl2", 1); if (rc == -1) { printf("dump_gpio_infos failed with error %d\n", rc); @@ -78,7 +82,8 @@ int dump_flash_gps_status(int debug, char* devmem, int fd, size_t page_size) return EX_UNAVAILABLE; } - rc = dump_gpio_infos(debug, devmem, fd, page_size, "gpl2", 2); + rc = dump_gpio_infos(debug, devmem, fd, page_size, + gpio_hardware_blocks_addr, "gpl2", 2); if (rc == -1) { printf("dump_gpio_infos failed with error %d\n", rc); @@ -90,7 +95,7 @@ int dump_flash_gps_status(int debug, char* devmem, int fd, size_t page_size) } int dump_gpio_bank_status(int debug, char* devmem, int fd, size_t page_size, - char* bank) + void *gpio_hardware_blocks_addr, char* bank) { int i; int nr_gpios; @@ -107,7 +112,8 @@ int dump_gpio_bank_status(int debug, char* devmem, int fd, size_t page_size, } for (i=0; i < nr_gpios; i++) { - rc = dump_gpio_infos(debug, devmem, fd, page_size, bank, i); + rc = dump_gpio_infos(debug, devmem, fd, page_size, + gpio_hardware_blocks_addr, bank, i); if (rc == -1) { printf("dump_gpio_infos failed with error %d\n", rc); @@ -127,6 +133,7 @@ int main(int argc, char *argv[]) char *devmem = "/dev/mem"; size_t page_size = 4096; + void *gpio_hardware_blocks_addr; assert(argc >= 1); @@ -155,28 +162,49 @@ int main(int argc, char *argv[]) return EX_UNAVAILABLE; } + if (strcmp("flash", argv[1]) && + strcmp("gpl1", argv[1]) && + strcmp("gpl2", argv[1]) && + strcmp("gps", argv[1]) && + strcmp("gpy0", argv[1]) && + strcmp("modem", argv[1]) && + strcmp("test", argv[1])) { + usage(argv[0]); + return EX_USAGE; + } + + gpio_hardware_blocks_addr = mmap_gpio_hardware_blocks(debug, devmem, fd, + page_size); + if (gpio_hardware_blocks_addr == NULL) { + /* mmap_gpio_bank already prints an error */ + goto end; + } + if (argc == 2 && !strcmp("flash", argv[1])) { - return dump_flash_gpio_status(debug, devmem, fd, page_size); + return dump_flash_gpio_status(debug, devmem, fd, page_size, + gpio_hardware_blocks_addr); } else if (argc == 2 && !strcmp("gpl1", argv[1])) { return dump_gpio_bank_status(debug, devmem, fd, page_size, - "gpl1"); + gpio_hardware_blocks_addr, "gpl1"); } else if (argc == 2 && !strcmp("gpl2", argv[1])) { return dump_gpio_bank_status(debug, devmem, fd, page_size, - "gpl2"); + gpio_hardware_blocks_addr, "gpl2"); } else if (argc == 2 && !strcmp("gps", argv[1])) { - return dump_flash_gps_status(debug, devmem, fd, page_size); + return dump_flash_gps_status(debug, devmem, fd, page_size, + gpio_hardware_blocks_addr); } else if (argc == 2 && !strcmp("gpy0", argv[1])) { return dump_gpio_bank_status(debug, devmem, fd, page_size, - "gpy0"); + gpio_hardware_blocks_addr, "gpy0"); } else if (argc == 2 && !strcmp("modem", argv[1])) { - return dump_modem_gpio_infos(debug, devmem, fd, page_size); + return dump_modem_gpio_infos(debug, devmem, fd, page_size, + gpio_hardware_blocks_addr); } else if (argc == 2 && !strcmp("test", argv[1])) { return run_tests(debug, devmem, fd, page_size); } else { usage(argv[0]); return EX_USAGE; } - +end: rc = close(fd); if (rc == -1) { rc = errno; diff --git a/modem_gpios_data.c b/modem_gpios_data.c index 18349c5..208f11f 100644 --- a/modem_gpios_data.c +++ b/modem_gpios_data.c @@ -127,7 +127,9 @@ struct modem_gpio_data *get_modem_gpio_data_by_dt_name(char *dt_name) } int dump_modem_gpio_infos_by_dt_name(int debug, char *devmem, int fd, - size_t page_size, char *dt_name) + size_t page_size, + void *gpio_hardware_blocks_addr, + char *dt_name) { struct modem_gpio_data *modem_gpio_data; @@ -135,12 +137,15 @@ int dump_modem_gpio_infos_by_dt_name(int debug, char *devmem, int fd, if (modem_gpio_data == NULL) return -1; - return dump_gpio_infos(debug, devmem, fd, page_size, modem_gpio_data->bank, + return dump_gpio_infos(debug, devmem, fd, page_size, + gpio_hardware_blocks_addr, + modem_gpio_data->bank, modem_gpio_data->gpio_offset); } -int dump_modem_gpio_infos(int debug, char* devmem, int fd, size_t page_size) +int dump_modem_gpio_infos(int debug, char* devmem, int fd, size_t page_size, + void *gpio_hardware_blocks_addr) { int i = 0; @@ -154,6 +159,7 @@ int dump_modem_gpio_infos(int debug, char* devmem, int fd, size_t page_size) __func__, modem_gpio_datas[i].dt_gpio_name); rc = dump_gpio_infos(debug, devmem, fd, page_size, + gpio_hardware_blocks_addr, modem_gpio_datas[i].bank, modem_gpio_datas[i].gpio_offset); diff --git a/modem_gpios_data.h b/modem_gpios_data.h index 01dbfd7..0e8a3dd 100644 --- a/modem_gpios_data.h +++ b/modem_gpios_data.h @@ -31,8 +31,11 @@ struct modem_gpio_data { char *dt_gpio_name; }; -int dump_modem_gpio_infos(int debug, char* devmem, int fd, size_t page_size); +int dump_modem_gpio_infos(int debug, char* devmem, int fd, size_t page_size, + void *gpio_hardware_blocks_addr); int dump_modem_gpio_infos_by_dt_name(int debug, char *devmem, int fd, - size_t page_size, char *dt_name); + size_t page_size, + void *gpio_hardware_blocks_addr, + char *dt_name); #endif /* MODEM_GPIOS_DATA_H */ |
