diff options
-rw-r--r-- | board/cr50/board.c | 60 | ||||
-rw-r--r-- | board/cr50/board.h | 1 | ||||
-rw-r--r-- | board/cr50/gpio.inc | 19 | ||||
-rw-r--r-- | common/device_state.c | 9 | ||||
-rw-r--r-- | include/device_state.h | 3 |
5 files changed, 24 insertions, 68 deletions
diff --git a/board/cr50/board.c b/board/cr50/board.c index c80c2f3930..ccdc4a626f 100644 --- a/board/cr50/board.c +++ b/board/cr50/board.c @@ -407,10 +407,6 @@ static void device_state_changed(enum device_type device, { device_set_state(device, state); - /* Disable interrupts */ - gpio_disable_interrupt(device_states[device].detect_on); - gpio_disable_interrupt(device_states[device].detect_off); - /* * We've determined the device state, so cancel any deferred callbacks. */ @@ -444,8 +440,6 @@ static void device_powered_off(enum device_type device, int uart) /* Disconnect the TX pin from the UART peripheral */ uartn_tx_disconnect(uart); } - - gpio_enable_interrupt(device_states[device].detect_on); } static void servo_deferred(void) @@ -472,20 +466,17 @@ DECLARE_DEFERRED(ec_deferred); struct device_config device_states[] = { [DEVICE_SERVO] = { .deferred = &servo_deferred_data, - .detect_on = GPIO_SERVO_UART2_ON, - .detect_off = GPIO_SERVO_UART2_OFF, + .detect = GPIO_DETECT_SERVO, .name = "Servo" }, [DEVICE_AP] = { .deferred = &ap_deferred_data, - .detect_on = GPIO_AP_ON, - .detect_off = GPIO_AP_OFF, + .detect = GPIO_DETECT_AP, .name = "AP" }, [DEVICE_EC] = { .deferred = &ec_deferred_data, - .detect_on = GPIO_EC_ON, - .detect_off = GPIO_EC_OFF, + .detect = GPIO_DETECT_EC, .name = "EC" }, }; @@ -520,14 +511,16 @@ static void servo_attached(void) void device_state_on(enum gpio_signal signal) { + gpio_disable_interrupt(signal); + switch (signal) { - case GPIO_AP_ON: + case GPIO_DETECT_AP: device_powered_on(DEVICE_AP, UART_AP); break; - case GPIO_EC_ON: + case GPIO_DETECT_EC: device_powered_on(DEVICE_EC, UART_EC); break; - case GPIO_SERVO_UART2_ON: + case GPIO_DETECT_SERVO: servo_attached(); break; default: @@ -536,47 +529,22 @@ void device_state_on(enum gpio_signal signal) } } -void device_state_off(enum gpio_signal signal) -{ - switch (signal) { - case GPIO_AP_OFF: - board_update_device_state(DEVICE_AP); - break; - case GPIO_EC_OFF: - board_update_device_state(DEVICE_EC); - break; - case GPIO_SERVO_UART2_OFF: - board_update_device_state(DEVICE_SERVO); - break; - default: - CPRINTS("Device not supported"); - } -} - void board_update_device_state(enum device_type device) { - int state; - - if (device == DEVICE_SERVO) { - /* - * If EC UART TX is pulled high when EC UART is not enabled, - * then servo is attached. - */ - state = (!uartn_enabled(UART_EC) && - gpio_get_level(GPIO_SERVO_UART2_ON)); - } else - state = gpio_get_level(device_states[device].detect_on); + if (device == DEVICE_SERVO && servo_state_unknown()) + return; /* * If the device is currently on set its state immediately. If it * thinks the device is powered off debounce the signal. */ - if (state) - device_state_on(device_states[device].detect_on); + if (gpio_get_level(device_states[device].detect)) + device_state_on(device_states[device].detect); else { device_set_state(device, DEVICE_STATE_UNKNOWN); - gpio_enable_interrupt(device_states[device].detect_on); + gpio_enable_interrupt(device_states[device].detect); + /* * Wait a bit. If cr50 detects this device is ever powered on * during this time then the status wont be set to powered off. diff --git a/board/cr50/board.h b/board/cr50/board.h index c7814e5b36..7d11abd60d 100644 --- a/board/cr50/board.h +++ b/board/cr50/board.h @@ -127,7 +127,6 @@ void board_configure_deep_sleep_wakepins(void); /* Interrupt handler */ void sys_rst_asserted(enum gpio_signal signal); void device_state_on(enum gpio_signal signal); -void device_state_off(enum gpio_signal signal); /* Special controls over EC and AP */ void assert_sys_rst(void); diff --git a/board/cr50/gpio.inc b/board/cr50/gpio.inc index 3c40599034..780ec633e7 100644 --- a/board/cr50/gpio.inc +++ b/board/cr50/gpio.inc @@ -13,14 +13,10 @@ * so we attach two internal GPIOs to the same pad. */ GPIO_INT(SYS_RST_L_IN, PIN(1, 0), GPIO_INT_FALLING, sys_rst_asserted) -GPIO_INT(AP_ON, PIN(1, 1), GPIO_INT_RISING, device_state_on) -GPIO_INT(EC_ON, PIN(1, 2), GPIO_INT_RISING, device_state_on) -GPIO_INT(SERVO_UART2_ON, PIN(1, 3), GPIO_INT_RISING | GPIO_PULL_DOWN, +GPIO_INT(DETECT_AP, PIN(1, 1), GPIO_INT_RISING, device_state_on) +GPIO_INT(DETECT_EC, PIN(1, 2), GPIO_INT_RISING, device_state_on) +GPIO_INT(DETECT_SERVO, PIN(1, 3), GPIO_INT_RISING | GPIO_PULL_DOWN, device_state_on) -GPIO_INT(AP_OFF, PIN(1, 4), GPIO_INT_FALLING, device_state_off) -GPIO_INT(EC_OFF, PIN(1, 5), GPIO_INT_FALLING, device_state_off) -GPIO_INT(SERVO_UART2_OFF, PIN(1, 6), GPIO_INT_FALLING | GPIO_PULL_DOWN, - device_state_off) /* Pull this low to interrupt the AP */ GPIO(INT_AP_L, PIN(0, 0), GPIO_OUT_HIGH) @@ -97,12 +93,9 @@ PINMUX(FUNC(UART2_RX), B6, DIO_INPUT) /* EC console */ * driving the cr50 uart TX at the same time as servo is driving those pins may * damage both servo and cr50. */ -PINMUX(GPIO(AP_ON), A3, DIO_INPUT) -PINMUX(GPIO(AP_OFF), A3, DIO_INPUT) -PINMUX(GPIO(EC_ON), B6, DIO_INPUT) -PINMUX(GPIO(EC_OFF), B6, DIO_INPUT) -PINMUX(GPIO(SERVO_UART2_ON), B5, DIO_INPUT) -PINMUX(GPIO(SERVO_UART2_OFF), B5, DIO_INPUT) +PINMUX(GPIO(DETECT_AP), A3, DIO_INPUT) +PINMUX(GPIO(DETECT_EC), B6, DIO_INPUT) +PINMUX(GPIO(DETECT_SERVO), B5, DIO_INPUT) /* * I2CS pins are bi-directional and would be configured here as shown. However, diff --git a/common/device_state.c b/common/device_state.c index f8e57c35ff..0c4024880a 100644 --- a/common/device_state.c +++ b/common/device_state.c @@ -37,8 +37,7 @@ DECLARE_HOOK(HOOK_SECOND, check_device_state, HOOK_PRIO_DEFAULT); static int device_has_interrupts(enum device_type device) { return (device_states[device].deferred && - device_states[device].detect_on != GPIO_COUNT && - device_states[device].detect_off != GPIO_COUNT); + device_states[device].detect != GPIO_COUNT); } static void disable_interrupts(enum device_type device) @@ -50,8 +49,7 @@ static void disable_interrupts(enum device_type device) hook_call_deferred(device_states[device].deferred, -1); /* Disable gpio interrupts */ - gpio_disable_interrupt(device_states[device].detect_on); - gpio_disable_interrupt(device_states[device].detect_off); + gpio_disable_interrupt(device_states[device].detect); } static void enable_interrupts(enum device_type device) @@ -60,8 +58,7 @@ static void enable_interrupts(enum device_type device) return; /* Enable gpio interrupts */ - gpio_enable_interrupt(device_states[device].detect_on); - gpio_enable_interrupt(device_states[device].detect_off); + gpio_enable_interrupt(device_states[device].detect); } void device_detect_state_enable(int enable) diff --git a/include/device_state.h b/include/device_state.h index d7ff0661dc..1ad78f002c 100644 --- a/include/device_state.h +++ b/include/device_state.h @@ -21,8 +21,7 @@ struct device_config { enum device_state state; /* Device status */ /* Deferred handler to detect power off */ const struct deferred_data *deferred; - enum gpio_signal detect_on; /* GPIO detecting power on */ - enum gpio_signal detect_off; /* GPIO detecting power off */ + enum gpio_signal detect; /* GPIO detecting power on */ }; enum device_type; |