I took a long look at the original jmb38x_d3e.sh from linpus linux lite and did some modifications.
If you start it with ‘watch’ it will put the card into powersaving (d3e?) mode, only if the laptop is on battery and no cards have been inserted.
I still have to suspend/resume before any cards, inserted after boot, are recognized.
#!/bin/bash
logger="/usr/bin/logger -t jmb38x"
lsmod="/sbin/lsmod"
# Setup delay time (minutes)
delay=5
function chk_pciehp ()
{
check=`$lsmod | grep pciehp`
if [ -z "$check" ] ; then
$logger "Loading PCIe Hotplug driver..."
modprobe pciehp
else
$logger "PCIe Hotplug driver already loaded."
fi
}
function scan_dev ()
{
i=1
host=`lspci -d 197b:2382 | wc -l`
while [ $i -le $host ]
do
dev[$i]=`lspci -d 197b:2382 | awk '{print $1}' | head -n$i | tail -n1`
# echo ${dev[$i]}
i=`echo "$i+1" | bc`
done
}
function d3e ()
{
i=1
while [ $i -le $host ]; do
dev=${dev[$i]}
if [ -z "$dev" ] ; then
$logger "JMicron JMB38x not found!"
else
# d3e = powermanagemnt??
if lspci -s $dev -xxx | grep e0: | awk '{print $3}' | egrep -q "^[0-f]c$"; then
setpci -s $dev D4=10:F0
setpci -s $dev AD=FF
setpci -s $dev AE=69
$logger "JMB38X D3e function is enabled!"
else
$logger "There is a card inserted!"
fi
fi
i=`echo "$i+1" | bc`
done
}
function remove_mmc_modules ()
{
$logger "removing modules!"
rmmod sdhci
rmmod mmc_block
rmmod mmc_core
}
function enable_mmc_modules ()
{
for mod in mmc_core mmc_block sdhci; do
if ! $lsmod | grep -q $mod; then
$logger "enabling $mod"
modprobe $mod
fi
done
}
function poll ()
{
i=1
time=`echo "$delay*60" | bc`
while :
do
scan_dev
if [ -f /sys/bus/usb/devices/1-5/power/level ]; then
echo auto > /sys/bus/usb/devices/1-5/power/level
fi
if [ -f /sys/bus/usb/devices/5-5/power/level ]; then
echo auto > /sys/bus/usb/devices/5-5/power/level
fi
sleep $time
# laptop on battery and no card inserted => d3e
if /usr/bin/acpi -a | grep -q " off-line$"; then
d3e
else
enable_mmc_modules
fi
done
}
function main ()
{
chk_pciehp
poll
}
case "$1" in
watch)
main
;;
start)
chk_pciehp
enable_mmc_modules
;;
stop)
remove_mmc_modules
;;
restart)
remove_mmc_modules
enable_mmc_modules
;;
*)
echo "usage: $0 [watch|start|stop|restart]"
exit 1
;;
esac
Posted by kodos