xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/gpio/gpio-mockup-sysfs.sh (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker
2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0
3*053f45beSAndroid Build Coastguard Worker
4*053f45beSAndroid Build Coastguard Worker# Overrides functions in gpio-mockup.sh to test using the GPIO SYSFS uAPI
5*053f45beSAndroid Build Coastguard Worker
6*053f45beSAndroid Build Coastguard WorkerSYSFS=`grep -w sysfs /proc/mounts | cut -f2 -d' '`
7*053f45beSAndroid Build Coastguard Worker[ -d "$SYSFS" ] || skip "sysfs is not mounted"
8*053f45beSAndroid Build Coastguard Worker
9*053f45beSAndroid Build Coastguard WorkerGPIO_SYSFS="${SYSFS}/class/gpio"
10*053f45beSAndroid Build Coastguard Worker[ -d "$GPIO_SYSFS" ] || skip "CONFIG_GPIO_SYSFS is not selected"
11*053f45beSAndroid Build Coastguard Worker
12*053f45beSAndroid Build Coastguard WorkerPLATFORM_SYSFS=$SYSFS/devices/platform
13*053f45beSAndroid Build Coastguard Worker
14*053f45beSAndroid Build Coastguard Workersysfs_nr=
15*053f45beSAndroid Build Coastguard Workersysfs_ldir=
16*053f45beSAndroid Build Coastguard Worker
17*053f45beSAndroid Build Coastguard Worker# determine the sysfs GPIO number given the $chip and $offset
18*053f45beSAndroid Build Coastguard Worker# e.g. gpiochip1:32
19*053f45beSAndroid Build Coastguard Workerfind_sysfs_nr()
20*053f45beSAndroid Build Coastguard Worker{
21*053f45beSAndroid Build Coastguard Worker	# e.g. /sys/devices/platform/gpio-mockup.1/gpiochip1
22*053f45beSAndroid Build Coastguard Worker	local platform=$(find $PLATFORM_SYSFS -mindepth 2 -maxdepth 2 -type d -name $chip)
23*053f45beSAndroid Build Coastguard Worker	[ "$platform" ] || fail "can't find platform of $chip"
24*053f45beSAndroid Build Coastguard Worker	# e.g. /sys/devices/platform/gpio-mockup.1/gpio/gpiochip508/base
25*053f45beSAndroid Build Coastguard Worker	local base=$(find ${platform%/*}/gpio/ -mindepth 2 -maxdepth 2 -type f -name base)
26*053f45beSAndroid Build Coastguard Worker	[ "$base" ] || fail "can't find base of $chip"
27*053f45beSAndroid Build Coastguard Worker	sysfs_nr=$(($(< "$base") + $offset))
28*053f45beSAndroid Build Coastguard Worker	sysfs_ldir="$GPIO_SYSFS/gpio$sysfs_nr"
29*053f45beSAndroid Build Coastguard Worker}
30*053f45beSAndroid Build Coastguard Worker
31*053f45beSAndroid Build Coastguard Workeracquire_line()
32*053f45beSAndroid Build Coastguard Worker{
33*053f45beSAndroid Build Coastguard Worker	[ "$sysfs_nr" ] && return
34*053f45beSAndroid Build Coastguard Worker	find_sysfs_nr
35*053f45beSAndroid Build Coastguard Worker	echo "$sysfs_nr" > "$GPIO_SYSFS/export"
36*053f45beSAndroid Build Coastguard Worker}
37*053f45beSAndroid Build Coastguard Worker
38*053f45beSAndroid Build Coastguard Worker# The helpers being overridden...
39*053f45beSAndroid Build Coastguard Workerget_line()
40*053f45beSAndroid Build Coastguard Worker{
41*053f45beSAndroid Build Coastguard Worker	[ -e "$sysfs_ldir/value" ] && echo $(< "$sysfs_ldir/value")
42*053f45beSAndroid Build Coastguard Worker}
43*053f45beSAndroid Build Coastguard Worker
44*053f45beSAndroid Build Coastguard Workerset_line()
45*053f45beSAndroid Build Coastguard Worker{
46*053f45beSAndroid Build Coastguard Worker	acquire_line
47*053f45beSAndroid Build Coastguard Worker
48*053f45beSAndroid Build Coastguard Worker	for option in $*; do
49*053f45beSAndroid Build Coastguard Worker		case $option in
50*053f45beSAndroid Build Coastguard Worker		active-high)
51*053f45beSAndroid Build Coastguard Worker			echo 0 > "$sysfs_ldir/active_low"
52*053f45beSAndroid Build Coastguard Worker			;;
53*053f45beSAndroid Build Coastguard Worker		active-low)
54*053f45beSAndroid Build Coastguard Worker			echo 1 > "$sysfs_ldir/active_low"
55*053f45beSAndroid Build Coastguard Worker			;;
56*053f45beSAndroid Build Coastguard Worker		input)
57*053f45beSAndroid Build Coastguard Worker			echo "in" > "$sysfs_ldir/direction"
58*053f45beSAndroid Build Coastguard Worker			;;
59*053f45beSAndroid Build Coastguard Worker		0)
60*053f45beSAndroid Build Coastguard Worker			echo "out" > "$sysfs_ldir/direction"
61*053f45beSAndroid Build Coastguard Worker			echo 0 > "$sysfs_ldir/value"
62*053f45beSAndroid Build Coastguard Worker			;;
63*053f45beSAndroid Build Coastguard Worker		1)
64*053f45beSAndroid Build Coastguard Worker			echo "out" > "$sysfs_ldir/direction"
65*053f45beSAndroid Build Coastguard Worker			echo 1 > "$sysfs_ldir/value"
66*053f45beSAndroid Build Coastguard Worker			;;
67*053f45beSAndroid Build Coastguard Worker		esac
68*053f45beSAndroid Build Coastguard Worker	done
69*053f45beSAndroid Build Coastguard Worker}
70*053f45beSAndroid Build Coastguard Worker
71*053f45beSAndroid Build Coastguard Workerrelease_line()
72*053f45beSAndroid Build Coastguard Worker{
73*053f45beSAndroid Build Coastguard Worker	[ "$sysfs_nr" ] || return 0
74*053f45beSAndroid Build Coastguard Worker	echo "$sysfs_nr" > "$GPIO_SYSFS/unexport"
75*053f45beSAndroid Build Coastguard Worker	sysfs_nr=
76*053f45beSAndroid Build Coastguard Worker	sysfs_ldir=
77*053f45beSAndroid Build Coastguard Worker}
78