#!/bin/bash # SPDX-License-Identifier: GPL-2.0 #exit status #1: Internal error #2: sysfs/debugfs not mount #3: insert module fail when gpio-mockup is a module. #4: Skip test including run as non-root user. #5: other reason. SYSFS= GPIO_SYSFS= GPIO_DRV_SYSFS= DEBUGFS= GPIO_DEBUGFS= dev_type= module= # Kselftest framework requirement - SKIP code is 4. ksft_skip=4 usage() { echo "Usage:" echo "$0 [-f] [-m name] [-t type]" echo "-f: full test. It maybe conflict with existence gpio device." echo "-m: module name, default name is gpio-mockup. It could also test" echo " other gpio device." echo "-t: interface type: chardev(char device) and sysfs(being" echo " deprecated). The first one is default" echo "" echo "$0 -h" echo "This usage" } prerequisite() { msg="skip all tests:" if [ $UID != 0 ]; then echo $msg must be run as root >&2 exit $ksft_skip fi SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'` if [ ! -d "$SYSFS" ]; then echo $msg sysfs is not mounted >&2 exit 2 fi GPIO_SYSFS=`echo $SYSFS/class/gpio` GPIO_DRV_SYSFS=`echo $SYSFS/devices/platform/$module/gpio` DEBUGFS=`mount -t debugfs | head -1 | awk '{ print $3 }'` if [ ! -d "$DEBUGFS" ]; then echo $msg debugfs is not mounted >&2 exit 2 fi GPIO_DEBUGFS=`echo $DEBUGFS/gpio` source gpio-mockup-sysfs.sh } try_insert_module() { if [ -d "$GPIO_DRV_SYSFS" ]; then echo "$GPIO_DRV_SYSFS exist. Skip insert module" else modprobe -q $module $1 if [ X$? != X0 ]; then echo $msg insmod $module failed >&2 exit 3 fi fi } remove_module() { modprobe -r -q $module } die() { remove_module exit 5 } test_chips() { if [ X$dev_type = Xsysfs ]; then echo "WARNING: sysfs ABI of gpio is going to deprecated." test_chips_sysfs $* else $BASE/gpio-mockup-chardev $* fi } gpio_test() { param=$1 valid=$2 if [ X"$param" = X ]; then die fi try_insert_module "gpio_mockup_ranges=$param" echo -n "GPIO $module test with ranges: <" echo "$param>: " printf "%-10s %s\n" $param test_chips $module $valid remove_module } BASE=`dirname $0` dev_type= TEMP=`getopt -o fhm:t: -n '$0' -- "$@"` if [ "$?" != "0" ]; then echo "Parameter process failed, Terminating..." >&2 exit 1 fi # Note the quotes around `$TEMP': they are essential! eval set -- "$TEMP" while true; do case $1 in -f) full_test=true shift ;; -h) usage exit ;; -m) module=$2 shift 2 ;; -t) dev_type=$2 shift 2 ;; --) shift break ;; *) echo "Internal error!" exit 1 ;; esac done if [ X"$module" = X ]; then module="gpio-mockup" fi if [ X$dev_type != Xsysfs ]; then dev_type="chardev" fi prerequisite echo "1. Test dynamic allocation of gpio successful means insert gpiochip and" echo " manipulate gpio pin successful" gpio_test "-1,32" true gpio_test "-1,32,-1,32" true gpio_test "-1,32,-1,32,-1,32" true if [ X$full_test = Xtrue ]; then gpio_test "-1,32,32,64" true gpio_test "-1,32,40,64,-1,5" true gpio_test "-1,32,32,64,-1,32" true gpio_test "0,32,32,64,-1,32,-1,32" true gpio_test "-1,32,-1,32,0,32,32,64" true echo "2. Do basic test: successful means insert gpiochip and" echo " manipulate gpio pin successful" gpio_test "0,32" true gpio_test "0,32,32,64" true gpio_test "0,32,40,64,64,96" true fi echo "3. Error test: successful means insert gpiochip failed" echo "3.1 Test number of gpio overflow" #Currently: The max number of gpio(1024) is defined in arm architecture. gpio_test "-1,32,-1,1024" false if [ X$full_test = Xtrue ]; then echo "3.2 Test zero line of gpio" gpio_test "0,0" false echo "3.3 Test range overlap" echo "3.3.1 Test corner case" gpio_test "0,32,0,1" false gpio_test "0,32,32,64,32,40" false gpio_test "0,32,35,64,35,45" false gpio_test "0,32,31,32" false gpio_test "0,32,32,64,36,37" false gpio_test "0,32,35,64,34,36" false echo "3.3.2 Test inserting invalid second gpiochip" gpio_test "0,32,30,35" false gpio_test "0,32,1,5" false gpio_test "10,32,9,14" false gpio_test "10,32,30,35" false echo "3.3.3 Test others" gpio_test "0,32,40,56,39,45" false gpio_test "0,32,40,56,30,33" false gpio_test "0,32,40,56,30,41" false gpio_test "0,32,40,56,20,21" false fi echo GPIO test PASS