*/
#include <linux/acpi.h>
-#include <linux/delay.h>
-#include <linux/jiffies.h>
#include <linux/module.h>
#include <linux/platform_data/cros_ec_commands.h>
#include <linux/platform_data/cros_ec_proto.h>
return ret;
}
-static int cros_typec_send_clear_event(struct cros_typec_switch_data *sdata, int port_num,
- u32 events_mask)
-{
- struct ec_params_typec_control req = {
- .port = port_num,
- .command = TYPEC_CONTROL_COMMAND_CLEAR_EVENTS,
- .clear_events_mask = events_mask,
- };
-
- return cros_ec_command(sdata->ec, 0, EC_CMD_TYPEC_CONTROL, &req,
- sizeof(req), NULL, 0);
-}
-
-static bool cros_typec_check_event(struct cros_typec_switch_data *sdata, int port_num, u32 mask)
-{
- struct ec_response_typec_status resp;
- struct ec_params_typec_status req = {
- .port = port_num,
- };
- int ret;
-
- ret = cros_ec_command(sdata->ec, 0, EC_CMD_TYPEC_STATUS, &req, sizeof(req),
- &resp, sizeof(resp));
- if (ret < 0) {
- dev_warn(sdata->dev, "EC_CMD_TYPEC_STATUS failed for port: %d\n", port_num);
- return false;
- }
-
- if (resp.events & mask)
- return true;
-
- return false;
-}
-
/*
* The Chrome EC treats both mode-switches and retimers as "muxes" for the purposes of the
* host command API. This common function configures and verifies the retimer/mode-switch
static int cros_typec_configure_mux(struct cros_typec_switch_data *sdata, int port_num, int index,
unsigned long mode, struct typec_altmode *alt)
{
- unsigned long end;
- u32 event_mask;
- u8 mux_state;
- int ret;
-
- ret = cros_typec_get_mux_state(mode, alt);
- if (ret < 0)
- return ret;
- mux_state = (u8)ret;
+ int ret = cros_typec_get_mux_state(mode, alt);
- /* Clear any old mux set done event. */
- if (index == 0)
- event_mask = PD_STATUS_EVENT_MUX_0_SET_DONE;
- else
- event_mask = PD_STATUS_EVENT_MUX_1_SET_DONE;
-
- ret = cros_typec_send_clear_event(sdata, port_num, event_mask);
- if (ret < 0)
- return ret;
-
- /* Send the set command. */
- ret = cros_typec_cmd_mux_set(sdata, port_num, index, mux_state);
if (ret < 0)
return ret;
- /* Check for the mux set done event. */
- end = jiffies + msecs_to_jiffies(1000);
- do {
- if (cros_typec_check_event(sdata, port_num, event_mask))
- return 0;
-
- usleep_range(500, 1000);
- } while (time_before(jiffies, end));
-
- dev_err(sdata->dev, "Timed out waiting for mux set done on index: %d, state: %d\n",
- index, mux_state);
-
- return -ETIMEDOUT;
+ return cros_typec_cmd_mux_set(sdata, port_num, index, (u8)ret);
}
static int cros_typec_retimer_set(struct typec_retimer *retimer, struct typec_retimer_state *state)