xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/rkpinctrl/iomux.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
4  */
5 
6 #include <errno.h>
7 #include <fcntl.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <stdint.h>
11 #include <string.h>
12 #include <unistd.h>
13 #include <sys/ioctl.h>
14 #include <sys/mman.h>
15 #include <sys/types.h>
16 
17 #include "../../../../include/uapi/linux/rk-iomux.h"
18 
rk_iomux_ioctl_set(int fd,int bank,int pin,int mux)19 static int rk_iomux_ioctl_set(int fd, int bank, int pin, int mux)
20 {
21 	struct iomux_ioctl_data data = {
22 		.bank = bank,
23 		.pin = pin,
24 		.mux = mux,
25 	};
26 	int ret;
27 
28 	if (!fd)
29 		return -EINVAL;
30 
31 	ret = ioctl(fd, IOMUX_IOC_MUX_SET, &data);
32 	if (ret < 0) {
33 		perror("fail to ioctl");
34 		return ret;
35 	}
36 
37 	return 0;
38 }
39 
rk_iomux_ioctl_get(int fd,int bank,int pin,int * mux)40 static int rk_iomux_ioctl_get(int fd, int bank, int pin, int *mux)
41 {
42 	struct iomux_ioctl_data data = {
43 		.bank = bank,
44 		.pin = pin,
45 	};
46 	int ret;
47 
48 	if (!fd)
49 		return -EINVAL;
50 
51 	ret = ioctl(fd, IOMUX_IOC_MUX_GET, &data);
52 	if (ret < 0) {
53 		perror("fail to ioctl");
54 		return ret;
55 	}
56 	*mux = data.mux;
57 
58 	return 0;
59 }
60 
usage(void)61 static void usage(void)
62 {
63 	printf("%s:\n"
64 		"set iomux:\n"
65 		"iomux [bank index] [pin index] [mux value]\n"
66 		"get iomux:\n"
67 		"iomux [bank index] [pin index]\n",
68 		__func__);
69 }
70 
main(int argc,char * argv[])71 int main(int argc, char *argv[])
72 {
73 	const char *name = "/dev/iomux";
74 	int fd;
75 	int bank, pin, mux;
76 	int ret;
77 
78 	if ((argc != 3) && (argc != 4)) {
79 		usage();
80 		return -1;
81 	}
82 
83 	bank = atoi(argv[1]);
84 	pin = atoi(argv[2]);
85 
86 	fd = open(name, O_RDWR);
87 	if (fd < 0) {
88 		printf("open %s failed!\n", name);
89 		return fd;
90 	}
91 
92 	if (argc == 4) {
93 		mux = atoi(argv[3]);
94 		ret = rk_iomux_ioctl_set(fd, bank, pin, mux);
95 		if (ret)
96 			goto err;
97 	} else if (argc == 3) {
98 		ret = rk_iomux_ioctl_get(fd, bank, pin, &mux);
99 		if (ret)
100 			goto err;
101 		printf("mux get (GPIO%d-%d) = %d\n", bank, pin, mux);
102 	}
103 
104 err:
105 	close(fd);
106 	return 0;
107 }
108