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