162306a36Sopenharmony_ci
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci# Overrides functions in gpio-mockup.sh to test using the GPIO SYSFS uAPI
562306a36Sopenharmony_ci
662306a36Sopenharmony_ciSYSFS=`grep -w sysfs /proc/mounts | cut -f2 -d' '`
762306a36Sopenharmony_ci[ -d "$SYSFS" ] || skip "sysfs is not mounted"
862306a36Sopenharmony_ci
962306a36Sopenharmony_ciGPIO_SYSFS="${SYSFS}/class/gpio"
1062306a36Sopenharmony_ci[ -d "$GPIO_SYSFS" ] || skip "CONFIG_GPIO_SYSFS is not selected"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciPLATFORM_SYSFS=$SYSFS/devices/platform
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cisysfs_nr=
1562306a36Sopenharmony_cisysfs_ldir=
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci# determine the sysfs GPIO number given the $chip and $offset
1862306a36Sopenharmony_ci# e.g. gpiochip1:32
1962306a36Sopenharmony_cifind_sysfs_nr()
2062306a36Sopenharmony_ci{
2162306a36Sopenharmony_ci	# e.g. /sys/devices/platform/gpio-mockup.1/gpiochip1
2262306a36Sopenharmony_ci	local platform=$(find $PLATFORM_SYSFS -mindepth 2 -maxdepth 2 -type d -name $chip)
2362306a36Sopenharmony_ci	[ "$platform" ] || fail "can't find platform of $chip"
2462306a36Sopenharmony_ci	# e.g. /sys/devices/platform/gpio-mockup.1/gpio/gpiochip508/base
2562306a36Sopenharmony_ci	local base=$(find ${platform%/*}/gpio/ -mindepth 2 -maxdepth 2 -type f -name base)
2662306a36Sopenharmony_ci	[ "$base" ] || fail "can't find base of $chip"
2762306a36Sopenharmony_ci	sysfs_nr=$(($(< "$base") + $offset))
2862306a36Sopenharmony_ci	sysfs_ldir="$GPIO_SYSFS/gpio$sysfs_nr"
2962306a36Sopenharmony_ci}
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ciacquire_line()
3262306a36Sopenharmony_ci{
3362306a36Sopenharmony_ci	[ "$sysfs_nr" ] && return
3462306a36Sopenharmony_ci	find_sysfs_nr
3562306a36Sopenharmony_ci	echo "$sysfs_nr" > "$GPIO_SYSFS/export"
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci# The helpers being overridden...
3962306a36Sopenharmony_ciget_line()
4062306a36Sopenharmony_ci{
4162306a36Sopenharmony_ci	[ -e "$sysfs_ldir/value" ] && echo $(< "$sysfs_ldir/value")
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ciset_line()
4562306a36Sopenharmony_ci{
4662306a36Sopenharmony_ci	acquire_line
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	for option in $*; do
4962306a36Sopenharmony_ci		case $option in
5062306a36Sopenharmony_ci		active-high)
5162306a36Sopenharmony_ci			echo 0 > "$sysfs_ldir/active_low"
5262306a36Sopenharmony_ci			;;
5362306a36Sopenharmony_ci		active-low)
5462306a36Sopenharmony_ci			echo 1 > "$sysfs_ldir/active_low"
5562306a36Sopenharmony_ci			;;
5662306a36Sopenharmony_ci		input)
5762306a36Sopenharmony_ci			echo "in" > "$sysfs_ldir/direction"
5862306a36Sopenharmony_ci			;;
5962306a36Sopenharmony_ci		0)
6062306a36Sopenharmony_ci			echo "out" > "$sysfs_ldir/direction"
6162306a36Sopenharmony_ci			echo 0 > "$sysfs_ldir/value"
6262306a36Sopenharmony_ci			;;
6362306a36Sopenharmony_ci		1)
6462306a36Sopenharmony_ci			echo "out" > "$sysfs_ldir/direction"
6562306a36Sopenharmony_ci			echo 1 > "$sysfs_ldir/value"
6662306a36Sopenharmony_ci			;;
6762306a36Sopenharmony_ci		esac
6862306a36Sopenharmony_ci	done
6962306a36Sopenharmony_ci}
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cirelease_line()
7262306a36Sopenharmony_ci{
7362306a36Sopenharmony_ci	[ "$sysfs_nr" ] || return 0
7462306a36Sopenharmony_ci	echo "$sysfs_nr" > "$GPIO_SYSFS/unexport"
7562306a36Sopenharmony_ci	sysfs_nr=
7662306a36Sopenharmony_ci	sysfs_ldir=
7762306a36Sopenharmony_ci}
78