1
2# SPDX-License-Identifier: GPL-2.0
3is_consistent()
4{
5	val=
6
7	active_low_sysfs=`cat $GPIO_SYSFS/gpio$nr/active_low`
8	val_sysfs=`cat $GPIO_SYSFS/gpio$nr/value`
9	dir_sysfs=`cat $GPIO_SYSFS/gpio$nr/direction`
10
11	gpio_this_debugfs=`cat $GPIO_DEBUGFS |grep "gpio-$nr" | sed "s/(.*)//g"`
12	dir_debugfs=`echo $gpio_this_debugfs | awk '{print $2}'`
13	val_debugfs=`echo $gpio_this_debugfs | awk '{print $3}'`
14	if [ $val_debugfs = "lo" ]; then
15		val=0
16	elif [ $val_debugfs = "hi" ]; then
17		val=1
18	fi
19
20	if [ $active_low_sysfs = "1" ]; then
21		if [ $val = "0" ]; then
22			val="1"
23		else
24			val="0"
25		fi
26	fi
27
28	if [ $val_sysfs = $val ] && [ $dir_sysfs = $dir_debugfs ]; then
29		echo -n "."
30	else
31		echo "test fail, exit"
32		die
33	fi
34}
35
36test_pin_logic()
37{
38	nr=$1
39	direction=$2
40	active_low=$3
41	value=$4
42
43	echo $direction > $GPIO_SYSFS/gpio$nr/direction
44	echo $active_low > $GPIO_SYSFS/gpio$nr/active_low
45	if [ $direction = "out" ]; then
46		echo $value > $GPIO_SYSFS/gpio$nr/value
47	fi
48	is_consistent $nr
49}
50
51test_one_pin()
52{
53	nr=$1
54
55	echo -n "test pin<$nr>"
56
57	echo $nr > $GPIO_SYSFS/export 2>/dev/null
58
59	if [ X$? != X0 ]; then
60		echo "test GPIO pin $nr failed"
61		die
62	fi
63
64	#"Checking if the sysfs is consistent with debugfs: "
65	is_consistent $nr
66
67	#"Checking the logic of active_low: "
68	test_pin_logic $nr out 1 1
69	test_pin_logic $nr out 1 0
70	test_pin_logic $nr out 0 1
71	test_pin_logic $nr out 0 0
72
73	#"Checking the logic of direction: "
74	test_pin_logic $nr in 1 1
75	test_pin_logic $nr out 1 0
76	test_pin_logic $nr low 0 1
77	test_pin_logic $nr high 0 0
78
79	echo $nr > $GPIO_SYSFS/unexport
80
81	echo "successful"
82}
83
84test_one_pin_fail()
85{
86	nr=$1
87
88	echo $nr > $GPIO_SYSFS/export 2>/dev/null
89
90	if [ X$? != X0 ]; then
91		echo "test invalid pin $nr successful"
92	else
93		echo "test invalid pin $nr failed"
94		echo $nr > $GPIO_SYSFS/unexport 2>/dev/null
95		die
96	fi
97}
98
99list_chip()
100{
101	echo `ls -d $GPIO_DRV_SYSFS/gpiochip* 2>/dev/null`
102}
103
104test_chip()
105{
106	chip=$1
107	name=`basename $chip`
108	base=`cat $chip/base`
109	ngpio=`cat $chip/ngpio`
110	printf "%-10s %-5s %-5s\n" $name $base $ngpio
111	if [ $ngpio = "0" ]; then
112		echo "number of gpio is zero is not allowed".
113	fi
114	test_one_pin $base
115	test_one_pin $(($base + $ngpio - 1))
116	test_one_pin $((( RANDOM % $ngpio )  + $base ))
117}
118
119test_chips_sysfs()
120{
121       gpiochip=`list_chip $module`
122       if [ X"$gpiochip" = X ]; then
123               if [ X"$valid" = Xfalse ]; then
124                       echo "successful"
125               else
126                       echo "fail"
127                       die
128               fi
129       else
130               for chip in $gpiochip; do
131                       test_chip $chip
132               done
133       fi
134}
135
136