162306a36Sopenharmony_ci#!/bin/sh
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci# Copyright (C) 2021 Bartosz Golaszewski <brgl@bgdev.pl>
462306a36Sopenharmony_ci
562306a36Sopenharmony_ciBASE_DIR=`dirname $0`
662306a36Sopenharmony_ciCONFIGFS_DIR="/sys/kernel/config/gpio-sim"
762306a36Sopenharmony_ciMODULE="gpio-sim"
862306a36Sopenharmony_ci
962306a36Sopenharmony_cifail() {
1062306a36Sopenharmony_ci	echo "$*" >&2
1162306a36Sopenharmony_ci	echo "GPIO $MODULE test FAIL"
1262306a36Sopenharmony_ci	exit 1
1362306a36Sopenharmony_ci}
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ciskip() {
1662306a36Sopenharmony_ci	echo "$*" >&2
1762306a36Sopenharmony_ci	echo "GPIO $MODULE test SKIP"
1862306a36Sopenharmony_ci	exit 4
1962306a36Sopenharmony_ci}
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ciremove_chip() {
2262306a36Sopenharmony_ci	local CHIP=$1
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	for FILE in $CONFIGFS_DIR/$CHIP/*; do
2562306a36Sopenharmony_ci		BANK=`basename $FILE`
2662306a36Sopenharmony_ci		if [ "$BANK" = "live" -o "$BANK" = "dev_name" ]; then
2762306a36Sopenharmony_ci			continue
2862306a36Sopenharmony_ci		fi
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci		LINES=`ls $CONFIGFS_DIR/$CHIP/$BANK/ | grep -E ^line`
3162306a36Sopenharmony_ci		if [ "$?" = 0 ]; then
3262306a36Sopenharmony_ci			for LINE in $LINES; do
3362306a36Sopenharmony_ci				if [ -e $CONFIGFS_DIR/$CHIP/$BANK/$LINE/hog ]; then
3462306a36Sopenharmony_ci					rmdir $CONFIGFS_DIR/$CHIP/$BANK/$LINE/hog || \
3562306a36Sopenharmony_ci						fail "Unable to remove the hog"
3662306a36Sopenharmony_ci				fi
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci				rmdir $CONFIGFS_DIR/$CHIP/$BANK/$LINE || \
3962306a36Sopenharmony_ci					fail "Unable to remove the line"
4062306a36Sopenharmony_ci			done
4162306a36Sopenharmony_ci		fi
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci		rmdir $CONFIGFS_DIR/$CHIP/$BANK
4462306a36Sopenharmony_ci	done
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	rmdir $CONFIGFS_DIR/$CHIP || fail "Unable to remove the chip"
4762306a36Sopenharmony_ci}
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ciconfigfs_cleanup() {
5062306a36Sopenharmony_ci	for CHIP in `ls $CONFIGFS_DIR/`; do
5162306a36Sopenharmony_ci		remove_chip $CHIP
5262306a36Sopenharmony_ci	done
5362306a36Sopenharmony_ci}
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cicreate_chip() {
5662306a36Sopenharmony_ci	local CHIP=$1
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	mkdir $CONFIGFS_DIR/$CHIP
5962306a36Sopenharmony_ci}
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cicreate_bank() {
6262306a36Sopenharmony_ci	local CHIP=$1
6362306a36Sopenharmony_ci	local BANK=$2
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	mkdir $CONFIGFS_DIR/$CHIP/$BANK
6662306a36Sopenharmony_ci}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ciset_label() {
6962306a36Sopenharmony_ci	local CHIP=$1
7062306a36Sopenharmony_ci	local BANK=$2
7162306a36Sopenharmony_ci	local LABEL=$3
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	echo $LABEL > $CONFIGFS_DIR/$CHIP/$BANK/label || fail "Unable to set the chip label"
7462306a36Sopenharmony_ci}
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ciset_num_lines() {
7762306a36Sopenharmony_ci	local CHIP=$1
7862306a36Sopenharmony_ci	local BANK=$2
7962306a36Sopenharmony_ci	local NUM_LINES=$3
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	echo $NUM_LINES > $CONFIGFS_DIR/$CHIP/$BANK/num_lines || \
8262306a36Sopenharmony_ci		fail "Unable to set the number of lines"
8362306a36Sopenharmony_ci}
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ciset_line_name() {
8662306a36Sopenharmony_ci	local CHIP=$1
8762306a36Sopenharmony_ci	local BANK=$2
8862306a36Sopenharmony_ci	local OFFSET=$3
8962306a36Sopenharmony_ci	local NAME=$4
9062306a36Sopenharmony_ci	local LINE_DIR=$CONFIGFS_DIR/$CHIP/$BANK/line$OFFSET
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	test -d $LINE_DIR || mkdir $LINE_DIR
9362306a36Sopenharmony_ci	echo $NAME > $LINE_DIR/name || fail "Unable to set the line name"
9462306a36Sopenharmony_ci}
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_cienable_chip() {
9762306a36Sopenharmony_ci	local CHIP=$1
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci	echo 1 > $CONFIGFS_DIR/$CHIP/live || fail "Unable to enable the chip"
10062306a36Sopenharmony_ci}
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_cidisable_chip() {
10362306a36Sopenharmony_ci	local CHIP=$1
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	echo 0 > $CONFIGFS_DIR/$CHIP/live || fail "Unable to disable the chip"
10662306a36Sopenharmony_ci}
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ciconfigfs_chip_name() {
10962306a36Sopenharmony_ci	local CHIP=$1
11062306a36Sopenharmony_ci	local BANK=$2
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	cat $CONFIGFS_DIR/$CHIP/$BANK/chip_name 2> /dev/null || \
11362306a36Sopenharmony_ci		fail "unable to read the chip name from configfs"
11462306a36Sopenharmony_ci}
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ciconfigfs_dev_name() {
11762306a36Sopenharmony_ci	local CHIP=$1
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci	cat $CONFIGFS_DIR/$CHIP/dev_name 2> /dev/null || \
12062306a36Sopenharmony_ci		fail "unable to read the device name from configfs"
12162306a36Sopenharmony_ci}
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ciget_chip_num_lines() {
12462306a36Sopenharmony_ci	local CHIP=$1
12562306a36Sopenharmony_ci	local BANK=$2
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci	$BASE_DIR/gpio-chip-info /dev/`configfs_chip_name $CHIP $BANK` num-lines || \
12862306a36Sopenharmony_ci		fail "unable to read the number of lines from the character device"
12962306a36Sopenharmony_ci}
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ciget_chip_label() {
13262306a36Sopenharmony_ci	local CHIP=$1
13362306a36Sopenharmony_ci	local BANK=$2
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	$BASE_DIR/gpio-chip-info /dev/`configfs_chip_name $CHIP $BANK` label || \
13662306a36Sopenharmony_ci		fail "unable to read the chip label from the character device"
13762306a36Sopenharmony_ci}
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ciget_line_name() {
14062306a36Sopenharmony_ci	local CHIP=$1
14162306a36Sopenharmony_ci	local BANK=$2
14262306a36Sopenharmony_ci	local OFFSET=$3
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci	$BASE_DIR/gpio-line-name /dev/`configfs_chip_name $CHIP $BANK` $OFFSET || \
14562306a36Sopenharmony_ci		fail "unable to read the line name from the character device"
14662306a36Sopenharmony_ci}
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_cisysfs_set_pull() {
14962306a36Sopenharmony_ci	local DEV=$1
15062306a36Sopenharmony_ci	local BANK=$2
15162306a36Sopenharmony_ci	local OFFSET=$3
15262306a36Sopenharmony_ci	local PULL=$4
15362306a36Sopenharmony_ci	local DEVNAME=`configfs_dev_name $DEV`
15462306a36Sopenharmony_ci	local CHIPNAME=`configfs_chip_name $DEV $BANK`
15562306a36Sopenharmony_ci	local SYSFS_PATH="/sys/devices/platform/$DEVNAME/$CHIPNAME/sim_gpio$OFFSET/pull"
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci	echo $PULL > $SYSFS_PATH || fail "Unable to set line pull in sysfs"
15862306a36Sopenharmony_ci}
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci# Load the gpio-sim module. This will pull in configfs if needed too.
16162306a36Sopenharmony_cimodprobe gpio-sim || skip "unable to load the gpio-sim module"
16262306a36Sopenharmony_ci# Make sure configfs is mounted at /sys/kernel/config. Wait a bit if needed.
16362306a36Sopenharmony_cifor IDX in `seq 5`; do
16462306a36Sopenharmony_ci	if [ "$IDX" -eq "5" ]; then
16562306a36Sopenharmony_ci		skip "configfs not mounted at /sys/kernel/config"
16662306a36Sopenharmony_ci	fi
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci	mountpoint -q /sys/kernel/config && break
16962306a36Sopenharmony_ci	sleep 0.1
17062306a36Sopenharmony_cidone
17162306a36Sopenharmony_ci# If the module was already loaded: remove all previous chips
17262306a36Sopenharmony_ciconfigfs_cleanup
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_citrap "exit 1" SIGTERM SIGINT
17562306a36Sopenharmony_citrap configfs_cleanup EXIT
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ciecho "1. chip_name and dev_name attributes"
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ciecho "1.1. Chip name is communicated to user"
18062306a36Sopenharmony_cicreate_chip chip
18162306a36Sopenharmony_cicreate_bank chip bank
18262306a36Sopenharmony_cienable_chip chip
18362306a36Sopenharmony_citest -n `cat $CONFIGFS_DIR/chip/bank/chip_name` || fail "chip_name doesn't work"
18462306a36Sopenharmony_ciremove_chip chip
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ciecho "1.2. chip_name returns 'none' if the chip is still pending"
18762306a36Sopenharmony_cicreate_chip chip
18862306a36Sopenharmony_cicreate_bank chip bank
18962306a36Sopenharmony_citest "`cat $CONFIGFS_DIR/chip/bank/chip_name`" = "none" || \
19062306a36Sopenharmony_ci	fail "chip_name doesn't return 'none' for a pending chip"
19162306a36Sopenharmony_ciremove_chip chip
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ciecho "1.3. Device name is communicated to user"
19462306a36Sopenharmony_cicreate_chip chip
19562306a36Sopenharmony_cicreate_bank chip bank
19662306a36Sopenharmony_cienable_chip chip
19762306a36Sopenharmony_citest -n `cat $CONFIGFS_DIR/chip/dev_name` || fail "dev_name doesn't work"
19862306a36Sopenharmony_ciremove_chip chip
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ciecho "2. Creating and configuring simulated chips"
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ciecho "2.1. Default number of lines is 1"
20362306a36Sopenharmony_cicreate_chip chip
20462306a36Sopenharmony_cicreate_bank chip bank
20562306a36Sopenharmony_cienable_chip chip
20662306a36Sopenharmony_citest "`get_chip_num_lines chip bank`" = "1" || fail "default number of lines is not 1"
20762306a36Sopenharmony_ciremove_chip chip
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ciecho "2.2. Number of lines can be specified"
21062306a36Sopenharmony_cicreate_chip chip
21162306a36Sopenharmony_cicreate_bank chip bank
21262306a36Sopenharmony_ciset_num_lines chip bank 16
21362306a36Sopenharmony_cienable_chip chip
21462306a36Sopenharmony_citest "`get_chip_num_lines chip bank`" = "16" || fail "number of lines is not 16"
21562306a36Sopenharmony_ciremove_chip chip
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ciecho "2.3. Label can be set"
21862306a36Sopenharmony_cicreate_chip chip
21962306a36Sopenharmony_cicreate_bank chip bank
22062306a36Sopenharmony_ciset_label chip bank foobar
22162306a36Sopenharmony_cienable_chip chip
22262306a36Sopenharmony_citest "`get_chip_label chip bank`" = "foobar" || fail "label is incorrect"
22362306a36Sopenharmony_ciremove_chip chip
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ciecho "2.4. Label can be left empty"
22662306a36Sopenharmony_cicreate_chip chip
22762306a36Sopenharmony_cicreate_bank chip bank
22862306a36Sopenharmony_cienable_chip chip
22962306a36Sopenharmony_citest -z "`cat $CONFIGFS_DIR/chip/bank/label`" || fail "label is not empty"
23062306a36Sopenharmony_ciremove_chip chip
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ciecho "2.5. Line names can be configured"
23362306a36Sopenharmony_cicreate_chip chip
23462306a36Sopenharmony_cicreate_bank chip bank
23562306a36Sopenharmony_ciset_num_lines chip bank 16
23662306a36Sopenharmony_ciset_line_name chip bank 0 foo
23762306a36Sopenharmony_ciset_line_name chip bank 2 bar
23862306a36Sopenharmony_cienable_chip chip
23962306a36Sopenharmony_citest "`get_line_name chip bank 0`" = "foo" || fail "line name is incorrect"
24062306a36Sopenharmony_citest "`get_line_name chip bank 2`" = "bar" || fail "line name is incorrect"
24162306a36Sopenharmony_ciremove_chip chip
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_ciecho "2.6. Line config can remain unused if offset is greater than number of lines"
24462306a36Sopenharmony_cicreate_chip chip
24562306a36Sopenharmony_cicreate_bank chip bank
24662306a36Sopenharmony_ciset_num_lines chip bank 2
24762306a36Sopenharmony_ciset_line_name chip bank 5 foobar
24862306a36Sopenharmony_cienable_chip chip
24962306a36Sopenharmony_citest "`get_line_name chip bank 0`" = "" || fail "line name is incorrect"
25062306a36Sopenharmony_citest "`get_line_name chip bank 1`" = "" || fail "line name is incorrect"
25162306a36Sopenharmony_ciremove_chip chip
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ciecho "2.7. Line configfs directory names are sanitized"
25462306a36Sopenharmony_cicreate_chip chip
25562306a36Sopenharmony_cicreate_bank chip bank
25662306a36Sopenharmony_cimkdir $CONFIGFS_DIR/chip/bank/line12foobar 2> /dev/null && \
25762306a36Sopenharmony_ci	fail "invalid configfs line name accepted"
25862306a36Sopenharmony_cimkdir $CONFIGFS_DIR/chip/bank/line_no_offset 2> /dev/null && \
25962306a36Sopenharmony_ci	fail "invalid configfs line name accepted"
26062306a36Sopenharmony_ciremove_chip chip
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ciecho "2.8. Multiple chips can be created"
26362306a36Sopenharmony_ciCHIPS="chip0 chip1 chip2"
26462306a36Sopenharmony_cifor CHIP in $CHIPS; do
26562306a36Sopenharmony_ci	create_chip $CHIP
26662306a36Sopenharmony_ci	create_bank $CHIP bank
26762306a36Sopenharmony_ci	enable_chip $CHIP
26862306a36Sopenharmony_cidone
26962306a36Sopenharmony_cifor CHIP in $CHIPS; do
27062306a36Sopenharmony_ci	remove_chip $CHIP
27162306a36Sopenharmony_cidone
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ciecho "2.9. Can't modify settings when chip is live"
27462306a36Sopenharmony_cicreate_chip chip
27562306a36Sopenharmony_cicreate_bank chip bank
27662306a36Sopenharmony_cienable_chip chip
27762306a36Sopenharmony_ciecho foobar > $CONFIGFS_DIR/chip/bank/label 2> /dev/null && \
27862306a36Sopenharmony_ci	fail "Setting label of a live chip should fail"
27962306a36Sopenharmony_ciecho 8 > $CONFIGFS_DIR/chip/bank/num_lines 2> /dev/null && \
28062306a36Sopenharmony_ci	fail "Setting number of lines of a live chip should fail"
28162306a36Sopenharmony_ciremove_chip chip
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ciecho "2.10. Can't create line items when chip is live"
28462306a36Sopenharmony_cicreate_chip chip
28562306a36Sopenharmony_cicreate_bank chip bank
28662306a36Sopenharmony_cienable_chip chip
28762306a36Sopenharmony_cimkdir $CONFIGFS_DIR/chip/bank/line0 2> /dev/null && fail "Creating line item should fail"
28862306a36Sopenharmony_ciremove_chip chip
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ciecho "2.11. Probe errors are propagated to user-space"
29162306a36Sopenharmony_cicreate_chip chip
29262306a36Sopenharmony_cicreate_bank chip bank
29362306a36Sopenharmony_ciset_num_lines chip bank 99999
29462306a36Sopenharmony_ciecho 1 > $CONFIGFS_DIR/chip/live 2> /dev/null && fail "Probe error was not propagated"
29562306a36Sopenharmony_ciremove_chip chip
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ciecho "2.12. Cannot enable a chip without any GPIO banks"
29862306a36Sopenharmony_cicreate_chip chip
29962306a36Sopenharmony_ciecho 1 > $CONFIGFS_DIR/chip/live 2> /dev/null && fail "Chip enabled without any GPIO banks"
30062306a36Sopenharmony_ciremove_chip chip
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ciecho "2.13. Duplicate chip labels are not allowed"
30362306a36Sopenharmony_cicreate_chip chip
30462306a36Sopenharmony_cicreate_bank chip bank0
30562306a36Sopenharmony_ciset_label chip bank0 foobar
30662306a36Sopenharmony_cicreate_bank chip bank1
30762306a36Sopenharmony_ciset_label chip bank1 foobar
30862306a36Sopenharmony_ciecho 1 > $CONFIGFS_DIR/chip/live 2> /dev/null && fail "Duplicate chip labels were not rejected"
30962306a36Sopenharmony_ciremove_chip chip
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ciecho "2.14. Lines can be hogged"
31262306a36Sopenharmony_cicreate_chip chip
31362306a36Sopenharmony_cicreate_bank chip bank
31462306a36Sopenharmony_ciset_num_lines chip bank 8
31562306a36Sopenharmony_cimkdir -p $CONFIGFS_DIR/chip/bank/line4/hog
31662306a36Sopenharmony_cienable_chip chip
31762306a36Sopenharmony_ci$BASE_DIR/gpio-mockup-cdev -s 1 /dev/`configfs_chip_name chip bank` 4 2> /dev/null && \
31862306a36Sopenharmony_ci	fail "Setting the value of a hogged line shouldn't succeed"
31962306a36Sopenharmony_ciremove_chip chip
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_ciecho "3. Controlling simulated chips"
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ciecho "3.1. Pull can be set over sysfs"
32462306a36Sopenharmony_cicreate_chip chip
32562306a36Sopenharmony_cicreate_bank chip bank
32662306a36Sopenharmony_ciset_num_lines chip bank 8
32762306a36Sopenharmony_cienable_chip chip
32862306a36Sopenharmony_cisysfs_set_pull chip bank 0 pull-up
32962306a36Sopenharmony_ci$BASE_DIR/gpio-mockup-cdev /dev/`configfs_chip_name chip bank` 0
33062306a36Sopenharmony_citest "$?" = "1" || fail "pull set incorrectly"
33162306a36Sopenharmony_cisysfs_set_pull chip bank 0 pull-down
33262306a36Sopenharmony_ci$BASE_DIR/gpio-mockup-cdev /dev/`configfs_chip_name chip bank` 1
33362306a36Sopenharmony_citest "$?" = "0" || fail "pull set incorrectly"
33462306a36Sopenharmony_ciremove_chip chip
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_ciecho "3.2. Pull can be read from sysfs"
33762306a36Sopenharmony_cicreate_chip chip
33862306a36Sopenharmony_cicreate_bank chip bank
33962306a36Sopenharmony_ciset_num_lines chip bank 8
34062306a36Sopenharmony_cienable_chip chip
34162306a36Sopenharmony_ciDEVNAME=`configfs_dev_name chip`
34262306a36Sopenharmony_ciCHIPNAME=`configfs_chip_name chip bank`
34362306a36Sopenharmony_ciSYSFS_PATH=/sys/devices/platform/$DEVNAME/$CHIPNAME/sim_gpio0/pull
34462306a36Sopenharmony_citest `cat $SYSFS_PATH` = "pull-down" || fail "reading the pull failed"
34562306a36Sopenharmony_cisysfs_set_pull chip bank 0 pull-up
34662306a36Sopenharmony_citest `cat $SYSFS_PATH` = "pull-up" || fail "reading the pull failed"
34762306a36Sopenharmony_ciremove_chip chip
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ciecho "3.3. Incorrect input in sysfs is rejected"
35062306a36Sopenharmony_cicreate_chip chip
35162306a36Sopenharmony_cicreate_bank chip bank
35262306a36Sopenharmony_ciset_num_lines chip bank 8
35362306a36Sopenharmony_cienable_chip chip
35462306a36Sopenharmony_ciDEVNAME=`configfs_dev_name chip`
35562306a36Sopenharmony_ciCHIPNAME=`configfs_chip_name chip bank`
35662306a36Sopenharmony_ciSYSFS_PATH="/sys/devices/platform/$DEVNAME/$CHIPNAME/sim_gpio0/pull"
35762306a36Sopenharmony_ciecho foobar > $SYSFS_PATH 2> /dev/null && fail "invalid input not detected"
35862306a36Sopenharmony_ciremove_chip chip
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ciecho "3.4. Can't write to value"
36162306a36Sopenharmony_cicreate_chip chip
36262306a36Sopenharmony_cicreate_bank chip bank
36362306a36Sopenharmony_cienable_chip chip
36462306a36Sopenharmony_ciDEVNAME=`configfs_dev_name chip`
36562306a36Sopenharmony_ciCHIPNAME=`configfs_chip_name chip bank`
36662306a36Sopenharmony_ciSYSFS_PATH="/sys/devices/platform/$DEVNAME/$CHIPNAME/sim_gpio0/value"
36762306a36Sopenharmony_ciecho 1 > $SYSFS_PATH 2> /dev/null && fail "writing to 'value' succeeded unexpectedly"
36862306a36Sopenharmony_ciremove_chip chip
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ciecho "4. Simulated GPIO chips are functional"
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_ciecho "4.1. Values can be read from sysfs"
37362306a36Sopenharmony_cicreate_chip chip
37462306a36Sopenharmony_cicreate_bank chip bank
37562306a36Sopenharmony_ciset_num_lines chip bank 8
37662306a36Sopenharmony_cienable_chip chip
37762306a36Sopenharmony_ciDEVNAME=`configfs_dev_name chip`
37862306a36Sopenharmony_ciCHIPNAME=`configfs_chip_name chip bank`
37962306a36Sopenharmony_ciSYSFS_PATH="/sys/devices/platform/$DEVNAME/$CHIPNAME/sim_gpio0/value"
38062306a36Sopenharmony_citest `cat $SYSFS_PATH` = "0" || fail "incorrect value read from sysfs"
38162306a36Sopenharmony_ci$BASE_DIR/gpio-mockup-cdev -s 1 /dev/`configfs_chip_name chip bank` 0 &
38262306a36Sopenharmony_cisleep 0.1 # FIXME Any better way?
38362306a36Sopenharmony_citest `cat $SYSFS_PATH` = "1" || fail "incorrect value read from sysfs"
38462306a36Sopenharmony_cikill $!
38562306a36Sopenharmony_ciremove_chip chip
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_ciecho "4.2. Bias settings work correctly"
38862306a36Sopenharmony_cicreate_chip chip
38962306a36Sopenharmony_cicreate_bank chip bank
39062306a36Sopenharmony_ciset_num_lines chip bank 8
39162306a36Sopenharmony_cienable_chip chip
39262306a36Sopenharmony_ciDEVNAME=`configfs_dev_name chip`
39362306a36Sopenharmony_ciCHIPNAME=`configfs_chip_name chip bank`
39462306a36Sopenharmony_ciSYSFS_PATH="/sys/devices/platform/$DEVNAME/$CHIPNAME/sim_gpio0/value"
39562306a36Sopenharmony_ci$BASE_DIR/gpio-mockup-cdev -b pull-up /dev/`configfs_chip_name chip bank` 0
39662306a36Sopenharmony_citest `cat $SYSFS_PATH` = "1" || fail "bias setting does not work"
39762306a36Sopenharmony_ciremove_chip chip
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_ciecho "GPIO $MODULE test PASS"
400