diff options
-rw-r--r-- | board/slippy/board.h | 4 | ||||
-rw-r--r-- | common/usb_port_power_dumb.c | 169 | ||||
-rw-r--r-- | include/usb_charge.h | 2 |
3 files changed, 69 insertions, 106 deletions
diff --git a/board/slippy/board.h b/board/slippy/board.h index 9e3d4001a3..1c268f6641 100644 --- a/board/slippy/board.h +++ b/board/slippy/board.h @@ -54,8 +54,8 @@ /* Host connects to keyboard controller module via LPC */ #define HOST_KB_BUS_LPC -/* USB charge port */ -#define USB_CHARGE_PORT_COUNT 2 +/* USB ports */ +#define USB_PORT_COUNT 2 /* GPIOs for second UART port */ #define CONFIG_UART1_GPIOS_PC4_5 diff --git a/common/usb_port_power_dumb.c b/common/usb_port_power_dumb.c index 369179a6de..ed7fdc0a81 100644 --- a/common/usb_port_power_dumb.c +++ b/common/usb_port_power_dumb.c @@ -21,89 +21,72 @@ #define USB_SYSJUMP_TAG 0x5550 /* "UP" - Usb Port */ #define USB_HOOK_VERSION 1 -/* The previous USB port state before sys jump */ -struct usb_state { - uint8_t port_mode[USB_CHARGE_PORT_COUNT]; - uint8_t pad[2]; /* Pad to 4 bytes for system_add_jump_tag(). */ -}; - -static uint8_t charge_mode[USB_CHARGE_PORT_COUNT]; +/* We need to think about this a little more */ +BUILD_ASSERT(USB_PORT_COUNT == 2); -static void usb_charge_set_control_mode(int port_id, int mode) -{ - if (port_id == 0) { - gpio_set_level(GPIO_USB1_CTL1, mode & 0x4); - gpio_set_level(GPIO_USB1_CTL2, mode & 0x2); - gpio_set_level(GPIO_USB1_CTL3, mode & 0x1); - } else { - gpio_set_level(GPIO_USB2_CTL1, mode & 0x4); - gpio_set_level(GPIO_USB2_CTL2, mode & 0x2); - gpio_set_level(GPIO_USB2_CTL3, mode & 0x1); - } -} +static struct usb_state { + uint8_t en[USB_PORT_COUNT]; + uint8_t pad[2]; /* Pad to 4 bytes for system_add_jump_tag(). */ +} state; -static void usb_charge_set_enabled(int port_id, int en) +static void usb_port_set_enabled(int port_id, int en) { if (port_id == 0) gpio_set_level(GPIO_USB1_ENABLE, en); else gpio_set_level(GPIO_USB2_ENABLE, en); + state.en[port_id] = en; } -static void usb_charge_set_ilim(int port_id, int sel) +static void usb_port_all_ports_on(void) { - if (port_id == 0) - gpio_set_level(GPIO_USB1_ILIM_SEL, sel); - else - gpio_set_level(GPIO_USB2_ILIM_SEL, sel); + usb_port_set_enabled(0, 1); + usb_port_set_enabled(1, 1); } -static void usb_charge_all_ports_on(void) +static void usb_port_all_ports_off(void) { - usb_charge_set_mode(0, USB_CHARGE_MODE_SDP2); - usb_charge_set_mode(1, USB_CHARGE_MODE_SDP2); + usb_port_set_enabled(0, 0); + usb_port_set_enabled(1, 0); } -static void usb_charge_all_ports_off(void) -{ - usb_charge_set_mode(0, USB_CHARGE_MODE_DISABLED); - usb_charge_set_mode(1, USB_CHARGE_MODE_DISABLED); -} +/*****************************************************************************/ +/* Host commands */ -int usb_charge_set_mode(int port_id, enum usb_charge_mode mode) +int usb_port_set_mode(int port_id, enum usb_charge_mode mode) { - CPRINTF("[%T USB charge p%d m%d]\n", port_id, mode); + CPRINTF("[%T USB port p%d %d]\n", port_id, mode); - if (port_id >= USB_CHARGE_PORT_COUNT) + if (port_id < 0 || port_id >= USB_PORT_COUNT) return EC_ERROR_INVAL; switch (mode) { case USB_CHARGE_MODE_DISABLED: - usb_charge_set_enabled(port_id, 0); - break; - case USB_CHARGE_MODE_SDP2: - usb_charge_set_control_mode(port_id, 7); - usb_charge_set_ilim(port_id, 0); - usb_charge_set_enabled(port_id, 1); - break; - case USB_CHARGE_MODE_CDP: - usb_charge_set_control_mode(port_id, 7); - usb_charge_set_ilim(port_id, 1); - usb_charge_set_enabled(port_id, 1); + usb_port_set_enabled(port_id, 0); break; - case USB_CHARGE_MODE_DCP_SHORT: - usb_charge_set_control_mode(port_id, 4); - usb_charge_set_enabled(port_id, 1); + case USB_CHARGE_MODE_ENABLED: + usb_port_set_enabled(port_id, 1); break; default: return EC_ERROR_UNKNOWN; } - charge_mode[port_id] = mode; - return EC_SUCCESS; } +static int usb_port_command_set_mode(struct host_cmd_handler_args *args) +{ + const struct ec_params_usb_charge_set_mode *p = args->params; + + if (usb_port_set_mode(p->usb_port_id, p->mode) != EC_SUCCESS) + return EC_RES_ERROR; + + return EC_RES_SUCCESS; +} +DECLARE_HOST_COMMAND(EC_CMD_USB_CHARGE_SET_MODE, + usb_port_command_set_mode, + EC_VER_MASK(0)); + /*****************************************************************************/ /* Console commands */ @@ -113,65 +96,43 @@ static int command_set_mode(int argc, char **argv) int mode = -1; char *e; - if (argc == 1) { + switch (argc) { + case 3: + port_id = strtoi(argv[1], &e, 0); + if (*e || port_id < 0 || port_id >= USB_PORT_COUNT) + return EC_ERROR_PARAM1; + + if (!parse_bool(argv[2], &mode)) + return EC_ERROR_PARAM2; + + usb_port_set_enabled(port_id, mode); + /* fallthrough */ + case 1: ccprintf("Port 0: %d\nPort 1: %d\n", - charge_mode[0], charge_mode[1]); + state.en[0], state.en[1]); return EC_SUCCESS; } - if (argc != 3) - return EC_ERROR_PARAM_COUNT; - - port_id = strtoi(argv[1], &e, 0); - if (*e || port_id < 0 || port_id >= USB_CHARGE_PORT_COUNT) - return EC_ERROR_PARAM1; - - mode = strtoi(argv[2], &e, 0); - if (*e || mode < 0 || mode >= USB_CHARGE_MODE_COUNT) - return EC_ERROR_PARAM2; - - return usb_charge_set_mode(port_id, mode); + return EC_ERROR_PARAM_COUNT; } DECLARE_CONSOLE_COMMAND(usbchargemode, command_set_mode, - "[<port> <0 | 1 | 2 | 3>]", + "[<port> <0 | 1>]", "Set USB charge mode", - "Modes: 0=Disabled.\n" - " 1=Standard downstream port.\n" - " 2=Charging downstream port, BC 1.2.\n" - " 3=Dedicated charging port, BC 1.2.\n"); - -/*****************************************************************************/ -/* Host commands */ + "Modes: 0=Disabled\n" + " 1=Enabled\n"); -static int usb_charge_command_set_mode(struct host_cmd_handler_args *args) -{ - const struct ec_params_usb_charge_set_mode *p = args->params; - - if (usb_charge_set_mode(p->usb_port_id, p->mode) != EC_SUCCESS) - return EC_RES_ERROR; - - return EC_RES_SUCCESS; -} -DECLARE_HOST_COMMAND(EC_CMD_USB_CHARGE_SET_MODE, - usb_charge_command_set_mode, - EC_VER_MASK(0)); /*****************************************************************************/ /* Hooks */ -static void usb_charge_preserve_state(void) +static void usb_port_preserve_state(void) { - struct usb_state state; - - state.port_mode[0] = charge_mode[0]; - state.port_mode[1] = charge_mode[1]; - system_add_jump_tag(USB_SYSJUMP_TAG, USB_HOOK_VERSION, sizeof(state), &state); } -DECLARE_HOOK(HOOK_SYSJUMP, usb_charge_preserve_state, HOOK_PRIO_DEFAULT); +DECLARE_HOOK(HOOK_SYSJUMP, usb_port_preserve_state, HOOK_PRIO_DEFAULT); -static void usb_charge_init(void) +static void usb_port_init(void) { const struct usb_state *prev; int version, size; @@ -179,24 +140,24 @@ static void usb_charge_init(void) prev = (const struct usb_state *)system_get_jump_tag(USB_SYSJUMP_TAG, &version, &size); if (prev && version == USB_HOOK_VERSION && size == sizeof(*prev)) { - usb_charge_set_mode(0, prev->port_mode[0]); - usb_charge_set_mode(1, prev->port_mode[1]); + usb_port_set_enabled(0, prev->en[0]); + usb_port_set_enabled(1, prev->en[1]); } else { - usb_charge_all_ports_off(); + usb_port_all_ports_off(); } } -DECLARE_HOOK(HOOK_INIT, usb_charge_init, HOOK_PRIO_DEFAULT); +DECLARE_HOOK(HOOK_INIT, usb_port_init, HOOK_PRIO_DEFAULT); -static void usb_charge_resume(void) +static void usb_port_resume(void) { /* Turn on USB ports on as we go into S0 from S3 or S5. */ - usb_charge_all_ports_on(); + usb_port_all_ports_on(); } -DECLARE_HOOK(HOOK_CHIPSET_RESUME, usb_charge_resume, HOOK_PRIO_DEFAULT); +DECLARE_HOOK(HOOK_CHIPSET_RESUME, usb_port_resume, HOOK_PRIO_DEFAULT); -static void usb_charge_shutdown(void) +static void usb_port_shutdown(void) { /* Turn on USB ports off as we go back to S5. */ - usb_charge_all_ports_off(); + usb_port_all_ports_on(); } -DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, usb_charge_shutdown, HOOK_PRIO_DEFAULT); +DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, usb_port_shutdown, HOOK_PRIO_DEFAULT); diff --git a/include/usb_charge.h b/include/usb_charge.h index df1f70c9f3..66e6611985 100644 --- a/include/usb_charge.h +++ b/include/usb_charge.h @@ -19,6 +19,8 @@ enum usb_charge_mode { USB_CHARGE_MODE_CDP, /* Set USB port to Dedicated Charging Port, BC 1.2. */ USB_CHARGE_MODE_DCP_SHORT, + /* Enable USB port (for dumb ports). */ + USB_CHARGE_MODE_ENABLED, USB_CHARGE_MODE_COUNT }; |