Add test app for poeg Signed-off-by: Biju Das <biju.das.jz@xxxxxxxxxxxxxx> --- tools/poeg/Build | 1 + tools/poeg/Makefile | 53 ++++++++++++++++++++++ tools/poeg/poeg_app.c | 102 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 156 insertions(+) create mode 100644 tools/poeg/Build create mode 100644 tools/poeg/Makefile create mode 100644 tools/poeg/poeg_app.c diff --git a/tools/poeg/Build b/tools/poeg/Build new file mode 100644 index 000000000000..f960920a4afb --- /dev/null +++ b/tools/poeg/Build @@ -0,0 +1 @@ +poeg_app-y += poeg_app.o diff --git a/tools/poeg/Makefile b/tools/poeg/Makefile new file mode 100644 index 000000000000..669c914d9c98 --- /dev/null +++ b/tools/poeg/Makefile @@ -0,0 +1,53 @@ +# SPDX-License-Identifier: GPL-2.0 +include ../scripts/Makefile.include + +bindir ?= /usr/bin + +ifeq ($(srctree),) +srctree := $(patsubst %/,%,$(dir $(CURDIR))) +srctree := $(patsubst %/,%,$(dir $(srctree))) +endif + +# Do not use make's built-in rules +# (this improves performance and avoids hard-to-debug behaviour); +MAKEFLAGS += -r + +override CFLAGS += -O2 -Wall -g -D_GNU_SOURCE -I$(OUTPUT)include + +ALL_TARGETS := poeg_app +ALL_PROGRAMS := $(patsubst %,$(OUTPUT)%,$(ALL_TARGETS)) + +all: $(ALL_PROGRAMS) + +export srctree OUTPUT CC LD CFLAGS +include $(srctree)/tools/build/Makefile.include + +# +# We need the following to be outside of kernel tree +# +$(OUTPUT)include/linux/poeg.h: ../../include/linux/pinctrl/rzg2l-poeg.h + mkdir -p $(OUTPUT)include/linux 2>&1 || true + ln -sf $(CURDIR)/../../include/linux/pinctrl/rzg2l-poeg.h $@ + +prepare: $(OUTPUT)include/linux/poeg.h + +POEG_EXAMPLE := $(OUTPUT)poeg_app.o +$(POEG_EXAMPLE): prepare FORCE + $(Q)$(MAKE) $(build)=poeg_app +$(OUTPUT)poeg_app: $(POEG_EXAMPLE) + $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@ + +clean: + rm -f $(ALL_PROGRAMS) + rm -rf $(OUTPUT)include/linux/poeg.h + find $(or $(OUTPUT),.) -name '*.o' -delete -o -name '\.*.d' -delete + +install: $(ALL_PROGRAMS) + install -d -m 755 $(DESTDIR)$(bindir); \ + for program in $(ALL_PROGRAMS); do \ + install $$program $(DESTDIR)$(bindir); \ + done + +FORCE: + +.PHONY: all install clean FORCE prepare diff --git a/tools/poeg/poeg_app.c b/tools/poeg/poeg_app.c new file mode 100644 index 000000000000..273ae1813e2f --- /dev/null +++ b/tools/poeg/poeg_app.c @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * POEG - example userspace application + * Copyright (C) 2023 Biju Das + */ +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include <sys/ioctl.h> +#include <linux/ioctl.h> +#include <stdio.h> +#include <unistd.h> +#include <sys/time.h> +#include <sys/types.h> +#include <poll.h> + +#include <linux/poeg.h> + +#define USER_CTRL 1 +#define GPT_CTRL 0 +#define EXT_PIN_CTRL 0 + +int main(int argc, char *arg[]) +{ + struct poeg_cmd cmd; + int ret, fd; +#if GPT_CTRL + struct poeg_event event_data; + unsigned int val; + int i; +#endif + + fd = open("/dev/poeg3", O_RDWR); + if (fd < 0) + perror("open"); + else + printf("[POEG]open\n"); + +#if USER_CTRL + cmd.val = RZG2L_POEG_USR_CTRL_ENABLE_CMD; + cmd.channel = 4; + printf("[POEG] user control pin output disable enabled\n"); + ret = write(fd, &cmd, sizeof(cmd)); + if (ret == -1) { + perror("Failed to write cmd data"); + return 1; + } + sleep(3); + + printf("[POEG] user control pin output disable disabled\n"); + cmd.val = RZG2L_POEG_USR_CTRL_DISABLE_CMD; + cmd.channel = 4; + ret = write(fd, &cmd, sizeof(cmd)); + if (ret == -1) { + perror("Failed to write cmd data"); + return 1; + } +#endif + +#if GPT_CTRL + printf("[POEG] GPT control configure IRQ\n"); + cmd.val = RZG2L_POEG_GPT_CFG_IRQ_CMD; + cmd.channel = 4; + ret = write(fd, &cmd, sizeof(cmd)); + if (ret == -1) { + perror("Failed to write cmd data"); + return 1; + } + + for (;;) { + ret = read(fd, &event_data, sizeof(event_data)); + if (ret == -1) { + perror("Failed to read event data"); + return 1; + } + + val = event_data.gpt_disable_irq_status; + if (val) { + /* emulate fault clearing condition by adding delay */ + sleep(2); + for (i = 0; i < 8; i++) { + if (val & 7) { + printf("gpt ch:%u, irq=%x\n", i, val & 7); + cmd.val = RZG2L_POEG_GPT_FAULT_CLR_CMD; + cmd.channel = 4; + ret = write(fd, &cmd, sizeof(cmd)); + } + val >>= 3; + } + } + } +#endif + + if (close(fd) != 0) + perror("close"); + else + printf("[POEG]close\n"); + + return 0; +} -- 2.25.1