1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun#exit status 5*4882a593Smuzhiyun#1: Internal error 6*4882a593Smuzhiyun#2: sysfs/debugfs not mount 7*4882a593Smuzhiyun#3: insert module fail when gpio-mockup is a module. 8*4882a593Smuzhiyun#4: Skip test including run as non-root user. 9*4882a593Smuzhiyun#5: other reason. 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunSYSFS= 12*4882a593SmuzhiyunGPIO_SYSFS= 13*4882a593SmuzhiyunGPIO_DRV_SYSFS= 14*4882a593SmuzhiyunDEBUGFS= 15*4882a593SmuzhiyunGPIO_DEBUGFS= 16*4882a593Smuzhiyundev_type= 17*4882a593Smuzhiyunmodule= 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun# Kselftest framework requirement - SKIP code is 4. 20*4882a593Smuzhiyunksft_skip=4 21*4882a593Smuzhiyun 22*4882a593Smuzhiyunusage() 23*4882a593Smuzhiyun{ 24*4882a593Smuzhiyun echo "Usage:" 25*4882a593Smuzhiyun echo "$0 [-f] [-m name] [-t type]" 26*4882a593Smuzhiyun echo "-f: full test. It maybe conflict with existence gpio device." 27*4882a593Smuzhiyun echo "-m: module name, default name is gpio-mockup. It could also test" 28*4882a593Smuzhiyun echo " other gpio device." 29*4882a593Smuzhiyun echo "-t: interface type: chardev(char device) and sysfs(being" 30*4882a593Smuzhiyun echo " deprecated). The first one is default" 31*4882a593Smuzhiyun echo "" 32*4882a593Smuzhiyun echo "$0 -h" 33*4882a593Smuzhiyun echo "This usage" 34*4882a593Smuzhiyun} 35*4882a593Smuzhiyun 36*4882a593Smuzhiyunprerequisite() 37*4882a593Smuzhiyun{ 38*4882a593Smuzhiyun msg="skip all tests:" 39*4882a593Smuzhiyun if [ $UID != 0 ]; then 40*4882a593Smuzhiyun echo $msg must be run as root >&2 41*4882a593Smuzhiyun exit $ksft_skip 42*4882a593Smuzhiyun fi 43*4882a593Smuzhiyun SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'` 44*4882a593Smuzhiyun if [ ! -d "$SYSFS" ]; then 45*4882a593Smuzhiyun echo $msg sysfs is not mounted >&2 46*4882a593Smuzhiyun exit 2 47*4882a593Smuzhiyun fi 48*4882a593Smuzhiyun GPIO_SYSFS=`echo $SYSFS/class/gpio` 49*4882a593Smuzhiyun GPIO_DRV_SYSFS=`echo $SYSFS/devices/platform/$module/gpio` 50*4882a593Smuzhiyun DEBUGFS=`mount -t debugfs | head -1 | awk '{ print $3 }'` 51*4882a593Smuzhiyun if [ ! -d "$DEBUGFS" ]; then 52*4882a593Smuzhiyun echo $msg debugfs is not mounted >&2 53*4882a593Smuzhiyun exit 2 54*4882a593Smuzhiyun fi 55*4882a593Smuzhiyun GPIO_DEBUGFS=`echo $DEBUGFS/gpio` 56*4882a593Smuzhiyun source gpio-mockup-sysfs.sh 57*4882a593Smuzhiyun} 58*4882a593Smuzhiyun 59*4882a593Smuzhiyuntry_insert_module() 60*4882a593Smuzhiyun{ 61*4882a593Smuzhiyun if [ -d "$GPIO_DRV_SYSFS" ]; then 62*4882a593Smuzhiyun echo "$GPIO_DRV_SYSFS exist. Skip insert module" 63*4882a593Smuzhiyun else 64*4882a593Smuzhiyun modprobe -q $module $1 65*4882a593Smuzhiyun if [ X$? != X0 ]; then 66*4882a593Smuzhiyun echo $msg insmod $module failed >&2 67*4882a593Smuzhiyun exit 3 68*4882a593Smuzhiyun fi 69*4882a593Smuzhiyun fi 70*4882a593Smuzhiyun} 71*4882a593Smuzhiyun 72*4882a593Smuzhiyunremove_module() 73*4882a593Smuzhiyun{ 74*4882a593Smuzhiyun modprobe -r -q $module 75*4882a593Smuzhiyun} 76*4882a593Smuzhiyun 77*4882a593Smuzhiyundie() 78*4882a593Smuzhiyun{ 79*4882a593Smuzhiyun remove_module 80*4882a593Smuzhiyun exit 5 81*4882a593Smuzhiyun} 82*4882a593Smuzhiyun 83*4882a593Smuzhiyuntest_chips() 84*4882a593Smuzhiyun{ 85*4882a593Smuzhiyun if [ X$dev_type = Xsysfs ]; then 86*4882a593Smuzhiyun echo "WARNING: sysfs ABI of gpio is going to deprecated." 87*4882a593Smuzhiyun test_chips_sysfs $* 88*4882a593Smuzhiyun else 89*4882a593Smuzhiyun $BASE/gpio-mockup-chardev $* 90*4882a593Smuzhiyun fi 91*4882a593Smuzhiyun} 92*4882a593Smuzhiyun 93*4882a593Smuzhiyungpio_test() 94*4882a593Smuzhiyun{ 95*4882a593Smuzhiyun param=$1 96*4882a593Smuzhiyun valid=$2 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun if [ X"$param" = X ]; then 99*4882a593Smuzhiyun die 100*4882a593Smuzhiyun fi 101*4882a593Smuzhiyun try_insert_module "gpio_mockup_ranges=$param" 102*4882a593Smuzhiyun echo -n "GPIO $module test with ranges: <" 103*4882a593Smuzhiyun echo "$param>: " 104*4882a593Smuzhiyun printf "%-10s %s\n" $param 105*4882a593Smuzhiyun test_chips $module $valid 106*4882a593Smuzhiyun remove_module 107*4882a593Smuzhiyun} 108*4882a593Smuzhiyun 109*4882a593SmuzhiyunBASE=`dirname $0` 110*4882a593Smuzhiyun 111*4882a593Smuzhiyundev_type= 112*4882a593SmuzhiyunTEMP=`getopt -o fhm:t: -n '$0' -- "$@"` 113*4882a593Smuzhiyun 114*4882a593Smuzhiyunif [ "$?" != "0" ]; then 115*4882a593Smuzhiyun echo "Parameter process failed, Terminating..." >&2 116*4882a593Smuzhiyun exit 1 117*4882a593Smuzhiyunfi 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun# Note the quotes around `$TEMP': they are essential! 120*4882a593Smuzhiyuneval set -- "$TEMP" 121*4882a593Smuzhiyun 122*4882a593Smuzhiyunwhile true; do 123*4882a593Smuzhiyun case $1 in 124*4882a593Smuzhiyun -f) 125*4882a593Smuzhiyun full_test=true 126*4882a593Smuzhiyun shift 127*4882a593Smuzhiyun ;; 128*4882a593Smuzhiyun -h) 129*4882a593Smuzhiyun usage 130*4882a593Smuzhiyun exit 131*4882a593Smuzhiyun ;; 132*4882a593Smuzhiyun -m) 133*4882a593Smuzhiyun module=$2 134*4882a593Smuzhiyun shift 2 135*4882a593Smuzhiyun ;; 136*4882a593Smuzhiyun -t) 137*4882a593Smuzhiyun dev_type=$2 138*4882a593Smuzhiyun shift 2 139*4882a593Smuzhiyun ;; 140*4882a593Smuzhiyun --) 141*4882a593Smuzhiyun shift 142*4882a593Smuzhiyun break 143*4882a593Smuzhiyun ;; 144*4882a593Smuzhiyun *) 145*4882a593Smuzhiyun echo "Internal error!" 146*4882a593Smuzhiyun exit 1 147*4882a593Smuzhiyun ;; 148*4882a593Smuzhiyun esac 149*4882a593Smuzhiyundone 150*4882a593Smuzhiyun 151*4882a593Smuzhiyunif [ X"$module" = X ]; then 152*4882a593Smuzhiyun module="gpio-mockup" 153*4882a593Smuzhiyunfi 154*4882a593Smuzhiyun 155*4882a593Smuzhiyunif [ X$dev_type != Xsysfs ]; then 156*4882a593Smuzhiyun dev_type="chardev" 157*4882a593Smuzhiyunfi 158*4882a593Smuzhiyun 159*4882a593Smuzhiyunprerequisite 160*4882a593Smuzhiyun 161*4882a593Smuzhiyunecho "1. Test dynamic allocation of gpio successful means insert gpiochip and" 162*4882a593Smuzhiyunecho " manipulate gpio pin successful" 163*4882a593Smuzhiyungpio_test "-1,32" true 164*4882a593Smuzhiyungpio_test "-1,32,-1,32" true 165*4882a593Smuzhiyungpio_test "-1,32,-1,32,-1,32" true 166*4882a593Smuzhiyunif [ X$full_test = Xtrue ]; then 167*4882a593Smuzhiyun gpio_test "-1,32,32,64" true 168*4882a593Smuzhiyun gpio_test "-1,32,40,64,-1,5" true 169*4882a593Smuzhiyun gpio_test "-1,32,32,64,-1,32" true 170*4882a593Smuzhiyun gpio_test "0,32,32,64,-1,32,-1,32" true 171*4882a593Smuzhiyun gpio_test "-1,32,-1,32,0,32,32,64" true 172*4882a593Smuzhiyun echo "2. Do basic test: successful means insert gpiochip and" 173*4882a593Smuzhiyun echo " manipulate gpio pin successful" 174*4882a593Smuzhiyun gpio_test "0,32" true 175*4882a593Smuzhiyun gpio_test "0,32,32,64" true 176*4882a593Smuzhiyun gpio_test "0,32,40,64,64,96" true 177*4882a593Smuzhiyunfi 178*4882a593Smuzhiyunecho "3. Error test: successful means insert gpiochip failed" 179*4882a593Smuzhiyunecho "3.1 Test number of gpio overflow" 180*4882a593Smuzhiyun#Currently: The max number of gpio(1024) is defined in arm architecture. 181*4882a593Smuzhiyungpio_test "-1,32,-1,1024" false 182*4882a593Smuzhiyunif [ X$full_test = Xtrue ]; then 183*4882a593Smuzhiyun echo "3.2 Test zero line of gpio" 184*4882a593Smuzhiyun gpio_test "0,0" false 185*4882a593Smuzhiyun echo "3.3 Test range overlap" 186*4882a593Smuzhiyun echo "3.3.1 Test corner case" 187*4882a593Smuzhiyun gpio_test "0,32,0,1" false 188*4882a593Smuzhiyun gpio_test "0,32,32,64,32,40" false 189*4882a593Smuzhiyun gpio_test "0,32,35,64,35,45" false 190*4882a593Smuzhiyun gpio_test "0,32,31,32" false 191*4882a593Smuzhiyun gpio_test "0,32,32,64,36,37" false 192*4882a593Smuzhiyun gpio_test "0,32,35,64,34,36" false 193*4882a593Smuzhiyun echo "3.3.2 Test inserting invalid second gpiochip" 194*4882a593Smuzhiyun gpio_test "0,32,30,35" false 195*4882a593Smuzhiyun gpio_test "0,32,1,5" false 196*4882a593Smuzhiyun gpio_test "10,32,9,14" false 197*4882a593Smuzhiyun gpio_test "10,32,30,35" false 198*4882a593Smuzhiyun echo "3.3.3 Test others" 199*4882a593Smuzhiyun gpio_test "0,32,40,56,39,45" false 200*4882a593Smuzhiyun gpio_test "0,32,40,56,30,33" false 201*4882a593Smuzhiyun gpio_test "0,32,40,56,30,41" false 202*4882a593Smuzhiyun gpio_test "0,32,40,56,20,21" false 203*4882a593Smuzhiyunfi 204*4882a593Smuzhiyun 205*4882a593Smuzhiyunecho GPIO test PASS 206*4882a593Smuzhiyun 207