From 3d1b834b57d4710a48d61c794a38b28be56a67ce Mon Sep 17 00:00:00 2001 From: Ting Shen Date: Mon, 13 Sep 2021 17:44:22 +0800 Subject: rt1718s: refactor: move gpio control to driver module This CL moves RT1718S gpio control from board file to common driver codebase, and implements the set flag and get/set level functions. Note that this CL does not fully implement IOEX interface because TCPC has different init process than usual ioexpanders. BUG=none TEST=1) pass faft_pd 2) manually test pd source/sink/frs on port 1 BRANCH=main Signed-off-by: Ting Shen Change-Id: If2a0bca2b13ad4748eea54b4c8004da7dc6fc6a5 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3159643 Reviewed-by: Rong Chang Commit-Queue: Ting Shen Tested-by: Ting Shen --- baseboard/cherry/baseboard.c | 57 ++++++++++++++------------------------------ 1 file changed, 18 insertions(+), 39 deletions(-) (limited to 'baseboard/cherry') diff --git a/baseboard/cherry/baseboard.c b/baseboard/cherry/baseboard.c index cf471ecd84..1195169bc9 100644 --- a/baseboard/cherry/baseboard.c +++ b/baseboard/cherry/baseboard.c @@ -388,32 +388,22 @@ const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_MAX_COUNT] = { }, }; -/* TODO: implement IOEX interface */ int rt1718s_gpio_ctrl(enum rt1718s_gpio_state state) { const int port = 1; switch (state) { case RT1718S_GPIO_DISABLED: - /* gpio1 high, gpio2 low */ - RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_GPIO1_CTRL, - RT1718S_GPIOX_CTRL_GPIOX_O, 0xFF)); - RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_GPIO2_CTRL, - RT1718S_GPIOX_CTRL_GPIOX_O, 0x00)); + rt1718s_gpio_set_level(port, RT1718S_GPIO1, 1); + rt1718s_gpio_set_level(port, RT1718S_GPIO2, 0); break; case RT1718S_GPIO_ENABLE_SINK: - /* gpio1/2 low */ - RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_GPIO1_CTRL, - RT1718S_GPIOX_CTRL_GPIOX_O, 0x00)); - RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_GPIO2_CTRL, - RT1718S_GPIOX_CTRL_GPIOX_O, 0x00)); + rt1718s_gpio_set_level(port, RT1718S_GPIO1, 0); + rt1718s_gpio_set_level(port, RT1718S_GPIO2, 0); break; case RT1718S_GPIO_ENABLE_SOURCE: - /* gpio1/2 high */ - RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_GPIO1_CTRL, - RT1718S_GPIOX_CTRL_GPIOX_O, 0xFF)); - RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_GPIO2_CTRL, - RT1718S_GPIOX_CTRL_GPIOX_O, 0xFF)); + rt1718s_gpio_set_level(port, RT1718S_GPIO1, 1); + rt1718s_gpio_set_level(port, RT1718S_GPIO2, 1); break; } @@ -423,18 +413,9 @@ int rt1718s_gpio_ctrl(enum rt1718s_gpio_state state) __override int board_rt1718s_init(int port) { /* set GPIO 1~3 as push pull, as output, output low. */ - RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_GPIO1_CTRL, - RT1718S_GPIOX_OD_N | RT1718S_GPIOX_OE | - RT1718S_GPIOX_CTRL_GPIOX_O, - RT1718S_GPIOX_OD_N | RT1718S_GPIOX_OE)); - RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_GPIO2_CTRL, - RT1718S_GPIOX_OD_N | RT1718S_GPIOX_OE | - RT1718S_GPIOX_CTRL_GPIOX_O, - RT1718S_GPIOX_OD_N | RT1718S_GPIOX_OE)); - RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_GPIO3_CTRL, - RT1718S_GPIOX_OD_N | RT1718S_GPIOX_OE | - RT1718S_GPIOX_CTRL_GPIOX_O, - RT1718S_GPIOX_OD_N | RT1718S_GPIOX_OE)); + rt1718s_gpio_set_flags(port, RT1718S_GPIO1, GPIO_OUT_LOW); + rt1718s_gpio_set_flags(port, RT1718S_GPIO2, GPIO_OUT_LOW); + rt1718s_gpio_set_flags(port, RT1718S_GPIO3, GPIO_OUT_LOW); /* gpio 1/2 output high when receiving frx signal */ RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_GPIO1_VBUS_CTRL, @@ -630,17 +611,15 @@ DECLARE_HOOK(HOOK_INIT, baseboard_init, HOOK_PRIO_DEFAULT - 1); __override int board_pd_set_frs_enable(int port, int enable) { - int value; - - if (port == 0) - return EC_SUCCESS; - - value = RT1718S_GPIOX_OD_N | RT1718S_GPIOX_OE; - if (enable) - value |= RT1718S_GPIOX_CTRL_GPIOX_O; - - /* Use write instead of update to save 1 i2c read in FRS path */ - return rt1718s_write8(port, RT1718S_GPIO3_CTRL, value); + if (port == 1) + /* + * Use set_flags (implemented by a single i2c write) instead + * of set_level (= i2c_update) to save one read operation in + * FRS path. + */ + rt1718s_gpio_set_flags(port, RT1718S_GPIO3, + enable ? GPIO_OUT_HIGH : GPIO_OUT_LOW); + return EC_SUCCESS; } __override int board_get_vbus_voltage(int port) -- cgit v1.2.1