diff options
author | Kyle Nieman <kyle.nieman@fii-na.com> | 2022-10-20 17:33:08 +0300 |
---|---|---|
committer | Vivekanand Veeracholan <vveerach@google.com> | 2023-03-02 04:02:02 +0300 |
commit | 8fae1c8ea9c2645c10f4e9bc19c9d43e660a4315 (patch) | |
tree | 622afe4a47698beb11346959cc415dbee2a9c898 /meta-fii/meta-mori/recipes-mori | |
parent | 70d6a28404bf98d5b209f67fe3dcc5b78d1ecc44 (diff) | |
download | openbmc-8fae1c8ea9c2645c10f4e9bc19c9d43e660a4315.tar.xz |
meta-fii: meta-mori: Fix mori-lib.sh gpio functions
The functions in mori-lib.sh return the wrong values for get_gpio_num
and get_gpio_ctrl. get_gpio_num is not prepared to handle a device that
has more than 1 gpiobank associated with it. get_gpio_ctrl is dependent
on get_gpio_num to retrieve the correct identifying number for the gpio,
and the path location of the gpio state differs for gpios added by some
devices compared to the norm. mori-lib.sh is modify to account for these
differences.
Tested: I ran on real machine and checked that a gpio added by each type
of device is capable of being read with get_gpio_ctrl without error.
Signed-off-by: Kyle Nieman <kyle.nieman@fii-na.com>
Change-Id: I212ae4f14bbb57b9643befd0aadd8ac5ef4726da
Diffstat (limited to 'meta-fii/meta-mori/recipes-mori')
-rw-r--r-- | meta-fii/meta-mori/recipes-mori/mori-fw-utility/mori-fw/mori-lib.sh | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/meta-fii/meta-mori/recipes-mori/mori-fw-utility/mori-fw/mori-lib.sh b/meta-fii/meta-mori/recipes-mori/mori-fw-utility/mori-fw/mori-lib.sh index e96b329db2..305432169f 100644 --- a/meta-fii/meta-mori/recipes-mori/mori-fw-utility/mori-fw/mori-lib.sh +++ b/meta-fii/meta-mori/recipes-mori/mori-fw-utility/mori-fw/mori-lib.sh @@ -16,8 +16,30 @@ function get_gpio_num() { fi if [ "${CHIP_PIN[0]}" -gt 7 ]; then - BUS_ADDR=$(gpiodetect | grep gpiochip"${CHIP_PIN[0]}" | awk '{print substr($2, 2, length($2) - 2)}') - GPIO_BASE=$(cat /sys/bus/i2c/devices/"$BUS_ADDR"/gpio/*/base) + BUS_ADDR=$(gpiodetect | grep gpiochip"${CHIP_PIN[0]}" | \ + grep -o '\[.*]' | tr -d ' \[\]') + GPIO_BASE_DIR=$(cd /sys/bus/i2c/devices/"$BUS_ADDR"/gpio/ || \ + exit; ls -1 -v) + # Check that there is a single gpiobank per i2c device + GPIO_BANKS=$(cd /sys/bus/i2c/devices/"$BUS_ADDR"/ || \ + exit ; ls -1 -d -v gpiochip*) + # Determine which GPIO_BASE to use based on the place of the GPIO_BANK + # in comparision to GPIO_BANKS + # gpiochip# is set in reverse order of numbering for location of + # GPIO_BASE_DIR + count=$(echo "$GPIO_BANKS" | wc -w) + for X in ${GPIO_BANKS} + do + if [[ $(gpiofind "$1" | cut -d " " -f 1) == "$X" ]]; then + # Used to select the correct GPIO_BASE value + #shellcheck disable=SC2086 + GPIO_BASE_DIR=$(echo ${GPIO_BASE_DIR} | cut -d " " -f $count) + break + fi + count=$((count-1)) + done + tmp="/sys/bus/i2c/devices/$BUS_ADDR/gpio/${GPIO_BASE_DIR[0]}/base" + GPIO_BASE=$(cat "$tmp") echo "$((GPIO_BASE+CHIP_PIN[1]))" else echo "$((CHIP_PIN[0]*32+CHIP_PIN[1]))" @@ -36,7 +58,12 @@ function set_gpio_ctrl() { function get_gpio_ctrl() { GPIO_NUM=$(get_gpio_num "$1") echo "$GPIO_NUM" > /sys/class/gpio/export - cat /sys/class/gpio/gpio"$GPIO_NUM"/value + # GPIOs added by drivers use different path for value most but not all + # drivers follow this trend + # Try reading like traditional GPIO, if fails, try reading in driver format + if ! cat /sys/class/gpio/gpio"$GPIO_NUM"/value 2> /dev/null ; then + cat /sys/class/gpio/"$1"/value + fi echo "$GPIO_NUM" > /sys/class/gpio/unexport } |