From c0c74e7cca35179a9c4496a49f64e00db4c47870 Mon Sep 17 00:00:00 2001 From: Anthony Wilson Date: Wed, 6 Mar 2019 10:54:58 -0600 Subject: skeleton: Use ioctl gpio handling Now that chassiskill is a standalone app and is using ioctl gpio handling (through the gpioplus library), the gpio libraries here need to use ioctl as well for chassiskill to be compatible. Tested: Verified chassiskill works as intended and checked that nothing else broke. Change-Id: I67c431027d31e87c332c3e1771fc2d3423f56652 Signed-off-by: Anthony Wilson --- op-pwrctl/power_control_obj.c | 50 ++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 20 deletions(-) (limited to 'op-pwrctl/power_control_obj.c') diff --git a/op-pwrctl/power_control_obj.c b/op-pwrctl/power_control_obj.c index dedcbe2..ada9b3b 100644 --- a/op-pwrctl/power_control_obj.c +++ b/op-pwrctl/power_control_obj.c @@ -52,8 +52,9 @@ poll_pgood(gpointer user_data) } uint8_t pgood_state; - int rc = gpio_open(&g_gpio_configs.power_gpio.power_good_in); + int rc = gpio_open(&g_gpio_configs.power_gpio.power_good_in, 0); if(rc != GPIO_OK) { + gpio_close(&g_gpio_configs.power_gpio.power_good_in); g_print("ERROR PowerControl: GPIO open error (gpio=%s,rc=%d)\n", g_gpio_configs.power_gpio.power_good_in.name, rc); return FALSE; @@ -81,15 +82,16 @@ poll_pgood(gpointer user_data) for(i = 0; i < g_gpio_configs.power_gpio.num_reset_outs; i++) { GPIO *reset_out = &g_gpio_configs.power_gpio.reset_outs[i]; - rc = gpio_open(reset_out); + reset_state = pgood_state ^ g_gpio_configs.power_gpio.reset_pols[i]; + rc = gpio_open(reset_out, reset_state); if(rc != GPIO_OK) { + gpio_close(reset_out); g_print("ERROR PowerControl: GPIO open error (gpio=%s,rc=%d)\n", reset_out->name, rc); continue; } - reset_state = pgood_state ^ g_gpio_configs.power_gpio.reset_pols[i]; g_print("PowerControl: pgood: %d, setting reset %s to %d\n", (int)pgood_state, reset_out->name, (int)reset_state); gpio_write(reset_out, reset_state); @@ -111,15 +113,16 @@ poll_pgood(gpointer user_data) continue; } } - rc = gpio_open(pci_reset_out); + reset_state = pgood_state ^ g_gpio_configs.power_gpio.pci_reset_pols[i]; + rc = gpio_open(pci_reset_out, reset_state); if(rc != GPIO_OK) { + gpio_close(pci_reset_out); g_print("ERROR PowerControl: GPIO open error (gpio=%s,rc=%d)\n", pci_reset_out->name, rc); continue; } - reset_state = pgood_state ^ g_gpio_configs.power_gpio.pci_reset_pols[i]; g_print("PowerControl: pgood: %d, setting pci reset %s to %d\n", (int)pgood_state, pci_reset_out->name, (int)reset_state); gpio_write(pci_reset_out, reset_state); @@ -202,9 +205,10 @@ on_boot_progress(GDBusConnection *connection, if (ignore) return; - rc = gpio_open(&g_gpio_configs.power_gpio.power_good_in); + rc = gpio_open(&g_gpio_configs.power_gpio.power_good_in, 0); if(rc != GPIO_OK) { + gpio_close(&g_gpio_configs.power_gpio.power_good_in); g_print("ERROR PowerControl: on_boot_progress(): GPIO open error (gpio=%s,rc=%d)\n", g_gpio_configs.power_gpio.power_good_in.name, rc); return; @@ -220,15 +224,16 @@ on_boot_progress(GDBusConnection *connection, if(!g_gpio_configs.power_gpio.pci_reset_holds[i]) continue; - rc = gpio_open(pci_reset_out); + reset_state = pgood_state ^ g_gpio_configs.power_gpio.pci_reset_pols[i]; + rc = gpio_open(pci_reset_out, reset_state); if(rc != GPIO_OK) { + gpio_close(pci_reset_out); g_print("ERROR PowerControl: GPIO open error (gpio=%s,rc=%d)\n", pci_reset_out->name, rc); continue; } - reset_state = pgood_state ^ g_gpio_configs.power_gpio.pci_reset_pols[i]; g_print("PowerControl: pgood: %d, setting pci reset %s to %d\n", (int)pgood_state, pci_reset_out->name, (int)reset_state); gpio_write(pci_reset_out, reset_state); @@ -267,17 +272,19 @@ on_set_power_state(ControlPower *pwr, uint8_t power_up_out; for (i = 0; i < power_gpio->num_power_up_outs; i++) { GPIO *power_pin = &power_gpio->power_up_outs[i]; - error = gpio_open(power_pin); + power_up_out = state ^ !power_gpio->power_up_pols[i]; + error = gpio_open(power_pin, power_up_out); if(error != GPIO_OK) { + gpio_close(power_pin); g_print("ERROR PowerControl: GPIO open error (gpio=%s,rc=%d)\n", power_gpio->power_up_outs[i].name, error); continue; } - power_up_out = state ^ !power_gpio->power_up_pols[i]; g_print("PowerControl: setting power up %s to %d\n", power_gpio->power_up_outs[i].name, (int)power_up_out); error = gpio_write(power_pin, power_up_out); if(error != GPIO_OK) { + gpio_close(power_pin); continue; } gpio_close(power_pin); @@ -294,16 +301,17 @@ on_set_power_state(ControlPower *pwr, * power pins' states. This commits the changes to the latch states. */ if (power_gpio->latch_out.name != NULL) { int rc; - uint8_t latch_value = 0; - rc = gpio_open(&power_gpio->latch_out); + uint8_t latch_value = 1; + rc = gpio_open(&power_gpio->latch_out, latch_value); if (rc != GPIO_OK) { /* Failures are non-fatal. */ + gpio_close(&power_gpio->latch_out); g_print("PowerControl ERROR failed to open latch %s rc=%d\n", power_gpio->latch_out.name, rc); return TRUE; } /* Make the latch transparent for as brief of a time as possible. */ - rc = gpio_write(&power_gpio->latch_out, 1); + rc = gpio_write(&power_gpio->latch_out, latch_value--); if (rc != GPIO_OK) { g_print("PowerControl ERROR failed to assert latch %s rc=%d\n", power_gpio->latch_out.name, rc); @@ -311,7 +319,7 @@ on_set_power_state(ControlPower *pwr, g_print("PowerControl asserted latch %s\n", power_gpio->latch_out.name); } - rc = gpio_write(&power_gpio->latch_out, 0); + rc = gpio_write(&power_gpio->latch_out, latch_value); if (rc != GPIO_OK) { g_print("PowerControl ERROR failed to clear latch %s rc=%d\n", power_gpio->latch_out.name, rc); @@ -355,29 +363,29 @@ set_up_gpio(PowerGpio *power_gpio, ControlPower* control_power) // get gpio device paths if(power_gpio->latch_out.name != NULL) { /* latch is optional */ - rc = gpio_init(&power_gpio->latch_out); + rc = gpio_get_params(&power_gpio->latch_out); if(rc != GPIO_OK) { error = rc; } } - rc = gpio_init(&power_gpio->power_good_in); + rc = gpio_get_params(&power_gpio->power_good_in); if(rc != GPIO_OK) { error = rc; } for(int i = 0; i < power_gpio->num_power_up_outs; i++) { - rc = gpio_init(&power_gpio->power_up_outs[i]); + rc = gpio_get_params(&power_gpio->power_up_outs[i]); if(rc != GPIO_OK) { error = rc; } } for(int i = 0; i < power_gpio->num_reset_outs; i++) { - rc = gpio_init(&power_gpio->reset_outs[i]); + rc = gpio_get_params(&power_gpio->reset_outs[i]); if(rc != GPIO_OK) { error = rc; } } for(int i = 0; i < power_gpio->num_pci_reset_outs; i++) { - rc = gpio_init(&power_gpio->pci_reset_outs[i]); + rc = gpio_get_params(&power_gpio->pci_reset_outs[i]); if(rc != GPIO_OK) { error = rc; } @@ -385,12 +393,14 @@ set_up_gpio(PowerGpio *power_gpio, ControlPower* control_power) gpio_inits_done(); - rc = gpio_open(&power_gpio->power_good_in); + rc = gpio_open(&power_gpio->power_good_in, 0); if(rc != GPIO_OK) { + gpio_close(&power_gpio->power_good_in); return rc; } rc = gpio_read(&power_gpio->power_good_in, &pgood_state); if(rc != GPIO_OK) { + gpio_close(&power_gpio->power_good_in); return rc; } gpio_close(&power_gpio->power_good_in); -- cgit v1.2.1