summaryrefslogtreecommitdiff
path: root/meta-fii/meta-mori/recipes-mori
diff options
context:
space:
mode:
authorKyle Nieman <kyle.nieman@fii-na.com>2022-10-20 17:33:08 +0300
committerVivekanand Veeracholan <vveerach@google.com>2023-03-02 04:02:02 +0300
commit8fae1c8ea9c2645c10f4e9bc19c9d43e660a4315 (patch)
tree622afe4a47698beb11346959cc415dbee2a9c898 /meta-fii/meta-mori/recipes-mori
parent70d6a28404bf98d5b209f67fe3dcc5b78d1ecc44 (diff)
downloadopenbmc-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.sh33
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
}