summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Richardson <wfrichar@chromium.org>2013-05-02 16:50:25 -0700
committerChromeBot <chrome-bot@google.com>2013-05-02 18:10:46 -0700
commit1ec5206a31872214b62420f28f7c35e0679f433a (patch)
tree88801f8fbc8bbc8e0e2117d69bcb04da1c777594
parent7e6becbe906ed48d6644e14e21bdebc1f55cda34 (diff)
downloadchrome-ec-1ec5206a31872214b62420f28f7c35e0679f433a.tar.gz
Slippy uses dumb USB ports, not smart ones.
BUG=chrome-os-partner:18825 BRANCH=slippy TEST=manual Change-Id: I87459c177b8ae41b68e7157f26843eaf5ed93c60 Signed-off-by: Bill Richardson <wfrichar@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/49975 Reviewed-by: Randall Spangler <rspangler@chromium.org>
-rw-r--r--board/slippy/board.h4
-rw-r--r--common/usb_port_power_dumb.c169
-rw-r--r--include/usb_charge.h2
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
};