xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/gpio/gpio-sim.sh (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker#!/bin/sh
2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0
3*053f45beSAndroid Build Coastguard Worker# Copyright (C) 2021 Bartosz Golaszewski <[email protected]>
4*053f45beSAndroid Build Coastguard Worker
5*053f45beSAndroid Build Coastguard WorkerBASE_DIR=`dirname $0`
6*053f45beSAndroid Build Coastguard WorkerCONFIGFS_DIR="/sys/kernel/config/gpio-sim"
7*053f45beSAndroid Build Coastguard WorkerMODULE="gpio-sim"
8*053f45beSAndroid Build Coastguard Worker
9*053f45beSAndroid Build Coastguard Workerfail() {
10*053f45beSAndroid Build Coastguard Worker	echo "$*" >&2
11*053f45beSAndroid Build Coastguard Worker	echo "GPIO $MODULE test FAIL"
12*053f45beSAndroid Build Coastguard Worker	exit 1
13*053f45beSAndroid Build Coastguard Worker}
14*053f45beSAndroid Build Coastguard Worker
15*053f45beSAndroid Build Coastguard Workerskip() {
16*053f45beSAndroid Build Coastguard Worker	echo "$*" >&2
17*053f45beSAndroid Build Coastguard Worker	echo "GPIO $MODULE test SKIP"
18*053f45beSAndroid Build Coastguard Worker	exit 4
19*053f45beSAndroid Build Coastguard Worker}
20*053f45beSAndroid Build Coastguard Worker
21*053f45beSAndroid Build Coastguard Workerremove_chip() {
22*053f45beSAndroid Build Coastguard Worker	local CHIP=$1
23*053f45beSAndroid Build Coastguard Worker
24*053f45beSAndroid Build Coastguard Worker	for FILE in $CONFIGFS_DIR/$CHIP/*; do
25*053f45beSAndroid Build Coastguard Worker		BANK=`basename $FILE`
26*053f45beSAndroid Build Coastguard Worker		if [ "$BANK" = "live" -o "$BANK" = "dev_name" ]; then
27*053f45beSAndroid Build Coastguard Worker			continue
28*053f45beSAndroid Build Coastguard Worker		fi
29*053f45beSAndroid Build Coastguard Worker
30*053f45beSAndroid Build Coastguard Worker		LINES=`ls $CONFIGFS_DIR/$CHIP/$BANK/ | egrep ^line`
31*053f45beSAndroid Build Coastguard Worker		if [ "$?" = 0 ]; then
32*053f45beSAndroid Build Coastguard Worker			for LINE in $LINES; do
33*053f45beSAndroid Build Coastguard Worker				if [ -e $CONFIGFS_DIR/$CHIP/$BANK/$LINE/hog ]; then
34*053f45beSAndroid Build Coastguard Worker					rmdir $CONFIGFS_DIR/$CHIP/$BANK/$LINE/hog || \
35*053f45beSAndroid Build Coastguard Worker						fail "Unable to remove the hog"
36*053f45beSAndroid Build Coastguard Worker				fi
37*053f45beSAndroid Build Coastguard Worker
38*053f45beSAndroid Build Coastguard Worker				rmdir $CONFIGFS_DIR/$CHIP/$BANK/$LINE || \
39*053f45beSAndroid Build Coastguard Worker					fail "Unable to remove the line"
40*053f45beSAndroid Build Coastguard Worker			done
41*053f45beSAndroid Build Coastguard Worker		fi
42*053f45beSAndroid Build Coastguard Worker
43*053f45beSAndroid Build Coastguard Worker		rmdir $CONFIGFS_DIR/$CHIP/$BANK
44*053f45beSAndroid Build Coastguard Worker	done
45*053f45beSAndroid Build Coastguard Worker
46*053f45beSAndroid Build Coastguard Worker	rmdir $CONFIGFS_DIR/$CHIP || fail "Unable to remove the chip"
47*053f45beSAndroid Build Coastguard Worker}
48*053f45beSAndroid Build Coastguard Worker
49*053f45beSAndroid Build Coastguard Workerconfigfs_cleanup() {
50*053f45beSAndroid Build Coastguard Worker	for CHIP in `ls $CONFIGFS_DIR/`; do
51*053f45beSAndroid Build Coastguard Worker		remove_chip $CHIP
52*053f45beSAndroid Build Coastguard Worker	done
53*053f45beSAndroid Build Coastguard Worker}
54*053f45beSAndroid Build Coastguard Worker
55*053f45beSAndroid Build Coastguard Workercreate_chip() {
56*053f45beSAndroid Build Coastguard Worker	local CHIP=$1
57*053f45beSAndroid Build Coastguard Worker
58*053f45beSAndroid Build Coastguard Worker	mkdir $CONFIGFS_DIR/$CHIP
59*053f45beSAndroid Build Coastguard Worker}
60*053f45beSAndroid Build Coastguard Worker
61*053f45beSAndroid Build Coastguard Workercreate_bank() {
62*053f45beSAndroid Build Coastguard Worker	local CHIP=$1
63*053f45beSAndroid Build Coastguard Worker	local BANK=$2
64*053f45beSAndroid Build Coastguard Worker
65*053f45beSAndroid Build Coastguard Worker	mkdir $CONFIGFS_DIR/$CHIP/$BANK
66*053f45beSAndroid Build Coastguard Worker}
67*053f45beSAndroid Build Coastguard Worker
68*053f45beSAndroid Build Coastguard Workerset_label() {
69*053f45beSAndroid Build Coastguard Worker	local CHIP=$1
70*053f45beSAndroid Build Coastguard Worker	local BANK=$2
71*053f45beSAndroid Build Coastguard Worker	local LABEL=$3
72*053f45beSAndroid Build Coastguard Worker
73*053f45beSAndroid Build Coastguard Worker	echo $LABEL > $CONFIGFS_DIR/$CHIP/$BANK/label || fail "Unable to set the chip label"
74*053f45beSAndroid Build Coastguard Worker}
75*053f45beSAndroid Build Coastguard Worker
76*053f45beSAndroid Build Coastguard Workerset_num_lines() {
77*053f45beSAndroid Build Coastguard Worker	local CHIP=$1
78*053f45beSAndroid Build Coastguard Worker	local BANK=$2
79*053f45beSAndroid Build Coastguard Worker	local NUM_LINES=$3
80*053f45beSAndroid Build Coastguard Worker
81*053f45beSAndroid Build Coastguard Worker	echo $NUM_LINES > $CONFIGFS_DIR/$CHIP/$BANK/num_lines || \
82*053f45beSAndroid Build Coastguard Worker		fail "Unable to set the number of lines"
83*053f45beSAndroid Build Coastguard Worker}
84*053f45beSAndroid Build Coastguard Worker
85*053f45beSAndroid Build Coastguard Workerset_line_name() {
86*053f45beSAndroid Build Coastguard Worker	local CHIP=$1
87*053f45beSAndroid Build Coastguard Worker	local BANK=$2
88*053f45beSAndroid Build Coastguard Worker	local OFFSET=$3
89*053f45beSAndroid Build Coastguard Worker	local NAME=$4
90*053f45beSAndroid Build Coastguard Worker	local LINE_DIR=$CONFIGFS_DIR/$CHIP/$BANK/line$OFFSET
91*053f45beSAndroid Build Coastguard Worker
92*053f45beSAndroid Build Coastguard Worker	test -d $LINE_DIR || mkdir $LINE_DIR
93*053f45beSAndroid Build Coastguard Worker	echo $NAME > $LINE_DIR/name || fail "Unable to set the line name"
94*053f45beSAndroid Build Coastguard Worker}
95*053f45beSAndroid Build Coastguard Worker
96*053f45beSAndroid Build Coastguard Workerenable_chip() {
97*053f45beSAndroid Build Coastguard Worker	local CHIP=$1
98*053f45beSAndroid Build Coastguard Worker
99*053f45beSAndroid Build Coastguard Worker	echo 1 > $CONFIGFS_DIR/$CHIP/live || fail "Unable to enable the chip"
100*053f45beSAndroid Build Coastguard Worker}
101*053f45beSAndroid Build Coastguard Worker
102*053f45beSAndroid Build Coastguard Workerdisable_chip() {
103*053f45beSAndroid Build Coastguard Worker	local CHIP=$1
104*053f45beSAndroid Build Coastguard Worker
105*053f45beSAndroid Build Coastguard Worker	echo 0 > $CONFIGFS_DIR/$CHIP/live || fail "Unable to disable the chip"
106*053f45beSAndroid Build Coastguard Worker}
107*053f45beSAndroid Build Coastguard Worker
108*053f45beSAndroid Build Coastguard Workerconfigfs_chip_name() {
109*053f45beSAndroid Build Coastguard Worker	local CHIP=$1
110*053f45beSAndroid Build Coastguard Worker	local BANK=$2
111*053f45beSAndroid Build Coastguard Worker
112*053f45beSAndroid Build Coastguard Worker	cat $CONFIGFS_DIR/$CHIP/$BANK/chip_name 2> /dev/null || \
113*053f45beSAndroid Build Coastguard Worker		fail "unable to read the chip name from configfs"
114*053f45beSAndroid Build Coastguard Worker}
115*053f45beSAndroid Build Coastguard Worker
116*053f45beSAndroid Build Coastguard Workerconfigfs_dev_name() {
117*053f45beSAndroid Build Coastguard Worker	local CHIP=$1
118*053f45beSAndroid Build Coastguard Worker
119*053f45beSAndroid Build Coastguard Worker	cat $CONFIGFS_DIR/$CHIP/dev_name 2> /dev/null || \
120*053f45beSAndroid Build Coastguard Worker		fail "unable to read the device name from configfs"
121*053f45beSAndroid Build Coastguard Worker}
122*053f45beSAndroid Build Coastguard Worker
123*053f45beSAndroid Build Coastguard Workerget_chip_num_lines() {
124*053f45beSAndroid Build Coastguard Worker	local CHIP=$1
125*053f45beSAndroid Build Coastguard Worker	local BANK=$2
126*053f45beSAndroid Build Coastguard Worker
127*053f45beSAndroid Build Coastguard Worker	$BASE_DIR/gpio-chip-info /dev/`configfs_chip_name $CHIP $BANK` num-lines || \
128*053f45beSAndroid Build Coastguard Worker		fail "unable to read the number of lines from the character device"
129*053f45beSAndroid Build Coastguard Worker}
130*053f45beSAndroid Build Coastguard Worker
131*053f45beSAndroid Build Coastguard Workerget_chip_label() {
132*053f45beSAndroid Build Coastguard Worker	local CHIP=$1
133*053f45beSAndroid Build Coastguard Worker	local BANK=$2
134*053f45beSAndroid Build Coastguard Worker
135*053f45beSAndroid Build Coastguard Worker	$BASE_DIR/gpio-chip-info /dev/`configfs_chip_name $CHIP $BANK` label || \
136*053f45beSAndroid Build Coastguard Worker		fail "unable to read the chip label from the character device"
137*053f45beSAndroid Build Coastguard Worker}
138*053f45beSAndroid Build Coastguard Worker
139*053f45beSAndroid Build Coastguard Workerget_line_name() {
140*053f45beSAndroid Build Coastguard Worker	local CHIP=$1
141*053f45beSAndroid Build Coastguard Worker	local BANK=$2
142*053f45beSAndroid Build Coastguard Worker	local OFFSET=$3
143*053f45beSAndroid Build Coastguard Worker
144*053f45beSAndroid Build Coastguard Worker	$BASE_DIR/gpio-line-name /dev/`configfs_chip_name $CHIP $BANK` $OFFSET || \
145*053f45beSAndroid Build Coastguard Worker		fail "unable to read the line name from the character device"
146*053f45beSAndroid Build Coastguard Worker}
147*053f45beSAndroid Build Coastguard Worker
148*053f45beSAndroid Build Coastguard Workersysfs_set_pull() {
149*053f45beSAndroid Build Coastguard Worker	local DEV=$1
150*053f45beSAndroid Build Coastguard Worker	local BANK=$2
151*053f45beSAndroid Build Coastguard Worker	local OFFSET=$3
152*053f45beSAndroid Build Coastguard Worker	local PULL=$4
153*053f45beSAndroid Build Coastguard Worker	local DEVNAME=`configfs_dev_name $DEV`
154*053f45beSAndroid Build Coastguard Worker	local CHIPNAME=`configfs_chip_name $DEV $BANK`
155*053f45beSAndroid Build Coastguard Worker	local SYSFSPATH="/sys/devices/platform/$DEVNAME/$CHIPNAME/sim_gpio$OFFSET/pull"
156*053f45beSAndroid Build Coastguard Worker
157*053f45beSAndroid Build Coastguard Worker	echo $PULL > $SYSFSPATH || fail "Unable to set line pull in sysfs"
158*053f45beSAndroid Build Coastguard Worker}
159*053f45beSAndroid Build Coastguard Worker
160*053f45beSAndroid Build Coastguard Worker# Load the gpio-sim module. This will pull in configfs if needed too.
161*053f45beSAndroid Build Coastguard Workermodprobe gpio-sim || skip "unable to load the gpio-sim module"
162*053f45beSAndroid Build Coastguard Worker# Make sure configfs is mounted at /sys/kernel/config. Wait a bit if needed.
163*053f45beSAndroid Build Coastguard Workerfor IDX in `seq 5`; do
164*053f45beSAndroid Build Coastguard Worker	if [ "$IDX" -eq "5" ]; then
165*053f45beSAndroid Build Coastguard Worker		skip "configfs not mounted at /sys/kernel/config"
166*053f45beSAndroid Build Coastguard Worker	fi
167*053f45beSAndroid Build Coastguard Worker
168*053f45beSAndroid Build Coastguard Worker	mountpoint -q /sys/kernel/config && break
169*053f45beSAndroid Build Coastguard Worker	sleep 0.1
170*053f45beSAndroid Build Coastguard Workerdone
171*053f45beSAndroid Build Coastguard Worker# If the module was already loaded: remove all previous chips
172*053f45beSAndroid Build Coastguard Workerconfigfs_cleanup
173*053f45beSAndroid Build Coastguard Worker
174*053f45beSAndroid Build Coastguard Workertrap "exit 1" SIGTERM SIGINT
175*053f45beSAndroid Build Coastguard Workertrap configfs_cleanup EXIT
176*053f45beSAndroid Build Coastguard Worker
177*053f45beSAndroid Build Coastguard Workerecho "1. chip_name and dev_name attributes"
178*053f45beSAndroid Build Coastguard Worker
179*053f45beSAndroid Build Coastguard Workerecho "1.1. Chip name is communicated to user"
180*053f45beSAndroid Build Coastguard Workercreate_chip chip
181*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
182*053f45beSAndroid Build Coastguard Workerenable_chip chip
183*053f45beSAndroid Build Coastguard Workertest -n `cat $CONFIGFS_DIR/chip/bank/chip_name` || fail "chip_name doesn't work"
184*053f45beSAndroid Build Coastguard Workerremove_chip chip
185*053f45beSAndroid Build Coastguard Worker
186*053f45beSAndroid Build Coastguard Workerecho "1.2. chip_name returns 'none' if the chip is still pending"
187*053f45beSAndroid Build Coastguard Workercreate_chip chip
188*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
189*053f45beSAndroid Build Coastguard Workertest "`cat $CONFIGFS_DIR/chip/bank/chip_name`" = "none" || \
190*053f45beSAndroid Build Coastguard Worker	fail "chip_name doesn't return 'none' for a pending chip"
191*053f45beSAndroid Build Coastguard Workerremove_chip chip
192*053f45beSAndroid Build Coastguard Worker
193*053f45beSAndroid Build Coastguard Workerecho "1.3. Device name is communicated to user"
194*053f45beSAndroid Build Coastguard Workercreate_chip chip
195*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
196*053f45beSAndroid Build Coastguard Workerenable_chip chip
197*053f45beSAndroid Build Coastguard Workertest -n `cat $CONFIGFS_DIR/chip/dev_name` || fail "dev_name doesn't work"
198*053f45beSAndroid Build Coastguard Workerremove_chip chip
199*053f45beSAndroid Build Coastguard Worker
200*053f45beSAndroid Build Coastguard Workerecho "2. Creating and configuring simulated chips"
201*053f45beSAndroid Build Coastguard Worker
202*053f45beSAndroid Build Coastguard Workerecho "2.1. Default number of lines is 1"
203*053f45beSAndroid Build Coastguard Workercreate_chip chip
204*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
205*053f45beSAndroid Build Coastguard Workerenable_chip chip
206*053f45beSAndroid Build Coastguard Workertest "`get_chip_num_lines chip bank`" = "1" || fail "default number of lines is not 1"
207*053f45beSAndroid Build Coastguard Workerremove_chip chip
208*053f45beSAndroid Build Coastguard Worker
209*053f45beSAndroid Build Coastguard Workerecho "2.2. Number of lines can be specified"
210*053f45beSAndroid Build Coastguard Workercreate_chip chip
211*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
212*053f45beSAndroid Build Coastguard Workerset_num_lines chip bank 16
213*053f45beSAndroid Build Coastguard Workerenable_chip chip
214*053f45beSAndroid Build Coastguard Workertest "`get_chip_num_lines chip bank`" = "16" || fail "number of lines is not 16"
215*053f45beSAndroid Build Coastguard Workerremove_chip chip
216*053f45beSAndroid Build Coastguard Worker
217*053f45beSAndroid Build Coastguard Workerecho "2.3. Label can be set"
218*053f45beSAndroid Build Coastguard Workercreate_chip chip
219*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
220*053f45beSAndroid Build Coastguard Workerset_label chip bank foobar
221*053f45beSAndroid Build Coastguard Workerenable_chip chip
222*053f45beSAndroid Build Coastguard Workertest "`get_chip_label chip bank`" = "foobar" || fail "label is incorrect"
223*053f45beSAndroid Build Coastguard Workerremove_chip chip
224*053f45beSAndroid Build Coastguard Worker
225*053f45beSAndroid Build Coastguard Workerecho "2.4. Label can be left empty"
226*053f45beSAndroid Build Coastguard Workercreate_chip chip
227*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
228*053f45beSAndroid Build Coastguard Workerenable_chip chip
229*053f45beSAndroid Build Coastguard Workertest -z "`cat $CONFIGFS_DIR/chip/bank/label`" || fail "label is not empty"
230*053f45beSAndroid Build Coastguard Workerremove_chip chip
231*053f45beSAndroid Build Coastguard Worker
232*053f45beSAndroid Build Coastguard Workerecho "2.5. Line names can be configured"
233*053f45beSAndroid Build Coastguard Workercreate_chip chip
234*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
235*053f45beSAndroid Build Coastguard Workerset_num_lines chip bank 16
236*053f45beSAndroid Build Coastguard Workerset_line_name chip bank 0 foo
237*053f45beSAndroid Build Coastguard Workerset_line_name chip bank 2 bar
238*053f45beSAndroid Build Coastguard Workerenable_chip chip
239*053f45beSAndroid Build Coastguard Workertest "`get_line_name chip bank 0`" = "foo" || fail "line name is incorrect"
240*053f45beSAndroid Build Coastguard Workertest "`get_line_name chip bank 2`" = "bar" || fail "line name is incorrect"
241*053f45beSAndroid Build Coastguard Workerremove_chip chip
242*053f45beSAndroid Build Coastguard Worker
243*053f45beSAndroid Build Coastguard Workerecho "2.6. Line config can remain unused if offset is greater than number of lines"
244*053f45beSAndroid Build Coastguard Workercreate_chip chip
245*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
246*053f45beSAndroid Build Coastguard Workerset_num_lines chip bank 2
247*053f45beSAndroid Build Coastguard Workerset_line_name chip bank 5 foobar
248*053f45beSAndroid Build Coastguard Workerenable_chip chip
249*053f45beSAndroid Build Coastguard Workertest "`get_line_name chip bank 0`" = "" || fail "line name is incorrect"
250*053f45beSAndroid Build Coastguard Workertest "`get_line_name chip bank 1`" = "" || fail "line name is incorrect"
251*053f45beSAndroid Build Coastguard Workerremove_chip chip
252*053f45beSAndroid Build Coastguard Worker
253*053f45beSAndroid Build Coastguard Workerecho "2.7. Line configfs directory names are sanitized"
254*053f45beSAndroid Build Coastguard Workercreate_chip chip
255*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
256*053f45beSAndroid Build Coastguard Workermkdir $CONFIGFS_DIR/chip/bank/line12foobar 2> /dev/null && \
257*053f45beSAndroid Build Coastguard Worker	fail "invalid configfs line name accepted"
258*053f45beSAndroid Build Coastguard Workermkdir $CONFIGFS_DIR/chip/bank/line_no_offset 2> /dev/null && \
259*053f45beSAndroid Build Coastguard Worker	fail "invalid configfs line name accepted"
260*053f45beSAndroid Build Coastguard Workerremove_chip chip
261*053f45beSAndroid Build Coastguard Worker
262*053f45beSAndroid Build Coastguard Workerecho "2.8. Multiple chips can be created"
263*053f45beSAndroid Build Coastguard WorkerCHIPS="chip0 chip1 chip2"
264*053f45beSAndroid Build Coastguard Workerfor CHIP in $CHIPS; do
265*053f45beSAndroid Build Coastguard Worker	create_chip $CHIP
266*053f45beSAndroid Build Coastguard Worker	create_bank $CHIP bank
267*053f45beSAndroid Build Coastguard Worker	enable_chip $CHIP
268*053f45beSAndroid Build Coastguard Workerdone
269*053f45beSAndroid Build Coastguard Workerfor CHIP in $CHIPS; do
270*053f45beSAndroid Build Coastguard Worker	remove_chip $CHIP
271*053f45beSAndroid Build Coastguard Workerdone
272*053f45beSAndroid Build Coastguard Worker
273*053f45beSAndroid Build Coastguard Workerecho "2.9. Can't modify settings when chip is live"
274*053f45beSAndroid Build Coastguard Workercreate_chip chip
275*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
276*053f45beSAndroid Build Coastguard Workerenable_chip chip
277*053f45beSAndroid Build Coastguard Workerecho foobar > $CONFIGFS_DIR/chip/bank/label 2> /dev/null && \
278*053f45beSAndroid Build Coastguard Worker	fail "Setting label of a live chip should fail"
279*053f45beSAndroid Build Coastguard Workerecho 8 > $CONFIGFS_DIR/chip/bank/num_lines 2> /dev/null && \
280*053f45beSAndroid Build Coastguard Worker	fail "Setting number of lines of a live chip should fail"
281*053f45beSAndroid Build Coastguard Workerremove_chip chip
282*053f45beSAndroid Build Coastguard Worker
283*053f45beSAndroid Build Coastguard Workerecho "2.10. Can't create line items when chip is live"
284*053f45beSAndroid Build Coastguard Workercreate_chip chip
285*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
286*053f45beSAndroid Build Coastguard Workerenable_chip chip
287*053f45beSAndroid Build Coastguard Workermkdir $CONFIGFS_DIR/chip/bank/line0 2> /dev/null && fail "Creating line item should fail"
288*053f45beSAndroid Build Coastguard Workerremove_chip chip
289*053f45beSAndroid Build Coastguard Worker
290*053f45beSAndroid Build Coastguard Workerecho "2.11. Probe errors are propagated to user-space"
291*053f45beSAndroid Build Coastguard Workercreate_chip chip
292*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
293*053f45beSAndroid Build Coastguard Workerset_num_lines chip bank 99999
294*053f45beSAndroid Build Coastguard Workerecho 1 > $CONFIGFS_DIR/chip/live 2> /dev/null && fail "Probe error was not propagated"
295*053f45beSAndroid Build Coastguard Workerremove_chip chip
296*053f45beSAndroid Build Coastguard Worker
297*053f45beSAndroid Build Coastguard Workerecho "2.12. Cannot enable a chip without any GPIO banks"
298*053f45beSAndroid Build Coastguard Workercreate_chip chip
299*053f45beSAndroid Build Coastguard Workerecho 1 > $CONFIGFS_DIR/chip/live 2> /dev/null && fail "Chip enabled without any GPIO banks"
300*053f45beSAndroid Build Coastguard Workerremove_chip chip
301*053f45beSAndroid Build Coastguard Worker
302*053f45beSAndroid Build Coastguard Workerecho "2.13. Duplicate chip labels are not allowed"
303*053f45beSAndroid Build Coastguard Workercreate_chip chip
304*053f45beSAndroid Build Coastguard Workercreate_bank chip bank0
305*053f45beSAndroid Build Coastguard Workerset_label chip bank0 foobar
306*053f45beSAndroid Build Coastguard Workercreate_bank chip bank1
307*053f45beSAndroid Build Coastguard Workerset_label chip bank1 foobar
308*053f45beSAndroid Build Coastguard Workerecho 1 > $CONFIGFS_DIR/chip/live 2> /dev/null && fail "Duplicate chip labels were not rejected"
309*053f45beSAndroid Build Coastguard Workerremove_chip chip
310*053f45beSAndroid Build Coastguard Worker
311*053f45beSAndroid Build Coastguard Workerecho "2.14. Lines can be hogged"
312*053f45beSAndroid Build Coastguard Workercreate_chip chip
313*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
314*053f45beSAndroid Build Coastguard Workerset_num_lines chip bank 8
315*053f45beSAndroid Build Coastguard Workermkdir -p $CONFIGFS_DIR/chip/bank/line4/hog
316*053f45beSAndroid Build Coastguard Workerenable_chip chip
317*053f45beSAndroid Build Coastguard Worker$BASE_DIR/gpio-mockup-cdev -s 1 /dev/`configfs_chip_name chip bank` 4 2> /dev/null && \
318*053f45beSAndroid Build Coastguard Worker	fail "Setting the value of a hogged line shouldn't succeed"
319*053f45beSAndroid Build Coastguard Workerremove_chip chip
320*053f45beSAndroid Build Coastguard Worker
321*053f45beSAndroid Build Coastguard Workerecho "3. Controlling simulated chips"
322*053f45beSAndroid Build Coastguard Worker
323*053f45beSAndroid Build Coastguard Workerecho "3.1. Pull can be set over sysfs"
324*053f45beSAndroid Build Coastguard Workercreate_chip chip
325*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
326*053f45beSAndroid Build Coastguard Workerset_num_lines chip bank 8
327*053f45beSAndroid Build Coastguard Workerenable_chip chip
328*053f45beSAndroid Build Coastguard Workersysfs_set_pull chip bank 0 pull-up
329*053f45beSAndroid Build Coastguard Worker$BASE_DIR/gpio-mockup-cdev /dev/`configfs_chip_name chip bank` 0
330*053f45beSAndroid Build Coastguard Workertest "$?" = "1" || fail "pull set incorrectly"
331*053f45beSAndroid Build Coastguard Workersysfs_set_pull chip bank 0 pull-down
332*053f45beSAndroid Build Coastguard Worker$BASE_DIR/gpio-mockup-cdev /dev/`configfs_chip_name chip bank` 1
333*053f45beSAndroid Build Coastguard Workertest "$?" = "0" || fail "pull set incorrectly"
334*053f45beSAndroid Build Coastguard Workerremove_chip chip
335*053f45beSAndroid Build Coastguard Worker
336*053f45beSAndroid Build Coastguard Workerecho "3.2. Pull can be read from sysfs"
337*053f45beSAndroid Build Coastguard Workercreate_chip chip
338*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
339*053f45beSAndroid Build Coastguard Workerset_num_lines chip bank 8
340*053f45beSAndroid Build Coastguard Workerenable_chip chip
341*053f45beSAndroid Build Coastguard WorkerDEVNAME=`configfs_dev_name chip`
342*053f45beSAndroid Build Coastguard WorkerCHIPNAME=`configfs_chip_name chip bank`
343*053f45beSAndroid Build Coastguard WorkerSYSFS_PATH=/sys/devices/platform/$DEVNAME/$CHIPNAME/sim_gpio0/pull
344*053f45beSAndroid Build Coastguard Workertest `cat $SYSFS_PATH` = "pull-down" || fail "reading the pull failed"
345*053f45beSAndroid Build Coastguard Workersysfs_set_pull chip bank 0 pull-up
346*053f45beSAndroid Build Coastguard Workertest `cat $SYSFS_PATH` = "pull-up" || fail "reading the pull failed"
347*053f45beSAndroid Build Coastguard Workerremove_chip chip
348*053f45beSAndroid Build Coastguard Worker
349*053f45beSAndroid Build Coastguard Workerecho "3.3. Incorrect input in sysfs is rejected"
350*053f45beSAndroid Build Coastguard Workercreate_chip chip
351*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
352*053f45beSAndroid Build Coastguard Workerset_num_lines chip bank 8
353*053f45beSAndroid Build Coastguard Workerenable_chip chip
354*053f45beSAndroid Build Coastguard WorkerDEVNAME=`configfs_dev_name chip`
355*053f45beSAndroid Build Coastguard WorkerCHIPNAME=`configfs_chip_name chip bank`
356*053f45beSAndroid Build Coastguard WorkerSYSFS_PATH="/sys/devices/platform/$DEVNAME/$CHIPNAME/sim_gpio0/pull"
357*053f45beSAndroid Build Coastguard Workerecho foobar > $SYSFS_PATH 2> /dev/null && fail "invalid input not detected"
358*053f45beSAndroid Build Coastguard Workerremove_chip chip
359*053f45beSAndroid Build Coastguard Worker
360*053f45beSAndroid Build Coastguard Workerecho "3.4. Can't write to value"
361*053f45beSAndroid Build Coastguard Workercreate_chip chip
362*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
363*053f45beSAndroid Build Coastguard Workerenable_chip chip
364*053f45beSAndroid Build Coastguard WorkerDEVNAME=`configfs_dev_name chip`
365*053f45beSAndroid Build Coastguard WorkerCHIPNAME=`configfs_chip_name chip bank`
366*053f45beSAndroid Build Coastguard WorkerSYSFS_PATH="/sys/devices/platform/$DEVNAME/$CHIPNAME/sim_gpio0/value"
367*053f45beSAndroid Build Coastguard Workerecho 1 > $SYSFS_PATH 2> /dev/null && fail "writing to 'value' succeeded unexpectedly"
368*053f45beSAndroid Build Coastguard Workerremove_chip chip
369*053f45beSAndroid Build Coastguard Worker
370*053f45beSAndroid Build Coastguard Workerecho "4. Simulated GPIO chips are functional"
371*053f45beSAndroid Build Coastguard Worker
372*053f45beSAndroid Build Coastguard Workerecho "4.1. Values can be read from sysfs"
373*053f45beSAndroid Build Coastguard Workercreate_chip chip
374*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
375*053f45beSAndroid Build Coastguard Workerset_num_lines chip bank 8
376*053f45beSAndroid Build Coastguard Workerenable_chip chip
377*053f45beSAndroid Build Coastguard WorkerDEVNAME=`configfs_dev_name chip`
378*053f45beSAndroid Build Coastguard WorkerCHIPNAME=`configfs_chip_name chip bank`
379*053f45beSAndroid Build Coastguard WorkerSYSFS_PATH="/sys/devices/platform/$DEVNAME/$CHIPNAME/sim_gpio0/value"
380*053f45beSAndroid Build Coastguard Workertest `cat $SYSFS_PATH` = "0" || fail "incorrect value read from sysfs"
381*053f45beSAndroid Build Coastguard Worker$BASE_DIR/gpio-mockup-cdev -s 1 /dev/`configfs_chip_name chip bank` 0 &
382*053f45beSAndroid Build Coastguard Workersleep 0.1 # FIXME Any better way?
383*053f45beSAndroid Build Coastguard Workertest `cat $SYSFS_PATH` = "1" || fail "incorrect value read from sysfs"
384*053f45beSAndroid Build Coastguard Workerkill $!
385*053f45beSAndroid Build Coastguard Workerremove_chip chip
386*053f45beSAndroid Build Coastguard Worker
387*053f45beSAndroid Build Coastguard Workerecho "4.2. Bias settings work correctly"
388*053f45beSAndroid Build Coastguard Workercreate_chip chip
389*053f45beSAndroid Build Coastguard Workercreate_bank chip bank
390*053f45beSAndroid Build Coastguard Workerset_num_lines chip bank 8
391*053f45beSAndroid Build Coastguard Workerenable_chip chip
392*053f45beSAndroid Build Coastguard Worker$BASE_DIR/gpio-mockup-cdev -b pull-up /dev/`configfs_chip_name chip bank` 0
393*053f45beSAndroid Build Coastguard Workertest `cat $SYSFS_PATH` = "1" || fail "bias setting does not work"
394*053f45beSAndroid Build Coastguard Workerremove_chip chip
395*053f45beSAndroid Build Coastguard Worker
396*053f45beSAndroid Build Coastguard Workerecho "GPIO $MODULE test PASS"
397