xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/gpio/gpio-mockup.sh (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker#!/bin/bash -efu
2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0
3*053f45beSAndroid Build Coastguard Worker
4*053f45beSAndroid Build Coastguard Worker#exit status
5*053f45beSAndroid Build Coastguard Worker#0: success
6*053f45beSAndroid Build Coastguard Worker#1: fail
7*053f45beSAndroid Build Coastguard Worker#4: skip test - including run as non-root user
8*053f45beSAndroid Build Coastguard Worker
9*053f45beSAndroid Build Coastguard WorkerBASE=${0%/*}
10*053f45beSAndroid Build Coastguard WorkerDEBUGFS=
11*053f45beSAndroid Build Coastguard WorkerGPIO_DEBUGFS=
12*053f45beSAndroid Build Coastguard Workerdev_type="cdev"
13*053f45beSAndroid Build Coastguard Workermodule="gpio-mockup"
14*053f45beSAndroid Build Coastguard Workerverbose=
15*053f45beSAndroid Build Coastguard Workerfull_test=
16*053f45beSAndroid Build Coastguard Workerrandom=
17*053f45beSAndroid Build Coastguard Workeruapi_opt=
18*053f45beSAndroid Build Coastguard Workeractive_opt=
19*053f45beSAndroid Build Coastguard Workerbias_opt=
20*053f45beSAndroid Build Coastguard Workerline_set_pid=
21*053f45beSAndroid Build Coastguard Worker
22*053f45beSAndroid Build Coastguard Worker# Kselftest return codes
23*053f45beSAndroid Build Coastguard Workerksft_fail=1
24*053f45beSAndroid Build Coastguard Workerksft_skip=4
25*053f45beSAndroid Build Coastguard Worker
26*053f45beSAndroid Build Coastguard Workerusage()
27*053f45beSAndroid Build Coastguard Worker{
28*053f45beSAndroid Build Coastguard Worker	echo "Usage:"
29*053f45beSAndroid Build Coastguard Worker	echo "$0 [-frv] [-t type]"
30*053f45beSAndroid Build Coastguard Worker	echo "-f:  full test (minimal set run by default)"
31*053f45beSAndroid Build Coastguard Worker	echo "-r:  test random lines as well as fence posts"
32*053f45beSAndroid Build Coastguard Worker	echo "-t:  interface type:"
33*053f45beSAndroid Build Coastguard Worker	echo "      cdev (character device ABI) - default"
34*053f45beSAndroid Build Coastguard Worker	echo "      cdev_v1 (deprecated character device ABI)"
35*053f45beSAndroid Build Coastguard Worker	echo "      sysfs (deprecated SYSFS ABI)"
36*053f45beSAndroid Build Coastguard Worker	echo "-v:  verbose progress reporting"
37*053f45beSAndroid Build Coastguard Worker	exit $ksft_fail
38*053f45beSAndroid Build Coastguard Worker}
39*053f45beSAndroid Build Coastguard Worker
40*053f45beSAndroid Build Coastguard Workerskip()
41*053f45beSAndroid Build Coastguard Worker{
42*053f45beSAndroid Build Coastguard Worker	echo "$*" >&2
43*053f45beSAndroid Build Coastguard Worker	echo "GPIO $module test SKIP"
44*053f45beSAndroid Build Coastguard Worker	exit $ksft_skip
45*053f45beSAndroid Build Coastguard Worker}
46*053f45beSAndroid Build Coastguard Worker
47*053f45beSAndroid Build Coastguard Workerprerequisite()
48*053f45beSAndroid Build Coastguard Worker{
49*053f45beSAndroid Build Coastguard Worker	[ $(id -u) -eq 0 ] || skip "must be run as root"
50*053f45beSAndroid Build Coastguard Worker
51*053f45beSAndroid Build Coastguard Worker	DEBUGFS=$(grep -w debugfs /proc/mounts | cut -f2 -d' ')
52*053f45beSAndroid Build Coastguard Worker	[ -d "$DEBUGFS" ] || skip "debugfs is not mounted"
53*053f45beSAndroid Build Coastguard Worker
54*053f45beSAndroid Build Coastguard Worker	GPIO_DEBUGFS=$DEBUGFS/$module
55*053f45beSAndroid Build Coastguard Worker}
56*053f45beSAndroid Build Coastguard Worker
57*053f45beSAndroid Build Coastguard Workerremove_module()
58*053f45beSAndroid Build Coastguard Worker{
59*053f45beSAndroid Build Coastguard Worker	modprobe -r -q $module
60*053f45beSAndroid Build Coastguard Worker}
61*053f45beSAndroid Build Coastguard Worker
62*053f45beSAndroid Build Coastguard Workercleanup()
63*053f45beSAndroid Build Coastguard Worker{
64*053f45beSAndroid Build Coastguard Worker	set +e
65*053f45beSAndroid Build Coastguard Worker	release_line
66*053f45beSAndroid Build Coastguard Worker	remove_module
67*053f45beSAndroid Build Coastguard Worker	jobs -p | xargs -r kill > /dev/null 2>&1
68*053f45beSAndroid Build Coastguard Worker}
69*053f45beSAndroid Build Coastguard Worker
70*053f45beSAndroid Build Coastguard Workerfail()
71*053f45beSAndroid Build Coastguard Worker{
72*053f45beSAndroid Build Coastguard Worker	echo "test failed: $*" >&2
73*053f45beSAndroid Build Coastguard Worker	echo "GPIO $module test FAIL"
74*053f45beSAndroid Build Coastguard Worker	exit $ksft_fail
75*053f45beSAndroid Build Coastguard Worker}
76*053f45beSAndroid Build Coastguard Worker
77*053f45beSAndroid Build Coastguard Workertry_insert_module()
78*053f45beSAndroid Build Coastguard Worker{
79*053f45beSAndroid Build Coastguard Worker	modprobe -q $module "$1" || fail "insert $module failed with error $?"
80*053f45beSAndroid Build Coastguard Worker}
81*053f45beSAndroid Build Coastguard Worker
82*053f45beSAndroid Build Coastguard Workerlog()
83*053f45beSAndroid Build Coastguard Worker{
84*053f45beSAndroid Build Coastguard Worker	[ -z "$verbose" ] || echo "$*"
85*053f45beSAndroid Build Coastguard Worker}
86*053f45beSAndroid Build Coastguard Worker
87*053f45beSAndroid Build Coastguard Worker# The following line helpers, release_Line, get_line and set_line, all
88*053f45beSAndroid Build Coastguard Worker# make use of the global $chip and $offset variables.
89*053f45beSAndroid Build Coastguard Worker#
90*053f45beSAndroid Build Coastguard Worker# This implementation drives the GPIO character device (cdev) uAPI.
91*053f45beSAndroid Build Coastguard Worker# Other implementations may override these to test different uAPIs.
92*053f45beSAndroid Build Coastguard Worker
93*053f45beSAndroid Build Coastguard Worker# Release any resources related to the line
94*053f45beSAndroid Build Coastguard Workerrelease_line()
95*053f45beSAndroid Build Coastguard Worker{
96*053f45beSAndroid Build Coastguard Worker	[ "$line_set_pid" ] && kill $line_set_pid && wait $line_set_pid || true
97*053f45beSAndroid Build Coastguard Worker	line_set_pid=
98*053f45beSAndroid Build Coastguard Worker}
99*053f45beSAndroid Build Coastguard Worker
100*053f45beSAndroid Build Coastguard Worker# Read the current value of the line
101*053f45beSAndroid Build Coastguard Workerget_line()
102*053f45beSAndroid Build Coastguard Worker{
103*053f45beSAndroid Build Coastguard Worker	release_line
104*053f45beSAndroid Build Coastguard Worker
105*053f45beSAndroid Build Coastguard Worker	local cdev_opts=${uapi_opt}${active_opt}
106*053f45beSAndroid Build Coastguard Worker	$BASE/gpio-mockup-cdev $cdev_opts /dev/$chip $offset
107*053f45beSAndroid Build Coastguard Worker	echo $?
108*053f45beSAndroid Build Coastguard Worker}
109*053f45beSAndroid Build Coastguard Worker
110*053f45beSAndroid Build Coastguard Worker# Set the state of the line
111*053f45beSAndroid Build Coastguard Worker#
112*053f45beSAndroid Build Coastguard Worker# Changes to line configuration are provided as parameters.
113*053f45beSAndroid Build Coastguard Worker# The line is assumed to be an output if the line value 0 or 1 is
114*053f45beSAndroid Build Coastguard Worker# specified, else an input.
115*053f45beSAndroid Build Coastguard Workerset_line()
116*053f45beSAndroid Build Coastguard Worker{
117*053f45beSAndroid Build Coastguard Worker	local val=
118*053f45beSAndroid Build Coastguard Worker
119*053f45beSAndroid Build Coastguard Worker	release_line
120*053f45beSAndroid Build Coastguard Worker
121*053f45beSAndroid Build Coastguard Worker	# parse config options...
122*053f45beSAndroid Build Coastguard Worker	for option in $*; do
123*053f45beSAndroid Build Coastguard Worker		case $option in
124*053f45beSAndroid Build Coastguard Worker		active-low)
125*053f45beSAndroid Build Coastguard Worker			active_opt="-l "
126*053f45beSAndroid Build Coastguard Worker			;;
127*053f45beSAndroid Build Coastguard Worker		active-high)
128*053f45beSAndroid Build Coastguard Worker			active_opt=
129*053f45beSAndroid Build Coastguard Worker			;;
130*053f45beSAndroid Build Coastguard Worker		bias-none)
131*053f45beSAndroid Build Coastguard Worker			bias_opt=
132*053f45beSAndroid Build Coastguard Worker			;;
133*053f45beSAndroid Build Coastguard Worker		pull-down)
134*053f45beSAndroid Build Coastguard Worker			bias_opt="-bpull-down "
135*053f45beSAndroid Build Coastguard Worker			;;
136*053f45beSAndroid Build Coastguard Worker		pull-up)
137*053f45beSAndroid Build Coastguard Worker			bias_opt="-bpull-up "
138*053f45beSAndroid Build Coastguard Worker			;;
139*053f45beSAndroid Build Coastguard Worker		0)
140*053f45beSAndroid Build Coastguard Worker			val=0
141*053f45beSAndroid Build Coastguard Worker			;;
142*053f45beSAndroid Build Coastguard Worker		1)
143*053f45beSAndroid Build Coastguard Worker			val=1
144*053f45beSAndroid Build Coastguard Worker			;;
145*053f45beSAndroid Build Coastguard Worker		esac
146*053f45beSAndroid Build Coastguard Worker	done
147*053f45beSAndroid Build Coastguard Worker
148*053f45beSAndroid Build Coastguard Worker	local cdev_opts=${uapi_opt}${active_opt}
149*053f45beSAndroid Build Coastguard Worker	if [ "$val" ]; then
150*053f45beSAndroid Build Coastguard Worker		$BASE/gpio-mockup-cdev $cdev_opts -s$val /dev/$chip $offset &
151*053f45beSAndroid Build Coastguard Worker		# failure to set is detected by reading mockup and toggling values
152*053f45beSAndroid Build Coastguard Worker		line_set_pid=$!
153*053f45beSAndroid Build Coastguard Worker		# allow for gpio-mockup-cdev to launch and request line
154*053f45beSAndroid Build Coastguard Worker		# (there is limited value in checking if line has been requested)
155*053f45beSAndroid Build Coastguard Worker		sleep 0.01
156*053f45beSAndroid Build Coastguard Worker	elif [ "$bias_opt" ]; then
157*053f45beSAndroid Build Coastguard Worker		cdev_opts=${cdev_opts}${bias_opt}
158*053f45beSAndroid Build Coastguard Worker		$BASE/gpio-mockup-cdev $cdev_opts /dev/$chip $offset || true
159*053f45beSAndroid Build Coastguard Worker	fi
160*053f45beSAndroid Build Coastguard Worker}
161*053f45beSAndroid Build Coastguard Worker
162*053f45beSAndroid Build Coastguard Workerassert_line()
163*053f45beSAndroid Build Coastguard Worker{
164*053f45beSAndroid Build Coastguard Worker	local val
165*053f45beSAndroid Build Coastguard Worker	# don't need any retry here as set_mock allows for propagation
166*053f45beSAndroid Build Coastguard Worker	val=$(get_line)
167*053f45beSAndroid Build Coastguard Worker	[ "$val" = "$1" ] || fail "line value is ${val:-empty} when $1 was expected"
168*053f45beSAndroid Build Coastguard Worker}
169*053f45beSAndroid Build Coastguard Worker
170*053f45beSAndroid Build Coastguard Worker# The following mockup helpers all make use of the $mock_line
171*053f45beSAndroid Build Coastguard Workerassert_mock()
172*053f45beSAndroid Build Coastguard Worker{
173*053f45beSAndroid Build Coastguard Worker	local backoff_wait=10
174*053f45beSAndroid Build Coastguard Worker	local retry=0
175*053f45beSAndroid Build Coastguard Worker	local val
176*053f45beSAndroid Build Coastguard Worker	# retry allows for set propagation from uAPI to mockup
177*053f45beSAndroid Build Coastguard Worker	while true; do
178*053f45beSAndroid Build Coastguard Worker		val=$(< $mock_line)
179*053f45beSAndroid Build Coastguard Worker		[ "$val" = "$1" ] && break
180*053f45beSAndroid Build Coastguard Worker		retry=$((retry + 1))
181*053f45beSAndroid Build Coastguard Worker		[ $retry -lt 5 ] || fail "mockup $mock_line value ${val:-empty} when $1 expected"
182*053f45beSAndroid Build Coastguard Worker		sleep $(printf "%0.2f" $((backoff_wait))e-3)
183*053f45beSAndroid Build Coastguard Worker		backoff_wait=$((backoff_wait * 2))
184*053f45beSAndroid Build Coastguard Worker	done
185*053f45beSAndroid Build Coastguard Worker}
186*053f45beSAndroid Build Coastguard Worker
187*053f45beSAndroid Build Coastguard Workerset_mock()
188*053f45beSAndroid Build Coastguard Worker{
189*053f45beSAndroid Build Coastguard Worker	echo "$1" > $mock_line
190*053f45beSAndroid Build Coastguard Worker	# allow for set propagation - so we won't be in a race with set_line
191*053f45beSAndroid Build Coastguard Worker	assert_mock "$1"
192*053f45beSAndroid Build Coastguard Worker}
193*053f45beSAndroid Build Coastguard Worker
194*053f45beSAndroid Build Coastguard Worker# test the functionality of a line
195*053f45beSAndroid Build Coastguard Worker#
196*053f45beSAndroid Build Coastguard Worker# The line is set from the mockup side and is read from the userspace side
197*053f45beSAndroid Build Coastguard Worker# (input), and is set from the userspace side and is read from the mockup side
198*053f45beSAndroid Build Coastguard Worker# (output).
199*053f45beSAndroid Build Coastguard Worker#
200*053f45beSAndroid Build Coastguard Worker# Setting the mockup pull using the userspace interface bias settings is
201*053f45beSAndroid Build Coastguard Worker# tested where supported by the userspace interface (cdev).
202*053f45beSAndroid Build Coastguard Workertest_line()
203*053f45beSAndroid Build Coastguard Worker{
204*053f45beSAndroid Build Coastguard Worker	chip=$1
205*053f45beSAndroid Build Coastguard Worker	offset=$2
206*053f45beSAndroid Build Coastguard Worker	log "test_line $chip $offset"
207*053f45beSAndroid Build Coastguard Worker	mock_line=$GPIO_DEBUGFS/$chip/$offset
208*053f45beSAndroid Build Coastguard Worker	[ -e "$mock_line" ] || fail "missing line $chip:$offset"
209*053f45beSAndroid Build Coastguard Worker
210*053f45beSAndroid Build Coastguard Worker	# test input active-high
211*053f45beSAndroid Build Coastguard Worker	set_mock 1
212*053f45beSAndroid Build Coastguard Worker	set_line input active-high
213*053f45beSAndroid Build Coastguard Worker	assert_line 1
214*053f45beSAndroid Build Coastguard Worker	set_mock 0
215*053f45beSAndroid Build Coastguard Worker	assert_line 0
216*053f45beSAndroid Build Coastguard Worker	set_mock 1
217*053f45beSAndroid Build Coastguard Worker	assert_line 1
218*053f45beSAndroid Build Coastguard Worker
219*053f45beSAndroid Build Coastguard Worker	if [ "$full_test" ]; then
220*053f45beSAndroid Build Coastguard Worker		if [ "$dev_type" != "sysfs" ]; then
221*053f45beSAndroid Build Coastguard Worker			# test pulls
222*053f45beSAndroid Build Coastguard Worker			set_mock 0
223*053f45beSAndroid Build Coastguard Worker			set_line input pull-up
224*053f45beSAndroid Build Coastguard Worker			assert_line 1
225*053f45beSAndroid Build Coastguard Worker			set_mock 0
226*053f45beSAndroid Build Coastguard Worker			assert_line 0
227*053f45beSAndroid Build Coastguard Worker
228*053f45beSAndroid Build Coastguard Worker			set_mock 1
229*053f45beSAndroid Build Coastguard Worker			set_line input pull-down
230*053f45beSAndroid Build Coastguard Worker			assert_line 0
231*053f45beSAndroid Build Coastguard Worker			set_mock 1
232*053f45beSAndroid Build Coastguard Worker			assert_line 1
233*053f45beSAndroid Build Coastguard Worker
234*053f45beSAndroid Build Coastguard Worker			set_line bias-none
235*053f45beSAndroid Build Coastguard Worker		fi
236*053f45beSAndroid Build Coastguard Worker
237*053f45beSAndroid Build Coastguard Worker		# test input active-low
238*053f45beSAndroid Build Coastguard Worker		set_mock 0
239*053f45beSAndroid Build Coastguard Worker		set_line active-low
240*053f45beSAndroid Build Coastguard Worker		assert_line 1
241*053f45beSAndroid Build Coastguard Worker		set_mock 1
242*053f45beSAndroid Build Coastguard Worker		assert_line 0
243*053f45beSAndroid Build Coastguard Worker		set_mock 0
244*053f45beSAndroid Build Coastguard Worker		assert_line 1
245*053f45beSAndroid Build Coastguard Worker
246*053f45beSAndroid Build Coastguard Worker		# test output active-high
247*053f45beSAndroid Build Coastguard Worker		set_mock 1
248*053f45beSAndroid Build Coastguard Worker		set_line active-high 0
249*053f45beSAndroid Build Coastguard Worker		assert_mock 0
250*053f45beSAndroid Build Coastguard Worker		set_line 1
251*053f45beSAndroid Build Coastguard Worker		assert_mock 1
252*053f45beSAndroid Build Coastguard Worker		set_line 0
253*053f45beSAndroid Build Coastguard Worker		assert_mock 0
254*053f45beSAndroid Build Coastguard Worker	fi
255*053f45beSAndroid Build Coastguard Worker
256*053f45beSAndroid Build Coastguard Worker	# test output active-low
257*053f45beSAndroid Build Coastguard Worker	set_mock 0
258*053f45beSAndroid Build Coastguard Worker	set_line active-low 0
259*053f45beSAndroid Build Coastguard Worker	assert_mock 1
260*053f45beSAndroid Build Coastguard Worker	set_line 1
261*053f45beSAndroid Build Coastguard Worker	assert_mock 0
262*053f45beSAndroid Build Coastguard Worker	set_line 0
263*053f45beSAndroid Build Coastguard Worker	assert_mock 1
264*053f45beSAndroid Build Coastguard Worker
265*053f45beSAndroid Build Coastguard Worker	release_line
266*053f45beSAndroid Build Coastguard Worker}
267*053f45beSAndroid Build Coastguard Worker
268*053f45beSAndroid Build Coastguard Workertest_no_line()
269*053f45beSAndroid Build Coastguard Worker{
270*053f45beSAndroid Build Coastguard Worker	log test_no_line "$*"
271*053f45beSAndroid Build Coastguard Worker	[ ! -e "$GPIO_DEBUGFS/$1/$2" ] || fail "unexpected line $1:$2"
272*053f45beSAndroid Build Coastguard Worker}
273*053f45beSAndroid Build Coastguard Worker
274*053f45beSAndroid Build Coastguard Worker# Load the module and check that the expected number of gpiochips, with the
275*053f45beSAndroid Build Coastguard Worker# expected number of lines, are created and are functional.
276*053f45beSAndroid Build Coastguard Worker#
277*053f45beSAndroid Build Coastguard Worker# $1 is the gpio_mockup_ranges parameter for the module
278*053f45beSAndroid Build Coastguard Worker# The remaining parameters are the number of lines, n, expected for each of
279*053f45beSAndroid Build Coastguard Worker# the gpiochips expected to be created.
280*053f45beSAndroid Build Coastguard Worker#
281*053f45beSAndroid Build Coastguard Worker# For each gpiochip the fence post lines, 0 and n-1, are tested, and the
282*053f45beSAndroid Build Coastguard Worker# line on the far side of the fence post, n, is tested to not exist.
283*053f45beSAndroid Build Coastguard Worker#
284*053f45beSAndroid Build Coastguard Worker# If the $random flag is set then a random line in the middle of the
285*053f45beSAndroid Build Coastguard Worker# gpiochip is tested as well.
286*053f45beSAndroid Build Coastguard Workerinsmod_test()
287*053f45beSAndroid Build Coastguard Worker{
288*053f45beSAndroid Build Coastguard Worker	local ranges=
289*053f45beSAndroid Build Coastguard Worker	local gc=
290*053f45beSAndroid Build Coastguard Worker	local width=
291*053f45beSAndroid Build Coastguard Worker
292*053f45beSAndroid Build Coastguard Worker	[ "${1:-}" ] || fail "missing ranges"
293*053f45beSAndroid Build Coastguard Worker	ranges=$1 ; shift
294*053f45beSAndroid Build Coastguard Worker	try_insert_module "gpio_mockup_ranges=$ranges"
295*053f45beSAndroid Build Coastguard Worker	log "GPIO $module test with ranges: <$ranges>:"
296*053f45beSAndroid Build Coastguard Worker	# e.g. /sys/kernel/debug/gpio-mockup/gpiochip1
297*053f45beSAndroid Build Coastguard Worker	gpiochip=$(find "$DEBUGFS/$module/" -name gpiochip* -type d | sort)
298*053f45beSAndroid Build Coastguard Worker	for chip in $gpiochip; do
299*053f45beSAndroid Build Coastguard Worker		gc=${chip##*/}
300*053f45beSAndroid Build Coastguard Worker		[ "${1:-}" ] || fail "unexpected chip - $gc"
301*053f45beSAndroid Build Coastguard Worker		width=$1 ; shift
302*053f45beSAndroid Build Coastguard Worker		test_line $gc 0
303*053f45beSAndroid Build Coastguard Worker		if [ "$random" -a $width -gt 2 ]; then
304*053f45beSAndroid Build Coastguard Worker			test_line $gc $((RANDOM % ($width - 2) + 1))
305*053f45beSAndroid Build Coastguard Worker		fi
306*053f45beSAndroid Build Coastguard Worker		test_line $gc $(($width - 1))
307*053f45beSAndroid Build Coastguard Worker		test_no_line $gc $width
308*053f45beSAndroid Build Coastguard Worker	done
309*053f45beSAndroid Build Coastguard Worker	[ "${1:-}" ] && fail "missing expected chip of width $1"
310*053f45beSAndroid Build Coastguard Worker	remove_module || fail "failed to remove module with error $?"
311*053f45beSAndroid Build Coastguard Worker}
312*053f45beSAndroid Build Coastguard Worker
313*053f45beSAndroid Build Coastguard Workerwhile getopts ":frvt:" opt; do
314*053f45beSAndroid Build Coastguard Worker	case $opt in
315*053f45beSAndroid Build Coastguard Worker	f)
316*053f45beSAndroid Build Coastguard Worker		full_test=true
317*053f45beSAndroid Build Coastguard Worker		;;
318*053f45beSAndroid Build Coastguard Worker	r)
319*053f45beSAndroid Build Coastguard Worker		random=true
320*053f45beSAndroid Build Coastguard Worker		;;
321*053f45beSAndroid Build Coastguard Worker	t)
322*053f45beSAndroid Build Coastguard Worker		dev_type=$OPTARG
323*053f45beSAndroid Build Coastguard Worker		;;
324*053f45beSAndroid Build Coastguard Worker	v)
325*053f45beSAndroid Build Coastguard Worker		verbose=true
326*053f45beSAndroid Build Coastguard Worker		;;
327*053f45beSAndroid Build Coastguard Worker	*)
328*053f45beSAndroid Build Coastguard Worker		usage
329*053f45beSAndroid Build Coastguard Worker		;;
330*053f45beSAndroid Build Coastguard Worker	esac
331*053f45beSAndroid Build Coastguard Workerdone
332*053f45beSAndroid Build Coastguard Workershift $((OPTIND - 1))
333*053f45beSAndroid Build Coastguard Worker
334*053f45beSAndroid Build Coastguard Worker[ "${1:-}" ] && fail "unknown argument '$1'"
335*053f45beSAndroid Build Coastguard Worker
336*053f45beSAndroid Build Coastguard Workerprerequisite
337*053f45beSAndroid Build Coastguard Worker
338*053f45beSAndroid Build Coastguard Workertrap 'exit $ksft_fail' SIGTERM SIGINT
339*053f45beSAndroid Build Coastguard Workertrap cleanup EXIT
340*053f45beSAndroid Build Coastguard Worker
341*053f45beSAndroid Build Coastguard Workercase "$dev_type" in
342*053f45beSAndroid Build Coastguard Workersysfs)
343*053f45beSAndroid Build Coastguard Worker	source $BASE/gpio-mockup-sysfs.sh
344*053f45beSAndroid Build Coastguard Worker	echo "WARNING: gpio sysfs ABI is deprecated."
345*053f45beSAndroid Build Coastguard Worker	;;
346*053f45beSAndroid Build Coastguard Workercdev_v1)
347*053f45beSAndroid Build Coastguard Worker	echo "WARNING: gpio cdev ABI v1 is deprecated."
348*053f45beSAndroid Build Coastguard Worker	uapi_opt="-u1 "
349*053f45beSAndroid Build Coastguard Worker	;;
350*053f45beSAndroid Build Coastguard Workercdev)
351*053f45beSAndroid Build Coastguard Worker	;;
352*053f45beSAndroid Build Coastguard Worker*)
353*053f45beSAndroid Build Coastguard Worker	fail "unknown interface type: $dev_type"
354*053f45beSAndroid Build Coastguard Worker	;;
355*053f45beSAndroid Build Coastguard Workeresac
356*053f45beSAndroid Build Coastguard Worker
357*053f45beSAndroid Build Coastguard Workerremove_module || fail "can't remove existing $module module"
358*053f45beSAndroid Build Coastguard Worker
359*053f45beSAndroid Build Coastguard Worker# manual gpio allocation tests fail if a physical chip already exists
360*053f45beSAndroid Build Coastguard Worker[ "$full_test" -a -e "/dev/gpiochip0" ] && skip "full tests conflict with gpiochip0"
361*053f45beSAndroid Build Coastguard Worker
362*053f45beSAndroid Build Coastguard Workerecho "1.  Module load tests"
363*053f45beSAndroid Build Coastguard Workerecho "1.1.  dynamic allocation of gpio"
364*053f45beSAndroid Build Coastguard Workerinsmod_test "-1,32" 32
365*053f45beSAndroid Build Coastguard Workerinsmod_test "-1,23,-1,32" 23 32
366*053f45beSAndroid Build Coastguard Workerinsmod_test "-1,23,-1,26,-1,32" 23 26 32
367*053f45beSAndroid Build Coastguard Workerif [ "$full_test" ]; then
368*053f45beSAndroid Build Coastguard Worker	echo "1.2.  manual allocation of gpio"
369*053f45beSAndroid Build Coastguard Worker	insmod_test "0,32" 32
370*053f45beSAndroid Build Coastguard Worker	insmod_test "0,32,32,60" 32 28
371*053f45beSAndroid Build Coastguard Worker	insmod_test "0,32,40,64,64,96" 32 24 32
372*053f45beSAndroid Build Coastguard Worker	echo "1.3.  dynamic and manual allocation of gpio"
373*053f45beSAndroid Build Coastguard Worker	insmod_test "-1,32,32,62" 32 30
374*053f45beSAndroid Build Coastguard Worker	insmod_test "-1,22,-1,23,0,24,32,64" 22 23 24 32
375*053f45beSAndroid Build Coastguard Worker	insmod_test "-1,32,32,60,-1,29" 32 28 29
376*053f45beSAndroid Build Coastguard Worker	insmod_test "-1,32,40,64,-1,5" 32 24 5
377*053f45beSAndroid Build Coastguard Worker	insmod_test "0,32,32,44,-1,22,-1,31" 32 12 22 31
378*053f45beSAndroid Build Coastguard Workerfi
379*053f45beSAndroid Build Coastguard Workerecho "2.  Module load error tests"
380*053f45beSAndroid Build Coastguard Workerecho "2.1 gpio overflow"
381*053f45beSAndroid Build Coastguard Worker# Currently: The max number of gpio(1024) is defined in arm architecture.
382*053f45beSAndroid Build Coastguard Workerinsmod_test "-1,1024"
383*053f45beSAndroid Build Coastguard Workerif [ "$full_test" ]; then
384*053f45beSAndroid Build Coastguard Worker	echo "2.2 no lines defined"
385*053f45beSAndroid Build Coastguard Worker	insmod_test "0,0"
386*053f45beSAndroid Build Coastguard Worker	echo "2.3 ignore range overlap"
387*053f45beSAndroid Build Coastguard Worker	insmod_test "0,32,0,1" 32
388*053f45beSAndroid Build Coastguard Worker	insmod_test "0,32,1,5" 32
389*053f45beSAndroid Build Coastguard Worker	insmod_test "0,32,30,35" 32
390*053f45beSAndroid Build Coastguard Worker	insmod_test "0,32,31,32" 32
391*053f45beSAndroid Build Coastguard Worker	insmod_test "10,32,30,35" 22
392*053f45beSAndroid Build Coastguard Worker	insmod_test "10,32,9,14" 22
393*053f45beSAndroid Build Coastguard Worker	insmod_test "0,32,20,21,40,56" 32 16
394*053f45beSAndroid Build Coastguard Worker	insmod_test "0,32,32,64,32,40" 32 32
395*053f45beSAndroid Build Coastguard Worker	insmod_test "0,32,32,64,36,37" 32 32
396*053f45beSAndroid Build Coastguard Worker	insmod_test "0,32,35,64,34,36" 32 29
397*053f45beSAndroid Build Coastguard Worker	insmod_test "0,30,35,64,35,45" 30 29
398*053f45beSAndroid Build Coastguard Worker	insmod_test "0,32,40,56,30,33" 32 16
399*053f45beSAndroid Build Coastguard Worker	insmod_test "0,32,40,56,30,41" 32 16
400*053f45beSAndroid Build Coastguard Worker	insmod_test "0,32,40,56,39,45" 32 16
401*053f45beSAndroid Build Coastguard Workerfi
402*053f45beSAndroid Build Coastguard Worker
403*053f45beSAndroid Build Coastguard Workerecho "GPIO $module test PASS"
404