summaryrefslogtreecommitdiffstats
path: root/op-pwrctl
diff options
context:
space:
mode:
authorAnthony Wilson <wilsonan@us.ibm.com>2019-03-06 10:54:58 -0600
committerBrad Bishop <bradleyb@fuzziesquirrel.com>2019-04-10 01:44:48 +0000
commitc0c74e7cca35179a9c4496a49f64e00db4c47870 (patch)
treea4f72ff8f6843da2505f28a5892f618b2223eb06 /op-pwrctl
parentc0da84767c00657c0b3b1afff7d9c5c2f1ed5fdb (diff)
downloadtalos-skeleton-c0c74e7cca35179a9c4496a49f64e00db4c47870.tar.gz
talos-skeleton-c0c74e7cca35179a9c4496a49f64e00db4c47870.zip
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 <wilsonan@us.ibm.com>
Diffstat (limited to 'op-pwrctl')
-rw-r--r--op-pwrctl/power_control_obj.c50
1 files changed, 30 insertions, 20 deletions
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);
OpenPOWER on IntegriCloud