source cpufreq.sh
 source governor.sh
 source module.sh
+source special-tests.sh
 
 FUNC=basic     # do basic tests by default
 OUTFILE=cpufreq_selftest
        [-t <basic: Basic cpufreq testing
             suspend: suspend/resume,
             hibernate: hibernate/resume,
-            modtest: test driver or governor modules. Only to be used with -d or -g options>]
+            modtest: test driver or governor modules. Only to be used with -d or -g options,
+            sptest1: Simple governor switch to produce lockdep.
+            sptest2: Concurrent governor switch to produce lockdep.
+            sptest3: Governor races, shuffle between governors quickly.
+            sptest4: CPU hotplugs with updates to cpufreq files.>]
        [-d <driver's module name: only with \"-t modtest>\"]
        [-g <governor's module name: only with \"-t modtest>\"]
        \n"
                                helpme
                                ;;
 
-                       t) # --func_type (Function to perform: basic, suspend, hibernate, modtest (default: basic))
+                       t) # --func_type (Function to perform: basic, suspend, hibernate, modtest, sptest1/2/3/4 (default: basic))
                                FUNC=$OPTARG
                                ;;
 
                fi
                ;;
 
+               "sptest1")
+               simple_lockdep
+               ;;
+
+               "sptest2")
+               concurrent_lockdep
+               ;;
+
+               "sptest3")
+               governor_race
+               ;;
+
+               "sptest4")
+               hotplug_with_updates
+               ;;
+
                *)
                echo "Invalid [-f] function type"
                helpme
 
--- /dev/null
+#!/bin/bash
+#
+# Special test cases reported by people
+
+# Testcase 1: Reported here: http://marc.info/?l=linux-pm&m=140618592709858&w=2
+
+# protect against multiple inclusion
+if [ $FILE_SPECIAL ]; then
+       return 0
+else
+       FILE_SPECIAL=DONE
+fi
+
+source cpu.sh
+source cpufreq.sh
+source governor.sh
+
+# Test 1
+# $1: policy
+__simple_lockdep()
+{
+       # switch to ondemand
+       __switch_governor $1 "ondemand"
+
+       # cat ondemand files
+       local ondir=$(find_gov_directory $1 "ondemand")
+       if [ -z $ondir ]; then
+               printf "${FUNCNAME[0]}Ondemand directory not created, quit"
+               return
+       fi
+
+       cat $ondir/*
+
+       # switch to conservative
+       __switch_governor $1 "conservative"
+}
+
+simple_lockdep()
+{
+       printf "** Test: Running ${FUNCNAME[0]} **\n"
+
+       for_each_policy __simple_lockdep
+}
+
+# Test 2
+# $1: policy
+__concurrent_lockdep()
+{
+       for i in `seq 0 100`; do
+               __simple_lockdep $1
+       done
+}
+
+concurrent_lockdep()
+{
+       printf "** Test: Running ${FUNCNAME[0]} **\n"
+
+       for_each_policy_concurrent __concurrent_lockdep
+}
+
+# Test 3
+quick_shuffle()
+{
+       # this is called concurrently from governor_race
+       for I in `seq 1000`
+       do
+               echo ondemand | sudo tee $CPUFREQROOT/policy*/scaling_governor &
+               echo userspace | sudo tee $CPUFREQROOT/policy*/scaling_governor &
+       done
+}
+
+governor_race()
+{
+       printf "** Test: Running ${FUNCNAME[0]} **\n"
+
+       # run 8 concurrent instances
+       for I in `seq 8`
+       do
+               quick_shuffle &
+       done
+}
+
+# Test 4
+# $1: cpu
+hotplug_with_updates_cpu()
+{
+       local filepath="$CPUROOT/$1/cpufreq"
+
+       # switch to ondemand
+       __switch_governor_for_cpu $1 "ondemand"
+
+       for i in `seq 1 5000`
+       do
+               reboot_cpu $1
+       done &
+
+       local freqs=$(cat $filepath/scaling_available_frequencies)
+       local oldfreq=$(cat $filepath/scaling_min_freq)
+
+       for j in `seq 1 5000`
+       do
+               # Set all frequencies one-by-one
+               for freq in $freqs; do
+                       echo $freq > $filepath/scaling_min_freq
+               done
+       done
+
+       # restore old freq
+       echo $oldfreq > $filepath/scaling_min_freq
+}
+
+hotplug_with_updates()
+{
+       for_each_non_boot_cpu hotplug_with_updates_cpu
+}