make mmc_over_gpio init uci-aware
[openwrt-10.03/.git] / package / mmc_over_gpio / files / mmc_over_gpio.init
index 88d9e410279252c81c3403c4aff383e089534b1b..121c80398c2967228ebb208bbfc651a512567bee 100644 (file)
@@ -2,24 +2,82 @@
 # Copyright (C) 2008 OpenWrt.org
 START=90
 
-SYSFS="/sys"
-SYSFS_DRIVERDIR="$SYSFS/bus/platform/drivers/spi-gpio-mmc"
+CONFIGFS_DIR="/config/gpiommc"
 
 # add_device(name, DI_pin, DO_pin, CLK_pin, CS_pin, mode)
 add_device() {
-       echo -n "$1" "$2","$3","$4","$5" "$6" > $SYSFS_DRIVERDIR/add
+       local dir="$CONFIGFS_DIR/$1"
+
+       mkdir -p $dir
+       [ $? -eq 0 ] || return 1
+       echo $2 > $dir/gpio_data_in
+       [ $? -eq 0 ] || return 1
+       echo $3 > $dir/gpio_data_out
+       [ $? -eq 0 ] || return 1
+       echo $4 > $dir/gpio_clock
+       [ $? -eq 0 ] || return 1
+       echo $5 > $dir/gpio_chipselect
+       [ $? -eq 0 ] || return 1
+       echo $6 > $dir/spi_mode
+       [ $? -eq 0 ] || return 1
+       # XXX We have more config options available. Use defaults for now.
+
+       echo 1 > $dir/register
+       [ $? -eq 0 ] || return 1
+
+       return 0
 }
 
 # remove_device(name)
 remove_device() {
-       echo -n "$1" > $SYSFS_DRIVERDIR/remove
+       local dir="$CONFIGFS_DIR/$1"
+
+       rmdir $dir
+}
+
+mount_configfs() {
+       # FIXME: This should probably be done somewhere else.
+       mount | grep configfs
+       if [ $? -eq 0 ]; then
+               # already mounted
+               return 0
+       fi
+       mkdir -p /config
+       [ $? -eq 0 ] || return 1
+       mount configfs -t configfs /config
+       [ $? -eq 0 ] || return 1
+
+       return 0
+}
+
+start_service() {
+       local section="$1"
+       config_get "name" "$section" "name"
+       config_get "DI_pin" "$section" "DI_pin"
+       config_get "DO_pin" "$section" "DO_pin"
+       config_get "CLK_pin" "$section" "CLK_pin"
+       config_get "CS_pin" "$section" "CS_pin"
+       config_get "mode" "$section" "mode"
+       config_get_bool "enabled" "$section" "enabled" '1'
+       [ "$enabled" -gt 0 ] && add_device "$name" $DI_pin $DO_pin $CLK_pin $CS_pin $mode &
+}
+
+stop_service() {
+       local section="$1"
+       config_get "name" "$section" "name"
+       remove_device "$name"
 }
 
 start() {
-       #FIXME we should use a config file, but I dunno how that parser works.
-       add_device "default" 5 4 3 7 0
+       # Make sure configfs is mounted
+       mount_configfs
+       [ $? -eq 0 ] || return 1
+
+       config_load "mmc_over_gpio"
+       config_foreach start_service "mmc_over_gpio"
 }
 
 stop() {
-       remove_device "default"
+       config_load "mmc_over_gpio"
+       config_foreach stop_service "mmc_over_gpio"
 }