lkml.org 
[lkml]   [2022]   [Jul]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 7/9] platform/chrome: cros_typec_switch: Register mode switches
    Date
    Register mode switch devices for Type C connectors, when they are
    specified by firmware. These control Type C configuration for any USB
    Type-C mode switches (sometimes known as "muxes") which are controlled
    by the Chrome EC.

    Signed-off-by: Prashant Malani <pmalani@chromium.org>
    ---

    Changes since v3:
    - No changes.

    Changes since v2:
    - Fixed missing "static" identifier.

    Changes since v1:
    - No changes.

    drivers/platform/chrome/cros_typec_switch.c | 40 +++++++++++++++++++++
    1 file changed, 40 insertions(+)

    diff --git a/drivers/platform/chrome/cros_typec_switch.c b/drivers/platform/chrome/cros_typec_switch.c
    index 7c01957a032d..024a2bb146b2 100644
    --- a/drivers/platform/chrome/cros_typec_switch.c
    +++ b/drivers/platform/chrome/cros_typec_switch.c
    @@ -15,6 +15,7 @@
    #include <linux/platform_device.h>
    #include <linux/usb/typec_altmode.h>
    #include <linux/usb/typec_dp.h>
    +#include <linux/usb/typec_mux.h>
    #include <linux/usb/typec_retimer.h>

    #define DRV_NAME "cros-typec-switch"
    @@ -22,6 +23,7 @@
    /* Handles and other relevant data required for each port's switches. */
    struct cros_typec_port {
    int port_num;
    + struct typec_mux_dev *mode_switch;
    struct typec_retimer *retimer;
    struct cros_typec_switch_data *sdata;
    };
    @@ -147,6 +149,15 @@ static int cros_typec_configure_mux(struct cros_typec_switch_data *sdata, int po
    return -ETIMEDOUT;
    }

    +static int cros_typec_mode_switch_set(struct typec_mux_dev *mode_switch,
    + struct typec_mux_state *state)
    +{
    + struct cros_typec_port *port = typec_mux_get_drvdata(mode_switch);
    +
    + /* Mode switches have index 0. */
    + return cros_typec_configure_mux(port->sdata, port->port_num, 0, state->mode, state->alt);
    +}
    +
    static int cros_typec_retimer_set(struct typec_retimer *retimer, struct typec_retimer_state *state)
    {
    struct cros_typec_port *port = typec_retimer_get_drvdata(retimer);
    @@ -163,9 +174,27 @@ static void cros_typec_unregister_switches(struct cros_typec_switch_data *sdata)
    if (!sdata->ports[i])
    continue;
    typec_retimer_unregister(sdata->ports[i]->retimer);
    + typec_mux_unregister(sdata->ports[i]->mode_switch);
    }
    }

    +static int cros_typec_register_mode_switch(struct cros_typec_port *port,
    + struct fwnode_handle *fwnode)
    +{
    + struct typec_mux_desc mode_switch_desc = {
    + .fwnode = fwnode,
    + .drvdata = port,
    + .name = fwnode_get_name(fwnode),
    + .set = cros_typec_mode_switch_set,
    + };
    +
    + port->mode_switch = typec_mux_register(port->sdata->dev, &mode_switch_desc);
    + if (IS_ERR(port->mode_switch))
    + return PTR_ERR(port->mode_switch);
    +
    + return 0;
    +}
    +
    static int cros_typec_register_retimer(struct cros_typec_port *port, struct fwnode_handle *fwnode)
    {
    struct typec_retimer_desc retimer_desc = {
    @@ -235,6 +264,17 @@ static int cros_typec_register_switches(struct cros_typec_switch_data *sdata)
    }

    dev_dbg(dev, "Retimer switch registered for index %llu\n", index);
    +
    + if (!fwnode_property_read_bool(fwnode, "mode-switch"))
    + continue;
    +
    + ret = cros_typec_register_mode_switch(port, fwnode);
    + if (ret) {
    + dev_err(dev, "Mode switch register failed\n");
    + goto err_switch;
    + }
    +
    + dev_dbg(dev, "Mode switch registered for index %llu\n", index);
    }

    return 0;
    --
    2.37.0.144.g8ac04bfd2-goog
    \
     
     \ /
      Last update: 2022-07-11 09:30    [W:3.669 / U:0.228 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site