xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/gpio/gpio-mockup.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun#exit status
5*4882a593Smuzhiyun#1: Internal error
6*4882a593Smuzhiyun#2: sysfs/debugfs not mount
7*4882a593Smuzhiyun#3: insert module fail when gpio-mockup is a module.
8*4882a593Smuzhiyun#4: Skip test including run as non-root user.
9*4882a593Smuzhiyun#5: other reason.
10*4882a593Smuzhiyun
11*4882a593SmuzhiyunSYSFS=
12*4882a593SmuzhiyunGPIO_SYSFS=
13*4882a593SmuzhiyunGPIO_DRV_SYSFS=
14*4882a593SmuzhiyunDEBUGFS=
15*4882a593SmuzhiyunGPIO_DEBUGFS=
16*4882a593Smuzhiyundev_type=
17*4882a593Smuzhiyunmodule=
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun# Kselftest framework requirement - SKIP code is 4.
20*4882a593Smuzhiyunksft_skip=4
21*4882a593Smuzhiyun
22*4882a593Smuzhiyunusage()
23*4882a593Smuzhiyun{
24*4882a593Smuzhiyun	echo "Usage:"
25*4882a593Smuzhiyun	echo "$0 [-f] [-m name] [-t type]"
26*4882a593Smuzhiyun	echo "-f:  full test. It maybe conflict with existence gpio device."
27*4882a593Smuzhiyun	echo "-m:  module name, default name is gpio-mockup. It could also test"
28*4882a593Smuzhiyun	echo "     other gpio device."
29*4882a593Smuzhiyun	echo "-t:  interface type: chardev(char device) and sysfs(being"
30*4882a593Smuzhiyun	echo "     deprecated). The first one is default"
31*4882a593Smuzhiyun	echo ""
32*4882a593Smuzhiyun	echo "$0 -h"
33*4882a593Smuzhiyun	echo "This usage"
34*4882a593Smuzhiyun}
35*4882a593Smuzhiyun
36*4882a593Smuzhiyunprerequisite()
37*4882a593Smuzhiyun{
38*4882a593Smuzhiyun	msg="skip all tests:"
39*4882a593Smuzhiyun	if [ $UID != 0 ]; then
40*4882a593Smuzhiyun		echo $msg must be run as root >&2
41*4882a593Smuzhiyun		exit $ksft_skip
42*4882a593Smuzhiyun	fi
43*4882a593Smuzhiyun	SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
44*4882a593Smuzhiyun	if [ ! -d "$SYSFS" ]; then
45*4882a593Smuzhiyun		echo $msg sysfs is not mounted >&2
46*4882a593Smuzhiyun		exit 2
47*4882a593Smuzhiyun	fi
48*4882a593Smuzhiyun	GPIO_SYSFS=`echo $SYSFS/class/gpio`
49*4882a593Smuzhiyun	GPIO_DRV_SYSFS=`echo $SYSFS/devices/platform/$module/gpio`
50*4882a593Smuzhiyun	DEBUGFS=`mount -t debugfs | head -1 | awk '{ print $3 }'`
51*4882a593Smuzhiyun	if [ ! -d "$DEBUGFS" ]; then
52*4882a593Smuzhiyun		echo $msg debugfs is not mounted >&2
53*4882a593Smuzhiyun		exit 2
54*4882a593Smuzhiyun	fi
55*4882a593Smuzhiyun	GPIO_DEBUGFS=`echo $DEBUGFS/gpio`
56*4882a593Smuzhiyun	source gpio-mockup-sysfs.sh
57*4882a593Smuzhiyun}
58*4882a593Smuzhiyun
59*4882a593Smuzhiyuntry_insert_module()
60*4882a593Smuzhiyun{
61*4882a593Smuzhiyun	if [ -d "$GPIO_DRV_SYSFS" ]; then
62*4882a593Smuzhiyun		echo "$GPIO_DRV_SYSFS exist. Skip insert module"
63*4882a593Smuzhiyun	else
64*4882a593Smuzhiyun		modprobe -q $module $1
65*4882a593Smuzhiyun		if [ X$? != X0 ]; then
66*4882a593Smuzhiyun			echo $msg insmod $module failed >&2
67*4882a593Smuzhiyun			exit 3
68*4882a593Smuzhiyun		fi
69*4882a593Smuzhiyun	fi
70*4882a593Smuzhiyun}
71*4882a593Smuzhiyun
72*4882a593Smuzhiyunremove_module()
73*4882a593Smuzhiyun{
74*4882a593Smuzhiyun	modprobe -r -q $module
75*4882a593Smuzhiyun}
76*4882a593Smuzhiyun
77*4882a593Smuzhiyundie()
78*4882a593Smuzhiyun{
79*4882a593Smuzhiyun	remove_module
80*4882a593Smuzhiyun	exit 5
81*4882a593Smuzhiyun}
82*4882a593Smuzhiyun
83*4882a593Smuzhiyuntest_chips()
84*4882a593Smuzhiyun{
85*4882a593Smuzhiyun	if [ X$dev_type = Xsysfs ]; then
86*4882a593Smuzhiyun		echo "WARNING: sysfs ABI of gpio is going to deprecated."
87*4882a593Smuzhiyun		test_chips_sysfs $*
88*4882a593Smuzhiyun	else
89*4882a593Smuzhiyun		$BASE/gpio-mockup-chardev $*
90*4882a593Smuzhiyun	fi
91*4882a593Smuzhiyun}
92*4882a593Smuzhiyun
93*4882a593Smuzhiyungpio_test()
94*4882a593Smuzhiyun{
95*4882a593Smuzhiyun	param=$1
96*4882a593Smuzhiyun	valid=$2
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun	if [ X"$param" = X ]; then
99*4882a593Smuzhiyun		die
100*4882a593Smuzhiyun	fi
101*4882a593Smuzhiyun	try_insert_module "gpio_mockup_ranges=$param"
102*4882a593Smuzhiyun	echo -n "GPIO $module test with ranges: <"
103*4882a593Smuzhiyun	echo "$param>: "
104*4882a593Smuzhiyun	printf "%-10s %s\n" $param
105*4882a593Smuzhiyun	test_chips $module $valid
106*4882a593Smuzhiyun	remove_module
107*4882a593Smuzhiyun}
108*4882a593Smuzhiyun
109*4882a593SmuzhiyunBASE=`dirname $0`
110*4882a593Smuzhiyun
111*4882a593Smuzhiyundev_type=
112*4882a593SmuzhiyunTEMP=`getopt -o fhm:t: -n '$0' -- "$@"`
113*4882a593Smuzhiyun
114*4882a593Smuzhiyunif [ "$?" != "0" ]; then
115*4882a593Smuzhiyun        echo "Parameter process failed, Terminating..." >&2
116*4882a593Smuzhiyun        exit 1
117*4882a593Smuzhiyunfi
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun# Note the quotes around `$TEMP': they are essential!
120*4882a593Smuzhiyuneval set -- "$TEMP"
121*4882a593Smuzhiyun
122*4882a593Smuzhiyunwhile true; do
123*4882a593Smuzhiyun	case $1 in
124*4882a593Smuzhiyun	-f)
125*4882a593Smuzhiyun		full_test=true
126*4882a593Smuzhiyun		shift
127*4882a593Smuzhiyun		;;
128*4882a593Smuzhiyun	-h)
129*4882a593Smuzhiyun		usage
130*4882a593Smuzhiyun		exit
131*4882a593Smuzhiyun		;;
132*4882a593Smuzhiyun	-m)
133*4882a593Smuzhiyun		module=$2
134*4882a593Smuzhiyun		shift 2
135*4882a593Smuzhiyun		;;
136*4882a593Smuzhiyun	-t)
137*4882a593Smuzhiyun		dev_type=$2
138*4882a593Smuzhiyun		shift 2
139*4882a593Smuzhiyun		;;
140*4882a593Smuzhiyun	--)
141*4882a593Smuzhiyun		shift
142*4882a593Smuzhiyun		break
143*4882a593Smuzhiyun		;;
144*4882a593Smuzhiyun	*)
145*4882a593Smuzhiyun		echo "Internal error!"
146*4882a593Smuzhiyun		exit 1
147*4882a593Smuzhiyun		;;
148*4882a593Smuzhiyun	esac
149*4882a593Smuzhiyundone
150*4882a593Smuzhiyun
151*4882a593Smuzhiyunif [ X"$module" = X ]; then
152*4882a593Smuzhiyun	module="gpio-mockup"
153*4882a593Smuzhiyunfi
154*4882a593Smuzhiyun
155*4882a593Smuzhiyunif [ X$dev_type != Xsysfs ]; then
156*4882a593Smuzhiyun	dev_type="chardev"
157*4882a593Smuzhiyunfi
158*4882a593Smuzhiyun
159*4882a593Smuzhiyunprerequisite
160*4882a593Smuzhiyun
161*4882a593Smuzhiyunecho "1.  Test dynamic allocation of gpio successful means insert gpiochip and"
162*4882a593Smuzhiyunecho "    manipulate gpio pin successful"
163*4882a593Smuzhiyungpio_test "-1,32" true
164*4882a593Smuzhiyungpio_test "-1,32,-1,32" true
165*4882a593Smuzhiyungpio_test "-1,32,-1,32,-1,32" true
166*4882a593Smuzhiyunif [ X$full_test = Xtrue ]; then
167*4882a593Smuzhiyun	gpio_test "-1,32,32,64" true
168*4882a593Smuzhiyun	gpio_test "-1,32,40,64,-1,5" true
169*4882a593Smuzhiyun	gpio_test "-1,32,32,64,-1,32" true
170*4882a593Smuzhiyun	gpio_test "0,32,32,64,-1,32,-1,32" true
171*4882a593Smuzhiyun	gpio_test "-1,32,-1,32,0,32,32,64" true
172*4882a593Smuzhiyun	echo "2.  Do basic test: successful means insert gpiochip and"
173*4882a593Smuzhiyun	echo "    manipulate gpio pin successful"
174*4882a593Smuzhiyun	gpio_test "0,32" true
175*4882a593Smuzhiyun	gpio_test "0,32,32,64" true
176*4882a593Smuzhiyun	gpio_test "0,32,40,64,64,96" true
177*4882a593Smuzhiyunfi
178*4882a593Smuzhiyunecho "3.  Error test: successful means insert gpiochip failed"
179*4882a593Smuzhiyunecho "3.1 Test number of gpio overflow"
180*4882a593Smuzhiyun#Currently: The max number of gpio(1024) is defined in arm architecture.
181*4882a593Smuzhiyungpio_test "-1,32,-1,1024" false
182*4882a593Smuzhiyunif [ X$full_test = Xtrue ]; then
183*4882a593Smuzhiyun	echo "3.2 Test zero line of gpio"
184*4882a593Smuzhiyun	gpio_test "0,0" false
185*4882a593Smuzhiyun	echo "3.3 Test range overlap"
186*4882a593Smuzhiyun	echo "3.3.1 Test corner case"
187*4882a593Smuzhiyun	gpio_test "0,32,0,1" false
188*4882a593Smuzhiyun	gpio_test "0,32,32,64,32,40" false
189*4882a593Smuzhiyun	gpio_test "0,32,35,64,35,45" false
190*4882a593Smuzhiyun	gpio_test "0,32,31,32" false
191*4882a593Smuzhiyun	gpio_test "0,32,32,64,36,37" false
192*4882a593Smuzhiyun	gpio_test "0,32,35,64,34,36" false
193*4882a593Smuzhiyun	echo "3.3.2 Test inserting invalid second gpiochip"
194*4882a593Smuzhiyun	gpio_test "0,32,30,35" false
195*4882a593Smuzhiyun	gpio_test "0,32,1,5" false
196*4882a593Smuzhiyun	gpio_test "10,32,9,14" false
197*4882a593Smuzhiyun	gpio_test "10,32,30,35" false
198*4882a593Smuzhiyun	echo "3.3.3 Test others"
199*4882a593Smuzhiyun	gpio_test "0,32,40,56,39,45" false
200*4882a593Smuzhiyun	gpio_test "0,32,40,56,30,33" false
201*4882a593Smuzhiyun	gpio_test "0,32,40,56,30,41" false
202*4882a593Smuzhiyun	gpio_test "0,32,40,56,20,21" false
203*4882a593Smuzhiyunfi
204*4882a593Smuzhiyun
205*4882a593Smuzhiyunecho GPIO test PASS
206*4882a593Smuzhiyun
207