summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2021-05-27 17:39:49 +0200
committerDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2021-05-27 17:57:11 +0200
commit69954ce752c5f7e04031b4462aac691e8bcfa754 (patch)
treedaca0390bff43b57ca9c12f1da2c7b31c1c3fd59
parentd3e14e1304c074084b0da8465a7b27115720b7b5 (diff)
downloadexynos-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.c5
-rw-r--r--exynos4412_gpios.h3
-rw-r--r--main.c56
-rw-r--r--modem_gpios_data.c12
-rw-r--r--modem_gpios_data.h7
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,
diff --git a/main.c b/main.c
index 2e2f1c2..2161503 100644
--- a/main.c
+++ b/main.c
@@ -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 */