1*053f45beSAndroid Build Coastguard Worker#!/bin/bash -efu 2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0 3*053f45beSAndroid Build Coastguard Worker 4*053f45beSAndroid Build Coastguard Worker#exit status 5*053f45beSAndroid Build Coastguard Worker#0: success 6*053f45beSAndroid Build Coastguard Worker#1: fail 7*053f45beSAndroid Build Coastguard Worker#4: skip test - including run as non-root user 8*053f45beSAndroid Build Coastguard Worker 9*053f45beSAndroid Build Coastguard WorkerBASE=${0%/*} 10*053f45beSAndroid Build Coastguard WorkerDEBUGFS= 11*053f45beSAndroid Build Coastguard WorkerGPIO_DEBUGFS= 12*053f45beSAndroid Build Coastguard Workerdev_type="cdev" 13*053f45beSAndroid Build Coastguard Workermodule="gpio-mockup" 14*053f45beSAndroid Build Coastguard Workerverbose= 15*053f45beSAndroid Build Coastguard Workerfull_test= 16*053f45beSAndroid Build Coastguard Workerrandom= 17*053f45beSAndroid Build Coastguard Workeruapi_opt= 18*053f45beSAndroid Build Coastguard Workeractive_opt= 19*053f45beSAndroid Build Coastguard Workerbias_opt= 20*053f45beSAndroid Build Coastguard Workerline_set_pid= 21*053f45beSAndroid Build Coastguard Worker 22*053f45beSAndroid Build Coastguard Worker# Kselftest return codes 23*053f45beSAndroid Build Coastguard Workerksft_fail=1 24*053f45beSAndroid Build Coastguard Workerksft_skip=4 25*053f45beSAndroid Build Coastguard Worker 26*053f45beSAndroid Build Coastguard Workerusage() 27*053f45beSAndroid Build Coastguard Worker{ 28*053f45beSAndroid Build Coastguard Worker echo "Usage:" 29*053f45beSAndroid Build Coastguard Worker echo "$0 [-frv] [-t type]" 30*053f45beSAndroid Build Coastguard Worker echo "-f: full test (minimal set run by default)" 31*053f45beSAndroid Build Coastguard Worker echo "-r: test random lines as well as fence posts" 32*053f45beSAndroid Build Coastguard Worker echo "-t: interface type:" 33*053f45beSAndroid Build Coastguard Worker echo " cdev (character device ABI) - default" 34*053f45beSAndroid Build Coastguard Worker echo " cdev_v1 (deprecated character device ABI)" 35*053f45beSAndroid Build Coastguard Worker echo " sysfs (deprecated SYSFS ABI)" 36*053f45beSAndroid Build Coastguard Worker echo "-v: verbose progress reporting" 37*053f45beSAndroid Build Coastguard Worker exit $ksft_fail 38*053f45beSAndroid Build Coastguard Worker} 39*053f45beSAndroid Build Coastguard Worker 40*053f45beSAndroid Build Coastguard Workerskip() 41*053f45beSAndroid Build Coastguard Worker{ 42*053f45beSAndroid Build Coastguard Worker echo "$*" >&2 43*053f45beSAndroid Build Coastguard Worker echo "GPIO $module test SKIP" 44*053f45beSAndroid Build Coastguard Worker exit $ksft_skip 45*053f45beSAndroid Build Coastguard Worker} 46*053f45beSAndroid Build Coastguard Worker 47*053f45beSAndroid Build Coastguard Workerprerequisite() 48*053f45beSAndroid Build Coastguard Worker{ 49*053f45beSAndroid Build Coastguard Worker [ $(id -u) -eq 0 ] || skip "must be run as root" 50*053f45beSAndroid Build Coastguard Worker 51*053f45beSAndroid Build Coastguard Worker DEBUGFS=$(grep -w debugfs /proc/mounts | cut -f2 -d' ') 52*053f45beSAndroid Build Coastguard Worker [ -d "$DEBUGFS" ] || skip "debugfs is not mounted" 53*053f45beSAndroid Build Coastguard Worker 54*053f45beSAndroid Build Coastguard Worker GPIO_DEBUGFS=$DEBUGFS/$module 55*053f45beSAndroid Build Coastguard Worker} 56*053f45beSAndroid Build Coastguard Worker 57*053f45beSAndroid Build Coastguard Workerremove_module() 58*053f45beSAndroid Build Coastguard Worker{ 59*053f45beSAndroid Build Coastguard Worker modprobe -r -q $module 60*053f45beSAndroid Build Coastguard Worker} 61*053f45beSAndroid Build Coastguard Worker 62*053f45beSAndroid Build Coastguard Workercleanup() 63*053f45beSAndroid Build Coastguard Worker{ 64*053f45beSAndroid Build Coastguard Worker set +e 65*053f45beSAndroid Build Coastguard Worker release_line 66*053f45beSAndroid Build Coastguard Worker remove_module 67*053f45beSAndroid Build Coastguard Worker jobs -p | xargs -r kill > /dev/null 2>&1 68*053f45beSAndroid Build Coastguard Worker} 69*053f45beSAndroid Build Coastguard Worker 70*053f45beSAndroid Build Coastguard Workerfail() 71*053f45beSAndroid Build Coastguard Worker{ 72*053f45beSAndroid Build Coastguard Worker echo "test failed: $*" >&2 73*053f45beSAndroid Build Coastguard Worker echo "GPIO $module test FAIL" 74*053f45beSAndroid Build Coastguard Worker exit $ksft_fail 75*053f45beSAndroid Build Coastguard Worker} 76*053f45beSAndroid Build Coastguard Worker 77*053f45beSAndroid Build Coastguard Workertry_insert_module() 78*053f45beSAndroid Build Coastguard Worker{ 79*053f45beSAndroid Build Coastguard Worker modprobe -q $module "$1" || fail "insert $module failed with error $?" 80*053f45beSAndroid Build Coastguard Worker} 81*053f45beSAndroid Build Coastguard Worker 82*053f45beSAndroid Build Coastguard Workerlog() 83*053f45beSAndroid Build Coastguard Worker{ 84*053f45beSAndroid Build Coastguard Worker [ -z "$verbose" ] || echo "$*" 85*053f45beSAndroid Build Coastguard Worker} 86*053f45beSAndroid Build Coastguard Worker 87*053f45beSAndroid Build Coastguard Worker# The following line helpers, release_Line, get_line and set_line, all 88*053f45beSAndroid Build Coastguard Worker# make use of the global $chip and $offset variables. 89*053f45beSAndroid Build Coastguard Worker# 90*053f45beSAndroid Build Coastguard Worker# This implementation drives the GPIO character device (cdev) uAPI. 91*053f45beSAndroid Build Coastguard Worker# Other implementations may override these to test different uAPIs. 92*053f45beSAndroid Build Coastguard Worker 93*053f45beSAndroid Build Coastguard Worker# Release any resources related to the line 94*053f45beSAndroid Build Coastguard Workerrelease_line() 95*053f45beSAndroid Build Coastguard Worker{ 96*053f45beSAndroid Build Coastguard Worker [ "$line_set_pid" ] && kill $line_set_pid && wait $line_set_pid || true 97*053f45beSAndroid Build Coastguard Worker line_set_pid= 98*053f45beSAndroid Build Coastguard Worker} 99*053f45beSAndroid Build Coastguard Worker 100*053f45beSAndroid Build Coastguard Worker# Read the current value of the line 101*053f45beSAndroid Build Coastguard Workerget_line() 102*053f45beSAndroid Build Coastguard Worker{ 103*053f45beSAndroid Build Coastguard Worker release_line 104*053f45beSAndroid Build Coastguard Worker 105*053f45beSAndroid Build Coastguard Worker local cdev_opts=${uapi_opt}${active_opt} 106*053f45beSAndroid Build Coastguard Worker $BASE/gpio-mockup-cdev $cdev_opts /dev/$chip $offset 107*053f45beSAndroid Build Coastguard Worker echo $? 108*053f45beSAndroid Build Coastguard Worker} 109*053f45beSAndroid Build Coastguard Worker 110*053f45beSAndroid Build Coastguard Worker# Set the state of the line 111*053f45beSAndroid Build Coastguard Worker# 112*053f45beSAndroid Build Coastguard Worker# Changes to line configuration are provided as parameters. 113*053f45beSAndroid Build Coastguard Worker# The line is assumed to be an output if the line value 0 or 1 is 114*053f45beSAndroid Build Coastguard Worker# specified, else an input. 115*053f45beSAndroid Build Coastguard Workerset_line() 116*053f45beSAndroid Build Coastguard Worker{ 117*053f45beSAndroid Build Coastguard Worker local val= 118*053f45beSAndroid Build Coastguard Worker 119*053f45beSAndroid Build Coastguard Worker release_line 120*053f45beSAndroid Build Coastguard Worker 121*053f45beSAndroid Build Coastguard Worker # parse config options... 122*053f45beSAndroid Build Coastguard Worker for option in $*; do 123*053f45beSAndroid Build Coastguard Worker case $option in 124*053f45beSAndroid Build Coastguard Worker active-low) 125*053f45beSAndroid Build Coastguard Worker active_opt="-l " 126*053f45beSAndroid Build Coastguard Worker ;; 127*053f45beSAndroid Build Coastguard Worker active-high) 128*053f45beSAndroid Build Coastguard Worker active_opt= 129*053f45beSAndroid Build Coastguard Worker ;; 130*053f45beSAndroid Build Coastguard Worker bias-none) 131*053f45beSAndroid Build Coastguard Worker bias_opt= 132*053f45beSAndroid Build Coastguard Worker ;; 133*053f45beSAndroid Build Coastguard Worker pull-down) 134*053f45beSAndroid Build Coastguard Worker bias_opt="-bpull-down " 135*053f45beSAndroid Build Coastguard Worker ;; 136*053f45beSAndroid Build Coastguard Worker pull-up) 137*053f45beSAndroid Build Coastguard Worker bias_opt="-bpull-up " 138*053f45beSAndroid Build Coastguard Worker ;; 139*053f45beSAndroid Build Coastguard Worker 0) 140*053f45beSAndroid Build Coastguard Worker val=0 141*053f45beSAndroid Build Coastguard Worker ;; 142*053f45beSAndroid Build Coastguard Worker 1) 143*053f45beSAndroid Build Coastguard Worker val=1 144*053f45beSAndroid Build Coastguard Worker ;; 145*053f45beSAndroid Build Coastguard Worker esac 146*053f45beSAndroid Build Coastguard Worker done 147*053f45beSAndroid Build Coastguard Worker 148*053f45beSAndroid Build Coastguard Worker local cdev_opts=${uapi_opt}${active_opt} 149*053f45beSAndroid Build Coastguard Worker if [ "$val" ]; then 150*053f45beSAndroid Build Coastguard Worker $BASE/gpio-mockup-cdev $cdev_opts -s$val /dev/$chip $offset & 151*053f45beSAndroid Build Coastguard Worker # failure to set is detected by reading mockup and toggling values 152*053f45beSAndroid Build Coastguard Worker line_set_pid=$! 153*053f45beSAndroid Build Coastguard Worker # allow for gpio-mockup-cdev to launch and request line 154*053f45beSAndroid Build Coastguard Worker # (there is limited value in checking if line has been requested) 155*053f45beSAndroid Build Coastguard Worker sleep 0.01 156*053f45beSAndroid Build Coastguard Worker elif [ "$bias_opt" ]; then 157*053f45beSAndroid Build Coastguard Worker cdev_opts=${cdev_opts}${bias_opt} 158*053f45beSAndroid Build Coastguard Worker $BASE/gpio-mockup-cdev $cdev_opts /dev/$chip $offset || true 159*053f45beSAndroid Build Coastguard Worker fi 160*053f45beSAndroid Build Coastguard Worker} 161*053f45beSAndroid Build Coastguard Worker 162*053f45beSAndroid Build Coastguard Workerassert_line() 163*053f45beSAndroid Build Coastguard Worker{ 164*053f45beSAndroid Build Coastguard Worker local val 165*053f45beSAndroid Build Coastguard Worker # don't need any retry here as set_mock allows for propagation 166*053f45beSAndroid Build Coastguard Worker val=$(get_line) 167*053f45beSAndroid Build Coastguard Worker [ "$val" = "$1" ] || fail "line value is ${val:-empty} when $1 was expected" 168*053f45beSAndroid Build Coastguard Worker} 169*053f45beSAndroid Build Coastguard Worker 170*053f45beSAndroid Build Coastguard Worker# The following mockup helpers all make use of the $mock_line 171*053f45beSAndroid Build Coastguard Workerassert_mock() 172*053f45beSAndroid Build Coastguard Worker{ 173*053f45beSAndroid Build Coastguard Worker local backoff_wait=10 174*053f45beSAndroid Build Coastguard Worker local retry=0 175*053f45beSAndroid Build Coastguard Worker local val 176*053f45beSAndroid Build Coastguard Worker # retry allows for set propagation from uAPI to mockup 177*053f45beSAndroid Build Coastguard Worker while true; do 178*053f45beSAndroid Build Coastguard Worker val=$(< $mock_line) 179*053f45beSAndroid Build Coastguard Worker [ "$val" = "$1" ] && break 180*053f45beSAndroid Build Coastguard Worker retry=$((retry + 1)) 181*053f45beSAndroid Build Coastguard Worker [ $retry -lt 5 ] || fail "mockup $mock_line value ${val:-empty} when $1 expected" 182*053f45beSAndroid Build Coastguard Worker sleep $(printf "%0.2f" $((backoff_wait))e-3) 183*053f45beSAndroid Build Coastguard Worker backoff_wait=$((backoff_wait * 2)) 184*053f45beSAndroid Build Coastguard Worker done 185*053f45beSAndroid Build Coastguard Worker} 186*053f45beSAndroid Build Coastguard Worker 187*053f45beSAndroid Build Coastguard Workerset_mock() 188*053f45beSAndroid Build Coastguard Worker{ 189*053f45beSAndroid Build Coastguard Worker echo "$1" > $mock_line 190*053f45beSAndroid Build Coastguard Worker # allow for set propagation - so we won't be in a race with set_line 191*053f45beSAndroid Build Coastguard Worker assert_mock "$1" 192*053f45beSAndroid Build Coastguard Worker} 193*053f45beSAndroid Build Coastguard Worker 194*053f45beSAndroid Build Coastguard Worker# test the functionality of a line 195*053f45beSAndroid Build Coastguard Worker# 196*053f45beSAndroid Build Coastguard Worker# The line is set from the mockup side and is read from the userspace side 197*053f45beSAndroid Build Coastguard Worker# (input), and is set from the userspace side and is read from the mockup side 198*053f45beSAndroid Build Coastguard Worker# (output). 199*053f45beSAndroid Build Coastguard Worker# 200*053f45beSAndroid Build Coastguard Worker# Setting the mockup pull using the userspace interface bias settings is 201*053f45beSAndroid Build Coastguard Worker# tested where supported by the userspace interface (cdev). 202*053f45beSAndroid Build Coastguard Workertest_line() 203*053f45beSAndroid Build Coastguard Worker{ 204*053f45beSAndroid Build Coastguard Worker chip=$1 205*053f45beSAndroid Build Coastguard Worker offset=$2 206*053f45beSAndroid Build Coastguard Worker log "test_line $chip $offset" 207*053f45beSAndroid Build Coastguard Worker mock_line=$GPIO_DEBUGFS/$chip/$offset 208*053f45beSAndroid Build Coastguard Worker [ -e "$mock_line" ] || fail "missing line $chip:$offset" 209*053f45beSAndroid Build Coastguard Worker 210*053f45beSAndroid Build Coastguard Worker # test input active-high 211*053f45beSAndroid Build Coastguard Worker set_mock 1 212*053f45beSAndroid Build Coastguard Worker set_line input active-high 213*053f45beSAndroid Build Coastguard Worker assert_line 1 214*053f45beSAndroid Build Coastguard Worker set_mock 0 215*053f45beSAndroid Build Coastguard Worker assert_line 0 216*053f45beSAndroid Build Coastguard Worker set_mock 1 217*053f45beSAndroid Build Coastguard Worker assert_line 1 218*053f45beSAndroid Build Coastguard Worker 219*053f45beSAndroid Build Coastguard Worker if [ "$full_test" ]; then 220*053f45beSAndroid Build Coastguard Worker if [ "$dev_type" != "sysfs" ]; then 221*053f45beSAndroid Build Coastguard Worker # test pulls 222*053f45beSAndroid Build Coastguard Worker set_mock 0 223*053f45beSAndroid Build Coastguard Worker set_line input pull-up 224*053f45beSAndroid Build Coastguard Worker assert_line 1 225*053f45beSAndroid Build Coastguard Worker set_mock 0 226*053f45beSAndroid Build Coastguard Worker assert_line 0 227*053f45beSAndroid Build Coastguard Worker 228*053f45beSAndroid Build Coastguard Worker set_mock 1 229*053f45beSAndroid Build Coastguard Worker set_line input pull-down 230*053f45beSAndroid Build Coastguard Worker assert_line 0 231*053f45beSAndroid Build Coastguard Worker set_mock 1 232*053f45beSAndroid Build Coastguard Worker assert_line 1 233*053f45beSAndroid Build Coastguard Worker 234*053f45beSAndroid Build Coastguard Worker set_line bias-none 235*053f45beSAndroid Build Coastguard Worker fi 236*053f45beSAndroid Build Coastguard Worker 237*053f45beSAndroid Build Coastguard Worker # test input active-low 238*053f45beSAndroid Build Coastguard Worker set_mock 0 239*053f45beSAndroid Build Coastguard Worker set_line active-low 240*053f45beSAndroid Build Coastguard Worker assert_line 1 241*053f45beSAndroid Build Coastguard Worker set_mock 1 242*053f45beSAndroid Build Coastguard Worker assert_line 0 243*053f45beSAndroid Build Coastguard Worker set_mock 0 244*053f45beSAndroid Build Coastguard Worker assert_line 1 245*053f45beSAndroid Build Coastguard Worker 246*053f45beSAndroid Build Coastguard Worker # test output active-high 247*053f45beSAndroid Build Coastguard Worker set_mock 1 248*053f45beSAndroid Build Coastguard Worker set_line active-high 0 249*053f45beSAndroid Build Coastguard Worker assert_mock 0 250*053f45beSAndroid Build Coastguard Worker set_line 1 251*053f45beSAndroid Build Coastguard Worker assert_mock 1 252*053f45beSAndroid Build Coastguard Worker set_line 0 253*053f45beSAndroid Build Coastguard Worker assert_mock 0 254*053f45beSAndroid Build Coastguard Worker fi 255*053f45beSAndroid Build Coastguard Worker 256*053f45beSAndroid Build Coastguard Worker # test output active-low 257*053f45beSAndroid Build Coastguard Worker set_mock 0 258*053f45beSAndroid Build Coastguard Worker set_line active-low 0 259*053f45beSAndroid Build Coastguard Worker assert_mock 1 260*053f45beSAndroid Build Coastguard Worker set_line 1 261*053f45beSAndroid Build Coastguard Worker assert_mock 0 262*053f45beSAndroid Build Coastguard Worker set_line 0 263*053f45beSAndroid Build Coastguard Worker assert_mock 1 264*053f45beSAndroid Build Coastguard Worker 265*053f45beSAndroid Build Coastguard Worker release_line 266*053f45beSAndroid Build Coastguard Worker} 267*053f45beSAndroid Build Coastguard Worker 268*053f45beSAndroid Build Coastguard Workertest_no_line() 269*053f45beSAndroid Build Coastguard Worker{ 270*053f45beSAndroid Build Coastguard Worker log test_no_line "$*" 271*053f45beSAndroid Build Coastguard Worker [ ! -e "$GPIO_DEBUGFS/$1/$2" ] || fail "unexpected line $1:$2" 272*053f45beSAndroid Build Coastguard Worker} 273*053f45beSAndroid Build Coastguard Worker 274*053f45beSAndroid Build Coastguard Worker# Load the module and check that the expected number of gpiochips, with the 275*053f45beSAndroid Build Coastguard Worker# expected number of lines, are created and are functional. 276*053f45beSAndroid Build Coastguard Worker# 277*053f45beSAndroid Build Coastguard Worker# $1 is the gpio_mockup_ranges parameter for the module 278*053f45beSAndroid Build Coastguard Worker# The remaining parameters are the number of lines, n, expected for each of 279*053f45beSAndroid Build Coastguard Worker# the gpiochips expected to be created. 280*053f45beSAndroid Build Coastguard Worker# 281*053f45beSAndroid Build Coastguard Worker# For each gpiochip the fence post lines, 0 and n-1, are tested, and the 282*053f45beSAndroid Build Coastguard Worker# line on the far side of the fence post, n, is tested to not exist. 283*053f45beSAndroid Build Coastguard Worker# 284*053f45beSAndroid Build Coastguard Worker# If the $random flag is set then a random line in the middle of the 285*053f45beSAndroid Build Coastguard Worker# gpiochip is tested as well. 286*053f45beSAndroid Build Coastguard Workerinsmod_test() 287*053f45beSAndroid Build Coastguard Worker{ 288*053f45beSAndroid Build Coastguard Worker local ranges= 289*053f45beSAndroid Build Coastguard Worker local gc= 290*053f45beSAndroid Build Coastguard Worker local width= 291*053f45beSAndroid Build Coastguard Worker 292*053f45beSAndroid Build Coastguard Worker [ "${1:-}" ] || fail "missing ranges" 293*053f45beSAndroid Build Coastguard Worker ranges=$1 ; shift 294*053f45beSAndroid Build Coastguard Worker try_insert_module "gpio_mockup_ranges=$ranges" 295*053f45beSAndroid Build Coastguard Worker log "GPIO $module test with ranges: <$ranges>:" 296*053f45beSAndroid Build Coastguard Worker # e.g. /sys/kernel/debug/gpio-mockup/gpiochip1 297*053f45beSAndroid Build Coastguard Worker gpiochip=$(find "$DEBUGFS/$module/" -name gpiochip* -type d | sort) 298*053f45beSAndroid Build Coastguard Worker for chip in $gpiochip; do 299*053f45beSAndroid Build Coastguard Worker gc=${chip##*/} 300*053f45beSAndroid Build Coastguard Worker [ "${1:-}" ] || fail "unexpected chip - $gc" 301*053f45beSAndroid Build Coastguard Worker width=$1 ; shift 302*053f45beSAndroid Build Coastguard Worker test_line $gc 0 303*053f45beSAndroid Build Coastguard Worker if [ "$random" -a $width -gt 2 ]; then 304*053f45beSAndroid Build Coastguard Worker test_line $gc $((RANDOM % ($width - 2) + 1)) 305*053f45beSAndroid Build Coastguard Worker fi 306*053f45beSAndroid Build Coastguard Worker test_line $gc $(($width - 1)) 307*053f45beSAndroid Build Coastguard Worker test_no_line $gc $width 308*053f45beSAndroid Build Coastguard Worker done 309*053f45beSAndroid Build Coastguard Worker [ "${1:-}" ] && fail "missing expected chip of width $1" 310*053f45beSAndroid Build Coastguard Worker remove_module || fail "failed to remove module with error $?" 311*053f45beSAndroid Build Coastguard Worker} 312*053f45beSAndroid Build Coastguard Worker 313*053f45beSAndroid Build Coastguard Workerwhile getopts ":frvt:" opt; do 314*053f45beSAndroid Build Coastguard Worker case $opt in 315*053f45beSAndroid Build Coastguard Worker f) 316*053f45beSAndroid Build Coastguard Worker full_test=true 317*053f45beSAndroid Build Coastguard Worker ;; 318*053f45beSAndroid Build Coastguard Worker r) 319*053f45beSAndroid Build Coastguard Worker random=true 320*053f45beSAndroid Build Coastguard Worker ;; 321*053f45beSAndroid Build Coastguard Worker t) 322*053f45beSAndroid Build Coastguard Worker dev_type=$OPTARG 323*053f45beSAndroid Build Coastguard Worker ;; 324*053f45beSAndroid Build Coastguard Worker v) 325*053f45beSAndroid Build Coastguard Worker verbose=true 326*053f45beSAndroid Build Coastguard Worker ;; 327*053f45beSAndroid Build Coastguard Worker *) 328*053f45beSAndroid Build Coastguard Worker usage 329*053f45beSAndroid Build Coastguard Worker ;; 330*053f45beSAndroid Build Coastguard Worker esac 331*053f45beSAndroid Build Coastguard Workerdone 332*053f45beSAndroid Build Coastguard Workershift $((OPTIND - 1)) 333*053f45beSAndroid Build Coastguard Worker 334*053f45beSAndroid Build Coastguard Worker[ "${1:-}" ] && fail "unknown argument '$1'" 335*053f45beSAndroid Build Coastguard Worker 336*053f45beSAndroid Build Coastguard Workerprerequisite 337*053f45beSAndroid Build Coastguard Worker 338*053f45beSAndroid Build Coastguard Workertrap 'exit $ksft_fail' SIGTERM SIGINT 339*053f45beSAndroid Build Coastguard Workertrap cleanup EXIT 340*053f45beSAndroid Build Coastguard Worker 341*053f45beSAndroid Build Coastguard Workercase "$dev_type" in 342*053f45beSAndroid Build Coastguard Workersysfs) 343*053f45beSAndroid Build Coastguard Worker source $BASE/gpio-mockup-sysfs.sh 344*053f45beSAndroid Build Coastguard Worker echo "WARNING: gpio sysfs ABI is deprecated." 345*053f45beSAndroid Build Coastguard Worker ;; 346*053f45beSAndroid Build Coastguard Workercdev_v1) 347*053f45beSAndroid Build Coastguard Worker echo "WARNING: gpio cdev ABI v1 is deprecated." 348*053f45beSAndroid Build Coastguard Worker uapi_opt="-u1 " 349*053f45beSAndroid Build Coastguard Worker ;; 350*053f45beSAndroid Build Coastguard Workercdev) 351*053f45beSAndroid Build Coastguard Worker ;; 352*053f45beSAndroid Build Coastguard Worker*) 353*053f45beSAndroid Build Coastguard Worker fail "unknown interface type: $dev_type" 354*053f45beSAndroid Build Coastguard Worker ;; 355*053f45beSAndroid Build Coastguard Workeresac 356*053f45beSAndroid Build Coastguard Worker 357*053f45beSAndroid Build Coastguard Workerremove_module || fail "can't remove existing $module module" 358*053f45beSAndroid Build Coastguard Worker 359*053f45beSAndroid Build Coastguard Worker# manual gpio allocation tests fail if a physical chip already exists 360*053f45beSAndroid Build Coastguard Worker[ "$full_test" -a -e "/dev/gpiochip0" ] && skip "full tests conflict with gpiochip0" 361*053f45beSAndroid Build Coastguard Worker 362*053f45beSAndroid Build Coastguard Workerecho "1. Module load tests" 363*053f45beSAndroid Build Coastguard Workerecho "1.1. dynamic allocation of gpio" 364*053f45beSAndroid Build Coastguard Workerinsmod_test "-1,32" 32 365*053f45beSAndroid Build Coastguard Workerinsmod_test "-1,23,-1,32" 23 32 366*053f45beSAndroid Build Coastguard Workerinsmod_test "-1,23,-1,26,-1,32" 23 26 32 367*053f45beSAndroid Build Coastguard Workerif [ "$full_test" ]; then 368*053f45beSAndroid Build Coastguard Worker echo "1.2. manual allocation of gpio" 369*053f45beSAndroid Build Coastguard Worker insmod_test "0,32" 32 370*053f45beSAndroid Build Coastguard Worker insmod_test "0,32,32,60" 32 28 371*053f45beSAndroid Build Coastguard Worker insmod_test "0,32,40,64,64,96" 32 24 32 372*053f45beSAndroid Build Coastguard Worker echo "1.3. dynamic and manual allocation of gpio" 373*053f45beSAndroid Build Coastguard Worker insmod_test "-1,32,32,62" 32 30 374*053f45beSAndroid Build Coastguard Worker insmod_test "-1,22,-1,23,0,24,32,64" 22 23 24 32 375*053f45beSAndroid Build Coastguard Worker insmod_test "-1,32,32,60,-1,29" 32 28 29 376*053f45beSAndroid Build Coastguard Worker insmod_test "-1,32,40,64,-1,5" 32 24 5 377*053f45beSAndroid Build Coastguard Worker insmod_test "0,32,32,44,-1,22,-1,31" 32 12 22 31 378*053f45beSAndroid Build Coastguard Workerfi 379*053f45beSAndroid Build Coastguard Workerecho "2. Module load error tests" 380*053f45beSAndroid Build Coastguard Workerecho "2.1 gpio overflow" 381*053f45beSAndroid Build Coastguard Worker# Currently: The max number of gpio(1024) is defined in arm architecture. 382*053f45beSAndroid Build Coastguard Workerinsmod_test "-1,1024" 383*053f45beSAndroid Build Coastguard Workerif [ "$full_test" ]; then 384*053f45beSAndroid Build Coastguard Worker echo "2.2 no lines defined" 385*053f45beSAndroid Build Coastguard Worker insmod_test "0,0" 386*053f45beSAndroid Build Coastguard Worker echo "2.3 ignore range overlap" 387*053f45beSAndroid Build Coastguard Worker insmod_test "0,32,0,1" 32 388*053f45beSAndroid Build Coastguard Worker insmod_test "0,32,1,5" 32 389*053f45beSAndroid Build Coastguard Worker insmod_test "0,32,30,35" 32 390*053f45beSAndroid Build Coastguard Worker insmod_test "0,32,31,32" 32 391*053f45beSAndroid Build Coastguard Worker insmod_test "10,32,30,35" 22 392*053f45beSAndroid Build Coastguard Worker insmod_test "10,32,9,14" 22 393*053f45beSAndroid Build Coastguard Worker insmod_test "0,32,20,21,40,56" 32 16 394*053f45beSAndroid Build Coastguard Worker insmod_test "0,32,32,64,32,40" 32 32 395*053f45beSAndroid Build Coastguard Worker insmod_test "0,32,32,64,36,37" 32 32 396*053f45beSAndroid Build Coastguard Worker insmod_test "0,32,35,64,34,36" 32 29 397*053f45beSAndroid Build Coastguard Worker insmod_test "0,30,35,64,35,45" 30 29 398*053f45beSAndroid Build Coastguard Worker insmod_test "0,32,40,56,30,33" 32 16 399*053f45beSAndroid Build Coastguard Worker insmod_test "0,32,40,56,30,41" 32 16 400*053f45beSAndroid Build Coastguard Worker insmod_test "0,32,40,56,39,45" 32 16 401*053f45beSAndroid Build Coastguard Workerfi 402*053f45beSAndroid Build Coastguard Worker 403*053f45beSAndroid Build Coastguard Workerecho "GPIO $module test PASS" 404